@hammadj/better-auth 1.5.0-beta.10
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/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 +62 -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 @@
|
|
|
1
|
+
{"version":3,"file":"internal-adapter.mjs","names":[],"sources":["../../src/db/internal-adapter.ts"],"sourcesContent":["import type {\n\tAuthContext,\n\tBetterAuthOptions,\n\tInternalAdapter,\n} from \"@better-auth/core\";\nimport {\n\tgetCurrentAdapter,\n\tgetCurrentAuthContext,\n\trunWithTransaction,\n} from \"@better-auth/core/context\";\nimport type { DBAdapter, Where } from \"@better-auth/core/db/adapter\";\nimport type { InternalLogger } from \"@better-auth/core/env\";\nimport { generateId } from \"@better-auth/core/utils/id\";\nimport { safeJSONParse } from \"@better-auth/core/utils/json\";\nimport type { Account, Session, User, Verification } from \"../types\";\nimport { getDate } from \"../utils/date\";\nimport { getIp } from \"../utils/get-request-ip\";\nimport {\n\tparseSessionInput,\n\tparseSessionOutput,\n\tparseUserOutput,\n} from \"./schema\";\nimport {\n\tgetStorageOption,\n\tprocessIdentifier,\n} from \"./verification-token-storage\";\nimport { getWithHooks } from \"./with-hooks\";\n\nfunction getTTLSeconds(expiresAt: Date | number, now = Date.now()): number {\n\tconst expiresMs =\n\t\ttypeof expiresAt === \"number\" ? expiresAt : expiresAt.getTime();\n\treturn Math.max(Math.floor((expiresMs - now) / 1000), 0);\n}\n\nexport const createInternalAdapter = (\n\tadapter: DBAdapter<BetterAuthOptions>,\n\tctx: {\n\t\toptions: Omit<BetterAuthOptions, \"logger\">;\n\t\tlogger: InternalLogger;\n\t\thooks: Exclude<BetterAuthOptions[\"databaseHooks\"], undefined>[];\n\t\tgenerateId: AuthContext[\"generateId\"];\n\t},\n): InternalAdapter => {\n\tconst logger = ctx.logger;\n\tconst options = ctx.options;\n\tconst secondaryStorage = options.secondaryStorage;\n\tconst sessionExpiration = options.session?.expiresIn || 60 * 60 * 24 * 7; // 7 days\n\tconst {\n\t\tcreateWithHooks,\n\t\tupdateWithHooks,\n\t\tupdateManyWithHooks,\n\t\tdeleteWithHooks,\n\t\tdeleteManyWithHooks,\n\t} = getWithHooks(adapter, ctx);\n\n\tasync function refreshUserSessions(user: User) {\n\t\tif (!secondaryStorage) return;\n\n\t\tconst listRaw = await secondaryStorage.get(`active-sessions-${user.id}`);\n\t\tif (!listRaw) return;\n\n\t\tconst now = Date.now();\n\t\tconst list =\n\t\t\tsafeJSONParse<{ token: string; expiresAt: number }[]>(listRaw) || [];\n\t\tconst validSessions = list.filter((s) => s.expiresAt > now);\n\n\t\tawait Promise.all(\n\t\t\tvalidSessions.map(async ({ token }) => {\n\t\t\t\tconst cached = await secondaryStorage.get(token);\n\t\t\t\tif (!cached) return;\n\t\t\t\tconst parsed = safeJSONParse<{ session: Session; user: User }>(cached);\n\t\t\t\tif (!parsed) return;\n\n\t\t\t\tconst sessionTTL = getTTLSeconds(parsed.session.expiresAt, now);\n\n\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\ttoken,\n\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\tsession: parsed.session,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t}),\n\t\t\t\t\tMath.floor(sessionTTL),\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\t}\n\n\treturn {\n\t\tcreateOAuthUser: async (\n\t\t\tuser: Omit<User, \"id\" | \"createdAt\" | \"updatedAt\">,\n\t\t\taccount: Omit<Account, \"userId\" | \"id\" | \"createdAt\" | \"updatedAt\"> &\n\t\t\t\tPartial<Account>,\n\t\t) => {\n\t\t\treturn runWithTransaction(adapter, async () => {\n\t\t\t\tconst createdUser = await createWithHooks(\n\t\t\t\t\t{\n\t\t\t\t\t\t// todo: we should remove auto setting createdAt and updatedAt in the next major release, since the db generators already handle that\n\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t\t...user,\n\t\t\t\t\t},\n\t\t\t\t\t\"user\",\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tconst createdAccount = await createWithHooks(\n\t\t\t\t\t{\n\t\t\t\t\t\t...account,\n\t\t\t\t\t\tuserId: createdUser!.id,\n\t\t\t\t\t\t// todo: we should remove auto setting createdAt and updatedAt in the next major release, since the db generators already handle that\n\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t},\n\t\t\t\t\t\"account\",\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\tuser: createdUser,\n\t\t\t\t\taccount: createdAccount,\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\tcreateUser: async <T>(\n\t\t\tuser: Omit<User, \"id\" | \"createdAt\" | \"updatedAt\" | \"emailVerified\"> &\n\t\t\t\tPartial<User> &\n\t\t\t\tRecord<string, any>,\n\t\t) => {\n\t\t\tconst createdUser = await createWithHooks(\n\t\t\t\t{\n\t\t\t\t\t// todo: we should remove auto setting createdAt and updatedAt in the next major release, since the db generators already handle that\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t...user,\n\t\t\t\t\temail: user.email?.toLowerCase(),\n\t\t\t\t},\n\t\t\t\t\"user\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\treturn createdUser as T & User;\n\t\t},\n\t\tcreateAccount: async <T extends Record<string, any>>(\n\t\t\taccount: Omit<Account, \"id\" | \"createdAt\" | \"updatedAt\"> &\n\t\t\t\tPartial<Account> &\n\t\t\t\tT,\n\t\t) => {\n\t\t\tconst createdAccount = await createWithHooks(\n\t\t\t\t{\n\t\t\t\t\t// todo: we should remove auto setting createdAt and updatedAt in the next major release, since the db generators already handle that\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t...account,\n\t\t\t\t},\n\t\t\t\t\"account\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\treturn createdAccount as T & Account;\n\t\t},\n\t\tlistSessions: async (userId: string) => {\n\t\t\tif (secondaryStorage) {\n\t\t\t\tconst currentList = await secondaryStorage.get(\n\t\t\t\t\t`active-sessions-${userId}`,\n\t\t\t\t);\n\t\t\t\tif (!currentList) return [];\n\n\t\t\t\tconst list: { token: string; expiresAt: number }[] =\n\t\t\t\t\tsafeJSONParse(currentList) || [];\n\t\t\t\tconst now = Date.now();\n\n\t\t\t\tconst seenTokens = new Set<string>();\n\t\t\t\tconst sessions: Session[] = [];\n\n\t\t\t\tfor (const { token, expiresAt } of list) {\n\t\t\t\t\tif (expiresAt <= now || seenTokens.has(token)) continue;\n\t\t\t\t\tseenTokens.add(token);\n\n\t\t\t\t\tconst data = await secondaryStorage.get(token);\n\t\t\t\t\tif (!data) continue;\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst parsed = (\n\t\t\t\t\t\t\ttypeof data === \"string\" ? JSON.parse(data) : data\n\t\t\t\t\t\t) as {\n\t\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\t\tuser: User;\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif (!parsed?.session) continue;\n\n\t\t\t\t\t\tsessions.push(\n\t\t\t\t\t\t\tparseSessionOutput(ctx.options, {\n\t\t\t\t\t\t\t\t...parsed.session,\n\t\t\t\t\t\t\t\texpiresAt: new Date(parsed.session.expiresAt),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn sessions;\n\t\t\t}\n\n\t\t\tconst sessions = await (\n\t\t\t\tawait getCurrentAdapter(adapter)\n\t\t\t).findMany<Session>({\n\t\t\t\tmodel: \"session\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn sessions;\n\t\t},\n\t\tlistUsers: async (\n\t\t\tlimit?: number | undefined,\n\t\t\toffset?: number | undefined,\n\t\t\tsortBy?:\n\t\t\t\t| {\n\t\t\t\t\t\tfield: string;\n\t\t\t\t\t\tdirection: \"asc\" | \"desc\";\n\t\t\t\t }\n\t\t\t\t| undefined,\n\t\t\twhere?: Where[] | undefined,\n\t\t) => {\n\t\t\tconst users = await (await getCurrentAdapter(adapter)).findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\tsortBy,\n\t\t\t\twhere,\n\t\t\t});\n\t\t\treturn users;\n\t\t},\n\t\tcountTotalUsers: async (where?: Where[] | undefined) => {\n\t\t\tconst total = await (await getCurrentAdapter(adapter)).count({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere,\n\t\t\t});\n\t\t\tif (typeof total === \"string\") {\n\t\t\t\treturn parseInt(total);\n\t\t\t}\n\t\t\treturn total;\n\t\t},\n\t\tdeleteUser: async (userId: string) => {\n\t\t\tif (!secondaryStorage || options.session?.storeSessionInDatabase) {\n\t\t\t\tawait deleteManyWithHooks(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t\"session\",\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait deleteManyWithHooks(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"account\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\tawait deleteWithHooks(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"user\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t},\n\t\tcreateSession: async (\n\t\t\tuserId: string,\n\t\t\tdontRememberMe?: boolean | undefined,\n\t\t\toverride?: (Partial<Session> & Record<string, any>) | undefined,\n\t\t\toverrideAll?: boolean | undefined,\n\t\t) => {\n\t\t\tconst headers: Headers | undefined = await (async () => {\n\t\t\t\tconst ctx = await getCurrentAuthContext().catch(() => null);\n\t\t\t\treturn ctx?.headers || ctx?.request?.headers;\n\t\t\t})();\n\t\t\tconst storeInDb = options.session?.storeSessionInDatabase;\n\t\t\tconst {\n\t\t\t\t// always ignore override id - new sessions must have new ids\n\t\t\t\tid: _,\n\t\t\t\t...rest\n\t\t\t} = override || {};\n\n\t\t\t// we're parsing default values for session additional fields\n\t\t\tconst defaultAdditionalFields = parseSessionInput(options, {});\n\t\t\tconst data = {\n\t\t\t\tipAddress: headers ? getIp(headers, options) || \"\" : \"\",\n\t\t\t\tuserAgent: headers?.get(\"user-agent\") || \"\",\n\t\t\t\t...rest,\n\t\t\t\t/**\n\t\t\t\t * If the user doesn't want to be remembered\n\t\t\t\t * set the session to expire in 1 day.\n\t\t\t\t * The cookie will be set to expire at the end of the session\n\t\t\t\t */\n\t\t\t\texpiresAt: dontRememberMe\n\t\t\t\t\t? getDate(60 * 60 * 24, \"sec\") // 1 day\n\t\t\t\t\t: getDate(sessionExpiration, \"sec\"),\n\t\t\t\tuserId,\n\t\t\t\ttoken: generateId(32),\n\t\t\t\t// todo: we should remove auto setting createdAt and updatedAt in the next major release, since the db generators already handle that\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t...defaultAdditionalFields,\n\t\t\t\t...(overrideAll ? rest : {}),\n\t\t\t} satisfies Partial<Session>;\n\t\t\tconst res = await createWithHooks(\n\t\t\t\tdata,\n\t\t\t\t\"session\",\n\t\t\t\tsecondaryStorage\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tfn: async (sessionData) => {\n\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t * store the session token for the user\n\t\t\t\t\t\t\t\t * so we can retrieve it later for listing sessions\n\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\tconst currentList = await secondaryStorage.get(\n\t\t\t\t\t\t\t\t\t`active-sessions-${userId}`,\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tlet list: { token: string; expiresAt: number }[] = [];\n\t\t\t\t\t\t\t\tconst now = Date.now();\n\n\t\t\t\t\t\t\t\tif (currentList) {\n\t\t\t\t\t\t\t\t\tlist = safeJSONParse(currentList) || [];\n\t\t\t\t\t\t\t\t\tlist = list.filter(\n\t\t\t\t\t\t\t\t\t\t(session) =>\n\t\t\t\t\t\t\t\t\t\t\tsession.expiresAt > now && session.token !== data.token,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst sorted = [\n\t\t\t\t\t\t\t\t\t...list,\n\t\t\t\t\t\t\t\t\t{ token: data.token, expiresAt: data.expiresAt.getTime() },\n\t\t\t\t\t\t\t\t].sort((a, b) => a.expiresAt - b.expiresAt);\n\t\t\t\t\t\t\t\tconst furthestSessionExp =\n\t\t\t\t\t\t\t\t\tsorted.at(-1)?.expiresAt ?? data.expiresAt.getTime();\n\t\t\t\t\t\t\t\tconst furthestSessionTTL = getTTLSeconds(\n\t\t\t\t\t\t\t\t\tfurthestSessionExp,\n\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tif (furthestSessionTTL > 0) {\n\t\t\t\t\t\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\t\t\t\t\t\t`active-sessions-${userId}`,\n\t\t\t\t\t\t\t\t\t\tJSON.stringify(sorted),\n\t\t\t\t\t\t\t\t\t\tfurthestSessionTTL,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst user = await adapter.findOne<User>({\n\t\t\t\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\t\t\t\t\tvalue: userId,\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\tconst sessionTTL = getTTLSeconds(data.expiresAt, now);\n\t\t\t\t\t\t\t\tif (sessionTTL > 0) {\n\t\t\t\t\t\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\t\t\t\t\t\tdata.token,\n\t\t\t\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\t\t\t\tsession: sessionData,\n\t\t\t\t\t\t\t\t\t\t\tuser,\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\tsessionTTL,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn sessionData;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\texecuteMainFn: storeInDb,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t);\n\t\t\treturn res as Session;\n\t\t},\n\t\tfindSession: async (\n\t\t\ttoken: string,\n\t\t): Promise<{\n\t\t\tsession: Session & Record<string, any>;\n\t\t\tuser: User & Record<string, any>;\n\t\t} | null> => {\n\t\t\tif (secondaryStorage) {\n\t\t\t\tconst sessionStringified = await secondaryStorage.get(token);\n\t\t\t\tif (!sessionStringified && !options.session?.storeSessionInDatabase) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tif (sessionStringified) {\n\t\t\t\t\tconst s = safeJSONParse<{\n\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\tuser: User;\n\t\t\t\t\t}>(sessionStringified);\n\t\t\t\t\tif (!s) return null;\n\t\t\t\t\tconst parsedSession = parseSessionOutput(ctx.options, {\n\t\t\t\t\t\t...s.session,\n\t\t\t\t\t\texpiresAt: new Date(s.session.expiresAt),\n\t\t\t\t\t\tcreatedAt: new Date(s.session.createdAt),\n\t\t\t\t\t\tupdatedAt: new Date(s.session.updatedAt),\n\t\t\t\t\t});\n\t\t\t\t\tconst parsedUser = parseUserOutput(ctx.options, {\n\t\t\t\t\t\t...s.user,\n\t\t\t\t\t\tcreatedAt: new Date(s.user.createdAt),\n\t\t\t\t\t\tupdatedAt: new Date(s.user.updatedAt),\n\t\t\t\t\t});\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsession: parsedSession,\n\t\t\t\t\t\tuser: parsedUser,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst currentAdapter = await getCurrentAdapter(adapter);\n\t\t\tconst result = await currentAdapter.findOne<\n\t\t\t\tSession & { user: User | null }\n\t\t\t>({\n\t\t\t\tmodel: \"session\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue: token,\n\t\t\t\t\t\tfield: \"token\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tjoin: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (!result) return null;\n\n\t\t\tconst { user, ...session } = result;\n\t\t\tif (!user) return null;\n\t\t\tconst parsedSession = parseSessionOutput(ctx.options, session);\n\t\t\tconst parsedUser = parseUserOutput(ctx.options, user);\n\t\t\treturn {\n\t\t\t\tsession: parsedSession,\n\t\t\t\tuser: parsedUser,\n\t\t\t};\n\t\t},\n\t\tfindSessions: async (sessionTokens: string[]) => {\n\t\t\tif (secondaryStorage) {\n\t\t\t\tconst sessions: {\n\t\t\t\t\tsession: Session;\n\t\t\t\t\tuser: User;\n\t\t\t\t}[] = [];\n\t\t\t\tfor (const sessionToken of sessionTokens) {\n\t\t\t\t\tconst sessionStringified = await secondaryStorage.get(sessionToken);\n\t\t\t\t\tif (sessionStringified) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst s = (\n\t\t\t\t\t\t\t\ttypeof sessionStringified === \"string\"\n\t\t\t\t\t\t\t\t\t? JSON.parse(sessionStringified)\n\t\t\t\t\t\t\t\t\t: sessionStringified\n\t\t\t\t\t\t\t) as {\n\t\t\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\t\t\tuser: User;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tif (!s?.session) continue;\n\t\t\t\t\t\t\tconst session = {\n\t\t\t\t\t\t\t\tsession: {\n\t\t\t\t\t\t\t\t\t...s.session,\n\t\t\t\t\t\t\t\t\texpiresAt: new Date(s.session.expiresAt),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\t\t\t...s.user,\n\t\t\t\t\t\t\t\t\tcreatedAt: new Date(s.user.createdAt),\n\t\t\t\t\t\t\t\t\tupdatedAt: new Date(s.user.updatedAt),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t} as {\n\t\t\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\t\t\tuser: User;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tsessions.push(session);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Skip invalid/corrupt session data\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn sessions;\n\t\t\t}\n\n\t\t\tconst sessions = await (await getCurrentAdapter(adapter)).findMany<\n\t\t\t\tSession & { user: User | null }\n\t\t\t>({\n\t\t\t\tmodel: \"session\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"token\",\n\t\t\t\t\t\tvalue: sessionTokens,\n\t\t\t\t\t\toperator: \"in\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tjoin: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (!sessions.length) return [];\n\t\t\tif (sessions.some((session) => !session.user)) return [];\n\n\t\t\treturn sessions.map((_session) => {\n\t\t\t\tconst { user, ...session } = _session;\n\t\t\t\treturn {\n\t\t\t\t\tsession,\n\t\t\t\t\tuser: user!,\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\tupdateSession: async (\n\t\t\tsessionToken: string,\n\t\t\tsession: Partial<Session> & Record<string, any>,\n\t\t) => {\n\t\t\tconst updatedSession = await updateWithHooks<Session>(\n\t\t\t\tsession,\n\t\t\t\t[{ field: \"token\", value: sessionToken }],\n\t\t\t\t\"session\",\n\t\t\t\tsecondaryStorage\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tasync fn(data) {\n\t\t\t\t\t\t\t\tconst currentSession = await secondaryStorage.get(sessionToken);\n\t\t\t\t\t\t\t\tif (!currentSession) {\n\t\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst parsedSession = safeJSONParse<{\n\t\t\t\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\t\t\t\tuser: User;\n\t\t\t\t\t\t\t\t}>(currentSession);\n\t\t\t\t\t\t\t\tif (!parsedSession) return null;\n\n\t\t\t\t\t\t\t\tconst mergedSession = {\n\t\t\t\t\t\t\t\t\t...parsedSession.session,\n\t\t\t\t\t\t\t\t\t...data,\n\t\t\t\t\t\t\t\t\texpiresAt: new Date(\n\t\t\t\t\t\t\t\t\t\tdata.expiresAt ?? parsedSession.session.expiresAt,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tcreatedAt: new Date(parsedSession.session.createdAt),\n\t\t\t\t\t\t\t\t\tupdatedAt: new Date(\n\t\t\t\t\t\t\t\t\t\tdata.updatedAt ?? parsedSession.session.updatedAt,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tconst updatedSession = parseSessionOutput(\n\t\t\t\t\t\t\t\t\tctx.options,\n\t\t\t\t\t\t\t\t\tmergedSession,\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tconst now = Date.now();\n\t\t\t\t\t\t\t\tconst expiresMs = new Date(updatedSession.expiresAt).getTime();\n\t\t\t\t\t\t\t\tconst sessionTTL = getTTLSeconds(expiresMs, now);\n\n\t\t\t\t\t\t\t\tif (sessionTTL > 0) {\n\t\t\t\t\t\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\t\t\t\t\t\tsessionToken,\n\t\t\t\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\t\t\t\tsession: updatedSession,\n\t\t\t\t\t\t\t\t\t\t\tuser: parsedSession.user,\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\tsessionTTL,\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\tconst listKey = `active-sessions-${updatedSession.userId}`;\n\t\t\t\t\t\t\t\t\tconst listRaw = await secondaryStorage.get(listKey);\n\t\t\t\t\t\t\t\t\tconst list: { token: string; expiresAt: number }[] = listRaw\n\t\t\t\t\t\t\t\t\t\t? safeJSONParse(listRaw) || []\n\t\t\t\t\t\t\t\t\t\t: [];\n\n\t\t\t\t\t\t\t\t\tconst filtered = list\n\t\t\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t\t\t(s) => s.token !== sessionToken && s.expiresAt > now,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t.concat([{ token: sessionToken, expiresAt: expiresMs }]);\n\n\t\t\t\t\t\t\t\t\tconst sorted = filtered.sort(\n\t\t\t\t\t\t\t\t\t\t(a, b) => a.expiresAt - b.expiresAt,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tconst furthestSessionExp = sorted.at(-1)?.expiresAt;\n\n\t\t\t\t\t\t\t\t\tif (furthestSessionExp && furthestSessionExp > now) {\n\t\t\t\t\t\t\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\t\t\t\t\t\t\tlistKey,\n\t\t\t\t\t\t\t\t\t\t\tJSON.stringify(sorted),\n\t\t\t\t\t\t\t\t\t\t\tgetTTLSeconds(furthestSessionExp, now),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tawait secondaryStorage.delete(listKey);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn updatedSession;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\texecuteMainFn: options.session?.storeSessionInDatabase,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t);\n\t\t\treturn updatedSession;\n\t\t},\n\t\tdeleteSession: async (token: string) => {\n\t\t\tif (secondaryStorage) {\n\t\t\t\t// remove the session from the active sessions list\n\t\t\t\tconst data = await secondaryStorage.get(token);\n\t\t\t\tif (data) {\n\t\t\t\t\tconst { session } =\n\t\t\t\t\t\tsafeJSONParse<{\n\t\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\t\tuser: User;\n\t\t\t\t\t\t}>(data) ?? {};\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\tlogger.error(\"Session not found in secondary storage\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst userId = session.userId;\n\n\t\t\t\t\tconst currentList = await secondaryStorage.get(\n\t\t\t\t\t\t`active-sessions-${userId}`,\n\t\t\t\t\t);\n\t\t\t\t\tif (currentList) {\n\t\t\t\t\t\tconst list: { token: string; expiresAt: number }[] =\n\t\t\t\t\t\t\tsafeJSONParse(currentList) || [];\n\t\t\t\t\t\tconst now = Date.now();\n\n\t\t\t\t\t\tconst filtered = list.filter(\n\t\t\t\t\t\t\t(session) => session.expiresAt > now && session.token !== token,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst sorted = filtered.sort((a, b) => a.expiresAt - b.expiresAt);\n\t\t\t\t\t\tconst furthestSessionExp = sorted.at(-1)?.expiresAt;\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tfiltered.length > 0 &&\n\t\t\t\t\t\t\tfurthestSessionExp &&\n\t\t\t\t\t\t\tfurthestSessionExp > Date.now()\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\t\t\t\t`active-sessions-${userId}`,\n\t\t\t\t\t\t\t\tJSON.stringify(filtered),\n\t\t\t\t\t\t\t\tgetTTLSeconds(furthestSessionExp, now),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tawait secondaryStorage.delete(`active-sessions-${userId}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.error(\"Active sessions list not found in secondary storage\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tawait secondaryStorage.delete(token);\n\n\t\t\t\tif (\n\t\t\t\t\t!options.session?.storeSessionInDatabase ||\n\t\t\t\t\tctx.options.session?.preserveSessionInDatabase\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait deleteWithHooks(\n\t\t\t\t[{ field: \"token\", value: token }],\n\t\t\t\t\"session\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t},\n\t\tdeleteAccounts: async (userId: string) => {\n\t\t\tawait deleteManyWithHooks(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"account\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t},\n\t\tdeleteAccount: async (accountId: string) => {\n\t\t\tawait deleteWithHooks(\n\t\t\t\t[{ field: \"id\", value: accountId }],\n\t\t\t\t\"account\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t},\n\t\tdeleteSessions: async (userIdOrSessionTokens: string | string[]) => {\n\t\t\tif (secondaryStorage) {\n\t\t\t\tif (typeof userIdOrSessionTokens === \"string\") {\n\t\t\t\t\tconst activeSession = await secondaryStorage.get(\n\t\t\t\t\t\t`active-sessions-${userIdOrSessionTokens}`,\n\t\t\t\t\t);\n\t\t\t\t\tconst sessions = activeSession\n\t\t\t\t\t\t? safeJSONParse<{ token: string }[]>(activeSession)\n\t\t\t\t\t\t: [];\n\t\t\t\t\tif (!sessions) return;\n\t\t\t\t\tfor (const session of sessions) {\n\t\t\t\t\t\tawait secondaryStorage.delete(session.token);\n\t\t\t\t\t}\n\t\t\t\t\tawait secondaryStorage.delete(\n\t\t\t\t\t\t`active-sessions-${userIdOrSessionTokens}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tfor (const sessionToken of userIdOrSessionTokens) {\n\t\t\t\t\t\tconst session = await secondaryStorage.get(sessionToken);\n\t\t\t\t\t\tif (session) {\n\t\t\t\t\t\t\tawait secondaryStorage.delete(sessionToken);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t!options.session?.storeSessionInDatabase ||\n\t\t\t\t\tctx.options.session?.preserveSessionInDatabase\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait deleteManyWithHooks(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: Array.isArray(userIdOrSessionTokens) ? \"token\" : \"userId\",\n\t\t\t\t\t\tvalue: userIdOrSessionTokens,\n\t\t\t\t\t\toperator: Array.isArray(userIdOrSessionTokens) ? \"in\" : undefined,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"session\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t},\n\t\tfindOAuthUser: async (\n\t\t\temail: string,\n\t\t\taccountId: string,\n\t\t\tproviderId: string,\n\t\t) => {\n\t\t\t// we need to find account first to avoid missing user if the email changed with the provider for the same account\n\t\t\tconst account = await (await getCurrentAdapter(adapter)).findOne<\n\t\t\t\tAccount & { user: User | null }\n\t\t\t>({\n\t\t\t\tmodel: \"account\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue: accountId,\n\t\t\t\t\t\tfield: \"accountId\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue: providerId,\n\t\t\t\t\t\tfield: \"providerId\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tjoin: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (account) {\n\t\t\t\tif (account.user) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tuser: account.user,\n\t\t\t\t\t\tlinkedAccount: account,\n\t\t\t\t\t\taccounts: [account],\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tconst user = await (await getCurrentAdapter(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\tvalue: email.toLowerCase(),\n\t\t\t\t\t\t\t\tfield: \"email\",\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 {\n\t\t\t\t\t\t\tuser,\n\t\t\t\t\t\t\tlinkedAccount: account,\n\t\t\t\t\t\t\taccounts: [account],\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst user = await (await getCurrentAdapter(adapter)).findOne<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvalue: email.toLowerCase(),\n\t\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t\tif (user) {\n\t\t\t\t\tconst accounts = await (\n\t\t\t\t\t\tawait getCurrentAdapter(adapter)\n\t\t\t\t\t).findMany<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\tvalue: user.id,\n\t\t\t\t\t\t\t\tfield: \"userId\",\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\treturn {\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tlinkedAccount: null,\n\t\t\t\t\t\taccounts: accounts || [],\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tfindUserByEmail: async (\n\t\t\temail: string,\n\t\t\toptions?: { includeAccounts: boolean } | undefined,\n\t\t) => {\n\t\t\tconst currentAdapter = await getCurrentAdapter(adapter);\n\t\t\tconst result = await currentAdapter.findOne<\n\t\t\t\tUser & { account: Account[] | undefined }\n\t\t\t>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue: email.toLowerCase(),\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tjoin: {\n\t\t\t\t\t...(options?.includeAccounts ? { account: true } : {}),\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (!result) return null;\n\t\t\tconst { account: accounts, ...user } = result;\n\t\t\treturn {\n\t\t\t\tuser,\n\t\t\t\taccounts: accounts ?? [],\n\t\t\t};\n\t\t},\n\t\tfindUserById: async (userId: string) => {\n\t\t\tif (!userId) return null;\n\t\t\tconst user = await (await getCurrentAdapter(adapter)).findOne<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn user;\n\t\t},\n\t\tlinkAccount: async (\n\t\t\taccount: Omit<Account, \"id\" | \"createdAt\" | \"updatedAt\"> &\n\t\t\t\tPartial<Account>,\n\t\t) => {\n\t\t\tconst _account = await createWithHooks(\n\t\t\t\t{\n\t\t\t\t\t// todo: we should remove auto setting createdAt and updatedAt in the next major release, since the db generators already handle that\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t...account,\n\t\t\t\t},\n\t\t\t\t\"account\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\treturn _account;\n\t\t},\n\t\tupdateUser: async (\n\t\t\tuserId: string,\n\t\t\tdata: Partial<User> & Record<string, any>,\n\t\t) => {\n\t\t\tconst user = await updateWithHooks<User>(\n\t\t\t\tdata,\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"user\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tawait refreshUserSessions(user);\n\t\t\treturn user;\n\t\t},\n\t\tupdateUserByEmail: async (\n\t\t\temail: string,\n\t\t\tdata: Partial<User & Record<string, any>>,\n\t\t) => {\n\t\t\tconst user = await updateWithHooks<User>(\n\t\t\t\tdata,\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\tvalue: email.toLowerCase(),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"user\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tawait refreshUserSessions(user);\n\t\t\treturn user;\n\t\t},\n\t\tupdatePassword: async (userId: string, password: string) => {\n\t\t\tawait updateManyWithHooks(\n\t\t\t\t{\n\t\t\t\t\tpassword,\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"providerId\",\n\t\t\t\t\t\tvalue: \"credential\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"account\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t},\n\t\tfindAccounts: async (userId: string) => {\n\t\t\tconst accounts = await (\n\t\t\t\tawait getCurrentAdapter(adapter)\n\t\t\t).findMany<Account>({\n\t\t\t\tmodel: \"account\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn accounts;\n\t\t},\n\t\tfindAccount: async (accountId: string) => {\n\t\t\tconst account = await (await getCurrentAdapter(adapter)).findOne<Account>(\n\t\t\t\t{\n\t\t\t\t\tmodel: \"account\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"accountId\",\n\t\t\t\t\t\t\tvalue: accountId,\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\treturn account;\n\t\t},\n\t\tfindAccountByProviderId: async (accountId: string, providerId: string) => {\n\t\t\tconst account = await (await getCurrentAdapter(adapter)).findOne<Account>(\n\t\t\t\t{\n\t\t\t\t\tmodel: \"account\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"accountId\",\n\t\t\t\t\t\t\tvalue: accountId,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"providerId\",\n\t\t\t\t\t\t\tvalue: providerId,\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\treturn account;\n\t\t},\n\t\tfindAccountByUserId: async (userId: string) => {\n\t\t\tconst account = await (\n\t\t\t\tawait getCurrentAdapter(adapter)\n\t\t\t).findMany<Account>({\n\t\t\t\tmodel: \"account\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn account;\n\t\t},\n\t\tupdateAccount: async (id: string, data: Partial<Account>) => {\n\t\t\tconst account = await updateWithHooks<Account>(\n\t\t\t\tdata,\n\t\t\t\t[{ field: \"id\", value: id }],\n\t\t\t\t\"account\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\treturn account;\n\t\t},\n\t\tcreateVerificationValue: async (\n\t\t\tdata: Omit<Verification, \"createdAt\" | \"id\" | \"updatedAt\"> &\n\t\t\t\tPartial<Verification>,\n\t\t) => {\n\t\t\tconst storageOption = getStorageOption(\n\t\t\t\tdata.identifier,\n\t\t\t\toptions.verification?.storeIdentifier,\n\t\t\t);\n\t\t\tconst storedIdentifier = await processIdentifier(\n\t\t\t\tdata.identifier,\n\t\t\t\tstorageOption,\n\t\t\t);\n\n\t\t\tconst verification = await createWithHooks(\n\t\t\t\t{\n\t\t\t\t\t// todo: we should remove auto setting createdAt and updatedAt in the next major release, since the db generators already handle that\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t...data,\n\t\t\t\t\tidentifier: storedIdentifier,\n\t\t\t\t},\n\t\t\t\t\"verification\",\n\t\t\t\tsecondaryStorage\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tasync fn(verificationData) {\n\t\t\t\t\t\t\t\tconst ttl = getTTLSeconds(verificationData.expiresAt);\n\t\t\t\t\t\t\t\tif (ttl > 0) {\n\t\t\t\t\t\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\t\t\t\t\t\t`verification:${storedIdentifier}`,\n\t\t\t\t\t\t\t\t\t\tJSON.stringify(verificationData),\n\t\t\t\t\t\t\t\t\t\tttl,\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\treturn verificationData;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\texecuteMainFn: options.verification?.storeInDatabase,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t);\n\t\t\treturn verification as Verification;\n\t\t},\n\t\tfindVerificationValue: async (identifier: string) => {\n\t\t\tconst storageOption = getStorageOption(\n\t\t\t\tidentifier,\n\t\t\t\toptions.verification?.storeIdentifier,\n\t\t\t);\n\t\t\tconst storedIdentifier = await processIdentifier(\n\t\t\t\tidentifier,\n\t\t\t\tstorageOption,\n\t\t\t);\n\n\t\t\tif (secondaryStorage) {\n\t\t\t\tconst cached = await secondaryStorage.get(\n\t\t\t\t\t`verification:${storedIdentifier}`,\n\t\t\t\t);\n\t\t\t\tif (cached) {\n\t\t\t\t\tconst parsed = safeJSONParse<Verification>(cached);\n\t\t\t\t\tif (parsed) {\n\t\t\t\t\t\treturn parsed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (storageOption && storageOption !== \"plain\") {\n\t\t\t\t\tconst plainCached = await secondaryStorage.get(\n\t\t\t\t\t\t`verification:${identifier}`,\n\t\t\t\t\t);\n\t\t\t\t\tif (plainCached) {\n\t\t\t\t\t\tconst parsed = safeJSONParse<Verification>(plainCached);\n\t\t\t\t\t\tif (parsed) {\n\t\t\t\t\t\t\treturn parsed;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!options.verification?.storeInDatabase) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst currentAdapter = await getCurrentAdapter(adapter);\n\n\t\t\tasync function findByIdentifier(id: string) {\n\t\t\t\treturn currentAdapter.findMany<Verification>({\n\t\t\t\t\tmodel: \"verification\",\n\t\t\t\t\twhere: [{ field: \"identifier\", value: id }],\n\t\t\t\t\tsortBy: { field: \"createdAt\", direction: \"desc\" },\n\t\t\t\t\tlimit: 1,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet verification = await findByIdentifier(storedIdentifier);\n\n\t\t\tif (!verification.length && storageOption && storageOption !== \"plain\") {\n\t\t\t\tverification = await findByIdentifier(identifier);\n\t\t\t}\n\n\t\t\tif (!options.verification?.disableCleanup) {\n\t\t\t\tawait deleteManyWithHooks(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"expiresAt\",\n\t\t\t\t\t\t\tvalue: new Date(),\n\t\t\t\t\t\t\toperator: \"lt\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t\"verification\",\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn (verification[0] as Verification) || null;\n\t\t},\n\t\t/**\n\t\t * Note: In secondary-only mode, this is a no-op since secondary storage\n\t\t * is keyed by identifier, not id. Use deleteVerificationByIdentifier instead.\n\t\t */\n\t\tdeleteVerificationValue: async (id: string) => {\n\t\t\tif (!secondaryStorage || options.verification?.storeInDatabase) {\n\t\t\t\tawait deleteWithHooks(\n\t\t\t\t\t[{ field: \"id\", value: id }],\n\t\t\t\t\t\"verification\",\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tdeleteVerificationByIdentifier: async (identifier: string) => {\n\t\t\tconst storageOption = getStorageOption(\n\t\t\t\tidentifier,\n\t\t\t\toptions.verification?.storeIdentifier,\n\t\t\t);\n\t\t\tconst storedIdentifier = await processIdentifier(\n\t\t\t\tidentifier,\n\t\t\t\tstorageOption,\n\t\t\t);\n\n\t\t\tif (secondaryStorage) {\n\t\t\t\tawait secondaryStorage.delete(`verification:${storedIdentifier}`);\n\t\t\t}\n\n\t\t\tif (!secondaryStorage || options.verification?.storeInDatabase) {\n\t\t\t\tawait deleteWithHooks(\n\t\t\t\t\t[{ field: \"identifier\", value: storedIdentifier }],\n\t\t\t\t\t\"verification\",\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tupdateVerificationValue: async (\n\t\t\tid: string,\n\t\t\tdata: Partial<Verification>,\n\t\t) => {\n\t\t\tconst verification = await updateWithHooks<Verification>(\n\t\t\t\tdata,\n\t\t\t\t[{ field: \"id\", value: id }],\n\t\t\t\t\"verification\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\treturn verification;\n\t\t},\n\t};\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Account, Session as Session$1, User as User$1 } from "../types/models.mjs";
|
|
2
|
+
import "../types/index.mjs";
|
|
3
|
+
import { BetterAuthOptions } from "@better-auth/core";
|
|
4
|
+
import { BetterAuthPluginDBSchema, DBFieldAttribute } from "@better-auth/core/db";
|
|
5
|
+
|
|
6
|
+
//#region src/db/schema.d.ts
|
|
7
|
+
declare function parseUserOutput<T extends User$1>(options: BetterAuthOptions, user: T): any;
|
|
8
|
+
declare function parseSessionOutput<T extends Session$1>(options: BetterAuthOptions, session: T): any;
|
|
9
|
+
declare function parseAccountOutput<T extends Account>(options: BetterAuthOptions, account: T): any;
|
|
10
|
+
declare function parseInputData<T extends Record<string, any>>(data: T, schema: {
|
|
11
|
+
fields: Record<string, DBFieldAttribute>;
|
|
12
|
+
action?: ("create" | "update") | undefined;
|
|
13
|
+
}): Partial<T>;
|
|
14
|
+
declare function parseUserInput(options: BetterAuthOptions, user: Record<string, any> | undefined, action: "create" | "update"): Partial<Record<string, any>>;
|
|
15
|
+
declare function parseAdditionalUserInput(options: BetterAuthOptions, user?: Record<string, any> | undefined): Partial<Record<string, any>>;
|
|
16
|
+
declare function parseAccountInput(options: BetterAuthOptions, account: Partial<Account>): Account;
|
|
17
|
+
declare function parseSessionInput(options: BetterAuthOptions, session: Partial<Session$1>): Session$1;
|
|
18
|
+
declare function mergeSchema<S extends BetterAuthPluginDBSchema>(schema: S, newSchema?: { [K in keyof S]?: {
|
|
19
|
+
modelName?: string | undefined;
|
|
20
|
+
fields?: {
|
|
21
|
+
[P: string]: string;
|
|
22
|
+
} | undefined;
|
|
23
|
+
} | undefined } | undefined): S;
|
|
24
|
+
//#endregion
|
|
25
|
+
export { mergeSchema, parseAccountInput, parseAccountOutput, parseAdditionalUserInput, parseInputData, parseSessionInput, parseSessionOutput, parseUserInput, parseUserOutput };
|
|
26
|
+
//# sourceMappingURL=schema.d.mts.map
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { getAuthTables } from "@better-auth/core/db";
|
|
2
|
+
import { APIError, BASE_ERROR_CODES } from "@better-auth/core/error";
|
|
3
|
+
import { filterOutputFields } from "@better-auth/core/utils/db";
|
|
4
|
+
|
|
5
|
+
//#region src/db/schema.ts
|
|
6
|
+
const cache = /* @__PURE__ */ new WeakMap();
|
|
7
|
+
function getFields(options, modelName, mode) {
|
|
8
|
+
const cacheKey = `${modelName}:${mode}`;
|
|
9
|
+
if (!cache.has(options)) cache.set(options, /* @__PURE__ */ new Map());
|
|
10
|
+
const tableCache = cache.get(options);
|
|
11
|
+
if (tableCache.has(cacheKey)) return tableCache.get(cacheKey);
|
|
12
|
+
const coreSchema = mode === "output" ? getAuthTables(options)[modelName]?.fields ?? {} : {};
|
|
13
|
+
const additionalFields = modelName === "user" || modelName === "session" || modelName === "account" ? options[modelName]?.additionalFields : void 0;
|
|
14
|
+
let schema = {
|
|
15
|
+
...coreSchema,
|
|
16
|
+
...additionalFields ?? {}
|
|
17
|
+
};
|
|
18
|
+
for (const plugin of options.plugins || []) if (plugin.schema && plugin.schema[modelName]) schema = {
|
|
19
|
+
...schema,
|
|
20
|
+
...plugin.schema[modelName].fields
|
|
21
|
+
};
|
|
22
|
+
tableCache.set(cacheKey, schema);
|
|
23
|
+
return schema;
|
|
24
|
+
}
|
|
25
|
+
function parseUserOutput(options, user) {
|
|
26
|
+
return filterOutputFields(user, getFields(options, "user", "output"));
|
|
27
|
+
}
|
|
28
|
+
function parseSessionOutput(options, session) {
|
|
29
|
+
return filterOutputFields(session, getFields(options, "session", "output"));
|
|
30
|
+
}
|
|
31
|
+
function parseAccountOutput(options, account) {
|
|
32
|
+
const { accessToken: _accessToken, refreshToken: _refreshToken, idToken: _idToken, accessTokenExpiresAt: _accessTokenExpiresAt, refreshTokenExpiresAt: _refreshTokenExpiresAt, password: _password, ...rest } = filterOutputFields(account, getFields(options, "account", "output"));
|
|
33
|
+
return rest;
|
|
34
|
+
}
|
|
35
|
+
function parseInputData(data, schema) {
|
|
36
|
+
const action = schema.action || "create";
|
|
37
|
+
const fields = schema.fields;
|
|
38
|
+
const parsedData = Object.create(null);
|
|
39
|
+
for (const key in fields) {
|
|
40
|
+
if (key in data) {
|
|
41
|
+
if (fields[key].input === false) {
|
|
42
|
+
if (fields[key].defaultValue !== void 0) {
|
|
43
|
+
if (action !== "update") {
|
|
44
|
+
parsedData[key] = fields[key].defaultValue;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (data[key]) throw APIError.from("BAD_REQUEST", {
|
|
49
|
+
...BASE_ERROR_CODES.FIELD_NOT_ALLOWED,
|
|
50
|
+
message: `${key} is not allowed to be set`
|
|
51
|
+
});
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (fields[key].validator?.input && data[key] !== void 0) {
|
|
55
|
+
const result = fields[key].validator.input["~standard"].validate(data[key]);
|
|
56
|
+
if (result instanceof Promise) throw APIError.from("INTERNAL_SERVER_ERROR", BASE_ERROR_CODES.ASYNC_VALIDATION_NOT_SUPPORTED);
|
|
57
|
+
if ("issues" in result && result.issues) throw APIError.from("BAD_REQUEST", {
|
|
58
|
+
...BASE_ERROR_CODES.VALIDATION_ERROR,
|
|
59
|
+
message: result.issues[0]?.message || "Validation Error"
|
|
60
|
+
});
|
|
61
|
+
parsedData[key] = result.value;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (fields[key].transform?.input && data[key] !== void 0) {
|
|
65
|
+
parsedData[key] = fields[key].transform?.input(data[key]);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
parsedData[key] = data[key];
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (fields[key].defaultValue !== void 0 && action === "create") {
|
|
72
|
+
if (typeof fields[key].defaultValue === "function") {
|
|
73
|
+
parsedData[key] = fields[key].defaultValue();
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
parsedData[key] = fields[key].defaultValue;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (fields[key].required && action === "create") throw APIError.from("BAD_REQUEST", {
|
|
80
|
+
...BASE_ERROR_CODES.MISSING_FIELD,
|
|
81
|
+
message: `${key} is required`
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return parsedData;
|
|
85
|
+
}
|
|
86
|
+
function parseUserInput(options, user = {}, action) {
|
|
87
|
+
return parseInputData(user, {
|
|
88
|
+
fields: getFields(options, "user", "input"),
|
|
89
|
+
action
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
function parseAdditionalUserInput(options, user) {
|
|
93
|
+
const schema = getFields(options, "user", "input");
|
|
94
|
+
return parseInputData(user || {}, { fields: schema });
|
|
95
|
+
}
|
|
96
|
+
function parseAccountInput(options, account) {
|
|
97
|
+
return parseInputData(account, { fields: getFields(options, "account", "input") });
|
|
98
|
+
}
|
|
99
|
+
function parseSessionInput(options, session) {
|
|
100
|
+
return parseInputData(session, { fields: getFields(options, "session", "input") });
|
|
101
|
+
}
|
|
102
|
+
function mergeSchema(schema, newSchema) {
|
|
103
|
+
if (!newSchema) return schema;
|
|
104
|
+
for (const table in newSchema) {
|
|
105
|
+
const newModelName = newSchema[table]?.modelName;
|
|
106
|
+
if (newModelName) schema[table].modelName = newModelName;
|
|
107
|
+
for (const field in schema[table].fields) {
|
|
108
|
+
const newField = newSchema[table]?.fields?.[field];
|
|
109
|
+
if (!newField) continue;
|
|
110
|
+
schema[table].fields[field].fieldName = newField;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return schema;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
//#endregion
|
|
117
|
+
export { mergeSchema, parseAccountInput, parseAccountOutput, parseAdditionalUserInput, parseInputData, parseSessionInput, parseSessionOutput, parseUserInput, parseUserOutput };
|
|
118
|
+
//# sourceMappingURL=schema.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.mjs","names":[],"sources":["../../src/db/schema.ts"],"sourcesContent":["import type { BetterAuthOptions } from \"@better-auth/core\";\nimport type {\n\tBaseModelNames,\n\tBetterAuthPluginDBSchema,\n\tDBFieldAttribute,\n} from \"@better-auth/core/db\";\nimport { getAuthTables } from \"@better-auth/core/db\";\nimport { APIError, BASE_ERROR_CODES } from \"@better-auth/core/error\";\nimport { filterOutputFields } from \"@better-auth/core/utils/db\";\nimport type { Account, Session, User } from \"../types\";\n\ntype Mode = \"input\" | \"output\";\n\n// Cache for parsed schemas to avoid reparsing on every request\nconst cache = new WeakMap<\n\tBetterAuthOptions,\n\tMap<`${BaseModelNames}:${Mode}`, Record<string, DBFieldAttribute>>\n>();\n\nfunction getFields(\n\toptions: BetterAuthOptions,\n\tmodelName: BaseModelNames,\n\tmode: Mode,\n) {\n\tconst cacheKey = `${modelName}:${mode}` as const;\n\tif (!cache.has(options)) {\n\t\tcache.set(options, new Map());\n\t}\n\tconst tableCache = cache.get(options)!;\n\tif (tableCache.has(cacheKey)) {\n\t\treturn tableCache.get(cacheKey)!;\n\t}\n\tconst coreSchema =\n\t\tmode === \"output\" ? (getAuthTables(options)[modelName]?.fields ?? {}) : {};\n\tconst additionalFields =\n\t\tmodelName === \"user\" || modelName === \"session\" || modelName === \"account\"\n\t\t\t? options[modelName]?.additionalFields\n\t\t\t: undefined;\n\tlet schema: Record<string, DBFieldAttribute> = {\n\t\t...coreSchema,\n\t\t...(additionalFields ?? {}),\n\t};\n\tfor (const plugin of options.plugins || []) {\n\t\tif (plugin.schema && plugin.schema[modelName]) {\n\t\t\tschema = {\n\t\t\t\t...schema,\n\t\t\t\t...plugin.schema[modelName].fields,\n\t\t\t};\n\t\t}\n\t}\n\ttableCache.set(cacheKey, schema);\n\treturn schema;\n}\n\nexport function parseUserOutput<T extends User>(\n\toptions: BetterAuthOptions,\n\tuser: T,\n) {\n\tconst schema = getFields(options, \"user\", \"output\");\n\treturn filterOutputFields(user, schema);\n}\n\nexport function parseSessionOutput<T extends Session>(\n\toptions: BetterAuthOptions,\n\tsession: T,\n) {\n\tconst schema = getFields(options, \"session\", \"output\");\n\treturn filterOutputFields(session, schema);\n}\n\nexport function parseAccountOutput<T extends Account>(\n\toptions: BetterAuthOptions,\n\taccount: T,\n) {\n\tconst schema = getFields(options, \"account\", \"output\");\n\tconst parsed = filterOutputFields(account, schema);\n\t// destructuring for type inference\n\t// runtime filtering is already done by `filterOutputFields`\n\tconst {\n\t\taccessToken: _accessToken,\n\t\trefreshToken: _refreshToken,\n\t\tidToken: _idToken,\n\t\taccessTokenExpiresAt: _accessTokenExpiresAt,\n\t\trefreshTokenExpiresAt: _refreshTokenExpiresAt,\n\t\tpassword: _password,\n\t\t...rest\n\t} = parsed;\n\treturn rest;\n}\n\nexport function parseInputData<T extends Record<string, any>>(\n\tdata: T,\n\tschema: {\n\t\tfields: Record<string, DBFieldAttribute>;\n\t\taction?: (\"create\" | \"update\") | undefined;\n\t},\n) {\n\tconst action = schema.action || \"create\";\n\tconst fields = schema.fields;\n\tconst parsedData = Object.create(null);\n\tfor (const key in fields) {\n\t\tif (key in data) {\n\t\t\tif (fields[key]!.input === false) {\n\t\t\t\tif (fields[key]!.defaultValue !== undefined) {\n\t\t\t\t\tif (action !== \"update\") {\n\t\t\t\t\t\tparsedData[key] = fields[key]!.defaultValue;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (data[key]) {\n\t\t\t\t\tthrow APIError.from(\"BAD_REQUEST\", {\n\t\t\t\t\t\t...BASE_ERROR_CODES.FIELD_NOT_ALLOWED,\n\t\t\t\t\t\tmessage: `${key} is not allowed to be set`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (fields[key]!.validator?.input && data[key] !== undefined) {\n\t\t\t\tconst result = fields[key]!.validator.input[\"~standard\"].validate(\n\t\t\t\t\tdata[key],\n\t\t\t\t);\n\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"INTERNAL_SERVER_ERROR\",\n\t\t\t\t\t\tBASE_ERROR_CODES.ASYNC_VALIDATION_NOT_SUPPORTED,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (\"issues\" in result && result.issues) {\n\t\t\t\t\tthrow APIError.from(\"BAD_REQUEST\", {\n\t\t\t\t\t\t...BASE_ERROR_CODES.VALIDATION_ERROR,\n\t\t\t\t\t\tmessage: result.issues[0]?.message || \"Validation Error\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tparsedData[key] = result.value;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (fields[key]!.transform?.input && data[key] !== undefined) {\n\t\t\t\tparsedData[key] = fields[key]!.transform?.input(data[key]);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tparsedData[key] = data[key];\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (fields[key]!.defaultValue !== undefined && action === \"create\") {\n\t\t\tif (typeof fields[key]!.defaultValue === \"function\") {\n\t\t\t\tparsedData[key] = fields[key]!.defaultValue();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tparsedData[key] = fields[key]!.defaultValue;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (fields[key]!.required && action === \"create\") {\n\t\t\tthrow APIError.from(\"BAD_REQUEST\", {\n\t\t\t\t...BASE_ERROR_CODES.MISSING_FIELD,\n\t\t\t\tmessage: `${key} is required`,\n\t\t\t});\n\t\t}\n\t}\n\treturn parsedData as Partial<T>;\n}\n\nexport function parseUserInput(\n\toptions: BetterAuthOptions,\n\tuser: Record<string, any> = {},\n\taction: \"create\" | \"update\",\n) {\n\tconst schema = getFields(options, \"user\", \"input\");\n\treturn parseInputData(user, { fields: schema, action });\n}\n\nexport function parseAdditionalUserInput(\n\toptions: BetterAuthOptions,\n\tuser?: Record<string, any> | undefined,\n) {\n\tconst schema = getFields(options, \"user\", \"input\");\n\treturn parseInputData(user || {}, { fields: schema });\n}\n\nexport function parseAccountInput(\n\toptions: BetterAuthOptions,\n\taccount: Partial<Account>,\n) {\n\tconst schema = getFields(options, \"account\", \"input\");\n\treturn parseInputData(account, { fields: schema });\n}\n\nexport function parseSessionInput(\n\toptions: BetterAuthOptions,\n\tsession: Partial<Session>,\n) {\n\tconst schema = getFields(options, \"session\", \"input\");\n\treturn parseInputData(session, { fields: schema });\n}\n\nexport function mergeSchema<S extends BetterAuthPluginDBSchema>(\n\tschema: S,\n\tnewSchema?:\n\t\t| {\n\t\t\t\t[K in keyof S]?:\n\t\t\t\t\t| {\n\t\t\t\t\t\t\tmodelName?: string | undefined;\n\t\t\t\t\t\t\tfields?:\n\t\t\t\t\t\t\t\t| {\n\t\t\t\t\t\t\t\t\t\t[P: string]: string;\n\t\t\t\t\t\t\t\t }\n\t\t\t\t\t\t\t\t| undefined;\n\t\t\t\t\t }\n\t\t\t\t\t| undefined;\n\t\t }\n\t\t| undefined,\n) {\n\tif (!newSchema) {\n\t\treturn schema;\n\t}\n\tfor (const table in newSchema) {\n\t\tconst newModelName = newSchema[table]?.modelName;\n\t\tif (newModelName) {\n\t\t\tschema[table]!.modelName = newModelName;\n\t\t}\n\t\tfor (const field in schema[table]!.fields) {\n\t\t\tconst newField = newSchema[table]?.fields?.[field];\n\t\t\tif (!newField) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tschema[table]!.fields[field]!.fieldName = newField;\n\t\t}\n\t}\n\treturn schema;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { DBFieldAttribute } from "@better-auth/core/db";
|
|
2
|
+
import * as z from "zod";
|
|
3
|
+
|
|
4
|
+
//#region src/db/to-zod.d.ts
|
|
5
|
+
declare function toZodSchema<Fields extends Record<string, DBFieldAttribute | never>, IsClientSide extends boolean>({
|
|
6
|
+
fields,
|
|
7
|
+
isClientSide
|
|
8
|
+
}: {
|
|
9
|
+
fields: Fields;
|
|
10
|
+
/**
|
|
11
|
+
* If true, then any fields that have `input: false` will be removed from the schema to prevent user input.
|
|
12
|
+
*/
|
|
13
|
+
isClientSide: IsClientSide;
|
|
14
|
+
}): z.ZodObject<RemoveNeverProps<{ [key in keyof Fields]: FieldAttributeToSchema<Fields[key], IsClientSide> }>, z.core.$strip>;
|
|
15
|
+
type FieldAttributeToSchema<Field extends DBFieldAttribute | Record<string, never>, isClientSide extends boolean = false> = Field extends {
|
|
16
|
+
type: any;
|
|
17
|
+
} ? GetInput<isClientSide, Field, GetRequired<Field, GetType<Field>>> : Record<string, never>;
|
|
18
|
+
type GetType<F extends DBFieldAttribute> = F extends {
|
|
19
|
+
type: "string";
|
|
20
|
+
} ? z.ZodString : F extends {
|
|
21
|
+
type: "number";
|
|
22
|
+
} ? z.ZodNumber : F extends {
|
|
23
|
+
type: "boolean";
|
|
24
|
+
} ? z.ZodBoolean : F extends {
|
|
25
|
+
type: "date";
|
|
26
|
+
} ? z.ZodDate : z.ZodAny;
|
|
27
|
+
type GetRequired<F extends DBFieldAttribute, Schema extends z.core.SomeType> = F extends {
|
|
28
|
+
required: true;
|
|
29
|
+
} ? Schema : z.ZodOptional<Schema>;
|
|
30
|
+
type GetInput<isClientSide extends boolean, Field extends DBFieldAttribute, Schema extends z.core.SomeType> = Field extends {
|
|
31
|
+
input: false;
|
|
32
|
+
} ? isClientSide extends true ? never : Schema : Schema;
|
|
33
|
+
type RemoveNeverProps<T> = { [K in keyof T as [T[K]] extends [never] ? never : K]: T[K] };
|
|
34
|
+
//#endregion
|
|
35
|
+
export { FieldAttributeToSchema, toZodSchema };
|
|
36
|
+
//# sourceMappingURL=to-zod.d.mts.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
|
|
3
|
+
//#region src/db/to-zod.ts
|
|
4
|
+
function toZodSchema({ fields, isClientSide }) {
|
|
5
|
+
const zodFields = Object.keys(fields).reduce((acc, key) => {
|
|
6
|
+
const field = fields[key];
|
|
7
|
+
if (!field) return acc;
|
|
8
|
+
if (isClientSide && field.input === false) return acc;
|
|
9
|
+
let schema;
|
|
10
|
+
if (field.type === "json") schema = z.json ? z.json() : z.any();
|
|
11
|
+
else if (field.type === "string[]" || field.type === "number[]") schema = z.array(field.type === "string[]" ? z.string() : z.number());
|
|
12
|
+
else if (Array.isArray(field.type)) schema = z.any();
|
|
13
|
+
else schema = z[field.type]();
|
|
14
|
+
if (field?.required === false) schema = schema.optional();
|
|
15
|
+
if (!isClientSide && field?.returned === false) return acc;
|
|
16
|
+
return {
|
|
17
|
+
...acc,
|
|
18
|
+
[key]: schema
|
|
19
|
+
};
|
|
20
|
+
}, {});
|
|
21
|
+
return z.object(zodFields);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
//#endregion
|
|
25
|
+
export { toZodSchema };
|
|
26
|
+
//# sourceMappingURL=to-zod.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to-zod.mjs","names":[],"sources":["../../src/db/to-zod.ts"],"sourcesContent":["import type { DBFieldAttribute } from \"@better-auth/core/db\";\nimport type { ZodType } from \"zod\";\nimport * as z from \"zod\";\n\nexport function toZodSchema<\n\tFields extends Record<string, DBFieldAttribute | never>,\n\tIsClientSide extends boolean,\n>({\n\tfields,\n\tisClientSide,\n}: {\n\tfields: Fields;\n\t/**\n\t * If true, then any fields that have `input: false` will be removed from the schema to prevent user input.\n\t */\n\tisClientSide: IsClientSide;\n}) {\n\tconst zodFields = Object.keys(fields).reduce((acc, key) => {\n\t\tconst field = fields[key];\n\t\tif (!field) {\n\t\t\treturn acc;\n\t\t}\n\t\tif (isClientSide && field.input === false) {\n\t\t\treturn acc;\n\t\t}\n\n\t\tlet schema: ZodType;\n\t\tif (field.type === \"json\") {\n\t\t\tschema = (z as any).json ? (z as any).json() : z.any();\n\t\t} else if (field.type === \"string[]\" || field.type === \"number[]\") {\n\t\t\tschema = z.array(field.type === \"string[]\" ? z.string() : z.number());\n\t\t} else if (Array.isArray(field.type)) {\n\t\t\tschema = z.any();\n\t\t} else {\n\t\t\tschema = z[field.type]();\n\t\t}\n\n\t\tif (field?.required === false) {\n\t\t\tschema = schema.optional();\n\t\t}\n\t\tif (!isClientSide && field?.returned === false) {\n\t\t\treturn acc;\n\t\t}\n\t\treturn {\n\t\t\t...acc,\n\t\t\t[key]: schema,\n\t\t};\n\t}, {});\n\tconst schema = z.object(zodFields);\n\treturn schema as z.ZodObject<\n\t\tRemoveNeverProps<{\n\t\t\t[key in keyof Fields]: FieldAttributeToSchema<Fields[key], IsClientSide>;\n\t\t}>,\n\t\tz.core.$strip\n\t>;\n}\n\nexport type FieldAttributeToSchema<\n\tField extends DBFieldAttribute | Record<string, never>,\n\t// if it's client side, then field attributes of `input` that are false should be removed\n\tisClientSide extends boolean = false,\n> = Field extends { type: any }\n\t? GetInput<isClientSide, Field, GetRequired<Field, GetType<Field>>>\n\t: Record<string, never>;\n\ntype GetType<F extends DBFieldAttribute> = F extends {\n\ttype: \"string\";\n}\n\t? z.ZodString\n\t: F extends { type: \"number\" }\n\t\t? z.ZodNumber\n\t\t: F extends { type: \"boolean\" }\n\t\t\t? z.ZodBoolean\n\t\t\t: F extends { type: \"date\" }\n\t\t\t\t? z.ZodDate\n\t\t\t\t: z.ZodAny;\n\ntype GetRequired<\n\tF extends DBFieldAttribute,\n\tSchema extends z.core.SomeType,\n> = F extends {\n\trequired: true;\n}\n\t? Schema\n\t: z.ZodOptional<Schema>;\n\ntype GetInput<\n\tisClientSide extends boolean,\n\tField extends DBFieldAttribute,\n\tSchema extends z.core.SomeType,\n> = Field extends {\n\tinput: false;\n}\n\t? isClientSide extends true\n\t\t? never\n\t\t: Schema\n\t: Schema;\n\ntype RemoveNeverProps<T> = {\n\t[K in keyof T as [T[K]] extends [never] ? never : K]: T[K];\n};\n"],"mappings":";;;AAIA,SAAgB,YAGd,EACD,QACA,gBAOE;CACF,MAAM,YAAY,OAAO,KAAK,OAAO,CAAC,QAAQ,KAAK,QAAQ;EAC1D,MAAM,QAAQ,OAAO;AACrB,MAAI,CAAC,MACJ,QAAO;AAER,MAAI,gBAAgB,MAAM,UAAU,MACnC,QAAO;EAGR,IAAI;AACJ,MAAI,MAAM,SAAS,OAClB,UAAU,EAAU,OAAQ,EAAU,MAAM,GAAG,EAAE,KAAK;WAC5C,MAAM,SAAS,cAAc,MAAM,SAAS,WACtD,UAAS,EAAE,MAAM,MAAM,SAAS,aAAa,EAAE,QAAQ,GAAG,EAAE,QAAQ,CAAC;WAC3D,MAAM,QAAQ,MAAM,KAAK,CACnC,UAAS,EAAE,KAAK;MAEhB,UAAS,EAAE,MAAM,OAAO;AAGzB,MAAI,OAAO,aAAa,MACvB,UAAS,OAAO,UAAU;AAE3B,MAAI,CAAC,gBAAgB,OAAO,aAAa,MACxC,QAAO;AAER,SAAO;GACN,GAAG;IACF,MAAM;GACP;IACC,EAAE,CAAC;AAEN,QADe,EAAE,OAAO,UAAU"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { createHash } from "@better-auth/utils/hash";
|
|
2
|
+
import { base64Url } from "@better-auth/utils/base64";
|
|
3
|
+
|
|
4
|
+
//#region src/db/verification-token-storage.ts
|
|
5
|
+
const defaultKeyHasher = async (identifier) => {
|
|
6
|
+
const hash = await createHash("SHA-256").digest(new TextEncoder().encode(identifier));
|
|
7
|
+
return base64Url.encode(new Uint8Array(hash), { padding: false });
|
|
8
|
+
};
|
|
9
|
+
async function processIdentifier(identifier, option) {
|
|
10
|
+
if (!option || option === "plain") return identifier;
|
|
11
|
+
if (option === "hashed") return defaultKeyHasher(identifier);
|
|
12
|
+
if (typeof option === "object" && "hash" in option) return option.hash(identifier);
|
|
13
|
+
return identifier;
|
|
14
|
+
}
|
|
15
|
+
function getStorageOption(identifier, config) {
|
|
16
|
+
if (!config) return;
|
|
17
|
+
if (typeof config === "object" && "default" in config) {
|
|
18
|
+
if (config.overrides) {
|
|
19
|
+
for (const [prefix, option] of Object.entries(config.overrides)) if (identifier.startsWith(prefix)) return option;
|
|
20
|
+
}
|
|
21
|
+
return config.default;
|
|
22
|
+
}
|
|
23
|
+
return config;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
//#endregion
|
|
27
|
+
export { getStorageOption, processIdentifier };
|
|
28
|
+
//# sourceMappingURL=verification-token-storage.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification-token-storage.mjs","names":[],"sources":["../../src/db/verification-token-storage.ts"],"sourcesContent":["import { base64Url } from \"@better-auth/utils/base64\";\nimport { createHash } from \"@better-auth/utils/hash\";\nimport type { StoreIdentifierOption } from \"../types\";\n\nconst defaultKeyHasher = async (identifier: string) => {\n\tconst hash = await createHash(\"SHA-256\").digest(\n\t\tnew TextEncoder().encode(identifier),\n\t);\n\treturn base64Url.encode(new Uint8Array(hash), { padding: false });\n};\n\nexport async function processIdentifier(\n\tidentifier: string,\n\toption: StoreIdentifierOption | undefined,\n): Promise<string> {\n\tif (!option || option === \"plain\") {\n\t\treturn identifier;\n\t}\n\tif (option === \"hashed\") {\n\t\treturn defaultKeyHasher(identifier);\n\t}\n\tif (typeof option === \"object\" && \"hash\" in option) {\n\t\treturn option.hash(identifier);\n\t}\n\treturn identifier;\n}\n\nexport function getStorageOption(\n\tidentifier: string,\n\tconfig:\n\t\t| StoreIdentifierOption\n\t\t| {\n\t\t\t\tdefault: StoreIdentifierOption;\n\t\t\t\toverrides?: Record<string, StoreIdentifierOption>;\n\t\t }\n\t\t| undefined,\n): StoreIdentifierOption | undefined {\n\tif (!config) {\n\t\treturn undefined;\n\t}\n\n\tif (typeof config === \"object\" && \"default\" in config) {\n\t\tif (config.overrides) {\n\t\t\tfor (const [prefix, option] of Object.entries(config.overrides)) {\n\t\t\t\tif (identifier.startsWith(prefix)) {\n\t\t\t\t\treturn option;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn config.default;\n\t}\n\n\treturn config;\n}\n"],"mappings":";;;;AAIA,MAAM,mBAAmB,OAAO,eAAuB;CACtD,MAAM,OAAO,MAAM,WAAW,UAAU,CAAC,OACxC,IAAI,aAAa,CAAC,OAAO,WAAW,CACpC;AACD,QAAO,UAAU,OAAO,IAAI,WAAW,KAAK,EAAE,EAAE,SAAS,OAAO,CAAC;;AAGlE,eAAsB,kBACrB,YACA,QACkB;AAClB,KAAI,CAAC,UAAU,WAAW,QACzB,QAAO;AAER,KAAI,WAAW,SACd,QAAO,iBAAiB,WAAW;AAEpC,KAAI,OAAO,WAAW,YAAY,UAAU,OAC3C,QAAO,OAAO,KAAK,WAAW;AAE/B,QAAO;;AAGR,SAAgB,iBACf,YACA,QAOoC;AACpC,KAAI,CAAC,OACJ;AAGD,KAAI,OAAO,WAAW,YAAY,aAAa,QAAQ;AACtD,MAAI,OAAO,WACV;QAAK,MAAM,CAAC,QAAQ,WAAW,OAAO,QAAQ,OAAO,UAAU,CAC9D,KAAI,WAAW,WAAW,OAAO,CAChC,QAAO;;AAIV,SAAO,OAAO;;AAGf,QAAO"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { BetterAuthOptions } from "@better-auth/core";
|
|
2
|
+
import { BaseModelNames } from "@better-auth/core/db";
|
|
3
|
+
import { DBAdapter, Where } from "@better-auth/core/db/adapter";
|
|
4
|
+
|
|
5
|
+
//#region src/db/with-hooks.d.ts
|
|
6
|
+
declare function getWithHooks(adapter: DBAdapter<BetterAuthOptions>, ctx: {
|
|
7
|
+
options: BetterAuthOptions;
|
|
8
|
+
hooks: Exclude<BetterAuthOptions["databaseHooks"], undefined>[];
|
|
9
|
+
}): {
|
|
10
|
+
createWithHooks: <T extends Record<string, any>>(data: T, model: BaseModelNames, customCreateFn?: {
|
|
11
|
+
fn: (data: Record<string, any>) => void | Promise<any>;
|
|
12
|
+
executeMainFn?: boolean;
|
|
13
|
+
} | undefined) => Promise<any>;
|
|
14
|
+
updateWithHooks: <T extends Record<string, any>>(data: any, where: Where[], model: BaseModelNames, customUpdateFn?: {
|
|
15
|
+
fn: (data: Record<string, any>) => void | Promise<any>;
|
|
16
|
+
executeMainFn?: boolean;
|
|
17
|
+
} | undefined) => Promise<any>;
|
|
18
|
+
updateManyWithHooks: <_T extends Record<string, any>>(data: any, where: Where[], model: BaseModelNames, customUpdateFn?: {
|
|
19
|
+
fn: (data: Record<string, any>) => void | Promise<any>;
|
|
20
|
+
executeMainFn?: boolean;
|
|
21
|
+
} | undefined) => Promise<any>;
|
|
22
|
+
deleteWithHooks: <T extends Record<string, any>>(where: Where[], model: BaseModelNames, customDeleteFn?: {
|
|
23
|
+
fn: (where: Where[]) => void | Promise<any>;
|
|
24
|
+
executeMainFn?: boolean;
|
|
25
|
+
} | undefined) => Promise<any>;
|
|
26
|
+
deleteManyWithHooks: <T extends Record<string, any>>(where: Where[], model: BaseModelNames, customDeleteFn?: {
|
|
27
|
+
fn: (where: Where[]) => void | Promise<any>;
|
|
28
|
+
executeMainFn?: boolean;
|
|
29
|
+
} | undefined) => Promise<any>;
|
|
30
|
+
};
|
|
31
|
+
//#endregion
|
|
32
|
+
export { getWithHooks };
|
|
33
|
+
//# sourceMappingURL=with-hooks.d.mts.map
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { getCurrentAdapter, getCurrentAuthContext, queueAfterTransactionHook } from "@better-auth/core/context";
|
|
2
|
+
|
|
3
|
+
//#region src/db/with-hooks.ts
|
|
4
|
+
function getWithHooks(adapter, ctx) {
|
|
5
|
+
const hooks = ctx.hooks;
|
|
6
|
+
async function createWithHooks(data, model, customCreateFn) {
|
|
7
|
+
const context = await getCurrentAuthContext().catch(() => null);
|
|
8
|
+
let actualData = data;
|
|
9
|
+
for (const hook of hooks || []) {
|
|
10
|
+
const toRun = hook[model]?.create?.before;
|
|
11
|
+
if (toRun) {
|
|
12
|
+
const result = await toRun(actualData, context);
|
|
13
|
+
if (result === false) return null;
|
|
14
|
+
if (typeof result === "object" && "data" in result) actualData = {
|
|
15
|
+
...actualData,
|
|
16
|
+
...result.data
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
let created = null;
|
|
21
|
+
if (!customCreateFn || customCreateFn.executeMainFn) created = await (await getCurrentAdapter(adapter)).create({
|
|
22
|
+
model,
|
|
23
|
+
data: actualData,
|
|
24
|
+
forceAllowId: true
|
|
25
|
+
});
|
|
26
|
+
if (customCreateFn?.fn) created = await customCreateFn.fn(created ?? actualData);
|
|
27
|
+
for (const hook of hooks || []) {
|
|
28
|
+
const toRun = hook[model]?.create?.after;
|
|
29
|
+
if (toRun) await queueAfterTransactionHook(async () => {
|
|
30
|
+
await toRun(created, context);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return created;
|
|
34
|
+
}
|
|
35
|
+
async function updateWithHooks(data, where, model, customUpdateFn) {
|
|
36
|
+
const context = await getCurrentAuthContext().catch(() => null);
|
|
37
|
+
let actualData = data;
|
|
38
|
+
for (const hook of hooks || []) {
|
|
39
|
+
const toRun = hook[model]?.update?.before;
|
|
40
|
+
if (toRun) {
|
|
41
|
+
const result = await toRun(data, context);
|
|
42
|
+
if (result === false) return null;
|
|
43
|
+
if (typeof result === "object" && "data" in result) actualData = {
|
|
44
|
+
...actualData,
|
|
45
|
+
...result.data
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const customUpdated = customUpdateFn ? await customUpdateFn.fn(actualData) : null;
|
|
50
|
+
const updated = !customUpdateFn || customUpdateFn.executeMainFn ? await (await getCurrentAdapter(adapter)).update({
|
|
51
|
+
model,
|
|
52
|
+
update: actualData,
|
|
53
|
+
where
|
|
54
|
+
}) : customUpdated;
|
|
55
|
+
for (const hook of hooks || []) {
|
|
56
|
+
const toRun = hook[model]?.update?.after;
|
|
57
|
+
if (toRun) await queueAfterTransactionHook(async () => {
|
|
58
|
+
await toRun(updated, context);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return updated;
|
|
62
|
+
}
|
|
63
|
+
async function updateManyWithHooks(data, where, model, customUpdateFn) {
|
|
64
|
+
const context = await getCurrentAuthContext().catch(() => null);
|
|
65
|
+
let actualData = data;
|
|
66
|
+
for (const hook of hooks || []) {
|
|
67
|
+
const toRun = hook[model]?.update?.before;
|
|
68
|
+
if (toRun) {
|
|
69
|
+
const result = await toRun(data, context);
|
|
70
|
+
if (result === false) return null;
|
|
71
|
+
if (typeof result === "object" && "data" in result) actualData = {
|
|
72
|
+
...actualData,
|
|
73
|
+
...result.data
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const customUpdated = customUpdateFn ? await customUpdateFn.fn(actualData) : null;
|
|
78
|
+
const updated = !customUpdateFn || customUpdateFn.executeMainFn ? await (await getCurrentAdapter(adapter)).updateMany({
|
|
79
|
+
model,
|
|
80
|
+
update: actualData,
|
|
81
|
+
where
|
|
82
|
+
}) : customUpdated;
|
|
83
|
+
for (const hook of hooks || []) {
|
|
84
|
+
const toRun = hook[model]?.update?.after;
|
|
85
|
+
if (toRun) await queueAfterTransactionHook(async () => {
|
|
86
|
+
await toRun(updated, context);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return updated;
|
|
90
|
+
}
|
|
91
|
+
async function deleteWithHooks(where, model, customDeleteFn) {
|
|
92
|
+
const context = await getCurrentAuthContext().catch(() => null);
|
|
93
|
+
let entityToDelete = null;
|
|
94
|
+
try {
|
|
95
|
+
entityToDelete = (await (await getCurrentAdapter(adapter)).findMany({
|
|
96
|
+
model,
|
|
97
|
+
where,
|
|
98
|
+
limit: 1
|
|
99
|
+
}))[0] || null;
|
|
100
|
+
} catch {}
|
|
101
|
+
if (entityToDelete) for (const hook of hooks || []) {
|
|
102
|
+
const toRun = hook[model]?.delete?.before;
|
|
103
|
+
if (toRun) {
|
|
104
|
+
if (await toRun(entityToDelete, context) === false) return null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const customDeleted = customDeleteFn ? await customDeleteFn.fn(where) : null;
|
|
108
|
+
const deleted = !customDeleteFn || customDeleteFn.executeMainFn ? await (await getCurrentAdapter(adapter)).delete({
|
|
109
|
+
model,
|
|
110
|
+
where
|
|
111
|
+
}) : customDeleted;
|
|
112
|
+
if (entityToDelete) for (const hook of hooks || []) {
|
|
113
|
+
const toRun = hook[model]?.delete?.after;
|
|
114
|
+
if (toRun) await queueAfterTransactionHook(async () => {
|
|
115
|
+
await toRun(entityToDelete, context);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
return deleted;
|
|
119
|
+
}
|
|
120
|
+
async function deleteManyWithHooks(where, model, customDeleteFn) {
|
|
121
|
+
const context = await getCurrentAuthContext().catch(() => null);
|
|
122
|
+
let entitiesToDelete = [];
|
|
123
|
+
try {
|
|
124
|
+
entitiesToDelete = await (await getCurrentAdapter(adapter)).findMany({
|
|
125
|
+
model,
|
|
126
|
+
where
|
|
127
|
+
});
|
|
128
|
+
} catch {}
|
|
129
|
+
for (const entity of entitiesToDelete) for (const hook of hooks || []) {
|
|
130
|
+
const toRun = hook[model]?.delete?.before;
|
|
131
|
+
if (toRun) {
|
|
132
|
+
if (await toRun(entity, context) === false) return null;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const customDeleted = customDeleteFn ? await customDeleteFn.fn(where) : null;
|
|
136
|
+
const deleted = !customDeleteFn || customDeleteFn.executeMainFn ? await (await getCurrentAdapter(adapter)).deleteMany({
|
|
137
|
+
model,
|
|
138
|
+
where
|
|
139
|
+
}) : customDeleted;
|
|
140
|
+
for (const entity of entitiesToDelete) for (const hook of hooks || []) {
|
|
141
|
+
const toRun = hook[model]?.delete?.after;
|
|
142
|
+
if (toRun) await queueAfterTransactionHook(async () => {
|
|
143
|
+
await toRun(entity, context);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
return deleted;
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
createWithHooks,
|
|
150
|
+
updateWithHooks,
|
|
151
|
+
updateManyWithHooks,
|
|
152
|
+
deleteWithHooks,
|
|
153
|
+
deleteManyWithHooks
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
//#endregion
|
|
158
|
+
export { getWithHooks };
|
|
159
|
+
//# sourceMappingURL=with-hooks.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-hooks.mjs","names":[],"sources":["../../src/db/with-hooks.ts"],"sourcesContent":["import type { BetterAuthOptions } from \"@better-auth/core\";\nimport {\n\tgetCurrentAdapter,\n\tgetCurrentAuthContext,\n\tqueueAfterTransactionHook,\n} from \"@better-auth/core/context\";\nimport type { BaseModelNames } from \"@better-auth/core/db\";\nimport type { DBAdapter, Where } from \"@better-auth/core/db/adapter\";\n\nexport function getWithHooks(\n\tadapter: DBAdapter<BetterAuthOptions>,\n\tctx: {\n\t\toptions: BetterAuthOptions;\n\t\thooks: Exclude<BetterAuthOptions[\"databaseHooks\"], undefined>[];\n\t},\n) {\n\tconst hooks = ctx.hooks;\n\tasync function createWithHooks<T extends Record<string, any>>(\n\t\tdata: T,\n\t\tmodel: BaseModelNames,\n\t\tcustomCreateFn?:\n\t\t\t| {\n\t\t\t\t\tfn: (data: Record<string, any>) => void | Promise<any>;\n\t\t\t\t\texecuteMainFn?: boolean;\n\t\t\t }\n\t\t\t| undefined,\n\t) {\n\t\tconst context = await getCurrentAuthContext().catch(() => null);\n\t\tlet actualData = data;\n\t\tfor (const hook of hooks || []) {\n\t\t\tconst toRun = hook[model]?.create?.before;\n\t\t\tif (toRun) {\n\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\tconst result = await toRun(actualData as any, context);\n\t\t\t\tif (result === false) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst isObject = typeof result === \"object\" && \"data\" in result;\n\t\t\t\tif (isObject) {\n\t\t\t\t\tactualData = {\n\t\t\t\t\t\t...actualData,\n\t\t\t\t\t\t...result.data,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet created: any = null;\n\t\tif (!customCreateFn || customCreateFn.executeMainFn) {\n\t\t\tcreated = await (await getCurrentAdapter(adapter)).create<T>({\n\t\t\t\tmodel,\n\t\t\t\tdata: actualData as any,\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\t\t}\n\t\tif (customCreateFn?.fn) {\n\t\t\tcreated = await customCreateFn.fn(created ?? actualData);\n\t\t}\n\n\t\tfor (const hook of hooks || []) {\n\t\t\tconst toRun = hook[model]?.create?.after;\n\t\t\tif (toRun) {\n\t\t\t\tawait queueAfterTransactionHook(async () => {\n\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\tawait toRun(created as any, context);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn created;\n\t}\n\n\tasync function updateWithHooks<T extends Record<string, any>>(\n\t\tdata: any,\n\t\twhere: Where[],\n\t\tmodel: BaseModelNames,\n\t\tcustomUpdateFn?:\n\t\t\t| {\n\t\t\t\t\tfn: (data: Record<string, any>) => void | Promise<any>;\n\t\t\t\t\texecuteMainFn?: boolean;\n\t\t\t }\n\t\t\t| undefined,\n\t) {\n\t\tconst context = await getCurrentAuthContext().catch(() => null);\n\t\tlet actualData = data;\n\n\t\tfor (const hook of hooks || []) {\n\t\t\tconst toRun = hook[model]?.update?.before;\n\t\t\tif (toRun) {\n\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\tconst result = await toRun(data as any, context);\n\t\t\t\tif (result === false) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst isObject = typeof result === \"object\" && \"data\" in result;\n\t\t\t\tif (isObject) {\n\t\t\t\t\tactualData = {\n\t\t\t\t\t\t...actualData,\n\t\t\t\t\t\t...result.data,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst customUpdated = customUpdateFn\n\t\t\t? await customUpdateFn.fn(actualData)\n\t\t\t: null;\n\n\t\tconst updated =\n\t\t\t!customUpdateFn || customUpdateFn.executeMainFn\n\t\t\t\t? await (await getCurrentAdapter(adapter)).update<T>({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tupdate: actualData,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t})\n\t\t\t\t: customUpdated;\n\n\t\tfor (const hook of hooks || []) {\n\t\t\tconst toRun = hook[model]?.update?.after;\n\t\t\tif (toRun) {\n\t\t\t\tawait queueAfterTransactionHook(async () => {\n\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\tawait toRun(updated as any, context);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn updated;\n\t}\n\n\tasync function updateManyWithHooks<_T extends Record<string, any>>(\n\t\tdata: any,\n\t\twhere: Where[],\n\t\tmodel: BaseModelNames,\n\t\tcustomUpdateFn?:\n\t\t\t| {\n\t\t\t\t\tfn: (data: Record<string, any>) => void | Promise<any>;\n\t\t\t\t\texecuteMainFn?: boolean;\n\t\t\t }\n\t\t\t| undefined,\n\t) {\n\t\tconst context = await getCurrentAuthContext().catch(() => null);\n\t\tlet actualData = data;\n\n\t\tfor (const hook of hooks || []) {\n\t\t\tconst toRun = hook[model]?.update?.before;\n\t\t\tif (toRun) {\n\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\tconst result = await toRun(data as any, context);\n\t\t\t\tif (result === false) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst isObject = typeof result === \"object\" && \"data\" in result;\n\t\t\t\tif (isObject) {\n\t\t\t\t\tactualData = {\n\t\t\t\t\t\t...actualData,\n\t\t\t\t\t\t...result.data,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst customUpdated = customUpdateFn\n\t\t\t? await customUpdateFn.fn(actualData)\n\t\t\t: null;\n\n\t\tconst updated =\n\t\t\t!customUpdateFn || customUpdateFn.executeMainFn\n\t\t\t\t? await (await getCurrentAdapter(adapter)).updateMany({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tupdate: actualData,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t})\n\t\t\t\t: customUpdated;\n\n\t\tfor (const hook of hooks || []) {\n\t\t\tconst toRun = hook[model]?.update?.after;\n\t\t\tif (toRun) {\n\t\t\t\tawait queueAfterTransactionHook(async () => {\n\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\tawait toRun(updated as any, context);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn updated;\n\t}\n\n\tasync function deleteWithHooks<T extends Record<string, any>>(\n\t\twhere: Where[],\n\t\tmodel: BaseModelNames,\n\t\tcustomDeleteFn?:\n\t\t\t| {\n\t\t\t\t\tfn: (where: Where[]) => void | Promise<any>;\n\t\t\t\t\texecuteMainFn?: boolean;\n\t\t\t }\n\t\t\t| undefined,\n\t) {\n\t\tconst context = await getCurrentAuthContext().catch(() => null);\n\t\tlet entityToDelete: T | null = null;\n\n\t\ttry {\n\t\t\tconst entities = await (await getCurrentAdapter(adapter)).findMany<T>({\n\t\t\t\tmodel,\n\t\t\t\twhere,\n\t\t\t\tlimit: 1,\n\t\t\t});\n\t\t\tentityToDelete = entities[0] || null;\n\t\t} catch {\n\t\t\t// If we can't find the entity, we'll still proceed with deletion\n\t\t}\n\n\t\tif (entityToDelete) {\n\t\t\tfor (const hook of hooks || []) {\n\t\t\t\tconst toRun = hook[model]?.delete?.before;\n\t\t\t\tif (toRun) {\n\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\tconst result = await toRun(entityToDelete as any, context);\n\t\t\t\t\tif (result === false) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst customDeleted = customDeleteFn\n\t\t\t? await customDeleteFn.fn(where)\n\t\t\t: null;\n\n\t\tconst deleted =\n\t\t\t!customDeleteFn || customDeleteFn.executeMainFn\n\t\t\t\t? await (await getCurrentAdapter(adapter)).delete({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t})\n\t\t\t\t: customDeleted;\n\n\t\tif (entityToDelete) {\n\t\t\tfor (const hook of hooks || []) {\n\t\t\t\tconst toRun = hook[model]?.delete?.after;\n\t\t\t\tif (toRun) {\n\t\t\t\t\tawait queueAfterTransactionHook(async () => {\n\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\tawait toRun(entityToDelete as any, context);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn deleted;\n\t}\n\n\tasync function deleteManyWithHooks<T extends Record<string, any>>(\n\t\twhere: Where[],\n\t\tmodel: BaseModelNames,\n\t\tcustomDeleteFn?:\n\t\t\t| {\n\t\t\t\t\tfn: (where: Where[]) => void | Promise<any>;\n\t\t\t\t\texecuteMainFn?: boolean;\n\t\t\t }\n\t\t\t| undefined,\n\t) {\n\t\tconst context = await getCurrentAuthContext().catch(() => null);\n\t\tlet entitiesToDelete: T[] = [];\n\n\t\ttry {\n\t\t\tentitiesToDelete = await (await getCurrentAdapter(adapter)).findMany<T>({\n\t\t\t\tmodel,\n\t\t\t\twhere,\n\t\t\t});\n\t\t} catch {\n\t\t\t// If we can't find the entities, we'll still proceed with deletion\n\t\t}\n\n\t\tfor (const entity of entitiesToDelete) {\n\t\t\tfor (const hook of hooks || []) {\n\t\t\t\tconst toRun = hook[model]?.delete?.before;\n\t\t\t\tif (toRun) {\n\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\tconst result = await toRun(entity as any, context);\n\t\t\t\t\tif (result === false) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst customDeleted = customDeleteFn\n\t\t\t? await customDeleteFn.fn(where)\n\t\t\t: null;\n\n\t\tconst deleted =\n\t\t\t!customDeleteFn || customDeleteFn.executeMainFn\n\t\t\t\t? await (await getCurrentAdapter(adapter)).deleteMany({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t})\n\t\t\t\t: customDeleted;\n\n\t\tfor (const entity of entitiesToDelete) {\n\t\t\tfor (const hook of hooks || []) {\n\t\t\t\tconst toRun = hook[model]?.delete?.after;\n\t\t\t\tif (toRun) {\n\t\t\t\t\t// Queue after hooks to run post-transaction\n\t\t\t\t\tawait queueAfterTransactionHook(async () => {\n\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\tawait toRun(entity as any, context);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn deleted;\n\t}\n\n\treturn {\n\t\tcreateWithHooks,\n\t\tupdateWithHooks,\n\t\tupdateManyWithHooks,\n\t\tdeleteWithHooks,\n\t\tdeleteManyWithHooks,\n\t};\n}\n"],"mappings":"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"}
|