@masheev/better-auth 0.0.0-stage → 1.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +20 -0
- package/README.md +31 -2
- package/TYPE-PATCH-NOTICE.md +9 -0
- package/TYPE-PATCH-PROVENANCE.json +267 -0
- package/dist/_virtual/_rolldown/runtime.mjs +27 -0
- package/dist/adapters/drizzle-adapter/index.d.mts +1 -0
- package/dist/adapters/drizzle-adapter/index.mjs +2 -0
- package/dist/adapters/index.d.mts +26 -0
- package/dist/adapters/index.mjs +9 -0
- package/dist/adapters/kysely-adapter/index.d.mts +1 -0
- package/dist/adapters/kysely-adapter/index.mjs +2 -0
- package/dist/adapters/memory-adapter/index.d.mts +1 -0
- package/dist/adapters/memory-adapter/index.mjs +2 -0
- package/dist/adapters/mongodb-adapter/index.d.mts +1 -0
- package/dist/adapters/mongodb-adapter/index.mjs +2 -0
- package/dist/adapters/prisma-adapter/index.d.mts +1 -0
- package/dist/adapters/prisma-adapter/index.mjs +2 -0
- package/dist/api/dispatch.d.mts +34 -0
- package/dist/api/dispatch.mjs +275 -0
- package/dist/api/index.d.mts +4053 -0
- package/dist/api/index.mjs +220 -0
- package/dist/api/middlewares/authorization.d.mts +69 -0
- package/dist/api/middlewares/authorization.mjs +78 -0
- package/dist/api/middlewares/index.d.mts +2 -0
- package/dist/api/middlewares/origin-check.d.mts +17 -0
- package/dist/api/middlewares/origin-check.mjs +155 -0
- package/dist/api/rate-limiter/index.mjs +318 -0
- package/dist/api/routes/account.d.mts +413 -0
- package/dist/api/routes/account.mjs +619 -0
- package/dist/api/routes/callback.d.mts +32 -0
- package/dist/api/routes/callback.mjs +261 -0
- package/dist/api/routes/email-verification.d.mts +160 -0
- package/dist/api/routes/email-verification.mjs +324 -0
- package/dist/api/routes/error.d.mts +27 -0
- package/dist/api/routes/error.mjs +387 -0
- package/dist/api/routes/index.d.mts +12 -0
- package/dist/api/routes/ok.d.mts +35 -0
- package/dist/api/routes/ok.mjs +27 -0
- package/dist/api/routes/password.d.mts +182 -0
- package/dist/api/routes/password.mjs +206 -0
- package/dist/api/routes/session.d.mts +450 -0
- package/dist/api/routes/session.mjs +481 -0
- package/dist/api/routes/sign-in.d.mts +186 -0
- package/dist/api/routes/sign-in.mjs +368 -0
- package/dist/api/routes/sign-out.d.mts +51 -0
- package/dist/api/routes/sign-out.mjs +96 -0
- package/dist/api/routes/sign-up.d.mts +159 -0
- package/dist/api/routes/sign-up.mjs +275 -0
- package/dist/api/routes/update-session.d.mts +74 -0
- package/dist/api/routes/update-session.mjs +57 -0
- package/dist/api/routes/update-user.d.mts +428 -0
- package/dist/api/routes/update-user.mjs +522 -0
- package/dist/api/state/oauth.d.mts +53 -0
- package/dist/api/state/oauth.mjs +38 -0
- package/dist/api/state/should-session-refresh.d.mts +12 -0
- package/dist/api/state/should-session-refresh.mjs +13 -0
- package/dist/api/to-auth-endpoints.mjs +60 -0
- package/dist/auth/base.mjs +66 -0
- package/dist/auth/full.d.mts +28 -0
- package/dist/auth/full.mjs +29 -0
- package/dist/auth/minimal.d.mts +10 -0
- package/dist/auth/minimal.mjs +11 -0
- package/dist/auth/trusted-origins.mjs +106 -0
- package/dist/client/broadcast-channel.d.mts +19 -0
- package/dist/client/broadcast-channel.mjs +44 -0
- package/dist/client/config.d.mts +90 -0
- package/dist/client/config.mjs +113 -0
- package/dist/client/equality.d.mts +19 -0
- package/dist/client/equality.mjs +42 -0
- package/dist/client/fetch-plugins.mjs +17 -0
- package/dist/client/focus-manager.d.mts +10 -0
- package/dist/client/focus-manager.mjs +30 -0
- package/dist/client/index.d.mts +35 -0
- package/dist/client/index.mjs +22 -0
- package/dist/client/lynx/index.d.mts +43 -0
- package/dist/client/lynx/index.mjs +22 -0
- package/dist/client/lynx/lynx-store.d.mts +46 -0
- package/dist/client/lynx/lynx-store.mjs +44 -0
- package/dist/client/online-manager.d.mts +11 -0
- package/dist/client/online-manager.mjs +33 -0
- package/dist/client/parser.d.mts +10 -0
- package/dist/client/parser.mjs +70 -0
- package/dist/client/path-to-object.d.mts +113 -0
- package/dist/client/plugins/index.d.mts +44 -0
- package/dist/client/plugins/index.mjs +30 -0
- package/dist/client/plugins/infer-plugin.d.mts +16 -0
- package/dist/client/plugins/infer-plugin.mjs +11 -0
- package/dist/client/proxy.mjs +78 -0
- package/dist/client/query.d.mts +23 -0
- package/dist/client/query.mjs +124 -0
- package/dist/client/react/index.d.mts +44 -0
- package/dist/client/react/index.mjs +22 -0
- package/dist/client/react/react-store.d.mts +46 -0
- package/dist/client/react/react-store.mjs +44 -0
- package/dist/client/session-atom.d.mts +11 -0
- package/dist/client/session-atom.mjs +178 -0
- package/dist/client/session-refresh.d.mts +20 -0
- package/dist/client/session-refresh.mjs +131 -0
- package/dist/client/solid/index.d.mts +44 -0
- package/dist/client/solid/index.mjs +22 -0
- package/dist/client/solid/solid-store.mjs +21 -0
- package/dist/client/svelte/index.d.mts +44 -0
- package/dist/client/svelte/index.mjs +18 -0
- package/dist/client/types.d.mts +51 -0
- package/dist/client/vanilla.d.mts +42 -0
- package/dist/client/vanilla.mjs +18 -0
- package/dist/client/vue/index.d.mts +67 -0
- package/dist/client/vue/index.mjs +54 -0
- package/dist/client/vue/vue-store.mjs +23 -0
- package/dist/context/create-context.mjs +235 -0
- package/dist/context/helpers.mjs +158 -0
- package/dist/context/init-minimal.mjs +17 -0
- package/dist/context/init.mjs +19 -0
- package/dist/context/secret-utils.mjs +53 -0
- package/dist/context/store-capabilities.mjs +12 -0
- package/dist/cookies/cache.mjs +33 -0
- package/dist/cookies/cookie-utils.d.mts +72 -0
- package/dist/cookies/cookie-utils.mjs +203 -0
- package/dist/cookies/index.d.mts +124 -0
- package/dist/cookies/index.mjs +350 -0
- package/dist/cookies/jwt.mjs +44 -0
- package/dist/cookies/session-store.d.mts +32 -0
- package/dist/cookies/session-store.mjs +183 -0
- package/dist/crypto/buffer.d.mts +7 -0
- package/dist/crypto/buffer.mjs +16 -0
- package/dist/crypto/index.d.mts +32 -0
- package/dist/crypto/index.mjs +69 -0
- package/dist/crypto/jwt.d.mts +9 -0
- package/dist/crypto/jwt.mjs +141 -0
- package/dist/crypto/password.d.mts +13 -0
- package/dist/crypto/password.mjs +14 -0
- package/dist/crypto/random.d.mts +4 -0
- package/dist/crypto/random.mjs +5 -0
- package/dist/db/adapter-base.d.mts +7 -0
- package/dist/db/adapter-base.mjs +25 -0
- package/dist/db/adapter-kysely.d.mts +7 -0
- package/dist/db/adapter-kysely.mjs +17 -0
- package/dist/db/field-converter.d.mts +7 -0
- package/dist/db/field-converter.mjs +19 -0
- package/dist/db/field.d.mts +41 -0
- package/dist/db/get-migration.d.mts +56 -0
- package/dist/db/get-migration.mjs +685 -0
- package/dist/db/get-schema.d.mts +13 -0
- package/dist/db/get-schema.mjs +39 -0
- package/dist/db/index.d.mts +10 -0
- package/dist/db/index.mjs +35 -0
- package/dist/db/internal-adapter.d.mts +14 -0
- package/dist/db/internal-adapter.mjs +951 -0
- package/dist/db/revoke-unproven-account-access.d.mts +21 -0
- package/dist/db/revoke-unproven-account-access.mjs +58 -0
- package/dist/db/schema.d.mts +62 -0
- package/dist/db/schema.mjs +161 -0
- package/dist/db/to-zod.d.mts +35 -0
- package/dist/db/to-zod.mjs +23 -0
- package/dist/db/verification-token-storage.mjs +25 -0
- package/dist/db/with-hooks.d.mts +37 -0
- package/dist/db/with-hooks.mjs +255 -0
- package/dist/index.d.mts +30 -0
- package/dist/index.mjs +17 -0
- package/dist/integrations/cookie-plugin-guard.mjs +18 -0
- package/dist/integrations/next-js.d.mts +29 -0
- package/dist/integrations/next-js.mjs +105 -0
- package/dist/integrations/node.d.mts +11 -0
- package/dist/integrations/node.mjs +13 -0
- package/dist/integrations/solid-start.d.mts +22 -0
- package/dist/integrations/solid-start.mjs +15 -0
- package/dist/integrations/svelte-kit.d.mts +38 -0
- package/dist/integrations/svelte-kit.mjs +57 -0
- package/dist/integrations/tanstack-start-solid.d.mts +33 -0
- package/dist/integrations/tanstack-start-solid.mjs +57 -0
- package/dist/integrations/tanstack-start.d.mts +33 -0
- package/dist/integrations/tanstack-start.mjs +57 -0
- package/dist/oauth2/account-key.mjs +43 -0
- package/dist/oauth2/errors.mjs +49 -0
- package/dist/oauth2/index.d.mts +5 -0
- package/dist/oauth2/index.mjs +5 -0
- package/dist/oauth2/link-account.d.mts +96 -0
- package/dist/oauth2/link-account.mjs +329 -0
- package/dist/oauth2/state.d.mts +54 -0
- package/dist/oauth2/state.mjs +67 -0
- package/dist/oauth2/utils.d.mts +11 -0
- package/dist/oauth2/utils.mjs +33 -0
- package/dist/package.mjs +4 -0
- package/dist/plugins/access/access.d.mts +17 -0
- package/dist/plugins/access/access.mjs +78 -0
- package/dist/plugins/access/index.d.mts +3 -0
- package/dist/plugins/access/index.mjs +2 -0
- package/dist/plugins/access/types.d.mts +24 -0
- package/dist/plugins/additional-fields/client.d.mts +100 -0
- package/dist/plugins/additional-fields/client.mjs +11 -0
- package/dist/plugins/admin/access/index.d.mts +2 -0
- package/dist/plugins/admin/access/index.mjs +2 -0
- package/dist/plugins/admin/access/statement.d.mts +51 -0
- package/dist/plugins/admin/access/statement.mjs +52 -0
- package/dist/plugins/admin/admin.d.mts +911 -0
- package/dist/plugins/admin/admin.mjs +89 -0
- package/dist/plugins/admin/client.d.mts +81 -0
- package/dist/plugins/admin/client.mjs +39 -0
- package/dist/plugins/admin/error-codes.d.mts +30 -0
- package/dist/plugins/admin/error-codes.mjs +29 -0
- package/dist/plugins/admin/has-permission.mjs +12 -0
- package/dist/plugins/admin/index.d.mts +3 -0
- package/dist/plugins/admin/index.mjs +2 -0
- package/dist/plugins/admin/routes.mjs +919 -0
- package/dist/plugins/admin/schema.d.mts +40 -0
- package/dist/plugins/admin/schema.mjs +33 -0
- package/dist/plugins/admin/types.d.mts +88 -0
- package/dist/plugins/anonymous/client.d.mts +32 -0
- package/dist/plugins/anonymous/client.mjs +21 -0
- package/dist/plugins/anonymous/error-codes.d.mts +15 -0
- package/dist/plugins/anonymous/error-codes.mjs +14 -0
- package/dist/plugins/anonymous/index.d.mts +175 -0
- package/dist/plugins/anonymous/index.mjs +219 -0
- package/dist/plugins/anonymous/schema.d.mts +15 -0
- package/dist/plugins/anonymous/schema.mjs +9 -0
- package/dist/plugins/anonymous/types.d.mts +65 -0
- package/dist/plugins/bearer/index.d.mts +45 -0
- package/dist/plugins/bearer/index.mjs +74 -0
- package/dist/plugins/captcha/constants.d.mts +9 -0
- package/dist/plugins/captcha/constants.mjs +27 -0
- package/dist/plugins/captcha/error-codes.mjs +13 -0
- package/dist/plugins/captcha/index.d.mts +27 -0
- package/dist/plugins/captcha/index.mjs +79 -0
- package/dist/plugins/captcha/types.d.mts +52 -0
- package/dist/plugins/captcha/utils.mjs +9 -0
- package/dist/plugins/captcha/verify-handlers/captchafox.mjs +27 -0
- package/dist/plugins/captcha/verify-handlers/cloudflare-turnstile.mjs +47 -0
- package/dist/plugins/captcha/verify-handlers/google-recaptcha.mjs +32 -0
- package/dist/plugins/captcha/verify-handlers/h-captcha.mjs +27 -0
- package/dist/plugins/custom-session/client.d.mts +17 -0
- package/dist/plugins/custom-session/client.mjs +7 -0
- package/dist/plugins/custom-session/index.d.mts +73 -0
- package/dist/plugins/custom-session/index.mjs +65 -0
- package/dist/plugins/device-authorization/client.d.mts +17 -0
- package/dist/plugins/device-authorization/client.mjs +18 -0
- package/dist/plugins/device-authorization/error-codes.mjs +19 -0
- package/dist/plugins/device-authorization/index.d.mts +558 -0
- package/dist/plugins/device-authorization/index.mjs +87 -0
- package/dist/plugins/device-authorization/routes.d.mts +32 -0
- package/dist/plugins/device-authorization/routes.mjs +725 -0
- package/dist/plugins/device-authorization/schema.d.mts +18 -0
- package/dist/plugins/device-authorization/schema.mjs +63 -0
- package/dist/plugins/email-otp/client.d.mts +21 -0
- package/dist/plugins/email-otp/client.mjs +17 -0
- package/dist/plugins/email-otp/error-codes.d.mts +10 -0
- package/dist/plugins/email-otp/error-codes.mjs +9 -0
- package/dist/plugins/email-otp/index.d.mts +551 -0
- package/dist/plugins/email-otp/index.mjs +145 -0
- package/dist/plugins/email-otp/otp-token.mjs +55 -0
- package/dist/plugins/email-otp/routes.mjs +784 -0
- package/dist/plugins/email-otp/types.d.mts +109 -0
- package/dist/plugins/email-otp/utils.mjs +17 -0
- package/dist/plugins/generic-oauth/error-codes.mjs +8 -0
- package/dist/plugins/generic-oauth/index.d.mts +52 -0
- package/dist/plugins/generic-oauth/index.mjs +279 -0
- package/dist/plugins/generic-oauth/providers/auth0.d.mts +36 -0
- package/dist/plugins/generic-oauth/providers/auth0.mjs +49 -0
- package/dist/plugins/generic-oauth/providers/gumroad.d.mts +31 -0
- package/dist/plugins/generic-oauth/providers/gumroad.mjs +62 -0
- package/dist/plugins/generic-oauth/providers/hubspot.d.mts +36 -0
- package/dist/plugins/generic-oauth/providers/hubspot.mjs +62 -0
- package/dist/plugins/generic-oauth/providers/index.d.mts +10 -0
- package/dist/plugins/generic-oauth/providers/keycloak.d.mts +36 -0
- package/dist/plugins/generic-oauth/providers/keycloak.mjs +47 -0
- package/dist/plugins/generic-oauth/providers/line.d.mts +54 -0
- package/dist/plugins/generic-oauth/providers/line.mjs +93 -0
- package/dist/plugins/generic-oauth/providers/microsoft-entra-id.d.mts +39 -0
- package/dist/plugins/generic-oauth/providers/microsoft-entra-id.mjs +104 -0
- package/dist/plugins/generic-oauth/providers/okta.d.mts +36 -0
- package/dist/plugins/generic-oauth/providers/okta.mjs +47 -0
- package/dist/plugins/generic-oauth/providers/patreon.d.mts +29 -0
- package/dist/plugins/generic-oauth/providers/patreon.mjs +61 -0
- package/dist/plugins/generic-oauth/providers/slack.d.mts +29 -0
- package/dist/plugins/generic-oauth/providers/slack.mjs +63 -0
- package/dist/plugins/generic-oauth/providers/yandex.d.mts +29 -0
- package/dist/plugins/generic-oauth/providers/yandex.mjs +67 -0
- package/dist/plugins/generic-oauth/types.d.mts +268 -0
- package/dist/plugins/haveibeenpwned/index.d.mts +63 -0
- package/dist/plugins/haveibeenpwned/index.mjs +81 -0
- package/dist/plugins/index.d.mts +69 -0
- package/dist/plugins/index.mjs +49 -0
- package/dist/plugins/jwt/adapter.mjs +68 -0
- package/dist/plugins/jwt/client.d.mts +41 -0
- package/dist/plugins/jwt/client.mjs +19 -0
- package/dist/plugins/jwt/cookie-cache.mjs +77 -0
- package/dist/plugins/jwt/index.d.mts +246 -0
- package/dist/plugins/jwt/index.mjs +214 -0
- package/dist/plugins/jwt/schema.d.mts +33 -0
- package/dist/plugins/jwt/schema.mjs +29 -0
- package/dist/plugins/jwt/sign.d.mts +128 -0
- package/dist/plugins/jwt/sign.mjs +130 -0
- package/dist/plugins/jwt/types.d.mts +256 -0
- package/dist/plugins/jwt/utils.d.mts +41 -0
- package/dist/plugins/jwt/utils.mjs +64 -0
- package/dist/plugins/jwt/verify.d.mts +11 -0
- package/dist/plugins/jwt/verify.mjs +45 -0
- package/dist/plugins/last-login-method/client.d.mts +48 -0
- package/dist/plugins/last-login-method/client.mjs +48 -0
- package/dist/plugins/last-login-method/index.d.mts +127 -0
- package/dist/plugins/last-login-method/index.mjs +98 -0
- package/dist/plugins/magic-link/client.d.mts +10 -0
- package/dist/plugins/magic-link/client.mjs +11 -0
- package/dist/plugins/magic-link/index.d.mts +213 -0
- package/dist/plugins/magic-link/index.mjs +208 -0
- package/dist/plugins/magic-link/utils.mjs +9 -0
- package/dist/plugins/multi-session/client.d.mts +19 -0
- package/dist/plugins/multi-session/client.mjs +19 -0
- package/dist/plugins/multi-session/error-codes.d.mts +8 -0
- package/dist/plugins/multi-session/error-codes.mjs +5 -0
- package/dist/plugins/multi-session/index.d.mts +212 -0
- package/dist/plugins/multi-session/index.mjs +217 -0
- package/dist/plugins/oauth-popup/client.d.mts +82 -0
- package/dist/plugins/oauth-popup/client.mjs +203 -0
- package/dist/plugins/oauth-popup/constants.d.mts +11 -0
- package/dist/plugins/oauth-popup/constants.mjs +11 -0
- package/dist/plugins/oauth-popup/error-codes.d.mts +11 -0
- package/dist/plugins/oauth-popup/error-codes.mjs +10 -0
- package/dist/plugins/oauth-popup/index.d.mts +67 -0
- package/dist/plugins/oauth-popup/index.mjs +232 -0
- package/dist/plugins/oauth-popup/types.d.mts +30 -0
- package/dist/plugins/oauth-proxy/index.d.mts +130 -0
- package/dist/plugins/oauth-proxy/index.mjs +407 -0
- package/dist/plugins/oauth-proxy/utils.mjs +55 -0
- package/dist/plugins/one-tap/client.d.mts +174 -0
- package/dist/plugins/one-tap/client.mjs +208 -0
- package/dist/plugins/one-tap/index.d.mts +82 -0
- package/dist/plugins/one-tap/index.mjs +100 -0
- package/dist/plugins/one-time-token/client.d.mts +10 -0
- package/dist/plugins/one-time-token/client.mjs +11 -0
- package/dist/plugins/one-time-token/index.d.mts +132 -0
- package/dist/plugins/one-time-token/index.mjs +107 -0
- package/dist/plugins/one-time-token/utils.mjs +9 -0
- package/dist/plugins/open-api/generator.d.mts +126 -0
- package/dist/plugins/open-api/generator.mjs +557 -0
- package/dist/plugins/open-api/index.d.mts +97 -0
- package/dist/plugins/open-api/index.mjs +65 -0
- package/dist/plugins/open-api/logo.mjs +13 -0
- package/dist/plugins/organization/access/index.d.mts +2 -0
- package/dist/plugins/organization/access/index.mjs +2 -0
- package/dist/plugins/organization/access/statement.d.mts +113 -0
- package/dist/plugins/organization/access/statement.mjs +77 -0
- package/dist/plugins/organization/adapter.d.mts +815 -0
- package/dist/plugins/organization/adapter.mjs +813 -0
- package/dist/plugins/organization/call.mjs +15 -0
- package/dist/plugins/organization/client.d.mts +375 -0
- package/dist/plugins/organization/client.mjs +104 -0
- package/dist/plugins/organization/error-codes.d.mts +66 -0
- package/dist/plugins/organization/error-codes.mjs +65 -0
- package/dist/plugins/organization/has-permission.d.mts +17 -0
- package/dist/plugins/organization/has-permission.mjs +34 -0
- package/dist/plugins/organization/index.d.mts +6 -0
- package/dist/plugins/organization/index.mjs +4 -0
- package/dist/plugins/organization/organization.d.mts +420 -0
- package/dist/plugins/organization/organization.mjs +886 -0
- package/dist/plugins/organization/permission.d.mts +15 -0
- package/dist/plugins/organization/permission.mjs +14 -0
- package/dist/plugins/organization/routes/crud-access-control.d.mts +511 -0
- package/dist/plugins/organization/routes/crud-access-control.mjs +674 -0
- package/dist/plugins/organization/routes/crud-invites.d.mts +1154 -0
- package/dist/plugins/organization/routes/crud-invites.mjs +602 -0
- package/dist/plugins/organization/routes/crud-members.d.mts +1057 -0
- package/dist/plugins/organization/routes/crud-members.mjs +518 -0
- package/dist/plugins/organization/routes/crud-org.d.mts +918 -0
- package/dist/plugins/organization/routes/crud-org.mjs +455 -0
- package/dist/plugins/organization/routes/crud-team.d.mts +1238 -0
- package/dist/plugins/organization/routes/crud-team.mjs +766 -0
- package/dist/plugins/organization/schema.d.mts +390 -0
- package/dist/plugins/organization/schema.mjs +65 -0
- package/dist/plugins/organization/types.d.mts +691 -0
- package/dist/plugins/phone-number/client.d.mts +31 -0
- package/dist/plugins/phone-number/client.mjs +19 -0
- package/dist/plugins/phone-number/error-codes.d.mts +19 -0
- package/dist/plugins/phone-number/error-codes.mjs +18 -0
- package/dist/plugins/phone-number/index.d.mts +360 -0
- package/dist/plugins/phone-number/index.mjs +57 -0
- package/dist/plugins/phone-number/routes.mjs +529 -0
- package/dist/plugins/phone-number/schema.d.mts +22 -0
- package/dist/plugins/phone-number/schema.mjs +18 -0
- package/dist/plugins/phone-number/types.d.mts +116 -0
- package/dist/plugins/siwe/client.d.mts +14 -0
- package/dist/plugins/siwe/client.mjs +15 -0
- package/dist/plugins/siwe/index.d.mts +62 -0
- package/dist/plugins/siwe/index.mjs +272 -0
- package/dist/plugins/siwe/parse-message.mjs +60 -0
- package/dist/plugins/siwe/schema.d.mts +35 -0
- package/dist/plugins/siwe/schema.mjs +30 -0
- package/dist/plugins/siwe/types.d.mts +43 -0
- package/dist/plugins/test-utils/auth-helpers.mjs +33 -0
- package/dist/plugins/test-utils/cookie-builder.mjs +55 -0
- package/dist/plugins/test-utils/db-helpers.mjs +65 -0
- package/dist/plugins/test-utils/factories.mjs +38 -0
- package/dist/plugins/test-utils/index.d.mts +73 -0
- package/dist/plugins/test-utils/index.mjs +97 -0
- package/dist/plugins/test-utils/otp-sink.mjs +21 -0
- package/dist/plugins/test-utils/types.d.mts +51 -0
- package/dist/plugins/two-factor/backup-codes/index.d.mts +291 -0
- package/dist/plugins/two-factor/backup-codes/index.mjs +341 -0
- package/dist/plugins/two-factor/client.d.mts +76 -0
- package/dist/plugins/two-factor/client.mjs +41 -0
- package/dist/plugins/two-factor/constant.mjs +6 -0
- package/dist/plugins/two-factor/error-code.d.mts +20 -0
- package/dist/plugins/two-factor/error-code.mjs +19 -0
- package/dist/plugins/two-factor/index.d.mts +720 -0
- package/dist/plugins/two-factor/index.mjs +349 -0
- package/dist/plugins/two-factor/otp/index.d.mts +216 -0
- package/dist/plugins/two-factor/otp/index.mjs +252 -0
- package/dist/plugins/two-factor/schema.d.mts +59 -0
- package/dist/plugins/two-factor/schema.mjs +53 -0
- package/dist/plugins/two-factor/totp/index.d.mts +219 -0
- package/dist/plugins/two-factor/totp/index.mjs +230 -0
- package/dist/plugins/two-factor/types.d.mts +111 -0
- package/dist/plugins/two-factor/utils.mjs +9 -0
- package/dist/plugins/two-factor/verify-two-factor.mjs +205 -0
- package/dist/plugins/username/client.d.mts +38 -0
- package/dist/plugins/username/client.mjs +17 -0
- package/dist/plugins/username/error-codes.d.mts +16 -0
- package/dist/plugins/username/error-codes.mjs +15 -0
- package/dist/plugins/username/index.d.mts +326 -0
- package/dist/plugins/username/index.mjs +312 -0
- package/dist/plugins/username/schema.d.mts +50 -0
- package/dist/plugins/username/schema.mjs +25 -0
- package/dist/social-providers/index.d.mts +1 -0
- package/dist/social-providers/index.mjs +2 -0
- package/dist/state.d.mts +48 -0
- package/dist/state.mjs +149 -0
- package/dist/test-utils/headers.d.mts +8 -0
- package/dist/test-utils/headers.mjs +17 -0
- package/dist/test-utils/http-test-instance.d.mts +413 -0
- package/dist/test-utils/http-test-instance.mjs +107 -0
- package/dist/test-utils/index.d.mts +4 -0
- package/dist/test-utils/index.mjs +4 -0
- package/dist/test-utils/test-instance.d.mts +56 -0
- package/dist/test-utils/test-instance.mjs +242 -0
- package/dist/types/adapter.d.mts +2 -0
- package/dist/types/api.d.mts +28 -0
- package/dist/types/auth.d.mts +32 -0
- package/dist/types/helper.d.mts +26 -0
- package/dist/types/index.d.mts +10 -0
- package/dist/types/index.mjs +1 -0
- package/dist/types/models.d.mts +10 -0
- package/dist/types/plugins.d.mts +19 -0
- package/dist/utils/boolean.mjs +6 -0
- package/dist/utils/constants.mjs +4 -0
- package/dist/utils/date.mjs +6 -0
- package/dist/utils/hashing.mjs +18 -0
- package/dist/utils/hide-metadata.d.mts +6 -0
- package/dist/utils/hide-metadata.mjs +4 -0
- package/dist/utils/index.d.mts +4 -0
- package/dist/utils/is-api-error.d.mts +2 -0
- package/dist/utils/is-api-error.mjs +2 -0
- package/dist/utils/is-atom.mjs +6 -0
- package/dist/utils/is-promise.mjs +6 -0
- package/dist/utils/middleware-response.mjs +7 -0
- package/dist/utils/password.mjs +32 -0
- package/dist/utils/plugin-helper.mjs +14 -0
- package/dist/utils/request.mjs +23 -0
- package/dist/utils/shim.mjs +22 -0
- package/dist/utils/time.d.mts +48 -0
- package/dist/utils/time.mjs +98 -0
- package/dist/utils/url.d.mts +78 -0
- package/dist/utils/url.mjs +238 -0
- package/dist/utils/validate-user-info.mjs +44 -0
- package/dist/utils/wildcard.mjs +106 -0
- package/dist/version.mjs +5 -0
- package/package.json +595 -3
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { isDynamicBaseURLConfig, isRequestLike } from "../utils/url.mjs";
|
|
2
|
+
import { pickSource, resolveDynamicTrustedProxyHeaders, resolveRequestContext } from "../context/helpers.mjs";
|
|
3
|
+
import { dispatchAuthEndpoint, getOperationId } from "./dispatch.mjs";
|
|
4
|
+
import { hasRequestState, runWithRequestState } from "@better-auth/core/context";
|
|
5
|
+
import { APIError, BetterAuthError } from "@better-auth/core/error";
|
|
6
|
+
//#region src/api/to-auth-endpoints.ts
|
|
7
|
+
/**
|
|
8
|
+
* Resolves the per-call `AuthContext` for endpoints with a dynamic `baseURL`.
|
|
9
|
+
*
|
|
10
|
+
* - `rawCtx.baseURL` already set: HTTP handler rehydrated upstream; return as-is.
|
|
11
|
+
* - Direct `auth.api` call with a source or a configured `fallback`: resolve here.
|
|
12
|
+
* - Neither: throw `APIError` with a helpful message. Leaving `baseURL = ""`
|
|
13
|
+
* would let plugins build `new URL("")` and crash cryptically downstream.
|
|
14
|
+
*/
|
|
15
|
+
async function resolveDynamicContext(rawCtx, input) {
|
|
16
|
+
if (rawCtx.baseURL) return rawCtx;
|
|
17
|
+
const source = pickSource(input);
|
|
18
|
+
const config = rawCtx.options.baseURL;
|
|
19
|
+
const hasFallback = isDynamicBaseURLConfig(config) && Boolean(config.fallback);
|
|
20
|
+
if (source === void 0 && !hasFallback) throw new APIError("INTERNAL_SERVER_ERROR", { message: "Dynamic baseURL could not be resolved for this direct auth.api call. Pass `headers: request.headers` (or `request`) to the call, or add `fallback` to your baseURL config." });
|
|
21
|
+
try {
|
|
22
|
+
return await resolveRequestContext(rawCtx, source, resolveDynamicTrustedProxyHeaders(rawCtx.options));
|
|
23
|
+
} catch (err) {
|
|
24
|
+
if (err instanceof BetterAuthError) throw new APIError("INTERNAL_SERVER_ERROR", { message: err.message });
|
|
25
|
+
throw err;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Wraps each raw endpoint so a router or `auth.api.*` call runs it through the
|
|
30
|
+
* configured hook pipeline. Per-call work that is specific to this entry point
|
|
31
|
+
* (dynamic `baseURL` resolution, request-state initialization) happens here;
|
|
32
|
+
* the hook pipeline itself lives in {@link dispatchAuthEndpoint}.
|
|
33
|
+
*/
|
|
34
|
+
function toAuthEndpoints(endpoints, ctx) {
|
|
35
|
+
const api = {};
|
|
36
|
+
for (const [key, endpoint] of Object.entries(endpoints)) {
|
|
37
|
+
api[key] = async (context) => {
|
|
38
|
+
const operationId = getOperationId(endpoint, key);
|
|
39
|
+
const run = async () => {
|
|
40
|
+
const rawContext = await ctx;
|
|
41
|
+
const pendingSchemaCheck = rawContext.checkSchema?.();
|
|
42
|
+
if (pendingSchemaCheck) await pendingSchemaCheck;
|
|
43
|
+
const authContext = isDynamicBaseURLConfig(rawContext.options.baseURL) ? await resolveDynamicContext(rawContext, context) : rawContext;
|
|
44
|
+
return dispatchAuthEndpoint(endpoint, {
|
|
45
|
+
...context,
|
|
46
|
+
context: authContext,
|
|
47
|
+
operationId,
|
|
48
|
+
asResponse: context?.asResponse ?? isRequestLike(context?.request)
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
if (await hasRequestState()) return run();
|
|
52
|
+
return runWithRequestState(/* @__PURE__ */ new WeakMap(), run);
|
|
53
|
+
};
|
|
54
|
+
api[key].path = endpoint.path;
|
|
55
|
+
api[key].options = endpoint.options;
|
|
56
|
+
}
|
|
57
|
+
return api;
|
|
58
|
+
}
|
|
59
|
+
//#endregion
|
|
60
|
+
export { toAuthEndpoints };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { getBaseURL, getOrigin, isDynamicBaseURLConfig } from "../utils/url.mjs";
|
|
2
|
+
import { getTrustedOrigins, getTrustedProviders, resolveDynamicTrustedProxyHeaders, resolveRequestContext } from "../context/helpers.mjs";
|
|
3
|
+
import { getEndpoints, router } from "../api/index.mjs";
|
|
4
|
+
import { runWithAdapter } from "@better-auth/core/context";
|
|
5
|
+
import { BASE_ERROR_CODES, BetterAuthError } from "@better-auth/core/error";
|
|
6
|
+
import { SchemaMismatchError } from "@better-auth/core/db/internal";
|
|
7
|
+
//#region src/auth/base.ts
|
|
8
|
+
const createBetterAuth = (options, initFn) => {
|
|
9
|
+
const authContext = initFn(options).then((ctx) => {
|
|
10
|
+
const validateSchema = ctx.options.advanced?.database?.validateSchema;
|
|
11
|
+
if (!ctx.checkSchema && validateSchema !== false) {
|
|
12
|
+
const level = validateSchema === true ? "warn" : "debug";
|
|
13
|
+
ctx.logger[level](`Schema validation is not available for adapter "${ctx.adapter.id}". Skipping schema validation. Database operations will proceed normally.`);
|
|
14
|
+
}
|
|
15
|
+
const pendingSchemaCheck = ctx.checkSchema?.();
|
|
16
|
+
if (pendingSchemaCheck) pendingSchemaCheck.catch((error) => {
|
|
17
|
+
ctx.logger.error(error instanceof SchemaMismatchError ? error.message : "Could not validate the database schema. Check your database connection.");
|
|
18
|
+
});
|
|
19
|
+
return ctx;
|
|
20
|
+
});
|
|
21
|
+
const { api } = getEndpoints(authContext, options);
|
|
22
|
+
const errorCodes = options.plugins?.reduce((acc, plugin) => {
|
|
23
|
+
if (plugin.$ERROR_CODES) return {
|
|
24
|
+
...acc,
|
|
25
|
+
...plugin.$ERROR_CODES
|
|
26
|
+
};
|
|
27
|
+
return acc;
|
|
28
|
+
}, {});
|
|
29
|
+
const handler = async (request) => {
|
|
30
|
+
const ctx = await authContext;
|
|
31
|
+
const basePath = ctx.options.basePath || "/api/auth";
|
|
32
|
+
let handlerCtx;
|
|
33
|
+
if (isDynamicBaseURLConfig(options.baseURL)) handlerCtx = await resolveRequestContext(ctx, request, resolveDynamicTrustedProxyHeaders(ctx.options));
|
|
34
|
+
else {
|
|
35
|
+
handlerCtx = Object.create(Object.getPrototypeOf(ctx), Object.getOwnPropertyDescriptors(ctx));
|
|
36
|
+
let trustOptions = ctx.options;
|
|
37
|
+
if (!ctx.options.baseURL) {
|
|
38
|
+
const baseURL = getBaseURL(void 0, basePath, request, void 0, ctx.options.advanced?.trustedProxyHeaders);
|
|
39
|
+
if (!baseURL) throw new BetterAuthError("Could not get base URL from request. Please provide a valid base URL.");
|
|
40
|
+
handlerCtx.baseURL = baseURL;
|
|
41
|
+
handlerCtx.options = {
|
|
42
|
+
...ctx.options,
|
|
43
|
+
baseURL: getOrigin(baseURL) || void 0
|
|
44
|
+
};
|
|
45
|
+
trustOptions = handlerCtx.options;
|
|
46
|
+
}
|
|
47
|
+
handlerCtx.trustedOrigins = await getTrustedOrigins(trustOptions, request);
|
|
48
|
+
handlerCtx.trustedProviders = await getTrustedProviders(trustOptions, request);
|
|
49
|
+
}
|
|
50
|
+
const { handler } = router(handlerCtx, options);
|
|
51
|
+
return runWithAdapter(handlerCtx.adapter, () => handler(request));
|
|
52
|
+
};
|
|
53
|
+
return {
|
|
54
|
+
handler,
|
|
55
|
+
fetch: handler,
|
|
56
|
+
api,
|
|
57
|
+
options,
|
|
58
|
+
$context: authContext,
|
|
59
|
+
$ERROR_CODES: {
|
|
60
|
+
...errorCodes,
|
|
61
|
+
...BASE_ERROR_CODES
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
//#endregion
|
|
66
|
+
export { createBetterAuth };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Auth } from "../types/auth.mjs";
|
|
2
|
+
import { BetterAuthOptions } from "@better-auth/core";
|
|
3
|
+
|
|
4
|
+
//#region src/auth/full.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Better Auth initializer for full mode (with Kysely)
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { betterAuth } from "better-auth";
|
|
11
|
+
*
|
|
12
|
+
* const auth = betterAuth({
|
|
13
|
+
* database: new PostgresDialect({ connection: process.env.DATABASE_URL }),
|
|
14
|
+
* });
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* For minimal mode (without Kysely), import from `better-auth/minimal` instead
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* import { betterAuth } from "better-auth/minimal";
|
|
21
|
+
*
|
|
22
|
+
* const auth = betterAuth({
|
|
23
|
+
* database: drizzleAdapter(db, { provider: "pg" }),
|
|
24
|
+
* });
|
|
25
|
+
*/
|
|
26
|
+
declare const betterAuth: <Options extends BetterAuthOptions>(options: Options & {}) => Auth<Options>;
|
|
27
|
+
//#endregion
|
|
28
|
+
export { betterAuth };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { init } from "../context/init.mjs";
|
|
2
|
+
import { createBetterAuth } from "./base.mjs";
|
|
3
|
+
//#region src/auth/full.ts
|
|
4
|
+
/**
|
|
5
|
+
* Better Auth initializer for full mode (with Kysely)
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { betterAuth } from "better-auth";
|
|
10
|
+
*
|
|
11
|
+
* const auth = betterAuth({
|
|
12
|
+
* database: new PostgresDialect({ connection: process.env.DATABASE_URL }),
|
|
13
|
+
* });
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* For minimal mode (without Kysely), import from `better-auth/minimal` instead
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* import { betterAuth } from "better-auth/minimal";
|
|
20
|
+
*
|
|
21
|
+
* const auth = betterAuth({
|
|
22
|
+
* database: drizzleAdapter(db, { provider: "pg" }),
|
|
23
|
+
* });
|
|
24
|
+
*/
|
|
25
|
+
const betterAuth = (options) => {
|
|
26
|
+
return createBetterAuth(options, init);
|
|
27
|
+
};
|
|
28
|
+
//#endregion
|
|
29
|
+
export { betterAuth };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Auth } from "../types/auth.mjs";
|
|
2
|
+
import { BetterAuthOptions } from "@better-auth/core";
|
|
3
|
+
|
|
4
|
+
//#region src/auth/minimal.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Better Auth initializer for minimal mode (without Kysely)
|
|
7
|
+
*/
|
|
8
|
+
declare const betterAuth: <Options extends BetterAuthOptions>(options: Options & {}) => Auth<Options>;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { type BetterAuthOptions, betterAuth };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createBetterAuth } from "./base.mjs";
|
|
2
|
+
import { initMinimal } from "../context/init-minimal.mjs";
|
|
3
|
+
//#region src/auth/minimal.ts
|
|
4
|
+
/**
|
|
5
|
+
* Better Auth initializer for minimal mode (without Kysely)
|
|
6
|
+
*/
|
|
7
|
+
const betterAuth = (options) => {
|
|
8
|
+
return createBetterAuth(options, initMinimal);
|
|
9
|
+
};
|
|
10
|
+
//#endregion
|
|
11
|
+
export { betterAuth };
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { wildcardMatch } from "../utils/wildcard.mjs";
|
|
2
|
+
import { getHost, getOrigin, getProtocol } from "../utils/url.mjs";
|
|
3
|
+
//#region src/auth/trusted-origins.ts
|
|
4
|
+
const CONTROL_CHARACTER_PATTERN = /[\u0000-\u001f\u007f-\u009f]/;
|
|
5
|
+
const RELATIVE_URL_PARSER_ORIGIN = "https://better-auth.invalid";
|
|
6
|
+
const ENCODED_PATH_SEPARATOR_PATTERN = /%2[fF]|%5[cC]/;
|
|
7
|
+
/**
|
|
8
|
+
* Resolves `.` and `..` segments in a path after percent-decoding so a
|
|
9
|
+
* path-pinned pattern cannot be bypassed with traversal: e.g.
|
|
10
|
+
* `myapp://host/cb/../evil` must not satisfy pattern `myapp://host/cb`.
|
|
11
|
+
* Returns "" for an empty or root path.
|
|
12
|
+
*/
|
|
13
|
+
const normalizePath = (path) => {
|
|
14
|
+
let decoded = path;
|
|
15
|
+
try {
|
|
16
|
+
decoded = decodeURIComponent(path);
|
|
17
|
+
} catch {}
|
|
18
|
+
const segments = [];
|
|
19
|
+
for (const segment of decoded.split("/")) if (segment === "..") segments.pop();
|
|
20
|
+
else if (segment !== "." && segment !== "") segments.push(segment);
|
|
21
|
+
return segments.length > 0 ? `/${segments.join("/")}` : "";
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Splits a custom-scheme origin into its scheme, authority and path using
|
|
25
|
+
* plain string operations.
|
|
26
|
+
*
|
|
27
|
+
* `new URL()` is deliberately avoided here: its parsing of non-special schemes
|
|
28
|
+
* (e.g. `myapp://`, `exp://`) is not consistent across the runtimes Better Auth
|
|
29
|
+
* targets (Node, Bun, Deno, Cloudflare Workers), and the result of an origin
|
|
30
|
+
* check must not depend on which engine extracts the authority.
|
|
31
|
+
*
|
|
32
|
+
* Scheme and authority are lower-cased (matching how a URL canonicalizes its
|
|
33
|
+
* host); the path is percent-decoded and resolved so traversal cannot bypass
|
|
34
|
+
* a path-pinned pattern.
|
|
35
|
+
*/
|
|
36
|
+
const parseCustomSchemeOrigin = (value) => {
|
|
37
|
+
if (CONTROL_CHARACTER_PATTERN.test(value)) return null;
|
|
38
|
+
const schemeEnd = value.indexOf(":");
|
|
39
|
+
if (schemeEnd <= 0) return null;
|
|
40
|
+
const scheme = value.slice(0, schemeEnd).toLowerCase();
|
|
41
|
+
let rest = value.slice(schemeEnd + 1);
|
|
42
|
+
let authority = "";
|
|
43
|
+
if (rest.startsWith("//")) {
|
|
44
|
+
rest = rest.slice(2);
|
|
45
|
+
const authorityEnd = rest.search(/[/?#]/);
|
|
46
|
+
if (authorityEnd === -1) {
|
|
47
|
+
authority = rest;
|
|
48
|
+
rest = "";
|
|
49
|
+
} else {
|
|
50
|
+
authority = rest.slice(0, authorityEnd);
|
|
51
|
+
rest = rest.slice(authorityEnd);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const pathEnd = rest.search(/[?#]/);
|
|
55
|
+
const path = normalizePath(pathEnd === -1 ? rest : rest.slice(0, pathEnd));
|
|
56
|
+
return {
|
|
57
|
+
scheme,
|
|
58
|
+
authority: authority.toLowerCase(),
|
|
59
|
+
path
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Validates root-relative redirects against ambiguous browser and router parsing.
|
|
64
|
+
*
|
|
65
|
+
* @see https://www.rfc-editor.org/rfc/rfc3986.html#section-4.2
|
|
66
|
+
* @see https://url.spec.whatwg.org/#concept-basic-url-parser
|
|
67
|
+
*/
|
|
68
|
+
const isSafeRelativeURL = (value) => {
|
|
69
|
+
if (!value.startsWith("/") || value.startsWith("//") || value.includes("\\") || CONTROL_CHARACTER_PATTERN.test(value)) return false;
|
|
70
|
+
const pathEnd = value.search(/[?#]/);
|
|
71
|
+
const path = pathEnd === -1 ? value : value.slice(0, pathEnd);
|
|
72
|
+
if (ENCODED_PATH_SEPARATOR_PATTERN.test(path)) return false;
|
|
73
|
+
try {
|
|
74
|
+
return new URL(value, RELATIVE_URL_PARSER_ORIGIN).origin === RELATIVE_URL_PARSER_ORIGIN;
|
|
75
|
+
} catch {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Matches the given url against an origin or origin pattern
|
|
81
|
+
* See "options.trustedOrigins" for details of supported patterns
|
|
82
|
+
*
|
|
83
|
+
* @param url The url to test
|
|
84
|
+
* @param pattern The origin pattern
|
|
85
|
+
* @param [settings] Specify supported pattern matching settings
|
|
86
|
+
* @returns {boolean} true if the URL matches the origin pattern, false otherwise.
|
|
87
|
+
*/
|
|
88
|
+
const matchesOriginPattern = (url, pattern, settings) => {
|
|
89
|
+
if (url.startsWith("/")) return settings?.allowRelativePaths === true && isSafeRelativeURL(url);
|
|
90
|
+
if (pattern.includes("*") || pattern.includes("?")) {
|
|
91
|
+
if (pattern.includes("://")) return wildcardMatch(pattern)(getOrigin(url) || url);
|
|
92
|
+
const host = getHost(url);
|
|
93
|
+
if (!host) return false;
|
|
94
|
+
return wildcardMatch(pattern)(host);
|
|
95
|
+
}
|
|
96
|
+
const protocol = getProtocol(url);
|
|
97
|
+
if (protocol === "http:" || protocol === "https:" || !protocol) return pattern === getOrigin(url);
|
|
98
|
+
const parsed = parseCustomSchemeOrigin(url);
|
|
99
|
+
const parsedPattern = parseCustomSchemeOrigin(pattern);
|
|
100
|
+
if (!parsed || !parsedPattern || parsed.scheme !== parsedPattern.scheme) return false;
|
|
101
|
+
if (parsedPattern.authority && parsed.authority !== parsedPattern.authority) return false;
|
|
102
|
+
if (!parsedPattern.path) return true;
|
|
103
|
+
return parsed.path === parsedPattern.path || parsed.path.startsWith(`${parsedPattern.path}/`);
|
|
104
|
+
};
|
|
105
|
+
//#endregion
|
|
106
|
+
export { matchesOriginPattern };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/client/broadcast-channel.d.ts
|
|
2
|
+
interface BroadcastMessage {
|
|
3
|
+
event?: "session" | undefined;
|
|
4
|
+
data?: {
|
|
5
|
+
trigger?: "signout" | "getSession" | "updateUser";
|
|
6
|
+
} | undefined;
|
|
7
|
+
clientId: string;
|
|
8
|
+
timestamp: number;
|
|
9
|
+
}
|
|
10
|
+
type BroadcastListener = (message: BroadcastMessage) => void;
|
|
11
|
+
declare const kBroadcastChannel: unique symbol;
|
|
12
|
+
interface BroadcastChannel {
|
|
13
|
+
post(message: Record<string, unknown>): void;
|
|
14
|
+
subscribe(listener: BroadcastListener): () => void;
|
|
15
|
+
setup(): () => void;
|
|
16
|
+
}
|
|
17
|
+
declare function getGlobalBroadcastChannel(name?: string): BroadcastChannel;
|
|
18
|
+
//#endregion
|
|
19
|
+
export { BroadcastChannel, BroadcastListener, BroadcastMessage, getGlobalBroadcastChannel, kBroadcastChannel };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
//#region src/client/broadcast-channel.ts
|
|
2
|
+
const kBroadcastChannel = Symbol.for("better-auth:broadcast-channel");
|
|
3
|
+
const now = () => Math.floor(Date.now() / 1e3);
|
|
4
|
+
var WindowBroadcastChannel = class {
|
|
5
|
+
listeners = /* @__PURE__ */ new Set();
|
|
6
|
+
name;
|
|
7
|
+
constructor(name = "better-auth.message") {
|
|
8
|
+
this.name = name;
|
|
9
|
+
}
|
|
10
|
+
subscribe(listener) {
|
|
11
|
+
this.listeners.add(listener);
|
|
12
|
+
return () => {
|
|
13
|
+
this.listeners.delete(listener);
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
post(message) {
|
|
17
|
+
if (typeof window === "undefined") return;
|
|
18
|
+
try {
|
|
19
|
+
localStorage.setItem(this.name, JSON.stringify({
|
|
20
|
+
...message,
|
|
21
|
+
timestamp: now()
|
|
22
|
+
}));
|
|
23
|
+
} catch {}
|
|
24
|
+
}
|
|
25
|
+
setup() {
|
|
26
|
+
if (typeof window === "undefined" || typeof window.addEventListener === "undefined") return () => {};
|
|
27
|
+
const handler = (event) => {
|
|
28
|
+
if (event.key !== this.name) return;
|
|
29
|
+
const message = JSON.parse(event.newValue ?? "{}");
|
|
30
|
+
if (message?.event !== "session" || !message?.data) return;
|
|
31
|
+
this.listeners.forEach((listener) => listener(message));
|
|
32
|
+
};
|
|
33
|
+
window.addEventListener("storage", handler);
|
|
34
|
+
return () => {
|
|
35
|
+
window.removeEventListener("storage", handler);
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
function getGlobalBroadcastChannel(name = "better-auth.message") {
|
|
40
|
+
if (!globalThis[kBroadcastChannel]) globalThis[kBroadcastChannel] = new WindowBroadcastChannel(name);
|
|
41
|
+
return globalThis[kBroadcastChannel];
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
export { getGlobalBroadcastChannel, kBroadcastChannel };
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { SessionData } from "./session-atom.mjs";
|
|
2
|
+
import { BetterAuthClientOptions, ClientAtomListener } from "@better-auth/core";
|
|
3
|
+
import * as _$nanostores from "nanostores";
|
|
4
|
+
import { WritableAtom } from "nanostores";
|
|
5
|
+
import * as _$_better_fetch_fetch0 from "@better-fetch/fetch";
|
|
6
|
+
|
|
7
|
+
//#region src/client/config.d.ts
|
|
8
|
+
declare const getClientConfig: (options?: BetterAuthClientOptions | undefined, loadEnv?: boolean | undefined) => {
|
|
9
|
+
readonly baseURL: string;
|
|
10
|
+
pluginsActions: Record<string, any>;
|
|
11
|
+
pluginsAtoms: Record<string, WritableAtom<any>>;
|
|
12
|
+
pluginPathMethods: Record<string, "GET" | "POST">;
|
|
13
|
+
atomListeners: ClientAtomListener[];
|
|
14
|
+
hydrateSession: (sessionData: SessionData | null) => void;
|
|
15
|
+
$sessionSignal: _$nanostores.PreinitializedWritableAtom<boolean> & object;
|
|
16
|
+
$fetch: _$_better_fetch_fetch0.BetterFetch<{
|
|
17
|
+
plugins: (_$_better_fetch_fetch0.BetterFetchPlugin<Record<string, any>> | {
|
|
18
|
+
id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
hooks: {
|
|
21
|
+
onSuccess(context: _$_better_fetch_fetch0.SuccessContext<any>): void;
|
|
22
|
+
};
|
|
23
|
+
} | {
|
|
24
|
+
id: string;
|
|
25
|
+
name: string;
|
|
26
|
+
hooks: {
|
|
27
|
+
onSuccess: ((context: _$_better_fetch_fetch0.SuccessContext<any>) => Promise<void> | void) | undefined;
|
|
28
|
+
onError: ((context: _$_better_fetch_fetch0.ErrorContext) => Promise<void> | void) | undefined;
|
|
29
|
+
onRequest: (<T extends Record<string, any>>(context: _$_better_fetch_fetch0.RequestContext<T>) => Promise<_$_better_fetch_fetch0.RequestContext | void> | _$_better_fetch_fetch0.RequestContext | void) | undefined;
|
|
30
|
+
onResponse: ((context: _$_better_fetch_fetch0.ResponseContext) => Promise<Response | void | _$_better_fetch_fetch0.ResponseContext> | Response | _$_better_fetch_fetch0.ResponseContext | void) | undefined;
|
|
31
|
+
};
|
|
32
|
+
})[];
|
|
33
|
+
cache?: RequestCache | undefined;
|
|
34
|
+
credentials?: RequestCredentials;
|
|
35
|
+
integrity?: string | undefined;
|
|
36
|
+
keepalive?: boolean | undefined;
|
|
37
|
+
method: string;
|
|
38
|
+
mode?: RequestMode | undefined;
|
|
39
|
+
priority?: RequestPriority | undefined;
|
|
40
|
+
redirect?: RequestRedirect | undefined;
|
|
41
|
+
referrer?: string | undefined;
|
|
42
|
+
referrerPolicy?: ReferrerPolicy | undefined;
|
|
43
|
+
signal?: AbortSignal | null;
|
|
44
|
+
window?: null | undefined;
|
|
45
|
+
onRetry?: ((response: _$_better_fetch_fetch0.ResponseContext) => Promise<void> | void) | undefined;
|
|
46
|
+
hookOptions?: {
|
|
47
|
+
cloneResponse?: boolean;
|
|
48
|
+
} | undefined;
|
|
49
|
+
timeout?: number | undefined;
|
|
50
|
+
customFetchImpl: _$_better_fetch_fetch0.FetchEsque;
|
|
51
|
+
baseURL: string;
|
|
52
|
+
throw?: boolean | undefined;
|
|
53
|
+
auth?: ({
|
|
54
|
+
type: "Bearer";
|
|
55
|
+
token: string | Promise<string | undefined> | (() => string | Promise<string | undefined> | undefined) | undefined;
|
|
56
|
+
} | {
|
|
57
|
+
type: "Basic";
|
|
58
|
+
username: string | (() => string | undefined) | undefined;
|
|
59
|
+
password: string | (() => string | undefined) | undefined;
|
|
60
|
+
} | {
|
|
61
|
+
type: "Custom";
|
|
62
|
+
prefix: string | (() => string | undefined) | undefined;
|
|
63
|
+
value: string | (() => string | undefined) | undefined;
|
|
64
|
+
}) | undefined;
|
|
65
|
+
headers?: {} | {
|
|
66
|
+
[x: string]: string | undefined;
|
|
67
|
+
accept?: ((string & {}) | "application/json" | "text/plain" | "application/octet-stream") | undefined;
|
|
68
|
+
"content-type"?: ((string & {}) | "application/x-www-form-urlencoded" | "application/json" | "text/plain" | "application/octet-stream" | "multipart/form-data") | undefined;
|
|
69
|
+
authorization?: ((string & {}) | `Bearer ${string}` | `Basic ${string}`) | undefined;
|
|
70
|
+
} | undefined;
|
|
71
|
+
body?: any;
|
|
72
|
+
query?: any;
|
|
73
|
+
params?: any;
|
|
74
|
+
duplex?: "full" | "half" | undefined;
|
|
75
|
+
jsonParser: (text: string) => Promise<any> | any;
|
|
76
|
+
retry?: _$_better_fetch_fetch0.RetryOptions | undefined;
|
|
77
|
+
retryAttempt?: number | undefined;
|
|
78
|
+
output?: (_$_better_fetch_fetch0.StandardSchemaV1 | typeof Blob | typeof File) | undefined;
|
|
79
|
+
errorSchema?: _$_better_fetch_fetch0.StandardSchemaV1 | undefined;
|
|
80
|
+
disableValidation?: boolean | undefined;
|
|
81
|
+
disableSignal?: boolean | undefined;
|
|
82
|
+
}, unknown, unknown, {}>;
|
|
83
|
+
$store: {
|
|
84
|
+
notify: (signal?: (Omit<string, "$sessionSignal"> | "$sessionSignal") | undefined) => void;
|
|
85
|
+
listen: (signal: Omit<string, "$sessionSignal"> | "$sessionSignal", listener: (value: boolean, oldValue?: boolean | undefined) => void) => void;
|
|
86
|
+
atoms: Record<string, WritableAtom<any>>;
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
//#endregion
|
|
90
|
+
export { getClientConfig };
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { getBaseURL } from "../utils/url.mjs";
|
|
2
|
+
import { parseJSON } from "./parser.mjs";
|
|
3
|
+
import { redirectPlugin } from "./fetch-plugins.mjs";
|
|
4
|
+
import { getSessionAtom, hydrateSessionAtom } from "./session-atom.mjs";
|
|
5
|
+
import { defu } from "defu";
|
|
6
|
+
import { createFetch } from "@better-fetch/fetch";
|
|
7
|
+
//#region src/client/config.ts
|
|
8
|
+
const resolvePublicAuthUrl = (basePath) => {
|
|
9
|
+
if (typeof process === "undefined") return void 0;
|
|
10
|
+
const path = basePath ?? "/api/auth";
|
|
11
|
+
if (process.env.NEXT_PUBLIC_AUTH_URL) return process.env.NEXT_PUBLIC_AUTH_URL;
|
|
12
|
+
if (typeof window === "undefined") {
|
|
13
|
+
if (process.env.NEXTAUTH_URL) try {
|
|
14
|
+
return process.env.NEXTAUTH_URL;
|
|
15
|
+
} catch {}
|
|
16
|
+
if (process.env.VERCEL_URL) try {
|
|
17
|
+
const protocol = process.env.VERCEL_URL.startsWith("http") ? "" : "https://";
|
|
18
|
+
return `${new URL(`${protocol}${process.env.VERCEL_URL}`).origin}${path}`;
|
|
19
|
+
} catch {}
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const getClientConfig = (options, loadEnv) => {
|
|
23
|
+
const isCredentialsSupported = "credentials" in Request.prototype;
|
|
24
|
+
const baseURL = getBaseURL(options?.baseURL, options?.basePath, void 0, loadEnv) ?? resolvePublicAuthUrl(options?.basePath) ?? "/api/auth";
|
|
25
|
+
const pluginsFetchPlugins = options?.plugins?.flatMap((plugin) => plugin.fetchPlugins).filter((pl) => pl !== void 0) || [];
|
|
26
|
+
const lifeCyclePlugin = {
|
|
27
|
+
id: "lifecycle-hooks",
|
|
28
|
+
name: "lifecycle-hooks",
|
|
29
|
+
hooks: {
|
|
30
|
+
onSuccess: options?.fetchOptions?.onSuccess,
|
|
31
|
+
onError: options?.fetchOptions?.onError,
|
|
32
|
+
onRequest: options?.fetchOptions?.onRequest,
|
|
33
|
+
onResponse: options?.fetchOptions?.onResponse
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const { onSuccess: _onSuccess, onError: _onError, onRequest: _onRequest, onResponse: _onResponse, ...restOfFetchOptions } = options?.fetchOptions || {};
|
|
37
|
+
const $fetch = createFetch({
|
|
38
|
+
baseURL,
|
|
39
|
+
...isCredentialsSupported ? { credentials: "include" } : {},
|
|
40
|
+
method: "GET",
|
|
41
|
+
jsonParser(text) {
|
|
42
|
+
if (!text) return null;
|
|
43
|
+
return parseJSON(text, { strict: false });
|
|
44
|
+
},
|
|
45
|
+
customFetchImpl: fetch,
|
|
46
|
+
...restOfFetchOptions,
|
|
47
|
+
plugins: [
|
|
48
|
+
lifeCyclePlugin,
|
|
49
|
+
...restOfFetchOptions.plugins || [],
|
|
50
|
+
...options?.disableDefaultFetchPlugins ? [] : [redirectPlugin],
|
|
51
|
+
...pluginsFetchPlugins
|
|
52
|
+
]
|
|
53
|
+
});
|
|
54
|
+
const { $sessionSignal, session, broadcastSessionUpdate } = getSessionAtom($fetch, options);
|
|
55
|
+
let hasHydrated = false;
|
|
56
|
+
const hydrateSession = (sessionData) => {
|
|
57
|
+
if (hasHydrated || sessionData === null) return;
|
|
58
|
+
hasHydrated = true;
|
|
59
|
+
hydrateSessionAtom(session, sessionData);
|
|
60
|
+
};
|
|
61
|
+
const plugins = options?.plugins || [];
|
|
62
|
+
let pluginsActions = {};
|
|
63
|
+
const pluginsAtoms = {
|
|
64
|
+
$sessionSignal,
|
|
65
|
+
session
|
|
66
|
+
};
|
|
67
|
+
const pluginPathMethods = {
|
|
68
|
+
"/sign-out": "POST",
|
|
69
|
+
"/revoke-sessions": "POST",
|
|
70
|
+
"/revoke-other-sessions": "POST",
|
|
71
|
+
"/delete-user": "POST"
|
|
72
|
+
};
|
|
73
|
+
const atomListeners = [{
|
|
74
|
+
signal: "$sessionSignal",
|
|
75
|
+
matcher(path) {
|
|
76
|
+
return path === "/sign-out" || path === "/update-user" || path === "/update-session" || path === "/sign-up/email" || path === "/sign-in/email" || path === "/delete-user" || path === "/verify-email" || path === "/revoke-sessions" || path === "/revoke-session" || path === "/revoke-other-sessions" || path === "/change-email" || path === "/change-password";
|
|
77
|
+
},
|
|
78
|
+
callback(path) {
|
|
79
|
+
if (path === "/sign-out") broadcastSessionUpdate("signout");
|
|
80
|
+
else if (path === "/update-user" || path === "/update-session") broadcastSessionUpdate("updateUser");
|
|
81
|
+
}
|
|
82
|
+
}];
|
|
83
|
+
for (const plugin of plugins) {
|
|
84
|
+
if (plugin.getAtoms) Object.assign(pluginsAtoms, plugin.getAtoms?.($fetch));
|
|
85
|
+
if (plugin.pathMethods) Object.assign(pluginPathMethods, plugin.pathMethods);
|
|
86
|
+
if (plugin.atomListeners) atomListeners.push(...plugin.atomListeners);
|
|
87
|
+
}
|
|
88
|
+
const $store = {
|
|
89
|
+
notify: (signal) => {
|
|
90
|
+
pluginsAtoms[signal].set(!pluginsAtoms[signal].get());
|
|
91
|
+
},
|
|
92
|
+
listen: (signal, listener) => {
|
|
93
|
+
pluginsAtoms[signal].subscribe(listener);
|
|
94
|
+
},
|
|
95
|
+
atoms: pluginsAtoms
|
|
96
|
+
};
|
|
97
|
+
for (const plugin of plugins) if (plugin.getActions) pluginsActions = defu(plugin.getActions?.($fetch, $store, options) ?? {}, pluginsActions);
|
|
98
|
+
return {
|
|
99
|
+
get baseURL() {
|
|
100
|
+
return baseURL;
|
|
101
|
+
},
|
|
102
|
+
pluginsActions,
|
|
103
|
+
pluginsAtoms,
|
|
104
|
+
pluginPathMethods,
|
|
105
|
+
atomListeners,
|
|
106
|
+
hydrateSession,
|
|
107
|
+
$sessionSignal,
|
|
108
|
+
$fetch,
|
|
109
|
+
$store
|
|
110
|
+
};
|
|
111
|
+
};
|
|
112
|
+
//#endregion
|
|
113
|
+
export { getClientConfig };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Store, StoreValue } from "nanostores";
|
|
2
|
+
|
|
3
|
+
//#region src/client/equality.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Deep structural equality for JSON-serializable values.
|
|
6
|
+
* Handles: primitives, null, arrays, and plain objects.
|
|
7
|
+
* Short-circuits on referential equality at every recursion level.
|
|
8
|
+
*/
|
|
9
|
+
declare function isJsonEqual(a: unknown, b: unknown): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Attach an equality gate to a nanostores atom via `onSet`.
|
|
12
|
+
* When `isEqual(currentValue, newValue)` returns true, the `set()` call
|
|
13
|
+
* is aborted: no listeners fire, no framework re-renders occur.
|
|
14
|
+
*
|
|
15
|
+
* Returns the unsubscribe function from `onSet`.
|
|
16
|
+
*/
|
|
17
|
+
declare function withEquality<S extends Store>(store: S, isEqual: (a: StoreValue<S>, b: StoreValue<S>) => boolean): () => void;
|
|
18
|
+
//#endregion
|
|
19
|
+
export { isJsonEqual, withEquality };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { onSet } from "nanostores";
|
|
2
|
+
//#region src/client/equality.ts
|
|
3
|
+
function isPlainObject(value) {
|
|
4
|
+
if (typeof value !== "object" || value === null) return false;
|
|
5
|
+
const prototype = Object.getPrototypeOf(value);
|
|
6
|
+
return prototype === Object.prototype || prototype === null;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Deep structural equality for JSON-serializable values.
|
|
10
|
+
* Handles: primitives, null, arrays, and plain objects.
|
|
11
|
+
* Short-circuits on referential equality at every recursion level.
|
|
12
|
+
*/
|
|
13
|
+
function isJsonEqual(a, b) {
|
|
14
|
+
if (a === b) return true;
|
|
15
|
+
if (Array.isArray(a) && Array.isArray(b)) {
|
|
16
|
+
if (a.length !== b.length) return false;
|
|
17
|
+
for (let i = 0; i < a.length; i++) if (!isJsonEqual(a[i], b[i])) return false;
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
if (isPlainObject(a) && isPlainObject(b)) {
|
|
21
|
+
const keysA = Object.keys(a);
|
|
22
|
+
const keysB = Object.keys(b);
|
|
23
|
+
if (keysA.length !== keysB.length) return false;
|
|
24
|
+
for (const key of keysA) if (!(key in b) || !isJsonEqual(a[key], b[key])) return false;
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Attach an equality gate to a nanostores atom via `onSet`.
|
|
31
|
+
* When `isEqual(currentValue, newValue)` returns true, the `set()` call
|
|
32
|
+
* is aborted: no listeners fire, no framework re-renders occur.
|
|
33
|
+
*
|
|
34
|
+
* Returns the unsubscribe function from `onSet`.
|
|
35
|
+
*/
|
|
36
|
+
function withEquality(store, isEqual) {
|
|
37
|
+
return onSet(store, ({ newValue, abort }) => {
|
|
38
|
+
if (isEqual(store.value, newValue)) abort();
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
export { isJsonEqual, withEquality };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { isSafeUrlScheme } from "@better-auth/core/utils/url";
|
|
2
|
+
//#region src/client/fetch-plugins.ts
|
|
3
|
+
const redirectPlugin = {
|
|
4
|
+
id: "redirect",
|
|
5
|
+
name: "Redirect",
|
|
6
|
+
hooks: { onSuccess(context) {
|
|
7
|
+
if (context.data?.url && context.data?.redirect && isSafeUrlScheme(context.data.url)) {
|
|
8
|
+
if (typeof window !== "undefined" && window.location) {
|
|
9
|
+
if (window.location) try {
|
|
10
|
+
window.location.href = context.data.url;
|
|
11
|
+
} catch {}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
} }
|
|
15
|
+
};
|
|
16
|
+
//#endregion
|
|
17
|
+
export { redirectPlugin };
|