{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "social-auth-nuxtjs", "type": "registry:block", "title": "Social Auth flow for Nuxt and Supabase", "description": "Social Auth flow for Nuxt and Supabase", "dependencies": [ "@supabase/ssr@latest", "@supabase/supabase-js@latest" ], "registryDependencies": [ "button", "card", "input", "label" ], "files": [ { "path": "registry/default/social-auth/nuxtjs/app/components/login-form.vue", "content": "\n\n\n", "type": "registry:file", "target": "app/components/login-form.vue" }, { "path": "registry/default/social-auth/nuxtjs/app/components/logout-button.vue", "content": "\n\n\n", "type": "registry:file", "target": "app/components/logout-button.vue" }, { "path": "registry/default/social-auth/nuxtjs/app/pages/auth/login.vue", "content": "\n\n", "type": "registry:file", "target": "app/pages/auth/login.vue" }, { "path": "registry/default/social-auth/nuxtjs/app/pages/auth/error.vue", "content": "\n\n", "type": "registry:file", "target": "app/pages/auth/error.vue" }, { "path": "registry/default/social-auth/nuxtjs/app/pages/protected/index.vue", "content": "\n\n\n", "type": "registry:file", "target": "app/pages/protected/index.vue" }, { "path": "registry/default/social-auth/nuxtjs/server/middleware/auth.ts", "content": "import { defineEventHandler, sendRedirect } from 'h3'\nimport { createSupabaseServerClient } from '@/registry/default/clients/nuxtjs/server/supabase/client'\n\nexport default defineEventHandler(async (event) => {\n const supabase = createSupabaseServerClient(event)\n\n // Get user claims\n const { data } = await supabase.auth.getClaims()\n const user = data?.claims\n\n const pathname = event.node.req.url || '/'\n\n // Redirect if no user and not already on login/auth route\n if (\n !user &&\n !pathname.startsWith('/login') &&\n !pathname.startsWith('/auth')\n ) {\n return sendRedirect(event, '/auth/login')\n }\n\n // Return event as-is (you could return any object if needed)\n return { user }\n})\n", "type": "registry:file", "target": "server/middleware/auth.ts" }, { "path": "registry/default/social-auth/nuxtjs/server/routes/auth/oauth.ts", "content": "import { createSupabaseServerClient } from '@/registry/default/clients/nuxtjs/server/supabase/client'\nimport { defineEventHandler, getQuery, sendRedirect, getRequestURL } from \"h3\"\n\nexport default defineEventHandler(async (event) => {\n const url = getRequestURL(event) // URL object of the current request\n const query = getQuery(event)\n\n const code = query.code as string | undefined\n let next = (query.next as string | undefined) ?? \"/\"\n\n if (!next.startsWith(\"/\")) {\n next = \"/\"\n }\n\n if (code) {\n const supabase = createSupabaseServerClient(event)\n const { error } = await supabase.auth.exchangeCodeForSession(code)\n\n if (!error) {\n // Determine origin\n const forwardedHost = event.node.req.headers[\"x-forwarded-host\"] as string | undefined\n const isLocalEnv = process.env.NODE_ENV === \"development\"\n const origin = `${url.protocol}//${url.host}`\n\n if (isLocalEnv) {\n return sendRedirect(event, `${origin}${next}`)\n } else if (forwardedHost) {\n return sendRedirect(event, `https://${forwardedHost}${next}`)\n } else {\n return sendRedirect(event, `${origin}${next}`)\n }\n }\n }\n\n // fallback to error page\n const origin = `${url.protocol}//${url.host}`\n return sendRedirect(event, `${origin}/auth/error`)\n})\n", "type": "registry:file", "target": "server/routes/auth/oauth.ts" } ] }