feat: change social provider config to flat config

This commit is contained in:
Bereket Engida
2024-09-23 23:19:22 +03:00
parent 516458aedd
commit 675a9206f9
34 changed files with 111 additions and 501 deletions

24
demo/astro/.gitignore vendored
View File

@@ -1,24 +0,0 @@
# build output
dist/
# generated types
.astro/
# dependencies
node_modules/
# logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# environment variables
.env
.env.production
# macOS-specific files
.DS_Store
# jetbrains setting folder
.idea/

View File

@@ -1,4 +0,0 @@
{
"recommendations": ["astro-build.astro-vscode"],
"unwantedRecommendations": []
}

View File

@@ -1,11 +0,0 @@
{
"version": "0.2.0",
"configurations": [
{
"command": "./node_modules/.bin/astro dev",
"name": "Development server",
"request": "launch",
"type": "node-terminal"
}
]
}

View File

@@ -1,54 +0,0 @@
# Astro Starter Kit: Basics
```sh
npm create astro@latest -- --template basics
```
[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/astro/tree/latest/examples/basics)
[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/basics)
[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/basics/devcontainer.json)
> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun!
![just-the-basics](https://github.com/withastro/astro/assets/2244813/a0a5533c-a856-4198-8470-2d67b1d7c554)
## 🚀 Project Structure
Inside of your Astro project, you'll see the following folders and files:
```text
/
├── public/
│ └── favicon.svg
├── src/
│ ├── components/
│ │ └── Card.astro
│ ├── layouts/
│ │ └── Layout.astro
│ └── pages/
│ └── index.astro
└── package.json
```
Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name.
There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components.
Any static assets, like images, can be placed in the `public/` directory.
## 🧞 Commands
All commands are run from the root of the project, from a terminal:
| Command | Action |
| :------------------------ | :----------------------------------------------- |
| `npm install` | Installs dependencies |
| `npm run dev` | Starts local dev server at `localhost:4321` |
| `npm run build` | Build your production site to `./dist/` |
| `npm run preview` | Preview your build locally, before deploying |
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
| `npm run astro -- --help` | Get help using the Astro CLI |
## 👀 Want to learn more?
Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat).

View File

@@ -1,10 +0,0 @@
// @ts-check
import { defineConfig } from 'astro/config';
import vercel from '@astrojs/vercel/serverless';
// https://astro.build/config
export default defineConfig({
output: 'server',
adapter: vercel()
});

View File

@@ -1,20 +0,0 @@
{
"name": "@dev/astro",
"private": true,
"type": "module",
"version": "0.0.1",
"scripts": {
"dev": "astro dev",
"start": "astro dev",
"build": "astro check && astro build",
"preview": "astro preview",
"astro": "astro"
},
"dependencies": {
"@astrojs/check": "^0.9.3",
"@astrojs/vercel": "^7.8.1",
"astro": "^4.15.8",
"better-auth": "workspace:*",
"typescript": "^5.6.2"
}
}

View File

