├── .gitignore ├── .npmrc ├── README.md ├── magic-link ├── Magic_Link_Otp_SignIn_Flow_SSR.excalidraw ├── Magic_Link_Otp_SignIn_Flow_SSR.excalidraw.png ├── README.md ├── auth-ui │ └── react │ │ ├── .env.example │ │ ├── .gitignore │ │ ├── README.md │ │ ├── index.html │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── pnpm-lock.yaml │ │ ├── public │ │ └── vite.svg │ │ ├── src │ │ ├── App.tsx │ │ ├── app.css │ │ ├── assets │ │ │ └── react.svg │ │ ├── components │ │ │ ├── Alert.tsx │ │ │ ├── AppLayout.tsx │ │ │ ├── AuthLayout.tsx │ │ │ └── InputErrorMessage.tsx │ │ ├── lib │ │ │ ├── AuthProvider.tsx │ │ │ ├── db.ts │ │ │ ├── utils.ts │ │ │ ├── validationRules.ts │ │ │ └── validationSchema.ts │ │ ├── main.tsx │ │ ├── routes │ │ │ ├── account │ │ │ │ ├── index.tsx │ │ │ │ └── update-email.tsx │ │ │ ├── auth │ │ │ │ ├── signin.tsx │ │ │ │ └── verify-token.tsx │ │ │ └── index.tsx │ │ ├── tailwind.css │ │ └── vite-env.d.ts │ │ ├── supabase │ │ ├── .gitignore │ │ ├── config.toml │ │ └── seed.sql │ │ ├── tailwind.config.cjs │ │ ├── tests │ │ ├── signin-flow.spec.ts │ │ └── utils.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.node.json │ │ └── vite.config.ts ├── express │ ├── .env.example │ ├── .gitignore │ ├── README.md │ ├── app.js │ ├── bin │ │ └── www │ ├── lib │ │ ├── supabase.js │ │ ├── utils.js │ │ ├── validationRules.js │ │ └── validationSchema.js │ ├── package.json │ ├── playwright.config.ts │ ├── pnpm-lock.yaml │ ├── public │ │ ├── images │ │ │ └── vite.svg │ │ └── stylesheets │ │ │ ├── app.css │ │ │ ├── style.css │ │ │ └── tailwind.css │ ├── routes │ │ ├── account.js │ │ ├── auth.js │ │ └── index.js │ ├── supabase │ │ ├── .gitignore │ │ ├── auth │ │ │ └── email │ │ │ │ ├── confirmation.html │ │ │ │ ├── email-change.html │ │ │ │ ├── magic-link.html │ │ │ │ └── recovery.html │ │ ├── config.toml │ │ └── seed.sql │ ├── tailwind.config.js │ ├── tests │ │ ├── signin-flow.spec.ts │ │ └── utils.ts │ └── views │ │ ├── _partials.pug │ │ ├── app │ │ ├── account │ │ │ ├── index.pug │ │ │ └── update-email.pug │ │ └── layout.pug │ │ ├── auth │ │ ├── layout.pug │ │ ├── signin.pug │ │ └── verify-token.pug │ │ ├── error.pug │ │ ├── index.pug │ │ └── layout.pug ├── nextjs-pages │ ├── .env.example │ ├── .github │ │ └── workflows │ │ │ └── playwright.yml │ ├── .gitignore │ ├── README.md │ ├── components │ │ ├── Alert.tsx │ │ ├── AppLayout.tsx │ │ ├── AuthLayout.tsx │ │ └── InputErrorMessage.tsx │ ├── lib │ │ ├── utils.ts │ │ ├── validationRules.ts │ │ └── validationSchema.ts │ ├── middleware.ts │ ├── next.config.js │ ├── package.json │ ├── pages │ │ ├── _app.tsx │ │ ├── _document.tsx │ │ ├── account │ │ │ ├── index.tsx │ │ │ └── update-email.tsx │ │ ├── api │ │ │ └── auth │ │ │ │ ├── callback.ts │ │ │ │ ├── confirm.ts │ │ │ │ └── signout.ts │ │ ├── auth │ │ │ ├── index.tsx │ │ │ ├── signin.tsx │ │ │ └── verify-token.tsx │ │ └── index.tsx │ ├── playwright.config.ts │ ├── pnpm-lock.yaml │ ├── public │ │ ├── favicon.ico │ │ ├── next.svg │ │ ├── thirteen.svg │ │ └── vercel.svg │ ├── styles │ │ └── tailwind.css │ ├── supabase │ │ ├── .gitignore │ │ ├── auth │ │ │ └── email │ │ │ │ ├── confirmation.html │ │ │ │ ├── email-change.html │ │ │ │ ├── magic-link.html │ │ │ │ └── recovery.html │ │ ├── config.toml │ │ └── seed.sql │ ├── tailwind.config.js │ ├── tests │ │ ├── signin-flow.spec.ts │ │ └── utils.ts │ └── tsconfig.json ├── nextjs │ ├── .env.example │ ├── .eslintrc.json │ ├── .gitignore │ ├── README.md │ ├── app │ │ ├── (app) │ │ │ ├── account │ │ │ │ ├── page.tsx │ │ │ │ └── update-email │ │ │ │ │ ├── email-form.tsx │ │ │ │ │ └── page.tsx │ │ │ ├── layout.tsx │ │ │ └── page.tsx │ │ ├── auth │ │ │ ├── callback │ │ │ │ └── route.ts │ │ │ ├── confirm │ │ │ │ └── route.ts │ │ │ ├── layout.tsx │ │ │ ├── signin │ │ │ │ ├── magiclinkform.tsx │ │ │ │ └── page.tsx │ │ │ ├── signout │ │ │ │ └── route.ts │ │ │ └── verify-token │ │ │ │ ├── page.tsx │ │ │ │ └── verifytokenform.tsx │ │ ├── favicon.ico │ │ ├── globals.css │ │ └── layout.tsx │ ├── components │ │ ├── Alert.tsx │ │ └── InputErrorMessage.tsx │ ├── lib │ │ ├── supabase-server.ts │ │ ├── utils.ts │ │ ├── validationRules.ts │ │ └── validationSchema.ts │ ├── middleware.ts │ ├── next.config.js │ ├── package.json │ ├── playwright.config.ts │ ├── pnpm-lock.yaml │ ├── postcss.config.js │ ├── public │ │ ├── next.svg │ │ └── vercel.svg │ ├── supabase │ │ ├── .gitignore │ │ ├── auth │ │ │ └── email │ │ │ │ ├── confirmation.html │ │ │ │ ├── email-change.html │ │ │ │ ├── magic-link.html │ │ │ │ └── recovery.html │ │ ├── config.toml │ │ └── seed.sql │ ├── tailwind.config.js │ ├── tests │ │ ├── signin-flow.spec.ts │ │ └── utils.ts │ └── tsconfig.json ├── nuxt │ ├── .env.example │ ├── .gitignore │ ├── .npmrc │ ├── README.md │ ├── app.vue │ ├── components │ │ ├── Alert.vue │ │ └── InputErrorMessage.vue │ ├── layouts │ │ ├── auth.vue │ │ └── default.vue │ ├── lib │ │ ├── utils.ts │ │ ├── validationRules.ts │ │ └── validationSchema.ts │ ├── middleware │ │ └── auth.ts │ ├── nuxt.config.ts │ ├── package.json │ ├── pages │ │ ├── account │ │ │ ├── index.vue │ │ │ └── update-email.vue │ │ ├── auth │ │ │ ├── confirm.vue │ │ │ ├── signin.vue │ │ │ └── verify-token.vue │ │ └── index.vue │ ├── playwright.config.ts │ ├── pnpm-lock.yaml │ ├── public │ │ └── favicon.ico │ ├── server │ │ └── tsconfig.json │ ├── supabase │ │ ├── .gitignore │ │ ├── config.toml │ │ └── seed.sql │ ├── tailwind.config.js │ ├── tests │ │ ├── signin-flow.spec.ts │ │ └── utils.ts │ └── tsconfig.json ├── react │ ├── .env.example │ ├── .gitignore │ ├── README.md │ ├── index.html │ ├── package.json │ ├── playwright.config.ts │ ├── pnpm-lock.yaml │ ├── public │ │ └── vite.svg │ ├── src │ │ ├── App.tsx │ │ ├── app.css │ │ ├── assets │ │ │ └── react.svg │ │ ├── components │ │ │ ├── Alert.tsx │ │ │ ├── AppLayout.tsx │ │ │ ├── AuthLayout.tsx │ │ │ └── InputErrorMessage.tsx │ │ ├── lib │ │ │ ├── AuthProvider.tsx │ │ │ ├── db.ts │ │ │ ├── utils.ts │ │ │ ├── validationRules.ts │ │ │ └── validationSchema.ts │ │ ├── main.tsx │ │ ├── routes │ │ │ ├── account │ │ │ │ ├── index.tsx │ │ │ │ └── update-email.tsx │ │ │ ├── auth │ │ │ │ ├── signin.tsx │ │ │ │ └── verify-token.tsx │ │ │ └── index.tsx │ │ ├── tailwind.css │ │ └── vite-env.d.ts │ ├── supabase │ │ ├── .gitignore │ │ ├── config.toml │ │ └── seed.sql │ ├── tailwind.config.cjs │ ├── tests │ │ ├── signin-flow.spec.ts │ │ └── utils.ts │ ├── tsconfig.json │ ├── tsconfig.node.json │ └── vite.config.ts └── sveltekit │ ├── .env.example │ ├── .eslintignore │ ├── .eslintrc.cjs │ ├── .github │ └── workflows │ │ └── playwright.yml │ ├── .gitignore │ ├── .npmrc │ ├── .prettierignore │ ├── .prettierrc │ ├── README.md │ ├── package.json │ ├── playwright.config.ts │ ├── pnpm-lock.yaml │ ├── src │ ├── app.d.ts │ ├── app.html │ ├── hooks.server.ts │ ├── lib │ │ ├── Alert.svelte │ │ ├── InputErrorMessage.svelte │ │ ├── LoadingRelative.svelte │ │ ├── schema.ts │ │ ├── utils.ts │ │ ├── validationRules.ts │ │ └── validationSchema.ts │ ├── routes │ │ ├── (app) │ │ │ ├── +layout.svelte │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── account │ │ │ │ ├── +layout.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── update-email │ │ │ │ ├── +page.server.ts │ │ │ │ └── +page.svelte │ │ ├── (auth) │ │ │ ├── +layout.server.ts │ │ │ ├── +layout.svelte │ │ │ └── auth │ │ │ │ ├── +page.ts │ │ │ │ ├── callback │ │ │ │ └── +server.ts │ │ │ │ ├── confirm │ │ │ │ └── +server.ts │ │ │ │ ├── signin │ │ │ │ ├── +page.server.ts │ │ │ │ └── +page.svelte │ │ │ │ ├── signout │ │ │ │ └── +page.server.ts │ │ │ │ └── verify-token │ │ │ │ ├── +page.server.ts │ │ │ │ └── +page.svelte │ │ ├── +layout.server.ts │ │ ├── +layout.svelte │ │ └── +layout.ts │ └── tailwind.css │ ├── static │ ├── app.css │ └── favicon.png │ ├── supabase │ ├── .gitignore │ ├── auth │ │ └── email │ │ │ ├── confirmation.html │ │ │ ├── email-change.html │ │ │ ├── magic-link.html │ │ │ └── recovery.html │ ├── config.toml │ └── seed.sql │ ├── svelte.config.js │ ├── tailwind.config.cjs │ ├── tests │ ├── signin-flow.spec.ts │ └── utils.ts │ ├── tsconfig.json │ └── vite.config.ts ├── oauth-flow ├── OAuth_SignIn_Flow_SSR.excalidraw ├── OAuth_SignIn_Flow_SSR.excalidraw.png ├── README.md ├── nextjs-pages │ ├── .env.example │ ├── .gitignore │ ├── README.md │ ├── components │ │ ├── Alert.tsx │ │ ├── AppLayout.tsx │ │ ├── AuthLayout.tsx │ │ └── InputErrorMessage.tsx │ ├── lib │ │ ├── utils.ts │ │ ├── validationRules.ts │ │ └── validationSchema.ts │ ├── next.config.js │ ├── package.json │ ├── pages │ │ ├── _app.tsx │ │ ├── _document.tsx │ │ ├── account │ │ │ ├── index.tsx │ │ │ └── update-email.tsx │ │ ├── api │ │ │ ├── auth │ │ │ │ ├── [provider].ts │ │ │ │ └── callback.ts │ │ │ └── hello.ts │ │ ├── auth │ │ │ ├── index.tsx │ │ │ ├── signin.tsx │ │ │ └── signout.tsx │ │ └── index.tsx │ ├── pnpm-lock.yaml │ ├── public │ │ ├── favicon.ico │ │ ├── next.svg │ │ ├── thirteen.svg │ │ └── vercel.svg │ ├── styles │ │ └── tailwind.css │ ├── supabase │ │ ├── .gitignore │ │ ├── config.toml │ │ └── seed.sql │ ├── tailwind.config.js │ └── tsconfig.json ├── nextjs │ ├── .env.example │ ├── .eslintrc.json │ ├── .gitignore │ ├── README.md │ ├── app │ │ ├── (app) │ │ │ ├── account │ │ │ │ ├── page.tsx │ │ │ │ └── update-email │ │ │ │ │ ├── email-form.tsx │ │ │ │ │ └── page.tsx │ │ │ ├── layout.tsx │ │ │ └── page.tsx │ │ ├── auth │ │ │ ├── [slug] │ │ │ │ └── route.ts │ │ │ ├── callback │ │ │ │ └── route.ts │ │ │ ├── layout.tsx │ │ │ ├── signin │ │ │ │ ├── oauth-form.tsx │ │ │ │ └── page.tsx │ │ │ ├── signout │ │ │ │ └── route.ts │ │ │ └── verify-token │ │ │ │ ├── page.tsx │ │ │ │ └── verifytokenform.tsx │ │ ├── favicon.ico │ │ ├── globals.css │ │ ├── layout.tsx │ │ └── supabase-provider.tsx │ ├── components │ │ ├── Alert.tsx │ │ └── InputErrorMessage.tsx │ ├── lib │ │ ├── supabase-server.ts │ │ ├── utils.ts │ │ ├── validationRules.ts │ │ └── validationSchema.ts │ ├── middleware.ts │ ├── next.config.js │ ├── package.json │ ├── pnpm-lock.yaml │ ├── postcss.config.js │ ├── public │ │ ├── next.svg │ │ └── vercel.svg │ ├── supabase │ │ ├── .gitignore │ │ ├── config.toml │ │ └── seed.sql │ ├── tailwind.config.js │ └── tsconfig.json ├── nuxt │ ├── .env.example │ ├── .gitignore │ ├── .npmrc │ ├── README.md │ ├── app.vue │ ├── components │ │ ├── Alert.vue │ │ └── InputErrorMessage.vue │ ├── layouts │ │ ├── auth.vue │ │ └── default.vue │ ├── lib │ │ ├── utils.ts │ │ ├── validationRules.ts │ │ └── validationSchema.ts │ ├── middleware │ │ └── auth.ts │ ├── nuxt.config.ts │ ├── package.json │ ├── pages │ │ ├── account │ │ │ └── index.vue │ │ ├── auth │ │ │ ├── confirm.vue │ │ │ └── signin.vue │ │ └── index.vue │ ├── pnpm-lock.yaml │ ├── public │ │ └── favicon.ico │ ├── server │ │ └── tsconfig.json │ ├── supabase │ │ ├── .gitignore │ │ ├── config.toml │ │ └── seed.sql │ ├── tailwind.config.js │ └── tsconfig.json ├── react │ ├── .env.example │ ├── .gitignore │ ├── README.md │ ├── index.html │ ├── package.json │ ├── pnpm-lock.yaml │ ├── public │ │ └── vite.svg │ ├── src │ │ ├── App.tsx │ │ ├── app.css │ │ ├── assets │ │ │ └── react.svg │ │ ├── components │ │ │ ├── Alert.tsx │ │ │ ├── AppLayout.tsx │ │ │ ├── AuthLayout.tsx │ │ │ └── InputErrorMessage.tsx │ │ ├── lib │ │ │ ├── AuthProvider.tsx │ │ │ ├── db.ts │ │ │ ├── utils.ts │ │ │ ├── validationRules.ts │ │ │ └── validationSchema.ts │ │ ├── main.tsx │ │ ├── routes │ │ │ ├── account │ │ │ │ └── index.tsx │ │ │ ├── auth │ │ │ │ └── signin.tsx │ │ │ └── index.tsx │ │ ├── tailwind.css │ │ └── vite-env.d.ts │ ├── supabase │ │ ├── .gitignore │ │ ├── config.toml │ │ └── seed.sql │ ├── tailwind.config.cjs │ ├── tsconfig.json │ ├── tsconfig.node.json │ └── vite.config.ts └── sveltekit │ ├── .env.example │ ├── .eslintignore │ ├── .eslintrc.cjs │ ├── .gitignore │ ├── .npmrc │ ├── .prettierignore │ ├── .prettierrc │ ├── README.md │ ├── package.json │ ├── pnpm-lock.yaml │ ├── src │ ├── app.d.ts │ ├── app.html │ ├── hooks.server.ts │ ├── lib │ │ ├── Alert.svelte │ │ ├── InputErrorMessage.svelte │ │ ├── LoadingRelative.svelte │ │ ├── icons │ │ │ ├── Azure.svelte │ │ │ ├── GitHub.svelte │ │ │ ├── Google.svelte │ │ │ └── Slack.svelte │ │ ├── utils.ts │ │ ├── validationRules.ts │ │ └── validationSchema.ts │ ├── routes │ │ ├── (app) │ │ │ ├── +layout.svelte │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── account │ │ │ │ ├── +layout.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── update-email │ │ │ │ │ ├── +page.server.ts │ │ │ │ │ └── +page.svelte │ │ │ └── logging-in │ │ │ │ ├── +layout@.svelte │ │ │ │ └── +page.svelte │ │ ├── (auth) │ │ │ ├── +layout.server.ts │ │ │ ├── +layout.svelte │ │ │ └── auth │ │ │ │ ├── +page.ts │ │ │ │ ├── callback │ │ │ │ └── +server.ts │ │ │ │ ├── signin │ │ │ │ ├── +page.server.ts │ │ │ │ └── +page.svelte │ │ │ │ └── signout │ │ │ │ └── +page.server.ts │ │ ├── +layout.server.ts │ │ ├── +layout.svelte │ │ └── +layout.ts │ └── tailwind.css │ ├── static │ ├── app.css │ └── favicon.png │ ├── supabase │ ├── .gitignore │ ├── config.toml │ └── seed.sql │ ├── svelte.config.js │ ├── tailwind.config.cjs │ ├── tsconfig.json │ └── vite.config.ts ├── package.json ├── pnpm-lock.yaml ├── reset-flow ├── README.md ├── Reset_Password_Flow_SSR.excalidraw ├── Reset_Password_Flow_SSR.excalidraw.png ├── auth-ui │ ├── nextjs │ │ ├── .env.example │ │ ├── .eslintrc.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── app │ │ │ ├── (app) │ │ │ │ ├── account │ │ │ │ │ ├── page.tsx │ │ │ │ │ ├── update-email │ │ │ │ │ │ ├── email-form.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── update-password │ │ │ │ │ │ ├── page.tsx │ │ │ │ │ │ └── password-form.tsx │ │ │ │ ├── layout.tsx │ │ │ │ └── page.tsx │ │ │ ├── auth │ │ │ │ ├── callback │ │ │ │ │ └── route.ts │ │ │ │ ├── confirm │ │ │ │ │ └── route.ts │ │ │ │ ├── forgotpassword │ │ │ │ │ ├── forgot-password-form.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── layout.tsx │ │ │ │ ├── signin │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── sign-in-form.tsx │ │ │ │ ├── signout │ │ │ │ │ └── route.ts │ │ │ │ └── signup │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── sign-up-form.tsx │ │ │ ├── favicon.ico │ │ │ ├── formStyle.ts │ │ │ ├── globals.css │ │ │ └── layout.tsx │ │ ├── components │ │ │ ├── Alert.tsx │ │ │ └── InputErrorMessage.tsx │ │ ├── lib │ │ │ ├── supabase-server.ts │ │ │ ├── utils.ts │ │ │ ├── validationRules.ts │ │ │ └── validationSchema.ts │ │ ├── middleware.ts │ │ ├── next.config.js │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── pnpm-lock.yaml │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── next.svg │ │ │ └── vercel.svg │ │ ├── supabase │ │ │ ├── .gitignore │ │ │ ├── auth │ │ │ │ └── email │ │ │ │ │ ├── confirmation.html │ │ │ │ │ ├── email-change.html │ │ │ │ │ ├── magic-link.html │ │ │ │ │ └── recovery.html │ │ │ ├── config.toml │ │ │ └── seed.sql │ │ ├── tailwind.config.js │ │ ├── tests │ │ │ ├── password-reset-flow.spec.ts │ │ │ ├── signup-flow.spec.ts │ │ │ └── utils.ts │ │ └── tsconfig.json │ └── react │ │ ├── .env.example │ │ ├── .gitignore │ │ ├── README.md │ │ ├── index.html │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── pnpm-lock.yaml │ │ ├── public │ │ └── vite.svg │ │ ├── src │ │ ├── App.tsx │ │ ├── app.css │ │ ├── assets │ │ │ └── react.svg │ │ ├── components │ │ │ ├── Alert.tsx │ │ │ ├── AppLayout.tsx │ │ │ ├── AuthLayout.tsx │ │ │ └── InputErrorMessage.tsx │ │ ├── lib │ │ │ ├── AuthProvider.tsx │ │ │ ├── db.ts │ │ │ ├── utils.ts │ │ │ ├── validationRules.ts │ │ │ └── validationSchema.ts │ │ ├── main.tsx │ │ ├── routes │ │ │ ├── account │ │ │ │ ├── index.tsx │ │ │ │ ├── update-email.tsx │ │ │ │ └── update-password.tsx │ │ │ ├── auth │ │ │ │ ├── forgotpassword.tsx │ │ │ │ ├── signin.tsx │ │ │ │ └── signup.tsx │ │ │ └── index.tsx │ │ ├── tailwind.css │ │ └── vite-env.d.ts │ │ ├── supabase │ │ ├── .gitignore │ │ ├── config.toml │ │ └── seed.sql │ │ ├── tailwind.config.cjs │ │ ├── tests │ │ ├── password-reset-flow.spec.ts │ │ ├── signup-flow.spec.ts │ │ └── utils.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.node.json │ │ └── vite.config.ts ├── express │ ├── .env.example │ ├── .gitignore │ ├── README.md │ ├── app.js │ ├── bin │ │ └── www │ ├── lib │ │ ├── supabase.js │ │ ├── utils.js │ │ ├── validationRules.js │ │ └── validationSchema.js │ ├── package.json │ ├── playwright.config.ts │ ├── pnpm-lock.yaml │ ├── public │ │ ├── images │ │ │ └── vite.svg │ │ └── stylesheets │ │ │ ├── app.css │ │ │ ├── style.css │ │ │ └── tailwind.css │ ├── routes │ │ ├── account.js │ │ ├── auth.js │ │ └── index.js │ ├── supabase │ │ ├── .gitignore │ │ ├── auth │ │ │ └── email │ │ │ │ ├── confirmation.html │ │ │ │ ├── email-change.html │ │ │ │ ├── magic-link.html │ │ │ │ └── recovery.html │ │ ├── config.toml │ │ └── seed.sql │ ├── tailwind.config.js │ ├── tests │ │ ├── password-reset-flow.spec.ts │ │ ├── signup-flow.spec.ts │ │ └── utils.ts │ └── views │ │ ├── _partials.pug │ │ ├── app │ │ ├── account │ │ │ ├── index.pug │ │ │ ├── update-email.pug │ │ │ └── update-password.pug │ │ └── layout.pug │ │ ├── auth │ │ ├── forgotpassword.pug │ │ ├── layout.pug │ │ ├── signin.pug │ │ └── signup.pug │ │ ├── error.pug │ │ ├── index.pug │ │ └── layout.pug ├── nextjs-pages │ ├── .env.example │ ├── .github │ │ └── workflows │ │ │ └── playwright.yml │ ├── .gitignore │ ├── README.md │ ├── components │ │ ├── Alert.tsx │ │ ├── AppLayout.tsx │ │ ├── AuthLayout.tsx │ │ └── InputErrorMessage.tsx │ ├── lib │ │ ├── utils.ts │ │ ├── validationRules.ts │ │ └── validationSchema.ts │ ├── next.config.js │ ├── package.json │ ├── pages │ │ ├── _app.tsx │ │ ├── _document.tsx │ │ ├── account │ │ │ ├── index.tsx │ │ │ ├── update-email.tsx │ │ │ └── update-password.tsx │ │ ├── api │ │ │ └── auth │ │ │ │ ├── callback.ts │ │ │ │ ├── confirm.ts │ │ │ │ └── signout.ts │ │ ├── auth │ │ │ ├── forgotpassword.tsx │ │ │ ├── index.tsx │ │ │ ├── signin.tsx │ │ │ └── signup.tsx │ │ └── index.tsx │ ├── playwright.config.ts │ ├── pnpm-lock.yaml │ ├── public │ │ ├── favicon.ico │ │ ├── next.svg │ │ ├── thirteen.svg │ │ └── vercel.svg │ ├── styles │ │ └── tailwind.css │ ├── supabase │ │ ├── .gitignore │ │ ├── auth │ │ │ └── email │ │ │ │ ├── confirmation.html │ │ │ │ ├── email-change.html │ │ │ │ ├── magic-link.html │ │ │ │ └── recovery.html │ │ ├── config.toml │ │ └── seed.sql │ ├── tailwind.config.js │ ├── tests │ │ ├── password-reset-flow.spec.ts │ │ ├── signup-flow.spec.ts │ │ └── utils.ts │ └── tsconfig.json ├── nextjs │ ├── .env.example │ ├── .eslintrc.json │ ├── .gitignore │ ├── README.md │ ├── app │ │ ├── (app) │ │ │ ├── account │ │ │ │ ├── page.tsx │ │ │ │ ├── update-email │ │ │ │ │ ├── email-form.tsx │ │ │ │ │ └── page.tsx │ │ │ │ └── update-password │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── password-form.tsx │ │ │ ├── layout.tsx │ │ │ └── page.tsx │ │ ├── auth │ │ │ ├── confirm │ │ │ │ └── route.ts │ │ │ ├── forgotpassword │ │ │ │ ├── forgot-password-form.tsx │ │ │ │ └── page.tsx │ │ │ ├── layout.tsx │ │ │ ├── signin │ │ │ │ ├── page.tsx │ │ │ │ └── sign-in-form.tsx │ │ │ ├── signout │ │ │ │ └── route.ts │ │ │ └── signup │ │ │ │ ├── page.tsx │ │ │ │ └── sign-up-form.tsx │ │ ├── favicon.ico │ │ ├── globals.css │ │ └── layout.tsx │ ├── components │ │ ├── Alert.tsx │ │ └── InputErrorMessage.tsx │ ├── lib │ │ ├── supabase-server.ts │ │ ├── utils.ts │ │ ├── validationRules.ts │ │ └── validationSchema.ts │ ├── middleware.ts │ ├── next.config.js │ ├── package.json │ ├── playwright.config.ts │ ├── pnpm-lock.yaml │ ├── postcss.config.js │ ├── public │ │ ├── next.svg │ │ └── vercel.svg │ ├── supabase │ │ ├── .gitignore │ │ ├── auth │ │ │ └── email │ │ │ │ ├── confirmation.html │ │ │ │ ├── email-change.html │ │ │ │ ├── invite.html │ │ │ │ ├── magic-link.html │ │ │ │ └── recovery.html │ │ ├── config.toml │ │ └── seed.sql │ ├── tailwind.config.js │ ├── tests │ │ ├── password-reset-flow.spec.ts │ │ ├── signup-flow.spec.ts │ │ └── utils.ts │ └── tsconfig.json ├── nuxt │ ├── .env.example │ ├── .gitignore │ ├── .npmrc │ ├── README.md │ ├── app.vue │ ├── components │ │ ├── Alert.vue │ │ └── InputErrorMessage.vue │ ├── layouts │ │ ├── auth.vue │ │ └── default.vue │ ├── lib │ │ ├── utils.ts │ │ ├── validationRules.ts │ │ └── validationSchema.ts │ ├── middleware │ │ └── auth.ts │ ├── nuxt.config.ts │ ├── package.json │ ├── pages │ │ ├── account │ │ │ ├── index.vue │ │ │ ├── update-email.vue │ │ │ └── update-password.vue │ │ ├── auth │ │ │ ├── confirm.vue │ │ │ ├── forgotpassword.vue │ │ │ ├── signin.vue │ │ │ └── signup.vue │ │ └── index.vue │ ├── playwright.config.ts │ ├── pnpm-lock.yaml │ ├── public │ │ └── favicon.ico │ ├── server │ │ └── tsconfig.json │ ├── supabase │ │ ├── .gitignore │ │ ├── config.toml │ │ └── seed.sql │ ├── tailwind.config.js │ ├── tests │ │ ├── password-reset-flow.spec.ts │ │ ├── signup-flow.spec.ts │ │ └── utils.ts │ └── tsconfig.json ├── react │ ├── .env.example │ ├── .gitignore │ ├── README.md │ ├── index.html │ ├── package.json │ ├── playwright.config.ts │ ├── pnpm-lock.yaml │ ├── public │ │ └── vite.svg │ ├── src │ │ ├── App.tsx │ │ ├── app.css │ │ ├── assets │ │ │ └── react.svg │ │ ├── components │ │ │ ├── Alert.tsx │ │ │ ├── AppLayout.tsx │ │ │ ├── AuthLayout.tsx │ │ │ └── InputErrorMessage.tsx │ │ ├── lib │ │ │ ├── AuthProvider.tsx │ │ │ ├── db.ts │ │ │ ├── utils.ts │ │ │ ├── validationRules.ts │ │ │ └── validationSchema.ts │ │ ├── main.tsx │ │ ├── routes │ │ │ ├── account │ │ │ │ ├── index.tsx │ │ │ │ ├── update-email.tsx │ │ │ │ └── update-password.tsx │ │ │ ├── auth │ │ │ │ ├── forgotpassword.tsx │ │ │ │ ├── signin.tsx │ │ │ │ └── signup.tsx │ │ │ └── index.tsx │ │ ├── tailwind.css │ │ └── vite-env.d.ts │ ├── supabase │ │ ├── .gitignore │ │ ├── config.toml │ │ └── seed.sql │ ├── tailwind.config.cjs │ ├── tests │ │ ├── password-reset-flow.spec.ts │ │ ├── signup-flow.spec.ts │ │ └── utils.ts │ ├── tsconfig.json │ ├── tsconfig.node.json │ └── vite.config.ts └── sveltekit │ ├── .env.example │ ├── .eslintignore │ ├── .eslintrc.cjs │ ├── .github │ └── workflows │ │ └── playwright.yml │ ├── .gitignore │ ├── .npmrc │ ├── .prettierignore │ ├── .prettierrc │ ├── README.md │ ├── package.json │ ├── playwright.config.ts │ ├── pnpm-lock.yaml │ ├── src │ ├── app.d.ts │ ├── app.html │ ├── hooks.server.ts │ ├── lib │ │ ├── Alert.svelte │ │ ├── InputErrorMessage.svelte │ │ ├── LoadingRelative.svelte │ │ ├── utils.ts │ │ ├── validationRules.ts │ │ └── validationSchema.ts │ ├── routes │ │ ├── (app) │ │ │ ├── +layout.svelte │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── account │ │ │ │ ├── +layout.server.ts │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ ├── update-email │ │ │ │ │ ├── +page.server.ts │ │ │ │ │ └── +page.svelte │ │ │ │ └── update-password │ │ │ │ │ ├── +page.server.ts │ │ │ │ │ └── +page.svelte │ │ │ └── logging-in │ │ │ │ ├── +layout@.svelte │ │ │ │ └── +page.svelte │ │ ├── (auth) │ │ │ ├── +layout.server.ts │ │ │ ├── +layout.svelte │ │ │ └── auth │ │ │ │ ├── +page.ts │ │ │ │ ├── callback │ │ │ │ └── +server.ts │ │ │ │ ├── confirm │ │ │ │ └── +server.ts │ │ │ │ ├── forgotpassword │ │ │ │ ├── +page.server.ts │ │ │ │ └── +page.svelte │ │ │ │ ├── signin │ │ │ │ ├── +page.server.ts │ │ │ │ └── +page.svelte │ │ │ │ ├── signout │ │ │ │ └── +page.server.ts │ │ │ │ └── signup │ │ │ │ ├── +page.server.ts │ │ │ │ └── +page.svelte │ │ ├── +layout.server.ts │ │ ├── +layout.svelte │ │ └── +layout.ts │ └── tailwind.css │ ├── static │ ├── app.css │ └── favicon.png │ ├── supabase │ ├── .gitignore │ ├── auth │ │ └── email │ │ │ ├── confirmation.html │ │ │ ├── email-change.html │ │ │ ├── magic-link.html │ │ │ └── recovery.html │ ├── config.toml │ └── seed.sql │ ├── svelte.config.js │ ├── tailwind.config.cjs │ ├── tests │ ├── password-reset-flow.spec.ts │ ├── signup-flow.spec.ts │ └── utils.ts │ ├── tsconfig.json │ └── vite.config.ts └── user-profile ├── nextjs-pages ├── .env.example ├── .github │ └── workflows │ │ └── playwright.yml ├── .gitignore ├── README.md ├── components │ ├── Alert.tsx │ ├── AppLayout.tsx │ ├── AuthLayout.tsx │ └── InputErrorMessage.tsx ├── lib │ ├── invalidateNextRouterCache.ts │ ├── schema.ts │ ├── utils.ts │ ├── validationRules.ts │ └── validationSchema.ts ├── middleware.ts ├── next.config.js ├── package.json ├── pages │ ├── [slug].tsx │ ├── _app.tsx │ ├── _document.tsx │ ├── account │ │ ├── index.tsx │ │ ├── update-email.tsx │ │ ├── update-password.tsx │ │ └── update.tsx │ ├── api │ │ ├── auth │ │ │ ├── callback.ts │ │ │ └── confirm.ts │ │ └── hello.ts │ ├── auth │ │ ├── forgotpassword.tsx │ │ ├── index.tsx │ │ ├── signin.tsx │ │ ├── signout.tsx │ │ └── signup.tsx │ └── index.tsx ├── playwright.config.ts ├── pnpm-lock.yaml ├── public │ ├── favicon.ico │ ├── next.svg │ ├── thirteen.svg │ └── vercel.svg ├── styles │ └── tailwind.css ├── supabase │ ├── .gitignore │ ├── auth │ │ └── email │ │ │ ├── confirmation.html │ │ │ ├── email-change.html │ │ │ ├── magic-link.html │ │ │ └── recovery.html │ ├── config.toml │ ├── migrations │ │ ├── 20230217190748_add_slugify_function.sql │ │ └── 20230217193007_add_profiles_table.sql │ ├── seed.sql │ └── tests │ │ └── database │ │ ├── anons.test.sql │ │ └── profiles.test.sql ├── tailwind.config.js ├── tests │ ├── user-profile-flow.spec.ts │ └── utils.ts └── tsconfig.json ├── nextjs ├── .env.example ├── .eslintrc.json ├── .gitignore ├── README.md ├── app │ ├── (app) │ │ ├── account │ │ │ ├── page.tsx │ │ │ ├── update-email │ │ │ │ ├── email-form.tsx │ │ │ │ └── page.tsx │ │ │ ├── update-password │ │ │ │ ├── page.tsx │ │ │ │ └── password-form.tsx │ │ │ └── update │ │ │ │ ├── page.tsx │ │ │ │ └── update-form.tsx │ │ ├── layout.tsx │ │ └── page.tsx │ ├── [slug] │ │ └── page.tsx │ ├── auth │ │ ├── callback │ │ │ └── route.ts │ │ ├── confirm │ │ │ └── route.ts │ │ ├── forgotpassword │ │ │ ├── forgot-password-form.tsx │ │ │ └── page.tsx │ │ ├── layout.tsx │ │ ├── signin │ │ │ ├── page.tsx │ │ │ └── sign-in-form.tsx │ │ ├── signout │ │ │ └── route.ts │ │ └── signup │ │ │ ├── page.tsx │ │ │ └── sign-up-form.tsx │ ├── favicon.ico │ ├── global.d.ts │ ├── globals.css │ └── layout.tsx ├── components │ ├── Alert.tsx │ └── InputErrorMessage.tsx ├── lib │ ├── schema.ts │ ├── supabase-server.ts │ ├── utils.ts │ ├── validationRules.ts │ └── validationSchema.ts ├── middleware.ts ├── next.config.js ├── package.json ├── playwright.config.ts ├── pnpm-lock.yaml ├── postcss.config.js ├── public │ ├── next.svg │ └── vercel.svg ├── supabase │ ├── .gitignore │ ├── auth │ │ └── email │ │ │ ├── confirmation.html │ │ │ ├── email-change.html │ │ │ ├── magic-link.html │ │ │ └── recovery.html │ ├── config.toml │ ├── migrations │ │ ├── 20230217190748_add_slugify_function.sql │ │ └── 20230217193007_add_profiles_table.sql │ ├── seed.sql │ └── tests │ │ └── database │ │ ├── anons.test.sql │ │ └── profiles.test.sql ├── tailwind.config.js ├── tests │ ├── user-profile-flow.spec.ts │ └── utils.ts └── tsconfig.json ├── nuxt ├── .env.example ├── .gitignore ├── .npmrc ├── README.md ├── app.vue ├── components │ ├── Alert.vue │ └── InputErrorMessage.vue ├── global.d.ts ├── layouts │ ├── auth.vue │ └── default.vue ├── lib │ ├── schema.ts │ ├── utils.ts │ ├── validationRules.ts │ └── validationSchema.ts ├── middleware │ └── auth.ts ├── nuxt.config.ts ├── package.json ├── pages │ ├── account │ │ ├── index.vue │ │ ├── update-email.vue │ │ ├── update-password.vue │ │ └── update.vue │ ├── auth │ │ ├── confirm.vue │ │ ├── forgotpassword.vue │ │ ├── signin.vue │ │ └── signup.vue │ ├── index.vue │ └── u │ │ └── [slug] │ │ └── index.vue ├── playwright.config.ts ├── pnpm-lock.yaml ├── public │ └── favicon.ico ├── server │ └── tsconfig.json ├── supabase │ ├── .gitignore │ ├── config.toml │ ├── migrations │ │ ├── 20230217190748_add_slugify_function.sql │ │ └── 20230217193007_add_profiles_table.sql │ ├── seed.sql │ └── tests │ │ └── database │ │ ├── anons.test.sql │ │ └── profiles.test.sql ├── tailwind.config.js ├── tests │ ├── user-profile-flow.spec.ts │ └── utils.ts └── tsconfig.json ├── react ├── .env.example ├── .gitignore ├── README.md ├── index.html ├── package.json ├── playwright.config.ts ├── pnpm-lock.yaml ├── public │ └── vite.svg ├── src │ ├── App.tsx │ ├── app.css │ ├── assets │ │ └── react.svg │ ├── components │ │ ├── Alert.tsx │ │ ├── AppLayout.tsx │ │ ├── AuthLayout.tsx │ │ └── InputErrorMessage.tsx │ ├── global.d.ts │ ├── lib │ │ ├── AuthProvider.tsx │ │ ├── db.ts │ │ ├── schema.ts │ │ ├── useProfile.ts │ │ ├── utils.ts │ │ ├── validationRules.ts │ │ └── validationSchema.ts │ ├── main.tsx │ ├── routes │ │ ├── account │ │ │ ├── index.tsx │ │ │ ├── update-email.tsx │ │ │ ├── update-password.tsx │ │ │ └── update.tsx │ │ ├── auth │ │ │ ├── forgotpassword.tsx │ │ │ ├── signin.tsx │ │ │ └── signup.tsx │ │ ├── index.tsx │ │ └── u │ │ │ └── profile.tsx │ ├── tailwind.css │ └── vite-env.d.ts ├── supabase │ ├── .gitignore │ ├── config.toml │ ├── migrations │ │ ├── 20230217190748_add_slugify_function.sql │ │ └── 20230217193007_add_profiles_table.sql │ ├── seed.sql │ └── tests │ │ └── database │ │ ├── anons.test.sql │ │ └── profiles.test.sql ├── tailwind.config.cjs ├── tests │ ├── user-profile-flow.spec.ts │ └── utils.ts ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts └── sveltekit ├── .env.example ├── .eslintignore ├── .eslintrc.cjs ├── .github └── workflows │ └── playwright.yml ├── .gitignore ├── .npmrc ├── .prettierignore ├── .prettierrc ├── README.md ├── package.json ├── playwright.config.ts ├── pnpm-lock.yaml ├── src ├── app.d.ts ├── app.html ├── hooks.server.ts ├── lib │ ├── Alert.svelte │ ├── InputErrorMessage.svelte │ ├── LoadingRelative.svelte │ ├── schema.ts │ ├── utils.ts │ ├── validationRules.ts │ └── validationSchema.ts ├── routes │ ├── (app) │ │ ├── +layout.server.ts │ │ ├── +layout.svelte │ │ ├── +page.server.ts │ │ ├── +page.svelte │ │ └── account │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── update-email │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ │ │ ├── update-password │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ │ │ └── update │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ ├── (auth) │ │ ├── +layout.server.ts │ │ ├── +layout.svelte │ │ └── auth │ │ │ ├── +page.ts │ │ │ ├── callback │ │ │ └── +server.ts │ │ │ ├── confirm │ │ │ └── +server.ts │ │ │ ├── forgotpassword │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ │ │ ├── signin │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ │ │ ├── signout │ │ │ └── +page.server.ts │ │ │ └── signup │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ ├── +layout.server.ts │ ├── +layout.svelte │ ├── +layout.ts │ └── u │ │ └── [slug] │ │ ├── +layout@.svelte │ │ ├── +page.server.ts │ │ └── +page.svelte └── tailwind.css ├── static ├── app.css └── favicon.png ├── supabase ├── .gitignore ├── auth │ └── email │ │ ├── confirmation.html │ │ ├── email-change.html │ │ ├── magic-link.html │ │ └── recovery.html ├── config.toml ├── migrations │ ├── 20230217190748_add_slugify_function.sql │ └── 20230217193007_add_profiles_table.sql ├── seed.sql └── tests │ └── database │ ├── anons.test.sql │ └── profiles.test.sql ├── svelte.config.js ├── tailwind.config.cjs ├── tests ├── user-profile-flow.spec.ts └── utils.ts ├── tsconfig.json └── vite.config.ts /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | build 14 | playwright-report 15 | *.local 16 | 17 | # Editor directories and files 18 | .vscode/* 19 | !.vscode/extensions.json 20 | .idea 21 | .DS_Store 22 | *.suo 23 | *.ntvs* 24 | *.njsproj 25 | *.sln 26 | *.sw? 27 | 28 | 29 | # Vite 30 | .vite+ 31 | 32 | # Environment Variables 33 | .env 34 | .env.* 35 | !.env.example 36 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | auto-install-peers=true -------------------------------------------------------------------------------- /magic-link/Magic_Link_Otp_SignIn_Flow_SSR.excalidraw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/supabase-community/supabase-by-example/a40be7fe6e18c69764fdf8f4eb3422db636505c3/magic-link/Magic_Link_Otp_SignIn_Flow_SSR.excalidraw.png -------------------------------------------------------------------------------- /magic-link/README.md: -------------------------------------------------------------------------------- 1 | # Magic Link and OTP flow 2 | 3 | These are Supabase projects showing how to do magic link and otp login. 4 | 5 | These projects make use of: 6 | 7 | - [Supabase Auth Helpers](https://supabase.com/docs/guides/auth/auth-helpers) 8 | - [Zod](https://zod.dev/) Schema Validation library 9 | - [DaisyUI](https://daisyui.com/) 10 | - [tailwindcss](https://tailwindcss.com/) 11 | - [Playwright](https://playwright.dev/) e2e testing 12 | 13 | ## Magic Link Otp SignIn Flow in Server-side rendering (SSR) environment 14 |  15 | -------------------------------------------------------------------------------- /magic-link/auth-ui/react/.env.example: -------------------------------------------------------------------------------- 1 | VITE_SUPABASE_URL=http://localhost:54321 2 | VITE_SUPABASE_ANON_KEY= -------------------------------------------------------------------------------- /magic-link/auth-ui/react/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /magic-link/auth-ui/react/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 |4 | Follow this link to confirm the update of your email from {{ .Email }} to {{ .NewEmail }}: 5 |
6 | 7 | 8 |Or use the token {{ .Token }}
-------------------------------------------------------------------------------- /magic-link/express/supabase/auth/email/magic-link.html: -------------------------------------------------------------------------------- 1 |Follow this link to login:
4 | 5 | 6 |or alternatively, visit the verify token page and enter the token code: {{ .Token }}
7 | 8 |The link will remain valid for 24 hours or until it is used, whichever comes first. If you need to request another link, please click here.
-------------------------------------------------------------------------------- /magic-link/express/supabase/seed.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/supabase-community/supabase-by-example/a40be7fe6e18c69764fdf8f4eb3422db636505c3/magic-link/express/supabase/seed.sql -------------------------------------------------------------------------------- /magic-link/express/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: ["./views/**/*.{html,pug}"], 4 | theme: { 5 | extend: {}, 6 | }, 7 | plugins: [require("daisyui")], 8 | 9 | daisyui: { 10 | themes: ["winter"], 11 | }, 12 | }; 13 | -------------------------------------------------------------------------------- /magic-link/express/views/_partials.pug: -------------------------------------------------------------------------------- 1 | mixin alert(content) 2 | div(class=`alert shadow-lg rounded-none`, class!=attributes.class) 3 | div 4 | span= content 5 | 6 | mixin input_error(content) 7 | span(class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1")= content -------------------------------------------------------------------------------- /magic-link/express/views/app/account/index.pug: -------------------------------------------------------------------------------- 1 | extends ../layout 2 | 3 | block main 4 | div(class='w-11/12 p-12 px-6 py-10 rounded-lg sm:w-8/12 md:w-6/12 lg:w-5/12 2xl:w-3/12 sm:px-10 sm:py-6') 5 | h2(class="font-semibold text-4xl mb-4") Account 6 | p.font-medium.mb-10 Hi #{user.email}, you can update your email or password from here 7 | ul.divide-y-2.divide-gray-200 8 | li(class='flex justify-between hover:bg-blue-600 hover:text-blue-200') 9 | a(href='/account/update-email', class="block w-full p-3") Update email 10 | -------------------------------------------------------------------------------- /magic-link/express/views/app/layout.pug: -------------------------------------------------------------------------------- 1 | extends ../layout 2 | 3 | block content 4 | main(data-theme='winter') 5 | .flex.flex-col.h-screen 6 | .navbar.border-b.border-gray-300.py-8.px-4 7 | .flex-1 8 | h1.font-semibold 9 | a(href='/') Magic Link + Otp Flow 10 | .flex-none.space-x-10 11 | a(class='btn btn-outline no-animation' href='/account') Account 12 | form(class='block' action='/auth/signout' method='post') 13 | button(type='submit') Sign out 14 | .grid.place-items-center.my-20.mx-2 15 | block main 16 | -------------------------------------------------------------------------------- /magic-link/express/views/auth/layout.pug: -------------------------------------------------------------------------------- 1 | extends ../layout 2 | 3 | block content 4 | main(data-theme='winter') 5 | .flex.flex-col.h-screen 6 | div(class='header border-b border-gray-300 py-8 px-4 mx-8 text-center') 7 | h1.font-semibold Magic Link + Otp Flow 8 | div(class='grid place-items-center my-20 mx-2 sm:my-auto') 9 | block main 10 | -------------------------------------------------------------------------------- /magic-link/express/views/error.pug: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= message 5 | h2= error.status 6 | pre #{error.stack} 7 | -------------------------------------------------------------------------------- /magic-link/express/views/index.pug: -------------------------------------------------------------------------------- 1 | extends app/layout 2 | 3 | block main 4 | h1 Welcome #{user.email} 5 | -------------------------------------------------------------------------------- /magic-link/express/views/layout.pug: -------------------------------------------------------------------------------- 1 | doctype html 2 | html 3 | head 4 | title= `${title ? title + ' | ' : ''}Magic Link + Otp Flow` 5 | link(rel='icon', type='image/svg+xml', href='/images/vite.svg') 6 | link(rel='stylesheet', href='/stylesheets/style.css') 7 | body 8 | block content 9 | -------------------------------------------------------------------------------- /magic-link/nextjs-pages/.env.example: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_SUPABASE_URL=http://localhost:54321 2 | NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0 -------------------------------------------------------------------------------- /magic-link/nextjs-pages/components/Alert.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | 3 | type Props = { 4 | className: string; 5 | children: ReactNode; 6 | }; 7 | 8 | export default function Alert({ className, children }: Props) { 9 | return ( 10 |4 | Follow this link to confirm the update of your email from {{ .Email }} to {{ .NewEmail }}: 5 |
6 | 7 | 8 |Or use the token {{ .Token }}
-------------------------------------------------------------------------------- /magic-link/nextjs-pages/supabase/auth/email/magic-link.html: -------------------------------------------------------------------------------- 1 |Follow this link to login:
4 | 5 | 6 |or alternatively, visit the verify token page and enter the token code: {{ .Token }}
7 | 8 |The link will remain valid for 24 hours or until it is used, whichever comes first. If you need to request another link, please click here.
-------------------------------------------------------------------------------- /magic-link/nextjs-pages/supabase/seed.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/supabase-community/supabase-by-example/a40be7fe6e18c69764fdf8f4eb3422db636505c3/magic-link/nextjs-pages/supabase/seed.sql -------------------------------------------------------------------------------- /magic-link/nextjs-pages/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: ['./{pages,components}/**/*.{html,js,jsx,tsx,ts}'], 4 | theme: { 5 | extend: {} 6 | }, 7 | plugins: [require('daisyui')], 8 | 9 | daisyui: { 10 | themes: ['winter'] 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /magic-link/nextjs/.env.example: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_SUPABASE_URL=http://localhost:54321 2 | NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0 -------------------------------------------------------------------------------- /magic-link/nextjs/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /magic-link/nextjs/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env 29 | .env.* 30 | !.env.example 31 | 32 | # vercel 33 | .vercel 34 | 35 | # typescript 36 | *.tsbuildinfo 37 | next-env.d.ts 38 | -------------------------------------------------------------------------------- /magic-link/nextjs/app/(app)/account/update-email/page.tsx: -------------------------------------------------------------------------------- 1 | import { createServerClient } from "@/lib/supabase-server"; 2 | import EmailForm from "./email-form"; 3 | 4 | export const dynamic = "force-dynamic"; 5 | 6 | export default async function UpdateEmail() { 7 | const supabase = createServerClient(); 8 | 9 | const { 10 | data: { session }, 11 | } = await supabase.auth.getSession(); 12 | 13 | return4 | Follow this link to confirm the update of your email from {{ .Email }} to {{ .NewEmail }}: 5 |
6 | 7 | 8 |Or use the token {{ .Token }}
-------------------------------------------------------------------------------- /magic-link/nextjs/supabase/auth/email/magic-link.html: -------------------------------------------------------------------------------- 1 |Follow this link to login:
4 | 5 | 6 |or alternatively, visit the verify token page and enter the token code: {{ .Token }}
7 | 8 |The link will remain valid for 24 hours or until it is used, whichever comes first. If you need to request another link, please click here.
-------------------------------------------------------------------------------- /magic-link/nextjs/supabase/seed.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/supabase-community/supabase-by-example/a40be7fe6e18c69764fdf8f4eb3422db636505c3/magic-link/nextjs/supabase/seed.sql -------------------------------------------------------------------------------- /magic-link/nuxt/.env.example: -------------------------------------------------------------------------------- 1 | SUPABASE_URL=http://localhost:54321 2 | SUPABASE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0 -------------------------------------------------------------------------------- /magic-link/nuxt/.gitignore: -------------------------------------------------------------------------------- 1 | # Nuxt dev/build outputs 2 | .output 3 | .nuxt 4 | .nitro 5 | .cache 6 | dist 7 | 8 | # Node dependencies 9 | node_modules 10 | 11 | # Logs 12 | logs 13 | *.log 14 | 15 | # Misc 16 | .DS_Store 17 | .fleet 18 | .idea 19 | 20 | # Local env files 21 | .env 22 | .env.* 23 | !.env.example 24 | -------------------------------------------------------------------------------- /magic-link/nuxt/.npmrc: -------------------------------------------------------------------------------- 1 | shamefully-hoist=true 2 | strict-peer-dependencies=false 3 | -------------------------------------------------------------------------------- /magic-link/nuxt/app.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 |4 | Follow this link to confirm the update of your email from {{ .Email }} to {{ .NewEmail }}: 5 |
6 | 7 | 8 |Or use the token {{ .Token }}
-------------------------------------------------------------------------------- /magic-link/sveltekit/supabase/auth/email/magic-link.html: -------------------------------------------------------------------------------- 1 |Follow this link to login:
4 | 5 | 6 |or alternatively, visit the verify token page and enter the token code: {{ .Token }}
7 | 8 |The link will remain valid for 24 hours or until it is used, whichever comes first. If you need to request another link, please click here.
-------------------------------------------------------------------------------- /magic-link/sveltekit/supabase/seed.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/supabase-community/supabase-by-example/a40be7fe6e18c69764fdf8f4eb3422db636505c3/magic-link/sveltekit/supabase/seed.sql -------------------------------------------------------------------------------- /magic-link/sveltekit/svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-auto'; 2 | import preprocess from 'svelte-preprocess'; 3 | 4 | /** @type {import('@sveltejs/kit').Config} */ 5 | const config = { 6 | // Consult https://github.com/sveltejs/svelte-preprocess 7 | // for more information about preprocessors 8 | preprocess: preprocess(), 9 | 10 | kit: { 11 | adapter: adapter() 12 | } 13 | }; 14 | 15 | export default config; 16 | -------------------------------------------------------------------------------- /magic-link/sveltekit/tailwind.config.cjs: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: ['./src/**/*.{html,js,svelte,ts}'], 4 | theme: { 5 | extend: {} 6 | }, 7 | plugins: [require('daisyui')], 8 | 9 | daisyui: { 10 | themes: ['winter'] 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /magic-link/sveltekit/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "checkJs": true, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "resolveJsonModule": true, 9 | "skipLibCheck": true, 10 | "sourceMap": true, 11 | "strict": true 12 | } 13 | // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias 14 | // 15 | // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes 16 | // from the referenced tsconfig.json - TypeScript does not merge them in 17 | } 18 | -------------------------------------------------------------------------------- /magic-link/sveltekit/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import type { UserConfig } from 'vite'; 3 | 4 | const config: UserConfig = { 5 | plugins: [sveltekit()] 6 | }; 7 | 8 | export default config; 9 | -------------------------------------------------------------------------------- /oauth-flow/OAuth_SignIn_Flow_SSR.excalidraw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/supabase-community/supabase-by-example/a40be7fe6e18c69764fdf8f4eb3422db636505c3/oauth-flow/OAuth_SignIn_Flow_SSR.excalidraw.png -------------------------------------------------------------------------------- /oauth-flow/README.md: -------------------------------------------------------------------------------- 1 | # OAuth Sign-in flow 2 | 3 | These are Supabase projects showing how to do OAuth sign-in. 4 | 5 | These projects make use of: 6 | 7 | - [Supabase Auth Helpers](https://supabase.com/docs/guides/auth/auth-helpers) 8 | - [Zod](https://zod.dev/) Schema Validation library 9 | - [DaisyUI](https://daisyui.com/) 10 | - [tailwindcss](https://tailwindcss.com/) 11 | 12 | ## OAuth SignIn Flow in Server-side rendering (SSR) environment 13 |  14 | -------------------------------------------------------------------------------- /oauth-flow/nextjs-pages/.env.example: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_SUPABASE_URL=http://localhost:54321 2 | NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0 3 | GITHUB_CLIENT_ID= 4 | GITHUB_SECRET= 5 | GOOGLE_CLIENT_ID= 6 | GOOGLE_SECRET= 7 | AZURE_CLIENT_ID= 8 | AZURE_SECRET= -------------------------------------------------------------------------------- /oauth-flow/nextjs-pages/components/Alert.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | 3 | type Props = { 4 | className: string; 5 | children: ReactNode; 6 | }; 7 | 8 | export default function Alert({ className, children }: Props) { 9 | return ( 10 |9 | Hi {{ user.email }}, this is your account page 10 |
11 |11 | Hi {user?.email}, you can update your email or password from here 12 |
13 |4 | Follow this link to confirm the update of your email from {{ .Email }} to {{ .NewEmail }}: 5 |
6 | 7 | 8 |Or use the token {{ .Token }}
-------------------------------------------------------------------------------- /reset-flow/auth-ui/nextjs/supabase/auth/email/magic-link.html: -------------------------------------------------------------------------------- 1 |Follow this link to login:
4 | 5 | 6 |The link will remain valid for 24 hours or until it is used, whichever comes first. If you need to request another link, please click here.
-------------------------------------------------------------------------------- /reset-flow/auth-ui/nextjs/supabase/seed.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/supabase-community/supabase-by-example/a40be7fe6e18c69764fdf8f4eb3422db636505c3/reset-flow/auth-ui/nextjs/supabase/seed.sql -------------------------------------------------------------------------------- /reset-flow/auth-ui/react/.env.example: -------------------------------------------------------------------------------- 1 | VITE_SUPABASE_URL=http://localhost:54321 2 | VITE_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0 -------------------------------------------------------------------------------- /reset-flow/auth-ui/react/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | 26 | # local env files 27 | .env 28 | .env.* 29 | !.env.example 30 | -------------------------------------------------------------------------------- /reset-flow/auth-ui/react/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |4 | Follow this link to confirm the update of your email from {{ .Email }} to {{ .NewEmail }}: 5 |
6 | 7 | 8 |Or use the token {{ .Token }}
-------------------------------------------------------------------------------- /reset-flow/express/supabase/auth/email/magic-link.html: -------------------------------------------------------------------------------- 1 |Follow this link to login:
4 | 5 | 6 |or alternatively, visit the verify token page and enter the token code: {{ .Token }}
7 | 8 |The link will remain valid for 24 hours or until it is used, whichever comes first. If you need to request another link, please click here.
-------------------------------------------------------------------------------- /reset-flow/express/supabase/seed.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/supabase-community/supabase-by-example/a40be7fe6e18c69764fdf8f4eb3422db636505c3/reset-flow/express/supabase/seed.sql -------------------------------------------------------------------------------- /reset-flow/express/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: ["./views/**/*.{html,pug}"], 4 | theme: { 5 | extend: {}, 6 | }, 7 | plugins: [require("daisyui")], 8 | 9 | daisyui: { 10 | themes: ["winter"], 11 | }, 12 | }; 13 | -------------------------------------------------------------------------------- /reset-flow/express/views/_partials.pug: -------------------------------------------------------------------------------- 1 | mixin alert(content) 2 | div(class=`alert shadow-lg rounded-none`, class!=attributes.class) 3 | div 4 | span= content 5 | 6 | mixin input_error(content) 7 | span(class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1")= content -------------------------------------------------------------------------------- /reset-flow/express/views/app/layout.pug: -------------------------------------------------------------------------------- 1 | extends ../layout 2 | 3 | block content 4 | main(data-theme='winter') 5 | .flex.flex-col.h-screen 6 | .navbar.border-b.border-gray-300.py-8.px-4 7 | .flex-1 8 | h1.font-semibold 9 | a(href='/') Reset Flow 10 | .flex-none.space-x-10 11 | a(class='btn btn-outline no-animation' href='/account') Account 12 | form(class='block' action='/auth/signout' method='post') 13 | button(type='submit') Sign out 14 | .grid.place-items-center.my-20.mx-2 15 | block main 16 | -------------------------------------------------------------------------------- /reset-flow/express/views/auth/layout.pug: -------------------------------------------------------------------------------- 1 | extends ../layout 2 | 3 | block content 4 | main(data-theme='winter') 5 | .flex.flex-col.h-screen 6 | div(class='header border-b border-gray-300 py-8 px-4 mx-8 text-center') 7 | h1.font-semibold Reset Flow 8 | div(class='grid place-items-center my-20 mx-2 sm:my-auto') 9 | block main 10 | -------------------------------------------------------------------------------- /reset-flow/express/views/error.pug: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= message 5 | h2= error.status 6 | pre #{error.stack} 7 | -------------------------------------------------------------------------------- /reset-flow/express/views/index.pug: -------------------------------------------------------------------------------- 1 | extends app/layout 2 | 3 | block main 4 | h1 Welcome #{user.email} 5 | -------------------------------------------------------------------------------- /reset-flow/express/views/layout.pug: -------------------------------------------------------------------------------- 1 | doctype html 2 | html 3 | head 4 | title= `${title ? title + ' | ' : ''}Reset Flow` 5 | link(rel='icon', type='image/svg+xml', href='/images/vite.svg') 6 | link(rel='stylesheet', href='/stylesheets/style.css') 7 | body 8 | block content 9 | -------------------------------------------------------------------------------- /reset-flow/nextjs-pages/.env.example: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_SUPABASE_URL=http://localhost:54321 2 | NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0 -------------------------------------------------------------------------------- /reset-flow/nextjs-pages/components/Alert.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | 3 | type Props = { 4 | className: string; 5 | children: ReactNode; 6 | }; 7 | 8 | export default function Alert({ className, children }: Props) { 9 | return ( 10 |4 | Follow this link to confirm the update of your email from {{ .Email }} to {{ .NewEmail }}: 5 |
6 | 7 | 8 |Or use the token {{ .Token }}
-------------------------------------------------------------------------------- /reset-flow/nextjs-pages/supabase/auth/email/magic-link.html: -------------------------------------------------------------------------------- 1 |Follow this link to login:
4 | 5 | 6 |or alternatively, visit the verify token page and enter the token code: {{ .Token }}
7 | 8 |The link will remain valid for 24 hours or until it is used, whichever comes first. If you need to request another link, please click here.
-------------------------------------------------------------------------------- /reset-flow/nextjs-pages/supabase/seed.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/supabase-community/supabase-by-example/a40be7fe6e18c69764fdf8f4eb3422db636505c3/reset-flow/nextjs-pages/supabase/seed.sql -------------------------------------------------------------------------------- /reset-flow/nextjs-pages/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: ['./{pages,components}/**/*.{html,js,jsx,tsx,ts}'], 4 | theme: { 5 | extend: {} 6 | }, 7 | plugins: [require('daisyui')], 8 | 9 | daisyui: { 10 | themes: ['winter'] 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /reset-flow/nextjs/.env.example: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_SUPABASE_URL=http://localhost:54321 2 | NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0 -------------------------------------------------------------------------------- /reset-flow/nextjs/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /reset-flow/nextjs/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env 29 | .env.* 30 | !.env.example 31 | 32 | # vercel 33 | .vercel 34 | 35 | # typescript 36 | *.tsbuildinfo 37 | next-env.d.ts 38 | -------------------------------------------------------------------------------- /reset-flow/nextjs/app/(app)/account/update-email/page.tsx: -------------------------------------------------------------------------------- 1 | import { createServerClient } from "@/lib/supabase-server"; 2 | import EmailForm from "./email-form"; 3 | 4 | export default async function UpdateEmail() { 5 | const supabase = createServerClient(); 6 | 7 | const { 8 | data: { session }, 9 | } = await supabase.auth.getSession(); 10 | 11 | returnWe are writing to confirm you initiated an email change from {{ .Email }} to {{ .NewEmail }}
5 | 6 | {{ else }} 7 |Please confirm your email address ({{ .NewEmail }}) for this account.
8 | 9 | {{end}} 10 | 11 |Or use the token {{ .Token }}
-------------------------------------------------------------------------------- /reset-flow/nextjs/supabase/auth/email/invite.html: -------------------------------------------------------------------------------- 1 |4 | You have been invited to create a user on {{ .SiteURL }}. Follow this link to 5 | accept the invite: 6 |
7 | 8 | 9 |The link will remain valid for 24 hours or until it is used, whichever comes first. If you need to request another link, please contact the website admin.
10 | -------------------------------------------------------------------------------- /reset-flow/nextjs/supabase/auth/email/magic-link.html: -------------------------------------------------------------------------------- 1 |Follow this link to login:
4 | 5 | 6 |or alternatively, visit the verify token page and enter the token code: {{ .Token }}
7 | 8 |The link will remain valid for 24 hours or until it is used, whichever comes first. If you need to request another link, please click here.
-------------------------------------------------------------------------------- /reset-flow/nextjs/supabase/seed.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/supabase-community/supabase-by-example/a40be7fe6e18c69764fdf8f4eb3422db636505c3/reset-flow/nextjs/supabase/seed.sql -------------------------------------------------------------------------------- /reset-flow/nuxt/.env.example: -------------------------------------------------------------------------------- 1 | SUPABASE_URL=http://localhost:54321 2 | SUPABASE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0 -------------------------------------------------------------------------------- /reset-flow/nuxt/.gitignore: -------------------------------------------------------------------------------- 1 | # Nuxt dev/build outputs 2 | .output 3 | .nuxt 4 | .nitro 5 | .cache 6 | dist 7 | 8 | # Node dependencies 9 | node_modules 10 | 11 | # Logs 12 | logs 13 | *.log 14 | 15 | # Misc 16 | .DS_Store 17 | .fleet 18 | .idea 19 | 20 | # Local env files 21 | .env 22 | .env.* 23 | !.env.example 24 | -------------------------------------------------------------------------------- /reset-flow/nuxt/.npmrc: -------------------------------------------------------------------------------- 1 | shamefully-hoist=true 2 | strict-peer-dependencies=false 3 | -------------------------------------------------------------------------------- /reset-flow/nuxt/app.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 |Visit kit.svelte.dev to read the documentation
10 | -------------------------------------------------------------------------------- /reset-flow/sveltekit/src/routes/(app)/account/+layout.server.ts: -------------------------------------------------------------------------------- 1 | import { redirect } from '@sveltejs/kit'; 2 | import type { LayoutServerLoad } from './$types'; 3 | 4 | export const load: LayoutServerLoad = async ({ locals: { getSession } }) => { 5 | const session = await getSession(); 6 | 7 | if (!session) { 8 | throw redirect(303, '/auth/signin'); 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /reset-flow/sveltekit/src/routes/(app)/logging-in/+layout@.svelte: -------------------------------------------------------------------------------- 1 |4 | Follow this link to confirm the update of your email from {{ .Email }} to {{ .NewEmail }}: 5 |
6 | 7 | 8 |Or use the token {{ .Token }}
-------------------------------------------------------------------------------- /reset-flow/sveltekit/supabase/auth/email/magic-link.html: -------------------------------------------------------------------------------- 1 |Follow this link to login:
4 | 5 | 6 |or alternatively, visit the verify token page and enter the token code: {{ .Token }}
7 | 8 |The link will remain valid for 24 hours or until it is used, whichever comes first. If you need to request another link, please click here.
-------------------------------------------------------------------------------- /reset-flow/sveltekit/supabase/seed.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/supabase-community/supabase-by-example/a40be7fe6e18c69764fdf8f4eb3422db636505c3/reset-flow/sveltekit/supabase/seed.sql -------------------------------------------------------------------------------- /reset-flow/sveltekit/svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-auto'; 2 | import preprocess from 'svelte-preprocess'; 3 | 4 | /** @type {import('@sveltejs/kit').Config} */ 5 | const config = { 6 | // Consult https://github.com/sveltejs/svelte-preprocess 7 | // for more information about preprocessors 8 | preprocess: preprocess(), 9 | 10 | kit: { 11 | adapter: adapter() 12 | } 13 | }; 14 | 15 | export default config; 16 | -------------------------------------------------------------------------------- /reset-flow/sveltekit/tailwind.config.cjs: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: ['./src/**/*.{html,js,svelte,ts}'], 4 | theme: { 5 | extend: {} 6 | }, 7 | plugins: [require('daisyui')], 8 | 9 | daisyui: { 10 | themes: ['winter'] 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /reset-flow/sveltekit/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import type { UserConfig } from 'vite'; 3 | 4 | const config: UserConfig = { 5 | plugins: [sveltekit()] 6 | }; 7 | 8 | export default config; 9 | -------------------------------------------------------------------------------- /user-profile/nextjs-pages/.env.example: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_SUPABASE_URL=http://localhost:54321 2 | NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0 -------------------------------------------------------------------------------- /user-profile/nextjs-pages/components/Alert.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | 3 | type Props = { 4 | className: string; 5 | children: ReactNode; 6 | }; 7 | 8 | export default function Alert({ className, children }: Props) { 9 | return ( 10 |4 | Follow this link to confirm the update of your email from {{ .Email }} to {{ .NewEmail }}: 5 |
6 | 7 | 8 |Or use the token {{ .Token }}
-------------------------------------------------------------------------------- /user-profile/nextjs-pages/supabase/auth/email/magic-link.html: -------------------------------------------------------------------------------- 1 |Follow this link to login:
4 | 5 | 6 |or alternatively, visit the verify token page and enter the token code: {{ .Token }}
7 | 8 |The link will remain valid for 24 hours or until it is used, whichever comes first. If you need to request another link, please click here.
-------------------------------------------------------------------------------- /user-profile/nextjs-pages/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: ['./{pages,components}/**/*.{html,js,jsx,tsx,ts}'], 4 | theme: { 5 | extend: {} 6 | }, 7 | plugins: [require('daisyui')], 8 | 9 | daisyui: { 10 | themes: ['winter'] 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /user-profile/nextjs/.env.example: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_SUPABASE_URL=http://localhost:54321 2 | NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0 -------------------------------------------------------------------------------- /user-profile/nextjs/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /user-profile/nextjs/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env 29 | .env.* 30 | !.env.example 31 | 32 | # vercel 33 | .vercel 34 | 35 | # typescript 36 | *.tsbuildinfo 37 | next-env.d.ts 38 | -------------------------------------------------------------------------------- /user-profile/nextjs/app/(app)/account/update-email/page.tsx: -------------------------------------------------------------------------------- 1 | import { createServerClient } from "@/lib/supabase-server"; 2 | import EmailForm from "./email-form"; 3 | 4 | export const dynamic = "force-dynamic"; 5 | 6 | export default async function UpdateEmail() { 7 | const supabase = createServerClient(); 8 | 9 | const { 10 | data: { session }, 11 | } = await supabase.auth.getSession(); 12 | 13 | return4 | Follow this link to confirm the update of your email from {{ .Email }} to {{ .NewEmail }}: 5 |
6 | 7 | 8 |Or use the token {{ .Token }}
-------------------------------------------------------------------------------- /user-profile/nextjs/supabase/auth/email/magic-link.html: -------------------------------------------------------------------------------- 1 |Follow this link to login:
4 | 5 | 6 |or alternatively, visit the verify token page and enter the token code: {{ .Token }}
7 | 8 |The link will remain valid for 24 hours or until it is used, whichever comes first. If you need to request another link, please click here.
-------------------------------------------------------------------------------- /user-profile/nuxt/.env.example: -------------------------------------------------------------------------------- 1 | SUPABASE_URL=http://localhost:54321 2 | SUPABASE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0 -------------------------------------------------------------------------------- /user-profile/nuxt/.gitignore: -------------------------------------------------------------------------------- 1 | # Nuxt dev/build outputs 2 | .output 3 | .nuxt 4 | .nitro 5 | .cache 6 | dist 7 | 8 | # Node dependencies 9 | node_modules 10 | 11 | # Logs 12 | logs 13 | *.log 14 | 15 | # Misc 16 | .DS_Store 17 | .fleet 18 | .idea 19 | 20 | # Local env files 21 | .env 22 | .env.* 23 | !.env.example 24 | -------------------------------------------------------------------------------- /user-profile/nuxt/.npmrc: -------------------------------------------------------------------------------- 1 | shamefully-hoist=true 2 | strict-peer-dependencies=false 3 | -------------------------------------------------------------------------------- /user-profile/nuxt/app.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 |4 | Follow this link to confirm the update of your email from {{ .Email }} to {{ .NewEmail }}: 5 |
6 | 7 | 8 |Or use the token {{ .Token }}
-------------------------------------------------------------------------------- /user-profile/sveltekit/supabase/auth/email/magic-link.html: -------------------------------------------------------------------------------- 1 |Follow this link to login:
4 | 5 | 6 |or alternatively, visit the verify token page and enter the token code: {{ .Token }}
7 | 8 |The link will remain valid for 24 hours or until it is used, whichever comes first. If you need to request another link, please click here.
-------------------------------------------------------------------------------- /user-profile/sveltekit/svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-auto'; 2 | import preprocess from 'svelte-preprocess'; 3 | 4 | /** @type {import('@sveltejs/kit').Config} */ 5 | const config = { 6 | // Consult https://github.com/sveltejs/svelte-preprocess 7 | // for more information about preprocessors 8 | preprocess: preprocess(), 9 | 10 | kit: { 11 | adapter: adapter() 12 | } 13 | }; 14 | 15 | export default config; 16 | -------------------------------------------------------------------------------- /user-profile/sveltekit/tailwind.config.cjs: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: ['./src/**/*.{html,js,svelte,ts}'], 4 | theme: { 5 | extend: {} 6 | }, 7 | plugins: [require('daisyui')], 8 | 9 | daisyui: { 10 | themes: ['winter'] 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /user-profile/sveltekit/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import type { UserConfig } from 'vite'; 3 | 4 | const config: UserConfig = { 5 | plugins: [sveltekit()] 6 | }; 7 | 8 | export default config; 9 | --------------------------------------------------------------------------------