@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,174 @@
|
|
|
1
|
+
import { BetterAuthClientOptions, ClientFetchOption, ClientStore } from "@better-auth/core";
|
|
2
|
+
import * as _$_better_fetch_fetch0 from "@better-fetch/fetch";
|
|
3
|
+
import { BetterFetch } from "@better-fetch/fetch";
|
|
4
|
+
|
|
5
|
+
//#region src/plugins/one-tap/client.d.ts
|
|
6
|
+
declare global {
|
|
7
|
+
interface Window {
|
|
8
|
+
googleScriptInitialized?: boolean | undefined;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
interface GsiButtonConfiguration {
|
|
12
|
+
/**
|
|
13
|
+
* The button type: icon, or standard button.
|
|
14
|
+
*/
|
|
15
|
+
type: "standard" | "icon";
|
|
16
|
+
/**
|
|
17
|
+
* The button theme. For example, filled_blue or filled_black.
|
|
18
|
+
* outline A standard button theme:
|
|
19
|
+
* filled_blue A blue-filled button theme:
|
|
20
|
+
* filled_black A black-filled button theme:
|
|
21
|
+
*/
|
|
22
|
+
theme?: "outline" | "filled_blue" | "filled_black";
|
|
23
|
+
/**
|
|
24
|
+
* The button size. For example, small or large.
|
|
25
|
+
*/
|
|
26
|
+
size?: "small" | "medium" | "large";
|
|
27
|
+
/**
|
|
28
|
+
* The button text. The default value is signin_with.
|
|
29
|
+
* There are no visual differences for the text of icon buttons that
|
|
30
|
+
* have different text attributes. The only exception is when the
|
|
31
|
+
* text is read for screen accessibility.
|
|
32
|
+
*
|
|
33
|
+
* signin_with The button text is “Sign in with Google”:
|
|
34
|
+
* signup_with The button text is “Sign up with Google”:
|
|
35
|
+
* continue_with The button text is “Continue with Google”:
|
|
36
|
+
* signup_with The button text is “Sign in”:
|
|
37
|
+
*/
|
|
38
|
+
text?: "signin_with" | "signup_with" | "continue_with" | "signin";
|
|
39
|
+
/**
|
|
40
|
+
* The button shape. The default value is rectangular.
|
|
41
|
+
*/
|
|
42
|
+
shape?: "rectangular" | "pill" | "circle" | "square";
|
|
43
|
+
/**
|
|
44
|
+
* The alignment of the Google logo. The default value is left.
|
|
45
|
+
* This attribute only applies to the standard button type.
|
|
46
|
+
*/
|
|
47
|
+
logo_alignment?: "left" | "center";
|
|
48
|
+
/**
|
|
49
|
+
* The minimum button width, in pixels. The maximum width is 400
|
|
50
|
+
* pixels.
|
|
51
|
+
*/
|
|
52
|
+
width?: number;
|
|
53
|
+
/**
|
|
54
|
+
* The pre-set locale of the button text. If it's not set, the
|
|
55
|
+
* browser's default locale or the Google session user’s preference
|
|
56
|
+
* is used.
|
|
57
|
+
*/
|
|
58
|
+
locale?: string;
|
|
59
|
+
/**
|
|
60
|
+
* You can define a JavaScript function to be called when the
|
|
61
|
+
* Sign in with Google button is clicked.
|
|
62
|
+
*/
|
|
63
|
+
click_listener?: () => void;
|
|
64
|
+
/**
|
|
65
|
+
* Optional, as multiple Sign in with Google buttons can be
|
|
66
|
+
* rendered on the same page, you can assign each button with a
|
|
67
|
+
* unique string. The same string would return along with the ID
|
|
68
|
+
* token, so you can identify which button user clicked to sign in.
|
|
69
|
+
*/
|
|
70
|
+
state?: string;
|
|
71
|
+
}
|
|
72
|
+
interface GoogleOneTapOptions {
|
|
73
|
+
/**
|
|
74
|
+
* Google client ID
|
|
75
|
+
*/
|
|
76
|
+
clientId: string;
|
|
77
|
+
/**
|
|
78
|
+
* Auto select the account if the user is already signed in
|
|
79
|
+
*/
|
|
80
|
+
autoSelect?: boolean | undefined;
|
|
81
|
+
/**
|
|
82
|
+
* Cancel the flow when the user taps outside the prompt
|
|
83
|
+
*
|
|
84
|
+
* Note: To use this option, disable `promptOptions.fedCM`
|
|
85
|
+
*/
|
|
86
|
+
cancelOnTapOutside?: boolean | undefined;
|
|
87
|
+
/**
|
|
88
|
+
* The mode to use for the Google One Tap flow
|
|
89
|
+
*
|
|
90
|
+
* popup: Use a popup window
|
|
91
|
+
* redirect: Redirect the user to the Google One Tap flow
|
|
92
|
+
*
|
|
93
|
+
* @default "popup"
|
|
94
|
+
*/
|
|
95
|
+
uxMode?: ("popup" | "redirect") | undefined;
|
|
96
|
+
/**
|
|
97
|
+
* The context to use for the Google One Tap flow.
|
|
98
|
+
*
|
|
99
|
+
* @see {@link https://developers.google.com/identity/gsi/web/reference/js-reference}
|
|
100
|
+
* @default "signin"
|
|
101
|
+
*/
|
|
102
|
+
context?: ("signin" | "signup" | "use") | undefined;
|
|
103
|
+
/**
|
|
104
|
+
* Additional configuration options to pass to the Google One Tap API.
|
|
105
|
+
*/
|
|
106
|
+
additionalOptions?: Record<string, any> | undefined;
|
|
107
|
+
/**
|
|
108
|
+
* Configuration options for the prompt and exponential backoff behavior.
|
|
109
|
+
*/
|
|
110
|
+
promptOptions?: {
|
|
111
|
+
/**
|
|
112
|
+
* Base delay (in milliseconds) for exponential backoff.
|
|
113
|
+
* @default 1000
|
|
114
|
+
*/
|
|
115
|
+
baseDelay?: number;
|
|
116
|
+
/**
|
|
117
|
+
* Maximum number of prompt attempts before calling onPromptNotification.
|
|
118
|
+
* @default 5
|
|
119
|
+
*/
|
|
120
|
+
maxAttempts?: number;
|
|
121
|
+
/**
|
|
122
|
+
* Whether to support FedCM (Federated Credential Management) support.
|
|
123
|
+
*
|
|
124
|
+
* @see {@link https://developer.chrome.com/docs/identity/fedcm/overview}
|
|
125
|
+
* @default true
|
|
126
|
+
*/
|
|
127
|
+
fedCM?: boolean | undefined;
|
|
128
|
+
} | undefined;
|
|
129
|
+
}
|
|
130
|
+
interface GoogleOneTapActionOptions extends Omit<GoogleOneTapOptions, "clientId" | "promptOptions"> {
|
|
131
|
+
fetchOptions?: ClientFetchOption | undefined;
|
|
132
|
+
/**
|
|
133
|
+
* Callback URL.
|
|
134
|
+
*/
|
|
135
|
+
callbackURL?: string | undefined;
|
|
136
|
+
/**
|
|
137
|
+
* Optional callback that receives the prompt notification if (or when) the prompt is dismissed or skipped.
|
|
138
|
+
* This lets you render an alternative UI (e.g. a Google Sign-In button) to restart the process.
|
|
139
|
+
*/
|
|
140
|
+
onPromptNotification?: ((notification?: any | undefined) => void) | undefined;
|
|
141
|
+
nonce?: string | undefined;
|
|
142
|
+
/**
|
|
143
|
+
* Button mode configuration. When provided, renders a "Sign In with Google" button
|
|
144
|
+
* instead of showing the One Tap prompt.
|
|
145
|
+
*/
|
|
146
|
+
button?: {
|
|
147
|
+
/**
|
|
148
|
+
* The HTML element or CSS selector where the button should be rendered.
|
|
149
|
+
* If a string is provided, it will be used as a CSS selector.
|
|
150
|
+
*/
|
|
151
|
+
container: HTMLElement | string;
|
|
152
|
+
/**
|
|
153
|
+
* Button configuration options
|
|
154
|
+
*/
|
|
155
|
+
config?: GsiButtonConfiguration | undefined;
|
|
156
|
+
} | undefined;
|
|
157
|
+
}
|
|
158
|
+
declare const oneTapClient: (options: GoogleOneTapOptions) => {
|
|
159
|
+
id: "one-tap";
|
|
160
|
+
version: string;
|
|
161
|
+
fetchPlugins: {
|
|
162
|
+
id: string;
|
|
163
|
+
name: string;
|
|
164
|
+
hooks: {
|
|
165
|
+
onResponse(ctx: _$_better_fetch_fetch0.ResponseContext): Promise<void>;
|
|
166
|
+
};
|
|
167
|
+
}[];
|
|
168
|
+
getActions: ($fetch: BetterFetch, _$store: ClientStore, _options: BetterAuthClientOptions | undefined) => {
|
|
169
|
+
oneTap: (opts?: GoogleOneTapActionOptions | undefined, fetchOptions?: ClientFetchOption | undefined) => Promise<void>;
|
|
170
|
+
};
|
|
171
|
+
getAtoms($fetch: BetterFetch): {};
|
|
172
|
+
};
|
|
173
|
+
//#endregion
|
|
174
|
+
export { GoogleOneTapActionOptions, GoogleOneTapOptions, GsiButtonConfiguration, oneTapClient };
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { PACKAGE_VERSION } from "../../version.mjs";
|
|
2
|
+
import { isSafeUrlScheme } from "@better-auth/core/utils/url";
|
|
3
|
+
//#region src/plugins/one-tap/client.ts
|
|
4
|
+
let isRequestInProgress = false;
|
|
5
|
+
function isFedCMSupported() {
|
|
6
|
+
return typeof window !== "undefined" && "IdentityCredential" in window;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Reasons that should NOT trigger a retry.
|
|
10
|
+
* @see https://developers.google.com/identity/gsi/web/reference/js-reference
|
|
11
|
+
*/
|
|
12
|
+
const noRetryReasons = {
|
|
13
|
+
dismissed: ["credential_returned", "cancel_called"],
|
|
14
|
+
skipped: ["user_cancel", "tap_outside"]
|
|
15
|
+
};
|
|
16
|
+
const oneTapClient = (options) => {
|
|
17
|
+
return {
|
|
18
|
+
id: "one-tap",
|
|
19
|
+
version: PACKAGE_VERSION,
|
|
20
|
+
fetchPlugins: [{
|
|
21
|
+
id: "fedcm-signout-handle",
|
|
22
|
+
name: "FedCM Sign-Out Handler",
|
|
23
|
+
hooks: { async onResponse(ctx) {
|
|
24
|
+
if (!ctx.request.url.toString().includes("/sign-out")) return;
|
|
25
|
+
if (options.promptOptions?.fedCM === false || !isFedCMSupported()) return;
|
|
26
|
+
navigator.credentials.preventSilentAccess();
|
|
27
|
+
} }
|
|
28
|
+
}],
|
|
29
|
+
getActions: ($fetch, _$store, _options) => {
|
|
30
|
+
return { oneTap: async (opts, fetchOptions) => {
|
|
31
|
+
if (isRequestInProgress) {
|
|
32
|
+
console.warn("A Google One Tap request is already in progress. Please wait.");
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (typeof window === "undefined" || !window.document) {
|
|
36
|
+
console.warn("Google One Tap is only available in browser environments");
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (opts?.button) {
|
|
40
|
+
await loadGoogleScript();
|
|
41
|
+
const container = typeof opts.button.container === "string" ? document.querySelector(opts.button.container) : opts.button.container;
|
|
42
|
+
if (!container) {
|
|
43
|
+
console.error("Google One Tap: Button container not found", opts.button.container);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
async function callback(idToken) {
|
|
47
|
+
if ((await $fetch("/one-tap/callback", {
|
|
48
|
+
method: "POST",
|
|
49
|
+
body: {
|
|
50
|
+
idToken,
|
|
51
|
+
callbackURL: opts?.callbackURL
|
|
52
|
+
},
|
|
53
|
+
...opts?.fetchOptions,
|
|
54
|
+
...fetchOptions
|
|
55
|
+
}))?.error) return;
|
|
56
|
+
if (!opts?.fetchOptions && !fetchOptions || opts?.callbackURL) {
|
|
57
|
+
const target = opts?.callbackURL ?? "/";
|
|
58
|
+
if (isSafeUrlScheme(target)) window.location.href = target;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const { autoSelect, cancelOnTapOutside, context } = opts ?? {};
|
|
62
|
+
const contextValue = context ?? options.context ?? "signin";
|
|
63
|
+
const useFedCM = options.promptOptions?.fedCM !== false;
|
|
64
|
+
window.google?.accounts.id.initialize({
|
|
65
|
+
client_id: options.clientId,
|
|
66
|
+
callback: async (response) => {
|
|
67
|
+
try {
|
|
68
|
+
await callback(response.credential);
|
|
69
|
+
} catch (error) {
|
|
70
|
+
console.error("Error during button callback:", error);
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
auto_select: autoSelect,
|
|
74
|
+
cancel_on_tap_outside: cancelOnTapOutside,
|
|
75
|
+
context: contextValue,
|
|
76
|
+
ux_mode: opts?.uxMode || "popup",
|
|
77
|
+
nonce: opts?.nonce,
|
|
78
|
+
itp_support: true,
|
|
79
|
+
use_fedcm_for_prompt: useFedCM,
|
|
80
|
+
...options.additionalOptions
|
|
81
|
+
});
|
|
82
|
+
window.google?.accounts.id.renderButton(container, opts.button.config ?? { type: "icon" });
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
async function callback(idToken) {
|
|
86
|
+
if ((await $fetch("/one-tap/callback", {
|
|
87
|
+
method: "POST",
|
|
88
|
+
body: {
|
|
89
|
+
idToken,
|
|
90
|
+
callbackURL: opts?.callbackURL
|
|
91
|
+
},
|
|
92
|
+
...opts?.fetchOptions,
|
|
93
|
+
...fetchOptions
|
|
94
|
+
}))?.error) return;
|
|
95
|
+
if (!opts?.fetchOptions && !fetchOptions || opts?.callbackURL) {
|
|
96
|
+
const target = opts?.callbackURL ?? "/";
|
|
97
|
+
if (isSafeUrlScheme(target)) window.location.href = target;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const { autoSelect, cancelOnTapOutside, context } = opts ?? {};
|
|
101
|
+
const contextValue = context ?? options.context ?? "signin";
|
|
102
|
+
isRequestInProgress = true;
|
|
103
|
+
try {
|
|
104
|
+
await loadGoogleScript();
|
|
105
|
+
await new Promise((resolve, reject) => {
|
|
106
|
+
let isResolved = false;
|
|
107
|
+
const baseDelay = options.promptOptions?.baseDelay ?? 1e3;
|
|
108
|
+
const maxAttempts = options.promptOptions?.maxAttempts ?? 5;
|
|
109
|
+
const useFedCM = options.promptOptions?.fedCM !== false;
|
|
110
|
+
window.google?.accounts.id.initialize({
|
|
111
|
+
client_id: options.clientId,
|
|
112
|
+
callback: async (response) => {
|
|
113
|
+
isResolved = true;
|
|
114
|
+
try {
|
|
115
|
+
await callback(response.credential);
|
|
116
|
+
resolve();
|
|
117
|
+
} catch (error) {
|
|
118
|
+
console.error("Error during One Tap callback:", error);
|
|
119
|
+
reject(error);
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
auto_select: autoSelect,
|
|
123
|
+
cancel_on_tap_outside: cancelOnTapOutside,
|
|
124
|
+
context: contextValue,
|
|
125
|
+
ux_mode: opts?.uxMode || "popup",
|
|
126
|
+
nonce: opts?.nonce,
|
|
127
|
+
/**
|
|
128
|
+
* @see {@link https://developers.google.com/identity/gsi/web/guides/overview}
|
|
129
|
+
*/
|
|
130
|
+
itp_support: true,
|
|
131
|
+
use_fedcm_for_prompt: useFedCM,
|
|
132
|
+
...options.additionalOptions
|
|
133
|
+
});
|
|
134
|
+
const handlePrompt = (attempt) => {
|
|
135
|
+
if (isResolved) return;
|
|
136
|
+
window.google?.accounts.id.prompt((notification) => {
|
|
137
|
+
if (isResolved) return;
|
|
138
|
+
if (notification.isDismissedMoment?.()) {
|
|
139
|
+
const reason = notification.getDismissedReason?.();
|
|
140
|
+
if (noRetryReasons.dismissed.includes(reason)) {
|
|
141
|
+
opts?.onPromptNotification?.(notification);
|
|
142
|
+
resolve();
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (attempt < maxAttempts) {
|
|
146
|
+
const delay = Math.pow(2, attempt) * baseDelay;
|
|
147
|
+
setTimeout(() => handlePrompt(attempt + 1), delay);
|
|
148
|
+
} else {
|
|
149
|
+
opts?.onPromptNotification?.(notification);
|
|
150
|
+
resolve();
|
|
151
|
+
}
|
|
152
|
+
} else if (notification.isSkippedMoment?.()) {
|
|
153
|
+
const reason = notification.getSkippedReason?.();
|
|
154
|
+
if (!reason || noRetryReasons.skipped.includes(reason)) {
|
|
155
|
+
opts?.onPromptNotification?.(notification);
|
|
156
|
+
resolve();
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (attempt < maxAttempts) {
|
|
160
|
+
const delay = Math.pow(2, attempt) * baseDelay;
|
|
161
|
+
setTimeout(() => handlePrompt(attempt + 1), delay);
|
|
162
|
+
} else {
|
|
163
|
+
opts?.onPromptNotification?.(notification);
|
|
164
|
+
resolve();
|
|
165
|
+
}
|
|
166
|
+
} else if (notification.isNotDisplayed?.()) {
|
|
167
|
+
opts?.onPromptNotification?.(notification);
|
|
168
|
+
resolve();
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
};
|
|
172
|
+
handlePrompt(0);
|
|
173
|
+
});
|
|
174
|
+
} catch (error) {
|
|
175
|
+
console.error("Error during Google One Tap flow:", error);
|
|
176
|
+
throw error;
|
|
177
|
+
} finally {
|
|
178
|
+
isRequestInProgress = false;
|
|
179
|
+
}
|
|
180
|
+
} };
|
|
181
|
+
},
|
|
182
|
+
getAtoms($fetch) {
|
|
183
|
+
return {};
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
};
|
|
187
|
+
const loadGoogleScript = () => {
|
|
188
|
+
return new Promise((resolve, reject) => {
|
|
189
|
+
if (window.googleScriptInitialized) {
|
|
190
|
+
resolve();
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const script = document.createElement("script");
|
|
194
|
+
script.src = "https://accounts.google.com/gsi/client";
|
|
195
|
+
script.async = true;
|
|
196
|
+
script.defer = true;
|
|
197
|
+
script.onload = () => {
|
|
198
|
+
window.googleScriptInitialized = true;
|
|
199
|
+
resolve();
|
|
200
|
+
};
|
|
201
|
+
script.onerror = () => {
|
|
202
|
+
reject(/* @__PURE__ */ new Error("Failed to load Google Identity Services script"));
|
|
203
|
+
};
|
|
204
|
+
document.head.appendChild(script);
|
|
205
|
+
});
|
|
206
|
+
};
|
|
207
|
+
//#endregion
|
|
208
|
+
export { oneTapClient };
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import * as _$better_call0 from "better-call";
|
|
2
|
+
import * as z from "zod";
|
|
3
|
+
|
|
4
|
+
//#region src/plugins/one-tap/index.d.ts
|
|
5
|
+
declare module "@better-auth/core" {
|
|
6
|
+
interface BetterAuthPluginRegistry<AuthOptions, Options> {
|
|
7
|
+
"one-tap": {
|
|
8
|
+
creator: typeof oneTap;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
interface OneTapOptions {
|
|
13
|
+
/**
|
|
14
|
+
* Disable the signup flow
|
|
15
|
+
*
|
|
16
|
+
* @default false
|
|
17
|
+
*/
|
|
18
|
+
disableSignup?: boolean | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Google Client ID
|
|
21
|
+
*
|
|
22
|
+
* If a client ID is provided in the social provider configuration,
|
|
23
|
+
* it will be used.
|
|
24
|
+
*/
|
|
25
|
+
clientId?: string | undefined;
|
|
26
|
+
}
|
|
27
|
+
declare const oneTap: (options?: OneTapOptions | undefined) => {
|
|
28
|
+
id: "one-tap";
|
|
29
|
+
version: string;
|
|
30
|
+
endpoints: {
|
|
31
|
+
oneTapCallback: _$better_call0.StrictEndpoint<"/one-tap/callback", {
|
|
32
|
+
method: "POST";
|
|
33
|
+
body: z.ZodObject<{
|
|
34
|
+
idToken: z.ZodString;
|
|
35
|
+
callbackURL: z.ZodOptional<z.ZodString>;
|
|
36
|
+
}, z.core.$strip>;
|
|
37
|
+
metadata: {
|
|
38
|
+
openapi: {
|
|
39
|
+
summary: string;
|
|
40
|
+
description: string;
|
|
41
|
+
responses: {
|
|
42
|
+
200: {
|
|
43
|
+
description: string;
|
|
44
|
+
content: {
|
|
45
|
+
"application/json": {
|
|
46
|
+
schema: {
|
|
47
|
+
type: "object";
|
|
48
|
+
properties: {
|
|
49
|
+
session: {
|
|
50
|
+
$ref: string;
|
|
51
|
+
};
|
|
52
|
+
user: {
|
|
53
|
+
$ref: string;
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
400: {
|
|
61
|
+
description: string;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
}, {
|
|
67
|
+
token: string;
|
|
68
|
+
user: {
|
|
69
|
+
id: string;
|
|
70
|
+
createdAt: Date;
|
|
71
|
+
updatedAt: Date;
|
|
72
|
+
email: string;
|
|
73
|
+
emailVerified: boolean;
|
|
74
|
+
name: string;
|
|
75
|
+
image?: string | null | undefined;
|
|
76
|
+
};
|
|
77
|
+
}>;
|
|
78
|
+
};
|
|
79
|
+
options: OneTapOptions | undefined;
|
|
80
|
+
};
|
|
81
|
+
//#endregion
|
|
82
|
+
export { OneTapOptions, oneTap };
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { parseUserOutput } from "../../db/schema.mjs";
|
|
2
|
+
import { setSessionCookie } from "../../cookies/index.mjs";
|
|
3
|
+
import { OAUTH_CALLBACK_ERROR_CODES } from "../../oauth2/errors.mjs";
|
|
4
|
+
import { handleOAuthUserInfo } from "../../oauth2/link-account.mjs";
|
|
5
|
+
import { APIError as APIError$1 } from "../../api/index.mjs";
|
|
6
|
+
import { PACKAGE_VERSION } from "../../version.mjs";
|
|
7
|
+
import { toBoolean } from "../../utils/boolean.mjs";
|
|
8
|
+
import { BASE_ERROR_CODES } from "@better-auth/core/error";
|
|
9
|
+
import { isGoogleHostedDomainAllowed, verifyGoogleIdToken } from "@better-auth/core/social-providers";
|
|
10
|
+
import { createAuthEndpoint } from "@better-auth/core/api";
|
|
11
|
+
import * as z from "zod";
|
|
12
|
+
//#region src/plugins/one-tap/index.ts
|
|
13
|
+
const oneTapCallbackBodySchema = z.object({
|
|
14
|
+
idToken: z.string().meta({ description: "Google ID token, which the client obtains from the One Tap API" }),
|
|
15
|
+
/**
|
|
16
|
+
* Sent so the global origin-check middleware validates the post-login
|
|
17
|
+
* redirect target against `trustedOrigins`. Without it the client performs
|
|
18
|
+
* an unvalidated `window.location` redirect, which is an open redirect.
|
|
19
|
+
*/
|
|
20
|
+
callbackURL: z.string().meta({ description: "URL to redirect to after a successful sign-in" }).optional()
|
|
21
|
+
});
|
|
22
|
+
const oneTap = (options) => ({
|
|
23
|
+
id: "one-tap",
|
|
24
|
+
version: PACKAGE_VERSION,
|
|
25
|
+
endpoints: { oneTapCallback: createAuthEndpoint("/one-tap/callback", {
|
|
26
|
+
method: "POST",
|
|
27
|
+
body: oneTapCallbackBodySchema,
|
|
28
|
+
metadata: { openapi: {
|
|
29
|
+
summary: "One tap callback",
|
|
30
|
+
description: "Use this endpoint to authenticate with Google One Tap",
|
|
31
|
+
responses: {
|
|
32
|
+
200: {
|
|
33
|
+
description: "Successful response",
|
|
34
|
+
content: { "application/json": { schema: {
|
|
35
|
+
type: "object",
|
|
36
|
+
properties: {
|
|
37
|
+
session: { $ref: "#/components/schemas/Session" },
|
|
38
|
+
user: { $ref: "#/components/schemas/User" }
|
|
39
|
+
}
|
|
40
|
+
} } }
|
|
41
|
+
},
|
|
42
|
+
400: { description: "Invalid token" }
|
|
43
|
+
}
|
|
44
|
+
} }
|
|
45
|
+
}, async (ctx) => {
|
|
46
|
+
const { idToken } = ctx.body;
|
|
47
|
+
const googleProvider = typeof ctx.context.options.socialProviders?.google === "function" ? await ctx.context.options.socialProviders?.google() : ctx.context.options.socialProviders?.google;
|
|
48
|
+
const audience = options?.clientId || googleProvider?.clientId;
|
|
49
|
+
if (!audience || Array.isArray(audience) && audience.length === 0) throw new APIError$1("BAD_REQUEST", { message: "Google client ID is required for One Tap. Set it on the oneTap plugin (clientId) or on socialProviders.google." });
|
|
50
|
+
const payload = await verifyGoogleIdToken({
|
|
51
|
+
token: idToken,
|
|
52
|
+
audience
|
|
53
|
+
});
|
|
54
|
+
if (!payload) throw new APIError$1("BAD_REQUEST", { message: "invalid id token" });
|
|
55
|
+
if (!payload.sub) throw new APIError$1("BAD_REQUEST", { message: "invalid id token" });
|
|
56
|
+
const configuredHostedDomain = googleProvider?.hd;
|
|
57
|
+
if (!isGoogleHostedDomainAllowed(configuredHostedDomain, payload.hd)) {
|
|
58
|
+
ctx.context.logger.error(`Google One Tap sign-in rejected: id token hosted domain (hd) "${payload.hd ?? "<missing>"}" does not satisfy the configured "hd" option "${configuredHostedDomain}".`);
|
|
59
|
+
throw new APIError$1("BAD_REQUEST", { message: "invalid id token" });
|
|
60
|
+
}
|
|
61
|
+
const { email: rawEmail, email_verified, name, picture, sub } = payload;
|
|
62
|
+
if (typeof rawEmail !== "string" || !rawEmail) throw new APIError$1("BAD_REQUEST", { message: "Email not available in token" });
|
|
63
|
+
if (typeof sub !== "string" || !sub) throw new APIError$1("BAD_REQUEST", { message: "invalid id token" });
|
|
64
|
+
const result = await handleOAuthUserInfo(ctx, {
|
|
65
|
+
userInfo: {
|
|
66
|
+
id: sub,
|
|
67
|
+
email: rawEmail.toLowerCase(),
|
|
68
|
+
emailVerified: typeof email_verified === "boolean" ? email_verified : toBoolean(email_verified),
|
|
69
|
+
name: typeof name === "string" ? name : "",
|
|
70
|
+
image: typeof picture === "string" ? picture : void 0
|
|
71
|
+
},
|
|
72
|
+
account: {
|
|
73
|
+
providerId: "google",
|
|
74
|
+
accountId: sub,
|
|
75
|
+
idToken,
|
|
76
|
+
scope: "openid,profile,email"
|
|
77
|
+
},
|
|
78
|
+
disableSignUp: options?.disableSignup || googleProvider?.disableSignUp,
|
|
79
|
+
source: {
|
|
80
|
+
method: "oauth",
|
|
81
|
+
oauth: {
|
|
82
|
+
providerId: "google",
|
|
83
|
+
profile: payload
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
if (result.error) {
|
|
88
|
+
if (result.error === OAUTH_CALLBACK_ERROR_CODES.EMAIL_NOT_VERIFIED) throw APIError$1.from("FORBIDDEN", BASE_ERROR_CODES.EMAIL_NOT_VERIFIED);
|
|
89
|
+
throw new APIError$1("UNAUTHORIZED", { message: result.error });
|
|
90
|
+
}
|
|
91
|
+
await setSessionCookie(ctx, result.data);
|
|
92
|
+
return ctx.json({
|
|
93
|
+
token: result.data.session.token,
|
|
94
|
+
user: parseUserOutput(ctx.context.options, result.data.user)
|
|
95
|
+
});
|
|
96
|
+
}) },
|
|
97
|
+
options
|
|
98
|
+
});
|
|
99
|
+
//#endregion
|
|
100
|
+
export { oneTap };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { OneTimeTokenOptions, oneTimeToken } from "./index.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/plugins/one-time-token/client.d.ts
|
|
4
|
+
declare const oneTimeTokenClient: () => {
|
|
5
|
+
id: "one-time-token";
|
|
6
|
+
version: string;
|
|
7
|
+
$InferServerPlugin: ReturnType<typeof oneTimeToken>;
|
|
8
|
+
};
|
|
9
|
+
//#endregion
|
|
10
|
+
export { oneTimeTokenClient };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { PACKAGE_VERSION } from "../../version.mjs";
|
|
2
|
+
//#region src/plugins/one-time-token/client.ts
|
|
3
|
+
const oneTimeTokenClient = () => {
|
|
4
|
+
return {
|
|
5
|
+
id: "one-time-token",
|
|
6
|
+
version: PACKAGE_VERSION,
|
|
7
|
+
$InferServerPlugin: {}
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
//#endregion
|
|
11
|
+
export { oneTimeTokenClient };
|