@@ -1,9 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 128 128">
<path d="M50.4 78.5a75.1 75.1 0 0 0-28.5 6.9l24.2-65.7c.7-2 1.9-3.2 3.4-3.2h29c1.5 0 2.7 1.2 3.4 3.2l24.2 65.7s-11.6-7-28.5-7L67 45.5c-.4-1.7-1.6-2.8-2.9-2.8-1.3 0-2.5 1.1-2.9 2.7L50.4 78.5Zm-1.1 28.2Zm-4.2-20.2c-2 6.6-.6 15.8 4.2 20.2a17.5 17.5 0 0 1 .2-.7 5.5 5.5 0 0 1 5.7-4.5c2.8.1 4.3 1.5 4.7 4.7.2 1.1.2 2.3.2 3.5v.4c0 2.7.7 5.2 2.2 7.4a13 13 0 0 0 5.7 4.9v-.3l-.2-.3c-1.8-5.6-.5-9.5 4.4-12.8l1.5-1a73 73 0 0 0 3.2-2.2 16 16 0 0 0 6.8-11.4c.3-2 .1-4-.6-6l-.8.6-1.6 1a37 37 0 0 1-22.4 2.7c-5-.7-9.7-2-13.2-6.2Z" />
<style>
path { fill: #000; }
@media (prefers-color-scheme: dark) {
path { fill: #FFF; }
}
</style>
</svg>

Before

Width:  |  Height:  |  Size: 749 B

View File

@@ -1,61 +0,0 @@
---
interface Props {
title: string;
body: string;
href: string;
}
const { href, title, body } = Astro.props;
---
<li class="link-card">
<a href={href}>
<h2>
{title}
<span>&rarr;</span>
</h2>
<p>
{body}
</p>
</a>
</li>
<style>
.link-card {
list-style: none;
display: flex;
padding: 1px;
background-color: #23262d;
background-image: none;
background-size: 400%;
border-radius: 7px;
background-position: 100%;
transition: background-position 0.6s cubic-bezier(0.22, 1, 0.36, 1);
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1);
}
.link-card > a {
width: 100%;
text-decoration: none;
line-height: 1.4;
padding: calc(1.5rem - 1px);
border-radius: 8px;
color: white;
background-color: #23262d;
opacity: 0.8;
}
h2 {
margin: 0;
font-size: 1.25rem;
transition: color 0.6s cubic-bezier(0.22, 1, 0.36, 1);
}
p {
margin-top: 0.5rem;
margin-bottom: 0;
}
.link-card:is(:hover, :focus-within) {
background-position: 0;
background-image: var(--accent-gradient);
}
.link-card:is(:hover, :focus-within) h2 {
color: rgb(var(--accent-light));
}
</style>

View File

@@ -1 +0,0 @@
/// <reference path="../.astro/types.d.ts" />

View File

@@ -1,50 +0,0 @@
---
interface Props {
title: string;
}
const { title } = Astro.props;
---
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="description" content="Astro description" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="generator" content={Astro.generator} />
<title>{title}</title>
</head>
<body>
<slot />
</body>
</html>
<style is:global>
:root {
--accent: 136, 58, 234;
--accent-light: 224, 204, 250;
--accent-dark: 49, 10, 101;
--accent-gradient: linear-gradient(
45deg,
rgb(var(--accent)),
rgb(var(--accent-light)) 30%,
white 60%
);
}
html {
font-family: system-ui, sans-serif;
background: #13151a;
}
code {
font-family:
Menlo,
Monaco,
Lucida Console,
Liberation Mono,
DejaVu Sans Mono,
Bitstream Vera Sans Mono,
Courier New,
monospace;
}
</style>

View File

@@ -1,8 +0,0 @@
import { betterAuth } from "better-auth";
export const auth = betterAuth({
database: {
provider: "sqlite",
url: "./sqlite.db",
},
});

View File

@@ -1,6 +0,0 @@
import type { APIRoute } from "astro";
import { auth } from "../../../lib/auth";
export const ALL: APIRoute = ({ request }) => {
return auth.handler(request);
};

View File

@@ -1,123 +0,0 @@
---
import Layout from '../layouts/Layout.astro';
import Card from '../components/Card.astro';
---
<Layout title="Welcome to Astro.">
<main>
<svg
class="astro-a"
width="495"
height="623"
viewBox="0 0 495 623"
fill="none"
xmlns="http://www.w3.org/2000/svg"
aria-hidden="true"
>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M167.19 364.254C83.4786 364.254 0 404.819 0 404.819C0 404.819 141.781 19.4876 142.087 18.7291C146.434 7.33701 153.027 0 162.289 0H332.441C341.703 0 348.574 7.33701 352.643 18.7291C352.92 19.5022 494.716 404.819 494.716 404.819C494.716 404.819 426.67 364.254 327.525 364.254L264.41 169.408C262.047 159.985 255.147 153.581 247.358 153.581C239.569 153.581 232.669 159.985 230.306 169.408L167.19 364.254ZM160.869 530.172C160.877 530.18 160.885 530.187 160.894 530.195L160.867 530.181C160.868 530.178 160.868 530.175 160.869 530.172ZM136.218 411.348C124.476 450.467 132.698 504.458 160.869 530.172C160.997 529.696 161.125 529.242 161.248 528.804C161.502 527.907 161.737 527.073 161.917 526.233C165.446 509.895 178.754 499.52 195.577 500.01C211.969 500.487 220.67 508.765 223.202 527.254C224.141 534.12 224.23 541.131 224.319 548.105C224.328 548.834 224.337 549.563 224.347 550.291C224.563 566.098 228.657 580.707 237.264 593.914C245.413 606.426 256.108 615.943 270.749 622.478C270.593 621.952 270.463 621.508 270.35 621.126C270.045 620.086 269.872 619.499 269.685 618.911C258.909 585.935 266.668 563.266 295.344 543.933C298.254 541.971 301.187 540.041 304.12 538.112C310.591 533.854 317.059 529.599 323.279 525.007C345.88 508.329 360.09 486.327 363.431 457.844C364.805 446.148 363.781 434.657 359.848 423.275C358.176 424.287 356.587 425.295 355.042 426.275C351.744 428.366 348.647 430.33 345.382 431.934C303.466 452.507 259.152 455.053 214.03 448.245C184.802 443.834 156.584 436.019 136.218 411.348Z"
fill="url(#paint0_linear_1805_24383)"></path>
<defs>
<linearGradient
id="paint0_linear_1805_24383"
x1="247.358"
y1="0"
x2="247.358"
y2="622.479"
gradientUnits="userSpaceOnUse"
>
<stop stop-opacity="0.9"></stop>
<stop offset="1" stop-opacity="0.2"></stop>
</linearGradient>
</defs>
</svg>
<h1>Welcome to <span class="text-gradient">Astro</span></h1>
<p class="instructions">
To get started, open the directory <code>src/pages</code> in your project.<br />
<strong>Code Challenge:</strong> Tweak the "Welcome to Astro" message above.
</p>
<ul role="list" class="link-card-grid">
<Card
href="https://docs.astro.build/"
title="Documentation"
body="Learn how Astro works and explore the official API docs."
/>
<Card
href="https://astro.build/integrations/"
title="Integrations"
body="Supercharge your project with new frameworks and libraries."
/>
<Card
href="https://astro.build/themes/"
title="Themes"
body="Explore a galaxy of community-built starter themes."
/>
<Card
href="https://astro.build/chat/"
title="Community"
body="Come say hi to our amazing Discord community. ❤️"
/>
</ul>
</main>
</Layout>
<style>
main {
margin: auto;
padding: 1rem;
width: 800px;
max-width: calc(100% - 2rem);
color: white;
font-size: 20px;
line-height: 1.6;
}
.astro-a {
position: absolute;
top: -32px;
left: 50%;
transform: translatex(-50%);
width: 220px;
height: auto;
z-index: -1;
}
h1 {
font-size: 4rem;
font-weight: 700;
line-height: 1;
text-align: center;
margin-bottom: 1em;
}
.text-gradient {
background-image: var(--accent-gradient);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-size: 400%;
background-position: 0%;
}
.instructions {
margin-bottom: 2rem;
border: 1px solid rgba(var(--accent-light), 25%);
background: linear-gradient(rgba(var(--accent-dark), 66%), rgba(var(--accent-dark), 33%));
padding: 1.5rem;
border-radius: 8px;
}
.instructions code {
font-size: 0.8em;
font-weight: bold;
background: rgba(var(--accent-light), 12%);
color: rgb(var(--accent-light));
border-radius: 4px;
padding: 0.3em 0.4em;
}
.instructions strong {
color: rgb(var(--accent-light));
}
.link-card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(24ch, 1fr));
gap: 2rem;
padding: 0;
}
</style>

