@masheev/better-auth 0.0.0-stage → 1.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +20 -0
- package/README.md +31 -2
- package/TYPE-PATCH-NOTICE.md +9 -0
- package/TYPE-PATCH-PROVENANCE.json +267 -0
- package/dist/_virtual/_rolldown/runtime.mjs +27 -0
- package/dist/adapters/drizzle-adapter/index.d.mts +1 -0
- package/dist/adapters/drizzle-adapter/index.mjs +2 -0
- package/dist/adapters/index.d.mts +26 -0
- package/dist/adapters/index.mjs +9 -0
- package/dist/adapters/kysely-adapter/index.d.mts +1 -0
- package/dist/adapters/kysely-adapter/index.mjs +2 -0
- package/dist/adapters/memory-adapter/index.d.mts +1 -0
- package/dist/adapters/memory-adapter/index.mjs +2 -0
- package/dist/adapters/mongodb-adapter/index.d.mts +1 -0
- package/dist/adapters/mongodb-adapter/index.mjs +2 -0
- package/dist/adapters/prisma-adapter/index.d.mts +1 -0
- package/dist/adapters/prisma-adapter/index.mjs +2 -0
- package/dist/api/dispatch.d.mts +34 -0
- package/dist/api/dispatch.mjs +275 -0
- package/dist/api/index.d.mts +4053 -0
- package/dist/api/index.mjs +220 -0
- package/dist/api/middlewares/authorization.d.mts +69 -0
- package/dist/api/middlewares/authorization.mjs +78 -0
- package/dist/api/middlewares/index.d.mts +2 -0
- package/dist/api/middlewares/origin-check.d.mts +17 -0
- package/dist/api/middlewares/origin-check.mjs +155 -0
- package/dist/api/rate-limiter/index.mjs +318 -0
- package/dist/api/routes/account.d.mts +413 -0
- package/dist/api/routes/account.mjs +619 -0
- package/dist/api/routes/callback.d.mts +32 -0
- package/dist/api/routes/callback.mjs +261 -0
- package/dist/api/routes/email-verification.d.mts +160 -0
- package/dist/api/routes/email-verification.mjs +324 -0
- package/dist/api/routes/error.d.mts +27 -0
- package/dist/api/routes/error.mjs +387 -0
- package/dist/api/routes/index.d.mts +12 -0
- package/dist/api/routes/ok.d.mts +35 -0
- package/dist/api/routes/ok.mjs +27 -0
- package/dist/api/routes/password.d.mts +182 -0
- package/dist/api/routes/password.mjs +206 -0
- package/dist/api/routes/session.d.mts +450 -0
- package/dist/api/routes/session.mjs +481 -0
- package/dist/api/routes/sign-in.d.mts +186 -0
- package/dist/api/routes/sign-in.mjs +368 -0
- package/dist/api/routes/sign-out.d.mts +51 -0
- package/dist/api/routes/sign-out.mjs +96 -0
- package/dist/api/routes/sign-up.d.mts +159 -0
- package/dist/api/routes/sign-up.mjs +275 -0
- package/dist/api/routes/update-session.d.mts +74 -0
- package/dist/api/routes/update-session.mjs +57 -0
- package/dist/api/routes/update-user.d.mts +428 -0
- package/dist/api/routes/update-user.mjs +522 -0
- package/dist/api/state/oauth.d.mts +53 -0
- package/dist/api/state/oauth.mjs +38 -0
- package/dist/api/state/should-session-refresh.d.mts +12 -0
- package/dist/api/state/should-session-refresh.mjs +13 -0
- package/dist/api/to-auth-endpoints.mjs +60 -0
- package/dist/auth/base.mjs +66 -0
- package/dist/auth/full.d.mts +28 -0
- package/dist/auth/full.mjs +29 -0
- package/dist/auth/minimal.d.mts +10 -0
- package/dist/auth/minimal.mjs +11 -0
- package/dist/auth/trusted-origins.mjs +106 -0
- package/dist/client/broadcast-channel.d.mts +19 -0
- package/dist/client/broadcast-channel.mjs +44 -0
- package/dist/client/config.d.mts +90 -0
- package/dist/client/config.mjs +113 -0
- package/dist/client/equality.d.mts +19 -0
- package/dist/client/equality.mjs +42 -0
- package/dist/client/fetch-plugins.mjs +17 -0
- package/dist/client/focus-manager.d.mts +10 -0
- package/dist/client/focus-manager.mjs +30 -0
- package/dist/client/index.d.mts +35 -0
- package/dist/client/index.mjs +22 -0
- package/dist/client/lynx/index.d.mts +43 -0
- package/dist/client/lynx/index.mjs +22 -0
- package/dist/client/lynx/lynx-store.d.mts +46 -0
- package/dist/client/lynx/lynx-store.mjs +44 -0
- package/dist/client/online-manager.d.mts +11 -0
- package/dist/client/online-manager.mjs +33 -0
- package/dist/client/parser.d.mts +10 -0
- package/dist/client/parser.mjs +70 -0
- package/dist/client/path-to-object.d.mts +113 -0
- package/dist/client/plugins/index.d.mts +44 -0
- package/dist/client/plugins/index.mjs +30 -0
- package/dist/client/plugins/infer-plugin.d.mts +16 -0
- package/dist/client/plugins/infer-plugin.mjs +11 -0
- package/dist/client/proxy.mjs +78 -0
- package/dist/client/query.d.mts +23 -0
- package/dist/client/query.mjs +124 -0
- package/dist/client/react/index.d.mts +44 -0
- package/dist/client/react/index.mjs +22 -0
- package/dist/client/react/react-store.d.mts +46 -0
- package/dist/client/react/react-store.mjs +44 -0
- package/dist/client/session-atom.d.mts +11 -0
- package/dist/client/session-atom.mjs +178 -0
- package/dist/client/session-refresh.d.mts +20 -0
- package/dist/client/session-refresh.mjs +131 -0
- package/dist/client/solid/index.d.mts +44 -0
- package/dist/client/solid/index.mjs +22 -0
- package/dist/client/solid/solid-store.mjs +21 -0
- package/dist/client/svelte/index.d.mts +44 -0
- package/dist/client/svelte/index.mjs +18 -0
- package/dist/client/types.d.mts +51 -0
- package/dist/client/vanilla.d.mts +42 -0
- package/dist/client/vanilla.mjs +18 -0
- package/dist/client/vue/index.d.mts +67 -0
- package/dist/client/vue/index.mjs +54 -0
- package/dist/client/vue/vue-store.mjs +23 -0
- package/dist/context/create-context.mjs +235 -0
- package/dist/context/helpers.mjs +158 -0
- package/dist/context/init-minimal.mjs +17 -0
- package/dist/context/init.mjs +19 -0
- package/dist/context/secret-utils.mjs +53 -0
- package/dist/context/store-capabilities.mjs +12 -0
- package/dist/cookies/cache.mjs +33 -0
- package/dist/cookies/cookie-utils.d.mts +72 -0
- package/dist/cookies/cookie-utils.mjs +203 -0
- package/dist/cookies/index.d.mts +124 -0
- package/dist/cookies/index.mjs +350 -0
- package/dist/cookies/jwt.mjs +44 -0
- package/dist/cookies/session-store.d.mts +32 -0
- package/dist/cookies/session-store.mjs +183 -0
- package/dist/crypto/buffer.d.mts +7 -0
- package/dist/crypto/buffer.mjs +16 -0
- package/dist/crypto/index.d.mts +32 -0
- package/dist/crypto/index.mjs +69 -0
- package/dist/crypto/jwt.d.mts +9 -0
- package/dist/crypto/jwt.mjs +141 -0
- package/dist/crypto/password.d.mts +13 -0
- package/dist/crypto/password.mjs +14 -0
- package/dist/crypto/random.d.mts +4 -0
- package/dist/crypto/random.mjs +5 -0
- package/dist/db/adapter-base.d.mts +7 -0
- package/dist/db/adapter-base.mjs +25 -0
- package/dist/db/adapter-kysely.d.mts +7 -0
- package/dist/db/adapter-kysely.mjs +17 -0
- package/dist/db/field-converter.d.mts +7 -0
- package/dist/db/field-converter.mjs +19 -0
- package/dist/db/field.d.mts +41 -0
- package/dist/db/get-migration.d.mts +56 -0
- package/dist/db/get-migration.mjs +685 -0
- package/dist/db/get-schema.d.mts +13 -0
- package/dist/db/get-schema.mjs +39 -0
- package/dist/db/index.d.mts +10 -0
- package/dist/db/index.mjs +35 -0
- package/dist/db/internal-adapter.d.mts +14 -0
- package/dist/db/internal-adapter.mjs +951 -0
- package/dist/db/revoke-unproven-account-access.d.mts +21 -0
- package/dist/db/revoke-unproven-account-access.mjs +58 -0
- package/dist/db/schema.d.mts +62 -0
- package/dist/db/schema.mjs +161 -0
- package/dist/db/to-zod.d.mts +35 -0
- package/dist/db/to-zod.mjs +23 -0
- package/dist/db/verification-token-storage.mjs +25 -0
- package/dist/db/with-hooks.d.mts +37 -0
- package/dist/db/with-hooks.mjs +255 -0
- package/dist/index.d.mts +30 -0
- package/dist/index.mjs +17 -0
- package/dist/integrations/cookie-plugin-guard.mjs +18 -0
- package/dist/integrations/next-js.d.mts +29 -0
- package/dist/integrations/next-js.mjs +105 -0
- package/dist/integrations/node.d.mts +11 -0
- package/dist/integrations/node.mjs +13 -0
- package/dist/integrations/solid-start.d.mts +22 -0
- package/dist/integrations/solid-start.mjs +15 -0
- package/dist/integrations/svelte-kit.d.mts +38 -0
- package/dist/integrations/svelte-kit.mjs +57 -0
- package/dist/integrations/tanstack-start-solid.d.mts +33 -0
- package/dist/integrations/tanstack-start-solid.mjs +57 -0
- package/dist/integrations/tanstack-start.d.mts +33 -0
- package/dist/integrations/tanstack-start.mjs +57 -0
- package/dist/oauth2/account-key.mjs +43 -0
- package/dist/oauth2/errors.mjs +49 -0
- package/dist/oauth2/index.d.mts +5 -0
- package/dist/oauth2/index.mjs +5 -0
- package/dist/oauth2/link-account.d.mts +96 -0
- package/dist/oauth2/link-account.mjs +329 -0
- package/dist/oauth2/state.d.mts +54 -0
- package/dist/oauth2/state.mjs +67 -0
- package/dist/oauth2/utils.d.mts +11 -0
- package/dist/oauth2/utils.mjs +33 -0
- package/dist/package.mjs +4 -0
- package/dist/plugins/access/access.d.mts +17 -0
- package/dist/plugins/access/access.mjs +78 -0
- package/dist/plugins/access/index.d.mts +3 -0
- package/dist/plugins/access/index.mjs +2 -0
- package/dist/plugins/access/types.d.mts +24 -0
- package/dist/plugins/additional-fields/client.d.mts +100 -0
- package/dist/plugins/additional-fields/client.mjs +11 -0
- package/dist/plugins/admin/access/index.d.mts +2 -0
- package/dist/plugins/admin/access/index.mjs +2 -0
- package/dist/plugins/admin/access/statement.d.mts +51 -0
- package/dist/plugins/admin/access/statement.mjs +52 -0
- package/dist/plugins/admin/admin.d.mts +911 -0
- package/dist/plugins/admin/admin.mjs +89 -0
- package/dist/plugins/admin/client.d.mts +81 -0
- package/dist/plugins/admin/client.mjs +39 -0
- package/dist/plugins/admin/error-codes.d.mts +30 -0
- package/dist/plugins/admin/error-codes.mjs +29 -0
- package/dist/plugins/admin/has-permission.mjs +12 -0
- package/dist/plugins/admin/index.d.mts +3 -0
- package/dist/plugins/admin/index.mjs +2 -0
- package/dist/plugins/admin/routes.mjs +919 -0
- package/dist/plugins/admin/schema.d.mts +40 -0
- package/dist/plugins/admin/schema.mjs +33 -0
- package/dist/plugins/admin/types.d.mts +88 -0
- package/dist/plugins/anonymous/client.d.mts +32 -0
- package/dist/plugins/anonymous/client.mjs +21 -0
- package/dist/plugins/anonymous/error-codes.d.mts +15 -0
- package/dist/plugins/anonymous/error-codes.mjs +14 -0
- package/dist/plugins/anonymous/index.d.mts +175 -0
- package/dist/plugins/anonymous/index.mjs +219 -0
- package/dist/plugins/anonymous/schema.d.mts +15 -0
- package/dist/plugins/anonymous/schema.mjs +9 -0
- package/dist/plugins/anonymous/types.d.mts +65 -0
- package/dist/plugins/bearer/index.d.mts +45 -0
- package/dist/plugins/bearer/index.mjs +74 -0
- package/dist/plugins/captcha/constants.d.mts +9 -0
- package/dist/plugins/captcha/constants.mjs +27 -0
- package/dist/plugins/captcha/error-codes.mjs +13 -0
- package/dist/plugins/captcha/index.d.mts +27 -0
- package/dist/plugins/captcha/index.mjs +79 -0
- package/dist/plugins/captcha/types.d.mts +52 -0
- package/dist/plugins/captcha/utils.mjs +9 -0
- package/dist/plugins/captcha/verify-handlers/captchafox.mjs +27 -0
- package/dist/plugins/captcha/verify-handlers/cloudflare-turnstile.mjs +47 -0
- package/dist/plugins/captcha/verify-handlers/google-recaptcha.mjs +32 -0
- package/dist/plugins/captcha/verify-handlers/h-captcha.mjs +27 -0
- package/dist/plugins/custom-session/client.d.mts +17 -0
- package/dist/plugins/custom-session/client.mjs +7 -0
- package/dist/plugins/custom-session/index.d.mts +73 -0
- package/dist/plugins/custom-session/index.mjs +65 -0
- package/dist/plugins/device-authorization/client.d.mts +17 -0
- package/dist/plugins/device-authorization/client.mjs +18 -0
- package/dist/plugins/device-authorization/error-codes.mjs +19 -0
- package/dist/plugins/device-authorization/index.d.mts +558 -0
- package/dist/plugins/device-authorization/index.mjs +87 -0
- package/dist/plugins/device-authorization/routes.d.mts +32 -0
- package/dist/plugins/device-authorization/routes.mjs +725 -0
- package/dist/plugins/device-authorization/schema.d.mts +18 -0
- package/dist/plugins/device-authorization/schema.mjs +63 -0
- package/dist/plugins/email-otp/client.d.mts +21 -0
- package/dist/plugins/email-otp/client.mjs +17 -0
- package/dist/plugins/email-otp/error-codes.d.mts +10 -0
- package/dist/plugins/email-otp/error-codes.mjs +9 -0
- package/dist/plugins/email-otp/index.d.mts +551 -0
- package/dist/plugins/email-otp/index.mjs +145 -0
- package/dist/plugins/email-otp/otp-token.mjs +55 -0
- package/dist/plugins/email-otp/routes.mjs +784 -0
- package/dist/plugins/email-otp/types.d.mts +109 -0
- package/dist/plugins/email-otp/utils.mjs +17 -0
- package/dist/plugins/generic-oauth/error-codes.mjs +8 -0
- package/dist/plugins/generic-oauth/index.d.mts +52 -0
- package/dist/plugins/generic-oauth/index.mjs +279 -0
- package/dist/plugins/generic-oauth/providers/auth0.d.mts +36 -0
- package/dist/plugins/generic-oauth/providers/auth0.mjs +49 -0
- package/dist/plugins/generic-oauth/providers/gumroad.d.mts +31 -0
- package/dist/plugins/generic-oauth/providers/gumroad.mjs +62 -0
- package/dist/plugins/generic-oauth/providers/hubspot.d.mts +36 -0
- package/dist/plugins/generic-oauth/providers/hubspot.mjs +62 -0
- package/dist/plugins/generic-oauth/providers/index.d.mts +10 -0
- package/dist/plugins/generic-oauth/providers/keycloak.d.mts +36 -0
- package/dist/plugins/generic-oauth/providers/keycloak.mjs +47 -0
- package/dist/plugins/generic-oauth/providers/line.d.mts +54 -0
- package/dist/plugins/generic-oauth/providers/line.mjs +93 -0
- package/dist/plugins/generic-oauth/providers/microsoft-entra-id.d.mts +39 -0
- package/dist/plugins/generic-oauth/providers/microsoft-entra-id.mjs +104 -0
- package/dist/plugins/generic-oauth/providers/okta.d.mts +36 -0
- package/dist/plugins/generic-oauth/providers/okta.mjs +47 -0
- package/dist/plugins/generic-oauth/providers/patreon.d.mts +29 -0
- package/dist/plugins/generic-oauth/providers/patreon.mjs +61 -0
- package/dist/plugins/generic-oauth/providers/slack.d.mts +29 -0
- package/dist/plugins/generic-oauth/providers/slack.mjs +63 -0
- package/dist/plugins/generic-oauth/providers/yandex.d.mts +29 -0
- package/dist/plugins/generic-oauth/providers/yandex.mjs +67 -0
- package/dist/plugins/generic-oauth/types.d.mts +268 -0
- package/dist/plugins/haveibeenpwned/index.d.mts +63 -0
- package/dist/plugins/haveibeenpwned/index.mjs +81 -0
- package/dist/plugins/index.d.mts +69 -0
- package/dist/plugins/index.mjs +49 -0
- package/dist/plugins/jwt/adapter.mjs +68 -0
- package/dist/plugins/jwt/client.d.mts +41 -0
- package/dist/plugins/jwt/client.mjs +19 -0
- package/dist/plugins/jwt/cookie-cache.mjs +77 -0
- package/dist/plugins/jwt/index.d.mts +246 -0
- package/dist/plugins/jwt/index.mjs +214 -0
- package/dist/plugins/jwt/schema.d.mts +33 -0
- package/dist/plugins/jwt/schema.mjs +29 -0
- package/dist/plugins/jwt/sign.d.mts +128 -0
- package/dist/plugins/jwt/sign.mjs +130 -0
- package/dist/plugins/jwt/types.d.mts +256 -0
- package/dist/plugins/jwt/utils.d.mts +41 -0
- package/dist/plugins/jwt/utils.mjs +64 -0
- package/dist/plugins/jwt/verify.d.mts +11 -0
- package/dist/plugins/jwt/verify.mjs +45 -0
- package/dist/plugins/last-login-method/client.d.mts +48 -0
- package/dist/plugins/last-login-method/client.mjs +48 -0
- package/dist/plugins/last-login-method/index.d.mts +127 -0
- package/dist/plugins/last-login-method/index.mjs +98 -0
- package/dist/plugins/magic-link/client.d.mts +10 -0
- package/dist/plugins/magic-link/client.mjs +11 -0
- package/dist/plugins/magic-link/index.d.mts +213 -0
- package/dist/plugins/magic-link/index.mjs +208 -0
- package/dist/plugins/magic-link/utils.mjs +9 -0
- package/dist/plugins/multi-session/client.d.mts +19 -0
- package/dist/plugins/multi-session/client.mjs +19 -0
- package/dist/plugins/multi-session/error-codes.d.mts +8 -0
- package/dist/plugins/multi-session/error-codes.mjs +5 -0
- package/dist/plugins/multi-session/index.d.mts +212 -0
- package/dist/plugins/multi-session/index.mjs +217 -0
- package/dist/plugins/oauth-popup/client.d.mts +82 -0
- package/dist/plugins/oauth-popup/client.mjs +203 -0
- package/dist/plugins/oauth-popup/constants.d.mts +11 -0
- package/dist/plugins/oauth-popup/constants.mjs +11 -0
- package/dist/plugins/oauth-popup/error-codes.d.mts +11 -0
- package/dist/plugins/oauth-popup/error-codes.mjs +10 -0
- package/dist/plugins/oauth-popup/index.d.mts +67 -0
- package/dist/plugins/oauth-popup/index.mjs +232 -0
- package/dist/plugins/oauth-popup/types.d.mts +30 -0
- package/dist/plugins/oauth-proxy/index.d.mts +130 -0
- package/dist/plugins/oauth-proxy/index.mjs +407 -0
- package/dist/plugins/oauth-proxy/utils.mjs +55 -0
- package/dist/plugins/one-tap/client.d.mts +174 -0
- package/dist/plugins/one-tap/client.mjs +208 -0
- package/dist/plugins/one-tap/index.d.mts +82 -0
- package/dist/plugins/one-tap/index.mjs +100 -0
- package/dist/plugins/one-time-token/client.d.mts +10 -0
- package/dist/plugins/one-time-token/client.mjs +11 -0
- package/dist/plugins/one-time-token/index.d.mts +132 -0
- package/dist/plugins/one-time-token/index.mjs +107 -0
- package/dist/plugins/one-time-token/utils.mjs +9 -0
- package/dist/plugins/open-api/generator.d.mts +126 -0
- package/dist/plugins/open-api/generator.mjs +557 -0
- package/dist/plugins/open-api/index.d.mts +97 -0
- package/dist/plugins/open-api/index.mjs +65 -0
- package/dist/plugins/open-api/logo.mjs +13 -0
- package/dist/plugins/organization/access/index.d.mts +2 -0
- package/dist/plugins/organization/access/index.mjs +2 -0
- package/dist/plugins/organization/access/statement.d.mts +113 -0
- package/dist/plugins/organization/access/statement.mjs +77 -0
- package/dist/plugins/organization/adapter.d.mts +815 -0
- package/dist/plugins/organization/adapter.mjs +813 -0
- package/dist/plugins/organization/call.mjs +15 -0
- package/dist/plugins/organization/client.d.mts +375 -0
- package/dist/plugins/organization/client.mjs +104 -0
- package/dist/plugins/organization/error-codes.d.mts +66 -0
- package/dist/plugins/organization/error-codes.mjs +65 -0
- package/dist/plugins/organization/has-permission.d.mts +17 -0
- package/dist/plugins/organization/has-permission.mjs +34 -0
- package/dist/plugins/organization/index.d.mts +6 -0
- package/dist/plugins/organization/index.mjs +4 -0
- package/dist/plugins/organization/organization.d.mts +420 -0
- package/dist/plugins/organization/organization.mjs +886 -0
- package/dist/plugins/organization/permission.d.mts +15 -0
- package/dist/plugins/organization/permission.mjs +14 -0
- package/dist/plugins/organization/routes/crud-access-control.d.mts +511 -0
- package/dist/plugins/organization/routes/crud-access-control.mjs +674 -0
- package/dist/plugins/organization/routes/crud-invites.d.mts +1154 -0
- package/dist/plugins/organization/routes/crud-invites.mjs +602 -0
- package/dist/plugins/organization/routes/crud-members.d.mts +1057 -0
- package/dist/plugins/organization/routes/crud-members.mjs +518 -0
- package/dist/plugins/organization/routes/crud-org.d.mts +918 -0
- package/dist/plugins/organization/routes/crud-org.mjs +455 -0
- package/dist/plugins/organization/routes/crud-team.d.mts +1238 -0
- package/dist/plugins/organization/routes/crud-team.mjs +766 -0
- package/dist/plugins/organization/schema.d.mts +390 -0
- package/dist/plugins/organization/schema.mjs +65 -0
- package/dist/plugins/organization/types.d.mts +691 -0
- package/dist/plugins/phone-number/client.d.mts +31 -0
- package/dist/plugins/phone-number/client.mjs +19 -0
- package/dist/plugins/phone-number/error-codes.d.mts +19 -0
- package/dist/plugins/phone-number/error-codes.mjs +18 -0
- package/dist/plugins/phone-number/index.d.mts +360 -0
- package/dist/plugins/phone-number/index.mjs +57 -0
- package/dist/plugins/phone-number/routes.mjs +529 -0
- package/dist/plugins/phone-number/schema.d.mts +22 -0
- package/dist/plugins/phone-number/schema.mjs +18 -0
- package/dist/plugins/phone-number/types.d.mts +116 -0
- package/dist/plugins/siwe/client.d.mts +14 -0
- package/dist/plugins/siwe/client.mjs +15 -0
- package/dist/plugins/siwe/index.d.mts +62 -0
- package/dist/plugins/siwe/index.mjs +272 -0
- package/dist/plugins/siwe/parse-message.mjs +60 -0
- package/dist/plugins/siwe/schema.d.mts +35 -0
- package/dist/plugins/siwe/schema.mjs +30 -0
- package/dist/plugins/siwe/types.d.mts +43 -0
- package/dist/plugins/test-utils/auth-helpers.mjs +33 -0
- package/dist/plugins/test-utils/cookie-builder.mjs +55 -0
- package/dist/plugins/test-utils/db-helpers.mjs +65 -0
- package/dist/plugins/test-utils/factories.mjs +38 -0
- package/dist/plugins/test-utils/index.d.mts +73 -0
- package/dist/plugins/test-utils/index.mjs +97 -0
- package/dist/plugins/test-utils/otp-sink.mjs +21 -0
- package/dist/plugins/test-utils/types.d.mts +51 -0
- package/dist/plugins/two-factor/backup-codes/index.d.mts +291 -0
- package/dist/plugins/two-factor/backup-codes/index.mjs +341 -0
- package/dist/plugins/two-factor/client.d.mts +76 -0
- package/dist/plugins/two-factor/client.mjs +41 -0
- package/dist/plugins/two-factor/constant.mjs +6 -0
- package/dist/plugins/two-factor/error-code.d.mts +20 -0
- package/dist/plugins/two-factor/error-code.mjs +19 -0
- package/dist/plugins/two-factor/index.d.mts +720 -0
- package/dist/plugins/two-factor/index.mjs +349 -0
- package/dist/plugins/two-factor/otp/index.d.mts +216 -0
- package/dist/plugins/two-factor/otp/index.mjs +252 -0
- package/dist/plugins/two-factor/schema.d.mts +59 -0
- package/dist/plugins/two-factor/schema.mjs +53 -0
- package/dist/plugins/two-factor/totp/index.d.mts +219 -0
- package/dist/plugins/two-factor/totp/index.mjs +230 -0
- package/dist/plugins/two-factor/types.d.mts +111 -0
- package/dist/plugins/two-factor/utils.mjs +9 -0
- package/dist/plugins/two-factor/verify-two-factor.mjs +205 -0
- package/dist/plugins/username/client.d.mts +38 -0
- package/dist/plugins/username/client.mjs +17 -0
- package/dist/plugins/username/error-codes.d.mts +16 -0
- package/dist/plugins/username/error-codes.mjs +15 -0
- package/dist/plugins/username/index.d.mts +326 -0
- package/dist/plugins/username/index.mjs +312 -0
- package/dist/plugins/username/schema.d.mts +50 -0
- package/dist/plugins/username/schema.mjs +25 -0
- package/dist/social-providers/index.d.mts +1 -0
- package/dist/social-providers/index.mjs +2 -0
- package/dist/state.d.mts +48 -0
- package/dist/state.mjs +149 -0
- package/dist/test-utils/headers.d.mts +8 -0
- package/dist/test-utils/headers.mjs +17 -0
- package/dist/test-utils/http-test-instance.d.mts +413 -0
- package/dist/test-utils/http-test-instance.mjs +107 -0
- package/dist/test-utils/index.d.mts +4 -0
- package/dist/test-utils/index.mjs +4 -0
- package/dist/test-utils/test-instance.d.mts +56 -0
- package/dist/test-utils/test-instance.mjs +242 -0
- package/dist/types/adapter.d.mts +2 -0
- package/dist/types/api.d.mts +28 -0
- package/dist/types/auth.d.mts +32 -0
- package/dist/types/helper.d.mts +26 -0
- package/dist/types/index.d.mts +10 -0
- package/dist/types/index.mjs +1 -0
- package/dist/types/models.d.mts +10 -0
- package/dist/types/plugins.d.mts +19 -0
- package/dist/utils/boolean.mjs +6 -0
- package/dist/utils/constants.mjs +4 -0
- package/dist/utils/date.mjs +6 -0
- package/dist/utils/hashing.mjs +18 -0
- package/dist/utils/hide-metadata.d.mts +6 -0
- package/dist/utils/hide-metadata.mjs +4 -0
- package/dist/utils/index.d.mts +4 -0
- package/dist/utils/is-api-error.d.mts +2 -0
- package/dist/utils/is-api-error.mjs +2 -0
- package/dist/utils/is-atom.mjs +6 -0
- package/dist/utils/is-promise.mjs +6 -0
- package/dist/utils/middleware-response.mjs +7 -0
- package/dist/utils/password.mjs +32 -0
- package/dist/utils/plugin-helper.mjs +14 -0
- package/dist/utils/request.mjs +23 -0
- package/dist/utils/shim.mjs +22 -0
- package/dist/utils/time.d.mts +48 -0
- package/dist/utils/time.mjs +98 -0
- package/dist/utils/url.d.mts +78 -0
- package/dist/utils/url.mjs +238 -0
- package/dist/utils/validate-user-info.mjs +44 -0
- package/dist/utils/wildcard.mjs +106 -0
- package/dist/version.mjs +5 -0
- package/package.json +595 -3
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
import { db_exports } from "../../db/index.mjs";
|
|
2
|
+
import { getEndpoints } from "../../api/index.mjs";
|
|
3
|
+
import * as z from "zod";
|
|
4
|
+
//#region src/plugins/open-api/generator.ts
|
|
5
|
+
const OPEN_API_SCHEMA_TYPES = new Set([
|
|
6
|
+
"string",
|
|
7
|
+
"number",
|
|
8
|
+
"boolean",
|
|
9
|
+
"array",
|
|
10
|
+
"object"
|
|
11
|
+
]);
|
|
12
|
+
function getOpenApiTypeFromZodType(zodType) {
|
|
13
|
+
if (zodType instanceof z.ZodDefault || zodType instanceof z.ZodPrefault) return getOpenApiTypeFromZodType(unwrapZodSchema(zodType));
|
|
14
|
+
const type = zodType.type;
|
|
15
|
+
return OPEN_API_SCHEMA_TYPES.has(type) ? type : "string";
|
|
16
|
+
}
|
|
17
|
+
function getFieldSchema(field) {
|
|
18
|
+
const arrayMatch = typeof field.type === "string" ? /^(string|number)\[\]$/.exec(field.type) : null;
|
|
19
|
+
const schema = arrayMatch ? {
|
|
20
|
+
type: "array",
|
|
21
|
+
items: { type: arrayMatch[1] }
|
|
22
|
+
} : {
|
|
23
|
+
type: field.type === "date" ? "string" : field.type,
|
|
24
|
+
...field.type === "date" && { format: "date-time" }
|
|
25
|
+
};
|
|
26
|
+
if (field.defaultValue !== void 0) {
|
|
27
|
+
if (typeof field.defaultValue !== "function") schema.default = field.defaultValue;
|
|
28
|
+
}
|
|
29
|
+
if (field.input === false) schema.readOnly = true;
|
|
30
|
+
return schema;
|
|
31
|
+
}
|
|
32
|
+
function asZodSchema(schema) {
|
|
33
|
+
return schema;
|
|
34
|
+
}
|
|
35
|
+
function unwrapZodSchema(zodType) {
|
|
36
|
+
return asZodSchema(zodType.unwrap());
|
|
37
|
+
}
|
|
38
|
+
function getZodDef(zodType) {
|
|
39
|
+
return zodType._def;
|
|
40
|
+
}
|
|
41
|
+
function getZodDescription(zodType) {
|
|
42
|
+
return zodType.description;
|
|
43
|
+
}
|
|
44
|
+
function withDescription(schema, zodType) {
|
|
45
|
+
const description = getZodDescription(zodType);
|
|
46
|
+
return description ? {
|
|
47
|
+
...schema,
|
|
48
|
+
description
|
|
49
|
+
} : schema;
|
|
50
|
+
}
|
|
51
|
+
function addNullType(schema) {
|
|
52
|
+
if (schema.type) {
|
|
53
|
+
const type = Array.isArray(schema.type) ? schema.type : [schema.type];
|
|
54
|
+
const nullableType = Array.from(new Set([...type, "null"]));
|
|
55
|
+
return {
|
|
56
|
+
...schema,
|
|
57
|
+
type: nullableType
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
return { anyOf: [schema, { type: "null" }] };
|
|
61
|
+
}
|
|
62
|
+
function getZodStringSchemaConstraints(zodType) {
|
|
63
|
+
const minLength = zodType.minLength;
|
|
64
|
+
const maxLength = zodType.maxLength;
|
|
65
|
+
return {
|
|
66
|
+
...typeof minLength === "number" ? { minLength } : {},
|
|
67
|
+
...typeof maxLength === "number" ? { maxLength } : {}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function getZodPipeSchema(zodType) {
|
|
71
|
+
const def = getZodDef(zodType);
|
|
72
|
+
return def.in instanceof z.ZodTransform && def.out instanceof z.ZodType ? def.out : def.in;
|
|
73
|
+
}
|
|
74
|
+
function getParameters(options) {
|
|
75
|
+
const parameters = [];
|
|
76
|
+
if (options.metadata?.openapi?.parameters) parameters.push(...options.metadata.openapi.parameters);
|
|
77
|
+
if (!options.metadata?.openapi?.parameters && options.query instanceof z.ZodObject) Object.entries(options.query.shape).forEach(([key, value]) => {
|
|
78
|
+
if (value instanceof z.ZodType) {
|
|
79
|
+
const parameterSchema = toOpenApiSchema(value);
|
|
80
|
+
parameters.push({
|
|
81
|
+
name: key,
|
|
82
|
+
in: "query",
|
|
83
|
+
schema: parameterSchema
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
return parameters;
|
|
88
|
+
}
|
|
89
|
+
function getPathParameters(path, parameters) {
|
|
90
|
+
const existingParameters = new Set(parameters.map((parameter) => `${parameter.in}:${parameter.name}`));
|
|
91
|
+
return path.split("/").filter((part) => part.startsWith(":")).map((part) => part.slice(1)).filter((name) => !existingParameters.has(`path:${name}`)).map((name) => ({
|
|
92
|
+
name,
|
|
93
|
+
in: "path",
|
|
94
|
+
required: true,
|
|
95
|
+
schema: { type: "string" }
|
|
96
|
+
}));
|
|
97
|
+
}
|
|
98
|
+
function getRequestBodySchemaInfo(zodType) {
|
|
99
|
+
return {
|
|
100
|
+
required: !schemaAcceptsUndefined(zodType),
|
|
101
|
+
schema: zodType
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function schemaAcceptsUndefined(zodType) {
|
|
105
|
+
if (zodType instanceof z.ZodOptional || zodType instanceof z.ZodDefault || zodType instanceof z.ZodPrefault || zodType instanceof z.ZodCatch || zodType instanceof z.ZodAny || zodType instanceof z.ZodUnknown || zodType instanceof z.ZodUndefined || zodType instanceof z.ZodVoid) return true;
|
|
106
|
+
if (zodType instanceof z.ZodNonOptional) return false;
|
|
107
|
+
if (zodType instanceof z.ZodNullable || zodType instanceof z.ZodReadonly) return schemaAcceptsUndefined(unwrapZodSchema(zodType));
|
|
108
|
+
if (zodType instanceof z.ZodPipe) return schemaAcceptsUndefined(getZodPipeSchema(zodType));
|
|
109
|
+
if (zodType instanceof z.ZodUnion) return getZodDef(zodType).options.some((option) => schemaAcceptsUndefined(option));
|
|
110
|
+
if (zodType instanceof z.ZodIntersection) {
|
|
111
|
+
const def = getZodDef(zodType);
|
|
112
|
+
return schemaAcceptsUndefined(def.left) && schemaAcceptsUndefined(def.right);
|
|
113
|
+
}
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Resolve input optionality exactly as Zod's JSON Schema emitter does.
|
|
118
|
+
*
|
|
119
|
+
* @see https://github.com/colinhacks/zod/blob/v4.5.4/packages/zod/src/v4/core/json-schema-processors.ts#L294-L308
|
|
120
|
+
*/
|
|
121
|
+
function getZodInputOptionality(zodType) {
|
|
122
|
+
const def = zodType._zod.def;
|
|
123
|
+
if (def.type === "pipe") {
|
|
124
|
+
const pipeDef = def;
|
|
125
|
+
if (pipeDef.in._zod.traits.has("$ZodTransform")) return getZodInputOptionality(pipeDef.out);
|
|
126
|
+
}
|
|
127
|
+
if (def.type === "catch") return getZodInputOptionality(def.innerType);
|
|
128
|
+
return zodType._zod.optin;
|
|
129
|
+
}
|
|
130
|
+
function isUndefinedOnlySchema(zodType) {
|
|
131
|
+
return zodType instanceof z.ZodUndefined || zodType instanceof z.ZodVoid;
|
|
132
|
+
}
|
|
133
|
+
function isMergeableObjectSchema(schema) {
|
|
134
|
+
const type = schema?.type;
|
|
135
|
+
return !!schema && (type === "object" || Array.isArray(type) && type.includes("object")) && schema.$ref === void 0 && schema.allOf === void 0 && schema.anyOf === void 0;
|
|
136
|
+
}
|
|
137
|
+
function schemaAllowsNull(schema) {
|
|
138
|
+
const type = schema?.type;
|
|
139
|
+
return Array.isArray(type) && type.includes("null");
|
|
140
|
+
}
|
|
141
|
+
function areSchemasEqual(left, right) {
|
|
142
|
+
return JSON.stringify(left) === JSON.stringify(right);
|
|
143
|
+
}
|
|
144
|
+
function areSchemaMembersCompatible(left, right) {
|
|
145
|
+
if (left === void 0 || right === void 0) return true;
|
|
146
|
+
if (typeof left === "boolean" || typeof right === "boolean") return left === right;
|
|
147
|
+
return areSchemasEqual(left, right);
|
|
148
|
+
}
|
|
149
|
+
function mergeObjectSchemas(left, right, description) {
|
|
150
|
+
const properties = { ...left.properties || {} };
|
|
151
|
+
for (const [key, value] of Object.entries(right.properties || {})) {
|
|
152
|
+
if (properties[key] !== void 0 && !areSchemasEqual(properties[key], value)) return;
|
|
153
|
+
properties[key] = value;
|
|
154
|
+
}
|
|
155
|
+
const required = Array.from(new Set([...left.required || [], ...right.required || []]));
|
|
156
|
+
const leftAdditionalProperties = left.additionalProperties;
|
|
157
|
+
const rightAdditionalProperties = right.additionalProperties;
|
|
158
|
+
if (!areSchemaMembersCompatible(leftAdditionalProperties, rightAdditionalProperties)) return;
|
|
159
|
+
const leftPropertyNames = left.propertyNames;
|
|
160
|
+
const rightPropertyNames = right.propertyNames;
|
|
161
|
+
if (!areSchemaMembersCompatible(leftPropertyNames, rightPropertyNames)) return;
|
|
162
|
+
const additionalProperties = leftAdditionalProperties ?? rightAdditionalProperties;
|
|
163
|
+
const propertyNames = leftPropertyNames ?? rightPropertyNames;
|
|
164
|
+
return {
|
|
165
|
+
type: schemaAllowsNull(left) && schemaAllowsNull(right) ? ["object", "null"] : "object",
|
|
166
|
+
...Object.keys(properties).length > 0 ? { properties } : {},
|
|
167
|
+
...required.length > 0 ? { required } : {},
|
|
168
|
+
...additionalProperties !== void 0 ? { additionalProperties } : {},
|
|
169
|
+
...propertyNames !== void 0 ? { propertyNames } : {},
|
|
170
|
+
...description ?? left.description ?? right.description ? { description: description ?? left.description ?? right.description } : {}
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function getRequestBody(options) {
|
|
174
|
+
if (options.metadata?.openapi?.requestBody) return options.metadata.openapi.requestBody;
|
|
175
|
+
if (!options.body) return void 0;
|
|
176
|
+
const requestBodySchemaInfo = getRequestBodySchemaInfo(options.body);
|
|
177
|
+
const schema = toOpenApiSchema(requestBodySchemaInfo.schema);
|
|
178
|
+
return {
|
|
179
|
+
required: requestBodySchemaInfo.required,
|
|
180
|
+
content: { "application/json": { schema } }
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Paths that accept `user.additionalFields` and plugin user schema fields via
|
|
185
|
+
* `parseUserInput`. Their static OpenAPI request bodies need those fields merged in.
|
|
186
|
+
*/
|
|
187
|
+
const USER_INPUT_BODY_PATHS = new Set(["/sign-up/email", "/update-user"]);
|
|
188
|
+
function dbFieldToRequestBodyProperty(field) {
|
|
189
|
+
if (field.type === "date") return {
|
|
190
|
+
type: "string",
|
|
191
|
+
format: "date-time"
|
|
192
|
+
};
|
|
193
|
+
if (field.type === "json") return {};
|
|
194
|
+
if (field.type === "string[]") return {
|
|
195
|
+
type: "array",
|
|
196
|
+
items: { type: "string" }
|
|
197
|
+
};
|
|
198
|
+
if (field.type === "number[]") return {
|
|
199
|
+
type: "array",
|
|
200
|
+
items: { type: "number" }
|
|
201
|
+
};
|
|
202
|
+
if (Array.isArray(field.type)) return {
|
|
203
|
+
type: "string",
|
|
204
|
+
enum: field.type
|
|
205
|
+
};
|
|
206
|
+
const schema = { type: field.type };
|
|
207
|
+
if (field.defaultValue !== void 0 && typeof field.defaultValue !== "function") schema.default = field.defaultValue;
|
|
208
|
+
return schema;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Collect client-writable user fields from `user.additionalFields` and plugin
|
|
212
|
+
* schemas. Mirrors `getFields(..., "input")` used by `parseUserInput`.
|
|
213
|
+
*/
|
|
214
|
+
function getUserInputRequestBodyFields(options) {
|
|
215
|
+
let fields = { ...options.user?.additionalFields ?? {} };
|
|
216
|
+
for (const plugin of options.plugins || []) {
|
|
217
|
+
const pluginUserFields = plugin.schema?.user?.fields;
|
|
218
|
+
if (pluginUserFields) fields = {
|
|
219
|
+
...fields,
|
|
220
|
+
...pluginUserFields
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
const properties = {};
|
|
224
|
+
const required = [];
|
|
225
|
+
for (const [key, field] of Object.entries(fields)) {
|
|
226
|
+
if (!field || field.input === false) continue;
|
|
227
|
+
properties[key] = dbFieldToRequestBodyProperty(field);
|
|
228
|
+
if (field.required === true && field.defaultValue === void 0) required.push(key);
|
|
229
|
+
}
|
|
230
|
+
return {
|
|
231
|
+
properties,
|
|
232
|
+
required
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
function applyUserInputFieldsToRequestBody(path, requestBody, options) {
|
|
236
|
+
if (!USER_INPUT_BODY_PATHS.has(path)) return requestBody;
|
|
237
|
+
const { properties: inputProperties, required: inputRequired } = getUserInputRequestBodyFields(options);
|
|
238
|
+
if (Object.keys(inputProperties).length === 0) return requestBody;
|
|
239
|
+
const existingSchema = requestBody?.content?.["application/json"]?.schema;
|
|
240
|
+
const properties = { ...existingSchema?.properties ?? {} };
|
|
241
|
+
for (const [key, value] of Object.entries(inputProperties)) if (properties[key] === void 0) properties[key] = value;
|
|
242
|
+
const required = new Set(existingSchema?.required ?? []);
|
|
243
|
+
if (path === "/sign-up/email") {
|
|
244
|
+
for (const key of inputRequired) if (properties[key] !== void 0) required.add(key);
|
|
245
|
+
}
|
|
246
|
+
return {
|
|
247
|
+
...requestBody,
|
|
248
|
+
content: { "application/json": { schema: {
|
|
249
|
+
...existingSchema ?? {},
|
|
250
|
+
type: existingSchema?.type ?? "object",
|
|
251
|
+
properties,
|
|
252
|
+
...required.size > 0 ? { required: Array.from(required) } : {}
|
|
253
|
+
} } }
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
function toOpenApiSchema(zodType) {
|
|
257
|
+
if (zodType instanceof z.ZodOptional) return toOpenApiSchema(unwrapZodSchema(zodType));
|
|
258
|
+
if (zodType instanceof z.ZodNullable) return addNullType(toOpenApiSchema(unwrapZodSchema(zodType)));
|
|
259
|
+
if (zodType instanceof z.ZodDefault || zodType instanceof z.ZodPrefault || zodType instanceof z.ZodNonOptional) return toOpenApiSchema(unwrapZodSchema(zodType));
|
|
260
|
+
if (zodType instanceof z.ZodAny || zodType instanceof z.ZodUnknown) return withDescription({}, zodType);
|
|
261
|
+
if (zodType instanceof z.ZodObject) {
|
|
262
|
+
const shape = zodType.shape;
|
|
263
|
+
if (shape) {
|
|
264
|
+
const properties = {};
|
|
265
|
+
const required = [];
|
|
266
|
+
Object.entries(shape).forEach(([key, value]) => {
|
|
267
|
+
if (value instanceof z.ZodType) {
|
|
268
|
+
properties[key] = toOpenApiSchema(value);
|
|
269
|
+
if (getZodInputOptionality(value) === void 0) required.push(key);
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
return withDescription({
|
|
273
|
+
type: "object",
|
|
274
|
+
properties,
|
|
275
|
+
...required.length > 0 ? { required } : {}
|
|
276
|
+
}, zodType);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
if (zodType instanceof z.ZodRecord) {
|
|
280
|
+
const def = getZodDef(zodType);
|
|
281
|
+
return withDescription({
|
|
282
|
+
type: "object",
|
|
283
|
+
propertyNames: toOpenApiSchema(def.keyType),
|
|
284
|
+
additionalProperties: toOpenApiSchema(def.valueType)
|
|
285
|
+
}, zodType);
|
|
286
|
+
}
|
|
287
|
+
if (zodType instanceof z.ZodIntersection) {
|
|
288
|
+
const def = getZodDef(zodType);
|
|
289
|
+
const leftSchema = toOpenApiSchema(def.left);
|
|
290
|
+
const rightSchema = toOpenApiSchema(def.right);
|
|
291
|
+
if (isMergeableObjectSchema(leftSchema) && isMergeableObjectSchema(rightSchema)) {
|
|
292
|
+
const mergedSchema = mergeObjectSchemas(leftSchema, rightSchema, getZodDescription(zodType));
|
|
293
|
+
if (mergedSchema) return mergedSchema;
|
|
294
|
+
}
|
|
295
|
+
return withDescription({ allOf: [leftSchema, rightSchema] }, zodType);
|
|
296
|
+
}
|
|
297
|
+
if (zodType instanceof z.ZodUnion) {
|
|
298
|
+
const def = getZodDef(zodType);
|
|
299
|
+
const schemas = def.options.filter((option) => !isUndefinedOnlySchema(option)).map((option) => toOpenApiSchema(option));
|
|
300
|
+
if (schemas.length === 0) return withDescription({}, zodType);
|
|
301
|
+
if (schemas.length === 1) {
|
|
302
|
+
const schema = schemas[0];
|
|
303
|
+
if (!schema) return withDescription({}, zodType);
|
|
304
|
+
return withDescription(schema, zodType);
|
|
305
|
+
}
|
|
306
|
+
return withDescription(def.inclusive === false ? { oneOf: schemas } : { anyOf: schemas }, zodType);
|
|
307
|
+
}
|
|
308
|
+
if (zodType instanceof z.ZodArray) return withDescription({
|
|
309
|
+
type: "array",
|
|
310
|
+
items: toOpenApiSchema(getZodDef(zodType).element)
|
|
311
|
+
}, zodType);
|
|
312
|
+
if (zodType instanceof z.ZodLiteral) return withDescription({ enum: Array.from(zodType.values) }, zodType);
|
|
313
|
+
if (zodType instanceof z.ZodEnum) return withDescription({
|
|
314
|
+
type: "string",
|
|
315
|
+
enum: zodType.options
|
|
316
|
+
}, zodType);
|
|
317
|
+
if (zodType instanceof z.ZodPipe) return withDescription(toOpenApiSchema(getZodPipeSchema(zodType)), zodType);
|
|
318
|
+
if (zodType instanceof z.ZodCatch || zodType instanceof z.ZodReadonly) return withDescription(toOpenApiSchema(getZodDef(zodType).innerType), zodType);
|
|
319
|
+
if (zodType instanceof z.ZodNull) return withDescription({ type: "null" }, zodType);
|
|
320
|
+
if (zodType instanceof z.ZodUndefined) return withDescription({}, zodType);
|
|
321
|
+
if (zodType instanceof z.ZodVoid) return withDescription({}, zodType);
|
|
322
|
+
return withDescription({
|
|
323
|
+
type: getOpenApiTypeFromZodType(zodType),
|
|
324
|
+
...zodType instanceof z.ZodString ? getZodStringSchemaConstraints(zodType) : {}
|
|
325
|
+
}, zodType);
|
|
326
|
+
}
|
|
327
|
+
function getResponse(responses) {
|
|
328
|
+
return {
|
|
329
|
+
"400": {
|
|
330
|
+
content: { "application/json": { schema: {
|
|
331
|
+
type: "object",
|
|
332
|
+
properties: { message: { type: "string" } },
|
|
333
|
+
required: ["message"]
|
|
334
|
+
} } },
|
|
335
|
+
description: "Bad Request. Usually due to missing parameters, or invalid parameters."
|
|
336
|
+
},
|
|
337
|
+
"401": {
|
|
338
|
+
content: { "application/json": { schema: {
|
|
339
|
+
type: "object",
|
|
340
|
+
properties: { message: { type: "string" } },
|
|
341
|
+
required: ["message"]
|
|
342
|
+
} } },
|
|
343
|
+
description: "Unauthorized. Due to missing or invalid authentication."
|
|
344
|
+
},
|
|
345
|
+
"403": {
|
|
346
|
+
content: { "application/json": { schema: {
|
|
347
|
+
type: "object",
|
|
348
|
+
properties: { message: { type: "string" } }
|
|
349
|
+
} } },
|
|
350
|
+
description: "Forbidden. You do not have permission to access this resource or to perform this action."
|
|
351
|
+
},
|
|
352
|
+
"404": {
|
|
353
|
+
content: { "application/json": { schema: {
|
|
354
|
+
type: "object",
|
|
355
|
+
properties: { message: { type: "string" } }
|
|
356
|
+
} } },
|
|
357
|
+
description: "Not Found. The requested resource was not found."
|
|
358
|
+
},
|
|
359
|
+
"429": {
|
|
360
|
+
content: { "application/json": { schema: {
|
|
361
|
+
type: "object",
|
|
362
|
+
properties: { message: { type: "string" } }
|
|
363
|
+
} } },
|
|
364
|
+
description: "Too Many Requests. You have exceeded the rate limit. Try again later."
|
|
365
|
+
},
|
|
366
|
+
"500": {
|
|
367
|
+
content: { "application/json": { schema: {
|
|
368
|
+
type: "object",
|
|
369
|
+
properties: { message: { type: "string" } }
|
|
370
|
+
} } },
|
|
371
|
+
description: "Internal Server Error. This is a problem with the server that you cannot fix."
|
|
372
|
+
},
|
|
373
|
+
...responses ? structuredClone(responses) : {}
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
function toOpenApiPath(path) {
|
|
377
|
+
return path.split("/").map((part) => part.startsWith(":") ? `{${part.slice(1)}}` : part).join("/");
|
|
378
|
+
}
|
|
379
|
+
function getOperationId(operationId, method, usedOperationIds) {
|
|
380
|
+
if (!operationId) return;
|
|
381
|
+
if (!usedOperationIds.has(operationId)) {
|
|
382
|
+
usedOperationIds.add(operationId);
|
|
383
|
+
return operationId;
|
|
384
|
+
}
|
|
385
|
+
const normalizedMethod = method.toUpperCase();
|
|
386
|
+
const methodSuffix = normalizedMethod.charAt(0) + normalizedMethod.slice(1).toLowerCase();
|
|
387
|
+
let candidate = `${operationId}${methodSuffix}`;
|
|
388
|
+
let duplicateIndex = 2;
|
|
389
|
+
while (usedOperationIds.has(candidate)) {
|
|
390
|
+
candidate = `${operationId}${methodSuffix}${duplicateIndex}`;
|
|
391
|
+
duplicateIndex += 1;
|
|
392
|
+
}
|
|
393
|
+
usedOperationIds.add(candidate);
|
|
394
|
+
return candidate;
|
|
395
|
+
}
|
|
396
|
+
function cloneOpenAPIValue(value) {
|
|
397
|
+
if (Array.isArray(value)) return value.map((item) => cloneOpenAPIValue(item));
|
|
398
|
+
if (value instanceof Date) return new Date(value);
|
|
399
|
+
if (value && typeof value === "object") return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, cloneOpenAPIValue(entry)]));
|
|
400
|
+
return value;
|
|
401
|
+
}
|
|
402
|
+
async function generator(ctx, options) {
|
|
403
|
+
const baseEndpoints = getEndpoints(ctx, {
|
|
404
|
+
...options,
|
|
405
|
+
plugins: []
|
|
406
|
+
});
|
|
407
|
+
const tables = (0, db_exports.getAuthTables)({
|
|
408
|
+
...options,
|
|
409
|
+
session: {
|
|
410
|
+
...options.session,
|
|
411
|
+
storeSessionInDatabase: true
|
|
412
|
+
}
|
|
413
|
+
});
|
|
414
|
+
const components = { schemas: { ...Object.entries(tables).reduce((acc, [key, value]) => {
|
|
415
|
+
const modelName = key.charAt(0).toUpperCase() + key.slice(1);
|
|
416
|
+
const fields = value.fields;
|
|
417
|
+
const required = new Set(["id"]);
|
|
418
|
+
const properties = { id: {
|
|
419
|
+
type: "string",
|
|
420
|
+
readOnly: true
|
|
421
|
+
} };
|
|
422
|
+
Object.entries(fields).forEach(([fieldKey, fieldValue]) => {
|
|
423
|
+
if (!fieldValue) return;
|
|
424
|
+
properties[fieldKey] = getFieldSchema(fieldValue);
|
|
425
|
+
if (fieldValue.required && fieldValue.returned !== false) required.add(fieldKey);
|
|
426
|
+
});
|
|
427
|
+
Object.entries(properties).forEach(([key, prop]) => {
|
|
428
|
+
const field = value.fields[key];
|
|
429
|
+
if (field && field.type === "date" && prop.type === "string") prop.format = "date-time";
|
|
430
|
+
});
|
|
431
|
+
acc[modelName] = {
|
|
432
|
+
type: "object",
|
|
433
|
+
properties,
|
|
434
|
+
required: Array.from(required)
|
|
435
|
+
};
|
|
436
|
+
return acc;
|
|
437
|
+
}, {}) } };
|
|
438
|
+
const paths = {};
|
|
439
|
+
const usedOperationIds = /* @__PURE__ */ new Set();
|
|
440
|
+
Object.entries(baseEndpoints.api).forEach(([_, value]) => {
|
|
441
|
+
if (!value.path || ctx.options.disabledPaths?.includes(value.path)) return;
|
|
442
|
+
const options = value.options;
|
|
443
|
+
if (options.metadata?.SERVER_ONLY) return;
|
|
444
|
+
const path = toOpenApiPath(value.path);
|
|
445
|
+
const operationParameters = getParameters(options);
|
|
446
|
+
const parameters = [...operationParameters, ...getPathParameters(value.path, operationParameters)];
|
|
447
|
+
const methods = Array.isArray(options.method) ? options.method : [options.method];
|
|
448
|
+
for (const method of methods.filter((m) => m === "GET" || m === "DELETE")) paths[path] = {
|
|
449
|
+
...paths[path],
|
|
450
|
+
[method.toLowerCase()]: {
|
|
451
|
+
tags: ["Default", ...options.metadata?.openapi?.tags || []],
|
|
452
|
+
description: options.metadata?.openapi?.description,
|
|
453
|
+
operationId: getOperationId(options.metadata?.openapi?.operationId, method, usedOperationIds),
|
|
454
|
+
security: [{ bearerAuth: [] }],
|
|
455
|
+
parameters: cloneOpenAPIValue(parameters),
|
|
456
|
+
responses: cloneOpenAPIValue(getResponse(options.metadata?.openapi?.responses))
|
|
457
|
+
}
|
|
458
|
+
};
|
|
459
|
+
for (const method of methods.filter((m) => m === "POST" || m === "PATCH" || m === "PUT")) {
|
|
460
|
+
const body = applyUserInputFieldsToRequestBody(value.path, getRequestBody(options), ctx.options);
|
|
461
|
+
paths[path] = {
|
|
462
|
+
...paths[path],
|
|
463
|
+
[method.toLowerCase()]: {
|
|
464
|
+
tags: ["Default", ...options.metadata?.openapi?.tags || []],
|
|
465
|
+
description: options.metadata?.openapi?.description,
|
|
466
|
+
operationId: getOperationId(options.metadata?.openapi?.operationId, method, usedOperationIds),
|
|
467
|
+
security: [{ bearerAuth: [] }],
|
|
468
|
+
parameters: cloneOpenAPIValue(parameters),
|
|
469
|
+
...body ? { requestBody: cloneOpenAPIValue(body) } : { requestBody: { content: { "application/json": { schema: {
|
|
470
|
+
type: "object",
|
|
471
|
+
properties: {}
|
|
472
|
+
} } } } },
|
|
473
|
+
responses: cloneOpenAPIValue(getResponse(options.metadata?.openapi?.responses))
|
|
474
|
+
}
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
});
|
|
478
|
+
for (const plugin of options.plugins || []) {
|
|
479
|
+
if (plugin.id === "open-api") continue;
|
|
480
|
+
const pluginEndpoints = getEndpoints(ctx, {
|
|
481
|
+
...options,
|
|
482
|
+
plugins: [plugin]
|
|
483
|
+
});
|
|
484
|
+
const api = Object.keys(pluginEndpoints.api).map((key) => {
|
|
485
|
+
if (baseEndpoints.api[key] === void 0) return pluginEndpoints.api[key];
|
|
486
|
+
return null;
|
|
487
|
+
}).filter((x) => x !== null);
|
|
488
|
+
Object.entries(api).forEach(([key, value]) => {
|
|
489
|
+
if (!value.path || ctx.options.disabledPaths?.includes(value.path)) return;
|
|
490
|
+
const options = value.options;
|
|
491
|
+
if (options.metadata?.SERVER_ONLY) return;
|
|
492
|
+
const path = toOpenApiPath(value.path);
|
|
493
|
+
const operationParameters = getParameters(options);
|
|
494
|
+
const parameters = [...operationParameters, ...getPathParameters(value.path, operationParameters)];
|
|
495
|
+
const methods = Array.isArray(options.method) ? options.method : [options.method];
|
|
496
|
+
for (const method of methods.filter((m) => m === "GET" || m === "DELETE")) paths[path] = {
|
|
497
|
+
...paths[path],
|
|
498
|
+
[method.toLowerCase()]: {
|
|
499
|
+
tags: options.metadata?.openapi?.tags || [plugin.id.charAt(0).toUpperCase() + plugin.id.slice(1)],
|
|
500
|
+
description: options.metadata?.openapi?.description,
|
|
501
|
+
operationId: getOperationId(options.metadata?.openapi?.operationId, method, usedOperationIds),
|
|
502
|
+
security: [{ bearerAuth: [] }],
|
|
503
|
+
parameters: cloneOpenAPIValue(parameters),
|
|
504
|
+
responses: cloneOpenAPIValue(getResponse(options.metadata?.openapi?.responses))
|
|
505
|
+
}
|
|
506
|
+
};
|
|
507
|
+
for (const method of methods.filter((m) => m === "POST" || m === "PATCH" || m === "PUT")) paths[path] = {
|
|
508
|
+
...paths[path],
|
|
509
|
+
[method.toLowerCase()]: {
|
|
510
|
+
tags: options.metadata?.openapi?.tags || [plugin.id.charAt(0).toUpperCase() + plugin.id.slice(1)],
|
|
511
|
+
description: options.metadata?.openapi?.description,
|
|
512
|
+
operationId: getOperationId(options.metadata?.openapi?.operationId, method, usedOperationIds),
|
|
513
|
+
security: [{ bearerAuth: [] }],
|
|
514
|
+
parameters: cloneOpenAPIValue(parameters),
|
|
515
|
+
requestBody: cloneOpenAPIValue(getRequestBody(options)),
|
|
516
|
+
responses: cloneOpenAPIValue(getResponse(options.metadata?.openapi?.responses))
|
|
517
|
+
}
|
|
518
|
+
};
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
return {
|
|
522
|
+
openapi: "3.1.1",
|
|
523
|
+
info: {
|
|
524
|
+
title: "Better Auth",
|
|
525
|
+
description: "API Reference for your Better Auth Instance",
|
|
526
|
+
version: "1.1.0"
|
|
527
|
+
},
|
|
528
|
+
components: {
|
|
529
|
+
...components,
|
|
530
|
+
securitySchemes: {
|
|
531
|
+
apiKeyCookie: {
|
|
532
|
+
type: "apiKey",
|
|
533
|
+
in: "cookie",
|
|
534
|
+
name: "apiKeyCookie",
|
|
535
|
+
description: "API Key authentication via cookie"
|
|
536
|
+
},
|
|
537
|
+
bearerAuth: {
|
|
538
|
+
type: "http",
|
|
539
|
+
scheme: "bearer",
|
|
540
|
+
description: "Bearer token authentication"
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
},
|
|
544
|
+
security: [{
|
|
545
|
+
apiKeyCookie: [],
|
|
546
|
+
bearerAuth: []
|
|
547
|
+
}],
|
|
548
|
+
servers: [{ url: ctx.baseURL }],
|
|
549
|
+
tags: [{
|
|
550
|
+
name: "Default",
|
|
551
|
+
description: "Default endpoints that are included with Better Auth by default. These endpoints are not part of any plugin."
|
|
552
|
+
}],
|
|
553
|
+
paths
|
|
554
|
+
};
|
|
555
|
+
}
|
|
556
|
+
//#endregion
|
|
557
|
+
export { generator };
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { FieldSchema, OpenAPIModelSchema, OpenAPIParameter, OpenAPISchema, Path, generator } from "./generator.mjs";
|
|
2
|
+
import { LiteralString } from "@better-auth/core";
|
|
3
|
+
import * as _$better_call0 from "better-call";
|
|
4
|
+
|
|
5
|
+
//#region src/plugins/open-api/index.d.ts
|
|
6
|
+
declare module "@better-auth/core" {
|
|
7
|
+
interface BetterAuthPluginRegistry<AuthOptions, Options> {
|
|
8
|
+
"open-api": {
|
|
9
|
+
creator: typeof openAPI;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
type ScalarTheme = "alternate" | "default" | "moon" | "purple" | "solarized" | "bluePlanet" | "saturn" | "kepler" | "mars" | "deepSpace" | "laserwave" | "none";
|
|
14
|
+
interface OpenAPIOptions {
|
|
15
|
+
/**
|
|
16
|
+
* The path to the OpenAPI reference page
|
|
17
|
+
*
|
|
18
|
+
* keep in mind that this path will be appended to the base URL `/api/auth` path
|
|
19
|
+
* by default, so if you set this to `/reference`, the full path will be `/api/auth/reference`
|
|
20
|
+
*
|
|
21
|
+
* @default "/reference"
|
|
22
|
+
*/
|
|
23
|
+
path?: LiteralString | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Disable the default reference page that is generated by Scalar
|
|
26
|
+
*
|
|
27
|
+
* @default false
|
|
28
|
+
*/
|
|
29
|
+
disableDefaultReference?: boolean | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Theme of the OpenAPI reference page.
|
|
32
|
+
*
|
|
33
|
+
* @default "default"
|
|
34
|
+
*/
|
|
35
|
+
theme?: ScalarTheme | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* A 'nonce' string to be attached to inline scripts
|
|
38
|
+
* for Content Security Policy (CSP) compliance.
|
|
39
|
+
* @default undefined
|
|
40
|
+
*/
|
|
41
|
+
nonce?: string | undefined;
|
|
42
|
+
}
|
|
43
|
+
declare const openAPI: <O extends OpenAPIOptions>(options?: O | undefined) => {
|
|
44
|
+
id: "open-api";
|
|
45
|
+
version: string;
|
|
46
|
+
endpoints: {
|
|
47
|
+
generateOpenAPISchema: _$better_call0.StrictEndpoint<"/open-api/generate-schema", {
|
|
48
|
+
method: "GET";
|
|
49
|
+
}, {
|
|
50
|
+
openapi: string;
|
|
51
|
+
info: {
|
|
52
|
+
title: string;
|
|
53
|
+
description: string;
|
|
54
|
+
version: string;
|
|
55
|
+
};
|
|
56
|
+
components: {
|
|
57
|
+
securitySchemes: {
|
|
58
|
+
apiKeyCookie: {
|
|
59
|
+
type: string;
|
|
60
|
+
in: string;
|
|
61
|
+
name: string;
|
|
62
|
+
description: string;
|
|
63
|
+
};
|
|
64
|
+
bearerAuth: {
|
|
65
|
+
type: string;
|
|
66
|
+
scheme: string;
|
|
67
|
+
description: string;
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
schemas: {
|
|
71
|
+
[x: string]: OpenAPIModelSchema;
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
security: {
|
|
75
|
+
apiKeyCookie: never[];
|
|
76
|
+
bearerAuth: never[];
|
|
77
|
+
}[];
|
|
78
|
+
servers: {
|
|
79
|
+
url: string;
|
|
80
|
+
}[];
|
|
81
|
+
tags: {
|
|
82
|
+
name: string;
|
|
83
|
+
description: string;
|
|
84
|
+
}[];
|
|
85
|
+
paths: Record<string, Path>;
|
|
86
|
+
}>;
|
|
87
|
+
openAPIReference: _$better_call0.StrictEndpoint<LiteralString | "/reference", {
|
|
88
|
+
method: "GET";
|
|
89
|
+
metadata: {
|
|
90
|
+
readonly scope: "server";
|
|
91
|
+
};
|
|
92
|
+
}, Response>;
|
|
93
|
+
};
|
|
94
|
+
options: NoInfer<O>;
|
|
95
|
+
};
|
|
96
|
+
//#endregion
|
|
97
|
+
export { type FieldSchema, type OpenAPIModelSchema, OpenAPIOptions, OpenAPIParameter, OpenAPISchema, type Path, generator, openAPI };
|