diff --git a/.vscode/settings.json b/.vscode/settings.json index e1128d564c..7a9390c1d7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -14,7 +14,7 @@ "editor.defaultFormatter": "biomejs.biome" }, "[json]": { - "editor.defaultFormatter": "biomejs.biome" + "editor.defaultFormatter": "vscode.json-language-features" }, "typescript.tsdk": "node_modules/typescript/lib", "[astro]": { diff --git a/demo/nextjs/lib/auth.ts b/demo/nextjs/lib/auth.ts index e093629d9c..f7af52fe46 100644 --- a/demo/nextjs/lib/auth.ts +++ b/demo/nextjs/lib/auth.ts @@ -1,12 +1,8 @@ import { betterAuth } from "better-auth"; -import { - bearer, - organization, - passkey, - twoFactor, - admin, - multiSession, -} from "better-auth/plugins"; +import { bearer, admin, multiSession } from "better-auth/plugins"; +import { organization } from "better-auth/plugins/organization"; +import { passkey } from "better-auth/plugins/passkey"; +import { twoFactor } from "better-auth/plugins/two-factor"; import { reactInvitationEmail } from "./email/invitation"; import { LibsqlDialect } from "@libsql/kysely-libsql"; import { reactResetPasswordEmail } from "./email/rest-password"; diff --git a/docs/content/docs/plugins/2fa.mdx b/docs/content/docs/plugins/2fa.mdx index a2fa37d545..001b34005d 100644 --- a/docs/content/docs/plugins/2fa.mdx +++ b/docs/content/docs/plugins/2fa.mdx @@ -28,14 +28,13 @@ This plugin offers two main methods to do a second factor verification: ```ts title="auth.ts" import { betterAuth } from "better-auth" - import { twoFactor } from "better-auth/plugins" // [!code highlight] + import { twoFactor } from "better-auth/plugins/two-factor" // [!code highlight] export const auth = betterAuth({ // ... other config options + appName: "My App", // provide your app name. It'll be used as an issuer. // [!code highlight] plugins: [ - twoFactor({ // [!code highlight] - issuer: "my-app" // [!code highlight] - }) // [!code highlight] + twoFactor() // [!code highlight] ] }) ``` diff --git a/docs/content/docs/plugins/admin.mdx b/docs/content/docs/plugins/admin.mdx index f577fcb252..5ffda557ad 100644 --- a/docs/content/docs/plugins/admin.mdx +++ b/docs/content/docs/plugins/admin.mdx @@ -16,7 +16,7 @@ The Admin plugin provides a set of administrative functions for user management ```ts title="auth.ts" import { betterAuth } from "better-auth" - import { admin } from "better-auth/plugins" // [!code highlight] + import { admin } from "better-auth/plugins/admin" // [!code highlight] export const auth = betterAuth({ // ... other config options diff --git a/docs/content/docs/plugins/anonymous.mdx b/docs/content/docs/plugins/anonymous.mdx index 045d75c4ce..793c8f409b 100644 --- a/docs/content/docs/plugins/anonymous.mdx +++ b/docs/content/docs/plugins/anonymous.mdx @@ -15,7 +15,7 @@ The Anonymous plugin allows users to have an authenticated experience without re ```ts title="auth.ts" import { betterAuth } from "better-auth" - import { anonymous } from "better-auth/plugins" // [!code highlight] + import { anonymous } from "better-auth/plugins/anonymous" // [!code highlight] export const auth = betterAuth({ // ... other config options diff --git a/docs/content/docs/plugins/bearer.mdx b/docs/content/docs/plugins/bearer.mdx index eedf90b571..344054f833 100644 --- a/docs/content/docs/plugins/bearer.mdx +++ b/docs/content/docs/plugins/bearer.mdx @@ -11,7 +11,7 @@ Add the Bearer plugin to your authentication setup: ```ts title="auth.ts" import { betterAuth } from "better-auth"; -import { bearer } from "better-auth/plugins"; +import { bearer } from "better-auth/plugins/bearer"; export const auth = betterAuth({ plugins: [bearer()] diff --git a/docs/content/docs/plugins/email-otp.mdx b/docs/content/docs/plugins/email-otp.mdx index d97230dc59..b1707427a1 100644 --- a/docs/content/docs/plugins/email-otp.mdx +++ b/docs/content/docs/plugins/email-otp.mdx @@ -19,7 +19,7 @@ You can't register a user using the email OTP plugin. You can only sign in or ve ```ts title="auth.ts" import { betterAuth } from "better-auth" - import { emailOTP } from "better-auth/plugins" // [!code highlight] + import { emailOTP } from "better-auth/plugins/email-otp" // [!code highlight] export const auth = betterAuth({ // ... other config options diff --git a/docs/content/docs/plugins/generic-oauth.mdx b/docs/content/docs/plugins/generic-oauth.mdx index 299f98300f..53863468e7 100644 --- a/docs/content/docs/plugins/generic-oauth.mdx +++ b/docs/content/docs/plugins/generic-oauth.mdx @@ -15,7 +15,7 @@ The Generic OAuth plugin provides a flexible way to integrate authentication wit ```ts title="auth.ts" import { betterAuth } from "better-auth" - import { genericOAuth } from "better-auth/plugins" // [!code highlight] + import { genericOAuth } from "better-auth/plugins/generic-oauth" // [!code highlight] export const auth = betterAuth({ // ... other config options diff --git a/docs/content/docs/plugins/jwt.mdx b/docs/content/docs/plugins/jwt.mdx index 251006aeb4..7ceb93f075 100644 --- a/docs/content/docs/plugins/jwt.mdx +++ b/docs/content/docs/plugins/jwt.mdx @@ -17,7 +17,7 @@ The JWT plugin provides endpoints to retrieve a JWT token and a JWKS endpoint to ### Add the plugin to your **auth** config ```ts title="auth.ts" import { betterAuth } from "better-auth" -import { jwt, bearer } from "better-auth/plugins" +import { jwt, bearer } from "better-auth/plugins/jwt" export const auth = betterAuth({ plugins: [ // [!code highlight] diff --git a/docs/content/docs/plugins/magic-link.mdx b/docs/content/docs/plugins/magic-link.mdx index 701ca8aec1..48a5f0438d 100644 --- a/docs/content/docs/plugins/magic-link.mdx +++ b/docs/content/docs/plugins/magic-link.mdx @@ -14,7 +14,7 @@ Magic link or email link is a way to authenticate users without a password. When ```ts title="server.ts" import { betterAuth } from "better-auth"; - import { magicLink } from "better-auth/plugins"; + import { magicLink } from "better-auth/plugins/magic-link"; export const auth = betterAuth({ plugins: [ diff --git a/docs/content/docs/plugins/multi-session.mdx b/docs/content/docs/plugins/multi-session.mdx index 03550f3aa9..a3d7f66673 100644 --- a/docs/content/docs/plugins/multi-session.mdx +++ b/docs/content/docs/plugins/multi-session.mdx @@ -12,7 +12,7 @@ The multi-session plugin allows users to maintain multiple active sessions acros ### Add the plugin to your **auth** config ```ts title="auth.ts" import { betterAuth } from "better-auth" -import { multiSession } from "better-auth/plugins" +import { multiSession } from "better-auth/plugins/multi-session" export const auth = betterAuth({ plugins: [ // [!code highlight] diff --git a/docs/content/docs/plugins/organization.mdx b/docs/content/docs/plugins/organization.mdx index 412899427e..406b749c81 100644 --- a/docs/content/docs/plugins/organization.mdx +++ b/docs/content/docs/plugins/organization.mdx @@ -12,7 +12,7 @@ Organizations simplifies user access and permissions management. Assign roles an ### Add the plugin to your **auth** config ```ts title="auth.ts" import { betterAuth } from "better-auth" -import { organization } from "better-auth/plugins" +import { organization } from "better-auth/plugins/organization" export const auth = betterAuth({ plugins: [ // [!code highlight] diff --git a/docs/content/docs/plugins/passkey.mdx b/docs/content/docs/plugins/passkey.mdx index dbb2d70ba3..d7f98aa9bd 100644 --- a/docs/content/docs/plugins/passkey.mdx +++ b/docs/content/docs/plugins/passkey.mdx @@ -24,7 +24,7 @@ The passkey plugin implementation is powered by [simple-web-authn](https://simpl ```ts title="auth.ts" import { betterAuth } from "better-auth" - import { passkey } from "better-auth/plugins" + import { passkey } from "better-auth/plugins/passkey" export const auth = betterAuth({ diff --git a/docs/content/docs/plugins/phone-number.mdx b/docs/content/docs/plugins/phone-number.mdx index ea0a308d46..5e950327dd 100644 --- a/docs/content/docs/plugins/phone-number.mdx +++ b/docs/content/docs/plugins/phone-number.mdx @@ -13,7 +13,7 @@ The phone number plugin extends the authentication system by allowing users to s ```ts title="auth.ts" import { betterAuth } from "better-auth" - import { phoneNumber } from "better-auth/plugins" + import { phoneNumber } from "better-auth/plugins/phone-number" const auth = betterAuth({ plugins: [ diff --git a/docs/content/docs/plugins/username.mdx b/docs/content/docs/plugins/username.mdx index f53f713e9f..07353c49fa 100644 --- a/docs/content/docs/plugins/username.mdx +++ b/docs/content/docs/plugins/username.mdx @@ -13,7 +13,7 @@ The username plugin wraps the email and password authenticator and adds username ```ts title="auth.ts" import { betterAuth } from "better-auth" - import { username } from "better-auth/plugins" + import { username } from "better-auth/plugins/username" const auth = betterAuth({ plugins: [ // [!code highlight] diff --git a/packages/better-auth/package.json b/packages/better-auth/package.json index 1ce83025cd..64131a6291 100644 --- a/packages/better-auth/package.json +++ b/packages/better-auth/package.json @@ -93,9 +93,69 @@ "require": "./dist/plugins.cjs" }, "./plugins/access": { - "types": "./dist/access.d.ts", - "import": "./dist/access.js", - "require": "./dist/access.cjs" + "types": "./dist/plugins/access.d.ts", + "import": "./dist/plugins/access.js", + "require": "./dist/plugins/access.cjs" + }, + "./plugins/admin": { + "types": "./dist/plugins/admin.d.ts", + "import": "./dist/plugins/admin.js", + "require": "./dist/plugins/admin.cjs" + }, + "./plugins/anonymous": { + "types": "./dist/plugins/anonymous.d.ts", + "import": "./dist/plugins/anonymous.js", + "require": "./dist/plugins/anonymous.cjs" + }, + "./plugins/bearer": { + "types": "./dist/plugins/bearer.d.ts", + "import": "./dist/plugins/bearer.js", + "require": "./dist/plugins/bearer.cjs" + }, + "./plugins/email-otp": { + "types": "./dist/plugins/email-otp.d.ts", + "import": "./dist/plugins/email-otp.js", + "require": "./dist/plugins/email-otp.cjs" + }, + "./plugins/generic-oauth": { + "types": "./dist/plugins/generic-oauth.d.ts", + "import": "./dist/plugins/generic-oauth.js", + "require": "./dist/plugins/generic-oauth.cjs" + }, + "./plugins/jwt": { + "types": "./dist/plugins/jwt.d.ts", + "import": "./dist/plugins/jwt.js", + "require": "./dist/plugins/jwt.cjs" + }, + "./plugins/magic-link": { + "types": "./dist/plugins/magic-link.d.ts", + "import": "./dist/plugins/magic-link.js", + "require": "./dist/plugins/magic-link.cjs" + }, + "./plugins/organization": { + "types": "./dist/plugins/organization.d.ts", + "import": "./dist/plugins/organization.js", + "require": "./dist/plugins/organization.cjs" + }, + "./plugins/passkey": { + "types": "./dist/plugins/passkey.d.ts", + "import": "./dist/plugins/passkey.js", + "require": "./dist/plugins/passkey.cjs" + }, + "./plugins/phone-number": { + "types": "./dist/plugins/phone-number.d.ts", + "import": "./dist/plugins/phone-number.js", + "require": "./dist/plugins/phone-number.cjs" + }, + "./plugins/two-factor": { + "types": "./dist/plugins/two-factor.d.ts", + "import": "./dist/plugins/two-factor.js", + "require": "./dist/plugins/two-factor.cjs" + }, + "./plugins/username": { + "types": "./dist/plugins/username.d.ts", + "import": "./dist/plugins/username.js", + "require": "./dist/plugins/username.cjs" }, "./svelte-kit": { "types": "./dist/svelte-kit.d.ts", @@ -274,4 +334,4 @@ "files": [ "dist" ] -} +} \ No newline at end of file diff --git a/packages/better-auth/src/plugins/organization/access/index.ts b/packages/better-auth/src/plugins/access/index.ts similarity index 100% rename from packages/better-auth/src/plugins/organization/access/index.ts rename to packages/better-auth/src/plugins/access/index.ts diff --git a/packages/better-auth/src/plugins/organization/access/src/access.ts b/packages/better-auth/src/plugins/access/src/access.ts similarity index 100% rename from packages/better-auth/src/plugins/organization/access/src/access.ts rename to packages/better-auth/src/plugins/access/src/access.ts diff --git a/packages/better-auth/src/plugins/organization/access/src/types.ts b/packages/better-auth/src/plugins/access/src/types.ts similarity index 89% rename from packages/better-auth/src/plugins/organization/access/src/types.ts rename to packages/better-auth/src/plugins/access/src/types.ts index 16e854534e..e2dd1a467b 100644 --- a/packages/better-auth/src/plugins/organization/access/src/types.ts +++ b/packages/better-auth/src/plugins/access/src/types.ts @@ -1,4 +1,4 @@ -import type { LiteralString } from "../../../../types/helper"; +import type { LiteralString } from "../../../types/helper"; // Transforms an array into any combination of 0 or more of its members export type SubArray = diff --git a/packages/better-auth/src/plugins/organization/access/statement.ts b/packages/better-auth/src/plugins/access/statement.ts similarity index 100% rename from packages/better-auth/src/plugins/organization/access/statement.ts rename to packages/better-auth/src/plugins/access/statement.ts diff --git a/packages/better-auth/src/plugins/organization/access/utils.ts b/packages/better-auth/src/plugins/access/utils.ts similarity index 100% rename from packages/better-auth/src/plugins/organization/access/utils.ts rename to packages/better-auth/src/plugins/access/utils.ts diff --git a/packages/better-auth/src/plugins/organization/call.ts b/packages/better-auth/src/plugins/organization/call.ts index 19b3cd03e3..2baf400c6f 100644 --- a/packages/better-auth/src/plugins/organization/call.ts +++ b/packages/better-auth/src/plugins/organization/call.ts @@ -1,8 +1,8 @@ -import { APIError, type Context, createEndpointCreator } from "better-call"; +import { type Context } from "better-call"; import type { Session, User } from "../../db/schema"; -import { createAuthMiddleware, optionsMiddleware } from "../../api/call"; +import { createAuthMiddleware } from "../../api/call"; import { sessionMiddleware } from "../../api"; -import type { Role, defaultRoles } from "./access"; +import type { Role, defaultRoles } from "../access"; import type { OrganizationOptions } from "./organization"; export const orgMiddleware = createAuthMiddleware(async (ctx) => { diff --git a/packages/better-auth/src/plugins/organization/client.ts b/packages/better-auth/src/plugins/organization/client.ts index 5c3b9e1ec5..053598e254 100644 --- a/packages/better-auth/src/plugins/organization/client.ts +++ b/packages/better-auth/src/plugins/organization/client.ts @@ -5,7 +5,7 @@ import type { Organization, } from "../../plugins/organization/schema"; import type { Prettify } from "../../types/helper"; -import { defaultStatements, type AccessControl, type Role } from "./access"; +import { defaultStatements, type AccessControl, type Role } from "../access"; import type { BetterAuthClientPlugin } from "../../client/types"; import type { organization } from "./organization"; import type { BetterFetchOption } from "@better-fetch/fetch"; diff --git a/packages/better-auth/src/plugins/organization/index.ts b/packages/better-auth/src/plugins/organization/index.ts index 8a74bd005f..c0b4b06bd0 100644 --- a/packages/better-auth/src/plugins/organization/index.ts +++ b/packages/better-auth/src/plugins/organization/index.ts @@ -1,2 +1 @@ export * from "./organization"; -export * as ac from "./access"; diff --git a/packages/better-auth/src/plugins/organization/organization.ts b/packages/better-auth/src/plugins/organization/organization.ts index 44fdc9d737..d7e4b74f9e 100644 --- a/packages/better-auth/src/plugins/organization/organization.ts +++ b/packages/better-auth/src/plugins/organization/organization.ts @@ -17,7 +17,7 @@ import { type Role, defaultRoles, type defaultStatements, -} from "./access"; +} from "../access"; import { getOrgAdapter } from "./adapter"; import { orgSessionMiddleware } from "./call"; import { diff --git a/packages/better-auth/tsup.config.ts b/packages/better-auth/tsup.config.ts index d50705acfd..f04bc280a1 100644 --- a/packages/better-auth/tsup.config.ts +++ b/packages/better-auth/tsup.config.ts @@ -1,8 +1,26 @@ +import * as fs from "fs/promises"; import { defineConfig } from "tsup"; -export default defineConfig((env) => { +export default defineConfig(async (env) => { + const pluginEntries = await fs + .readFile("./package.json", "utf-8") + .then((content) => { + const { exports } = JSON.parse(content); + let entries = {}; + Object.keys(exports).forEach((key) => { + if (key.startsWith("./plugins")) { + entries[key.replace("./", "")] = `./src${key.replace( + ".", + "", + )}/index.ts`; + } + }); + return entries; + }); + console.log(pluginEntries); return { entry: { + ...pluginEntries, index: "./src/index.ts", social: "./src/social-providers/index.ts", types: "./src/types/index.ts", @@ -24,7 +42,6 @@ export default defineConfig((env) => { api: "./src/api/index.ts", "client/plugins": "./src/client/plugins/index.ts", "svelte-kit": "./src/integrations/svelte-kit.ts", - access: "./src/plugins/organization/access/index.ts", "solid-start": "./src/integrations/solid-start.ts", "next-js": "./src/integrations/next-js.ts", node: "./src/integrations/node.ts",