View File

@@ -1,3 +0,0 @@
{
"extends": "astro/tsconfigs/strict"
}

View File

@@ -8,14 +8,13 @@ import { GeistSans } from "geist/font/sans";
import { Wrapper, WrapperWithQuery } from "@/components/wrapper";
import { createMetadata } from "@/lib/metadata";
export const metadata = createMetadata({
title: {
template: "%s | Better Auth",
default: "Better Auth",
},
description: "The most comprehensive authentication library for typescript",
metadataBase: new URL("https://demo.better-auth.com",)
metadataBase: new URL("https://demo.better-auth.com"),
});
export default function RootLayout({
@@ -31,9 +30,7 @@ export default function RootLayout({
<body className={`${GeistSans.variable} ${GeistMono.variable} font-sans`}>
<ThemeProvider attribute="class" defaultTheme="dark">
<Wrapper>
<WrapperWithQuery>
{children}
</WrapperWithQuery>
<WrapperWithQuery>{children}</WrapperWithQuery>
</Wrapper>
<Toaster richColors closeButton />
</ThemeProvider>

View File

@@ -4,8 +4,15 @@ import { Suspense } from "react";
export default async function Home() {
const features = [
"Email & Password", "Organization | Teams", "Passkeys", "Multi Factor", "Password Reset", "Roles & Permissions", "Rate Limiting", "Session Management",
]
"Email & Password",
"Organization | Teams",
"Passkeys",
"Multi Factor",
"Password Reset",
"Roles & Permissions",
"Rate Limiting",
"Session Management",
];
return (
<div className="min-h-[80vh] flex items-center justify-center overflow-hidden no-visible-scrollbar px-6 md:px-0">
<main className="flex flex-col gap-4 row-start-2 items-center justify-center">
@@ -14,7 +21,15 @@ export default async function Home() {
Better Auth.
</h3>
<p className="text-center break-words text-sm md:text-base">
Official demo to showcase <a href="https://better-auth.com" target="_blank" className="italic underline">better-auth.</a> features and capabilities. <br />
Official demo to showcase{" "}
<a
href="https://better-auth.com"
target="_blank"
className="italic underline"
>
better-auth.
</a>{" "}
features and capabilities. <br />
</p>
</div>
<div className="md:w-10/12 w-full flex flex-col gap-4">
@@ -22,14 +37,17 @@ export default async function Home() {
<div className="border-y py-2 border-dotted bg-secondary/60 opacity-80">
<div className="text-xs flex items-center gap-2 justify-center text-muted-foreground ">
<span className="text-center">
All features on this demo are Implemented with better auth without any custom backend code
All features on this demo are Implemented with better auth
without any custom backend code
</span>
</div>
</div>
<div className="flex gap-2 justify-center flex-wrap">
{features.map(feature => (
<span className="border-b pb-1 text-muted-foreground text-xs cursor-pointer hover:text-foreground duration-150 ease-in-out transition-all hover:border-foreground flex items-center gap-1" key={feature}>
{features.map((feature) => (
<span
className="border-b pb-1 text-muted-foreground text-xs cursor-pointer hover:text-foreground duration-150 ease-in-out transition-all hover:border-foreground flex items-center gap-1"
key={feature}
>
{feature}.
</span>
))}

View File

@@ -75,14 +75,14 @@ export const auth = betterAuth({
}),
passkey(),
],
socialProvider: [
github({
socialProviders: {
github: {
clientId: process.env.GITHUB_CLIENT_ID || "",
clientSecret: process.env.GITHUB_CLIENT_SECRET || "",
}),
google({
},
google: {
clientId: process.env.GOOGLE_CLIENT_ID || "",
clientSecret: process.env.GOOGLE_CLIENT_SECRET || "",
}),
],
},
},
});

View File

@@ -33,18 +33,12 @@ description: Apple
provider: "sqlite",
url: "./db.sqlite",
},
socialProvider: [ // [!code highlight]
apple({ // [!code highlight]
socialProvider: { // [!code highlight]
apple: { // [!code highlight]
clientId: process.env.APPLE_CLIENT_ID as string, // [!code highlight]
clientSecret: process.env.APPLE_CLIENT_SECRET as string, // [!code highlight]
/** // [!code highlight]
* this is optional. // [!code highlight]
* only needed if you passed a custom basePath from `/api/auth` to `betterAuth` // [!code highlight]
* or if you're using a custom domain. // [!code highlight]
*/ // [!code highlight]
redirectURI: "https://example.com/api/auth/callback/apple", // [!code highlight]
}), // [!code highlight]
], // [!code highlight]
} // [!code highlight]
}, // [!code highlight]
})
```
</Step>

View File

@@ -29,18 +29,12 @@ description: Discord Provider
provider: "sqlite",
url: "./db.sqlite",
},
socialProvider: [ // [!code highlight]
discord({ // [!code highlight]
socialProvider: { // [!code highlight]
discord: { // [!code highlight]
clientId: process.env.DISCORD_CLIENT_ID as string, // [!code highlight]
clientSecret: process.env.DISCORD_CLIENT_SECRET as string, // [!code highlight]
/** // [!code highlight]
* this is optional. // [!code highlight]
* only needed if you passed a custom basePath from `/api/auth` to `betterAuth` // [!code highlight]
* or if you're using a custom domain. // [!code highlight]
*/ // [!code highlight]
redirectURI: "https://example.com/api/auth/callback/apple", // [!code highlight]
}), // [!code highlight]
], // [!code highlight]
}, // [!code highlight]
}, // [!code highlight]
})
```
</Step>

View File

@@ -29,18 +29,12 @@ description: Facebook Provider
provider: "sqlite",
url: "./db.sqlite",
},
socialProvider: [ // [!code highlight]
facebook({ // [!code highlight]
socialProvider: { // [!code highlight]
facebook: { // [!code highlight]
clientId: process.env.FACEBOOK_CLIENT_ID as string, // [!code highlight]
clientSecret: process.env.FACEBOOK_CLIENT_SECRET as string, // [!code highlight]
/** // [!code highlight]
* this is optional. // [!code highlight]
* only needed if you passed a custom basePath from `/api/auth` to `betterAuth` // [!code highlight]
* or if you're using a custom domain. // [!code highlight]
*/ // [!code highlight]
redirectURI: "https://example.com/api/auth/callback/apple", // [!code highlight]
}), // [!code highlight]
], // [!code highlight]
}, // [!code highlight]
}, // [!code highlight]
})
```
</Step>

View File

@@ -30,16 +30,10 @@ description: Github Provider
url: "./db.sqlite",
},
socialProvider: [ // [!code highlight]
github({ // [!code highlight]
github: { // [!code highlight]
clientId: process.env.GITHUB_CLIENT_ID as string, // [!code highlight]
clientSecret: process.env.GITHUB_CLIENT_SECRET as string, // [!code highlight]
/** // [!code highlight]
* this is optional. // [!code highlight]
* only needed if you passed a custom basePath from `/api/auth` to `betterAuth` // [!code highlight]
* or if you're using a custom domain. // [!code highlight]
*/ // [!code highlight]
redirectURI: "https://example.com/api/auth/callback/apple", // [!code highlight]
}), // [!code highlight]
}, // [!code highlight]
], // [!code highlight]
})
```

View File

@@ -29,8 +29,8 @@ description: Google Provider
provider: "sqlite",
url: "./db.sqlite",
},
socialProvider: [ // [!code highlight]
google({ // [!code highlight]
socialProvider: { // [!code highlight]
google: { // [!code highlight]
clientId: process.env.GOOGLE_CLIENT_ID as string, // [!code highlight]
clientSecret: process.env.GOOGLE_CLIENT_SECRET as string, // [!code highlight]
/** // [!code highlight]
@@ -39,8 +39,8 @@ description: Google Provider
* or if you're using a custom domain. // [!code highlight]
*/ // [!code highlight]
redirectURI: "https://example.com/api/auth/callback/apple", // [!code highlight]
}), // [!code highlight]
], // [!code highlight]
}, // [!code highlight]
}, // [!code highlight]
})
```
</Step>

View File

@@ -29,18 +29,12 @@ description: Spotify Provider
provider: "sqlite",
url: "./db.sqlite",
},
socialProvider: [ // [!code highlight]
spotify({ // [!code highlight]
socialProvider: { // [!code highlight]
spotify: { // [!code highlight]
clientId: process.env.SPOTIFY_CLIENT_ID as string, // [!code highlight]
clientSecret: process.env.SPOTIFY_CLIENT_SECRET as string, // [!code highlight]
/** // [!code highlight]
* this is optional. // [!code highlight]
* only needed if you passed a custom basePath from `/api/auth` to `betterAuth` // [!code highlight]
* or if you're using a custom domain. // [!code highlight]
*/ // [!code highlight]
redirectURI: "https://example.com/api/auth/callback/apple", // [!code highlight]
}), // [!code highlight]
], // [!code highlight]
}, // [!code highlight]
}, // [!code highlight]
})
```
</Step>

