@_mustachio/openauth 0.9.2 → 0.10.0
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/dist/esm/adapters/d1/audit-log.js +15 -0
- package/dist/esm/adapters/d1/config-store.js +45 -0
- package/dist/esm/adapters/d1/index.js +12 -0
- package/dist/esm/adapters/d1/key-store.js +116 -0
- package/dist/esm/adapters/d1/method-store.js +52 -0
- package/dist/esm/adapters/d1/migrations.js +77 -0
- package/dist/esm/adapters/d1/session-store.js +134 -0
- package/dist/esm/adapters/d1/session.js +18 -0
- package/dist/esm/adapters/d1/token-store.js +140 -0
- package/dist/esm/adapters/durable-object/index.js +3 -0
- package/dist/esm/adapters/durable-object/session-store.js +139 -0
- package/dist/esm/adapters/durable-object/types.js +0 -0
- package/dist/esm/adapters/dynamo/audit-log.js +23 -0
- package/dist/esm/adapters/dynamo/client.js +0 -0
- package/dist/esm/adapters/dynamo/config-store.js +57 -0
- package/dist/esm/adapters/dynamo/index.js +10 -0
- package/dist/esm/adapters/dynamo/key-store.js +188 -0
- package/dist/esm/adapters/dynamo/method-store.js +72 -0
- package/dist/esm/adapters/dynamo/passkey-credential-store.js +83 -0
- package/dist/esm/adapters/dynamo/sdk.js +128 -0
- package/dist/esm/adapters/dynamo/session-store.js +173 -0
- package/dist/esm/adapters/dynamo/token-store.js +178 -0
- package/dist/esm/adapters/kms/in-memory-backing.js +28 -0
- package/dist/esm/adapters/kms/index.js +5 -0
- package/dist/esm/adapters/kms/key-store.js +129 -0
- package/dist/esm/adapters/kms/sdk.js +23 -0
- package/dist/esm/adapters/kms/types.js +0 -0
- package/dist/esm/adapters/kv/audit-log.js +21 -0
- package/dist/esm/adapters/kv/config-store.js +43 -0
- package/dist/esm/adapters/kv/index.js +5 -0
- package/dist/esm/adapters/kv/method-store.js +63 -0
- package/dist/esm/adapters/kv/types.js +0 -0
- package/dist/esm/adapters/memory/audit-log.js +16 -0
- package/dist/esm/adapters/memory/clock.js +5 -0
- package/dist/esm/adapters/memory/config-store.js +31 -0
- package/dist/esm/adapters/memory/index.js +10 -0
- package/dist/esm/adapters/memory/key-store.js +78 -0
- package/dist/esm/adapters/memory/method-store.js +43 -0
- package/dist/esm/adapters/memory/passkey-credential-store.js +53 -0
- package/dist/esm/adapters/memory/session-store.js +82 -0
- package/dist/esm/adapters/memory/token-store.js +91 -0
- package/dist/esm/adapters/postgres/audit-log.js +16 -0
- package/dist/esm/adapters/postgres/config-store.js +48 -0
- package/dist/esm/adapters/postgres/executor.js +21 -0
- package/dist/esm/adapters/postgres/index.js +13 -0
- package/dist/esm/adapters/postgres/key-store.js +191 -0
- package/dist/esm/adapters/postgres/method-store.js +61 -0
- package/dist/esm/adapters/postgres/migrations.js +111 -0
- package/dist/esm/adapters/postgres/passkey-credential-store.js +80 -0
- package/dist/esm/adapters/postgres/session-store.js +135 -0
- package/dist/esm/adapters/postgres/token-store.js +151 -0
- package/dist/esm/client.js +26 -10
- package/dist/esm/domain/audit.js +13 -0
- package/dist/esm/domain/authorize.js +212 -0
- package/dist/esm/domain/callback.js +173 -0
- package/dist/esm/domain/client-auth.js +61 -0
- package/dist/esm/domain/client-credentials.js +91 -0
- package/dist/esm/domain/crypto.js +97 -0
- package/dist/esm/domain/discovery.js +41 -0
- package/dist/esm/domain/introspect.js +51 -0
- package/dist/esm/domain/jwt.js +43 -0
- package/dist/esm/domain/method-cache.js +136 -0
- package/dist/esm/domain/method-dispatch.js +36 -0
- package/dist/esm/domain/method-route.js +108 -0
- package/dist/esm/domain/pkce.js +16 -0
- package/dist/esm/domain/refresh.js +91 -0
- package/dist/esm/domain/revoke.js +81 -0
- package/dist/esm/domain/state-envelope.js +80 -0
- package/dist/esm/domain/token-exchange.js +101 -0
- package/dist/esm/domain/token.js +205 -0
- package/dist/esm/domain/userinfo.js +27 -0
- package/dist/esm/http/context.js +7 -0
- package/dist/esm/http/cookies.js +98 -0
- package/dist/esm/http/errors.js +71 -0
- package/dist/esm/http/handlers/authorize.js +163 -0
- package/dist/esm/http/handlers/callback.js +53 -0
- package/dist/esm/http/handlers/metadata.js +34 -0
- package/dist/esm/http/handlers/method-route.js +87 -0
- package/dist/esm/http/handlers/revocation.js +98 -0
- package/dist/esm/http/handlers/token.js +167 -0
- package/dist/esm/http/handlers/userinfo.js +54 -0
- package/dist/esm/http/middleware/error.js +15 -0
- package/dist/esm/http/middleware/tenant.js +102 -0
- package/dist/esm/http/resolver.js +15 -0
- package/dist/esm/http/router.js +35 -0
- package/dist/esm/http/schemas/authorize.js +24 -0
- package/dist/esm/http/schemas/revocation.js +18 -0
- package/dist/esm/http/schemas/token.js +57 -0
- package/dist/esm/index.js +121 -9
- package/dist/esm/methods/code.js +221 -0
- package/dist/esm/methods/m2m.js +41 -0
- package/dist/esm/methods/oauth2-factory.js +84 -0
- package/dist/esm/methods/oauth2-generic.js +196 -0
- package/dist/esm/methods/oidc-generic.js +53 -0
- package/dist/esm/methods/passkey.js +275 -0
- package/dist/esm/methods/password-hash.js +79 -0
- package/dist/esm/methods/password.js +166 -0
- package/dist/esm/methods/providers/apple.js +29 -0
- package/dist/esm/methods/providers/cognito.js +37 -0
- package/dist/esm/methods/providers/discord.js +28 -0
- package/dist/esm/methods/providers/facebook.js +42 -0
- package/dist/esm/methods/providers/github.js +29 -0
- package/dist/esm/methods/providers/google.js +29 -0
- package/dist/esm/methods/providers/index.js +17 -0
- package/dist/esm/methods/providers/jumpcloud.js +27 -0
- package/dist/esm/methods/providers/keycloak.js +32 -0
- package/dist/esm/methods/providers/linkedin.js +28 -0
- package/dist/esm/methods/providers/microsoft.js +28 -0
- package/dist/esm/methods/providers/slack.js +30 -0
- package/dist/esm/methods/providers/spotify.js +28 -0
- package/dist/esm/methods/providers/twitch.js +28 -0
- package/dist/esm/methods/providers/x.js +28 -0
- package/dist/esm/methods/providers/yahoo.js +27 -0
- package/dist/esm/pkce.js +4 -16
- package/dist/esm/ports/audit-log.js +0 -0
- package/dist/esm/ports/config-store.js +0 -0
- package/dist/esm/ports/key-store.js +0 -0
- package/dist/esm/ports/method-store.js +0 -0
- package/dist/esm/ports/session-store.js +0 -0
- package/dist/esm/ports/token-store.js +0 -0
- package/dist/esm/types/authorization.js +0 -0
- package/dist/esm/types/error.js +65 -0
- package/dist/esm/types/flow.js +0 -0
- package/dist/esm/types/idp.js +0 -0
- package/dist/esm/types/method.js +0 -0
- package/dist/esm/types/picker.js +0 -0
- package/dist/esm/types/result.js +11 -0
- package/dist/esm/types/subject.js +0 -0
- package/dist/esm/types/tenant.js +5 -0
- package/dist/esm/types/token.js +0 -0
- package/dist/esm/ui/forms.js +253 -0
- package/dist/esm/ui/index.js +8 -0
- package/dist/esm/ui/picker.js +49 -0
- package/dist/types/adapters/d1/audit-log.d.ts +19 -0
- package/dist/types/adapters/d1/audit-log.d.ts.map +1 -0
- package/dist/types/adapters/d1/config-store.d.ts +20 -0
- package/dist/types/adapters/d1/config-store.d.ts.map +1 -0
- package/dist/types/adapters/d1/index.d.ts +35 -0
- package/dist/types/adapters/d1/index.d.ts.map +1 -0
- package/dist/types/adapters/d1/key-store.d.ts +17 -0
- package/dist/types/adapters/d1/key-store.d.ts.map +1 -0
- package/dist/types/adapters/d1/method-store.d.ts +21 -0
- package/dist/types/adapters/d1/method-store.d.ts.map +1 -0
- package/dist/types/adapters/d1/migrations.d.ts +18 -0
- package/dist/types/adapters/d1/migrations.d.ts.map +1 -0
- package/dist/types/adapters/d1/session-store.d.ts +20 -0
- package/dist/types/adapters/d1/session-store.d.ts.map +1 -0
- package/dist/types/adapters/d1/session.d.ts +18 -0
- package/dist/types/adapters/d1/session.d.ts.map +1 -0
- package/dist/types/adapters/d1/token-store.d.ts +29 -0
- package/dist/types/adapters/d1/token-store.d.ts.map +1 -0
- package/dist/types/adapters/d1/types.d.ts +43 -0
- package/dist/types/adapters/d1/types.d.ts.map +1 -0
- package/dist/types/adapters/durable-object/index.d.ts +17 -0
- package/dist/types/adapters/durable-object/index.d.ts.map +1 -0
- package/dist/types/adapters/durable-object/session-store.d.ts +21 -0
- package/dist/types/adapters/durable-object/session-store.d.ts.map +1 -0
- package/dist/types/adapters/durable-object/types.d.ts +23 -0
- package/dist/types/adapters/durable-object/types.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/audit-log.d.ts +19 -0
- package/dist/types/adapters/dynamo/audit-log.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/client.d.ts +111 -0
- package/dist/types/adapters/dynamo/client.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/config-store.d.ts +21 -0
- package/dist/types/adapters/dynamo/config-store.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/index.d.ts +60 -0
- package/dist/types/adapters/dynamo/index.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/key-store.d.ts +23 -0
- package/dist/types/adapters/dynamo/key-store.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/method-store.d.ts +20 -0
- package/dist/types/adapters/dynamo/method-store.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/passkey-credential-store.d.ts +47 -0
- package/dist/types/adapters/dynamo/passkey-credential-store.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/sdk.d.ts +23 -0
- package/dist/types/adapters/dynamo/sdk.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/session-store.d.ts +20 -0
- package/dist/types/adapters/dynamo/session-store.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/token-store.d.ts +29 -0
- package/dist/types/adapters/dynamo/token-store.d.ts.map +1 -0
- package/dist/types/adapters/kms/in-memory-backing.d.ts +9 -0
- package/dist/types/adapters/kms/in-memory-backing.d.ts.map +1 -0
- package/dist/types/adapters/kms/index.d.ts +35 -0
- package/dist/types/adapters/kms/index.d.ts.map +1 -0
- package/dist/types/adapters/kms/key-store.d.ts +20 -0
- package/dist/types/adapters/kms/key-store.d.ts.map +1 -0
- package/dist/types/adapters/kms/sdk.d.ts +16 -0
- package/dist/types/adapters/kms/sdk.d.ts.map +1 -0
- package/dist/types/adapters/kms/types.d.ts +58 -0
- package/dist/types/adapters/kms/types.d.ts.map +1 -0
- package/dist/types/adapters/kv/audit-log.d.ts +22 -0
- package/dist/types/adapters/kv/audit-log.d.ts.map +1 -0
- package/dist/types/adapters/kv/config-store.d.ts +25 -0
- package/dist/types/adapters/kv/config-store.d.ts.map +1 -0
- package/dist/types/adapters/kv/index.d.ts +21 -0
- package/dist/types/adapters/kv/index.d.ts.map +1 -0
- package/dist/types/adapters/kv/method-store.d.ts +23 -0
- package/dist/types/adapters/kv/method-store.d.ts.map +1 -0
- package/dist/types/adapters/kv/types.d.ts +28 -0
- package/dist/types/adapters/kv/types.d.ts.map +1 -0
- package/dist/types/adapters/memory/audit-log.d.ts +18 -0
- package/dist/types/adapters/memory/audit-log.d.ts.map +1 -0
- package/dist/types/adapters/memory/clock.d.ts +7 -0
- package/dist/types/adapters/memory/clock.d.ts.map +1 -0
- package/dist/types/adapters/memory/config-store.d.ts +19 -0
- package/dist/types/adapters/memory/config-store.d.ts.map +1 -0
- package/dist/types/adapters/memory/index.d.ts +15 -0
- package/dist/types/adapters/memory/index.d.ts.map +1 -0
- package/dist/types/adapters/memory/key-store.d.ts +17 -0
- package/dist/types/adapters/memory/key-store.d.ts.map +1 -0
- package/dist/types/adapters/memory/method-store.d.ts +26 -0
- package/dist/types/adapters/memory/method-store.d.ts.map +1 -0
- package/dist/types/adapters/memory/passkey-credential-store.d.ts +43 -0
- package/dist/types/adapters/memory/passkey-credential-store.d.ts.map +1 -0
- package/dist/types/adapters/memory/session-store.d.ts +19 -0
- package/dist/types/adapters/memory/session-store.d.ts.map +1 -0
- package/dist/types/adapters/memory/token-store.d.ts +28 -0
- package/dist/types/adapters/memory/token-store.d.ts.map +1 -0
- package/dist/types/adapters/postgres/audit-log.d.ts +18 -0
- package/dist/types/adapters/postgres/audit-log.d.ts.map +1 -0
- package/dist/types/adapters/postgres/config-store.d.ts +21 -0
- package/dist/types/adapters/postgres/config-store.d.ts.map +1 -0
- package/dist/types/adapters/postgres/executor.d.ts +48 -0
- package/dist/types/adapters/postgres/executor.d.ts.map +1 -0
- package/dist/types/adapters/postgres/index.d.ts +39 -0
- package/dist/types/adapters/postgres/index.d.ts.map +1 -0
- package/dist/types/adapters/postgres/key-store.d.ts +23 -0
- package/dist/types/adapters/postgres/key-store.d.ts.map +1 -0
- package/dist/types/adapters/postgres/method-store.d.ts +21 -0
- package/dist/types/adapters/postgres/method-store.d.ts.map +1 -0
- package/dist/types/adapters/postgres/migrations.d.ts +22 -0
- package/dist/types/adapters/postgres/migrations.d.ts.map +1 -0
- package/dist/types/adapters/postgres/passkey-credential-store.d.ts +48 -0
- package/dist/types/adapters/postgres/passkey-credential-store.d.ts.map +1 -0
- package/dist/types/adapters/postgres/session-store.d.ts +20 -0
- package/dist/types/adapters/postgres/session-store.d.ts.map +1 -0
- package/dist/types/adapters/postgres/token-store.d.ts +30 -0
- package/dist/types/adapters/postgres/token-store.d.ts.map +1 -0
- package/dist/types/client.d.ts +1 -1
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/domain/audit.d.ts +17 -0
- package/dist/types/domain/audit.d.ts.map +1 -0
- package/dist/types/domain/authorize.d.ts +125 -0
- package/dist/types/domain/authorize.d.ts.map +1 -0
- package/dist/types/domain/callback.d.ts +70 -0
- package/dist/types/domain/callback.d.ts.map +1 -0
- package/dist/types/domain/client-auth.d.ts +57 -0
- package/dist/types/domain/client-auth.d.ts.map +1 -0
- package/dist/types/domain/client-credentials.d.ts +52 -0
- package/dist/types/domain/client-credentials.d.ts.map +1 -0
- package/dist/types/domain/crypto.d.ts +53 -0
- package/dist/types/domain/crypto.d.ts.map +1 -0
- package/dist/types/domain/discovery.d.ts +44 -0
- package/dist/types/domain/discovery.d.ts.map +1 -0
- package/dist/types/domain/introspect.d.ts +71 -0
- package/dist/types/domain/introspect.d.ts.map +1 -0
- package/dist/types/domain/jwt.d.ts +48 -0
- package/dist/types/domain/jwt.d.ts.map +1 -0
- package/dist/types/domain/method-cache.d.ts +42 -0
- package/dist/types/domain/method-cache.d.ts.map +1 -0
- package/dist/types/domain/method-dispatch.d.ts +37 -0
- package/dist/types/domain/method-dispatch.d.ts.map +1 -0
- package/dist/types/domain/method-route.d.ts +77 -0
- package/dist/types/domain/method-route.d.ts.map +1 -0
- package/dist/types/domain/pkce.d.ts +15 -0
- package/dist/types/domain/pkce.d.ts.map +1 -0
- package/dist/types/domain/refresh.d.ts +43 -0
- package/dist/types/domain/refresh.d.ts.map +1 -0
- package/dist/types/domain/revoke.d.ts +61 -0
- package/dist/types/domain/revoke.d.ts.map +1 -0
- package/dist/types/domain/state-envelope.d.ts +30 -0
- package/dist/types/domain/state-envelope.d.ts.map +1 -0
- package/dist/types/domain/token-exchange.d.ts +67 -0
- package/dist/types/domain/token-exchange.d.ts.map +1 -0
- package/dist/types/domain/token.d.ts +100 -0
- package/dist/types/domain/token.d.ts.map +1 -0
- package/dist/types/domain/userinfo.d.ts +22 -0
- package/dist/types/domain/userinfo.d.ts.map +1 -0
- package/dist/types/http/context.d.ts +63 -0
- package/dist/types/http/context.d.ts.map +1 -0
- package/dist/types/http/cookies.d.ts +45 -0
- package/dist/types/http/cookies.d.ts.map +1 -0
- package/dist/types/http/errors.d.ts +36 -0
- package/dist/types/http/errors.d.ts.map +1 -0
- package/dist/types/http/handlers/authorize.d.ts +3 -0
- package/dist/types/http/handlers/authorize.d.ts.map +1 -0
- package/dist/types/http/handlers/callback.d.ts +3 -0
- package/dist/types/http/handlers/callback.d.ts.map +1 -0
- package/dist/types/http/handlers/metadata.d.ts +4 -0
- package/dist/types/http/handlers/metadata.d.ts.map +1 -0
- package/dist/types/http/handlers/method-route.d.ts +3 -0
- package/dist/types/http/handlers/method-route.d.ts.map +1 -0
- package/dist/types/http/handlers/revocation.d.ts +4 -0
- package/dist/types/http/handlers/revocation.d.ts.map +1 -0
- package/dist/types/http/handlers/token.d.ts +3 -0
- package/dist/types/http/handlers/token.d.ts.map +1 -0
- package/dist/types/http/handlers/userinfo.d.ts +3 -0
- package/dist/types/http/handlers/userinfo.d.ts.map +1 -0
- package/dist/types/http/middleware/error.d.ts +9 -0
- package/dist/types/http/middleware/error.d.ts.map +1 -0
- package/dist/types/http/middleware/tenant.d.ts +30 -0
- package/dist/types/http/middleware/tenant.d.ts.map +1 -0
- package/dist/types/http/resolver.d.ts +22 -0
- package/dist/types/http/resolver.d.ts.map +1 -0
- package/dist/types/http/router.d.ts +21 -0
- package/dist/types/http/router.d.ts.map +1 -0
- package/dist/types/http/schemas/authorize.d.ts +52 -0
- package/dist/types/http/schemas/authorize.d.ts.map +1 -0
- package/dist/types/http/schemas/revocation.d.ts +41 -0
- package/dist/types/http/schemas/revocation.d.ts.map +1 -0
- package/dist/types/http/schemas/token.d.ts +227 -0
- package/dist/types/http/schemas/token.d.ts.map +1 -0
- package/dist/types/index.d.ts +63 -13
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/methods/code.d.ts +96 -0
- package/dist/types/methods/code.d.ts.map +1 -0
- package/dist/types/methods/m2m.d.ts +41 -0
- package/dist/types/methods/m2m.d.ts.map +1 -0
- package/dist/types/methods/oauth2-factory.d.ts +133 -0
- package/dist/types/methods/oauth2-factory.d.ts.map +1 -0
- package/dist/types/methods/oauth2-generic.d.ts +75 -0
- package/dist/types/methods/oauth2-generic.d.ts.map +1 -0
- package/dist/types/methods/oidc-generic.d.ts +26 -0
- package/dist/types/methods/oidc-generic.d.ts.map +1 -0
- package/dist/types/methods/passkey.d.ts +106 -0
- package/dist/types/methods/passkey.d.ts.map +1 -0
- package/dist/types/methods/password-hash.d.ts +25 -0
- package/dist/types/methods/password-hash.d.ts.map +1 -0
- package/dist/types/methods/password.d.ts +70 -0
- package/dist/types/methods/password.d.ts.map +1 -0
- package/dist/types/methods/providers/apple.d.ts +29 -0
- package/dist/types/methods/providers/apple.d.ts.map +1 -0
- package/dist/types/methods/providers/cognito.d.ts +36 -0
- package/dist/types/methods/providers/cognito.d.ts.map +1 -0
- package/dist/types/methods/providers/discord.d.ts +22 -0
- package/dist/types/methods/providers/discord.d.ts.map +1 -0
- package/dist/types/methods/providers/facebook.d.ts +29 -0
- package/dist/types/methods/providers/facebook.d.ts.map +1 -0
- package/dist/types/methods/providers/github.d.ts +25 -0
- package/dist/types/methods/providers/github.d.ts.map +1 -0
- package/dist/types/methods/providers/google.d.ts +28 -0
- package/dist/types/methods/providers/google.d.ts.map +1 -0
- package/dist/types/methods/providers/index.d.ts +24 -0
- package/dist/types/methods/providers/index.d.ts.map +1 -0
- package/dist/types/methods/providers/jumpcloud.d.ts +22 -0
- package/dist/types/methods/providers/jumpcloud.d.ts.map +1 -0
- package/dist/types/methods/providers/keycloak.d.ts +30 -0
- package/dist/types/methods/providers/keycloak.d.ts.map +1 -0
- package/dist/types/methods/providers/linkedin.d.ts +22 -0
- package/dist/types/methods/providers/linkedin.d.ts.map +1 -0
- package/dist/types/methods/providers/microsoft.d.ts +30 -0
- package/dist/types/methods/providers/microsoft.d.ts.map +1 -0
- package/dist/types/methods/providers/slack.d.ts +25 -0
- package/dist/types/methods/providers/slack.d.ts.map +1 -0
- package/dist/types/methods/providers/spotify.d.ts +22 -0
- package/dist/types/methods/providers/spotify.d.ts.map +1 -0
- package/dist/types/methods/providers/twitch.d.ts +23 -0
- package/dist/types/methods/providers/twitch.d.ts.map +1 -0
- package/dist/types/methods/providers/x.d.ts +25 -0
- package/dist/types/methods/providers/x.d.ts.map +1 -0
- package/dist/types/methods/providers/yahoo.d.ts +22 -0
- package/dist/types/methods/providers/yahoo.d.ts.map +1 -0
- package/dist/types/pkce.d.ts +1 -2
- package/dist/types/pkce.d.ts.map +1 -1
- package/dist/types/ports/audit-log.d.ts +139 -0
- package/dist/types/ports/audit-log.d.ts.map +1 -0
- package/dist/types/ports/config-store.d.ts +32 -0
- package/dist/types/ports/config-store.d.ts.map +1 -0
- package/dist/types/ports/key-store.d.ts +98 -0
- package/dist/types/ports/key-store.d.ts.map +1 -0
- package/dist/types/ports/method-store.d.ts +29 -0
- package/dist/types/ports/method-store.d.ts.map +1 -0
- package/dist/types/ports/session-store.d.ts +82 -0
- package/dist/types/ports/session-store.d.ts.map +1 -0
- package/dist/types/ports/token-store.d.ts +93 -0
- package/dist/types/ports/token-store.d.ts.map +1 -0
- package/dist/types/types/authorization.d.ts +52 -0
- package/dist/types/types/authorization.d.ts.map +1 -0
- package/dist/types/types/error.d.ts +92 -0
- package/dist/types/types/error.d.ts.map +1 -0
- package/dist/types/types/flow.d.ts +87 -0
- package/dist/types/types/flow.d.ts.map +1 -0
- package/dist/types/types/idp.d.ts +234 -0
- package/dist/types/types/idp.d.ts.map +1 -0
- package/dist/types/types/method.d.ts +256 -0
- package/dist/types/types/method.d.ts.map +1 -0
- package/dist/types/types/picker.d.ts +31 -0
- package/dist/types/types/picker.d.ts.map +1 -0
- package/dist/types/types/result.d.ts +29 -0
- package/dist/types/types/result.d.ts.map +1 -0
- package/dist/types/types/subject.d.ts +47 -0
- package/dist/types/types/subject.d.ts.map +1 -0
- package/dist/types/types/tenant.d.ts +239 -0
- package/dist/types/types/tenant.d.ts.map +1 -0
- package/dist/types/types/token.d.ts +103 -0
- package/dist/types/types/token.d.ts.map +1 -0
- package/dist/types/ui/forms.d.ts +35 -0
- package/dist/types/ui/forms.d.ts.map +1 -0
- package/dist/types/ui/index.d.ts +14 -0
- package/dist/types/ui/index.d.ts.map +1 -0
- package/dist/types/ui/picker.d.ts +18 -0
- package/dist/types/ui/picker.d.ts.map +1 -0
- package/package.json +41 -6
- package/src/adapters/d1/audit-log.ts +32 -0
- package/src/adapters/d1/config-store.ts +67 -0
- package/src/adapters/d1/index.ts +41 -0
- package/src/adapters/d1/key-store.ts +218 -0
- package/src/adapters/d1/method-store.ts +103 -0
- package/src/adapters/d1/migrations.ts +89 -0
- package/src/adapters/d1/session-store.ts +230 -0
- package/src/adapters/d1/session.ts +38 -0
- package/src/adapters/d1/token-store.ts +251 -0
- package/src/adapters/d1/types.ts +53 -0
- package/src/adapters/durable-object/index.ts +23 -0
- package/src/adapters/durable-object/session-store.ts +227 -0
- package/src/adapters/durable-object/types.ts +25 -0
- package/src/adapters/dynamo/audit-log.ts +35 -0
- package/src/adapters/dynamo/client.ts +118 -0
- package/src/adapters/dynamo/config-store.ts +72 -0
- package/src/adapters/dynamo/index.ts +81 -0
- package/src/adapters/dynamo/key-store.ts +267 -0
- package/src/adapters/dynamo/method-store.ts +105 -0
- package/src/adapters/dynamo/passkey-credential-store.ts +132 -0
- package/src/adapters/dynamo/sdk.ts +189 -0
- package/src/adapters/dynamo/session-store.ts +229 -0
- package/src/adapters/dynamo/token-store.ts +248 -0
- package/src/adapters/kms/in-memory-backing.ts +36 -0
- package/src/adapters/kms/index.ts +39 -0
- package/src/adapters/kms/key-store.ts +176 -0
- package/src/adapters/kms/sdk.ts +39 -0
- package/src/adapters/kms/types.ts +61 -0
- package/src/adapters/kv/audit-log.ts +40 -0
- package/src/adapters/kv/config-store.ts +63 -0
- package/src/adapters/kv/index.ts +20 -0
- package/src/adapters/kv/method-store.ts +98 -0
- package/src/adapters/kv/types.ts +26 -0
- package/src/adapters/memory/audit-log.ts +28 -0
- package/src/adapters/memory/clock.ts +7 -0
- package/src/adapters/memory/config-store.ts +41 -0
- package/src/adapters/memory/index.ts +26 -0
- package/src/adapters/memory/key-store.ts +102 -0
- package/src/adapters/memory/method-store.ts +75 -0
- package/src/adapters/memory/passkey-credential-store.ts +97 -0
- package/src/adapters/memory/session-store.ts +128 -0
- package/src/adapters/memory/token-store.ts +165 -0
- package/src/adapters/postgres/audit-log.ts +34 -0
- package/src/adapters/postgres/config-store.ts +72 -0
- package/src/adapters/postgres/executor.ts +76 -0
- package/src/adapters/postgres/index.ts +60 -0
- package/src/adapters/postgres/key-store.ts +334 -0
- package/src/adapters/postgres/method-store.ts +104 -0
- package/src/adapters/postgres/migrations.ts +131 -0
- package/src/adapters/postgres/passkey-credential-store.ts +150 -0
- package/src/adapters/postgres/session-store.ts +216 -0
- package/src/adapters/postgres/token-store.ts +263 -0
- package/src/client.ts +50 -16
- package/src/domain/audit.ts +28 -0
- package/src/domain/authorize.ts +405 -0
- package/src/domain/callback.ts +263 -0
- package/src/domain/client-auth.ts +116 -0
- package/src/domain/client-credentials.ts +178 -0
- package/src/domain/crypto.ts +168 -0
- package/src/domain/discovery.ts +83 -0
- package/src/domain/introspect.ts +145 -0
- package/src/domain/jwt.ts +106 -0
- package/src/domain/method-cache.ts +220 -0
- package/src/domain/method-dispatch.ts +95 -0
- package/src/domain/method-route.ts +208 -0
- package/src/domain/pkce.ts +37 -0
- package/src/domain/refresh.ts +169 -0
- package/src/domain/revoke.ts +161 -0
- package/src/domain/state-envelope.ts +142 -0
- package/src/domain/token-exchange.ts +232 -0
- package/src/domain/token.ts +357 -0
- package/src/domain/userinfo.ts +56 -0
- package/src/http/context.ts +86 -0
- package/src/http/cookies.ts +167 -0
- package/src/http/errors.ts +98 -0
- package/src/http/handlers/authorize.ts +221 -0
- package/src/http/handlers/callback.ts +77 -0
- package/src/http/handlers/metadata.ts +44 -0
- package/src/http/handlers/method-route.ts +115 -0
- package/src/http/handlers/revocation.ts +151 -0
- package/src/http/handlers/token.ts +244 -0
- package/src/http/handlers/userinfo.ts +66 -0
- package/src/http/middleware/error.ts +26 -0
- package/src/http/middleware/tenant.ts +165 -0
- package/src/http/resolver.ts +34 -0
- package/src/http/router.ts +66 -0
- package/src/http/schemas/authorize.ts +58 -0
- package/src/http/schemas/revocation.ts +23 -0
- package/src/http/schemas/token.ts +85 -0
- package/src/index.ts +266 -20
- package/src/methods/code.ts +359 -0
- package/src/methods/m2m.ts +82 -0
- package/src/methods/oauth2-factory.ts +151 -0
- package/src/methods/oauth2-generic.ts +360 -0
- package/src/methods/oidc-generic.ts +109 -0
- package/src/methods/passkey.ts +419 -0
- package/src/methods/password-hash.ts +134 -0
- package/src/methods/password.ts +298 -0
- package/src/methods/providers/apple.ts +42 -0
- package/src/methods/providers/cognito.ts +55 -0
- package/src/methods/providers/discord.ts +37 -0
- package/src/methods/providers/facebook.ts +54 -0
- package/src/methods/providers/github.ts +42 -0
- package/src/methods/providers/google.ts +43 -0
- package/src/methods/providers/index.ts +23 -0
- package/src/methods/providers/jumpcloud.ts +36 -0
- package/src/methods/providers/keycloak.ts +42 -0
- package/src/methods/providers/linkedin.ts +37 -0
- package/src/methods/providers/microsoft.ts +42 -0
- package/src/methods/providers/slack.ts +42 -0
- package/src/methods/providers/spotify.ts +37 -0
- package/src/methods/providers/twitch.ts +38 -0
- package/src/methods/providers/x.ts +40 -0
- package/src/methods/providers/yahoo.ts +36 -0
- package/src/pkce.ts +20 -21
- package/src/ports/CONSISTENCY.md +88 -0
- package/src/ports/audit-log.ts +148 -0
- package/src/ports/config-store.ts +34 -0
- package/src/ports/key-store.ts +106 -0
- package/src/ports/method-store.ts +41 -0
- package/src/ports/session-store.ts +98 -0
- package/src/ports/token-store.ts +103 -0
- package/src/types/authorization.ts +53 -0
- package/src/types/error.ts +123 -0
- package/src/types/flow.ts +89 -0
- package/src/types/idp.ts +269 -0
- package/src/types/method.ts +270 -0
- package/src/types/picker.ts +32 -0
- package/src/types/result.ts +23 -0
- package/src/types/subject.ts +50 -0
- package/src/types/tenant.ts +248 -0
- package/src/types/token.ts +101 -0
- package/src/ui/forms.ts +289 -0
- package/src/ui/index.ts +14 -0
- package/src/ui/picker.ts +63 -0
- package/dist/esm/issuer.js +0 -691
- package/dist/esm/jwt.js +0 -16
- package/dist/esm/keys.js +0 -113
- package/dist/esm/provider/apple.js +0 -28
- package/dist/esm/provider/arctic.js +0 -43
- package/dist/esm/provider/code.js +0 -58
- package/dist/esm/provider/cognito.js +0 -16
- package/dist/esm/provider/discord.js +0 -15
- package/dist/esm/provider/facebook.js +0 -24
- package/dist/esm/provider/github.js +0 -15
- package/dist/esm/provider/google.js +0 -25
- package/dist/esm/provider/index.js +0 -3
- package/dist/esm/provider/jumpcloud.js +0 -15
- package/dist/esm/provider/keycloak.js +0 -15
- package/dist/esm/provider/linkedin.js +0 -15
- package/dist/esm/provider/m2m.js +0 -16
- package/dist/esm/provider/microsoft.js +0 -24
- package/dist/esm/provider/oauth2.js +0 -119
- package/dist/esm/provider/oidc.js +0 -69
- package/dist/esm/provider/passkey.js +0 -315
- package/dist/esm/provider/password.js +0 -306
- package/dist/esm/provider/provider.js +0 -10
- package/dist/esm/provider/slack.js +0 -15
- package/dist/esm/provider/spotify.js +0 -15
- package/dist/esm/provider/twitch.js +0 -15
- package/dist/esm/provider/x.js +0 -16
- package/dist/esm/provider/yahoo.js +0 -15
- package/dist/esm/random.js +0 -27
- package/dist/esm/storage/aws.js +0 -39
- package/dist/esm/storage/cloudflare.js +0 -42
- package/dist/esm/storage/dynamo.js +0 -116
- package/dist/esm/storage/memory.js +0 -88
- package/dist/esm/storage/storage.js +0 -36
- package/dist/esm/subject.js +0 -7
- package/dist/esm/ui/base.js +0 -407
- package/dist/esm/ui/code.js +0 -151
- package/dist/esm/ui/form.js +0 -43
- package/dist/esm/ui/icon.js +0 -92
- package/dist/esm/ui/passkey.js +0 -329
- package/dist/esm/ui/password.js +0 -338
- package/dist/esm/ui/select.js +0 -187
- package/dist/esm/ui/theme.js +0 -115
- package/dist/esm/util.js +0 -54
- package/dist/types/issuer.d.ts +0 -607
- package/dist/types/issuer.d.ts.map +0 -1
- package/dist/types/jwt.d.ts +0 -6
- package/dist/types/jwt.d.ts.map +0 -1
- package/dist/types/keys.d.ts +0 -18
- package/dist/types/keys.d.ts.map +0 -1
- package/dist/types/provider/apple.d.ts +0 -108
- package/dist/types/provider/apple.d.ts.map +0 -1
- package/dist/types/provider/arctic.d.ts +0 -16
- package/dist/types/provider/arctic.d.ts.map +0 -1
- package/dist/types/provider/code.d.ts +0 -74
- package/dist/types/provider/code.d.ts.map +0 -1
- package/dist/types/provider/cognito.d.ts +0 -64
- package/dist/types/provider/cognito.d.ts.map +0 -1
- package/dist/types/provider/discord.d.ts +0 -38
- package/dist/types/provider/discord.d.ts.map +0 -1
- package/dist/types/provider/facebook.d.ts +0 -74
- package/dist/types/provider/facebook.d.ts.map +0 -1
- package/dist/types/provider/github.d.ts +0 -38
- package/dist/types/provider/github.d.ts.map +0 -1
- package/dist/types/provider/google.d.ts +0 -74
- package/dist/types/provider/google.d.ts.map +0 -1
- package/dist/types/provider/index.d.ts +0 -4
- package/dist/types/provider/index.d.ts.map +0 -1
- package/dist/types/provider/jumpcloud.d.ts +0 -38
- package/dist/types/provider/jumpcloud.d.ts.map +0 -1
- package/dist/types/provider/keycloak.d.ts +0 -67
- package/dist/types/provider/keycloak.d.ts.map +0 -1
- package/dist/types/provider/linkedin.d.ts +0 -6
- package/dist/types/provider/linkedin.d.ts.map +0 -1
- package/dist/types/provider/m2m.d.ts +0 -34
- package/dist/types/provider/m2m.d.ts.map +0 -1
- package/dist/types/provider/microsoft.d.ts +0 -89
- package/dist/types/provider/microsoft.d.ts.map +0 -1
- package/dist/types/provider/oauth2.d.ts +0 -133
- package/dist/types/provider/oauth2.d.ts.map +0 -1
- package/dist/types/provider/oidc.d.ts +0 -91
- package/dist/types/provider/oidc.d.ts.map +0 -1
- package/dist/types/provider/passkey.d.ts +0 -143
- package/dist/types/provider/passkey.d.ts.map +0 -1
- package/dist/types/provider/password.d.ts +0 -210
- package/dist/types/provider/password.d.ts.map +0 -1
- package/dist/types/provider/provider.d.ts +0 -29
- package/dist/types/provider/provider.d.ts.map +0 -1
- package/dist/types/provider/slack.d.ts +0 -59
- package/dist/types/provider/slack.d.ts.map +0 -1
- package/dist/types/provider/spotify.d.ts +0 -38
- package/dist/types/provider/spotify.d.ts.map +0 -1
- package/dist/types/provider/twitch.d.ts +0 -38
- package/dist/types/provider/twitch.d.ts.map +0 -1
- package/dist/types/provider/x.d.ts +0 -38
- package/dist/types/provider/x.d.ts.map +0 -1
- package/dist/types/provider/yahoo.d.ts +0 -38
- package/dist/types/provider/yahoo.d.ts.map +0 -1
- package/dist/types/random.d.ts +0 -3
- package/dist/types/random.d.ts.map +0 -1
- package/dist/types/storage/aws.d.ts +0 -4
- package/dist/types/storage/aws.d.ts.map +0 -1
- package/dist/types/storage/cloudflare.d.ts +0 -34
- package/dist/types/storage/cloudflare.d.ts.map +0 -1
- package/dist/types/storage/dynamo.d.ts +0 -65
- package/dist/types/storage/dynamo.d.ts.map +0 -1
- package/dist/types/storage/memory.d.ts +0 -49
- package/dist/types/storage/memory.d.ts.map +0 -1
- package/dist/types/storage/storage.d.ts +0 -15
- package/dist/types/storage/storage.d.ts.map +0 -1
- package/dist/types/subject.d.ts +0 -122
- package/dist/types/subject.d.ts.map +0 -1
- package/dist/types/ui/base.d.ts +0 -5
- package/dist/types/ui/base.d.ts.map +0 -1
- package/dist/types/ui/code.d.ts +0 -104
- package/dist/types/ui/code.d.ts.map +0 -1
- package/dist/types/ui/form.d.ts +0 -6
- package/dist/types/ui/form.d.ts.map +0 -1
- package/dist/types/ui/icon.d.ts +0 -6
- package/dist/types/ui/icon.d.ts.map +0 -1
- package/dist/types/ui/passkey.d.ts +0 -5
- package/dist/types/ui/passkey.d.ts.map +0 -1
- package/dist/types/ui/password.d.ts +0 -139
- package/dist/types/ui/password.d.ts.map +0 -1
- package/dist/types/ui/select.d.ts +0 -55
- package/dist/types/ui/select.d.ts.map +0 -1
- package/dist/types/ui/theme.d.ts +0 -207
- package/dist/types/ui/theme.d.ts.map +0 -1
- package/dist/types/util.d.ts +0 -8
- package/dist/types/util.d.ts.map +0 -1
- package/src/css.d.ts +0 -4
- package/src/issuer.ts +0 -1628
- package/src/jwt.ts +0 -17
- package/src/keys.ts +0 -139
- package/src/provider/apple.ts +0 -127
- package/src/provider/arctic.ts +0 -66
- package/src/provider/code.ts +0 -227
- package/src/provider/cognito.ts +0 -74
- package/src/provider/discord.ts +0 -45
- package/src/provider/facebook.ts +0 -84
- package/src/provider/github.ts +0 -45
- package/src/provider/google.ts +0 -85
- package/src/provider/index.ts +0 -3
- package/src/provider/jumpcloud.ts +0 -45
- package/src/provider/keycloak.ts +0 -75
- package/src/provider/linkedin.ts +0 -12
- package/src/provider/m2m.ts +0 -56
- package/src/provider/microsoft.ts +0 -100
- package/src/provider/oauth2.ts +0 -297
- package/src/provider/oidc.ts +0 -179
- package/src/provider/passkey.ts +0 -655
- package/src/provider/password.ts +0 -672
- package/src/provider/provider.ts +0 -33
- package/src/provider/slack.ts +0 -67
- package/src/provider/spotify.ts +0 -45
- package/src/provider/twitch.ts +0 -45
- package/src/provider/x.ts +0 -46
- package/src/provider/yahoo.ts +0 -45
- package/src/random.ts +0 -24
- package/src/storage/aws.ts +0 -59
- package/src/storage/cloudflare.ts +0 -77
- package/src/storage/dynamo.ts +0 -193
- package/src/storage/memory.ts +0 -135
- package/src/storage/storage.ts +0 -46
- package/src/subject.ts +0 -130
- package/src/ui/base.tsx +0 -118
- package/src/ui/code.tsx +0 -215
- package/src/ui/form.tsx +0 -40
- package/src/ui/icon.tsx +0 -95
- package/src/ui/passkey.tsx +0 -321
- package/src/ui/password.tsx +0 -405
- package/src/ui/select.tsx +0 -221
- package/src/ui/theme.ts +0 -319
- package/src/ui/ui.css +0 -252
- package/src/util.ts +0 -58
- /package/dist/esm/{css.d.js → adapters/d1/types.js} +0 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tenant model + tenant-resolution / callback-recovery types.
|
|
3
|
+
*
|
|
4
|
+
* Per AD1, tenancy is **not** a URL concept. A tenant is whatever the
|
|
5
|
+
* user-supplied `resolveTenant(req)` says it is for an incoming request, plus
|
|
6
|
+
* a deterministic callback-recovery chain (MAC-bound state, partitioned host,
|
|
7
|
+
* or `flowId`-in-URI) for the post-redirect leg where the original tenant
|
|
8
|
+
* signal may no longer be available.
|
|
9
|
+
*
|
|
10
|
+
* The minimal state envelope MACed and round-tripped through upstream
|
|
11
|
+
* providers carries only `{ tenantId, flowId, nonce, kid }`. Everything else
|
|
12
|
+
* lives in the server-side `FlowRecord` (see `./flow.ts`).
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Branded tenant id — **opaque to the framework**.
|
|
17
|
+
*
|
|
18
|
+
* The framework treats `TenantId` as a comparable string and nothing more.
|
|
19
|
+
* It never parses it, never assumes a hierarchy or naming convention, never
|
|
20
|
+
* imposes uniqueness rules, never knows the lifecycle of a tenant. The
|
|
21
|
+
* embedding application decides what a tenant *is* (an organization, a
|
|
22
|
+
* workspace, an App-Tenant tuple, a customer, …) and supplies a
|
|
23
|
+
* `resolveTenant(req)` that maps incoming requests to the right key.
|
|
24
|
+
*
|
|
25
|
+
* Common embedding pattern when the host application has two levels of
|
|
26
|
+
* scoping (e.g. `App` ⇒ `App-Tenant`): encode the tuple into the key.
|
|
27
|
+
*
|
|
28
|
+
* ```ts
|
|
29
|
+
* // Inside the host application's resolveTenant:
|
|
30
|
+
* return ok(`${app.id}:${appTenant?.id ?? "__default__"}` as TenantId)
|
|
31
|
+
*
|
|
32
|
+
* // Inside the host application's ConfigStore.getTenantConfig:
|
|
33
|
+
* const [appId, subId] = (id as string).split(":")
|
|
34
|
+
* // merge App defaults + App-Tenant overrides from your own DB ...
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* The brand exists to keep arbitrary `string` values from being passed
|
|
38
|
+
* where a `TenantId` is expected; the *meaning* of the string is the host
|
|
39
|
+
* application's concern.
|
|
40
|
+
*/
|
|
41
|
+
export type TenantId = string & { readonly __brand: "TenantId" }
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Cast helper for code that mints `TenantId` from a validated string. The
|
|
45
|
+
* framework imposes no validation on the value — callers ensure their key
|
|
46
|
+
* is non-empty and stable per partition.
|
|
47
|
+
*/
|
|
48
|
+
export const asTenantId = (value: string): TenantId => value as TenantId
|
|
49
|
+
|
|
50
|
+
/** OAuth 2.1 grant types in scope for this IdP. Implicit is intentionally absent. */
|
|
51
|
+
export type GrantType =
|
|
52
|
+
| "authorization_code"
|
|
53
|
+
| "refresh_token"
|
|
54
|
+
| "client_credentials"
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* `MethodType` is the canonical discriminator for an `AuthMethod`. It mirrors
|
|
58
|
+
* the existing provider taxonomy. The UI uses it to decide which selection /
|
|
59
|
+
* form to render; the framework uses it as a routing / dispatch hint.
|
|
60
|
+
*/
|
|
61
|
+
export type MethodType =
|
|
62
|
+
| "oauth2"
|
|
63
|
+
| "oidc"
|
|
64
|
+
| "password"
|
|
65
|
+
| "code"
|
|
66
|
+
| "m2m"
|
|
67
|
+
| "passkey"
|
|
68
|
+
| "custom"
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Per-tenant configuration for a single auth method **instance**.
|
|
72
|
+
*
|
|
73
|
+
* `id` is the **tenant-local instance id** — the value that ends up in URLs
|
|
74
|
+
* (`/<id>/*`) and that the framework dispatches by.
|
|
75
|
+
*
|
|
76
|
+
* `kind` is the **factory id** — the value that selects which
|
|
77
|
+
* `AuthMethodFactory` builds this instance. A tenant may register multiple
|
|
78
|
+
* instances of the same factory (e.g. one Google Workspace SSO and one
|
|
79
|
+
* consumer Google Sign-In) by giving each instance a unique `id` while
|
|
80
|
+
* sharing a `kind`.
|
|
81
|
+
*
|
|
82
|
+
* `type` is the `MethodType` discriminator the UI uses. The framework
|
|
83
|
+
* verifies it agrees with the factory's declared type at load time.
|
|
84
|
+
*
|
|
85
|
+
* `config` is the tenant-supplied configuration blob. The framework validates
|
|
86
|
+
* it against the factory's Zod `configSchema` before any handler runs.
|
|
87
|
+
*/
|
|
88
|
+
export type MethodConfig = {
|
|
89
|
+
id: string
|
|
90
|
+
kind: string
|
|
91
|
+
type: MethodType
|
|
92
|
+
enabled: boolean
|
|
93
|
+
config: Record<string, unknown>
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Optional theme metadata. Schema expanded in later phases. */
|
|
97
|
+
export type ThemeConfig = {
|
|
98
|
+
primary?: string
|
|
99
|
+
logo?: string
|
|
100
|
+
favicon?: string
|
|
101
|
+
background?: string
|
|
102
|
+
font?: string
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Registered OAuth client of this IdP (an app, SPA, mobile, M2M).
|
|
107
|
+
*
|
|
108
|
+
* Phase 8: split into a discriminated union so misconfiguration is a type
|
|
109
|
+
* error, not a runtime check. The runtime in `domain/authorize.ts` still
|
|
110
|
+
* enforces PKCE for public clients defensively, but hosts will see the
|
|
111
|
+
* problem at compile time.
|
|
112
|
+
*
|
|
113
|
+
* - **Public clients** (SPAs, mobile apps, native apps): no client secret;
|
|
114
|
+
* `pkceRequired` is the literal `true`. PKCE is non-negotiable per
|
|
115
|
+
* OAuth 2.1 BCP §2.1.1.
|
|
116
|
+
* - **Confidential clients** (server-side apps, M2M): `secretHash` is
|
|
117
|
+
* required (this used to be optional, in practice always set). PKCE
|
|
118
|
+
* recommended but may be disabled by the host.
|
|
119
|
+
*/
|
|
120
|
+
export type ClientConfig = PublicClientConfig | ConfidentialClientConfig
|
|
121
|
+
|
|
122
|
+
export type PublicClientConfig = {
|
|
123
|
+
id: string
|
|
124
|
+
name: string
|
|
125
|
+
type: "public"
|
|
126
|
+
redirectUris: string[]
|
|
127
|
+
grantTypes: GrantType[]
|
|
128
|
+
scopes: string[]
|
|
129
|
+
/** Must be `true` for public clients per OAuth 2.1 §2.1.1. */
|
|
130
|
+
pkceRequired: true
|
|
131
|
+
/** Phase 8. */
|
|
132
|
+
dpopRequired?: boolean
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export type ConfidentialClientConfig = {
|
|
136
|
+
id: string
|
|
137
|
+
name: string
|
|
138
|
+
type: "confidential"
|
|
139
|
+
/** Hash of the client secret. Required for confidential clients. */
|
|
140
|
+
secretHash: string
|
|
141
|
+
redirectUris: string[]
|
|
142
|
+
grantTypes: GrantType[]
|
|
143
|
+
scopes: string[]
|
|
144
|
+
/**
|
|
145
|
+
* Default true. Disabling it is permitted for confidential clients but
|
|
146
|
+
* strongly discouraged; OAuth 2.1 §2.1.1 recommends PKCE for every client.
|
|
147
|
+
*/
|
|
148
|
+
pkceRequired: boolean
|
|
149
|
+
/** Phase 8. */
|
|
150
|
+
dpopRequired?: boolean
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export type TenantConfig = {
|
|
154
|
+
id: TenantId
|
|
155
|
+
displayName: string
|
|
156
|
+
clients: ClientConfig[]
|
|
157
|
+
methods: MethodConfig[]
|
|
158
|
+
theme?: ThemeConfig
|
|
159
|
+
/** Set when the tenant needs cross-subdomain SSO. */
|
|
160
|
+
cookieDomain?: string
|
|
161
|
+
/** Override default refresh-token TTL (seconds). */
|
|
162
|
+
refreshTtl?: number
|
|
163
|
+
/** Override default access-token TTL (seconds). */
|
|
164
|
+
accessTtl?: number
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Per-request tenant context handed to methods and the user-supplied
|
|
169
|
+
* `success` callback. `request.raw` is the Web Fetch `Request` the framework
|
|
170
|
+
* received; `request.custom` is whatever the host returned from the
|
|
171
|
+
* `IdPOptions.buildCustomContext` hook (request id, decoded JWT claims, mTLS
|
|
172
|
+
* cert info, geo hints — anything per-request that methods or `success`
|
|
173
|
+
* should see). Without the hook the blob is `{}`. The same blob is also
|
|
174
|
+
* persisted on the `FlowRecord` at `/authorize` time so it survives the
|
|
175
|
+
* upstream redirect and re-presents on the callback side.
|
|
176
|
+
*/
|
|
177
|
+
export type TenantContext = {
|
|
178
|
+
id: TenantId
|
|
179
|
+
config: TenantConfig
|
|
180
|
+
request: {
|
|
181
|
+
raw: Request
|
|
182
|
+
custom: Record<string, unknown>
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Outcome of the framework's tenant-recovery chain, evaluated **before**
|
|
188
|
+
* `resolveTenant` runs on the incoming request. Each non-`fresh-request`
|
|
189
|
+
* variant carries a `flowId`; the framework consumes the matching
|
|
190
|
+
* `FlowRecord` and dispatches without consulting `resolveTenant`.
|
|
191
|
+
*
|
|
192
|
+
* Order of evaluation (see plan §"Tenant Recovery Across Redirects"):
|
|
193
|
+
* 1. If `callbackHostFor` configured AND host matches a known tenant:
|
|
194
|
+
* a. `state` MAC-verifies → host-plus-mac
|
|
195
|
+
* b. `flowId` in URI → host-plus-uri
|
|
196
|
+
* c. otherwise → invalid_request, audit unrecoverable_flow
|
|
197
|
+
* 2. Else if `state` MAC-verifies → mac-state
|
|
198
|
+
* 3. Else if `flowId` in registered URI path/query → flow-id-in-uri
|
|
199
|
+
* 4. Else → fresh-request → call user's `resolveTenant(req)`
|
|
200
|
+
*/
|
|
201
|
+
export type TenantRecovery =
|
|
202
|
+
| { kind: "mac-state"; tenantId: TenantId; flowId: string }
|
|
203
|
+
| { kind: "host-plus-uri"; tenantId: TenantId; flowId: string }
|
|
204
|
+
| { kind: "host-plus-mac"; tenantId: TenantId; flowId: string }
|
|
205
|
+
| { kind: "flow-id-in-uri"; tenantId: TenantId; flowId: string }
|
|
206
|
+
| { kind: "fresh-request" }
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Minimal envelope MACed into the `state` query parameter. Intentionally
|
|
210
|
+
* tiny — under 256 base64url bytes — so it stays clear of provider URL
|
|
211
|
+
* limits. **No sensitive data must ever be added here.** Everything else
|
|
212
|
+
* lives in the server-side `FlowRecord`.
|
|
213
|
+
*/
|
|
214
|
+
export type StateEnvelope = {
|
|
215
|
+
tenantId: TenantId
|
|
216
|
+
flowId: string
|
|
217
|
+
/** Per-flow nonce. Distinct from the relying party's `state` param. */
|
|
218
|
+
nonce: string
|
|
219
|
+
/** Key id of the HMAC key used to mint this envelope (`StateKeyRing` lookup). */
|
|
220
|
+
kid: string
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* HMAC-SHA-256 key entry used to mint / verify the `state` envelope MAC.
|
|
225
|
+
* The 32-byte key is global (shared across IdP instances) — recovery has to
|
|
226
|
+
* work before tenant config is loaded, so per-tenant keys would create a
|
|
227
|
+
* bootstrap problem.
|
|
228
|
+
*/
|
|
229
|
+
export type StateKey = {
|
|
230
|
+
kid: string
|
|
231
|
+
/** 32 raw bytes. */
|
|
232
|
+
key: Uint8Array
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* State-MAC key ring with overlap-based rotation. `active` mints new state;
|
|
237
|
+
* any key in `verify` accepts existing state during its overlap window.
|
|
238
|
+
*
|
|
239
|
+
* Rotation cadence: monthly. The overlap window must be at least as long as
|
|
240
|
+
* the flow-record TTL (default 10 minutes); a 1-hour overlap is the
|
|
241
|
+
* recommended default. New keys are added to `verify` first, promoted to
|
|
242
|
+
* `active` on the next rotation, then dropped from `verify` after overlap.
|
|
243
|
+
*/
|
|
244
|
+
export type StateKeyRing = {
|
|
245
|
+
active: StateKey
|
|
246
|
+
/** Includes `active` plus any previous keys still inside their overlap window. */
|
|
247
|
+
verify: ReadonlyArray<StateKey>
|
|
248
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token-domain shapes — auth code payload (snapshot of `FlowRecord` at
|
|
3
|
+
* handoff), access-token claims, refresh-token payload, and the small
|
|
4
|
+
* envelopes the `TokenStore` persists.
|
|
5
|
+
*
|
|
6
|
+
* Per AD9, access tokens are JWTs (ES256 by default, Ed25519 optional per
|
|
7
|
+
* AD11) and refresh tokens are opaque server-side records.
|
|
8
|
+
*/
|
|
9
|
+
import type { SubjectClaim } from "./subject"
|
|
10
|
+
import type { TenantId } from "./tenant"
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Payload stored under an auth code. Built at callback time from the consumed
|
|
14
|
+
* `FlowRecord` plus the method's `success` result. Encrypted at rest by
|
|
15
|
+
* `TokenStore.saveCode` (see `ports/CONSISTENCY.md`).
|
|
16
|
+
*
|
|
17
|
+
* `methodState` is intentionally **not** snapshotted: it served its
|
|
18
|
+
* upstream-callback purpose and is dropped with the flow record.
|
|
19
|
+
*/
|
|
20
|
+
export type CodePayload = {
|
|
21
|
+
tenantId: TenantId
|
|
22
|
+
clientId: string
|
|
23
|
+
appRedirectUri: string
|
|
24
|
+
/** Relying party's `state` param, echoed back at success. */
|
|
25
|
+
appState: string | null
|
|
26
|
+
scopes: string[]
|
|
27
|
+
audience?: string
|
|
28
|
+
/** Relying-party → IdP PKCE; verified at `/token` against the RP's verifier. */
|
|
29
|
+
clientPkce?: { challenge: string; method: "S256" }
|
|
30
|
+
/** Tenant-local method instance id (`MethodConfig.id`). */
|
|
31
|
+
methodId: string
|
|
32
|
+
/** Factory kind (`MethodConfig.kind`). */
|
|
33
|
+
methodKind: string
|
|
34
|
+
/** User's `requestContext` snapshot, if any. */
|
|
35
|
+
context?: Record<string, unknown> | null
|
|
36
|
+
/** Upstream system's stable identifier (from `MethodResult.success`). */
|
|
37
|
+
providerSubject: string
|
|
38
|
+
/** Typed-per-method properties from `MethodResult.success`. */
|
|
39
|
+
properties: unknown
|
|
40
|
+
/** Auth-code TTL is 60 s — framework refuses anything longer. */
|
|
41
|
+
expiresAt: number
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Access-token JWT claims this IdP issues. */
|
|
45
|
+
export type AccessTokenClaims = {
|
|
46
|
+
iss: string
|
|
47
|
+
sub: string
|
|
48
|
+
aud: string
|
|
49
|
+
exp: number
|
|
50
|
+
iat: number
|
|
51
|
+
/** Tenant id. */
|
|
52
|
+
tid: TenantId
|
|
53
|
+
/** Tenant-local method instance id that originated this token. */
|
|
54
|
+
mid?: string
|
|
55
|
+
/** Factory kind that originated this token. */
|
|
56
|
+
mkind?: string
|
|
57
|
+
scope?: string
|
|
58
|
+
/** DPoP confirmation claim (Phase 8). */
|
|
59
|
+
cnf?: { jkt: string }
|
|
60
|
+
/** The structured subject (matches `SubjectClaim`). Inlined for resource servers. */
|
|
61
|
+
claim: SubjectClaim
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Opaque refresh-token payload — persisted in `TokenStore` with strong CAS
|
|
66
|
+
* semantics (see `ports/CONSISTENCY.md`). The token itself is a random
|
|
67
|
+
* string; the payload is what the store returns on consume.
|
|
68
|
+
*/
|
|
69
|
+
export type RefreshTokenPayload = {
|
|
70
|
+
tenantId: TenantId
|
|
71
|
+
clientId: string
|
|
72
|
+
/** Stable subject id derived from the issued `SubjectClaim`. */
|
|
73
|
+
subjectId: string
|
|
74
|
+
claim: SubjectClaim
|
|
75
|
+
scopes: string[]
|
|
76
|
+
audience?: string
|
|
77
|
+
/** Reuse-detection chain id. Rotation issues a new token with the same family. */
|
|
78
|
+
family: string
|
|
79
|
+
/**
|
|
80
|
+
* Tenant-local method instance id (`MethodConfig.id`) that originated the
|
|
81
|
+
* chain. Preserved across `refresh_token` rotations so descendant access
|
|
82
|
+
* tokens carry the original `mid` / `mkind` claims instead of the
|
|
83
|
+
* grant-type literal "refresh".
|
|
84
|
+
*/
|
|
85
|
+
methodId: string
|
|
86
|
+
/** Factory kind (`MethodConfig.kind`) that originated the chain. */
|
|
87
|
+
methodKind: string
|
|
88
|
+
/** Wall-clock issuance and absolute-expiry timestamps. */
|
|
89
|
+
issuedAt: number
|
|
90
|
+
expiresAt: number
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Response body of `/token` (RFC 6749 §5.1). */
|
|
94
|
+
export type TokenResponse = {
|
|
95
|
+
access_token: string
|
|
96
|
+
token_type: "Bearer" | "DPoP"
|
|
97
|
+
expires_in: number
|
|
98
|
+
refresh_token?: string
|
|
99
|
+
scope?: string
|
|
100
|
+
id_token?: string
|
|
101
|
+
}
|
package/src/ui/forms.ts
ADDED
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-rendered HTML helpers for the bundled credential methods and the
|
|
3
|
+
* default authorization picker.
|
|
4
|
+
*
|
|
5
|
+
* Intentionally minimal — zero JS, no client framework. Hosts that want a
|
|
6
|
+
* richer UI override `IdPOptions.renderPicker` (for method selection) or
|
|
7
|
+
* supply their own `success-response` from method handlers (for credential
|
|
8
|
+
* forms). The helpers escape user-provided strings so callers can drop
|
|
9
|
+
* arbitrary labels or error messages without thinking about XSS.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export function escapeHtml(s: string): string {
|
|
13
|
+
return s.replace(/[&<>"']/g, (c) => {
|
|
14
|
+
switch (c) {
|
|
15
|
+
case "&":
|
|
16
|
+
return "&"
|
|
17
|
+
case "<":
|
|
18
|
+
return "<"
|
|
19
|
+
case ">":
|
|
20
|
+
return ">"
|
|
21
|
+
case '"':
|
|
22
|
+
return """
|
|
23
|
+
case "'":
|
|
24
|
+
return "'"
|
|
25
|
+
default:
|
|
26
|
+
return c
|
|
27
|
+
}
|
|
28
|
+
})
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const BASE_STYLES = `
|
|
32
|
+
:root {
|
|
33
|
+
color-scheme: light dark;
|
|
34
|
+
|
|
35
|
+
--bg-page: #eef0f4;
|
|
36
|
+
--bg-card: #ffffff;
|
|
37
|
+
--bg-input: #ffffff;
|
|
38
|
+
--bg-row: #f5f6f8;
|
|
39
|
+
--bg-row-hover: #eaecf1;
|
|
40
|
+
--fg-high: #0e1116;
|
|
41
|
+
--fg-mid: #4a5160;
|
|
42
|
+
--fg-low: #8b93a3;
|
|
43
|
+
--border: #d8dce3;
|
|
44
|
+
--border-strong: #9aa3b2;
|
|
45
|
+
--primary: #2f3137;
|
|
46
|
+
--primary-fg: #ffffff;
|
|
47
|
+
--primary-hover: #1b1d22;
|
|
48
|
+
--focus-ring: rgba(47, 49, 55, 0.18);
|
|
49
|
+
--error-bg: #fdecec;
|
|
50
|
+
--error-fg: #8a1a1a;
|
|
51
|
+
--radius: 8px;
|
|
52
|
+
--shadow-card: 0 1px 2px rgba(15, 18, 25, 0.04), 0 12px 28px rgba(15, 18, 25, 0.08);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@media (prefers-color-scheme: dark) {
|
|
56
|
+
:root {
|
|
57
|
+
--bg-page: #0e0f12;
|
|
58
|
+
--bg-card: #16181d;
|
|
59
|
+
--bg-input: #1c1f25;
|
|
60
|
+
--bg-row: #20242c;
|
|
61
|
+
--bg-row-hover: #2a2f38;
|
|
62
|
+
--fg-high: #f3f4f6;
|
|
63
|
+
--fg-mid: #b6bcc7;
|
|
64
|
+
--fg-low: #7a8190;
|
|
65
|
+
--border: #2a2e36;
|
|
66
|
+
--border-strong: #3a4049;
|
|
67
|
+
--primary: #f3f4f6;
|
|
68
|
+
--primary-fg: #0e1116;
|
|
69
|
+
--primary-hover: #ffffff;
|
|
70
|
+
--focus-ring: rgba(243, 244, 246, 0.22);
|
|
71
|
+
--error-bg: #2a1414;
|
|
72
|
+
--error-fg: #f5b4b4;
|
|
73
|
+
--shadow-card: 0 1px 2px rgba(0, 0, 0, 0.5), 0 18px 40px rgba(0, 0, 0, 0.5);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
* { box-sizing: border-box; }
|
|
78
|
+
|
|
79
|
+
html, body { margin: 0; padding: 0; }
|
|
80
|
+
|
|
81
|
+
body {
|
|
82
|
+
min-height: 100vh;
|
|
83
|
+
background: var(--bg-page);
|
|
84
|
+
color: var(--fg-high);
|
|
85
|
+
font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", "Inter", "Helvetica Neue", sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
|
|
86
|
+
font-size: 15px;
|
|
87
|
+
line-height: 1.45;
|
|
88
|
+
display: grid;
|
|
89
|
+
place-items: center;
|
|
90
|
+
padding: 1.5rem;
|
|
91
|
+
-webkit-font-smoothing: antialiased;
|
|
92
|
+
-moz-osx-font-smoothing: grayscale;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
main {
|
|
96
|
+
max-width: 380px;
|
|
97
|
+
width: 100%;
|
|
98
|
+
padding: 2rem 1.75rem;
|
|
99
|
+
background: var(--bg-card);
|
|
100
|
+
border-radius: var(--radius);
|
|
101
|
+
box-shadow: var(--shadow-card);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
h1 {
|
|
105
|
+
font-size: 1.125rem;
|
|
106
|
+
font-weight: 600;
|
|
107
|
+
letter-spacing: -0.01em;
|
|
108
|
+
margin: 0 0 1.25rem;
|
|
109
|
+
color: var(--fg-high);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
form {
|
|
113
|
+
display: grid;
|
|
114
|
+
gap: 0.85rem;
|
|
115
|
+
margin: 0;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
label {
|
|
119
|
+
display: grid;
|
|
120
|
+
gap: 0.4rem;
|
|
121
|
+
font-size: 0.78rem;
|
|
122
|
+
font-weight: 500;
|
|
123
|
+
color: var(--fg-mid);
|
|
124
|
+
text-transform: none;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
input {
|
|
128
|
+
width: 100%;
|
|
129
|
+
height: 2.5rem;
|
|
130
|
+
padding: 0 0.85rem;
|
|
131
|
+
background: var(--bg-input);
|
|
132
|
+
color: var(--fg-high);
|
|
133
|
+
border: 1px solid var(--border);
|
|
134
|
+
border-radius: calc(var(--radius) - 2px);
|
|
135
|
+
font-size: 0.95rem;
|
|
136
|
+
font-family: inherit;
|
|
137
|
+
outline: none;
|
|
138
|
+
transition: border-color 120ms ease, box-shadow 120ms ease;
|
|
139
|
+
}
|
|
140
|
+
input::placeholder { color: var(--fg-low); }
|
|
141
|
+
input:hover { border-color: var(--border-strong); }
|
|
142
|
+
input:focus {
|
|
143
|
+
border-color: var(--primary);
|
|
144
|
+
box-shadow: 0 0 0 3px var(--focus-ring);
|
|
145
|
+
}
|
|
146
|
+
input:user-invalid:not(:focus) {
|
|
147
|
+
border-color: var(--error-fg);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
button {
|
|
151
|
+
height: 2.5rem;
|
|
152
|
+
padding: 0 1rem;
|
|
153
|
+
border: 0;
|
|
154
|
+
border-radius: calc(var(--radius) - 2px);
|
|
155
|
+
background: var(--primary);
|
|
156
|
+
color: var(--primary-fg);
|
|
157
|
+
font-family: inherit;
|
|
158
|
+
font-size: 0.9rem;
|
|
159
|
+
font-weight: 600;
|
|
160
|
+
letter-spacing: 0.01em;
|
|
161
|
+
cursor: pointer;
|
|
162
|
+
display: inline-flex;
|
|
163
|
+
align-items: center;
|
|
164
|
+
justify-content: center;
|
|
165
|
+
gap: 0.5rem;
|
|
166
|
+
transition: background 120ms ease, transform 80ms ease;
|
|
167
|
+
}
|
|
168
|
+
button:hover { background: var(--primary-hover); }
|
|
169
|
+
button:active { transform: translateY(1px); }
|
|
170
|
+
button:focus-visible { box-shadow: 0 0 0 3px var(--focus-ring); outline: none; }
|
|
171
|
+
|
|
172
|
+
.error {
|
|
173
|
+
display: flex;
|
|
174
|
+
align-items: center;
|
|
175
|
+
min-height: 2.25rem;
|
|
176
|
+
padding: 0.5rem 0.85rem;
|
|
177
|
+
margin: 0 0 0.25rem;
|
|
178
|
+
background: var(--error-bg);
|
|
179
|
+
color: var(--error-fg);
|
|
180
|
+
font-size: 0.82rem;
|
|
181
|
+
border-radius: calc(var(--radius) - 2px);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.methods {
|
|
185
|
+
list-style: none;
|
|
186
|
+
padding: 0;
|
|
187
|
+
margin: 0;
|
|
188
|
+
display: grid;
|
|
189
|
+
gap: 0.5rem;
|
|
190
|
+
}
|
|
191
|
+
.methods a {
|
|
192
|
+
display: flex;
|
|
193
|
+
align-items: center;
|
|
194
|
+
justify-content: space-between;
|
|
195
|
+
min-height: 2.75rem;
|
|
196
|
+
padding: 0 1rem;
|
|
197
|
+
background: var(--bg-row);
|
|
198
|
+
border: 1px solid var(--border);
|
|
199
|
+
border-radius: calc(var(--radius) - 2px);
|
|
200
|
+
color: var(--fg-high);
|
|
201
|
+
font-size: 0.92rem;
|
|
202
|
+
font-weight: 500;
|
|
203
|
+
text-decoration: none;
|
|
204
|
+
transition: background 120ms ease, border-color 120ms ease, transform 80ms ease;
|
|
205
|
+
}
|
|
206
|
+
.methods a::after {
|
|
207
|
+
content: "›";
|
|
208
|
+
color: var(--fg-mid);
|
|
209
|
+
font-size: 1.15rem;
|
|
210
|
+
font-weight: 500;
|
|
211
|
+
line-height: 1;
|
|
212
|
+
}
|
|
213
|
+
.methods a:hover {
|
|
214
|
+
background: var(--bg-row-hover);
|
|
215
|
+
border-color: var(--border-strong);
|
|
216
|
+
color: var(--fg-high);
|
|
217
|
+
}
|
|
218
|
+
.methods a:hover::after {
|
|
219
|
+
color: var(--fg-high);
|
|
220
|
+
}
|
|
221
|
+
.methods a:active { transform: translateY(1px); }
|
|
222
|
+
.methods a:focus-visible {
|
|
223
|
+
outline: none;
|
|
224
|
+
border-color: var(--primary);
|
|
225
|
+
box-shadow: 0 0 0 3px var(--focus-ring);
|
|
226
|
+
}
|
|
227
|
+
`
|
|
228
|
+
|
|
229
|
+
export function htmlPage(opts: { title: string; body: string }): string {
|
|
230
|
+
return `<!doctype html>
|
|
231
|
+
<html lang="en">
|
|
232
|
+
<head>
|
|
233
|
+
<meta charset="utf-8">
|
|
234
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
235
|
+
<title>${escapeHtml(opts.title)}</title>
|
|
236
|
+
<style>${BASE_STYLES}</style>
|
|
237
|
+
</head>
|
|
238
|
+
<body>
|
|
239
|
+
<main>${opts.body}</main>
|
|
240
|
+
</body>
|
|
241
|
+
</html>`
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
export type FormField = {
|
|
245
|
+
name: string
|
|
246
|
+
label: string
|
|
247
|
+
type?: "text" | "password" | "email" | "tel"
|
|
248
|
+
value?: string
|
|
249
|
+
required?: boolean
|
|
250
|
+
autocomplete?: string
|
|
251
|
+
inputmode?: string
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/** Build a `<form>` POSTing to `action`. */
|
|
255
|
+
export function renderForm(opts: {
|
|
256
|
+
title: string
|
|
257
|
+
action: string
|
|
258
|
+
fields: FormField[]
|
|
259
|
+
submit: string
|
|
260
|
+
error?: string
|
|
261
|
+
hidden?: Record<string, string>
|
|
262
|
+
}): string {
|
|
263
|
+
const errorHtml = opts.error
|
|
264
|
+
? `<p class="error">${escapeHtml(opts.error)}</p>`
|
|
265
|
+
: ""
|
|
266
|
+
const hidden = Object.entries(opts.hidden ?? {})
|
|
267
|
+
.map(
|
|
268
|
+
([k, v]) =>
|
|
269
|
+
`<input type="hidden" name="${escapeHtml(k)}" value="${escapeHtml(v)}">`,
|
|
270
|
+
)
|
|
271
|
+
.join("")
|
|
272
|
+
const fields = opts.fields
|
|
273
|
+
.map(
|
|
274
|
+
(f) => `<label>${escapeHtml(f.label)}
|
|
275
|
+
<input
|
|
276
|
+
name="${escapeHtml(f.name)}"
|
|
277
|
+
type="${f.type ?? "text"}"
|
|
278
|
+
value="${escapeHtml(f.value ?? "")}"
|
|
279
|
+
${f.required ? "required" : ""}
|
|
280
|
+
${f.autocomplete ? `autocomplete="${escapeHtml(f.autocomplete)}"` : ""}
|
|
281
|
+
${f.inputmode ? `inputmode="${escapeHtml(f.inputmode)}"` : ""}
|
|
282
|
+
></label>`,
|
|
283
|
+
)
|
|
284
|
+
.join("")
|
|
285
|
+
return htmlPage({
|
|
286
|
+
title: opts.title,
|
|
287
|
+
body: `<h1>${escapeHtml(opts.title)}</h1>${errorHtml}<form method="POST" action="${escapeHtml(opts.action)}">${hidden}${fields}<button type="submit">${escapeHtml(opts.submit)}</button></form>`,
|
|
288
|
+
})
|
|
289
|
+
}
|
package/src/ui/index.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public surface for the built-in server-rendered UI helpers.
|
|
3
|
+
*
|
|
4
|
+
* Hosts who want their own UI typically don't import from here at all —
|
|
5
|
+
* they intercept at the host application layer. Hosts that want to keep
|
|
6
|
+
* the defaults but tweak around the edges (e.g. supply a custom picker
|
|
7
|
+
* while keeping the default credential forms) can pull renderForm /
|
|
8
|
+
* renderPicker from here.
|
|
9
|
+
*/
|
|
10
|
+
export { renderForm, escapeHtml, htmlPage, BASE_STYLES } from "./forms"
|
|
11
|
+
export type { FormField } from "./forms"
|
|
12
|
+
|
|
13
|
+
export { renderPicker, buildMethodLink } from "./picker"
|
|
14
|
+
export type { PickerMethod, PickerContext } from "./picker"
|