@hammadj/better-auth 1.5.0-beta.9
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 +33 -0
- package/dist/_virtual/rolldown_runtime.mjs +36 -0
- package/dist/adapters/drizzle-adapter/index.d.mts +1 -0
- package/dist/adapters/drizzle-adapter/index.mjs +3 -0
- package/dist/adapters/index.d.mts +23 -0
- package/dist/adapters/index.mjs +13 -0
- package/dist/adapters/index.mjs.map +1 -0
- package/dist/adapters/kysely-adapter/index.d.mts +1 -0
- package/dist/adapters/kysely-adapter/index.mjs +3 -0
- package/dist/adapters/memory-adapter/index.d.mts +1 -0
- package/dist/adapters/memory-adapter/index.mjs +3 -0
- package/dist/adapters/mongodb-adapter/index.d.mts +1 -0
- package/dist/adapters/mongodb-adapter/index.mjs +3 -0
- package/dist/adapters/prisma-adapter/index.d.mts +1 -0
- package/dist/adapters/prisma-adapter/index.mjs +3 -0
- package/dist/api/index.d.mts +40 -0
- package/dist/api/index.mjs +205 -0
- package/dist/api/index.mjs.map +1 -0
- package/dist/api/middlewares/index.d.mts +1 -0
- package/dist/api/middlewares/index.mjs +3 -0
- package/dist/api/middlewares/origin-check.d.mts +17 -0
- package/dist/api/middlewares/origin-check.mjs +140 -0
- package/dist/api/middlewares/origin-check.mjs.map +1 -0
- package/dist/api/rate-limiter/index.mjs +177 -0
- package/dist/api/rate-limiter/index.mjs.map +1 -0
- package/dist/api/routes/account.d.mts +10 -0
- package/dist/api/routes/account.mjs +493 -0
- package/dist/api/routes/account.mjs.map +1 -0
- package/dist/api/routes/callback.d.mts +5 -0
- package/dist/api/routes/callback.mjs +178 -0
- package/dist/api/routes/callback.mjs.map +1 -0
- package/dist/api/routes/email-verification.d.mts +29 -0
- package/dist/api/routes/email-verification.mjs +301 -0
- package/dist/api/routes/email-verification.mjs.map +1 -0
- package/dist/api/routes/error.d.mts +5 -0
- package/dist/api/routes/error.mjs +386 -0
- package/dist/api/routes/error.mjs.map +1 -0
- package/dist/api/routes/index.d.mts +11 -0
- package/dist/api/routes/index.mjs +13 -0
- package/dist/api/routes/ok.d.mts +5 -0
- package/dist/api/routes/ok.mjs +30 -0
- package/dist/api/routes/ok.mjs.map +1 -0
- package/dist/api/routes/password.d.mts +8 -0
- package/dist/api/routes/password.mjs +198 -0
- package/dist/api/routes/password.mjs.map +1 -0
- package/dist/api/routes/session.d.mts +52 -0
- package/dist/api/routes/session.mjs +478 -0
- package/dist/api/routes/session.mjs.map +1 -0
- package/dist/api/routes/sign-in.d.mts +8 -0
- package/dist/api/routes/sign-in.mjs +262 -0
- package/dist/api/routes/sign-in.mjs.map +1 -0
- package/dist/api/routes/sign-out.d.mts +5 -0
- package/dist/api/routes/sign-out.mjs +33 -0
- package/dist/api/routes/sign-out.mjs.map +1 -0
- package/dist/api/routes/sign-up.d.mts +7 -0
- package/dist/api/routes/sign-up.mjs +227 -0
- package/dist/api/routes/sign-up.mjs.map +1 -0
- package/dist/api/routes/update-user.d.mts +12 -0
- package/dist/api/routes/update-user.mjs +493 -0
- package/dist/api/routes/update-user.mjs.map +1 -0
- package/dist/api/state/oauth.d.mts +5 -0
- package/dist/api/state/oauth.mjs +8 -0
- package/dist/api/state/oauth.mjs.map +1 -0
- package/dist/api/state/should-session-refresh.d.mts +13 -0
- package/dist/api/state/should-session-refresh.mjs +16 -0
- package/dist/api/state/should-session-refresh.mjs.map +1 -0
- package/dist/api/to-auth-endpoints.mjs +197 -0
- package/dist/api/to-auth-endpoints.mjs.map +1 -0
- package/dist/auth/base.mjs +44 -0
- package/dist/auth/base.mjs.map +1 -0
- package/dist/auth/full.d.mts +30 -0
- package/dist/auth/full.mjs +32 -0
- package/dist/auth/full.mjs.map +1 -0
- package/dist/auth/minimal.d.mts +12 -0
- package/dist/auth/minimal.mjs +14 -0
- package/dist/auth/minimal.mjs.map +1 -0
- package/dist/auth/trusted-origins.mjs +31 -0
- package/dist/auth/trusted-origins.mjs.map +1 -0
- package/dist/client/broadcast-channel.d.mts +20 -0
- package/dist/client/broadcast-channel.mjs +46 -0
- package/dist/client/broadcast-channel.mjs.map +1 -0
- package/dist/client/config.mjs +90 -0
- package/dist/client/config.mjs.map +1 -0
- package/dist/client/fetch-plugins.mjs +18 -0
- package/dist/client/fetch-plugins.mjs.map +1 -0
- package/dist/client/focus-manager.d.mts +11 -0
- package/dist/client/focus-manager.mjs +32 -0
- package/dist/client/focus-manager.mjs.map +1 -0
- package/dist/client/index.d.mts +30 -0
- package/dist/client/index.mjs +21 -0
- package/dist/client/index.mjs.map +1 -0
- package/dist/client/lynx/index.d.mts +62 -0
- package/dist/client/lynx/index.mjs +24 -0
- package/dist/client/lynx/index.mjs.map +1 -0
- package/dist/client/lynx/lynx-store.d.mts +47 -0
- package/dist/client/lynx/lynx-store.mjs +47 -0
- package/dist/client/lynx/lynx-store.mjs.map +1 -0
- package/dist/client/online-manager.d.mts +12 -0
- package/dist/client/online-manager.mjs +35 -0
- package/dist/client/online-manager.mjs.map +1 -0
- package/dist/client/parser.mjs +73 -0
- package/dist/client/parser.mjs.map +1 -0
- package/dist/client/path-to-object.d.mts +57 -0
- package/dist/client/plugins/index.d.mts +58 -0
- package/dist/client/plugins/index.mjs +33 -0
- package/dist/client/plugins/infer-plugin.d.mts +9 -0
- package/dist/client/plugins/infer-plugin.mjs +11 -0
- package/dist/client/plugins/infer-plugin.mjs.map +1 -0
- package/dist/client/proxy.mjs +79 -0
- package/dist/client/proxy.mjs.map +1 -0
- package/dist/client/query.d.mts +23 -0
- package/dist/client/query.mjs +98 -0
- package/dist/client/query.mjs.map +1 -0
- package/dist/client/react/index.d.mts +63 -0
- package/dist/client/react/index.mjs +24 -0
- package/dist/client/react/index.mjs.map +1 -0
- package/dist/client/react/react-store.d.mts +47 -0
- package/dist/client/react/react-store.mjs +47 -0
- package/dist/client/react/react-store.mjs.map +1 -0
- package/dist/client/session-atom.mjs +29 -0
- package/dist/client/session-atom.mjs.map +1 -0
- package/dist/client/session-refresh.d.mts +28 -0
- package/dist/client/session-refresh.mjs +140 -0
- package/dist/client/session-refresh.mjs.map +1 -0
- package/dist/client/solid/index.d.mts +57 -0
- package/dist/client/solid/index.mjs +22 -0
- package/dist/client/solid/index.mjs.map +1 -0
- package/dist/client/solid/solid-store.mjs +24 -0
- package/dist/client/solid/solid-store.mjs.map +1 -0
- package/dist/client/svelte/index.d.mts +63 -0
- package/dist/client/svelte/index.mjs +20 -0
- package/dist/client/svelte/index.mjs.map +1 -0
- package/dist/client/types.d.mts +58 -0
- package/dist/client/vanilla.d.mts +62 -0
- package/dist/client/vanilla.mjs +20 -0
- package/dist/client/vanilla.mjs.map +1 -0
- package/dist/client/vue/index.d.mts +86 -0
- package/dist/client/vue/index.mjs +38 -0
- package/dist/client/vue/index.mjs.map +1 -0
- package/dist/client/vue/vue-store.mjs +26 -0
- package/dist/client/vue/vue-store.mjs.map +1 -0
- package/dist/context/create-context.mjs +211 -0
- package/dist/context/create-context.mjs.map +1 -0
- package/dist/context/helpers.mjs +62 -0
- package/dist/context/helpers.mjs.map +1 -0
- package/dist/context/init-minimal.mjs +20 -0
- package/dist/context/init-minimal.mjs.map +1 -0
- package/dist/context/init.mjs +22 -0
- package/dist/context/init.mjs.map +1 -0
- package/dist/cookies/cookie-utils.d.mts +29 -0
- package/dist/cookies/cookie-utils.mjs +105 -0
- package/dist/cookies/cookie-utils.mjs.map +1 -0
- package/dist/cookies/index.d.mts +67 -0
- package/dist/cookies/index.mjs +264 -0
- package/dist/cookies/index.mjs.map +1 -0
- package/dist/cookies/session-store.d.mts +36 -0
- package/dist/cookies/session-store.mjs +200 -0
- package/dist/cookies/session-store.mjs.map +1 -0
- package/dist/crypto/buffer.d.mts +8 -0
- package/dist/crypto/buffer.mjs +18 -0
- package/dist/crypto/buffer.mjs.map +1 -0
- package/dist/crypto/index.d.mts +27 -0
- package/dist/crypto/index.mjs +38 -0
- package/dist/crypto/index.mjs.map +1 -0
- package/dist/crypto/jwt.d.mts +8 -0
- package/dist/crypto/jwt.mjs +95 -0
- package/dist/crypto/jwt.mjs.map +1 -0
- package/dist/crypto/password.d.mts +12 -0
- package/dist/crypto/password.mjs +36 -0
- package/dist/crypto/password.mjs.map +1 -0
- package/dist/crypto/random.d.mts +5 -0
- package/dist/crypto/random.mjs +8 -0
- package/dist/crypto/random.mjs.map +1 -0
- package/dist/db/adapter-base.d.mts +8 -0
- package/dist/db/adapter-base.mjs +28 -0
- package/dist/db/adapter-base.mjs.map +1 -0
- package/dist/db/adapter-kysely.d.mts +8 -0
- package/dist/db/adapter-kysely.mjs +21 -0
- package/dist/db/adapter-kysely.mjs.map +1 -0
- package/dist/db/field-converter.d.mts +8 -0
- package/dist/db/field-converter.mjs +21 -0
- package/dist/db/field-converter.mjs.map +1 -0
- package/dist/db/field.d.mts +55 -0
- package/dist/db/field.mjs +11 -0
- package/dist/db/field.mjs.map +1 -0
- package/dist/db/get-migration.d.mts +23 -0
- package/dist/db/get-migration.mjs +339 -0
- package/dist/db/get-migration.mjs.map +1 -0
- package/dist/db/get-schema.d.mts +11 -0
- package/dist/db/get-schema.mjs +39 -0
- package/dist/db/get-schema.mjs.map +1 -0
- package/dist/db/index.d.mts +9 -0
- package/dist/db/index.mjs +36 -0
- package/dist/db/index.mjs.map +1 -0
- package/dist/db/internal-adapter.d.mts +14 -0
- package/dist/db/internal-adapter.mjs +616 -0
- package/dist/db/internal-adapter.mjs.map +1 -0
- package/dist/db/schema.d.mts +26 -0
- package/dist/db/schema.mjs +118 -0
- package/dist/db/schema.mjs.map +1 -0
- package/dist/db/to-zod.d.mts +36 -0
- package/dist/db/to-zod.mjs +26 -0
- package/dist/db/to-zod.mjs.map +1 -0
- package/dist/db/verification-token-storage.mjs +28 -0
- package/dist/db/verification-token-storage.mjs.map +1 -0
- package/dist/db/with-hooks.d.mts +33 -0
- package/dist/db/with-hooks.mjs +159 -0
- package/dist/db/with-hooks.mjs.map +1 -0
- package/dist/index.d.mts +52 -0
- package/dist/index.mjs +26 -0
- package/dist/integrations/next-js.d.mts +14 -0
- package/dist/integrations/next-js.mjs +78 -0
- package/dist/integrations/next-js.mjs.map +1 -0
- package/dist/integrations/node.d.mts +13 -0
- package/dist/integrations/node.mjs +16 -0
- package/dist/integrations/node.mjs.map +1 -0
- package/dist/integrations/solid-start.d.mts +23 -0
- package/dist/integrations/solid-start.mjs +17 -0
- package/dist/integrations/solid-start.mjs.map +1 -0
- package/dist/integrations/svelte-kit.d.mts +29 -0
- package/dist/integrations/svelte-kit.mjs +57 -0
- package/dist/integrations/svelte-kit.mjs.map +1 -0
- package/dist/integrations/tanstack-start-solid.d.mts +22 -0
- package/dist/integrations/tanstack-start-solid.mjs +61 -0
- package/dist/integrations/tanstack-start-solid.mjs.map +1 -0
- package/dist/integrations/tanstack-start.d.mts +22 -0
- package/dist/integrations/tanstack-start.mjs +61 -0
- package/dist/integrations/tanstack-start.mjs.map +1 -0
- package/dist/oauth2/index.d.mts +5 -0
- package/dist/oauth2/index.mjs +7 -0
- package/dist/oauth2/link-account.d.mts +31 -0
- package/dist/oauth2/link-account.mjs +144 -0
- package/dist/oauth2/link-account.mjs.map +1 -0
- package/dist/oauth2/state.d.mts +26 -0
- package/dist/oauth2/state.mjs +51 -0
- package/dist/oauth2/state.mjs.map +1 -0
- package/dist/oauth2/utils.d.mts +8 -0
- package/dist/oauth2/utils.mjs +31 -0
- package/dist/oauth2/utils.mjs.map +1 -0
- package/dist/plugins/access/access.d.mts +30 -0
- package/dist/plugins/access/access.mjs +46 -0
- package/dist/plugins/access/access.mjs.map +1 -0
- package/dist/plugins/access/index.d.mts +3 -0
- package/dist/plugins/access/index.mjs +3 -0
- package/dist/plugins/access/types.d.mts +17 -0
- package/dist/plugins/additional-fields/client.d.mts +14 -0
- package/dist/plugins/additional-fields/client.mjs +11 -0
- package/dist/plugins/additional-fields/client.mjs.map +1 -0
- package/dist/plugins/admin/access/index.d.mts +2 -0
- package/dist/plugins/admin/access/index.mjs +3 -0
- package/dist/plugins/admin/access/statement.d.mts +118 -0
- package/dist/plugins/admin/access/statement.mjs +53 -0
- package/dist/plugins/admin/access/statement.mjs.map +1 -0
- package/dist/plugins/admin/admin.d.mts +14 -0
- package/dist/plugins/admin/admin.mjs +95 -0
- package/dist/plugins/admin/admin.mjs.map +1 -0
- package/dist/plugins/admin/client.d.mts +14 -0
- package/dist/plugins/admin/client.mjs +36 -0
- package/dist/plugins/admin/client.mjs.map +1 -0
- package/dist/plugins/admin/error-codes.d.mts +5 -0
- package/dist/plugins/admin/error-codes.mjs +30 -0
- package/dist/plugins/admin/error-codes.mjs.map +1 -0
- package/dist/plugins/admin/has-permission.mjs +16 -0
- package/dist/plugins/admin/has-permission.mjs.map +1 -0
- package/dist/plugins/admin/index.d.mts +3 -0
- package/dist/plugins/admin/index.mjs +3 -0
- package/dist/plugins/admin/routes.mjs +855 -0
- package/dist/plugins/admin/routes.mjs.map +1 -0
- package/dist/plugins/admin/schema.d.mts +6 -0
- package/dist/plugins/admin/schema.mjs +34 -0
- package/dist/plugins/admin/schema.mjs.map +1 -0
- package/dist/plugins/admin/types.d.mts +89 -0
- package/dist/plugins/anonymous/client.d.mts +9 -0
- package/dist/plugins/anonymous/client.mjs +22 -0
- package/dist/plugins/anonymous/client.mjs.map +1 -0
- package/dist/plugins/anonymous/error-codes.d.mts +5 -0
- package/dist/plugins/anonymous/error-codes.mjs +16 -0
- package/dist/plugins/anonymous/error-codes.mjs.map +1 -0
- package/dist/plugins/anonymous/index.d.mts +14 -0
- package/dist/plugins/anonymous/index.mjs +163 -0
- package/dist/plugins/anonymous/index.mjs.map +1 -0
- package/dist/plugins/anonymous/schema.d.mts +5 -0
- package/dist/plugins/anonymous/schema.mjs +11 -0
- package/dist/plugins/anonymous/schema.mjs.map +1 -0
- package/dist/plugins/anonymous/types.d.mts +68 -0
- package/dist/plugins/api-key/adapter.mjs +468 -0
- package/dist/plugins/api-key/adapter.mjs.map +1 -0
- package/dist/plugins/api-key/client.d.mts +9 -0
- package/dist/plugins/api-key/client.mjs +19 -0
- package/dist/plugins/api-key/client.mjs.map +1 -0
- package/dist/plugins/api-key/error-codes.d.mts +5 -0
- package/dist/plugins/api-key/error-codes.mjs +34 -0
- package/dist/plugins/api-key/error-codes.mjs.map +1 -0
- package/dist/plugins/api-key/index.d.mts +17 -0
- package/dist/plugins/api-key/index.mjs +134 -0
- package/dist/plugins/api-key/index.mjs.map +1 -0
- package/dist/plugins/api-key/rate-limit.mjs +74 -0
- package/dist/plugins/api-key/rate-limit.mjs.map +1 -0
- package/dist/plugins/api-key/routes/create-api-key.mjs +252 -0
- package/dist/plugins/api-key/routes/create-api-key.mjs.map +1 -0
- package/dist/plugins/api-key/routes/delete-all-expired-api-keys.mjs +24 -0
- package/dist/plugins/api-key/routes/delete-all-expired-api-keys.mjs.map +1 -0
- package/dist/plugins/api-key/routes/delete-api-key.mjs +74 -0
- package/dist/plugins/api-key/routes/delete-api-key.mjs.map +1 -0
- package/dist/plugins/api-key/routes/get-api-key.mjs +158 -0
- package/dist/plugins/api-key/routes/get-api-key.mjs.map +1 -0
- package/dist/plugins/api-key/routes/index.mjs +71 -0
- package/dist/plugins/api-key/routes/index.mjs.map +1 -0
- package/dist/plugins/api-key/routes/list-api-keys.mjs +194 -0
- package/dist/plugins/api-key/routes/list-api-keys.mjs.map +1 -0
- package/dist/plugins/api-key/routes/update-api-key.mjs +248 -0
- package/dist/plugins/api-key/routes/update-api-key.mjs.map +1 -0
- package/dist/plugins/api-key/routes/verify-api-key.mjs +223 -0
- package/dist/plugins/api-key/routes/verify-api-key.mjs.map +1 -0
- package/dist/plugins/api-key/schema.d.mts +11 -0
- package/dist/plugins/api-key/schema.mjs +130 -0
- package/dist/plugins/api-key/schema.mjs.map +1 -0
- package/dist/plugins/api-key/types.d.mts +346 -0
- package/dist/plugins/bearer/index.d.mts +25 -0
- package/dist/plugins/bearer/index.mjs +66 -0
- package/dist/plugins/bearer/index.mjs.map +1 -0
- package/dist/plugins/captcha/constants.d.mts +10 -0
- package/dist/plugins/captcha/constants.mjs +22 -0
- package/dist/plugins/captcha/constants.mjs.map +1 -0
- package/dist/plugins/captcha/error-codes.mjs +16 -0
- package/dist/plugins/captcha/error-codes.mjs.map +1 -0
- package/dist/plugins/captcha/index.d.mts +14 -0
- package/dist/plugins/captcha/index.mjs +60 -0
- package/dist/plugins/captcha/index.mjs.map +1 -0
- package/dist/plugins/captcha/types.d.mts +28 -0
- package/dist/plugins/captcha/utils.mjs +11 -0
- package/dist/plugins/captcha/utils.mjs.map +1 -0
- package/dist/plugins/captcha/verify-handlers/captchafox.mjs +27 -0
- package/dist/plugins/captcha/verify-handlers/captchafox.mjs.map +1 -0
- package/dist/plugins/captcha/verify-handlers/cloudflare-turnstile.mjs +25 -0
- package/dist/plugins/captcha/verify-handlers/cloudflare-turnstile.mjs.map +1 -0
- package/dist/plugins/captcha/verify-handlers/google-recaptcha.mjs +29 -0
- package/dist/plugins/captcha/verify-handlers/google-recaptcha.mjs.map +1 -0
- package/dist/plugins/captcha/verify-handlers/h-captcha.mjs +27 -0
- package/dist/plugins/captcha/verify-handlers/h-captcha.mjs.map +1 -0
- package/dist/plugins/captcha/verify-handlers/index.mjs +6 -0
- package/dist/plugins/custom-session/client.d.mts +10 -0
- package/dist/plugins/custom-session/client.mjs +11 -0
- package/dist/plugins/custom-session/client.mjs.map +1 -0
- package/dist/plugins/custom-session/index.d.mts +26 -0
- package/dist/plugins/custom-session/index.mjs +70 -0
- package/dist/plugins/custom-session/index.mjs.map +1 -0
- package/dist/plugins/device-authorization/client.d.mts +5 -0
- package/dist/plugins/device-authorization/client.mjs +18 -0
- package/dist/plugins/device-authorization/client.mjs.map +1 -0
- package/dist/plugins/device-authorization/error-codes.mjs +21 -0
- package/dist/plugins/device-authorization/error-codes.mjs.map +1 -0
- package/dist/plugins/device-authorization/index.d.mts +28 -0
- package/dist/plugins/device-authorization/index.mjs +50 -0
- package/dist/plugins/device-authorization/index.mjs.map +1 -0
- package/dist/plugins/device-authorization/routes.mjs +510 -0
- package/dist/plugins/device-authorization/routes.mjs.map +1 -0
- package/dist/plugins/device-authorization/schema.mjs +57 -0
- package/dist/plugins/device-authorization/schema.mjs.map +1 -0
- package/dist/plugins/email-otp/client.d.mts +7 -0
- package/dist/plugins/email-otp/client.mjs +18 -0
- package/dist/plugins/email-otp/client.mjs.map +1 -0
- package/dist/plugins/email-otp/error-codes.d.mts +5 -0
- package/dist/plugins/email-otp/error-codes.mjs +12 -0
- package/dist/plugins/email-otp/error-codes.mjs.map +1 -0
- package/dist/plugins/email-otp/index.d.mts +14 -0
- package/dist/plugins/email-otp/index.mjs +108 -0
- package/dist/plugins/email-otp/index.mjs.map +1 -0
- package/dist/plugins/email-otp/otp-token.mjs +29 -0
- package/dist/plugins/email-otp/otp-token.mjs.map +1 -0
- package/dist/plugins/email-otp/routes.mjs +564 -0
- package/dist/plugins/email-otp/routes.mjs.map +1 -0
- package/dist/plugins/email-otp/types.d.mts +74 -0
- package/dist/plugins/email-otp/utils.mjs +17 -0
- package/dist/plugins/email-otp/utils.mjs.map +1 -0
- package/dist/plugins/generic-oauth/client.d.mts +19 -0
- package/dist/plugins/generic-oauth/client.mjs +14 -0
- package/dist/plugins/generic-oauth/client.mjs.map +1 -0
- package/dist/plugins/generic-oauth/error-codes.d.mts +5 -0
- package/dist/plugins/generic-oauth/error-codes.mjs +15 -0
- package/dist/plugins/generic-oauth/error-codes.mjs.map +1 -0
- package/dist/plugins/generic-oauth/index.d.mts +34 -0
- package/dist/plugins/generic-oauth/index.mjs +137 -0
- package/dist/plugins/generic-oauth/index.mjs.map +1 -0
- package/dist/plugins/generic-oauth/providers/auth0.d.mts +37 -0
- package/dist/plugins/generic-oauth/providers/auth0.mjs +62 -0
- package/dist/plugins/generic-oauth/providers/auth0.mjs.map +1 -0
- package/dist/plugins/generic-oauth/providers/gumroad.d.mts +32 -0
- package/dist/plugins/generic-oauth/providers/gumroad.mjs +60 -0
- package/dist/plugins/generic-oauth/providers/gumroad.mjs.map +1 -0
- package/dist/plugins/generic-oauth/providers/hubspot.d.mts +37 -0
- package/dist/plugins/generic-oauth/providers/hubspot.mjs +60 -0
- package/dist/plugins/generic-oauth/providers/hubspot.mjs.map +1 -0
- package/dist/plugins/generic-oauth/providers/index.d.mts +9 -0
- package/dist/plugins/generic-oauth/providers/index.mjs +11 -0
- package/dist/plugins/generic-oauth/providers/keycloak.d.mts +37 -0
- package/dist/plugins/generic-oauth/providers/keycloak.mjs +62 -0
- package/dist/plugins/generic-oauth/providers/keycloak.mjs.map +1 -0
- package/dist/plugins/generic-oauth/providers/line.d.mts +55 -0
- package/dist/plugins/generic-oauth/providers/line.mjs +91 -0
- package/dist/plugins/generic-oauth/providers/line.mjs.map +1 -0
- package/dist/plugins/generic-oauth/providers/microsoft-entra-id.d.mts +37 -0
- package/dist/plugins/generic-oauth/providers/microsoft-entra-id.mjs +66 -0
- package/dist/plugins/generic-oauth/providers/microsoft-entra-id.mjs.map +1 -0
- package/dist/plugins/generic-oauth/providers/okta.d.mts +37 -0
- package/dist/plugins/generic-oauth/providers/okta.mjs +62 -0
- package/dist/plugins/generic-oauth/providers/okta.mjs.map +1 -0
- package/dist/plugins/generic-oauth/providers/patreon.d.mts +30 -0
- package/dist/plugins/generic-oauth/providers/patreon.mjs +59 -0
- package/dist/plugins/generic-oauth/providers/patreon.mjs.map +1 -0
- package/dist/plugins/generic-oauth/providers/slack.d.mts +30 -0
- package/dist/plugins/generic-oauth/providers/slack.mjs +61 -0
- package/dist/plugins/generic-oauth/providers/slack.mjs.map +1 -0
- package/dist/plugins/generic-oauth/routes.mjs +394 -0
- package/dist/plugins/generic-oauth/routes.mjs.map +1 -0
- package/dist/plugins/generic-oauth/types.d.mts +145 -0
- package/dist/plugins/haveibeenpwned/index.d.mts +21 -0
- package/dist/plugins/haveibeenpwned/index.mjs +56 -0
- package/dist/plugins/haveibeenpwned/index.mjs.map +1 -0
- package/dist/plugins/index.d.mts +68 -0
- package/dist/plugins/index.mjs +51 -0
- package/dist/plugins/jwt/adapter.mjs +27 -0
- package/dist/plugins/jwt/adapter.mjs.map +1 -0
- package/dist/plugins/jwt/client.d.mts +18 -0
- package/dist/plugins/jwt/client.mjs +19 -0
- package/dist/plugins/jwt/client.mjs.map +1 -0
- package/dist/plugins/jwt/index.d.mts +17 -0
- package/dist/plugins/jwt/index.mjs +202 -0
- package/dist/plugins/jwt/index.mjs.map +1 -0
- package/dist/plugins/jwt/schema.d.mts +5 -0
- package/dist/plugins/jwt/schema.mjs +23 -0
- package/dist/plugins/jwt/schema.mjs.map +1 -0
- package/dist/plugins/jwt/sign.d.mts +57 -0
- package/dist/plugins/jwt/sign.mjs +66 -0
- package/dist/plugins/jwt/sign.mjs.map +1 -0
- package/dist/plugins/jwt/types.d.mts +194 -0
- package/dist/plugins/jwt/utils.d.mts +42 -0
- package/dist/plugins/jwt/utils.mjs +64 -0
- package/dist/plugins/jwt/utils.mjs.map +1 -0
- package/dist/plugins/jwt/verify.d.mts +12 -0
- package/dist/plugins/jwt/verify.mjs +46 -0
- package/dist/plugins/jwt/verify.mjs.map +1 -0
- package/dist/plugins/last-login-method/client.d.mts +18 -0
- package/dist/plugins/last-login-method/client.mjs +32 -0
- package/dist/plugins/last-login-method/client.mjs.map +1 -0
- package/dist/plugins/last-login-method/index.d.mts +52 -0
- package/dist/plugins/last-login-method/index.mjs +77 -0
- package/dist/plugins/last-login-method/index.mjs.map +1 -0
- package/dist/plugins/magic-link/client.d.mts +5 -0
- package/dist/plugins/magic-link/client.mjs +11 -0
- package/dist/plugins/magic-link/client.mjs.map +1 -0
- package/dist/plugins/magic-link/index.d.mts +61 -0
- package/dist/plugins/magic-link/index.mjs +167 -0
- package/dist/plugins/magic-link/index.mjs.map +1 -0
- package/dist/plugins/magic-link/utils.mjs +12 -0
- package/dist/plugins/magic-link/utils.mjs.map +1 -0
- package/dist/plugins/mcp/authorize.mjs +133 -0
- package/dist/plugins/mcp/authorize.mjs.map +1 -0
- package/dist/plugins/mcp/index.d.mts +46 -0
- package/dist/plugins/mcp/index.mjs +717 -0
- package/dist/plugins/mcp/index.mjs.map +1 -0
- package/dist/plugins/multi-session/client.d.mts +8 -0
- package/dist/plugins/multi-session/client.mjs +20 -0
- package/dist/plugins/multi-session/client.mjs.map +1 -0
- package/dist/plugins/multi-session/error-codes.d.mts +5 -0
- package/dist/plugins/multi-session/error-codes.mjs +8 -0
- package/dist/plugins/multi-session/error-codes.mjs.map +1 -0
- package/dist/plugins/multi-session/index.d.mts +22 -0
- package/dist/plugins/multi-session/index.mjs +172 -0
- package/dist/plugins/multi-session/index.mjs.map +1 -0
- package/dist/plugins/oauth-proxy/index.d.mts +39 -0
- package/dist/plugins/oauth-proxy/index.mjs +305 -0
- package/dist/plugins/oauth-proxy/index.mjs.map +1 -0
- package/dist/plugins/oauth-proxy/utils.mjs +44 -0
- package/dist/plugins/oauth-proxy/utils.mjs.map +1 -0
- package/dist/plugins/oidc-provider/authorize.mjs +194 -0
- package/dist/plugins/oidc-provider/authorize.mjs.map +1 -0
- package/dist/plugins/oidc-provider/client.d.mts +8 -0
- package/dist/plugins/oidc-provider/client.mjs +11 -0
- package/dist/plugins/oidc-provider/client.mjs.map +1 -0
- package/dist/plugins/oidc-provider/error.mjs +17 -0
- package/dist/plugins/oidc-provider/error.mjs.map +1 -0
- package/dist/plugins/oidc-provider/index.d.mts +32 -0
- package/dist/plugins/oidc-provider/index.mjs +1093 -0
- package/dist/plugins/oidc-provider/index.mjs.map +1 -0
- package/dist/plugins/oidc-provider/schema.d.mts +26 -0
- package/dist/plugins/oidc-provider/schema.mjs +132 -0
- package/dist/plugins/oidc-provider/schema.mjs.map +1 -0
- package/dist/plugins/oidc-provider/types.d.mts +517 -0
- package/dist/plugins/oidc-provider/utils/prompt.mjs +19 -0
- package/dist/plugins/oidc-provider/utils/prompt.mjs.map +1 -0
- package/dist/plugins/oidc-provider/utils.mjs +15 -0
- package/dist/plugins/oidc-provider/utils.mjs.map +1 -0
- package/dist/plugins/one-tap/client.d.mts +159 -0
- package/dist/plugins/one-tap/client.mjs +214 -0
- package/dist/plugins/one-tap/client.mjs.map +1 -0
- package/dist/plugins/one-tap/index.d.mts +27 -0
- package/dist/plugins/one-tap/index.mjs +96 -0
- package/dist/plugins/one-tap/index.mjs.map +1 -0
- package/dist/plugins/one-time-token/client.d.mts +7 -0
- package/dist/plugins/one-time-token/client.mjs +11 -0
- package/dist/plugins/one-time-token/client.mjs.map +1 -0
- package/dist/plugins/one-time-token/index.d.mts +53 -0
- package/dist/plugins/one-time-token/index.mjs +82 -0
- package/dist/plugins/one-time-token/index.mjs.map +1 -0
- package/dist/plugins/one-time-token/utils.mjs +12 -0
- package/dist/plugins/one-time-token/utils.mjs.map +1 -0
- package/dist/plugins/open-api/generator.d.mts +115 -0
- package/dist/plugins/open-api/generator.mjs +315 -0
- package/dist/plugins/open-api/generator.mjs.map +1 -0
- package/dist/plugins/open-api/index.d.mts +45 -0
- package/dist/plugins/open-api/index.mjs +67 -0
- package/dist/plugins/open-api/index.mjs.map +1 -0
- package/dist/plugins/open-api/logo.mjs +15 -0
- package/dist/plugins/open-api/logo.mjs.map +1 -0
- package/dist/plugins/organization/access/index.d.mts +2 -0
- package/dist/plugins/organization/access/index.mjs +3 -0
- package/dist/plugins/organization/access/statement.d.mts +249 -0
- package/dist/plugins/organization/access/statement.mjs +81 -0
- package/dist/plugins/organization/access/statement.mjs.map +1 -0
- package/dist/plugins/organization/adapter.d.mts +205 -0
- package/dist/plugins/organization/adapter.mjs +624 -0
- package/dist/plugins/organization/adapter.mjs.map +1 -0
- package/dist/plugins/organization/call.mjs +19 -0
- package/dist/plugins/organization/call.mjs.map +1 -0
- package/dist/plugins/organization/client.d.mts +151 -0
- package/dist/plugins/organization/client.mjs +107 -0
- package/dist/plugins/organization/client.mjs.map +1 -0
- package/dist/plugins/organization/error-codes.d.mts +5 -0
- package/dist/plugins/organization/error-codes.mjs +65 -0
- package/dist/plugins/organization/error-codes.mjs.map +1 -0
- package/dist/plugins/organization/has-permission.mjs +35 -0
- package/dist/plugins/organization/has-permission.mjs.map +1 -0
- package/dist/plugins/organization/index.d.mts +5 -0
- package/dist/plugins/organization/index.mjs +4 -0
- package/dist/plugins/organization/organization.d.mts +252 -0
- package/dist/plugins/organization/organization.mjs +428 -0
- package/dist/plugins/organization/organization.mjs.map +1 -0
- package/dist/plugins/organization/permission.d.mts +26 -0
- package/dist/plugins/organization/permission.mjs +16 -0
- package/dist/plugins/organization/permission.mjs.map +1 -0
- package/dist/plugins/organization/routes/crud-access-control.d.mts +11 -0
- package/dist/plugins/organization/routes/crud-access-control.mjs +656 -0
- package/dist/plugins/organization/routes/crud-access-control.mjs.map +1 -0
- package/dist/plugins/organization/routes/crud-invites.d.mts +16 -0
- package/dist/plugins/organization/routes/crud-invites.mjs +555 -0
- package/dist/plugins/organization/routes/crud-invites.mjs.map +1 -0
- package/dist/plugins/organization/routes/crud-members.d.mts +13 -0
- package/dist/plugins/organization/routes/crud-members.mjs +473 -0
- package/dist/plugins/organization/routes/crud-members.mjs.map +1 -0
- package/dist/plugins/organization/routes/crud-org.d.mts +13 -0
- package/dist/plugins/organization/routes/crud-org.mjs +447 -0
- package/dist/plugins/organization/routes/crud-org.mjs.map +1 -0
- package/dist/plugins/organization/routes/crud-team.d.mts +15 -0
- package/dist/plugins/organization/routes/crud-team.mjs +676 -0
- package/dist/plugins/organization/routes/crud-team.mjs.map +1 -0
- package/dist/plugins/organization/schema.d.mts +376 -0
- package/dist/plugins/organization/schema.mjs +68 -0
- package/dist/plugins/organization/schema.mjs.map +1 -0
- package/dist/plugins/organization/types.d.mts +733 -0
- package/dist/plugins/phone-number/client.d.mts +8 -0
- package/dist/plugins/phone-number/client.mjs +20 -0
- package/dist/plugins/phone-number/client.mjs.map +1 -0
- package/dist/plugins/phone-number/error-codes.d.mts +5 -0
- package/dist/plugins/phone-number/error-codes.mjs +21 -0
- package/dist/plugins/phone-number/error-codes.mjs.map +1 -0
- package/dist/plugins/phone-number/index.d.mts +14 -0
- package/dist/plugins/phone-number/index.mjs +49 -0
- package/dist/plugins/phone-number/index.mjs.map +1 -0
- package/dist/plugins/phone-number/routes.mjs +459 -0
- package/dist/plugins/phone-number/routes.mjs.map +1 -0
- package/dist/plugins/phone-number/schema.d.mts +5 -0
- package/dist/plugins/phone-number/schema.mjs +20 -0
- package/dist/plugins/phone-number/schema.mjs.map +1 -0
- package/dist/plugins/phone-number/types.d.mts +118 -0
- package/dist/plugins/siwe/client.d.mts +5 -0
- package/dist/plugins/siwe/client.mjs +11 -0
- package/dist/plugins/siwe/client.mjs.map +1 -0
- package/dist/plugins/siwe/error-codes.mjs +13 -0
- package/dist/plugins/siwe/error-codes.mjs.map +1 -0
- package/dist/plugins/siwe/index.d.mts +26 -0
- package/dist/plugins/siwe/index.mjs +261 -0
- package/dist/plugins/siwe/index.mjs.map +1 -0
- package/dist/plugins/siwe/schema.d.mts +5 -0
- package/dist/plugins/siwe/schema.mjs +32 -0
- package/dist/plugins/siwe/schema.mjs.map +1 -0
- package/dist/plugins/siwe/types.d.mts +44 -0
- package/dist/plugins/two-factor/backup-codes/index.d.mts +91 -0
- package/dist/plugins/two-factor/backup-codes/index.mjs +277 -0
- package/dist/plugins/two-factor/backup-codes/index.mjs.map +1 -0
- package/dist/plugins/two-factor/client.d.mts +17 -0
- package/dist/plugins/two-factor/client.mjs +37 -0
- package/dist/plugins/two-factor/client.mjs.map +1 -0
- package/dist/plugins/two-factor/constant.mjs +8 -0
- package/dist/plugins/two-factor/constant.mjs.map +1 -0
- package/dist/plugins/two-factor/error-code.d.mts +5 -0
- package/dist/plugins/two-factor/error-code.mjs +18 -0
- package/dist/plugins/two-factor/error-code.mjs.map +1 -0
- package/dist/plugins/two-factor/index.d.mts +19 -0
- package/dist/plugins/two-factor/index.mjs +207 -0
- package/dist/plugins/two-factor/index.mjs.map +1 -0
- package/dist/plugins/two-factor/otp/index.d.mts +96 -0
- package/dist/plugins/two-factor/otp/index.mjs +199 -0
- package/dist/plugins/two-factor/otp/index.mjs.map +1 -0
- package/dist/plugins/two-factor/schema.d.mts +5 -0
- package/dist/plugins/two-factor/schema.mjs +36 -0
- package/dist/plugins/two-factor/schema.mjs.map +1 -0
- package/dist/plugins/two-factor/totp/index.d.mts +81 -0
- package/dist/plugins/two-factor/totp/index.mjs +157 -0
- package/dist/plugins/two-factor/totp/index.mjs.map +1 -0
- package/dist/plugins/two-factor/types.d.mts +65 -0
- package/dist/plugins/two-factor/utils.mjs +12 -0
- package/dist/plugins/two-factor/utils.mjs.map +1 -0
- package/dist/plugins/two-factor/verify-two-factor.mjs +76 -0
- package/dist/plugins/two-factor/verify-two-factor.mjs.map +1 -0
- package/dist/plugins/username/client.d.mts +7 -0
- package/dist/plugins/username/client.mjs +18 -0
- package/dist/plugins/username/client.mjs.map +1 -0
- package/dist/plugins/username/error-codes.d.mts +5 -0
- package/dist/plugins/username/error-codes.mjs +17 -0
- package/dist/plugins/username/error-codes.mjs.map +1 -0
- package/dist/plugins/username/index.d.mts +74 -0
- package/dist/plugins/username/index.mjs +237 -0
- package/dist/plugins/username/index.mjs.map +1 -0
- package/dist/plugins/username/schema.d.mts +9 -0
- package/dist/plugins/username/schema.mjs +26 -0
- package/dist/plugins/username/schema.mjs.map +1 -0
- package/dist/social-providers/index.d.mts +1 -0
- package/dist/social-providers/index.mjs +3 -0
- package/dist/state.d.mts +42 -0
- package/dist/state.mjs +107 -0
- package/dist/state.mjs.map +1 -0
- package/dist/test-utils/headers.d.mts +9 -0
- package/dist/test-utils/headers.mjs +24 -0
- package/dist/test-utils/headers.mjs.map +1 -0
- package/dist/test-utils/index.d.mts +3 -0
- package/dist/test-utils/index.mjs +4 -0
- package/dist/test-utils/test-instance.d.mts +181 -0
- package/dist/test-utils/test-instance.mjs +210 -0
- package/dist/test-utils/test-instance.mjs.map +1 -0
- package/dist/types/adapter.d.mts +24 -0
- package/dist/types/api.d.mts +29 -0
- package/dist/types/auth.d.mts +30 -0
- package/dist/types/helper.d.mts +21 -0
- package/dist/types/index.d.mts +11 -0
- package/dist/types/index.mjs +1 -0
- package/dist/types/models.d.mts +17 -0
- package/dist/types/plugins.d.mts +16 -0
- package/dist/utils/boolean.mjs +8 -0
- package/dist/utils/boolean.mjs.map +1 -0
- package/dist/utils/constants.mjs +6 -0
- package/dist/utils/constants.mjs.map +1 -0
- package/dist/utils/date.mjs +8 -0
- package/dist/utils/date.mjs.map +1 -0
- package/dist/utils/get-request-ip.d.mts +7 -0
- package/dist/utils/get-request-ip.mjs +23 -0
- package/dist/utils/get-request-ip.mjs.map +1 -0
- package/dist/utils/hashing.mjs +21 -0
- package/dist/utils/hashing.mjs.map +1 -0
- package/dist/utils/hide-metadata.d.mts +7 -0
- package/dist/utils/hide-metadata.mjs +6 -0
- package/dist/utils/hide-metadata.mjs.map +1 -0
- package/dist/utils/index.d.mts +3 -0
- package/dist/utils/index.mjs +5 -0
- package/dist/utils/is-api-error.d.mts +7 -0
- package/dist/utils/is-api-error.mjs +11 -0
- package/dist/utils/is-api-error.mjs.map +1 -0
- package/dist/utils/is-atom.mjs +8 -0
- package/dist/utils/is-atom.mjs.map +1 -0
- package/dist/utils/is-promise.mjs +8 -0
- package/dist/utils/is-promise.mjs.map +1 -0
- package/dist/utils/middleware-response.mjs +6 -0
- package/dist/utils/middleware-response.mjs.map +1 -0
- package/dist/utils/password.mjs +26 -0
- package/dist/utils/password.mjs.map +1 -0
- package/dist/utils/plugin-helper.mjs +17 -0
- package/dist/utils/plugin-helper.mjs.map +1 -0
- package/dist/utils/shim.mjs +24 -0
- package/dist/utils/shim.mjs.map +1 -0
- package/dist/utils/time.d.mts +49 -0
- package/dist/utils/time.mjs +100 -0
- package/dist/utils/time.mjs.map +1 -0
- package/dist/utils/url.mjs +92 -0
- package/dist/utils/url.mjs.map +1 -0
- package/dist/utils/wildcard.mjs +108 -0
- package/dist/utils/wildcard.mjs.map +1 -0
- package/package.json +601 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { mergeSchema, parseUserOutput } from "../../db/schema.mjs";
|
|
2
|
+
import { setSessionCookie } from "../../cookies/index.mjs";
|
|
3
|
+
import "../../db/index.mjs";
|
|
4
|
+
import { createEmailVerificationToken } from "../../api/routes/email-verification.mjs";
|
|
5
|
+
import "../../api/index.mjs";
|
|
6
|
+
import { USERNAME_ERROR_CODES } from "./error-codes.mjs";
|
|
7
|
+
import { getSchema } from "./schema.mjs";
|
|
8
|
+
import { APIError, BASE_ERROR_CODES } from "@better-auth/core/error";
|
|
9
|
+
import { createAuthEndpoint, createAuthMiddleware } from "@better-auth/core/api";
|
|
10
|
+
import * as z from "zod";
|
|
11
|
+
|
|
12
|
+
//#region src/plugins/username/index.ts
|
|
13
|
+
function defaultUsernameValidator(username) {
|
|
14
|
+
return /^[a-zA-Z0-9_.]+$/.test(username);
|
|
15
|
+
}
|
|
16
|
+
const signInUsernameBodySchema = z.object({
|
|
17
|
+
username: z.string().meta({ description: "The username of the user" }),
|
|
18
|
+
password: z.string().meta({ description: "The password of the user" }),
|
|
19
|
+
rememberMe: z.boolean().meta({ description: "Remember the user session" }).optional(),
|
|
20
|
+
callbackURL: z.string().meta({ description: "The URL to redirect to after email verification" }).optional()
|
|
21
|
+
});
|
|
22
|
+
const isUsernameAvailableBodySchema = z.object({ username: z.string().meta({ description: "The username to check" }) });
|
|
23
|
+
const username = (options) => {
|
|
24
|
+
const normalizer = (username) => {
|
|
25
|
+
if (options?.usernameNormalization === false) return username;
|
|
26
|
+
if (options?.usernameNormalization) return options.usernameNormalization(username);
|
|
27
|
+
return username.toLowerCase();
|
|
28
|
+
};
|
|
29
|
+
const displayUsernameNormalizer = (displayUsername) => {
|
|
30
|
+
return options?.displayUsernameNormalization ? options.displayUsernameNormalization(displayUsername) : displayUsername;
|
|
31
|
+
};
|
|
32
|
+
return {
|
|
33
|
+
id: "username",
|
|
34
|
+
init(ctx) {
|
|
35
|
+
return { options: { databaseHooks: { user: {
|
|
36
|
+
create: { async before(user, context) {
|
|
37
|
+
const username = "username" in user ? user.username : null;
|
|
38
|
+
const displayUsername = "displayUsername" in user ? user.displayUsername : null;
|
|
39
|
+
return { data: {
|
|
40
|
+
...user,
|
|
41
|
+
...username ? { username: normalizer(username) } : {},
|
|
42
|
+
...displayUsername ? { displayUsername: displayUsernameNormalizer(displayUsername) } : {}
|
|
43
|
+
} };
|
|
44
|
+
} },
|
|
45
|
+
update: { async before(user, context) {
|
|
46
|
+
const username = "username" in user ? user.username : null;
|
|
47
|
+
const displayUsername = "displayUsername" in user ? user.displayUsername : null;
|
|
48
|
+
return { data: {
|
|
49
|
+
...user,
|
|
50
|
+
...username ? { username: normalizer(username) } : {},
|
|
51
|
+
...displayUsername ? { displayUsername: displayUsernameNormalizer(displayUsername) } : {}
|
|
52
|
+
} };
|
|
53
|
+
} }
|
|
54
|
+
} } } };
|
|
55
|
+
},
|
|
56
|
+
endpoints: {
|
|
57
|
+
signInUsername: createAuthEndpoint("/sign-in/username", {
|
|
58
|
+
method: "POST",
|
|
59
|
+
body: signInUsernameBodySchema,
|
|
60
|
+
metadata: { openapi: {
|
|
61
|
+
summary: "Sign in with username",
|
|
62
|
+
description: "Sign in with username",
|
|
63
|
+
responses: {
|
|
64
|
+
200: {
|
|
65
|
+
description: "Success",
|
|
66
|
+
content: { "application/json": { schema: {
|
|
67
|
+
type: "object",
|
|
68
|
+
properties: {
|
|
69
|
+
token: {
|
|
70
|
+
type: "string",
|
|
71
|
+
description: "Session token for the authenticated session"
|
|
72
|
+
},
|
|
73
|
+
user: { $ref: "#/components/schemas/User" }
|
|
74
|
+
},
|
|
75
|
+
required: ["token", "user"]
|
|
76
|
+
} } }
|
|
77
|
+
},
|
|
78
|
+
422: {
|
|
79
|
+
description: "Unprocessable Entity. Validation error",
|
|
80
|
+
content: { "application/json": { schema: {
|
|
81
|
+
type: "object",
|
|
82
|
+
properties: { message: { type: "string" } }
|
|
83
|
+
} } }
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
} }
|
|
87
|
+
}, async (ctx) => {
|
|
88
|
+
if (!ctx.body.username || !ctx.body.password) {
|
|
89
|
+
ctx.context.logger.error("Username or password not found");
|
|
90
|
+
throw APIError.from("UNAUTHORIZED", USERNAME_ERROR_CODES.INVALID_USERNAME_OR_PASSWORD);
|
|
91
|
+
}
|
|
92
|
+
const username = options?.validationOrder?.username === "pre-normalization" ? normalizer(ctx.body.username) : ctx.body.username;
|
|
93
|
+
const minUsernameLength = options?.minUsernameLength || 3;
|
|
94
|
+
const maxUsernameLength = options?.maxUsernameLength || 30;
|
|
95
|
+
if (username.length < minUsernameLength) {
|
|
96
|
+
ctx.context.logger.error("Username too short", { username });
|
|
97
|
+
throw APIError.from("UNPROCESSABLE_ENTITY", USERNAME_ERROR_CODES.USERNAME_TOO_SHORT);
|
|
98
|
+
}
|
|
99
|
+
if (username.length > maxUsernameLength) {
|
|
100
|
+
ctx.context.logger.error("Username too long", { username });
|
|
101
|
+
throw APIError.from("UNPROCESSABLE_ENTITY", USERNAME_ERROR_CODES.USERNAME_TOO_LONG);
|
|
102
|
+
}
|
|
103
|
+
if (!await (options?.usernameValidator || defaultUsernameValidator)(username)) throw APIError.from("UNPROCESSABLE_ENTITY", USERNAME_ERROR_CODES.INVALID_USERNAME);
|
|
104
|
+
const user = await ctx.context.adapter.findOne({
|
|
105
|
+
model: "user",
|
|
106
|
+
where: [{
|
|
107
|
+
field: "username",
|
|
108
|
+
value: normalizer(username)
|
|
109
|
+
}]
|
|
110
|
+
});
|
|
111
|
+
if (!user) {
|
|
112
|
+
await ctx.context.password.hash(ctx.body.password);
|
|
113
|
+
ctx.context.logger.error("User not found", { username });
|
|
114
|
+
throw APIError.from("UNAUTHORIZED", USERNAME_ERROR_CODES.INVALID_USERNAME_OR_PASSWORD);
|
|
115
|
+
}
|
|
116
|
+
const account = await ctx.context.adapter.findOne({
|
|
117
|
+
model: "account",
|
|
118
|
+
where: [{
|
|
119
|
+
field: "userId",
|
|
120
|
+
value: user.id
|
|
121
|
+
}, {
|
|
122
|
+
field: "providerId",
|
|
123
|
+
value: "credential"
|
|
124
|
+
}]
|
|
125
|
+
});
|
|
126
|
+
if (!account) throw APIError.from("UNAUTHORIZED", USERNAME_ERROR_CODES.INVALID_USERNAME_OR_PASSWORD);
|
|
127
|
+
const currentPassword = account?.password;
|
|
128
|
+
if (!currentPassword) {
|
|
129
|
+
ctx.context.logger.error("Password not found", { username });
|
|
130
|
+
throw APIError.from("UNAUTHORIZED", USERNAME_ERROR_CODES.INVALID_USERNAME_OR_PASSWORD);
|
|
131
|
+
}
|
|
132
|
+
if (!await ctx.context.password.verify({
|
|
133
|
+
hash: currentPassword,
|
|
134
|
+
password: ctx.body.password
|
|
135
|
+
})) {
|
|
136
|
+
ctx.context.logger.error("Invalid password");
|
|
137
|
+
throw APIError.from("UNAUTHORIZED", USERNAME_ERROR_CODES.INVALID_USERNAME_OR_PASSWORD);
|
|
138
|
+
}
|
|
139
|
+
if (ctx.context.options?.emailAndPassword?.requireEmailVerification && !user.emailVerified) {
|
|
140
|
+
if (!ctx.context.options?.emailVerification?.sendVerificationEmail) throw APIError.from("FORBIDDEN", USERNAME_ERROR_CODES.EMAIL_NOT_VERIFIED);
|
|
141
|
+
if (ctx.context.options?.emailVerification?.sendOnSignIn) {
|
|
142
|
+
const token = await createEmailVerificationToken(ctx.context.secret, user.email, void 0, ctx.context.options.emailVerification?.expiresIn);
|
|
143
|
+
const url = `${ctx.context.baseURL}/verify-email?token=${token}&callbackURL=${ctx.body.callbackURL || "/"}`;
|
|
144
|
+
await ctx.context.runInBackgroundOrAwait(ctx.context.options.emailVerification.sendVerificationEmail({
|
|
145
|
+
user,
|
|
146
|
+
url,
|
|
147
|
+
token
|
|
148
|
+
}, ctx.request));
|
|
149
|
+
}
|
|
150
|
+
throw APIError.from("FORBIDDEN", USERNAME_ERROR_CODES.EMAIL_NOT_VERIFIED);
|
|
151
|
+
}
|
|
152
|
+
const session = await ctx.context.internalAdapter.createSession(user.id, ctx.body.rememberMe === false);
|
|
153
|
+
if (!session) return ctx.json(null, {
|
|
154
|
+
status: 500,
|
|
155
|
+
body: { message: BASE_ERROR_CODES.FAILED_TO_CREATE_SESSION.message }
|
|
156
|
+
});
|
|
157
|
+
await setSessionCookie(ctx, {
|
|
158
|
+
session,
|
|
159
|
+
user
|
|
160
|
+
}, ctx.body.rememberMe === false);
|
|
161
|
+
return ctx.json({
|
|
162
|
+
token: session.token,
|
|
163
|
+
user: parseUserOutput(ctx.context.options, user)
|
|
164
|
+
});
|
|
165
|
+
}),
|
|
166
|
+
isUsernameAvailable: createAuthEndpoint("/is-username-available", {
|
|
167
|
+
method: "POST",
|
|
168
|
+
body: isUsernameAvailableBodySchema
|
|
169
|
+
}, async (ctx) => {
|
|
170
|
+
const username = ctx.body.username;
|
|
171
|
+
if (!username) throw APIError.from("UNPROCESSABLE_ENTITY", USERNAME_ERROR_CODES.INVALID_USERNAME);
|
|
172
|
+
const minUsernameLength = options?.minUsernameLength || 3;
|
|
173
|
+
const maxUsernameLength = options?.maxUsernameLength || 30;
|
|
174
|
+
if (username.length < minUsernameLength) throw APIError.from("UNPROCESSABLE_ENTITY", USERNAME_ERROR_CODES.USERNAME_TOO_SHORT);
|
|
175
|
+
if (username.length > maxUsernameLength) throw APIError.from("UNPROCESSABLE_ENTITY", USERNAME_ERROR_CODES.USERNAME_TOO_LONG);
|
|
176
|
+
if (!await (options?.usernameValidator || defaultUsernameValidator)(username)) throw APIError.from("UNPROCESSABLE_ENTITY", USERNAME_ERROR_CODES.INVALID_USERNAME);
|
|
177
|
+
if (await ctx.context.adapter.findOne({
|
|
178
|
+
model: "user",
|
|
179
|
+
where: [{
|
|
180
|
+
field: "username",
|
|
181
|
+
value: normalizer(username)
|
|
182
|
+
}]
|
|
183
|
+
})) return ctx.json({ available: false });
|
|
184
|
+
return ctx.json({ available: true });
|
|
185
|
+
})
|
|
186
|
+
},
|
|
187
|
+
schema: mergeSchema(getSchema({
|
|
188
|
+
username: normalizer,
|
|
189
|
+
displayUsername: displayUsernameNormalizer
|
|
190
|
+
}), options?.schema),
|
|
191
|
+
hooks: { before: [{
|
|
192
|
+
matcher(context) {
|
|
193
|
+
return context.path === "/sign-up/email" || context.path === "/update-user";
|
|
194
|
+
},
|
|
195
|
+
handler: createAuthMiddleware(async (ctx) => {
|
|
196
|
+
const username = typeof ctx.body.username === "string" && options?.validationOrder?.username === "post-normalization" ? normalizer(ctx.body.username) : ctx.body.username;
|
|
197
|
+
if (username !== void 0 && typeof username === "string") {
|
|
198
|
+
const minUsernameLength = options?.minUsernameLength || 3;
|
|
199
|
+
const maxUsernameLength = options?.maxUsernameLength || 30;
|
|
200
|
+
if (username.length < minUsernameLength) throw APIError.from("BAD_REQUEST", USERNAME_ERROR_CODES.USERNAME_TOO_SHORT);
|
|
201
|
+
if (username.length > maxUsernameLength) throw APIError.from("BAD_REQUEST", USERNAME_ERROR_CODES.USERNAME_TOO_LONG);
|
|
202
|
+
if (!await (options?.usernameValidator || defaultUsernameValidator)(username)) throw APIError.from("BAD_REQUEST", USERNAME_ERROR_CODES.INVALID_USERNAME);
|
|
203
|
+
const user = await ctx.context.adapter.findOne({
|
|
204
|
+
model: "user",
|
|
205
|
+
where: [{
|
|
206
|
+
field: "username",
|
|
207
|
+
value: username
|
|
208
|
+
}]
|
|
209
|
+
});
|
|
210
|
+
const blockChangeSignUp = ctx.path === "/sign-up/email" && user;
|
|
211
|
+
const blockChangeUpdateUser = ctx.path === "/update-user" && user && ctx.context.session && user.id !== ctx.context.session.session.userId;
|
|
212
|
+
if (blockChangeSignUp || blockChangeUpdateUser) throw APIError.from("BAD_REQUEST", USERNAME_ERROR_CODES.USERNAME_IS_ALREADY_TAKEN);
|
|
213
|
+
}
|
|
214
|
+
const displayUsername = typeof ctx.body.displayUsername === "string" && options?.validationOrder?.displayUsername === "post-normalization" ? displayUsernameNormalizer(ctx.body.displayUsername) : ctx.body.displayUsername;
|
|
215
|
+
if (displayUsername !== void 0 && typeof displayUsername === "string") {
|
|
216
|
+
if (options?.displayUsernameValidator) {
|
|
217
|
+
if (!await options.displayUsernameValidator(displayUsername)) throw APIError.from("BAD_REQUEST", USERNAME_ERROR_CODES.INVALID_DISPLAY_USERNAME);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
})
|
|
221
|
+
}, {
|
|
222
|
+
matcher(context) {
|
|
223
|
+
return context.path === "/sign-up/email" || context.path === "/update-user";
|
|
224
|
+
},
|
|
225
|
+
handler: createAuthMiddleware(async (ctx) => {
|
|
226
|
+
if (ctx.body.username && !ctx.body.displayUsername) ctx.body.displayUsername = ctx.body.username;
|
|
227
|
+
if (ctx.body.displayUsername && !ctx.body.username) ctx.body.username = ctx.body.displayUsername;
|
|
228
|
+
})
|
|
229
|
+
}] },
|
|
230
|
+
options,
|
|
231
|
+
$ERROR_CODES: USERNAME_ERROR_CODES
|
|
232
|
+
};
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
//#endregion
|
|
236
|
+
export { USERNAME_ERROR_CODES, username };
|
|
237
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["ERROR_CODES"],"sources":["../../../src/plugins/username/index.ts"],"sourcesContent":["import type { BetterAuthPlugin } from \"@better-auth/core\";\nimport {\n\tcreateAuthEndpoint,\n\tcreateAuthMiddleware,\n} from \"@better-auth/core/api\";\nimport type { Account, User } from \"@better-auth/core/db\";\nimport { APIError, BASE_ERROR_CODES } from \"@better-auth/core/error\";\nimport * as z from \"zod\";\nimport { createEmailVerificationToken } from \"../../api\";\nimport { setSessionCookie } from \"../../cookies\";\nimport { mergeSchema, parseUserOutput } from \"../../db\";\nimport type { InferOptionSchema } from \"../../types/plugins\";\nimport { USERNAME_ERROR_CODES as ERROR_CODES } from \"./error-codes\";\nimport type { UsernameSchema } from \"./schema\";\nimport { getSchema } from \"./schema\";\n\nexport { USERNAME_ERROR_CODES } from \"./error-codes\";\n\ndeclare module \"@better-auth/core\" {\n\tinterface BetterAuthPluginRegistry<AuthOptions, Options> {\n\t\tusername: {\n\t\t\tcreator: typeof username;\n\t\t};\n\t}\n}\n\nexport type UsernameOptions = {\n\tschema?: InferOptionSchema<UsernameSchema> | undefined;\n\t/**\n\t * The minimum length of the username\n\t *\n\t * @default 3\n\t */\n\tminUsernameLength?: number | undefined;\n\t/**\n\t * The maximum length of the username\n\t *\n\t * @default 30\n\t */\n\tmaxUsernameLength?: number | undefined;\n\t/**\n\t * A function to validate the username\n\t *\n\t * By default, the username should only contain alphanumeric characters and underscores\n\t */\n\tusernameValidator?:\n\t\t| ((username: string) => boolean | Promise<boolean>)\n\t\t| undefined;\n\t/**\n\t * A function to validate the display username\n\t *\n\t * By default, no validation is applied to display username\n\t */\n\tdisplayUsernameValidator?:\n\t\t| ((displayUsername: string) => boolean | Promise<boolean>)\n\t\t| undefined;\n\t/**\n\t * A function to normalize the username\n\t *\n\t * @default (username) => username.toLowerCase()\n\t */\n\tusernameNormalization?: (((username: string) => string) | false) | undefined;\n\t/**\n\t * A function to normalize the display username\n\t *\n\t * @default false\n\t */\n\tdisplayUsernameNormalization?:\n\t\t| (((displayUsername: string) => string) | false)\n\t\t| undefined;\n\t/**\n\t * The order of validation\n\t *\n\t * @default { username: \"pre-normalization\", displayUsername: \"pre-normalization\" }\n\t */\n\tvalidationOrder?:\n\t\t| {\n\t\t\t\t/**\n\t\t\t\t * The order of username validation\n\t\t\t\t *\n\t\t\t\t * @default \"pre-normalization\"\n\t\t\t\t */\n\t\t\t\tusername?: \"pre-normalization\" | \"post-normalization\";\n\t\t\t\t/**\n\t\t\t\t * The order of display username validation\n\t\t\t\t *\n\t\t\t\t * @default \"pre-normalization\"\n\t\t\t\t */\n\t\t\t\tdisplayUsername?: \"pre-normalization\" | \"post-normalization\";\n\t\t }\n\t\t| undefined;\n};\n\nfunction defaultUsernameValidator(username: string) {\n\treturn /^[a-zA-Z0-9_.]+$/.test(username);\n}\n\nconst signInUsernameBodySchema = z.object({\n\tusername: z.string().meta({ description: \"The username of the user\" }),\n\tpassword: z.string().meta({ description: \"The password of the user\" }),\n\trememberMe: z\n\t\t.boolean()\n\t\t.meta({\n\t\t\tdescription: \"Remember the user session\",\n\t\t})\n\t\t.optional(),\n\tcallbackURL: z\n\t\t.string()\n\t\t.meta({\n\t\t\tdescription: \"The URL to redirect to after email verification\",\n\t\t})\n\t\t.optional(),\n});\n\nconst isUsernameAvailableBodySchema = z.object({\n\tusername: z.string().meta({\n\t\tdescription: \"The username to check\",\n\t}),\n});\n\nexport const username = (options?: UsernameOptions | undefined) => {\n\tconst normalizer = (username: string) => {\n\t\tif (options?.usernameNormalization === false) {\n\t\t\treturn username;\n\t\t}\n\t\tif (options?.usernameNormalization) {\n\t\t\treturn options.usernameNormalization(username);\n\t\t}\n\t\treturn username.toLowerCase();\n\t};\n\n\tconst displayUsernameNormalizer = (displayUsername: string) => {\n\t\treturn options?.displayUsernameNormalization\n\t\t\t? options.displayUsernameNormalization(displayUsername)\n\t\t\t: displayUsername;\n\t};\n\n\treturn {\n\t\tid: \"username\",\n\t\tinit(ctx) {\n\t\t\treturn {\n\t\t\t\toptions: {\n\t\t\t\t\tdatabaseHooks: {\n\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\tcreate: {\n\t\t\t\t\t\t\t\tasync before(user, context) {\n\t\t\t\t\t\t\t\t\tconst username =\n\t\t\t\t\t\t\t\t\t\t\"username\" in user ? (user.username as string) : null;\n\t\t\t\t\t\t\t\t\tconst displayUsername =\n\t\t\t\t\t\t\t\t\t\t\"displayUsername\" in user\n\t\t\t\t\t\t\t\t\t\t\t? (user.displayUsername as string)\n\t\t\t\t\t\t\t\t\t\t\t: null;\n\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t\t...user,\n\t\t\t\t\t\t\t\t\t\t\t...(username ? { username: normalizer(username) } : {}),\n\t\t\t\t\t\t\t\t\t\t\t...(displayUsername\n\t\t\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplayUsername:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplayUsernameNormalizer(displayUsername),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tupdate: {\n\t\t\t\t\t\t\t\tasync before(user, context) {\n\t\t\t\t\t\t\t\t\tconst username =\n\t\t\t\t\t\t\t\t\t\t\"username\" in user ? (user.username as string) : null;\n\t\t\t\t\t\t\t\t\tconst displayUsername =\n\t\t\t\t\t\t\t\t\t\t\"displayUsername\" in user\n\t\t\t\t\t\t\t\t\t\t\t? (user.displayUsername as string)\n\t\t\t\t\t\t\t\t\t\t\t: null;\n\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t\t...user,\n\t\t\t\t\t\t\t\t\t\t\t...(username ? { username: normalizer(username) } : {}),\n\t\t\t\t\t\t\t\t\t\t\t...(displayUsername\n\t\t\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplayUsername:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplayUsernameNormalizer(displayUsername),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\tendpoints: {\n\t\t\tsignInUsername: createAuthEndpoint(\n\t\t\t\t\"/sign-in/username\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: signInUsernameBodySchema,\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\topenapi: {\n\t\t\t\t\t\t\tsummary: \"Sign in with username\",\n\t\t\t\t\t\t\tdescription: \"Sign in with username\",\n\t\t\t\t\t\t\tresponses: {\n\t\t\t\t\t\t\t\t200: {\n\t\t\t\t\t\t\t\t\tdescription: \"Success\",\n\t\t\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttoken: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"Session token for the authenticated session\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$ref: \"#/components/schemas/User\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\trequired: [\"token\", \"user\"],\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t422: {\n\t\t\t\t\t\t\t\t\tdescription: \"Unprocessable Entity. Validation error\",\n\t\t\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tmessage: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tif (!ctx.body.username || !ctx.body.password) {\n\t\t\t\t\t\tctx.context.logger.error(\"Username or password not found\");\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNAUTHORIZED\",\n\t\t\t\t\t\t\tERROR_CODES.INVALID_USERNAME_OR_PASSWORD,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst username =\n\t\t\t\t\t\toptions?.validationOrder?.username === \"pre-normalization\"\n\t\t\t\t\t\t\t? normalizer(ctx.body.username)\n\t\t\t\t\t\t\t: ctx.body.username;\n\n\t\t\t\t\tconst minUsernameLength = options?.minUsernameLength || 3;\n\t\t\t\t\tconst maxUsernameLength = options?.maxUsernameLength || 30;\n\n\t\t\t\t\tif (username.length < minUsernameLength) {\n\t\t\t\t\t\tctx.context.logger.error(\"Username too short\", {\n\t\t\t\t\t\t\tusername,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNPROCESSABLE_ENTITY\",\n\t\t\t\t\t\t\tERROR_CODES.USERNAME_TOO_SHORT,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (username.length > maxUsernameLength) {\n\t\t\t\t\t\tctx.context.logger.error(\"Username too long\", {\n\t\t\t\t\t\t\tusername,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNPROCESSABLE_ENTITY\",\n\t\t\t\t\t\t\tERROR_CODES.USERNAME_TOO_LONG,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst validator =\n\t\t\t\t\t\toptions?.usernameValidator || defaultUsernameValidator;\n\n\t\t\t\t\tconst valid = await validator(username);\n\t\t\t\t\tif (!valid) {\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNPROCESSABLE_ENTITY\",\n\t\t\t\t\t\t\tERROR_CODES.INVALID_USERNAME,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst user = await ctx.context.adapter.findOne<\n\t\t\t\t\t\tUser & { username: string; displayUsername: string }\n\t\t\t\t\t>({\n\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield: \"username\",\n\t\t\t\t\t\t\t\tvalue: normalizer(username),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t\tif (!user) {\n\t\t\t\t\t\t// Hash password to prevent timing attacks from revealing valid usernames\n\t\t\t\t\t\t// By hashing passwords for invalid usernames, we ensure consistent response times\n\t\t\t\t\t\tawait ctx.context.password.hash(ctx.body.password);\n\t\t\t\t\t\tctx.context.logger.error(\"User not found\", {\n\t\t\t\t\t\t\tusername,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNAUTHORIZED\",\n\t\t\t\t\t\t\tERROR_CODES.INVALID_USERNAME_OR_PASSWORD,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst account = await ctx.context.adapter.findOne<Account>({\n\t\t\t\t\t\tmodel: \"account\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield: \"providerId\",\n\t\t\t\t\t\t\t\tvalue: \"credential\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t\tif (!account) {\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNAUTHORIZED\",\n\t\t\t\t\t\t\tERROR_CODES.INVALID_USERNAME_OR_PASSWORD,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst currentPassword = account?.password;\n\t\t\t\t\tif (!currentPassword) {\n\t\t\t\t\t\tctx.context.logger.error(\"Password not found\", {\n\t\t\t\t\t\t\tusername,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNAUTHORIZED\",\n\t\t\t\t\t\t\tERROR_CODES.INVALID_USERNAME_OR_PASSWORD,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst validPassword = await ctx.context.password.verify({\n\t\t\t\t\t\thash: currentPassword,\n\t\t\t\t\t\tpassword: ctx.body.password,\n\t\t\t\t\t});\n\t\t\t\t\tif (!validPassword) {\n\t\t\t\t\t\tctx.context.logger.error(\"Invalid password\");\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNAUTHORIZED\",\n\t\t\t\t\t\t\tERROR_CODES.INVALID_USERNAME_OR_PASSWORD,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tctx.context.options?.emailAndPassword?.requireEmailVerification &&\n\t\t\t\t\t\t!user.emailVerified\n\t\t\t\t\t) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!ctx.context.options?.emailVerification?.sendVerificationEmail\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthrow APIError.from(\"FORBIDDEN\", ERROR_CODES.EMAIL_NOT_VERIFIED);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (ctx.context.options?.emailVerification?.sendOnSignIn) {\n\t\t\t\t\t\t\tconst token = await createEmailVerificationToken(\n\t\t\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t\t\t\tuser.email,\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\tctx.context.options.emailVerification?.expiresIn,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst url = `${ctx.context.baseURL}/verify-email?token=${token}&callbackURL=${\n\t\t\t\t\t\t\t\tctx.body.callbackURL || \"/\"\n\t\t\t\t\t\t\t}`;\n\t\t\t\t\t\t\tawait ctx.context.runInBackgroundOrAwait(\n\t\t\t\t\t\t\t\tctx.context.options.emailVerification.sendVerificationEmail(\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tuser: user,\n\t\t\t\t\t\t\t\t\t\turl,\n\t\t\t\t\t\t\t\t\t\ttoken,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tctx.request,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthrow APIError.from(\"FORBIDDEN\", ERROR_CODES.EMAIL_NOT_VERIFIED);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst session = await ctx.context.internalAdapter.createSession(\n\t\t\t\t\t\tuser.id,\n\t\t\t\t\t\tctx.body.rememberMe === false,\n\t\t\t\t\t);\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\t\t\tstatus: 500,\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\tmessage: BASE_ERROR_CODES.FAILED_TO_CREATE_SESSION.message,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tawait setSessionCookie(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\t{ session, user },\n\t\t\t\t\t\tctx.body.rememberMe === false,\n\t\t\t\t\t);\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\ttoken: session.token,\n\t\t\t\t\t\tuser: parseUserOutput(ctx.context.options, user),\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\tisUsernameAvailable: createAuthEndpoint(\n\t\t\t\t\"/is-username-available\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: isUsernameAvailableBodySchema,\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst username = ctx.body.username;\n\t\t\t\t\tif (!username) {\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNPROCESSABLE_ENTITY\",\n\t\t\t\t\t\t\tERROR_CODES.INVALID_USERNAME,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst minUsernameLength = options?.minUsernameLength || 3;\n\t\t\t\t\tconst maxUsernameLength = options?.maxUsernameLength || 30;\n\n\t\t\t\t\tif (username.length < minUsernameLength) {\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNPROCESSABLE_ENTITY\",\n\t\t\t\t\t\t\tERROR_CODES.USERNAME_TOO_SHORT,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (username.length > maxUsernameLength) {\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNPROCESSABLE_ENTITY\",\n\t\t\t\t\t\t\tERROR_CODES.USERNAME_TOO_LONG,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst validator =\n\t\t\t\t\t\toptions?.usernameValidator || defaultUsernameValidator;\n\n\t\t\t\t\tconst valid = await validator(username);\n\t\t\t\t\tif (!valid) {\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNPROCESSABLE_ENTITY\",\n\t\t\t\t\t\t\tERROR_CODES.INVALID_USERNAME,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst user = await ctx.context.adapter.findOne<User>({\n\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield: \"username\",\n\t\t\t\t\t\t\t\tvalue: normalizer(username),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t\tif (user) {\n\t\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\t\tavailable: false,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tavailable: true,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t},\n\t\tschema: mergeSchema(\n\t\t\tgetSchema({\n\t\t\t\tusername: normalizer,\n\t\t\t\tdisplayUsername: displayUsernameNormalizer,\n\t\t\t}),\n\t\t\toptions?.schema,\n\t\t),\n\t\thooks: {\n\t\t\tbefore: [\n\t\t\t\t{\n\t\t\t\t\tmatcher(context) {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tcontext.path === \"/sign-up/email\" ||\n\t\t\t\t\t\t\tcontext.path === \"/update-user\"\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\thandler: createAuthMiddleware(async (ctx) => {\n\t\t\t\t\t\tconst username =\n\t\t\t\t\t\t\ttypeof ctx.body.username === \"string\" &&\n\t\t\t\t\t\t\toptions?.validationOrder?.username === \"post-normalization\"\n\t\t\t\t\t\t\t\t? normalizer(ctx.body.username)\n\t\t\t\t\t\t\t\t: ctx.body.username;\n\n\t\t\t\t\t\tif (username !== undefined && typeof username === \"string\") {\n\t\t\t\t\t\t\tconst minUsernameLength = options?.minUsernameLength || 3;\n\t\t\t\t\t\t\tconst maxUsernameLength = options?.maxUsernameLength || 30;\n\t\t\t\t\t\t\tif (username.length < minUsernameLength) {\n\t\t\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\t\t\t\tERROR_CODES.USERNAME_TOO_SHORT,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (username.length > maxUsernameLength) {\n\t\t\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\t\t\t\tERROR_CODES.USERNAME_TOO_LONG,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst validator =\n\t\t\t\t\t\t\t\toptions?.usernameValidator || defaultUsernameValidator;\n\n\t\t\t\t\t\t\tconst valid = await validator(username);\n\t\t\t\t\t\t\tif (!valid) {\n\t\t\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\t\t\t\tERROR_CODES.INVALID_USERNAME,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst user = await ctx.context.adapter.findOne<User>({\n\t\t\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tfield: \"username\",\n\t\t\t\t\t\t\t\t\t\tvalue: username,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst blockChangeSignUp = ctx.path === \"/sign-up/email\" && user;\n\t\t\t\t\t\t\tconst blockChangeUpdateUser =\n\t\t\t\t\t\t\t\tctx.path === \"/update-user\" &&\n\t\t\t\t\t\t\t\tuser &&\n\t\t\t\t\t\t\t\tctx.context.session &&\n\t\t\t\t\t\t\t\tuser.id !== ctx.context.session.session.userId;\n\t\t\t\t\t\t\tif (blockChangeSignUp || blockChangeUpdateUser) {\n\t\t\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\t\t\t\tERROR_CODES.USERNAME_IS_ALREADY_TAKEN,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst displayUsername =\n\t\t\t\t\t\t\ttypeof ctx.body.displayUsername === \"string\" &&\n\t\t\t\t\t\t\toptions?.validationOrder?.displayUsername === \"post-normalization\"\n\t\t\t\t\t\t\t\t? displayUsernameNormalizer(ctx.body.displayUsername)\n\t\t\t\t\t\t\t\t: ctx.body.displayUsername;\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tdisplayUsername !== undefined &&\n\t\t\t\t\t\t\ttypeof displayUsername === \"string\"\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif (options?.displayUsernameValidator) {\n\t\t\t\t\t\t\t\tconst valid =\n\t\t\t\t\t\t\t\t\tawait options.displayUsernameValidator(displayUsername);\n\t\t\t\t\t\t\t\tif (!valid) {\n\t\t\t\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\t\t\t\t\tERROR_CODES.INVALID_DISPLAY_USERNAME,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmatcher(context) {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tcontext.path === \"/sign-up/email\" ||\n\t\t\t\t\t\t\tcontext.path === \"/update-user\"\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\thandler: createAuthMiddleware(async (ctx) => {\n\t\t\t\t\t\tif (ctx.body.username && !ctx.body.displayUsername) {\n\t\t\t\t\t\t\tctx.body.displayUsername = ctx.body.username;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (ctx.body.displayUsername && !ctx.body.username) {\n\t\t\t\t\t\t\tctx.body.username = ctx.body.displayUsername;\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\toptions,\n\t\t$ERROR_CODES: ERROR_CODES,\n\t} satisfies BetterAuthPlugin;\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//#region src/plugins/username/schema.d.ts
|
|
2
|
+
declare const getSchema: (normalizer: {
|
|
3
|
+
username: (username: string) => string;
|
|
4
|
+
displayUsername: (displayUsername: string) => string;
|
|
5
|
+
}) => BetterAuthPluginDBSchema;
|
|
6
|
+
type UsernameSchema = ReturnType<typeof getSchema>;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { UsernameSchema };
|
|
9
|
+
//# sourceMappingURL=schema.d.mts.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
//#region src/plugins/username/schema.ts
|
|
2
|
+
const getSchema = (normalizer) => {
|
|
3
|
+
return { user: { fields: {
|
|
4
|
+
username: {
|
|
5
|
+
type: "string",
|
|
6
|
+
required: false,
|
|
7
|
+
sortable: true,
|
|
8
|
+
unique: true,
|
|
9
|
+
returned: true,
|
|
10
|
+
transform: { input(value) {
|
|
11
|
+
return typeof value !== "string" ? value : normalizer.username(value);
|
|
12
|
+
} }
|
|
13
|
+
},
|
|
14
|
+
displayUsername: {
|
|
15
|
+
type: "string",
|
|
16
|
+
required: false,
|
|
17
|
+
transform: { input(value) {
|
|
18
|
+
return typeof value !== "string" ? value : normalizer.displayUsername(value);
|
|
19
|
+
} }
|
|
20
|
+
}
|
|
21
|
+
} } };
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
//#endregion
|
|
25
|
+
export { getSchema };
|
|
26
|
+
//# sourceMappingURL=schema.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.mjs","names":[],"sources":["../../../src/plugins/username/schema.ts"],"sourcesContent":["import type { BetterAuthPluginDBSchema } from \"@better-auth/core/db\";\n\nexport const getSchema = (normalizer: {\n\tusername: (username: string) => string;\n\tdisplayUsername: (displayUsername: string) => string;\n}) => {\n\treturn {\n\t\tuser: {\n\t\t\tfields: {\n\t\t\t\tusername: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t\tsortable: true,\n\t\t\t\t\tunique: true,\n\t\t\t\t\treturned: true,\n\t\t\t\t\ttransform: {\n\t\t\t\t\t\tinput(value) {\n\t\t\t\t\t\t\treturn typeof value !== \"string\"\n\t\t\t\t\t\t\t\t? value\n\t\t\t\t\t\t\t\t: normalizer.username(value as string);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tdisplayUsername: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t\ttransform: {\n\t\t\t\t\t\tinput(value) {\n\t\t\t\t\t\t\treturn typeof value !== \"string\"\n\t\t\t\t\t\t\t\t? value\n\t\t\t\t\t\t\t\t: normalizer.displayUsername(value as string);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t} satisfies BetterAuthPluginDBSchema;\n};\n\nexport type UsernameSchema = ReturnType<typeof getSchema>;\n"],"mappings":";AAEA,MAAa,aAAa,eAGpB;AACL,QAAO,EACN,MAAM,EACL,QAAQ;EACP,UAAU;GACT,MAAM;GACN,UAAU;GACV,UAAU;GACV,QAAQ;GACR,UAAU;GACV,WAAW,EACV,MAAM,OAAO;AACZ,WAAO,OAAO,UAAU,WACrB,QACA,WAAW,SAAS,MAAgB;MAExC;GACD;EACD,iBAAiB;GAChB,MAAM;GACN,UAAU;GACV,WAAW,EACV,MAAM,OAAO;AACZ,WAAO,OAAO,UAAU,WACrB,QACA,WAAW,gBAAgB,MAAgB;MAE/C;GACD;EACD,EACD,EACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "@better-auth/core/social-providers";
|
package/dist/state.d.mts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { GenericEndpointContext } from "@better-auth/core";
|
|
2
|
+
import { BetterAuthError } from "@better-auth/core/error";
|
|
3
|
+
import * as z from "zod";
|
|
4
|
+
|
|
5
|
+
//#region src/state.d.ts
|
|
6
|
+
declare const stateDataSchema: z.ZodObject<{
|
|
7
|
+
callbackURL: z.ZodString;
|
|
8
|
+
codeVerifier: z.ZodString;
|
|
9
|
+
errorURL: z.ZodOptional<z.ZodString>;
|
|
10
|
+
newUserURL: z.ZodOptional<z.ZodString>;
|
|
11
|
+
expiresAt: z.ZodNumber;
|
|
12
|
+
link: z.ZodOptional<z.ZodObject<{
|
|
13
|
+
email: z.ZodString;
|
|
14
|
+
userId: z.ZodCoercedString<unknown>;
|
|
15
|
+
}, z.core.$strip>>;
|
|
16
|
+
requestSignUp: z.ZodOptional<z.ZodBoolean>;
|
|
17
|
+
}, z.core.$loose>;
|
|
18
|
+
type StateData = z.infer<typeof stateDataSchema>;
|
|
19
|
+
declare function generateGenericState(c: GenericEndpointContext, stateData: StateData, settings?: {
|
|
20
|
+
cookieName: string;
|
|
21
|
+
}): Promise<{
|
|
22
|
+
state: any;
|
|
23
|
+
codeVerifier: string;
|
|
24
|
+
}>;
|
|
25
|
+
declare function parseGenericState(c: GenericEndpointContext, state: string, settings?: {
|
|
26
|
+
cookieName: string;
|
|
27
|
+
}): Promise<{
|
|
28
|
+
[x: string]: unknown;
|
|
29
|
+
callbackURL: string;
|
|
30
|
+
codeVerifier: string;
|
|
31
|
+
expiresAt: number;
|
|
32
|
+
errorURL?: string | undefined;
|
|
33
|
+
newUserURL?: string | undefined;
|
|
34
|
+
link?: {
|
|
35
|
+
email: string;
|
|
36
|
+
userId: string;
|
|
37
|
+
} | undefined;
|
|
38
|
+
requestSignUp?: boolean | undefined;
|
|
39
|
+
}>;
|
|
40
|
+
//#endregion
|
|
41
|
+
export { StateData, generateGenericState, parseGenericState };
|
|
42
|
+
//# sourceMappingURL=state.d.mts.map
|
package/dist/state.mjs
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { generateRandomString } from "./crypto/random.mjs";
|
|
2
|
+
import { symmetricDecrypt, symmetricEncrypt } from "./crypto/index.mjs";
|
|
3
|
+
import { expireCookie } from "./cookies/index.mjs";
|
|
4
|
+
import { BetterAuthError } from "@better-auth/core/error";
|
|
5
|
+
import * as z from "zod";
|
|
6
|
+
|
|
7
|
+
//#region src/state.ts
|
|
8
|
+
const stateDataSchema = z.looseObject({
|
|
9
|
+
callbackURL: z.string(),
|
|
10
|
+
codeVerifier: z.string(),
|
|
11
|
+
errorURL: z.string().optional(),
|
|
12
|
+
newUserURL: z.string().optional(),
|
|
13
|
+
expiresAt: z.number(),
|
|
14
|
+
link: z.object({
|
|
15
|
+
email: z.string(),
|
|
16
|
+
userId: z.coerce.string()
|
|
17
|
+
}).optional(),
|
|
18
|
+
requestSignUp: z.boolean().optional()
|
|
19
|
+
});
|
|
20
|
+
var StateError = class extends BetterAuthError {
|
|
21
|
+
code;
|
|
22
|
+
details;
|
|
23
|
+
constructor(message, options) {
|
|
24
|
+
super(message, options);
|
|
25
|
+
this.code = options.code;
|
|
26
|
+
this.details = options.details;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
async function generateGenericState(c, stateData, settings) {
|
|
30
|
+
const state = generateRandomString(32);
|
|
31
|
+
if (c.context.oauthConfig.storeStateStrategy === "cookie") {
|
|
32
|
+
const encryptedData = await symmetricEncrypt({
|
|
33
|
+
key: c.context.secret,
|
|
34
|
+
data: JSON.stringify(stateData)
|
|
35
|
+
});
|
|
36
|
+
const stateCookie = c.context.createAuthCookie(settings?.cookieName ?? "oauth_state", { maxAge: 600 * 1e3 });
|
|
37
|
+
c.setCookie(stateCookie.name, encryptedData, stateCookie.attributes);
|
|
38
|
+
return {
|
|
39
|
+
state,
|
|
40
|
+
codeVerifier: stateData.codeVerifier
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const stateCookie = c.context.createAuthCookie(settings?.cookieName ?? "state", { maxAge: 300 * 1e3 });
|
|
44
|
+
await c.setSignedCookie(stateCookie.name, state, c.context.secret, stateCookie.attributes);
|
|
45
|
+
const expiresAt = /* @__PURE__ */ new Date();
|
|
46
|
+
expiresAt.setMinutes(expiresAt.getMinutes() + 10);
|
|
47
|
+
const verification = await c.context.internalAdapter.createVerificationValue({
|
|
48
|
+
value: JSON.stringify(stateData),
|
|
49
|
+
identifier: state,
|
|
50
|
+
expiresAt
|
|
51
|
+
});
|
|
52
|
+
if (!verification) throw new StateError("Unable to create verification. Make sure the database adapter is properly working and there is a verification table in the database", { code: "state_generation_error" });
|
|
53
|
+
return {
|
|
54
|
+
state: verification.identifier,
|
|
55
|
+
codeVerifier: stateData.codeVerifier
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
async function parseGenericState(c, state, settings) {
|
|
59
|
+
const storeStateStrategy = c.context.oauthConfig.storeStateStrategy;
|
|
60
|
+
let parsedData;
|
|
61
|
+
if (storeStateStrategy === "cookie") {
|
|
62
|
+
const stateCookie = c.context.createAuthCookie(settings?.cookieName ?? "oauth_state");
|
|
63
|
+
const encryptedData = c.getCookie(stateCookie.name);
|
|
64
|
+
if (!encryptedData) throw new StateError("State mismatch: auth state cookie not found", {
|
|
65
|
+
code: "state_mismatch",
|
|
66
|
+
details: { state }
|
|
67
|
+
});
|
|
68
|
+
try {
|
|
69
|
+
const decryptedData = await symmetricDecrypt({
|
|
70
|
+
key: c.context.secret,
|
|
71
|
+
data: encryptedData
|
|
72
|
+
});
|
|
73
|
+
parsedData = stateDataSchema.parse(JSON.parse(decryptedData));
|
|
74
|
+
} catch (error) {
|
|
75
|
+
throw new StateError("State invalid: Failed to decrypt or parse auth state", {
|
|
76
|
+
code: "state_invalid",
|
|
77
|
+
details: { state },
|
|
78
|
+
cause: error
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
expireCookie(c, stateCookie);
|
|
82
|
+
} else {
|
|
83
|
+
const data = await c.context.internalAdapter.findVerificationValue(state);
|
|
84
|
+
if (!data) throw new StateError("State mismatch: verification not found", {
|
|
85
|
+
code: "state_mismatch",
|
|
86
|
+
details: { state }
|
|
87
|
+
});
|
|
88
|
+
parsedData = stateDataSchema.parse(JSON.parse(data.value));
|
|
89
|
+
const stateCookie = c.context.createAuthCookie(settings?.cookieName ?? "state");
|
|
90
|
+
const stateCookieValue = await c.getSignedCookie(stateCookie.name, c.context.secret);
|
|
91
|
+
if (!c.context.oauthConfig.skipStateCookieCheck && (!stateCookieValue || stateCookieValue !== state)) throw new StateError("State mismatch: State not persisted correctly", {
|
|
92
|
+
code: "state_security_mismatch",
|
|
93
|
+
details: { state }
|
|
94
|
+
});
|
|
95
|
+
expireCookie(c, stateCookie);
|
|
96
|
+
await c.context.internalAdapter.deleteVerificationValue(data.id);
|
|
97
|
+
}
|
|
98
|
+
if (parsedData.expiresAt < Date.now()) throw new StateError("Invalid state: request expired", {
|
|
99
|
+
code: "state_mismatch",
|
|
100
|
+
details: { expiresAt: parsedData.expiresAt }
|
|
101
|
+
});
|
|
102
|
+
return parsedData;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
//#endregion
|
|
106
|
+
export { StateError, generateGenericState, parseGenericState };
|
|
107
|
+
//# sourceMappingURL=state.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.mjs","names":[],"sources":["../src/state.ts"],"sourcesContent":["import type { GenericEndpointContext } from \"@better-auth/core\";\nimport { BetterAuthError } from \"@better-auth/core/error\";\nimport * as z from \"zod\";\nimport { expireCookie } from \"./cookies\";\nimport {\n\tgenerateRandomString,\n\tsymmetricDecrypt,\n\tsymmetricEncrypt,\n} from \"./crypto\";\n\nconst stateDataSchema = z.looseObject({\n\tcallbackURL: z.string(),\n\tcodeVerifier: z.string(),\n\terrorURL: z.string().optional(),\n\tnewUserURL: z.string().optional(),\n\texpiresAt: z.number(),\n\tlink: z\n\t\t.object({\n\t\t\temail: z.string(),\n\t\t\tuserId: z.coerce.string(),\n\t\t})\n\t\t.optional(),\n\trequestSignUp: z.boolean().optional(),\n});\n\nexport type StateData = z.infer<typeof stateDataSchema>;\n\nexport type StateErrorCode =\n\t| \"state_generation_error\"\n\t| \"state_invalid\"\n\t| \"state_mismatch\"\n\t| \"state_security_mismatch\";\n\nexport class StateError extends BetterAuthError {\n\tcode: string;\n\tdetails?: Record<string, any>;\n\n\tconstructor(\n\t\tmessage: string,\n\t\toptions: ErrorOptions & {\n\t\t\tcode: StateErrorCode;\n\t\t\tdetails?: Record<string, any>;\n\t\t},\n\t) {\n\t\tsuper(message, options);\n\t\tthis.code = options.code;\n\t\tthis.details = options.details;\n\t}\n}\n\nexport async function generateGenericState(\n\tc: GenericEndpointContext,\n\tstateData: StateData,\n\tsettings?: { cookieName: string },\n) {\n\tconst state = generateRandomString(32);\n\tconst storeStateStrategy = c.context.oauthConfig.storeStateStrategy;\n\n\tif (storeStateStrategy === \"cookie\") {\n\t\t// Store state data in an encrypted cookie\n\n\t\tconst encryptedData = await symmetricEncrypt({\n\t\t\tkey: c.context.secret,\n\t\t\tdata: JSON.stringify(stateData),\n\t\t});\n\n\t\tconst stateCookie = c.context.createAuthCookie(\n\t\t\tsettings?.cookieName ?? \"oauth_state\",\n\t\t\t{\n\t\t\t\tmaxAge: 10 * 60 * 1000, // 10 minutes\n\t\t\t},\n\t\t);\n\n\t\tc.setCookie(stateCookie.name, encryptedData, stateCookie.attributes);\n\n\t\treturn {\n\t\t\tstate,\n\t\t\tcodeVerifier: stateData.codeVerifier,\n\t\t};\n\t}\n\n\t// Default: database strategy\n\n\tconst stateCookie = c.context.createAuthCookie(\n\t\tsettings?.cookieName ?? \"state\",\n\t\t{\n\t\t\tmaxAge: 5 * 60 * 1000, // 5 minutes\n\t\t},\n\t);\n\n\tawait c.setSignedCookie(\n\t\tstateCookie.name,\n\t\tstate,\n\t\tc.context.secret,\n\t\tstateCookie.attributes,\n\t);\n\n\tconst expiresAt = new Date();\n\texpiresAt.setMinutes(expiresAt.getMinutes() + 10);\n\n\tconst verification = await c.context.internalAdapter.createVerificationValue({\n\t\tvalue: JSON.stringify(stateData),\n\t\tidentifier: state,\n\t\texpiresAt,\n\t});\n\n\tif (!verification) {\n\t\tthrow new StateError(\n\t\t\t\"Unable to create verification. Make sure the database adapter is properly working and there is a verification table in the database\",\n\t\t\t{\n\t\t\t\tcode: \"state_generation_error\",\n\t\t\t},\n\t\t);\n\t}\n\n\treturn {\n\t\tstate: verification.identifier,\n\t\tcodeVerifier: stateData.codeVerifier,\n\t};\n}\n\nexport async function parseGenericState(\n\tc: GenericEndpointContext,\n\tstate: string,\n\tsettings?: { cookieName: string },\n) {\n\tconst storeStateStrategy = c.context.oauthConfig.storeStateStrategy;\n\tlet parsedData: StateData;\n\n\tif (storeStateStrategy === \"cookie\") {\n\t\t// Retrieve state data from encrypted cookie\n\t\tconst stateCookie = c.context.createAuthCookie(\n\t\t\tsettings?.cookieName ?? \"oauth_state\",\n\t\t);\n\t\tconst encryptedData = c.getCookie(stateCookie.name);\n\n\t\tif (!encryptedData) {\n\t\t\tthrow new StateError(\"State mismatch: auth state cookie not found\", {\n\t\t\t\tcode: \"state_mismatch\",\n\t\t\t\tdetails: { state },\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst decryptedData = await symmetricDecrypt({\n\t\t\t\tkey: c.context.secret,\n\t\t\t\tdata: encryptedData,\n\t\t\t});\n\n\t\t\tparsedData = stateDataSchema.parse(JSON.parse(decryptedData));\n\t\t} catch (error) {\n\t\t\tthrow new StateError(\n\t\t\t\t\"State invalid: Failed to decrypt or parse auth state\",\n\t\t\t\t{\n\t\t\t\t\tcode: \"state_invalid\",\n\t\t\t\t\tdetails: { state },\n\t\t\t\t\tcause: error,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\t// Clear the cookie after successful parsing\n\t\texpireCookie(c, stateCookie);\n\t} else {\n\t\t// Default: database strategy\n\t\tconst data = await c.context.internalAdapter.findVerificationValue(state);\n\t\tif (!data) {\n\t\t\tthrow new StateError(\"State mismatch: verification not found\", {\n\t\t\t\tcode: \"state_mismatch\",\n\t\t\t\tdetails: { state },\n\t\t\t});\n\t\t}\n\n\t\tparsedData = stateDataSchema.parse(JSON.parse(data.value));\n\n\t\tconst stateCookie = c.context.createAuthCookie(\n\t\t\tsettings?.cookieName ?? \"state\",\n\t\t);\n\n\t\tconst stateCookieValue = await c.getSignedCookie(\n\t\t\tstateCookie.name,\n\t\t\tc.context.secret,\n\t\t);\n\n\t\t/**\n\t\t * This is generally cause security issue and should only be used in\n\t\t * dev or staging environments. It's currently used by the oauth-proxy\n\t\t * plugin\n\t\t */\n\t\tconst skipStateCookieCheck = c.context.oauthConfig.skipStateCookieCheck;\n\t\tif (\n\t\t\t!skipStateCookieCheck &&\n\t\t\t(!stateCookieValue || stateCookieValue !== state)\n\t\t) {\n\t\t\tthrow new StateError(\"State mismatch: State not persisted correctly\", {\n\t\t\t\tcode: \"state_security_mismatch\",\n\t\t\t\tdetails: { state },\n\t\t\t});\n\t\t}\n\n\t\texpireCookie(c, stateCookie);\n\n\t\t// Delete verification value after retrieval\n\t\tawait c.context.internalAdapter.deleteVerificationValue(data.id);\n\t}\n\n\t// Check expiration\n\tif (parsedData.expiresAt < Date.now()) {\n\t\tthrow new StateError(\"Invalid state: request expired\", {\n\t\t\tcode: \"state_mismatch\",\n\t\t\tdetails: {\n\t\t\t\texpiresAt: parsedData.expiresAt,\n\t\t\t},\n\t\t});\n\t}\n\n\treturn parsedData;\n}\n"],"mappings":";;;;;;;AAUA,MAAM,kBAAkB,EAAE,YAAY;CACrC,aAAa,EAAE,QAAQ;CACvB,cAAc,EAAE,QAAQ;CACxB,UAAU,EAAE,QAAQ,CAAC,UAAU;CAC/B,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,WAAW,EAAE,QAAQ;CACrB,MAAM,EACJ,OAAO;EACP,OAAO,EAAE,QAAQ;EACjB,QAAQ,EAAE,OAAO,QAAQ;EACzB,CAAC,CACD,UAAU;CACZ,eAAe,EAAE,SAAS,CAAC,UAAU;CACrC,CAAC;AAUF,IAAa,aAAb,cAAgC,gBAAgB;CAC/C;CACA;CAEA,YACC,SACA,SAIC;AACD,QAAM,SAAS,QAAQ;AACvB,OAAK,OAAO,QAAQ;AACpB,OAAK,UAAU,QAAQ;;;AAIzB,eAAsB,qBACrB,GACA,WACA,UACC;CACD,MAAM,QAAQ,qBAAqB,GAAG;AAGtC,KAF2B,EAAE,QAAQ,YAAY,uBAEtB,UAAU;EAGpC,MAAM,gBAAgB,MAAM,iBAAiB;GAC5C,KAAK,EAAE,QAAQ;GACf,MAAM,KAAK,UAAU,UAAU;GAC/B,CAAC;EAEF,MAAM,cAAc,EAAE,QAAQ,iBAC7B,UAAU,cAAc,eACxB,EACC,QAAQ,MAAU,KAClB,CACD;AAED,IAAE,UAAU,YAAY,MAAM,eAAe,YAAY,WAAW;AAEpE,SAAO;GACN;GACA,cAAc,UAAU;GACxB;;CAKF,MAAM,cAAc,EAAE,QAAQ,iBAC7B,UAAU,cAAc,SACxB,EACC,QAAQ,MAAS,KACjB,CACD;AAED,OAAM,EAAE,gBACP,YAAY,MACZ,OACA,EAAE,QAAQ,QACV,YAAY,WACZ;CAED,MAAM,4BAAY,IAAI,MAAM;AAC5B,WAAU,WAAW,UAAU,YAAY,GAAG,GAAG;CAEjD,MAAM,eAAe,MAAM,EAAE,QAAQ,gBAAgB,wBAAwB;EAC5E,OAAO,KAAK,UAAU,UAAU;EAChC,YAAY;EACZ;EACA,CAAC;AAEF,KAAI,CAAC,aACJ,OAAM,IAAI,WACT,uIACA,EACC,MAAM,0BACN,CACD;AAGF,QAAO;EACN,OAAO,aAAa;EACpB,cAAc,UAAU;EACxB;;AAGF,eAAsB,kBACrB,GACA,OACA,UACC;CACD,MAAM,qBAAqB,EAAE,QAAQ,YAAY;CACjD,IAAI;AAEJ,KAAI,uBAAuB,UAAU;EAEpC,MAAM,cAAc,EAAE,QAAQ,iBAC7B,UAAU,cAAc,cACxB;EACD,MAAM,gBAAgB,EAAE,UAAU,YAAY,KAAK;AAEnD,MAAI,CAAC,cACJ,OAAM,IAAI,WAAW,+CAA+C;GACnE,MAAM;GACN,SAAS,EAAE,OAAO;GAClB,CAAC;AAGH,MAAI;GACH,MAAM,gBAAgB,MAAM,iBAAiB;IAC5C,KAAK,EAAE,QAAQ;IACf,MAAM;IACN,CAAC;AAEF,gBAAa,gBAAgB,MAAM,KAAK,MAAM,cAAc,CAAC;WACrD,OAAO;AACf,SAAM,IAAI,WACT,wDACA;IACC,MAAM;IACN,SAAS,EAAE,OAAO;IAClB,OAAO;IACP,CACD;;AAIF,eAAa,GAAG,YAAY;QACtB;EAEN,MAAM,OAAO,MAAM,EAAE,QAAQ,gBAAgB,sBAAsB,MAAM;AACzE,MAAI,CAAC,KACJ,OAAM,IAAI,WAAW,0CAA0C;GAC9D,MAAM;GACN,SAAS,EAAE,OAAO;GAClB,CAAC;AAGH,eAAa,gBAAgB,MAAM,KAAK,MAAM,KAAK,MAAM,CAAC;EAE1D,MAAM,cAAc,EAAE,QAAQ,iBAC7B,UAAU,cAAc,QACxB;EAED,MAAM,mBAAmB,MAAM,EAAE,gBAChC,YAAY,MACZ,EAAE,QAAQ,OACV;AAQD,MACC,CAF4B,EAAE,QAAQ,YAAY,yBAGjD,CAAC,oBAAoB,qBAAqB,OAE3C,OAAM,IAAI,WAAW,iDAAiD;GACrE,MAAM;GACN,SAAS,EAAE,OAAO;GAClB,CAAC;AAGH,eAAa,GAAG,YAAY;AAG5B,QAAM,EAAE,QAAQ,gBAAgB,wBAAwB,KAAK,GAAG;;AAIjE,KAAI,WAAW,YAAY,KAAK,KAAK,CACpC,OAAM,IAAI,WAAW,kCAAkC;EACtD,MAAM;EACN,SAAS,EACR,WAAW,WAAW,WACtB;EACD,CAAC;AAGH,QAAO"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//#region src/test-utils/headers.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* converts set cookie containing headers to
|
|
4
|
+
* cookie containing headers
|
|
5
|
+
*/
|
|
6
|
+
declare function convertSetCookieToCookie(headers: Headers): Headers;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { convertSetCookieToCookie };
|
|
9
|
+
//# sourceMappingURL=headers.d.mts.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//#region src/test-utils/headers.ts
|
|
2
|
+
/**
|
|
3
|
+
* converts set cookie containing headers to
|
|
4
|
+
* cookie containing headers
|
|
5
|
+
*/
|
|
6
|
+
function convertSetCookieToCookie(headers) {
|
|
7
|
+
const setCookieHeaders = [];
|
|
8
|
+
headers.forEach((value, name) => {
|
|
9
|
+
if (name.toLowerCase() === "set-cookie") setCookieHeaders.push(value);
|
|
10
|
+
});
|
|
11
|
+
if (setCookieHeaders.length === 0) return headers;
|
|
12
|
+
const existingCookies = headers.get("cookie") || "";
|
|
13
|
+
const cookies = existingCookies ? existingCookies.split("; ") : [];
|
|
14
|
+
setCookieHeaders.forEach((setCookie) => {
|
|
15
|
+
const cookiePair = setCookie.split(";")[0];
|
|
16
|
+
cookies.push(cookiePair.trim());
|
|
17
|
+
});
|
|
18
|
+
headers.set("cookie", cookies.join("; "));
|
|
19
|
+
return headers;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
//#endregion
|
|
23
|
+
export { convertSetCookieToCookie };
|
|
24
|
+
//# sourceMappingURL=headers.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headers.mjs","names":[],"sources":["../../src/test-utils/headers.ts"],"sourcesContent":["/**\n * converts set cookie containing headers to\n * cookie containing headers\n */\nexport function convertSetCookieToCookie(headers: Headers): Headers {\n\tconst setCookieHeaders: string[] = [];\n\theaders.forEach((value, name) => {\n\t\tif (name.toLowerCase() === \"set-cookie\") {\n\t\t\tsetCookieHeaders.push(value);\n\t\t}\n\t});\n\n\tif (setCookieHeaders.length === 0) {\n\t\treturn headers;\n\t}\n\n\tconst existingCookies = headers.get(\"cookie\") || \"\";\n\tconst cookies = existingCookies ? existingCookies.split(\"; \") : [];\n\n\tsetCookieHeaders.forEach((setCookie) => {\n\t\tconst cookiePair = setCookie.split(\";\")[0]!;\n\t\tcookies.push(cookiePair.trim());\n\t});\n\n\theaders.set(\"cookie\", cookies.join(\"; \"));\n\n\treturn headers;\n}\n"],"mappings":";;;;;AAIA,SAAgB,yBAAyB,SAA2B;CACnE,MAAM,mBAA6B,EAAE;AACrC,SAAQ,SAAS,OAAO,SAAS;AAChC,MAAI,KAAK,aAAa,KAAK,aAC1B,kBAAiB,KAAK,MAAM;GAE5B;AAEF,KAAI,iBAAiB,WAAW,EAC/B,QAAO;CAGR,MAAM,kBAAkB,QAAQ,IAAI,SAAS,IAAI;CACjD,MAAM,UAAU,kBAAkB,gBAAgB,MAAM,KAAK,GAAG,EAAE;AAElE,kBAAiB,SAAS,cAAc;EACvC,MAAM,aAAa,UAAU,MAAM,IAAI,CAAC;AACxC,UAAQ,KAAK,WAAW,MAAM,CAAC;GAC9B;AAEF,SAAQ,IAAI,UAAU,QAAQ,KAAK,KAAK,CAAC;AAEzC,QAAO"}
|