View File

@@ -29,18 +29,12 @@ description: Twitch Provider
provider: "sqlite",
url: "./db.sqlite",
},
socialProvider: [ // [!code highlight]
twitch({ // [!code highlight]
socialProvider: { // [!code highlight]
twitch: { // [!code highlight]
clientId: process.env.TWITCH_CLIENT_ID as string, // [!code highlight]
clientSecret: process.env.TWITCH_CLIENT_SECRET as string, // [!code highlight]
/** // [!code highlight]
* this is optional. // [!code highlight]
* only needed if you passed a custom basePath from `/api/auth` to `betterAuth` // [!code highlight]
* or if you're using a custom domain. // [!code highlight]
*/ // [!code highlight]
redirectURI: "https://example.com/api/auth/callback/apple", // [!code highlight]
}), // [!code highlight]
], // [!code highlight]
}, // [!code highlight]
} // [!code highlight]
})
```
</Step>

View File

@@ -29,18 +29,12 @@ description: Twitter Provider
provider: "sqlite",
url: "./db.sqlite",
},
ocialProvider: [ // [!code highlight]
twitter({ // [!code highlight]
socialProvider: {// [!code highlight]
twitter: { // [!code highlight]
clientId: process.env.TWITTER_CLIENT_ID, // [!code highlight]
clientSecret: process.env.TWITTER_CLIENT_SECRET, // [!code highlight]
/** // [!code highlight]
* this is optional. // [!code highlight]
* only needed if you passed a custom basePath from `/api/auth` to `betterAuth` // [!code highlight]
* or if you're using a custom domain. // [!code highlight]
*/ // [!code highlight]
redirectURI: "https://example.com/api/auth/callback/apple", // [!code highlight]
}), // [!code highlight]
], // [!code highlight]
}, // [!code highlight]
}, // [!code highlight]
})
```
</Step>

