@gatwech/auth 1.0.0-beta.18
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 +31 -0
- package/dist/access-BO2g7QVe.mjs +45 -0
- package/dist/access-C6O_osEz.mjs +79 -0
- package/dist/access-DT1f6l5k.mjs +51 -0
- package/dist/adapter-factory-BZ2Qiqpn.mjs +640 -0
- package/dist/adapters/drizzle-adapter/index.d.mts +47 -0
- package/dist/adapters/drizzle-adapter/index.mjs +208 -0
- package/dist/adapters/index.d.mts +132 -0
- package/dist/adapters/index.mjs +18 -0
- package/dist/adapters/kysely-adapter/index.d.mts +47 -0
- package/dist/adapters/kysely-adapter/index.mjs +11 -0
- package/dist/adapters/memory-adapter/index.d.mts +14 -0
- package/dist/adapters/memory-adapter/index.mjs +154 -0
- package/dist/adapters/mongodb-adapter/index.d.mts +35 -0
- package/dist/adapters/mongodb-adapter/index.mjs +315 -0
- package/dist/adapters/prisma-adapter/index.d.mts +34 -0
- package/dist/adapters/prisma-adapter/index.mjs +159 -0
- package/dist/adapters/test.d.mts +81 -0
- package/dist/adapters/test.mjs +793 -0
- package/dist/admin-Bcq53Nwj.mjs +743 -0
- package/dist/admin-DtfO1PLg.d.mts +1689 -0
- package/dist/anonymous-CRt1imBW.mjs +107 -0
- package/dist/api/index.d.mts +6 -0
- package/dist/api/index.mjs +17 -0
- package/dist/api-0pR_I-Nx.mjs +3139 -0
- package/dist/auth-CBUoBX6o.mjs +233 -0
- package/dist/bearer-Djf_awfo.mjs +63 -0
- package/dist/bun-sqlite-dialect-CeNvMaZz.mjs +155 -0
- package/dist/captcha-BqaMxlKC.mjs +178 -0
- package/dist/chunk-BK_LfMhE.mjs +40 -0
- package/dist/client/index.d.mts +186 -0
- package/dist/client/index.mjs +7 -0
- package/dist/client/plugins/index.d.mts +949 -0
- package/dist/client/plugins/index.mjs +539 -0
- package/dist/client/react/index.d.mts +179 -0
- package/dist/client/react/index.mjs +69 -0
- package/dist/client-BOX93C3d.d.mts +1250 -0
- package/dist/client-CNY0tn9g.d.mts +628 -0
- package/dist/client-CygJhqeB.mjs +29 -0
- package/dist/client-WiN43tAS.mjs +17 -0
- package/dist/client-aExCkfwm.mjs +30 -0
- package/dist/cookies/index.d.mts +7 -0
- package/dist/cookies/index.mjs +7 -0
- package/dist/cookies-cJObLwn1.mjs +597 -0
- package/dist/crypto/index.d.mts +44 -0
- package/dist/crypto/index.mjs +4 -0
- package/dist/crypto-Bb42eMrH.mjs +70 -0
- package/dist/custom-session-L3t7ecsd.mjs +67 -0
- package/dist/date-Cx2yCiC4.mjs +115 -0
- package/dist/db/index.d.mts +7 -0
- package/dist/db/index.mjs +15 -0
- package/dist/db-BrstmDhc.mjs +1124 -0
- package/dist/device-authorization-V4s3h4Mj.mjs +557 -0
- package/dist/dialect-CeddeGHf.mjs +72 -0
- package/dist/email-otp-BtDHSw14.mjs +592 -0
- package/dist/esm-C-QicDNz.mjs +4090 -0
- package/dist/generic-oauth-CL5X27ZI.mjs +445 -0
- package/dist/get-request-ip-DSjrEpGo.mjs +27 -0
- package/dist/get-tables-BQP7YW9c.mjs +249 -0
- package/dist/has-permission-BpAr7uCn.mjs +14 -0
- package/dist/haveibeenpwned-cMpJvmzI.mjs +43 -0
- package/dist/helper-tmxW3BHj.d.mts +21 -0
- package/dist/index-34ONrP8l.d.mts +503 -0
- package/dist/index-65G5U5DB-DSdjzreF.d.mts +2543 -0
- package/dist/index-B-XKqFvY.d.mts +30 -0
- package/dist/index-B3n8e37d.d.mts +165 -0
- package/dist/index-BBm8nQ9Q.d.mts +42 -0
- package/dist/index-BHoQlf7a.d.mts +7699 -0
- package/dist/index-BYMI9r_d.d.mts +257 -0
- package/dist/index-BqhKCbPH.d.mts +36 -0
- package/dist/index-Buhn3hkR.d.mts +433 -0
- package/dist/index-C-u1h_WX.d.mts +174 -0
- package/dist/index-C7fQuk-V.d.mts +41 -0
- package/dist/index-CM-CFWwr.d.mts +1919 -0
- package/dist/index-CuFzhoS6.d.mts +359 -0
- package/dist/index-Cxi7TbLE.d.mts +11347 -0
- package/dist/index-DB7t8whN.d.mts +1 -0
- package/dist/index-DKNNV1kb.d.mts +626 -0
- package/dist/index-DR0xXno9.d.mts +113 -0
- package/dist/index-D_k662QG.d.mts +833 -0
- package/dist/index-DaBcikv9.d.mts +118 -0
- package/dist/index-DlaMq1nb.d.mts +955 -0
- package/dist/index-DoXZYQpq.d.mts +290 -0
- package/dist/index-G6V0Z_Mn.d.mts +125 -0
- package/dist/index-z0KSvE5i.d.mts +246 -0
- package/dist/index-zjjNBRY2.d.mts +95 -0
- package/dist/index.d.mts +12 -0
- package/dist/index.mjs +33 -0
- package/dist/integrations/next-js.d.mts +21 -0
- package/dist/integrations/next-js.mjs +62 -0
- package/dist/integrations/node.d.mts +15 -0
- package/dist/integrations/node.mjs +15 -0
- package/dist/integrations/react-start.d.mts +15 -0
- package/dist/integrations/react-start.mjs +46 -0
- package/dist/json-D0TBLy4q.mjs +24 -0
- package/dist/jwt-CmxZAGe2.mjs +94 -0
- package/dist/jwt-lHV4QHpD.mjs +387 -0
- package/dist/kysely-adapter-DpzYO8Yf.mjs +181 -0
- package/dist/magic-link-Bk-ueorR.mjs +176 -0
- package/dist/misc-beA1w3XV.mjs +7 -0
- package/dist/multi-session-DRrLKrg9.mjs +144 -0
- package/dist/node-sqlite-dialect-BcKxBQnm.mjs +155 -0
- package/dist/oauth-proxy-D1sWh9B_.mjs +133 -0
- package/dist/oauth2/index.d.mts +60 -0
- package/dist/oauth2/index.mjs +19 -0
- package/dist/one-tap-DMswkTEc.mjs +113 -0
- package/dist/organization-BArHO_5v.mjs +3857 -0
- package/dist/parser-DcrIEuXE.mjs +73 -0
- package/dist/passkey-CcD4CnhM.mjs +558 -0
- package/dist/password-sVC4nePO.mjs +25 -0
- package/dist/permission-DLYUF3cW.mjs +15 -0
- package/dist/phone-number-rHDIlh-2.mjs +485 -0
- package/dist/plugin-helper-4L-lzsjZ.mjs +16 -0
- package/dist/plugins/access/index.d.mts +3 -0
- package/dist/plugins/access/index.mjs +3 -0
- package/dist/plugins/admin/access/index.d.mts +116 -0
- package/dist/plugins/admin/access/index.mjs +4 -0
- package/dist/plugins/admin/index.d.mts +9 -0
- package/dist/plugins/admin/index.mjs +22 -0
- package/dist/plugins/anonymous/index.d.mts +7 -0
- package/dist/plugins/anonymous/index.mjs +18 -0
- package/dist/plugins/bearer/index.d.mts +2 -0
- package/dist/plugins/bearer/index.mjs +8 -0
- package/dist/plugins/captcha/index.d.mts +2 -0
- package/dist/plugins/captcha/index.mjs +4 -0
- package/dist/plugins/custom-session/index.d.mts +7 -0
- package/dist/plugins/custom-session/index.mjs +19 -0
- package/dist/plugins/device-authorization/index.d.mts +4 -0
- package/dist/plugins/device-authorization/index.mjs +18 -0
- package/dist/plugins/email-otp/index.d.mts +3 -0
- package/dist/plugins/email-otp/index.mjs +19 -0
- package/dist/plugins/generic-oauth/index.d.mts +7 -0
- package/dist/plugins/generic-oauth/index.mjs +18 -0
- package/dist/plugins/haveibeenpwned/index.d.mts +2 -0
- package/dist/plugins/haveibeenpwned/index.mjs +18 -0
- package/dist/plugins/index.d.mts +139 -0
- package/dist/plugins/index.mjs +47 -0
- package/dist/plugins/jwt/index.d.mts +7 -0
- package/dist/plugins/jwt/index.mjs +18 -0
- package/dist/plugins/magic-link/index.d.mts +2 -0
- package/dist/plugins/magic-link/index.mjs +18 -0
- package/dist/plugins/multi-session/index.d.mts +3 -0
- package/dist/plugins/multi-session/index.mjs +18 -0
- package/dist/plugins/oauth-proxy/index.d.mts +2 -0
- package/dist/plugins/oauth-proxy/index.mjs +18 -0
- package/dist/plugins/one-tap/index.d.mts +2 -0
- package/dist/plugins/one-tap/index.mjs +18 -0
- package/dist/plugins/one-time-token/index.d.mts +7 -0
- package/dist/plugins/one-time-token/index.mjs +47 -0
- package/dist/plugins/organization/access/index.d.mts +4 -0
- package/dist/plugins/organization/access/index.mjs +4 -0
- package/dist/plugins/organization/index.d.mts +9 -0
- package/dist/plugins/organization/index.mjs +22 -0
- package/dist/plugins/passkey/index.d.mts +7 -0
- package/dist/plugins/passkey/index.mjs +18 -0
- package/dist/plugins/phone-number/index.d.mts +7 -0
- package/dist/plugins/phone-number/index.mjs +18 -0
- package/dist/plugins/two-factor/index.d.mts +7 -0
- package/dist/plugins/two-factor/index.mjs +20 -0
- package/dist/plugins/username/index.d.mts +4 -0
- package/dist/plugins/username/index.mjs +18 -0
- package/dist/plugins-3jfNste3.mjs +1544 -0
- package/dist/plugins-hFZT3hmK.d.mts +14 -0
- package/dist/promise-8rrEHRXd.mjs +23154 -0
- package/dist/proxy-CL9PZXJA.mjs +441 -0
- package/dist/session-Dgp133Yt.mjs +413 -0
- package/dist/social-providers/index.d.mts +1 -0
- package/dist/social-providers/index.mjs +3 -0
- package/dist/src/adapters/adapter-factory/index.d.ts +10 -0
- package/dist/src/adapters/adapter-factory/types.d.ts +124 -0
- package/dist/src/adapters/create-test-suite.d.ts +97 -0
- package/dist/src/adapters/drizzle-adapter/drizzle-adapter.d.ts +43 -0
- package/dist/src/adapters/drizzle-adapter/index.d.ts +1 -0
- package/dist/src/adapters/drizzle-adapter/test/generate-schema.d.ts +12 -0
- package/dist/src/adapters/index.d.ts +21 -0
- package/dist/src/adapters/kysely-adapter/bun-sqlite-dialect.d.ts +58 -0
- package/dist/src/adapters/kysely-adapter/dialect.d.ts +13 -0
- package/dist/src/adapters/kysely-adapter/index.d.ts +3 -0
- package/dist/src/adapters/kysely-adapter/kysely-adapter.d.ts +32 -0
- package/dist/src/adapters/kysely-adapter/node-sqlite-dialect.d.ts +58 -0
- package/dist/src/adapters/kysely-adapter/types.d.ts +1 -0
- package/dist/src/adapters/memory-adapter/index.d.ts +1 -0
- package/dist/src/adapters/memory-adapter/memory-adapter.d.ts +9 -0
- package/dist/src/adapters/mongodb-adapter/index.d.ts +1 -0
- package/dist/src/adapters/mongodb-adapter/mongodb-adapter.d.ts +31 -0
- package/dist/src/adapters/prisma-adapter/index.d.ts +1 -0
- package/dist/src/adapters/prisma-adapter/prisma-adapter.d.ts +32 -0
- package/dist/src/adapters/prisma-adapter/test/auth.d.ts +3 -0
- package/dist/src/adapters/prisma-adapter/test/generate-auth-config.d.ts +2 -0
- package/dist/src/adapters/prisma-adapter/test/generate-prisma-schema.d.ts +3 -0
- package/dist/src/adapters/prisma-adapter/test/get-prisma-client.d.ts +7 -0
- package/dist/src/adapters/prisma-adapter/test/push-prisma-schema.d.ts +1 -0
- package/dist/src/adapters/test-adapter.d.ts +61 -0
- package/dist/src/adapters/test.d.ts +78 -0
- package/dist/src/adapters/tests/auth-flow.d.ts +22 -0
- package/dist/src/adapters/tests/index.d.ts +5 -0
- package/dist/src/adapters/tests/normal.d.ts +87 -0
- package/dist/src/adapters/tests/number-id.d.ts +17 -0
- package/dist/src/adapters/tests/performance.d.ts +24 -0
- package/dist/src/adapters/tests/transactions.d.ts +20 -0
- package/dist/src/adapters/utils.d.ts +3 -0
- package/dist/src/api/index.d.ts +7150 -0
- package/dist/src/api/middlewares/index.d.ts +2 -0
- package/dist/src/api/middlewares/oauth.d.ts +15 -0
- package/dist/src/api/middlewares/origin-check.d.ts +8 -0
- package/dist/src/api/rate-limiter/index.d.ts +13 -0
- package/dist/src/api/routes/account.d.ts +623 -0
- package/dist/src/api/routes/callback.d.ts +68 -0
- package/dist/src/api/routes/email-verification.d.ts +266 -0
- package/dist/src/api/routes/error.d.ts +51 -0
- package/dist/src/api/routes/index.d.ts +11 -0
- package/dist/src/api/routes/ok.d.ts +61 -0
- package/dist/src/api/routes/reset-password.d.ts +203 -0
- package/dist/src/api/routes/session.d.ts +586 -0
- package/dist/src/api/routes/sign-in.d.ts +298 -0
- package/dist/src/api/routes/sign-out.d.ts +59 -0
- package/dist/src/api/routes/sign-up.d.ts +625 -0
- package/dist/src/api/routes/update-user.d.ts +862 -0
- package/dist/src/api/to-auth-endpoints.d.ts +3 -0
- package/dist/src/auth.d.ts +25 -0
- package/dist/src/client/broadcast-channel.d.ts +12 -0
- package/dist/src/client/config.d.ts +85 -0
- package/dist/src/client/fetch-plugins.d.ts +14 -0
- package/dist/src/client/index.d.ts +15 -0
- package/dist/src/client/parser.d.ts +12 -0
- package/dist/src/client/path-to-object.d.ts +63 -0
- package/dist/src/client/plugins/index.d.ts +21 -0
- package/dist/src/client/plugins/infer-plugin.d.ts +11 -0
- package/dist/src/client/proxy.d.ts +8 -0
- package/dist/src/client/query.d.ts +16 -0
- package/dist/src/client/react/index.d.ts +130 -0
- package/dist/src/client/react/react-store.d.ts +43 -0
- package/dist/src/client/session-atom.d.ts +18 -0
- package/dist/src/client/session-refresh.d.ts +17 -0
- package/dist/src/client/test-plugin.d.ts +147 -0
- package/dist/src/client/types.d.ts +49 -0
- package/dist/src/client/vanilla.d.ts +124 -0
- package/dist/src/cookies/check-cookies.d.ts +4 -0
- package/dist/src/cookies/cookie-utils.d.ts +16 -0
- package/dist/src/cookies/index.d.ts +56 -0
- package/dist/src/cookies/session-store.d.ts +43 -0
- package/dist/src/crypto/buffer.d.ts +4 -0
- package/dist/src/crypto/index.d.ts +14 -0
- package/dist/src/crypto/jwt.d.ts +4 -0
- package/dist/src/crypto/password.d.ts +5 -0
- package/dist/src/crypto/random.d.ts +1 -0
- package/dist/src/db/field.d.ts +97 -0
- package/dist/src/db/get-migration.d.ts +18 -0
- package/dist/src/db/get-schema.d.ts +6 -0
- package/dist/src/db/get-tables.d.ts +3 -0
- package/dist/src/db/index.d.ts +10 -0
- package/dist/src/db/internal-adapter.d.ts +9 -0
- package/dist/src/db/schema.d.ts +76 -0
- package/dist/src/db/to-zod.d.ts +31 -0
- package/dist/src/db/utils.d.ts +6 -0
- package/dist/src/db/with-hooks.d.ts +27 -0
- package/dist/src/index.d.ts +14 -0
- package/dist/src/init.d.ts +2 -0
- package/dist/src/integrations/next-js.d.ts +15 -0
- package/dist/src/integrations/node.d.ts +6 -0
- package/dist/src/integrations/react-start.d.ts +9 -0
- package/dist/src/oauth2/index.d.ts +4 -0
- package/dist/src/oauth2/link-account.d.ts +41 -0
- package/dist/src/oauth2/state.d.ts +21 -0
- package/dist/src/oauth2/utils.d.ts +3 -0
- package/dist/src/plugins/access/access.d.ts +25 -0
- package/dist/src/plugins/access/index.d.ts +2 -0
- package/dist/src/plugins/access/types.d.ts +14 -0
- package/dist/src/plugins/additional-fields/client.d.ts +91 -0
- package/dist/src/plugins/admin/access/index.d.ts +1 -0
- package/dist/src/plugins/admin/access/statement.d.ts +110 -0
- package/dist/src/plugins/admin/admin.d.ts +1570 -0
- package/dist/src/plugins/admin/client.d.ts +62 -0
- package/dist/src/plugins/admin/error-codes.d.ts +21 -0
- package/dist/src/plugins/admin/has-permission.d.ts +21 -0
- package/dist/src/plugins/admin/index.d.ts +2 -0
- package/dist/src/plugins/admin/schema.d.ts +36 -0
- package/dist/src/plugins/admin/types.d.ts +77 -0
- package/dist/src/plugins/anonymous/client.d.ts +8 -0
- package/dist/src/plugins/anonymous/index.d.ts +159 -0
- package/dist/src/plugins/api-key/client.d.ts +11 -0
- package/dist/src/plugins/api-key/index.d.ts +1431 -0
- package/dist/src/plugins/api-key/rate-limit.d.ts +20 -0
- package/dist/src/plugins/api-key/routes/create-api-key.d.ts +244 -0
- package/dist/src/plugins/api-key/routes/delete-all-expired-api-keys.d.ts +45 -0
- package/dist/src/plugins/api-key/routes/delete-api-key.d.ts +112 -0
- package/dist/src/plugins/api-key/routes/get-api-key.d.ts +234 -0
- package/dist/src/plugins/api-key/routes/index.d.ts +1136 -0
- package/dist/src/plugins/api-key/routes/list-api-keys.d.ts +231 -0
- package/dist/src/plugins/api-key/routes/update-api-key.d.ts +235 -0
- package/dist/src/plugins/api-key/routes/verify-api-key.d.ts +80 -0
- package/dist/src/plugins/api-key/schema.d.ts +188 -0
- package/dist/src/plugins/api-key/types.d.ts +285 -0
- package/dist/src/plugins/bearer/index.d.ts +31 -0
- package/dist/src/plugins/captcha/constants.d.ts +9 -0
- package/dist/src/plugins/captcha/error-codes.d.ts +9 -0
- package/dist/src/plugins/captcha/index.d.ts +7 -0
- package/dist/src/plugins/captcha/types.d.ts +23 -0
- package/dist/src/plugins/captcha/utils.d.ts +1 -0
- package/dist/src/plugins/captcha/verify-handlers/captchafox.d.ts +11 -0
- package/dist/src/plugins/captcha/verify-handlers/cloudflare-turnstile.d.ts +10 -0
- package/dist/src/plugins/captcha/verify-handlers/google-recaptcha.d.ts +11 -0
- package/dist/src/plugins/captcha/verify-handlers/h-captcha.d.ts +11 -0
- package/dist/src/plugins/captcha/verify-handlers/index.d.ts +4 -0
- package/dist/src/plugins/custom-session/client.d.ts +12 -0
- package/dist/src/plugins/custom-session/index.d.ts +89 -0
- package/dist/src/plugins/device-authorization/client.d.ts +12 -0
- package/dist/src/plugins/device-authorization/index.d.ts +568 -0
- package/dist/src/plugins/device-authorization/schema.d.ts +56 -0
- package/dist/src/plugins/email-otp/client.d.ts +9 -0
- package/dist/src/plugins/email-otp/index.d.ts +826 -0
- package/dist/src/plugins/email-otp/utils.d.ts +2 -0
- package/dist/src/plugins/generic-oauth/client.d.ts +5 -0
- package/dist/src/plugins/generic-oauth/index.d.ts +428 -0
- package/dist/src/plugins/haveibeenpwned/index.d.ts +25 -0
- package/dist/src/plugins/index.d.ts +28 -0
- package/dist/src/plugins/jwt/adapter.d.ts +8 -0
- package/dist/src/plugins/jwt/client.d.ts +5 -0
- package/dist/src/plugins/jwt/index.d.ts +276 -0
- package/dist/src/plugins/jwt/schema.d.ts +18 -0
- package/dist/src/plugins/jwt/sign.d.ts +8 -0
- package/dist/src/plugins/jwt/types.d.ts +175 -0
- package/dist/src/plugins/jwt/utils.d.ts +46 -0
- package/dist/src/plugins/last-login-method/client.d.ts +34 -0
- package/dist/src/plugins/last-login-method/index.d.ts +103 -0
- package/dist/src/plugins/magic-link/client.d.ts +5 -0
- package/dist/src/plugins/magic-link/index.d.ts +253 -0
- package/dist/src/plugins/magic-link/utils.d.ts +1 -0
- package/dist/src/plugins/multi-session/client.d.ts +9 -0
- package/dist/src/plugins/multi-session/index.d.ts +284 -0
- package/dist/src/plugins/oauth-proxy/index.d.ts +119 -0
- package/dist/src/plugins/one-tap/client.d.ts +81 -0
- package/dist/src/plugins/one-tap/index.d.ts +114 -0
- package/dist/src/plugins/one-time-token/client.d.ts +5 -0
- package/dist/src/plugins/one-time-token/index.d.ts +170 -0
- package/dist/src/plugins/one-time-token/utils.d.ts +1 -0
- package/dist/src/plugins/organization/access/index.d.ts +1 -0
- package/dist/src/plugins/organization/access/statement.d.ts +241 -0
- package/dist/src/plugins/organization/adapter.d.ts +685 -0
- package/dist/src/plugins/organization/call.d.ts +55 -0
- package/dist/src/plugins/organization/client.d.ts +344 -0
- package/dist/src/plugins/organization/error-codes.d.ts +58 -0
- package/dist/src/plugins/organization/has-permission.d.ts +13 -0
- package/dist/src/plugins/organization/index.d.ts +4 -0
- package/dist/src/plugins/organization/organization.d.ts +412 -0
- package/dist/src/plugins/organization/permission.d.ts +27 -0
- package/dist/src/plugins/organization/routes/crud-access-control.d.ts +701 -0
- package/dist/src/plugins/organization/routes/crud-invites.d.ts +1522 -0
- package/dist/src/plugins/organization/routes/crud-members.d.ts +1220 -0
- package/dist/src/plugins/organization/routes/crud-org.d.ts +1399 -0
- package/dist/src/plugins/organization/routes/crud-team.d.ts +1323 -0
- package/dist/src/plugins/organization/schema.d.ts +366 -0
- package/dist/src/plugins/organization/types.d.ts +737 -0
- package/dist/src/plugins/passkey/client.d.ts +190 -0
- package/dist/src/plugins/passkey/error-codes.d.ts +9 -0
- package/dist/src/plugins/passkey/index.d.ts +838 -0
- package/dist/src/plugins/passkey/schema.d.ts +50 -0
- package/dist/src/plugins/passkey/types.d.ts +69 -0
- package/dist/src/plugins/passkey/utils.d.ts +2 -0
- package/dist/src/plugins/phone-number/client.d.ts +9 -0
- package/dist/src/plugins/phone-number/index.d.ts +622 -0
- package/dist/src/plugins/phone-number/phone-number-error.d.ts +10 -0
- package/dist/src/plugins/two-factor/backup-codes/index.d.ts +387 -0
- package/dist/src/plugins/two-factor/client.d.ts +28 -0
- package/dist/src/plugins/two-factor/constant.d.ts +2 -0
- package/dist/src/plugins/two-factor/error-code.d.ts +11 -0
- package/dist/src/plugins/two-factor/index.d.ts +1014 -0
- package/dist/src/plugins/two-factor/otp/index.d.ts +282 -0
- package/dist/src/plugins/two-factor/schema.d.ts +35 -0
- package/dist/src/plugins/two-factor/totp/index.d.ts +298 -0
- package/dist/src/plugins/two-factor/types.d.ts +50 -0
- package/dist/src/plugins/two-factor/utils.d.ts +1 -0
- package/dist/src/plugins/two-factor/verify-two-factor.d.ts +59 -0
- package/dist/src/plugins/username/client.d.ts +5 -0
- package/dist/src/plugins/username/error-codes.d.ts +10 -0
- package/dist/src/plugins/username/index.d.ts +313 -0
- package/dist/src/plugins/username/schema.d.ts +27 -0
- package/dist/src/social-providers/index.d.ts +1 -0
- package/dist/src/test-utils/headers.d.ts +5 -0
- package/dist/src/test-utils/index.d.ts +2 -0
- package/dist/src/test-utils/test-instance.d.ts +17849 -0
- package/dist/src/types/adapter.d.ts +21 -0
- package/dist/src/types/api.d.ts +29 -0
- package/dist/src/types/helper.d.ts +32 -0
- package/dist/src/types/index.d.ts +7 -0
- package/dist/src/types/models.d.ts +13 -0
- package/dist/src/types/plugins.d.ts +14 -0
- package/dist/src/utils/await-object.d.ts +3 -0
- package/dist/src/utils/boolean.d.ts +1 -0
- package/dist/src/utils/clone.d.ts +1 -0
- package/dist/src/utils/constants.d.ts +1 -0
- package/dist/src/utils/date.d.ts +1 -0
- package/dist/src/utils/ensure-utc.d.ts +1 -0
- package/dist/src/utils/get-request-ip.d.ts +2 -0
- package/dist/src/utils/hashing.d.ts +6 -0
- package/dist/src/utils/hide-metadata.d.ts +3 -0
- package/dist/src/utils/id.d.ts +1 -0
- package/dist/src/utils/import-util.d.ts +1 -0
- package/dist/src/utils/index.d.ts +5 -0
- package/dist/src/utils/is-atom.d.ts +2 -0
- package/dist/src/utils/is-promise.d.ts +1 -0
- package/dist/src/utils/json.d.ts +1 -0
- package/dist/src/utils/merger.d.ts +1 -0
- package/dist/src/utils/middleware-response.d.ts +8 -0
- package/dist/src/utils/misc.d.ts +1 -0
- package/dist/src/utils/password.d.ts +6 -0
- package/dist/src/utils/plugin-helper.d.ts +5 -0
- package/dist/src/utils/shim.d.ts +3 -0
- package/dist/src/utils/time.d.ts +4 -0
- package/dist/src/utils/url.d.ts +4 -0
- package/dist/src/utils/wildcard.d.ts +45 -0
- package/dist/test-utils/index.d.mts +17870 -0
- package/dist/test-utils/index.mjs +272 -0
- package/dist/two-factor-ClUXxom2.mjs +914 -0
- package/dist/types/index.d.mts +6 -0
- package/dist/types/index.mjs +3 -0
- package/dist/types-B1OL7hyf.d.mts +4 -0
- package/dist/types-Bjn15Uy6.mjs +1 -0
- package/dist/url-VB2gAbTI.mjs +59 -0
- package/dist/username-DiGklOGl.mjs +278 -0
- package/dist/utils-SOMB4Px5.mjs +132 -0
- package/package.json +447 -0
|
@@ -0,0 +1,1124 @@
|
|
|
1
|
+
import { t as generateId } from "./utils-SOMB4Px5.mjs";
|
|
2
|
+
import { t as getIp } from "./get-request-ip-DSjrEpGo.mjs";
|
|
3
|
+
import { t as safeJSONParse } from "./json-D0TBLy4q.mjs";
|
|
4
|
+
import { c as parseSessionOutput, t as getDate, u as parseUserOutput } from "./date-Cx2yCiC4.mjs";
|
|
5
|
+
import { t as createKyselyAdapter } from "./dialect-CeddeGHf.mjs";
|
|
6
|
+
import { t as getAuthTables } from "./get-tables-BQP7YW9c.mjs";
|
|
7
|
+
import { getCurrentAdapter, getCurrentAuthContext, runWithTransaction } from "@gatwech/core/context";
|
|
8
|
+
import { createLogger, logger } from "@gatwech/core/env";
|
|
9
|
+
import { PayvoAuthError } from "@gatwech/core/error";
|
|
10
|
+
import * as z$1 from "zod";
|
|
11
|
+
import { sql } from "kysely";
|
|
12
|
+
|
|
13
|
+
//#region src/db/field.ts
|
|
14
|
+
const createFieldAttribute = (type, config) => {
|
|
15
|
+
return {
|
|
16
|
+
type,
|
|
17
|
+
...config
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
//#endregion
|
|
22
|
+
//#region src/db/get-schema.ts
|
|
23
|
+
function getSchema(config) {
|
|
24
|
+
const tables = getAuthTables(config);
|
|
25
|
+
let schema = {};
|
|
26
|
+
for (const key in tables) {
|
|
27
|
+
const table = tables[key];
|
|
28
|
+
const fields = table.fields;
|
|
29
|
+
let actualFields = {};
|
|
30
|
+
Object.entries(fields).forEach(([key$1, field]) => {
|
|
31
|
+
actualFields[field.fieldName || key$1] = field;
|
|
32
|
+
if (field.references) {
|
|
33
|
+
const refTable = tables[field.references.model];
|
|
34
|
+
if (refTable) actualFields[field.fieldName || key$1].references = {
|
|
35
|
+
...field.references,
|
|
36
|
+
model: refTable.modelName,
|
|
37
|
+
field: field.references.field
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
if (schema[table.modelName]) {
|
|
42
|
+
schema[table.modelName].fields = {
|
|
43
|
+
...schema[table.modelName].fields,
|
|
44
|
+
...actualFields
|
|
45
|
+
};
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
schema[table.modelName] = {
|
|
49
|
+
fields: actualFields,
|
|
50
|
+
order: table.order || Infinity
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return schema;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
//#endregion
|
|
57
|
+
//#region src/db/get-migration.ts
|
|
58
|
+
const map = {
|
|
59
|
+
postgres: {
|
|
60
|
+
string: [
|
|
61
|
+
"character varying",
|
|
62
|
+
"varchar",
|
|
63
|
+
"text"
|
|
64
|
+
],
|
|
65
|
+
number: [
|
|
66
|
+
"int4",
|
|
67
|
+
"integer",
|
|
68
|
+
"bigint",
|
|
69
|
+
"smallint",
|
|
70
|
+
"numeric",
|
|
71
|
+
"real",
|
|
72
|
+
"double precision"
|
|
73
|
+
],
|
|
74
|
+
boolean: ["bool", "boolean"],
|
|
75
|
+
date: [
|
|
76
|
+
"timestamptz",
|
|
77
|
+
"timestamp",
|
|
78
|
+
"date"
|
|
79
|
+
],
|
|
80
|
+
json: ["json", "jsonb"]
|
|
81
|
+
},
|
|
82
|
+
mysql: {
|
|
83
|
+
string: ["varchar", "text"],
|
|
84
|
+
number: [
|
|
85
|
+
"integer",
|
|
86
|
+
"int",
|
|
87
|
+
"bigint",
|
|
88
|
+
"smallint",
|
|
89
|
+
"decimal",
|
|
90
|
+
"float",
|
|
91
|
+
"double"
|
|
92
|
+
],
|
|
93
|
+
boolean: ["boolean", "tinyint"],
|
|
94
|
+
date: [
|
|
95
|
+
"timestamp",
|
|
96
|
+
"datetime",
|
|
97
|
+
"date"
|
|
98
|
+
],
|
|
99
|
+
json: ["json"]
|
|
100
|
+
},
|
|
101
|
+
sqlite: {
|
|
102
|
+
string: ["TEXT"],
|
|
103
|
+
number: ["INTEGER", "REAL"],
|
|
104
|
+
boolean: ["INTEGER", "BOOLEAN"],
|
|
105
|
+
date: ["DATE", "INTEGER"],
|
|
106
|
+
json: ["TEXT"]
|
|
107
|
+
},
|
|
108
|
+
mssql: {
|
|
109
|
+
string: ["varchar", "nvarchar"],
|
|
110
|
+
number: [
|
|
111
|
+
"int",
|
|
112
|
+
"bigint",
|
|
113
|
+
"smallint",
|
|
114
|
+
"decimal",
|
|
115
|
+
"float",
|
|
116
|
+
"double"
|
|
117
|
+
],
|
|
118
|
+
boolean: ["bit", "smallint"],
|
|
119
|
+
date: [
|
|
120
|
+
"datetime2",
|
|
121
|
+
"date",
|
|
122
|
+
"datetime"
|
|
123
|
+
],
|
|
124
|
+
json: ["varchar", "nvarchar"]
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
function matchType(columnDataType, fieldType, dbType) {
|
|
128
|
+
function normalize(type) {
|
|
129
|
+
return type.toLowerCase().split("(")[0].trim();
|
|
130
|
+
}
|
|
131
|
+
if (fieldType === "string[]" || fieldType === "number[]") return columnDataType.toLowerCase().includes("json");
|
|
132
|
+
const types = map[dbType];
|
|
133
|
+
return (Array.isArray(fieldType) ? types["string"].map((t) => t.toLowerCase()) : types[fieldType].map((t) => t.toLowerCase())).includes(normalize(columnDataType));
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get the current PostgreSQL schema (search_path) for the database connection
|
|
137
|
+
* Returns the first schema in the search_path, defaulting to 'public' if not found
|
|
138
|
+
*/
|
|
139
|
+
async function getPostgresSchema(db) {
|
|
140
|
+
try {
|
|
141
|
+
const result = await sql`SHOW search_path`.execute(db);
|
|
142
|
+
if (result.rows[0]?.search_path) return result.rows[0].search_path.split(",").map((s) => s.trim()).map((s) => s.replace(/^["']|["']$/g, "")).filter((s) => !s.startsWith("$"))[0] || "public";
|
|
143
|
+
} catch (error) {}
|
|
144
|
+
return "public";
|
|
145
|
+
}
|
|
146
|
+
async function getMigrations(config) {
|
|
147
|
+
const payvoAuthSchema = getSchema(config);
|
|
148
|
+
const logger$1 = createLogger(config.logger);
|
|
149
|
+
let { kysely: db, databaseType: dbType } = await createKyselyAdapter(config);
|
|
150
|
+
if (!dbType) {
|
|
151
|
+
logger$1.warn("Could not determine database type, defaulting to sqlite. Please provide a type in the database options to avoid this.");
|
|
152
|
+
dbType = "sqlite";
|
|
153
|
+
}
|
|
154
|
+
if (!db) {
|
|
155
|
+
logger$1.error("Only kysely adapter is supported for migrations. You can use `generate` command to generate the schema, if you're using a different adapter.");
|
|
156
|
+
process.exit(1);
|
|
157
|
+
}
|
|
158
|
+
let currentSchema = "public";
|
|
159
|
+
if (dbType === "postgres") {
|
|
160
|
+
currentSchema = await getPostgresSchema(db);
|
|
161
|
+
logger$1.debug(`PostgreSQL migration: Using schema '${currentSchema}' (from search_path)`);
|
|
162
|
+
try {
|
|
163
|
+
if (!(await sql`
|
|
164
|
+
SELECT schema_name
|
|
165
|
+
FROM information_schema.schemata
|
|
166
|
+
WHERE schema_name = ${currentSchema}
|
|
167
|
+
`.execute(db)).rows[0]) logger$1.warn(`Schema '${currentSchema}' does not exist. Tables will be inspected from available schemas. Consider creating the schema first or checking your database configuration.`);
|
|
168
|
+
} catch (error) {
|
|
169
|
+
logger$1.debug(`Could not verify schema existence: ${error instanceof Error ? error.message : String(error)}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
const allTableMetadata = await db.introspection.getTables();
|
|
173
|
+
let tableMetadata = allTableMetadata;
|
|
174
|
+
if (dbType === "postgres") try {
|
|
175
|
+
const tablesInSchema = await sql`
|
|
176
|
+
SELECT table_name
|
|
177
|
+
FROM information_schema.tables
|
|
178
|
+
WHERE table_schema = ${currentSchema}
|
|
179
|
+
AND table_type = 'BASE TABLE'
|
|
180
|
+
`.execute(db);
|
|
181
|
+
const tableNamesInSchema = new Set(tablesInSchema.rows.map((row) => row.table_name));
|
|
182
|
+
tableMetadata = allTableMetadata.filter((table) => table.schema === currentSchema && tableNamesInSchema.has(table.name));
|
|
183
|
+
logger$1.debug(`Found ${tableMetadata.length} table(s) in schema '${currentSchema}': ${tableMetadata.map((t) => t.name).join(", ") || "(none)"}`);
|
|
184
|
+
} catch (error) {
|
|
185
|
+
logger$1.warn(`Could not filter tables by schema. Using all discovered tables. Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
186
|
+
}
|
|
187
|
+
const toBeCreated = [];
|
|
188
|
+
const toBeAdded = [];
|
|
189
|
+
for (const [key, value] of Object.entries(payvoAuthSchema)) {
|
|
190
|
+
const table = tableMetadata.find((t) => t.name === key);
|
|
191
|
+
if (!table) {
|
|
192
|
+
const tIndex = toBeCreated.findIndex((t) => t.table === key);
|
|
193
|
+
const tableData = {
|
|
194
|
+
table: key,
|
|
195
|
+
fields: value.fields,
|
|
196
|
+
order: value.order || Infinity
|
|
197
|
+
};
|
|
198
|
+
const insertIndex = toBeCreated.findIndex((t) => (t.order || Infinity) > tableData.order);
|
|
199
|
+
if (insertIndex === -1) if (tIndex === -1) toBeCreated.push(tableData);
|
|
200
|
+
else toBeCreated[tIndex].fields = {
|
|
201
|
+
...toBeCreated[tIndex].fields,
|
|
202
|
+
...value.fields
|
|
203
|
+
};
|
|
204
|
+
else toBeCreated.splice(insertIndex, 0, tableData);
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
let toBeAddedFields = {};
|
|
208
|
+
for (const [fieldName, field] of Object.entries(value.fields)) {
|
|
209
|
+
const column = table.columns.find((c) => c.name === fieldName);
|
|
210
|
+
if (!column) {
|
|
211
|
+
toBeAddedFields[fieldName] = field;
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
if (matchType(column.dataType, field.type, dbType)) continue;
|
|
215
|
+
else logger$1.warn(`Field ${fieldName} in table ${key} has a different type in the database. Expected ${field.type} but got ${column.dataType}.`);
|
|
216
|
+
}
|
|
217
|
+
if (Object.keys(toBeAddedFields).length > 0) toBeAdded.push({
|
|
218
|
+
table: key,
|
|
219
|
+
fields: toBeAddedFields,
|
|
220
|
+
order: value.order || Infinity
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
const migrations = [];
|
|
224
|
+
const useUUIDs = config.advanced?.database?.generateId === "uuid";
|
|
225
|
+
function getType(field, fieldName) {
|
|
226
|
+
const type = field.type;
|
|
227
|
+
const typeMap = {
|
|
228
|
+
string: {
|
|
229
|
+
sqlite: "text",
|
|
230
|
+
postgres: "text",
|
|
231
|
+
mysql: field.unique ? "varchar(255)" : field.references ? "varchar(36)" : "text",
|
|
232
|
+
mssql: field.unique || field.sortable ? "varchar(255)" : field.references ? "varchar(36)" : "varchar(8000)"
|
|
233
|
+
},
|
|
234
|
+
boolean: {
|
|
235
|
+
sqlite: "integer",
|
|
236
|
+
postgres: "boolean",
|
|
237
|
+
mysql: "boolean",
|
|
238
|
+
mssql: "smallint"
|
|
239
|
+
},
|
|
240
|
+
number: {
|
|
241
|
+
sqlite: field.bigint ? "bigint" : "integer",
|
|
242
|
+
postgres: field.bigint ? "bigint" : "integer",
|
|
243
|
+
mysql: field.bigint ? "bigint" : "integer",
|
|
244
|
+
mssql: field.bigint ? "bigint" : "integer"
|
|
245
|
+
},
|
|
246
|
+
date: {
|
|
247
|
+
sqlite: "date",
|
|
248
|
+
postgres: "timestamptz",
|
|
249
|
+
mysql: "timestamp(3)",
|
|
250
|
+
mssql: sql`datetime2(3)`
|
|
251
|
+
},
|
|
252
|
+
json: {
|
|
253
|
+
sqlite: "text",
|
|
254
|
+
postgres: "jsonb",
|
|
255
|
+
mysql: "json",
|
|
256
|
+
mssql: "varchar(8000)"
|
|
257
|
+
},
|
|
258
|
+
id: {
|
|
259
|
+
postgres: useNumberId ? "serial" : useUUIDs ? "uuid" : "text",
|
|
260
|
+
mysql: useNumberId ? "integer" : useUUIDs ? "uuid" : "varchar(36)",
|
|
261
|
+
mssql: useNumberId ? "integer" : useUUIDs ? "uuid" : "varchar(36)",
|
|
262
|
+
sqlite: useNumberId ? "integer" : "text"
|
|
263
|
+
},
|
|
264
|
+
foreignKeyId: {
|
|
265
|
+
postgres: useNumberId ? "integer" : useUUIDs ? "uuid" : "text",
|
|
266
|
+
mysql: useNumberId ? "integer" : useUUIDs ? "uuid" : "varchar(36)",
|
|
267
|
+
mssql: useNumberId ? "integer" : useUUIDs ? "uuid" : "varchar(36)",
|
|
268
|
+
sqlite: useNumberId ? "integer" : "text"
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
if (fieldName === "id" || field.references?.field === "id") {
|
|
272
|
+
if (fieldName === "id") return typeMap.id[dbType];
|
|
273
|
+
return typeMap.foreignKeyId[dbType];
|
|
274
|
+
}
|
|
275
|
+
if (dbType === "sqlite" && (type === "string[]" || type === "number[]")) return "text";
|
|
276
|
+
if (type === "string[]" || type === "number[]") return "jsonb";
|
|
277
|
+
if (Array.isArray(type)) return "text";
|
|
278
|
+
return typeMap[type][dbType || "sqlite"];
|
|
279
|
+
}
|
|
280
|
+
if (toBeAdded.length) for (const table of toBeAdded) for (const [fieldName, field] of Object.entries(table.fields)) {
|
|
281
|
+
const type = getType(field, fieldName);
|
|
282
|
+
const exec = db.schema.alterTable(table.table).addColumn(fieldName, type, (col) => {
|
|
283
|
+
col = field.required !== false ? col.notNull() : col;
|
|
284
|
+
if (field.references) col = col.references(`${field.references.model}.${field.references.field}`).onDelete(field.references.onDelete || "cascade");
|
|
285
|
+
if (field.unique) col = col.unique();
|
|
286
|
+
if (field.type === "date" && typeof field.defaultValue === "function" && (dbType === "postgres" || dbType === "mysql" || dbType === "mssql")) if (dbType === "mysql") col = col.defaultTo(sql`CURRENT_TIMESTAMP(3)`);
|
|
287
|
+
else col = col.defaultTo(sql`CURRENT_TIMESTAMP`);
|
|
288
|
+
return col;
|
|
289
|
+
});
|
|
290
|
+
migrations.push(exec);
|
|
291
|
+
}
|
|
292
|
+
const useNumberId = config.advanced?.database?.useNumberId || config.advanced?.database?.generateId === "serial";
|
|
293
|
+
if (config.advanced?.database?.useNumberId) logger$1.warn("`useNumberId` is deprecated. Please use `generateId` with `serial` instead.");
|
|
294
|
+
if (toBeCreated.length) for (const table of toBeCreated) {
|
|
295
|
+
let dbT = db.schema.createTable(table.table).addColumn("id", useNumberId ? dbType === "postgres" ? "serial" : "integer" : useUUIDs ? dbType === "postgres" || dbType === "mysql" || dbType === "mssql" ? "uuid" : "text" : dbType === "mysql" || dbType === "mssql" ? "varchar(36)" : "text", (col) => {
|
|
296
|
+
if (useNumberId) {
|
|
297
|
+
if (dbType === "postgres" || dbType === "sqlite") return col.primaryKey().notNull();
|
|
298
|
+
else if (dbType === "mssql") return col.identity().primaryKey().notNull();
|
|
299
|
+
return col.autoIncrement().primaryKey().notNull();
|
|
300
|
+
}
|
|
301
|
+
if (useUUIDs) {
|
|
302
|
+
if (dbType === "postgres") return col.primaryKey().defaultTo(sql`gen_random_uuid()`).notNull();
|
|
303
|
+
else if (dbType === "mysql" || dbType === "mssql") return col.primaryKey().defaultTo(sql`uuid()`).notNull();
|
|
304
|
+
return col.primaryKey().notNull();
|
|
305
|
+
}
|
|
306
|
+
return col.primaryKey().notNull();
|
|
307
|
+
});
|
|
308
|
+
for (const [fieldName, field] of Object.entries(table.fields)) {
|
|
309
|
+
const type = getType(field, fieldName);
|
|
310
|
+
dbT = dbT.addColumn(fieldName, type, (col) => {
|
|
311
|
+
col = field.required !== false ? col.notNull() : col;
|
|
312
|
+
if (field.references) col = col.references(`${field.references.model}.${field.references.field}`).onDelete(field.references.onDelete || "cascade");
|
|
313
|
+
if (field.unique) col = col.unique();
|
|
314
|
+
if (field.type === "date" && typeof field.defaultValue === "function" && (dbType === "postgres" || dbType === "mysql" || dbType === "mssql")) if (dbType === "mysql") col = col.defaultTo(sql`CURRENT_TIMESTAMP(3)`);
|
|
315
|
+
else col = col.defaultTo(sql`CURRENT_TIMESTAMP`);
|
|
316
|
+
return col;
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
migrations.push(dbT);
|
|
320
|
+
}
|
|
321
|
+
async function runMigrations() {
|
|
322
|
+
for (const migration of migrations) await migration.execute();
|
|
323
|
+
}
|
|
324
|
+
async function compileMigrations() {
|
|
325
|
+
return migrations.map((m) => m.compile().sql).join(";\n\n") + ";";
|
|
326
|
+
}
|
|
327
|
+
return {
|
|
328
|
+
toBeCreated,
|
|
329
|
+
toBeAdded,
|
|
330
|
+
runMigrations,
|
|
331
|
+
compileMigrations
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
//#endregion
|
|
336
|
+
//#region src/db/with-hooks.ts
|
|
337
|
+
function getWithHooks(adapter, ctx) {
|
|
338
|
+
const hooks = ctx.hooks;
|
|
339
|
+
async function createWithHooks(data, model, customCreateFn) {
|
|
340
|
+
const context = await getCurrentAuthContext();
|
|
341
|
+
let actualData = data;
|
|
342
|
+
for (const hook of hooks || []) {
|
|
343
|
+
const toRun = hook[model]?.create?.before;
|
|
344
|
+
if (toRun) {
|
|
345
|
+
const result = await toRun(actualData, context);
|
|
346
|
+
if (result === false) return null;
|
|
347
|
+
if (typeof result === "object" && "data" in result) actualData = {
|
|
348
|
+
...actualData,
|
|
349
|
+
...result.data
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
const customCreated = customCreateFn ? await customCreateFn.fn(actualData) : null;
|
|
354
|
+
const created = !customCreateFn || customCreateFn.executeMainFn ? await (await getCurrentAdapter(adapter)).create({
|
|
355
|
+
model,
|
|
356
|
+
data: actualData,
|
|
357
|
+
forceAllowId: true
|
|
358
|
+
}) : customCreated;
|
|
359
|
+
for (const hook of hooks || []) {
|
|
360
|
+
const toRun = hook[model]?.create?.after;
|
|
361
|
+
if (toRun) await toRun(created, context);
|
|
362
|
+
}
|
|
363
|
+
return created;
|
|
364
|
+
}
|
|
365
|
+
async function updateWithHooks(data, where, model, customUpdateFn) {
|
|
366
|
+
const context = await getCurrentAuthContext();
|
|
367
|
+
let actualData = data;
|
|
368
|
+
for (const hook of hooks || []) {
|
|
369
|
+
const toRun = hook[model]?.update?.before;
|
|
370
|
+
if (toRun) {
|
|
371
|
+
const result = await toRun(data, context);
|
|
372
|
+
if (result === false) return null;
|
|
373
|
+
actualData = typeof result === "object" ? result.data : result;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
const customUpdated = customUpdateFn ? await customUpdateFn.fn(actualData) : null;
|
|
377
|
+
const updated = !customUpdateFn || customUpdateFn.executeMainFn ? await (await getCurrentAdapter(adapter)).update({
|
|
378
|
+
model,
|
|
379
|
+
update: actualData,
|
|
380
|
+
where
|
|
381
|
+
}) : customUpdated;
|
|
382
|
+
for (const hook of hooks || []) {
|
|
383
|
+
const toRun = hook[model]?.update?.after;
|
|
384
|
+
if (toRun) await toRun(updated, context);
|
|
385
|
+
}
|
|
386
|
+
return updated;
|
|
387
|
+
}
|
|
388
|
+
async function updateManyWithHooks(data, where, model, customUpdateFn) {
|
|
389
|
+
const context = await getCurrentAuthContext();
|
|
390
|
+
let actualData = data;
|
|
391
|
+
for (const hook of hooks || []) {
|
|
392
|
+
const toRun = hook[model]?.update?.before;
|
|
393
|
+
if (toRun) {
|
|
394
|
+
const result = await toRun(data, context);
|
|
395
|
+
if (result === false) return null;
|
|
396
|
+
actualData = typeof result === "object" ? result.data : result;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
const customUpdated = customUpdateFn ? await customUpdateFn.fn(actualData) : null;
|
|
400
|
+
const updated = !customUpdateFn || customUpdateFn.executeMainFn ? await (await getCurrentAdapter(adapter)).updateMany({
|
|
401
|
+
model,
|
|
402
|
+
update: actualData,
|
|
403
|
+
where
|
|
404
|
+
}) : customUpdated;
|
|
405
|
+
for (const hook of hooks || []) {
|
|
406
|
+
const toRun = hook[model]?.update?.after;
|
|
407
|
+
if (toRun) await toRun(updated, context);
|
|
408
|
+
}
|
|
409
|
+
return updated;
|
|
410
|
+
}
|
|
411
|
+
async function deleteWithHooks(where, model, customDeleteFn) {
|
|
412
|
+
const context = await getCurrentAuthContext();
|
|
413
|
+
let entityToDelete = null;
|
|
414
|
+
try {
|
|
415
|
+
entityToDelete = (await (await getCurrentAdapter(adapter)).findMany({
|
|
416
|
+
model,
|
|
417
|
+
where,
|
|
418
|
+
limit: 1
|
|
419
|
+
}))[0] || null;
|
|
420
|
+
} catch (error) {}
|
|
421
|
+
if (entityToDelete) for (const hook of hooks || []) {
|
|
422
|
+
const toRun = hook[model]?.delete?.before;
|
|
423
|
+
if (toRun) {
|
|
424
|
+
if (await toRun(entityToDelete, context) === false) return null;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
const customDeleted = customDeleteFn ? await customDeleteFn.fn(where) : null;
|
|
428
|
+
const deleted = !customDeleteFn || customDeleteFn.executeMainFn ? await (await getCurrentAdapter(adapter)).delete({
|
|
429
|
+
model,
|
|
430
|
+
where
|
|
431
|
+
}) : customDeleted;
|
|
432
|
+
if (entityToDelete) for (const hook of hooks || []) {
|
|
433
|
+
const toRun = hook[model]?.delete?.after;
|
|
434
|
+
if (toRun) await toRun(entityToDelete, context);
|
|
435
|
+
}
|
|
436
|
+
return deleted;
|
|
437
|
+
}
|
|
438
|
+
async function deleteManyWithHooks(where, model, customDeleteFn) {
|
|
439
|
+
const context = await getCurrentAuthContext();
|
|
440
|
+
let entitiesToDelete = [];
|
|
441
|
+
try {
|
|
442
|
+
entitiesToDelete = await (await getCurrentAdapter(adapter)).findMany({
|
|
443
|
+
model,
|
|
444
|
+
where
|
|
445
|
+
});
|
|
446
|
+
} catch (error) {}
|
|
447
|
+
for (const entity of entitiesToDelete) for (const hook of hooks || []) {
|
|
448
|
+
const toRun = hook[model]?.delete?.before;
|
|
449
|
+
if (toRun) {
|
|
450
|
+
if (await toRun(entity, context) === false) return null;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
const customDeleted = customDeleteFn ? await customDeleteFn.fn(where) : null;
|
|
454
|
+
const deleted = !customDeleteFn || customDeleteFn.executeMainFn ? await (await getCurrentAdapter(adapter)).deleteMany({
|
|
455
|
+
model,
|
|
456
|
+
where
|
|
457
|
+
}) : customDeleted;
|
|
458
|
+
for (const entity of entitiesToDelete) for (const hook of hooks || []) {
|
|
459
|
+
const toRun = hook[model]?.delete?.after;
|
|
460
|
+
if (toRun) await toRun(entity, context);
|
|
461
|
+
}
|
|
462
|
+
return deleted;
|
|
463
|
+
}
|
|
464
|
+
return {
|
|
465
|
+
createWithHooks,
|
|
466
|
+
updateWithHooks,
|
|
467
|
+
updateManyWithHooks,
|
|
468
|
+
deleteWithHooks,
|
|
469
|
+
deleteManyWithHooks
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
//#endregion
|
|
474
|
+
//#region src/db/internal-adapter.ts
|
|
475
|
+
const createInternalAdapter = (adapter, ctx) => {
|
|
476
|
+
const logger$1 = ctx.logger;
|
|
477
|
+
const options = ctx.options;
|
|
478
|
+
const secondaryStorage = options.secondaryStorage;
|
|
479
|
+
const sessionExpiration = options.session?.expiresIn || 3600 * 24 * 7;
|
|
480
|
+
const { createWithHooks, updateWithHooks, updateManyWithHooks, deleteWithHooks, deleteManyWithHooks } = getWithHooks(adapter, ctx);
|
|
481
|
+
async function refreshUserSessions(user) {
|
|
482
|
+
if (!secondaryStorage) return;
|
|
483
|
+
const listRaw = await secondaryStorage.get(`active-sessions-${user.id}`);
|
|
484
|
+
if (!listRaw) return;
|
|
485
|
+
const now = Date.now();
|
|
486
|
+
const validSessions = (safeJSONParse(listRaw) || []).filter((s) => s.expiresAt > now);
|
|
487
|
+
await Promise.all(validSessions.map(async ({ token }) => {
|
|
488
|
+
const cached = await secondaryStorage.get(token);
|
|
489
|
+
if (!cached) return;
|
|
490
|
+
const parsed = safeJSONParse(cached);
|
|
491
|
+
if (!parsed) return;
|
|
492
|
+
const sessionTTL = Math.max(Math.floor(new Date(parsed.session.expiresAt).getTime() - now) / 1e3, 0);
|
|
493
|
+
await secondaryStorage.set(token, JSON.stringify({
|
|
494
|
+
session: parsed.session,
|
|
495
|
+
user
|
|
496
|
+
}), Math.floor(sessionTTL));
|
|
497
|
+
}));
|
|
498
|
+
}
|
|
499
|
+
return {
|
|
500
|
+
createOAuthUser: async (user, account) => {
|
|
501
|
+
return runWithTransaction(adapter, async () => {
|
|
502
|
+
const createdUser = await createWithHooks({
|
|
503
|
+
createdAt: /* @__PURE__ */ new Date(),
|
|
504
|
+
updatedAt: /* @__PURE__ */ new Date(),
|
|
505
|
+
...user
|
|
506
|
+
}, "user", void 0);
|
|
507
|
+
return {
|
|
508
|
+
user: createdUser,
|
|
509
|
+
account: await createWithHooks({
|
|
510
|
+
...account,
|
|
511
|
+
userId: createdUser.id,
|
|
512
|
+
createdAt: /* @__PURE__ */ new Date(),
|
|
513
|
+
updatedAt: /* @__PURE__ */ new Date()
|
|
514
|
+
}, "account", void 0)
|
|
515
|
+
};
|
|
516
|
+
});
|
|
517
|
+
},
|
|
518
|
+
createUser: async (user) => {
|
|
519
|
+
return await createWithHooks({
|
|
520
|
+
createdAt: /* @__PURE__ */ new Date(),
|
|
521
|
+
updatedAt: /* @__PURE__ */ new Date(),
|
|
522
|
+
...user,
|
|
523
|
+
email: user.email?.toLowerCase()
|
|
524
|
+
}, "user", void 0);
|
|
525
|
+
},
|
|
526
|
+
createAccount: async (account) => {
|
|
527
|
+
return await createWithHooks({
|
|
528
|
+
createdAt: /* @__PURE__ */ new Date(),
|
|
529
|
+
updatedAt: /* @__PURE__ */ new Date(),
|
|
530
|
+
...account
|
|
531
|
+
}, "account", void 0);
|
|
532
|
+
},
|
|
533
|
+
listSessions: async (userId) => {
|
|
534
|
+
if (secondaryStorage) {
|
|
535
|
+
const currentList = await secondaryStorage.get(`active-sessions-${userId}`);
|
|
536
|
+
if (!currentList) return [];
|
|
537
|
+
const list = safeJSONParse(currentList) || [];
|
|
538
|
+
const now = Date.now();
|
|
539
|
+
const validSessions = list.filter((s) => s.expiresAt > now);
|
|
540
|
+
const sessions = [];
|
|
541
|
+
for (const session of validSessions) {
|
|
542
|
+
const sessionStringified = await secondaryStorage.get(session.token);
|
|
543
|
+
if (sessionStringified) {
|
|
544
|
+
const s = safeJSONParse(sessionStringified);
|
|
545
|
+
if (!s) return [];
|
|
546
|
+
const parsedSession = parseSessionOutput(ctx.options, {
|
|
547
|
+
...s.session,
|
|
548
|
+
expiresAt: new Date(s.session.expiresAt)
|
|
549
|
+
});
|
|
550
|
+
sessions.push(parsedSession);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
return sessions;
|
|
554
|
+
}
|
|
555
|
+
return await (await getCurrentAdapter(adapter)).findMany({
|
|
556
|
+
model: "session",
|
|
557
|
+
where: [{
|
|
558
|
+
field: "userId",
|
|
559
|
+
value: userId
|
|
560
|
+
}]
|
|
561
|
+
});
|
|
562
|
+
},
|
|
563
|
+
listUsers: async (limit, offset, sortBy, where) => {
|
|
564
|
+
return await (await getCurrentAdapter(adapter)).findMany({
|
|
565
|
+
model: "user",
|
|
566
|
+
limit,
|
|
567
|
+
offset,
|
|
568
|
+
sortBy,
|
|
569
|
+
where
|
|
570
|
+
});
|
|
571
|
+
},
|
|
572
|
+
countTotalUsers: async (where) => {
|
|
573
|
+
const total = await (await getCurrentAdapter(adapter)).count({
|
|
574
|
+
model: "user",
|
|
575
|
+
where
|
|
576
|
+
});
|
|
577
|
+
if (typeof total === "string") return parseInt(total);
|
|
578
|
+
return total;
|
|
579
|
+
},
|
|
580
|
+
deleteUser: async (userId) => {
|
|
581
|
+
if (secondaryStorage) await secondaryStorage.delete(`active-sessions-${userId}`);
|
|
582
|
+
if (!secondaryStorage || options.session?.storeSessionInDatabase) await deleteManyWithHooks([{
|
|
583
|
+
field: "userId",
|
|
584
|
+
value: userId
|
|
585
|
+
}], "session", void 0);
|
|
586
|
+
await deleteManyWithHooks([{
|
|
587
|
+
field: "userId",
|
|
588
|
+
value: userId
|
|
589
|
+
}], "account", void 0);
|
|
590
|
+
await deleteWithHooks([{
|
|
591
|
+
field: "id",
|
|
592
|
+
value: userId
|
|
593
|
+
}], "user", void 0);
|
|
594
|
+
},
|
|
595
|
+
createSession: async (userId, dontRememberMe, override, overrideAll) => {
|
|
596
|
+
const ctx$1 = await getCurrentAuthContext();
|
|
597
|
+
const headers = ctx$1.headers || ctx$1.request?.headers;
|
|
598
|
+
const { id: _,...rest } = override || {};
|
|
599
|
+
const data = {
|
|
600
|
+
ipAddress: ctx$1.request || ctx$1.headers ? getIp(ctx$1.request || ctx$1.headers, ctx$1.context.options) || "" : "",
|
|
601
|
+
userAgent: headers?.get("user-agent") || "",
|
|
602
|
+
...rest,
|
|
603
|
+
expiresAt: dontRememberMe ? getDate(3600 * 24, "sec") : getDate(sessionExpiration, "sec"),
|
|
604
|
+
userId,
|
|
605
|
+
token: generateId(32),
|
|
606
|
+
createdAt: /* @__PURE__ */ new Date(),
|
|
607
|
+
updatedAt: /* @__PURE__ */ new Date(),
|
|
608
|
+
...overrideAll ? rest : {}
|
|
609
|
+
};
|
|
610
|
+
return await createWithHooks(data, "session", secondaryStorage ? {
|
|
611
|
+
fn: async (sessionData) => {
|
|
612
|
+
/**
|
|
613
|
+
* store the session token for the user
|
|
614
|
+
* so we can retrieve it later for listing sessions
|
|
615
|
+
*/
|
|
616
|
+
const currentList = await secondaryStorage.get(`active-sessions-${userId}`);
|
|
617
|
+
let list = [];
|
|
618
|
+
const now = Date.now();
|
|
619
|
+
if (currentList) {
|
|
620
|
+
list = safeJSONParse(currentList) || [];
|
|
621
|
+
list = list.filter((session) => session.expiresAt > now);
|
|
622
|
+
}
|
|
623
|
+
const sorted = list.sort((a, b) => a.expiresAt - b.expiresAt);
|
|
624
|
+
let furthestSessionExp = sorted.at(-1)?.expiresAt;
|
|
625
|
+
sorted.push({
|
|
626
|
+
token: data.token,
|
|
627
|
+
expiresAt: data.expiresAt.getTime()
|
|
628
|
+
});
|
|
629
|
+
if (!furthestSessionExp || furthestSessionExp < data.expiresAt.getTime()) furthestSessionExp = data.expiresAt.getTime();
|
|
630
|
+
const furthestSessionTTL = Math.max(Math.floor((furthestSessionExp - now) / 1e3), 0);
|
|
631
|
+
if (furthestSessionTTL > 0) await secondaryStorage.set(`active-sessions-${userId}`, JSON.stringify(sorted), furthestSessionTTL);
|
|
632
|
+
const user = await adapter.findOne({
|
|
633
|
+
model: "user",
|
|
634
|
+
where: [{
|
|
635
|
+
field: "id",
|
|
636
|
+
value: userId
|
|
637
|
+
}]
|
|
638
|
+
});
|
|
639
|
+
const sessionTTL = Math.max(Math.floor((data.expiresAt.getTime() - now) / 1e3), 0);
|
|
640
|
+
if (sessionTTL > 0) await secondaryStorage.set(data.token, JSON.stringify({
|
|
641
|
+
session: sessionData,
|
|
642
|
+
user
|
|
643
|
+
}), sessionTTL);
|
|
644
|
+
return sessionData;
|
|
645
|
+
},
|
|
646
|
+
executeMainFn: options.session?.storeSessionInDatabase
|
|
647
|
+
} : void 0);
|
|
648
|
+
},
|
|
649
|
+
findSession: async (token) => {
|
|
650
|
+
if (secondaryStorage) {
|
|
651
|
+
const sessionStringified = await secondaryStorage.get(token);
|
|
652
|
+
if (!sessionStringified && !options.session?.storeSessionInDatabase) return null;
|
|
653
|
+
if (sessionStringified) {
|
|
654
|
+
const s = safeJSONParse(sessionStringified);
|
|
655
|
+
if (!s) return null;
|
|
656
|
+
return {
|
|
657
|
+
session: parseSessionOutput(ctx.options, {
|
|
658
|
+
...s.session,
|
|
659
|
+
expiresAt: new Date(s.session.expiresAt),
|
|
660
|
+
createdAt: new Date(s.session.createdAt),
|
|
661
|
+
updatedAt: new Date(s.session.updatedAt)
|
|
662
|
+
}),
|
|
663
|
+
user: parseUserOutput(ctx.options, {
|
|
664
|
+
...s.user,
|
|
665
|
+
createdAt: new Date(s.user.createdAt),
|
|
666
|
+
updatedAt: new Date(s.user.updatedAt)
|
|
667
|
+
})
|
|
668
|
+
};
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
const session = await (await getCurrentAdapter(adapter)).findOne({
|
|
672
|
+
model: "session",
|
|
673
|
+
where: [{
|
|
674
|
+
value: token,
|
|
675
|
+
field: "token"
|
|
676
|
+
}]
|
|
677
|
+
});
|
|
678
|
+
if (!session) return null;
|
|
679
|
+
const user = await (await getCurrentAdapter(adapter)).findOne({
|
|
680
|
+
model: "user",
|
|
681
|
+
where: [{
|
|
682
|
+
value: session.userId,
|
|
683
|
+
field: "id"
|
|
684
|
+
}]
|
|
685
|
+
});
|
|
686
|
+
if (!user) return null;
|
|
687
|
+
return {
|
|
688
|
+
session: parseSessionOutput(ctx.options, session),
|
|
689
|
+
user: parseUserOutput(ctx.options, user)
|
|
690
|
+
};
|
|
691
|
+
},
|
|
692
|
+
findSessions: async (sessionTokens) => {
|
|
693
|
+
if (secondaryStorage) {
|
|
694
|
+
const sessions$1 = [];
|
|
695
|
+
for (const sessionToken of sessionTokens) {
|
|
696
|
+
const sessionStringified = await secondaryStorage.get(sessionToken);
|
|
697
|
+
if (sessionStringified) {
|
|
698
|
+
const s = safeJSONParse(sessionStringified);
|
|
699
|
+
if (!s) return [];
|
|
700
|
+
const session = {
|
|
701
|
+
session: {
|
|
702
|
+
...s.session,
|
|
703
|
+
expiresAt: new Date(s.session.expiresAt)
|
|
704
|
+
},
|
|
705
|
+
user: {
|
|
706
|
+
...s.user,
|
|
707
|
+
createdAt: new Date(s.user.createdAt),
|
|
708
|
+
updatedAt: new Date(s.user.updatedAt)
|
|
709
|
+
}
|
|
710
|
+
};
|
|
711
|
+
sessions$1.push(session);
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
return sessions$1;
|
|
715
|
+
}
|
|
716
|
+
const sessions = await (await getCurrentAdapter(adapter)).findMany({
|
|
717
|
+
model: "session",
|
|
718
|
+
where: [{
|
|
719
|
+
field: "token",
|
|
720
|
+
value: sessionTokens,
|
|
721
|
+
operator: "in"
|
|
722
|
+
}]
|
|
723
|
+
});
|
|
724
|
+
const userIds = sessions.map((session) => {
|
|
725
|
+
return session.userId;
|
|
726
|
+
});
|
|
727
|
+
if (!userIds.length) return [];
|
|
728
|
+
const users = await (await getCurrentAdapter(adapter)).findMany({
|
|
729
|
+
model: "user",
|
|
730
|
+
where: [{
|
|
731
|
+
field: "id",
|
|
732
|
+
value: userIds,
|
|
733
|
+
operator: "in"
|
|
734
|
+
}]
|
|
735
|
+
});
|
|
736
|
+
return sessions.map((session) => {
|
|
737
|
+
const user = users.find((u) => u.id === session.userId);
|
|
738
|
+
if (!user) return null;
|
|
739
|
+
return {
|
|
740
|
+
session,
|
|
741
|
+
user
|
|
742
|
+
};
|
|
743
|
+
});
|
|
744
|
+
},
|
|
745
|
+
updateSession: async (sessionToken, session) => {
|
|
746
|
+
return await updateWithHooks(session, [{
|
|
747
|
+
field: "token",
|
|
748
|
+
value: sessionToken
|
|
749
|
+
}], "session", secondaryStorage ? {
|
|
750
|
+
async fn(data) {
|
|
751
|
+
const currentSession = await secondaryStorage.get(sessionToken);
|
|
752
|
+
let updatedSession = null;
|
|
753
|
+
if (currentSession) {
|
|
754
|
+
const parsedSession = safeJSONParse(currentSession);
|
|
755
|
+
if (!parsedSession) return null;
|
|
756
|
+
updatedSession = {
|
|
757
|
+
...parsedSession.session,
|
|
758
|
+
...data
|
|
759
|
+
};
|
|
760
|
+
return updatedSession;
|
|
761
|
+
} else return null;
|
|
762
|
+
},
|
|
763
|
+
executeMainFn: options.session?.storeSessionInDatabase
|
|
764
|
+
} : void 0);
|
|
765
|
+
},
|
|
766
|
+
deleteSession: async (token) => {
|
|
767
|
+
if (secondaryStorage) {
|
|
768
|
+
const data = await secondaryStorage.get(token);
|
|
769
|
+
if (data) {
|
|
770
|
+
const { session } = safeJSONParse(data) ?? {};
|
|
771
|
+
if (!session) {
|
|
772
|
+
logger$1.error("Session not found in secondary storage");
|
|
773
|
+
return;
|
|
774
|
+
}
|
|
775
|
+
const userId = session.userId;
|
|
776
|
+
const currentList = await secondaryStorage.get(`active-sessions-${userId}`);
|
|
777
|
+
if (currentList) {
|
|
778
|
+
let list = safeJSONParse(currentList) || [];
|
|
779
|
+
const now = Date.now();
|
|
780
|
+
const filtered = list.filter((session$1) => session$1.expiresAt > now && session$1.token !== token);
|
|
781
|
+
const furthestSessionExp = filtered.sort((a, b) => a.expiresAt - b.expiresAt).at(-1)?.expiresAt;
|
|
782
|
+
if (filtered.length > 0 && furthestSessionExp && furthestSessionExp > Date.now()) await secondaryStorage.set(`active-sessions-${userId}`, JSON.stringify(filtered), Math.floor((furthestSessionExp - now) / 1e3));
|
|
783
|
+
else await secondaryStorage.delete(`active-sessions-${userId}`);
|
|
784
|
+
} else logger$1.error("Active sessions list not found in secondary storage");
|
|
785
|
+
}
|
|
786
|
+
await secondaryStorage.delete(token);
|
|
787
|
+
if (!options.session?.storeSessionInDatabase || ctx.options.session?.preserveSessionInDatabase) return;
|
|
788
|
+
}
|
|
789
|
+
await (await getCurrentAdapter(adapter)).delete({
|
|
790
|
+
model: "session",
|
|
791
|
+
where: [{
|
|
792
|
+
field: "token",
|
|
793
|
+
value: token
|
|
794
|
+
}]
|
|
795
|
+
});
|
|
796
|
+
},
|
|
797
|
+
deleteAccounts: async (userId) => {
|
|
798
|
+
await deleteManyWithHooks([{
|
|
799
|
+
field: "userId",
|
|
800
|
+
value: userId
|
|
801
|
+
}], "account", void 0);
|
|
802
|
+
},
|
|
803
|
+
deleteAccount: async (accountId) => {
|
|
804
|
+
await deleteWithHooks([{
|
|
805
|
+
field: "id",
|
|
806
|
+
value: accountId
|
|
807
|
+
}], "account", void 0);
|
|
808
|
+
},
|
|
809
|
+
deleteSessions: async (userIdOrSessionTokens) => {
|
|
810
|
+
if (secondaryStorage) {
|
|
811
|
+
if (typeof userIdOrSessionTokens === "string") {
|
|
812
|
+
const activeSession = await secondaryStorage.get(`active-sessions-${userIdOrSessionTokens}`);
|
|
813
|
+
const sessions = activeSession ? safeJSONParse(activeSession) : [];
|
|
814
|
+
if (!sessions) return;
|
|
815
|
+
for (const session of sessions) await secondaryStorage.delete(session.token);
|
|
816
|
+
} else for (const sessionToken of userIdOrSessionTokens) if (await secondaryStorage.get(sessionToken)) await secondaryStorage.delete(sessionToken);
|
|
817
|
+
if (!options.session?.storeSessionInDatabase || ctx.options.session?.preserveSessionInDatabase) return;
|
|
818
|
+
}
|
|
819
|
+
await deleteManyWithHooks([{
|
|
820
|
+
field: Array.isArray(userIdOrSessionTokens) ? "token" : "userId",
|
|
821
|
+
value: userIdOrSessionTokens,
|
|
822
|
+
operator: Array.isArray(userIdOrSessionTokens) ? "in" : void 0
|
|
823
|
+
}], "session", void 0);
|
|
824
|
+
},
|
|
825
|
+
findOAuthUser: async (email, accountId, providerId) => {
|
|
826
|
+
const account = await (await getCurrentAdapter(adapter)).findMany({
|
|
827
|
+
model: "account",
|
|
828
|
+
where: [{
|
|
829
|
+
value: accountId,
|
|
830
|
+
field: "accountId"
|
|
831
|
+
}]
|
|
832
|
+
}).then((accounts) => {
|
|
833
|
+
return accounts.find((a) => a.providerId === providerId);
|
|
834
|
+
});
|
|
835
|
+
if (account) {
|
|
836
|
+
const user = await (await getCurrentAdapter(adapter)).findOne({
|
|
837
|
+
model: "user",
|
|
838
|
+
where: [{
|
|
839
|
+
value: account.userId,
|
|
840
|
+
field: "id"
|
|
841
|
+
}]
|
|
842
|
+
});
|
|
843
|
+
if (user) return {
|
|
844
|
+
user,
|
|
845
|
+
accounts: [account]
|
|
846
|
+
};
|
|
847
|
+
else {
|
|
848
|
+
const user$1 = await (await getCurrentAdapter(adapter)).findOne({
|
|
849
|
+
model: "user",
|
|
850
|
+
where: [{
|
|
851
|
+
value: email.toLowerCase(),
|
|
852
|
+
field: "email"
|
|
853
|
+
}]
|
|
854
|
+
});
|
|
855
|
+
if (user$1) return {
|
|
856
|
+
user: user$1,
|
|
857
|
+
accounts: [account]
|
|
858
|
+
};
|
|
859
|
+
return null;
|
|
860
|
+
}
|
|
861
|
+
} else {
|
|
862
|
+
const user = await (await getCurrentAdapter(adapter)).findOne({
|
|
863
|
+
model: "user",
|
|
864
|
+
where: [{
|
|
865
|
+
value: email.toLowerCase(),
|
|
866
|
+
field: "email"
|
|
867
|
+
}]
|
|
868
|
+
});
|
|
869
|
+
if (user) return {
|
|
870
|
+
user,
|
|
871
|
+
accounts: await (await getCurrentAdapter(adapter)).findMany({
|
|
872
|
+
model: "account",
|
|
873
|
+
where: [{
|
|
874
|
+
value: user.id,
|
|
875
|
+
field: "userId"
|
|
876
|
+
}]
|
|
877
|
+
}) || []
|
|
878
|
+
};
|
|
879
|
+
else return null;
|
|
880
|
+
}
|
|
881
|
+
},
|
|
882
|
+
findUserByEmail: async (email, options$1) => {
|
|
883
|
+
const user = await (await getCurrentAdapter(adapter)).findOne({
|
|
884
|
+
model: "user",
|
|
885
|
+
where: [{
|
|
886
|
+
value: email.toLowerCase(),
|
|
887
|
+
field: "email"
|
|
888
|
+
}]
|
|
889
|
+
});
|
|
890
|
+
if (!user) return null;
|
|
891
|
+
if (options$1?.includeAccounts) return {
|
|
892
|
+
user,
|
|
893
|
+
accounts: await (await getCurrentAdapter(adapter)).findMany({
|
|
894
|
+
model: "account",
|
|
895
|
+
where: [{
|
|
896
|
+
value: user.id,
|
|
897
|
+
field: "userId"
|
|
898
|
+
}]
|
|
899
|
+
})
|
|
900
|
+
};
|
|
901
|
+
return {
|
|
902
|
+
user,
|
|
903
|
+
accounts: []
|
|
904
|
+
};
|
|
905
|
+
},
|
|
906
|
+
findUserById: async (userId) => {
|
|
907
|
+
return await (await getCurrentAdapter(adapter)).findOne({
|
|
908
|
+
model: "user",
|
|
909
|
+
where: [{
|
|
910
|
+
field: "id",
|
|
911
|
+
value: userId
|
|
912
|
+
}]
|
|
913
|
+
});
|
|
914
|
+
},
|
|
915
|
+
linkAccount: async (account) => {
|
|
916
|
+
return await createWithHooks({
|
|
917
|
+
createdAt: /* @__PURE__ */ new Date(),
|
|
918
|
+
updatedAt: /* @__PURE__ */ new Date(),
|
|
919
|
+
...account
|
|
920
|
+
}, "account", void 0);
|
|
921
|
+
},
|
|
922
|
+
updateUser: async (userId, data) => {
|
|
923
|
+
const user = await updateWithHooks(data, [{
|
|
924
|
+
field: "id",
|
|
925
|
+
value: userId
|
|
926
|
+
}], "user", void 0);
|
|
927
|
+
await refreshUserSessions(user);
|
|
928
|
+
await refreshUserSessions(user);
|
|
929
|
+
return user;
|
|
930
|
+
},
|
|
931
|
+
updateUserByEmail: async (email, data) => {
|
|
932
|
+
const user = await updateWithHooks(data, [{
|
|
933
|
+
field: "email",
|
|
934
|
+
value: email.toLowerCase()
|
|
935
|
+
}], "user", void 0);
|
|
936
|
+
await refreshUserSessions(user);
|
|
937
|
+
await refreshUserSessions(user);
|
|
938
|
+
return user;
|
|
939
|
+
},
|
|
940
|
+
updatePassword: async (userId, password) => {
|
|
941
|
+
await updateManyWithHooks({ password }, [{
|
|
942
|
+
field: "userId",
|
|
943
|
+
value: userId
|
|
944
|
+
}, {
|
|
945
|
+
field: "providerId",
|
|
946
|
+
value: "credential"
|
|
947
|
+
}], "account", void 0);
|
|
948
|
+
},
|
|
949
|
+
findAccounts: async (userId) => {
|
|
950
|
+
return await (await getCurrentAdapter(adapter)).findMany({
|
|
951
|
+
model: "account",
|
|
952
|
+
where: [{
|
|
953
|
+
field: "userId",
|
|
954
|
+
value: userId
|
|
955
|
+
}]
|
|
956
|
+
});
|
|
957
|
+
},
|
|
958
|
+
findAccount: async (accountId) => {
|
|
959
|
+
return await (await getCurrentAdapter(adapter)).findOne({
|
|
960
|
+
model: "account",
|
|
961
|
+
where: [{
|
|
962
|
+
field: "accountId",
|
|
963
|
+
value: accountId
|
|
964
|
+
}]
|
|
965
|
+
});
|
|
966
|
+
},
|
|
967
|
+
findAccountByProviderId: async (accountId, providerId) => {
|
|
968
|
+
return await (await getCurrentAdapter(adapter)).findOne({
|
|
969
|
+
model: "account",
|
|
970
|
+
where: [{
|
|
971
|
+
field: "accountId",
|
|
972
|
+
value: accountId
|
|
973
|
+
}, {
|
|
974
|
+
field: "providerId",
|
|
975
|
+
value: providerId
|
|
976
|
+
}]
|
|
977
|
+
});
|
|
978
|
+
},
|
|
979
|
+
findAccountByUserId: async (userId) => {
|
|
980
|
+
return await (await getCurrentAdapter(adapter)).findMany({
|
|
981
|
+
model: "account",
|
|
982
|
+
where: [{
|
|
983
|
+
field: "userId",
|
|
984
|
+
value: userId
|
|
985
|
+
}]
|
|
986
|
+
});
|
|
987
|
+
},
|
|
988
|
+
updateAccount: async (id, data) => {
|
|
989
|
+
return await updateWithHooks(data, [{
|
|
990
|
+
field: "id",
|
|
991
|
+
value: id
|
|
992
|
+
}], "account", void 0);
|
|
993
|
+
},
|
|
994
|
+
createVerificationValue: async (data) => {
|
|
995
|
+
return await createWithHooks({
|
|
996
|
+
createdAt: /* @__PURE__ */ new Date(),
|
|
997
|
+
updatedAt: /* @__PURE__ */ new Date(),
|
|
998
|
+
...data
|
|
999
|
+
}, "verification", void 0);
|
|
1000
|
+
},
|
|
1001
|
+
findVerificationValue: async (identifier) => {
|
|
1002
|
+
const verification = await (await getCurrentAdapter(adapter)).findMany({
|
|
1003
|
+
model: "verification",
|
|
1004
|
+
where: [{
|
|
1005
|
+
field: "identifier",
|
|
1006
|
+
value: identifier
|
|
1007
|
+
}],
|
|
1008
|
+
sortBy: {
|
|
1009
|
+
field: "createdAt",
|
|
1010
|
+
direction: "desc"
|
|
1011
|
+
},
|
|
1012
|
+
limit: 1
|
|
1013
|
+
});
|
|
1014
|
+
if (!options.verification?.disableCleanup) await (await getCurrentAdapter(adapter)).deleteMany({
|
|
1015
|
+
model: "verification",
|
|
1016
|
+
where: [{
|
|
1017
|
+
field: "expiresAt",
|
|
1018
|
+
value: /* @__PURE__ */ new Date(),
|
|
1019
|
+
operator: "lt"
|
|
1020
|
+
}]
|
|
1021
|
+
});
|
|
1022
|
+
return verification[0];
|
|
1023
|
+
},
|
|
1024
|
+
deleteVerificationValue: async (id) => {
|
|
1025
|
+
await (await getCurrentAdapter(adapter)).delete({
|
|
1026
|
+
model: "verification",
|
|
1027
|
+
where: [{
|
|
1028
|
+
field: "id",
|
|
1029
|
+
value: id
|
|
1030
|
+
}]
|
|
1031
|
+
});
|
|
1032
|
+
},
|
|
1033
|
+
deleteVerificationByIdentifier: async (identifier) => {
|
|
1034
|
+
await (await getCurrentAdapter(adapter)).delete({
|
|
1035
|
+
model: "verification",
|
|
1036
|
+
where: [{
|
|
1037
|
+
field: "identifier",
|
|
1038
|
+
value: identifier
|
|
1039
|
+
}]
|
|
1040
|
+
});
|
|
1041
|
+
},
|
|
1042
|
+
updateVerificationValue: async (id, data) => {
|
|
1043
|
+
return await updateWithHooks(data, [{
|
|
1044
|
+
field: "id",
|
|
1045
|
+
value: id
|
|
1046
|
+
}], "verification", void 0);
|
|
1047
|
+
}
|
|
1048
|
+
};
|
|
1049
|
+
};
|
|
1050
|
+
|
|
1051
|
+
//#endregion
|
|
1052
|
+
//#region src/db/to-zod.ts
|
|
1053
|
+
function toZodSchema({ fields, isClientSide }) {
|
|
1054
|
+
const zodFields = Object.keys(fields).reduce((acc, key) => {
|
|
1055
|
+
const field = fields[key];
|
|
1056
|
+
if (!field) return acc;
|
|
1057
|
+
if (isClientSide && field.input === false) return acc;
|
|
1058
|
+
let schema;
|
|
1059
|
+
if (field.type === "json") schema = z$1.json ? z$1.json() : z$1.any();
|
|
1060
|
+
else if (field.type === "string[]" || field.type === "number[]") schema = z$1.array(field.type === "string[]" ? z$1.string() : z$1.number());
|
|
1061
|
+
else if (Array.isArray(field.type)) schema = z$1.any();
|
|
1062
|
+
else schema = z$1[field.type]();
|
|
1063
|
+
if (field?.required === false) schema = schema.optional();
|
|
1064
|
+
if (field?.returned === false) return acc;
|
|
1065
|
+
return {
|
|
1066
|
+
...acc,
|
|
1067
|
+
[key]: schema
|
|
1068
|
+
};
|
|
1069
|
+
}, {});
|
|
1070
|
+
return z$1.object(zodFields);
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
//#endregion
|
|
1074
|
+
//#region src/db/utils.ts
|
|
1075
|
+
async function getAdapter(options) {
|
|
1076
|
+
let adapter;
|
|
1077
|
+
if (!options.database) {
|
|
1078
|
+
const tables = getAuthTables(options);
|
|
1079
|
+
const memoryDB = Object.keys(tables).reduce((acc, key) => {
|
|
1080
|
+
acc[key] = [];
|
|
1081
|
+
return acc;
|
|
1082
|
+
}, {});
|
|
1083
|
+
logger.warn("No database configuration provided. Using memory adapter in development");
|
|
1084
|
+
const { memoryAdapter } = await import("./adapters/memory-adapter/index.mjs");
|
|
1085
|
+
adapter = memoryAdapter(memoryDB)(options);
|
|
1086
|
+
} else if (typeof options.database === "function") adapter = options.database(options);
|
|
1087
|
+
else {
|
|
1088
|
+
const { createKyselyAdapter: createKyselyAdapter$1 } = await import("./adapters/kysely-adapter/index.mjs");
|
|
1089
|
+
const { kysely, databaseType, transaction } = await createKyselyAdapter$1(options);
|
|
1090
|
+
if (!kysely) throw new PayvoAuthError("Failed to initialize database adapter");
|
|
1091
|
+
const { kyselyAdapter } = await import("./adapters/kysely-adapter/index.mjs");
|
|
1092
|
+
adapter = kyselyAdapter(kysely, {
|
|
1093
|
+
type: databaseType || "sqlite",
|
|
1094
|
+
debugLogs: "debugLogs" in options.database ? options.database.debugLogs : false,
|
|
1095
|
+
transaction
|
|
1096
|
+
})(options);
|
|
1097
|
+
}
|
|
1098
|
+
if (!adapter.transaction) {
|
|
1099
|
+
logger.warn("Adapter does not correctly implement transaction function, patching it automatically. Please update your adapter implementation.");
|
|
1100
|
+
adapter.transaction = async (cb) => {
|
|
1101
|
+
return cb(adapter);
|
|
1102
|
+
};
|
|
1103
|
+
}
|
|
1104
|
+
return adapter;
|
|
1105
|
+
}
|
|
1106
|
+
function convertToDB(fields, values) {
|
|
1107
|
+
let result = values.id ? { id: values.id } : {};
|
|
1108
|
+
for (const key in fields) {
|
|
1109
|
+
const field = fields[key];
|
|
1110
|
+
const value = values[key];
|
|
1111
|
+
if (value === void 0) continue;
|
|
1112
|
+
result[field.fieldName || key] = value;
|
|
1113
|
+
}
|
|
1114
|
+
return result;
|
|
1115
|
+
}
|
|
1116
|
+
function convertFromDB(fields, values) {
|
|
1117
|
+
if (!values) return null;
|
|
1118
|
+
let result = { id: values.id };
|
|
1119
|
+
for (const [key, value] of Object.entries(fields)) result[key] = values[value.fieldName || key];
|
|
1120
|
+
return result;
|
|
1121
|
+
}
|
|
1122
|
+
|
|
1123
|
+
//#endregion
|
|
1124
|
+
export { createInternalAdapter as a, matchType as c, toZodSchema as i, getSchema as l, convertToDB as n, getWithHooks as o, getAdapter as r, getMigrations as s, convertFromDB as t, createFieldAttribute as u };
|