View File

@@ -97,12 +97,12 @@ export const auth = betterAuth({
provider: "sqlite",
url: "./db.sqlite",
},
socialProvider: [ // [!code highlight]
github({ // [!code highlight]
socialProvider: { // [!code highlight]
github: { // [!code highlight]
clientId: GITHUB_CLIENT_ID, // [!code highlight]
clientSecret: GITHUB_CLIENT_SECRET, // [!code highlight]
}), // [!code highlight]
], // [!code highlight]
} // [!code highlight]
}, // [!code highlight]
})
```

View File

@@ -123,12 +123,12 @@ export const auth = betterAuth({
provider: "sqlite",
url: "./db.sqlite",
},
socialProvider: [ // [!code highlight]
github({ // [!code highlight]
clientId: process.env.GITHUB_CLIENT_ID as string, // [!code highlight]
clientSecret: process.env.GITHUB_CLIENT_SECRET as string, // [!code highlight]
}), // [!code highlight]
], // [!code highlight]
socialProvider: { // [!code highlight]
github: { // [!code highlight]
clientId: GITHUB_CLIENT_ID, // [!code highlight]
clientSecret: GITHUB_CLIENT_SECRET, // [!code highlight]
} // [!code highlight]
}, // [!code highlight]
emailAndPassword: { // [!code highlight]
enabled: true // [!code highlight]
}// [!code highlight]

View File

@@ -31,7 +31,7 @@ export const callbackOAuth = createAuthEndpoint(
);
}
const provider = c.context.options.socialProvider?.find(
const provider = c.context.socialProviders.find(
(p) => p.id === c.params.id,
);
if (!provider) {

View File

@@ -37,7 +37,7 @@ export const signInOAuth = createAuthEndpoint(
}),
},
async (c) => {
const provider = c.context.options.socialProvider?.find(
const provider = c.context.socialProviders.find(
(p) => p.id === c.body.provider,
);
if (!provider) {

View File

@@ -4,7 +4,7 @@ import { createKyselyAdapter } from "./adapters/kysely";
import { getAdapter } from "./adapters/utils";
import { hashPassword, verifyPassword } from "./crypto/password";
import { createInternalAdapter } from "./db";
import type { BetterAuthOptions } from "./types";
import type { BetterAuthOptions, OAuthProvider } from "./types";
import { getBaseURL } from "./utils/base-url";
import { DEFAULT_SECRET } from "./utils/constants";
import {
@@ -13,6 +13,7 @@ import {
getCookies,
} from "./utils/cookies";
import { createLogger } from "./utils/logger";
import { oAuthProviderList, oAuthProviders } from "./social-providers";
export const init = (options: BetterAuthOptions) => {
const adapter = getAdapter(options);
@@ -30,8 +31,19 @@ export const init = (options: BetterAuthOptions) => {
const cookies = getCookies(options);
const tables = getAuthTables(options);
const socialProviders = Object.keys(options.socialProviders || {})
.map((key) => {
const value = options.socialProviders?.[key as "github"]!;
if (value.enabled === false) {
return null;
}
return oAuthProviders[key as (typeof oAuthProviderList)[number]](value);
})
.filter((x) => x !== null);
return {
appName: options.appName || "Better Auth",
socialProviders,
options: {
...options,
baseURL: baseURL ? new URL(baseURL).origin : "",
@@ -63,6 +75,7 @@ export type AuthContext = {
options: BetterAuthOptions;
appName: string;
baseURL: string;
socialProviders: OAuthProvider[];
authCookies: BetterAuthCookies;
logger: ReturnType<typeof createLogger>;
db: Kysely<any>;

View File

@@ -1,3 +1,4 @@
import type { Prettify } from "../types";
import { apple } from "./apple";
import { discord } from "./discord";
import { facebook } from "./facebook";
@@ -23,6 +24,14 @@ export const oAuthProviderList = Object.keys(oAuthProviders) as [
...(keyof typeof oAuthProviders)[],
];
export type SocialProviders = typeof oAuthProviders extends {
[key in infer K]: infer V;
}
? V extends (options: infer V) => any
? Partial<Record<K, Prettify<V & { enabled?: boolean }>>>
: never
: never;
export * from "./github";
export * from "./google";
export * from "./apple";

View File

@@ -1,14 +1,12 @@
import fs from "fs/promises";
import { alphabet, generateRandomString } from "oslo/crypto";
import { afterAll, beforeAll } from "vitest";
import { afterAll } from "vitest";
import { betterAuth } from "../auth";
import { createAuthClient } from "../client/vanilla";
import { github, google } from "../social-providers";
import type { BetterAuthOptions } from "../types";
import { getMigrations } from "../cli/utils/get-migration";
import { parseSetCookieHeader } from "../utils/cookies";
import type { SuccessContext } from "@better-fetch/fetch";
import { createKyselyAdapter } from "../adapters/kysely";
import { getAdapter } from "../adapters/utils";
export async function getTestInstance<O extends Partial<BetterAuthOptions>>(
@@ -22,16 +20,16 @@ export async function getTestInstance<O extends Partial<BetterAuthOptions>>(
const randomStr = generateRandomString(4, alphabet("a-z"));
const dbName = `./.db/test-${randomStr}.db`;
const opts = {
socialProvider: [
github({
socialProviders: {
github: {
clientId: "test",
clientSecret: "test",
}),
google({
},
google: {
clientId: "test",
clientSecret: "test",
}),
],
},
},
secret: "better-auth.secret",
database: {
provider: "sqlite",

View File

@@ -2,7 +2,8 @@ import type { Dialect } from "kysely";
import type { User } from "../adapters/schema";
import type { FieldAttribute } from "../db/field";
import type { BetterAuthPlugin } from "./plugins";
import type { OAuthProvider, OAuthProviderList } from "./provider";
import type { OAuthProviderList } from "./provider";
import type { SocialProviders } from "../social-providers";
export interface BetterAuthOptions {
/**
@@ -57,9 +58,9 @@ export interface BetterAuthOptions {
/**
* list of social providers
*/
socialProvider?: OAuthProvider[];
socialProviders?: SocialProviders;
/**
* Plugins
* List of Better Auth plugins
*/
plugins?: BetterAuthPlugin[];
/**