@atproto/oauth-provider 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- package/.postcssrc.yml +3 -0
- package/CHANGELOG.md +19 -0
- package/LICENSE.txt +7 -0
- package/dist/access-token/access-token-type.d.ts +6 -0
- package/dist/access-token/access-token-type.d.ts.map +1 -0
- package/dist/access-token/access-token-type.js +10 -0
- package/dist/access-token/access-token-type.js.map +1 -0
- package/dist/account/account-manager.d.ts +14 -0
- package/dist/account/account-manager.d.ts.map +1 -0
- package/dist/account/account-manager.js +39 -0
- package/dist/account/account-manager.js.map +1 -0
- package/dist/account/account-store.d.ts +39 -0
- package/dist/account/account-store.d.ts.map +1 -0
- package/dist/account/account-store.js +19 -0
- package/dist/account/account-store.js.map +1 -0
- package/dist/account/account.d.ts +8 -0
- package/dist/account/account.d.ts.map +1 -0
- package/dist/account/account.js +3 -0
- package/dist/account/account.js.map +1 -0
- package/dist/assets/app/bundle-manifest.json +22 -0
- package/dist/assets/app/main.css +3 -0
- package/dist/assets/app/main.js +20 -0
- package/dist/assets/app/main.js.map +1 -0
- package/dist/assets/asset.d.ts +9 -0
- package/dist/assets/asset.d.ts.map +1 -0
- package/dist/assets/asset.js +3 -0
- package/dist/assets/asset.js.map +1 -0
- package/dist/assets/assets-middleware.d.ts +2 -0
- package/dist/assets/assets-middleware.d.ts.map +1 -0
- package/dist/assets/assets-middleware.js +30 -0
- package/dist/assets/assets-middleware.js.map +1 -0
- package/dist/assets/index.d.ts +4 -0
- package/dist/assets/index.d.ts.map +1 -0
- package/dist/assets/index.js +65 -0
- package/dist/assets/index.js.map +1 -0
- package/dist/client/client-auth.d.ts +13 -0
- package/dist/client/client-auth.d.ts.map +1 -0
- package/dist/client/client-auth.js +35 -0
- package/dist/client/client-auth.js.map +1 -0
- package/dist/client/client-data.d.ts +8 -0
- package/dist/client/client-data.d.ts.map +1 -0
- package/dist/client/client-data.js +3 -0
- package/dist/client/client-data.js.map +1 -0
- package/dist/client/client-id.d.ts +4 -0
- package/dist/client/client-id.d.ts.map +1 -0
- package/dist/client/client-id.js +6 -0
- package/dist/client/client-id.js.map +1 -0
- package/dist/client/client-info.d.ts +13 -0
- package/dist/client/client-info.d.ts.map +1 -0
- package/dist/client/client-info.js +3 -0
- package/dist/client/client-info.js.map +1 -0
- package/dist/client/client-manager.d.ts +38 -0
- package/dist/client/client-manager.d.ts.map +1 -0
- package/dist/client/client-manager.js +534 -0
- package/dist/client/client-manager.js.map +1 -0
- package/dist/client/client-store.d.ts +13 -0
- package/dist/client/client-store.d.ts.map +1 -0
- package/dist/client/client-store.js +39 -0
- package/dist/client/client-store.js.map +1 -0
- package/dist/client/client-utils.d.ts +6 -0
- package/dist/client/client-utils.d.ts.map +1 -0
- package/dist/client/client-utils.js +40 -0
- package/dist/client/client-utils.js.map +1 -0
- package/dist/client/client.d.ts +41 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +163 -0
- package/dist/client/client.js.map +1 -0
- package/dist/constants.d.ts +42 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +53 -0
- package/dist/constants.js.map +1 -0
- package/dist/device/device-data.d.ts +20 -0
- package/dist/device/device-data.d.ts.map +1 -0
- package/dist/device/device-data.js +11 -0
- package/dist/device/device-data.js.map +1 -0
- package/dist/device/device-details.d.ts +17 -0
- package/dist/device/device-details.d.ts.map +1 -0
- package/dist/device/device-details.js +34 -0
- package/dist/device/device-details.js.map +1 -0
- package/dist/device/device-id.d.ts +6 -0
- package/dist/device/device-id.d.ts.map +1 -0
- package/dist/device/device-id.js +18 -0
- package/dist/device/device-id.js.map +1 -0
- package/dist/device/device-manager.d.ts +88 -0
- package/dist/device/device-manager.d.ts.map +1 -0
- package/dist/device/device-manager.js +206 -0
- package/dist/device/device-manager.js.map +1 -0
- package/dist/device/device-store.d.ts +15 -0
- package/dist/device/device-store.d.ts.map +1 -0
- package/dist/device/device-store.js +36 -0
- package/dist/device/device-store.js.map +1 -0
- package/dist/device/session-id.d.ts +6 -0
- package/dist/device/session-id.d.ts.map +1 -0
- package/dist/device/session-id.js +18 -0
- package/dist/device/session-id.js.map +1 -0
- package/dist/dpop/dpop-manager.d.ts +33 -0
- package/dist/dpop/dpop-manager.d.ts.map +1 -0
- package/dist/dpop/dpop-manager.js +115 -0
- package/dist/dpop/dpop-manager.js.map +1 -0
- package/dist/dpop/dpop-nonce.d.ts +13 -0
- package/dist/dpop/dpop-nonce.d.ts.map +1 -0
- package/dist/dpop/dpop-nonce.js +94 -0
- package/dist/dpop/dpop-nonce.js.map +1 -0
- package/dist/errors/access-denied-error.d.ts +8 -0
- package/dist/errors/access-denied-error.d.ts.map +1 -0
- package/dist/errors/access-denied-error.js +21 -0
- package/dist/errors/access-denied-error.js.map +1 -0
- package/dist/errors/account-selection-required-error.d.ts +6 -0
- package/dist/errors/account-selection-required-error.d.ts.map +1 -0
- package/dist/errors/account-selection-required-error.js +11 -0
- package/dist/errors/account-selection-required-error.js.map +1 -0
- package/dist/errors/consent-required-error.d.ts +6 -0
- package/dist/errors/consent-required-error.d.ts.map +1 -0
- package/dist/errors/consent-required-error.js +11 -0
- package/dist/errors/consent-required-error.js.map +1 -0
- package/dist/errors/invalid-authorization-details-error.d.ts +20 -0
- package/dist/errors/invalid-authorization-details-error.d.ts.map +1 -0
- package/dist/errors/invalid-authorization-details-error.js +26 -0
- package/dist/errors/invalid-authorization-details-error.js.map +1 -0
- package/dist/errors/invalid-client-error.d.ts +18 -0
- package/dist/errors/invalid-client-error.d.ts.map +1 -0
- package/dist/errors/invalid-client-error.js +24 -0
- package/dist/errors/invalid-client-error.js.map +1 -0
- package/dist/errors/invalid-client-id-error.d.ts +13 -0
- package/dist/errors/invalid-client-id-error.d.ts.map +1 -0
- package/dist/errors/invalid-client-id-error.js +25 -0
- package/dist/errors/invalid-client-id-error.js.map +1 -0
- package/dist/errors/invalid-client-metadata-error.d.ts +13 -0
- package/dist/errors/invalid-client-metadata-error.d.ts.map +1 -0
- package/dist/errors/invalid-client-metadata-error.js +23 -0
- package/dist/errors/invalid-client-metadata-error.js.map +1 -0
- package/dist/errors/invalid-dpop-key-binding-error.d.ts +12 -0
- package/dist/errors/invalid-dpop-key-binding-error.d.ts.map +1 -0
- package/dist/errors/invalid-dpop-key-binding-error.js +20 -0
- package/dist/errors/invalid-dpop-key-binding-error.js.map +1 -0
- package/dist/errors/invalid-dpop-proof-error.d.ts +5 -0
- package/dist/errors/invalid-dpop-proof-error.d.ts.map +1 -0
- package/dist/errors/invalid-dpop-proof-error.js +12 -0
- package/dist/errors/invalid-dpop-proof-error.js.map +1 -0
- package/dist/errors/invalid-grant-error.d.ts +14 -0
- package/dist/errors/invalid-grant-error.d.ts.map +1 -0
- package/dist/errors/invalid-grant-error.js +20 -0
- package/dist/errors/invalid-grant-error.js.map +1 -0
- package/dist/errors/invalid-parameters-error.d.ts +6 -0
- package/dist/errors/invalid-parameters-error.d.ts.map +1 -0
- package/dist/errors/invalid-parameters-error.js +11 -0
- package/dist/errors/invalid-parameters-error.js.map +1 -0
- package/dist/errors/invalid-redirect-uri-error.d.ts +11 -0
- package/dist/errors/invalid-redirect-uri-error.d.ts.map +1 -0
- package/dist/errors/invalid-redirect-uri-error.js +21 -0
- package/dist/errors/invalid-redirect-uri-error.js.map +1 -0
- package/dist/errors/invalid-request-error.d.ts +28 -0
- package/dist/errors/invalid-request-error.d.ts.map +1 -0
- package/dist/errors/invalid-request-error.js +34 -0
- package/dist/errors/invalid-request-error.js.map +1 -0
- package/dist/errors/invalid-token-error.d.ts +16 -0
- package/dist/errors/invalid-token-error.d.ts.map +1 -0
- package/dist/errors/invalid-token-error.js +45 -0
- package/dist/errors/invalid-token-error.js.map +1 -0
- package/dist/errors/login-required-error.d.ts +6 -0
- package/dist/errors/login-required-error.d.ts.map +1 -0
- package/dist/errors/login-required-error.js +11 -0
- package/dist/errors/login-required-error.js.map +1 -0
- package/dist/errors/oauth-error.d.ts +13 -0
- package/dist/errors/oauth-error.d.ts.map +1 -0
- package/dist/errors/oauth-error.js +29 -0
- package/dist/errors/oauth-error.js.map +1 -0
- package/dist/errors/unauthorized-client-error.d.ts +18 -0
- package/dist/errors/unauthorized-client-error.d.ts.map +1 -0
- package/dist/errors/unauthorized-client-error.js +24 -0
- package/dist/errors/unauthorized-client-error.js.map +1 -0
- package/dist/errors/use-dpop-nonce-error.d.ts +18 -0
- package/dist/errors/use-dpop-nonce-error.d.ts.map +1 -0
- package/dist/errors/use-dpop-nonce-error.js +27 -0
- package/dist/errors/use-dpop-nonce-error.js.map +1 -0
- package/dist/errors/www-authenticate-error.d.ts +9 -0
- package/dist/errors/www-authenticate-error.d.ts.map +1 -0
- package/dist/errors/www-authenticate-error.js +46 -0
- package/dist/errors/www-authenticate-error.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/html/build-document.d.ts +32 -0
- package/dist/lib/html/build-document.d.ts.map +1 -0
- package/dist/lib/html/build-document.js +61 -0
- package/dist/lib/html/build-document.js.map +1 -0
- package/dist/lib/html/escapers.d.ts +9 -0
- package/dist/lib/html/escapers.d.ts.map +1 -0
- package/dist/lib/html/escapers.js +66 -0
- package/dist/lib/html/escapers.js.map +1 -0
- package/dist/lib/html/html.d.ts +13 -0
- package/dist/lib/html/html.d.ts.map +1 -0
- package/dist/lib/html/html.js +53 -0
- package/dist/lib/html/html.js.map +1 -0
- package/dist/lib/html/index.d.ts +4 -0
- package/dist/lib/html/index.d.ts.map +1 -0
- package/dist/lib/html/index.js +21 -0
- package/dist/lib/html/index.js.map +1 -0
- package/dist/lib/html/tags.d.ts +34 -0
- package/dist/lib/html/tags.d.ts.map +1 -0
- package/dist/lib/html/tags.js +47 -0
- package/dist/lib/html/tags.js.map +1 -0
- package/dist/lib/html/util.d.ts +4 -0
- package/dist/lib/html/util.d.ts.map +1 -0
- package/dist/lib/html/util.js +20 -0
- package/dist/lib/html/util.js.map +1 -0
- package/dist/lib/http/accept.d.ts +29 -0
- package/dist/lib/http/accept.d.ts.map +1 -0
- package/dist/lib/http/accept.js +67 -0
- package/dist/lib/http/accept.js.map +1 -0
- package/dist/lib/http/context.d.ts +5 -0
- package/dist/lib/http/context.d.ts.map +1 -0
- package/dist/lib/http/context.js +10 -0
- package/dist/lib/http/context.js.map +1 -0
- package/dist/lib/http/index.d.ts +10 -0
- package/dist/lib/http/index.d.ts.map +1 -0
- package/dist/lib/http/index.js +26 -0
- package/dist/lib/http/index.js.map +1 -0
- package/dist/lib/http/method.d.ts +6 -0
- package/dist/lib/http/method.d.ts.map +1 -0
- package/dist/lib/http/method.js +19 -0
- package/dist/lib/http/method.js.map +1 -0
- package/dist/lib/http/middleware.d.ts +18 -0
- package/dist/lib/http/middleware.d.ts.map +1 -0
- package/dist/lib/http/middleware.js +118 -0
- package/dist/lib/http/middleware.js.map +1 -0
- package/dist/lib/http/parser.d.ts +33 -0
- package/dist/lib/http/parser.d.ts.map +1 -0
- package/dist/lib/http/parser.js +48 -0
- package/dist/lib/http/parser.js.map +1 -0
- package/dist/lib/http/path.d.ts +9 -0
- package/dist/lib/http/path.d.ts.map +1 -0
- package/dist/lib/http/path.js +54 -0
- package/dist/lib/http/path.js.map +1 -0
- package/dist/lib/http/request.d.ts +33 -0
- package/dist/lib/http/request.d.ts.map +1 -0
- package/dist/lib/http/request.js +86 -0
- package/dist/lib/http/request.js.map +1 -0
- package/dist/lib/http/response.d.ts +13 -0
- package/dist/lib/http/response.d.ts.map +1 -0
- package/dist/lib/http/response.js +98 -0
- package/dist/lib/http/response.js.map +1 -0
- package/dist/lib/http/route.d.ts +25 -0
- package/dist/lib/http/route.d.ts.map +1 -0
- package/dist/lib/http/route.js +39 -0
- package/dist/lib/http/route.js.map +1 -0
- package/dist/lib/http/router.d.ts +32 -0
- package/dist/lib/http/router.d.ts.map +1 -0
- package/dist/lib/http/router.js +74 -0
- package/dist/lib/http/router.js.map +1 -0
- package/dist/lib/http/stream.d.ts +13 -0
- package/dist/lib/http/stream.d.ts.map +1 -0
- package/dist/lib/http/stream.js +46 -0
- package/dist/lib/http/stream.js.map +1 -0
- package/dist/lib/http/types.d.ts +7 -0
- package/dist/lib/http/types.d.ts.map +1 -0
- package/dist/lib/http/types.js +3 -0
- package/dist/lib/http/types.js.map +1 -0
- package/dist/lib/http/url.d.ts +8 -0
- package/dist/lib/http/url.d.ts.map +1 -0
- package/dist/lib/http/url.js +22 -0
- package/dist/lib/http/url.js.map +1 -0
- package/dist/lib/redis.d.ts +5 -0
- package/dist/lib/redis.d.ts.map +1 -0
- package/dist/lib/redis.js +22 -0
- package/dist/lib/redis.js.map +1 -0
- package/dist/lib/util/authorization-header.d.ts +4 -0
- package/dist/lib/util/authorization-header.d.ts.map +1 -0
- package/dist/lib/util/authorization-header.js +23 -0
- package/dist/lib/util/authorization-header.js.map +1 -0
- package/dist/lib/util/cast.d.ts +2 -0
- package/dist/lib/util/cast.d.ts.map +1 -0
- package/dist/lib/util/cast.js +10 -0
- package/dist/lib/util/cast.js.map +1 -0
- package/dist/lib/util/crypto.d.ts +3 -0
- package/dist/lib/util/crypto.d.ts.map +1 -0
- package/dist/lib/util/crypto.js +29 -0
- package/dist/lib/util/crypto.js.map +1 -0
- package/dist/lib/util/date.d.ts +3 -0
- package/dist/lib/util/date.d.ts.map +1 -0
- package/dist/lib/util/date.js +12 -0
- package/dist/lib/util/date.js.map +1 -0
- package/dist/lib/util/hostname.d.ts +6 -0
- package/dist/lib/util/hostname.d.ts.map +1 -0
- package/dist/lib/util/hostname.js +24 -0
- package/dist/lib/util/hostname.js.map +1 -0
- package/dist/lib/util/redirect-uri.d.ts +7 -0
- package/dist/lib/util/redirect-uri.d.ts.map +1 -0
- package/dist/lib/util/redirect-uri.js +44 -0
- package/dist/lib/util/redirect-uri.js.map +1 -0
- package/dist/lib/util/time.d.ts +6 -0
- package/dist/lib/util/time.d.ts.map +1 -0
- package/dist/lib/util/time.js +28 -0
- package/dist/lib/util/time.js.map +1 -0
- package/dist/lib/util/type.d.ts +6 -0
- package/dist/lib/util/type.d.ts.map +1 -0
- package/dist/lib/util/type.js +3 -0
- package/dist/lib/util/type.js.map +1 -0
- package/dist/lib/util/well-known.d.ts +3 -0
- package/dist/lib/util/well-known.d.ts.map +1 -0
- package/dist/lib/util/well-known.js +11 -0
- package/dist/lib/util/well-known.js.map +1 -0
- package/dist/metadata/build-metadata.d.ts +14 -0
- package/dist/metadata/build-metadata.d.ts.map +1 -0
- package/dist/metadata/build-metadata.js +132 -0
- package/dist/metadata/build-metadata.js.map +1 -0
- package/dist/oauth-client.d.ts +4 -0
- package/dist/oauth-client.d.ts.map +1 -0
- package/dist/oauth-client.js +19 -0
- package/dist/oauth-client.js.map +1 -0
- package/dist/oauth-dpop.d.ts +3 -0
- package/dist/oauth-dpop.d.ts.map +1 -0
- package/dist/oauth-dpop.js +19 -0
- package/dist/oauth-dpop.js.map +1 -0
- package/dist/oauth-errors.d.ts +20 -0
- package/dist/oauth-errors.d.ts.map +1 -0
- package/dist/oauth-errors.js +43 -0
- package/dist/oauth-errors.js.map +1 -0
- package/dist/oauth-hooks.d.ts +42 -0
- package/dist/oauth-hooks.d.ts.map +1 -0
- package/dist/oauth-hooks.js +3 -0
- package/dist/oauth-hooks.js.map +1 -0
- package/dist/oauth-provider.d.ts +179 -0
- package/dist/oauth-provider.d.ts.map +1 -0
- package/dist/oauth-provider.js +748 -0
- package/dist/oauth-provider.js.map +1 -0
- package/dist/oauth-store.d.ts +11 -0
- package/dist/oauth-store.d.ts.map +1 -0
- package/dist/oauth-store.js +27 -0
- package/dist/oauth-store.js.map +1 -0
- package/dist/oauth-verifier.d.ts +66 -0
- package/dist/oauth-verifier.d.ts.map +1 -0
- package/dist/oauth-verifier.js +94 -0
- package/dist/oauth-verifier.js.map +1 -0
- package/dist/oidc/claims.d.ts +16 -0
- package/dist/oidc/claims.d.ts.map +1 -0
- package/dist/oidc/claims.js +29 -0
- package/dist/oidc/claims.js.map +1 -0
- package/dist/oidc/sub.d.ts +4 -0
- package/dist/oidc/sub.d.ts.map +1 -0
- package/dist/oidc/sub.js +6 -0
- package/dist/oidc/sub.js.map +1 -0
- package/dist/oidc/userinfo.d.ts +7 -0
- package/dist/oidc/userinfo.d.ts.map +1 -0
- package/dist/oidc/userinfo.js +3 -0
- package/dist/oidc/userinfo.js.map +1 -0
- package/dist/output/build-error-payload.d.ts +6 -0
- package/dist/output/build-error-payload.d.ts.map +1 -0
- package/dist/output/build-error-payload.js +108 -0
- package/dist/output/build-error-payload.js.map +1 -0
- package/dist/output/customization.d.ts +37 -0
- package/dist/output/customization.d.ts.map +1 -0
- package/dist/output/customization.js +62 -0
- package/dist/output/customization.js.map +1 -0
- package/dist/output/send-authorize-page.d.ts +43 -0
- package/dist/output/send-authorize-page.d.ts.map +1 -0
- package/dist/output/send-authorize-page.js +49 -0
- package/dist/output/send-authorize-page.js.map +1 -0
- package/dist/output/send-authorize-redirect.d.ts +25 -0
- package/dist/output/send-authorize-redirect.d.ts.map +1 -0
- package/dist/output/send-authorize-redirect.js +72 -0
- package/dist/output/send-authorize-redirect.js.map +1 -0
- package/dist/output/send-error-page.d.ts +5 -0
- package/dist/output/send-error-page.d.ts.map +1 -0
- package/dist/output/send-error-page.js +31 -0
- package/dist/output/send-error-page.js.map +1 -0
- package/dist/output/send-web-page.d.ts +8 -0
- package/dist/output/send-web-page.d.ts.map +1 -0
- package/dist/output/send-web-page.js +48 -0
- package/dist/output/send-web-page.js.map +1 -0
- package/dist/parameters/claims-requested.d.ts +3 -0
- package/dist/parameters/claims-requested.d.ts.map +1 -0
- package/dist/parameters/claims-requested.js +77 -0
- package/dist/parameters/claims-requested.js.map +1 -0
- package/dist/parameters/oidc-payload.d.ts +31 -0
- package/dist/parameters/oidc-payload.d.ts.map +1 -0
- package/dist/parameters/oidc-payload.js +25 -0
- package/dist/parameters/oidc-payload.js.map +1 -0
- package/dist/replay/replay-manager.d.ts +10 -0
- package/dist/replay/replay-manager.d.ts.map +1 -0
- package/dist/replay/replay-manager.js +23 -0
- package/dist/replay/replay-manager.js.map +1 -0
- package/dist/replay/replay-store-memory.d.ts +11 -0
- package/dist/replay/replay-store-memory.d.ts.map +1 -0
- package/dist/replay/replay-store-memory.js +30 -0
- package/dist/replay/replay-store-memory.js.map +1 -0
- package/dist/replay/replay-store-redis.d.ts +16 -0
- package/dist/replay/replay-store-redis.d.ts.map +1 -0
- package/dist/replay/replay-store-redis.js +20 -0
- package/dist/replay/replay-store-redis.js.map +1 -0
- package/dist/replay/replay-store.d.ts +16 -0
- package/dist/replay/replay-store.d.ts.map +1 -0
- package/dist/replay/replay-store.js +22 -0
- package/dist/replay/replay-store.js.map +1 -0
- package/dist/request/code.d.ts +7 -0
- package/dist/request/code.d.ts.map +1 -0
- package/dist/request/code.js +20 -0
- package/dist/request/code.js.map +1 -0
- package/dist/request/request-data.d.ts +21 -0
- package/dist/request/request-data.d.ts.map +1 -0
- package/dist/request/request-data.js +6 -0
- package/dist/request/request-data.js.map +1 -0
- package/dist/request/request-id.d.ts +6 -0
- package/dist/request/request-id.d.ts.map +1 -0
- package/dist/request/request-id.js +18 -0
- package/dist/request/request-id.js.map +1 -0
- package/dist/request/request-info.d.ts +12 -0
- package/dist/request/request-info.d.ts.map +1 -0
- package/dist/request/request-info.js +3 -0
- package/dist/request/request-info.js.map +1 -0
- package/dist/request/request-manager.d.ts +40 -0
- package/dist/request/request-manager.d.ts.map +1 -0
- package/dist/request/request-manager.js +310 -0
- package/dist/request/request-manager.js.map +1 -0
- package/dist/request/request-store-memory.d.ts +16 -0
- package/dist/request/request-store-memory.d.ts.map +1 -0
- package/dist/request/request-store-memory.js +31 -0
- package/dist/request/request-store-memory.js.map +1 -0
- package/dist/request/request-store-redis.d.ts +24 -0
- package/dist/request/request-store-redis.d.ts.map +1 -0
- package/dist/request/request-store-redis.js +58 -0
- package/dist/request/request-store-redis.js.map +1 -0
- package/dist/request/request-store.d.ts +27 -0
- package/dist/request/request-store.d.ts.map +1 -0
- package/dist/request/request-store.js +37 -0
- package/dist/request/request-store.js.map +1 -0
- package/dist/request/request-uri.d.ts +8 -0
- package/dist/request/request-uri.d.ts.map +1 -0
- package/dist/request/request-uri.js +24 -0
- package/dist/request/request-uri.js.map +1 -0
- package/dist/request/types.d.ts +328 -0
- package/dist/request/types.d.ts.map +1 -0
- package/dist/request/types.js +27 -0
- package/dist/request/types.js.map +1 -0
- package/dist/signer/signed-token-payload.d.ts +1694 -0
- package/dist/signer/signed-token-payload.d.ts.map +1 -0
- package/dist/signer/signed-token-payload.js +32 -0
- package/dist/signer/signed-token-payload.js.map +1 -0
- package/dist/signer/signer.d.ts +193 -0
- package/dist/signer/signer.d.ts.map +1 -0
- package/dist/signer/signer.js +101 -0
- package/dist/signer/signer.js.map +1 -0
- package/dist/token/refresh-token.d.ts +7 -0
- package/dist/token/refresh-token.d.ts.map +1 -0
- package/dist/token/refresh-token.js +20 -0
- package/dist/token/refresh-token.js.map +1 -0
- package/dist/token/token-claims.d.ts +1687 -0
- package/dist/token/token-claims.d.ts.map +1 -0
- package/dist/token/token-claims.js +30 -0
- package/dist/token/token-claims.js.map +1 -0
- package/dist/token/token-data.d.ts +20 -0
- package/dist/token/token-data.d.ts.map +1 -0
- package/dist/token/token-data.js +3 -0
- package/dist/token/token-data.js.map +1 -0
- package/dist/token/token-id.d.ts +7 -0
- package/dist/token/token-id.d.ts.map +1 -0
- package/dist/token/token-id.js +20 -0
- package/dist/token/token-id.js.map +1 -0
- package/dist/token/token-manager.d.ts +48 -0
- package/dist/token/token-manager.d.ts.map +1 -0
- package/dist/token/token-manager.js +421 -0
- package/dist/token/token-manager.js.map +1 -0
- package/dist/token/token-store.d.ts +35 -0
- package/dist/token/token-store.d.ts.map +1 -0
- package/dist/token/token-store.js +38 -0
- package/dist/token/token-store.js.map +1 -0
- package/dist/token/types.d.ts +250 -0
- package/dist/token/types.d.ts.map +1 -0
- package/dist/token/types.js +36 -0
- package/dist/token/types.js.map +1 -0
- package/dist/token/verify-token-claims.d.ts +17 -0
- package/dist/token/verify-token-claims.d.ts.map +1 -0
- package/dist/token/verify-token-claims.js +39 -0
- package/dist/token/verify-token-claims.js.map +1 -0
- package/package.json +83 -0
- package/rollup.config.js +55 -0
- package/src/access-token/access-token-type.ts +5 -0
- package/src/account/account-manager.ts +55 -0
- package/src/account/account-store.ts +74 -0
- package/src/account/account.ts +10 -0
- package/src/assets/app/app.tsx +28 -0
- package/src/assets/app/backend-data.ts +65 -0
- package/src/assets/app/components/accept-form.tsx +112 -0
- package/src/assets/app/components/account-identifier.tsx +18 -0
- package/src/assets/app/components/account-picker.tsx +108 -0
- package/src/assets/app/components/client-identifier.tsx +32 -0
- package/src/assets/app/components/client-name.tsx +30 -0
- package/src/assets/app/components/error-card.tsx +41 -0
- package/src/assets/app/components/help-card.tsx +42 -0
- package/src/assets/app/components/layout-title-page.tsx +43 -0
- package/src/assets/app/components/layout-welcome.tsx +58 -0
- package/src/assets/app/components/sign-in-form.tsx +290 -0
- package/src/assets/app/components/sign-up-account-form.tsx +210 -0
- package/src/assets/app/components/sign-up-disclaimer.tsx +44 -0
- package/src/assets/app/components/url-viewer.tsx +70 -0
- package/src/assets/app/cookies.ts +11 -0
- package/src/assets/app/hooks/use-api.ts +104 -0
- package/src/assets/app/hooks/use-bound-dispatch.ts +5 -0
- package/src/assets/app/hooks/use-csrf-token.ts +5 -0
- package/src/assets/app/lib/api.ts +64 -0
- package/src/assets/app/lib/clsx.ts +4 -0
- package/src/assets/app/lib/util.ts +10 -0
- package/src/assets/app/main.css +11 -0
- package/src/assets/app/main.tsx +28 -0
- package/src/assets/app/views/accept-view.tsx +51 -0
- package/src/assets/app/views/authorize-view.tsx +101 -0
- package/src/assets/app/views/error-view.tsx +27 -0
- package/src/assets/app/views/sign-in-view.tsx +121 -0
- package/src/assets/app/views/sign-up-view.tsx +93 -0
- package/src/assets/app/views/welcome-view.tsx +61 -0
- package/src/assets/asset.ts +8 -0
- package/src/assets/assets-middleware.ts +32 -0
- package/src/assets/index.ts +74 -0
- package/src/client/client-auth.ts +45 -0
- package/src/client/client-data.ts +9 -0
- package/src/client/client-id.ts +4 -0
- package/src/client/client-info.ts +13 -0
- package/src/client/client-manager.ts +818 -0
- package/src/client/client-store.ts +38 -0
- package/src/client/client-utils.ts +43 -0
- package/src/client/client.ts +231 -0
- package/src/constants.ts +69 -0
- package/src/device/device-data.ts +11 -0
- package/src/device/device-details.ts +43 -0
- package/src/device/device-id.ts +23 -0
- package/src/device/device-manager.ts +287 -0
- package/src/device/device-store.ts +35 -0
- package/src/device/session-id.ts +22 -0
- package/src/dpop/dpop-manager.ts +147 -0
- package/src/dpop/dpop-nonce.ts +104 -0
- package/src/errors/access-denied-error.ts +26 -0
- package/src/errors/account-selection-required-error.ts +12 -0
- package/src/errors/consent-required-error.ts +12 -0
- package/src/errors/invalid-authorization-details-error.ts +22 -0
- package/src/errors/invalid-client-error.ts +20 -0
- package/src/errors/invalid-client-id-error.ts +20 -0
- package/src/errors/invalid-client-metadata-error.ts +19 -0
- package/src/errors/invalid-dpop-key-binding-error.ts +21 -0
- package/src/errors/invalid-dpop-proof-error.ts +13 -0
- package/src/errors/invalid-grant-error.ts +16 -0
- package/src/errors/invalid-parameters-error.ts +12 -0
- package/src/errors/invalid-redirect-uri-error.ts +17 -0
- package/src/errors/invalid-request-error.ts +30 -0
- package/src/errors/invalid-token-error.ts +59 -0
- package/src/errors/login-required-error.ts +12 -0
- package/src/errors/oauth-error.ts +28 -0
- package/src/errors/unauthorized-client-error.ts +20 -0
- package/src/errors/use-dpop-nonce-error.ts +32 -0
- package/src/errors/www-authenticate-error.ts +65 -0
- package/src/index.ts +15 -0
- package/src/lib/html/README.md +9 -0
- package/src/lib/html/build-document.ts +98 -0
- package/src/lib/html/escapers.ts +66 -0
- package/src/lib/html/html.ts +61 -0
- package/src/lib/html/index.ts +5 -0
- package/src/lib/html/tags.ts +58 -0
- package/src/lib/html/util.ts +21 -0
- package/src/lib/http/README.md +11 -0
- package/src/lib/http/accept.ts +91 -0
- package/src/lib/http/context.ts +11 -0
- package/src/lib/http/index.ts +9 -0
- package/src/lib/http/method.ts +18 -0
- package/src/lib/http/middleware.ts +183 -0
- package/src/lib/http/parser.ts +64 -0
- package/src/lib/http/path.ts +82 -0
- package/src/lib/http/request.ts +141 -0
- package/src/lib/http/response.ts +133 -0
- package/src/lib/http/route.ts +56 -0
- package/src/lib/http/router.ts +118 -0
- package/src/lib/http/stream.ts +78 -0
- package/src/lib/http/types.ts +22 -0
- package/src/lib/http/url.ts +23 -0
- package/src/lib/redis.ts +23 -0
- package/src/lib/util/authorization-header.ts +26 -0
- package/src/lib/util/cast.ts +4 -0
- package/src/lib/util/crypto.ts +27 -0
- package/src/lib/util/date.ts +7 -0
- package/src/lib/util/hostname.ts +19 -0
- package/src/lib/util/redirect-uri.ts +46 -0
- package/src/lib/util/time.ts +33 -0
- package/src/lib/util/type.ts +4 -0
- package/src/lib/util/well-known.ts +8 -0
- package/src/metadata/build-metadata.ts +165 -0
- package/src/oauth-client.ts +3 -0
- package/src/oauth-dpop.ts +2 -0
- package/src/oauth-errors.ts +21 -0
- package/src/oauth-hooks.ts +66 -0
- package/src/oauth-provider.ts +1409 -0
- package/src/oauth-store.ts +11 -0
- package/src/oauth-verifier.ts +219 -0
- package/src/oidc/claims.ts +35 -0
- package/src/oidc/sub.ts +4 -0
- package/src/oidc/userinfo.ts +11 -0
- package/src/output/build-error-payload.ts +143 -0
- package/src/output/customization.ts +96 -0
- package/src/output/send-authorize-page.ts +111 -0
- package/src/output/send-authorize-redirect.ts +130 -0
- package/src/output/send-error-page.ts +41 -0
- package/src/output/send-web-page.ts +66 -0
- package/src/parameters/claims-requested.ts +106 -0
- package/src/parameters/oidc-payload.ts +28 -0
- package/src/replay/replay-manager.ts +38 -0
- package/src/replay/replay-store-memory.ts +36 -0
- package/src/replay/replay-store-redis.ts +31 -0
- package/src/replay/replay-store.ts +44 -0
- package/src/request/code.ts +24 -0
- package/src/request/request-data.ts +26 -0
- package/src/request/request-id.ts +23 -0
- package/src/request/request-info.ts +12 -0
- package/src/request/request-manager.ts +479 -0
- package/src/request/request-store-memory.ts +39 -0
- package/src/request/request-store-redis.ts +71 -0
- package/src/request/request-store.ts +54 -0
- package/src/request/request-uri.ts +29 -0
- package/src/request/types.ts +48 -0
- package/src/signer/signed-token-payload.ts +35 -0
- package/src/signer/signer.ts +165 -0
- package/src/token/refresh-token.ts +31 -0
- package/src/token/token-claims.ts +31 -0
- package/src/token/token-data.ts +33 -0
- package/src/token/token-id.ts +26 -0
- package/src/token/token-manager.ts +591 -0
- package/src/token/token-store.ts +78 -0
- package/src/token/types.ts +86 -0
- package/src/token/verify-token-claims.ts +65 -0
- package/tailwind.config.js +13 -0
- package/tsconfig.backend.json +9 -0
- package/tsconfig.frontend.json +11 -0
- package/tsconfig.json +8 -0
- package/tsconfig.tools.json +8 -0
@@ -0,0 +1,74 @@
|
|
1
|
+
import { ClientId } from '../client/client-id.js'
|
2
|
+
import { DeviceId } from '../device/device-id.js'
|
3
|
+
import { Awaitable } from '../lib/util/type.js'
|
4
|
+
import { Sub } from '../oidc/sub.js'
|
5
|
+
import { Account } from './account.js'
|
6
|
+
|
7
|
+
export type LoginCredentials = {
|
8
|
+
username: string
|
9
|
+
password: string
|
10
|
+
|
11
|
+
/**
|
12
|
+
* If false, the account must not be returned from
|
13
|
+
* {@link AccountStore.listDeviceAccounts}. Note that this only makes sense when
|
14
|
+
* used with a device ID.
|
15
|
+
*/
|
16
|
+
remember?: boolean
|
17
|
+
}
|
18
|
+
|
19
|
+
export type DeviceAccountInfo = {
|
20
|
+
remembered: boolean
|
21
|
+
authenticatedAt: Date
|
22
|
+
authorizedClients: readonly ClientId[]
|
23
|
+
}
|
24
|
+
|
25
|
+
// Export all types needed to implement the AccountStore interface
|
26
|
+
export type { Account, DeviceId, Sub }
|
27
|
+
|
28
|
+
export type AccountInfo = {
|
29
|
+
account: Account
|
30
|
+
info: DeviceAccountInfo
|
31
|
+
}
|
32
|
+
|
33
|
+
export interface AccountStore {
|
34
|
+
authenticateAccount(
|
35
|
+
credentials: LoginCredentials,
|
36
|
+
deviceId: DeviceId,
|
37
|
+
): Awaitable<AccountInfo | null>
|
38
|
+
|
39
|
+
addAuthorizedClient(
|
40
|
+
deviceId: DeviceId,
|
41
|
+
sub: Sub,
|
42
|
+
clientId: ClientId,
|
43
|
+
): Awaitable<void>
|
44
|
+
|
45
|
+
getDeviceAccount(deviceId: DeviceId, sub: Sub): Awaitable<AccountInfo | null>
|
46
|
+
removeDeviceAccount(deviceId: DeviceId, sub: Sub): Awaitable<void>
|
47
|
+
|
48
|
+
/**
|
49
|
+
* @note Only the accounts that where logged in with `remember: true` need to
|
50
|
+
* be returned. The others will be ignored.
|
51
|
+
*/
|
52
|
+
listDeviceAccounts(deviceId: DeviceId): Awaitable<AccountInfo[]>
|
53
|
+
}
|
54
|
+
|
55
|
+
export function isAccountStore(
|
56
|
+
implementation: Record<string, unknown> & Partial<AccountStore>,
|
57
|
+
): implementation is Record<string, unknown> & AccountStore {
|
58
|
+
return (
|
59
|
+
typeof implementation.authenticateAccount === 'function' &&
|
60
|
+
typeof implementation.getDeviceAccount === 'function' &&
|
61
|
+
typeof implementation.addAuthorizedClient === 'function' &&
|
62
|
+
typeof implementation.listDeviceAccounts === 'function' &&
|
63
|
+
typeof implementation.removeDeviceAccount === 'function'
|
64
|
+
)
|
65
|
+
}
|
66
|
+
|
67
|
+
export function asAccountStore(
|
68
|
+
implementation?: Record<string, unknown> & Partial<AccountStore>,
|
69
|
+
): AccountStore {
|
70
|
+
if (!implementation || !isAccountStore(implementation)) {
|
71
|
+
throw new Error('Invalid AccountStore implementation')
|
72
|
+
}
|
73
|
+
return implementation
|
74
|
+
}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import { OIDCStandardPayload } from '../oidc/claims.js'
|
2
|
+
import { Sub } from '../oidc/sub.js'
|
3
|
+
import { Simplify } from '../lib/util/type.js'
|
4
|
+
|
5
|
+
export type Account = Simplify<
|
6
|
+
{
|
7
|
+
sub: Sub // Account id
|
8
|
+
aud: string | [string, ...string[]] // Resource server URL
|
9
|
+
} & OIDCStandardPayload
|
10
|
+
>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
import type {
|
2
|
+
AuthorizeData,
|
3
|
+
CustomizationData,
|
4
|
+
ErrorData,
|
5
|
+
} from './backend-data'
|
6
|
+
import { AuthorizeView } from './views/authorize-view'
|
7
|
+
import { ErrorView } from './views/error-view'
|
8
|
+
|
9
|
+
export type AppProps = {
|
10
|
+
authorizeData?: AuthorizeData
|
11
|
+
customizationData?: CustomizationData
|
12
|
+
errorData?: ErrorData
|
13
|
+
}
|
14
|
+
|
15
|
+
export function App({ authorizeData, customizationData, errorData }: AppProps) {
|
16
|
+
if (authorizeData && !errorData) {
|
17
|
+
return (
|
18
|
+
<AuthorizeView
|
19
|
+
customizationData={customizationData}
|
20
|
+
authorizeData={authorizeData}
|
21
|
+
/>
|
22
|
+
)
|
23
|
+
} else {
|
24
|
+
return (
|
25
|
+
<ErrorView customizationData={customizationData} errorData={errorData} />
|
26
|
+
)
|
27
|
+
}
|
28
|
+
}
|
@@ -0,0 +1,65 @@
|
|
1
|
+
import { OAuthClientMetadata } from '@atproto/oauth-types'
|
2
|
+
|
3
|
+
// TODO: Find a way to share these types with the backend code
|
4
|
+
|
5
|
+
export type Account = {
|
6
|
+
sub: string
|
7
|
+
aud: string
|
8
|
+
|
9
|
+
email?: string
|
10
|
+
name?: string
|
11
|
+
preferred_username?: string
|
12
|
+
picture?: string
|
13
|
+
}
|
14
|
+
|
15
|
+
export type Session = {
|
16
|
+
account: Account
|
17
|
+
|
18
|
+
selected: boolean
|
19
|
+
loginRequired: boolean
|
20
|
+
consentRequired: boolean
|
21
|
+
}
|
22
|
+
|
23
|
+
export type LinkDefinition = {
|
24
|
+
title: string
|
25
|
+
href: string
|
26
|
+
rel?: string
|
27
|
+
}
|
28
|
+
|
29
|
+
export type CustomizationData = {
|
30
|
+
name?: string
|
31
|
+
logo?: string
|
32
|
+
links?: LinkDefinition[]
|
33
|
+
}
|
34
|
+
|
35
|
+
export type ErrorData = {
|
36
|
+
error: string
|
37
|
+
error_description: string
|
38
|
+
}
|
39
|
+
|
40
|
+
export type AuthorizeData = {
|
41
|
+
clientId: string
|
42
|
+
clientMetadata: OAuthClientMetadata
|
43
|
+
clientTrusted: boolean
|
44
|
+
requestUri: string
|
45
|
+
csrfCookie: string
|
46
|
+
sessions: Session[]
|
47
|
+
newSessionsRequireConsent: boolean
|
48
|
+
loginHint?: string
|
49
|
+
}
|
50
|
+
|
51
|
+
// see "declareBackendData()" in the backend
|
52
|
+
const readBackendData = <T>(key: string): T | undefined => {
|
53
|
+
const value = window[key] as T | undefined
|
54
|
+
delete window[key] // Prevent accidental usage / potential leaks to dependencies
|
55
|
+
return value
|
56
|
+
}
|
57
|
+
|
58
|
+
// These values are injected by the backend when it builds the
|
59
|
+
// page HTML.
|
60
|
+
|
61
|
+
export const customizationData = readBackendData<CustomizationData>(
|
62
|
+
'__customizationData',
|
63
|
+
)
|
64
|
+
export const errorData = readBackendData<ErrorData>('__errorData')
|
65
|
+
export const authorizeData = readBackendData<AuthorizeData>('__authorizeData')
|
@@ -0,0 +1,112 @@
|
|
1
|
+
import { OAuthClientMetadata } from '@atproto/oauth-types'
|
2
|
+
import { type HTMLAttributes } from 'react'
|
3
|
+
|
4
|
+
import { Account } from '../backend-data'
|
5
|
+
import { clsx } from '../lib/clsx'
|
6
|
+
import { AccountIdentifier } from './account-identifier'
|
7
|
+
import { ClientIdentifier } from './client-identifier'
|
8
|
+
import { ClientName } from './client-name'
|
9
|
+
|
10
|
+
export type AcceptFormProps = {
|
11
|
+
account: Account
|
12
|
+
clientId: string
|
13
|
+
clientMetadata: OAuthClientMetadata
|
14
|
+
clientTrusted: boolean
|
15
|
+
onAccept: () => void
|
16
|
+
acceptLabel?: string
|
17
|
+
|
18
|
+
onReject: () => void
|
19
|
+
rejectLabel?: string
|
20
|
+
|
21
|
+
onBack?: () => void
|
22
|
+
backLabel?: string
|
23
|
+
}
|
24
|
+
|
25
|
+
export function AcceptForm({
|
26
|
+
account,
|
27
|
+
clientId,
|
28
|
+
clientMetadata,
|
29
|
+
clientTrusted,
|
30
|
+
onAccept,
|
31
|
+
acceptLabel = 'Accept',
|
32
|
+
onReject,
|
33
|
+
rejectLabel = 'Deny access',
|
34
|
+
onBack,
|
35
|
+
backLabel = 'Back',
|
36
|
+
|
37
|
+
...attrs
|
38
|
+
}: AcceptFormProps & HTMLAttributes<HTMLDivElement>) {
|
39
|
+
return (
|
40
|
+
<div {...attrs} className={clsx('flex flex-col', attrs.className)}>
|
41
|
+
{clientTrusted && clientMetadata.logo_uri && (
|
42
|
+
<div className="flex items-center justify-center mb-4">
|
43
|
+
<img
|
44
|
+
crossOrigin="anonymous"
|
45
|
+
src={clientMetadata.logo_uri}
|
46
|
+
alt={clientMetadata.client_name}
|
47
|
+
className="w-16 h-16 rounded-full"
|
48
|
+
/>
|
49
|
+
</div>
|
50
|
+
)}
|
51
|
+
|
52
|
+
<ClientName
|
53
|
+
clientId={clientId}
|
54
|
+
clientMetadata={clientMetadata}
|
55
|
+
as="h1"
|
56
|
+
className="text-2xl font-semibold text-center text-primary"
|
57
|
+
/>
|
58
|
+
|
59
|
+
<p className="mt-4">
|
60
|
+
<ClientIdentifier clientId={clientId} clientMetadata={clientMetadata} />{' '}
|
61
|
+
is asking for permission to access your{' '}
|
62
|
+
<AccountIdentifier account={account} /> account.
|
63
|
+
</p>
|
64
|
+
|
65
|
+
<p className="mt-4">
|
66
|
+
By clicking <b>{acceptLabel}</b>, you allow this application to access
|
67
|
+
your information in accordance to its{' '}
|
68
|
+
<a
|
69
|
+
href={clientMetadata.tos_uri}
|
70
|
+
rel="nofollow noopener"
|
71
|
+
target="_blank"
|
72
|
+
className="text-primary underline"
|
73
|
+
>
|
74
|
+
terms of service
|
75
|
+
</a>
|
76
|
+
.
|
77
|
+
</p>
|
78
|
+
|
79
|
+
<div className="flex-auto" />
|
80
|
+
|
81
|
+
<div className="p-4 flex flex-wrap items-center justify-between">
|
82
|
+
<button
|
83
|
+
type="button"
|
84
|
+
onClick={onAccept}
|
85
|
+
className="py-2 bg-transparent text-primary rounded-md font-semibold order-last"
|
86
|
+
>
|
87
|
+
{acceptLabel}
|
88
|
+
</button>
|
89
|
+
|
90
|
+
{onBack && (
|
91
|
+
<button
|
92
|
+
type="button"
|
93
|
+
onClick={() => onBack()}
|
94
|
+
className="mr-2 py-2 bg-transparent text-primary rounded-md font-light"
|
95
|
+
>
|
96
|
+
{backLabel}
|
97
|
+
</button>
|
98
|
+
)}
|
99
|
+
|
100
|
+
<div className="flex-auto"></div>
|
101
|
+
|
102
|
+
<button
|
103
|
+
type="button"
|
104
|
+
onClick={onReject}
|
105
|
+
className="mr-2 py-2 bg-transparent text-primary rounded-md font-light"
|
106
|
+
>
|
107
|
+
{rejectLabel}
|
108
|
+
</button>
|
109
|
+
</div>
|
110
|
+
</div>
|
111
|
+
)
|
112
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import { HTMLAttributes } from 'react'
|
2
|
+
|
3
|
+
import { Account } from '../backend-data'
|
4
|
+
|
5
|
+
export type AccountIdentifierProps = {
|
6
|
+
account: Account
|
7
|
+
}
|
8
|
+
|
9
|
+
export function AccountIdentifier({
|
10
|
+
account,
|
11
|
+
...attrs
|
12
|
+
}: AccountIdentifierProps & HTMLAttributes<Element>) {
|
13
|
+
return (
|
14
|
+
<b {...attrs}>
|
15
|
+
{account.preferred_username || account.email || account.sub}
|
16
|
+
</b>
|
17
|
+
)
|
18
|
+
}
|
@@ -0,0 +1,108 @@
|
|
1
|
+
import type { HTMLAttributes, ReactNode } from 'react'
|
2
|
+
import { Account } from '../backend-data'
|
3
|
+
import { clsx } from '../lib/clsx'
|
4
|
+
|
5
|
+
export type AccountPickerProps = {
|
6
|
+
accounts: readonly Account[]
|
7
|
+
|
8
|
+
onAccount: (account: Account) => void
|
9
|
+
accountAria?: (account: Account) => string
|
10
|
+
|
11
|
+
onOther?: () => void
|
12
|
+
otherLabel?: ReactNode
|
13
|
+
otherAria?: string
|
14
|
+
|
15
|
+
onBack?: () => void
|
16
|
+
backLabel?: ReactNode
|
17
|
+
backAria?: string
|
18
|
+
}
|
19
|
+
|
20
|
+
export function AccountPicker({
|
21
|
+
accounts,
|
22
|
+
|
23
|
+
onAccount,
|
24
|
+
accountAria = (a) => `Sign in as ${a.name}`,
|
25
|
+
|
26
|
+
onOther = undefined,
|
27
|
+
otherLabel = 'Other account',
|
28
|
+
otherAria = 'Login to account that is not listed',
|
29
|
+
|
30
|
+
onBack,
|
31
|
+
backAria,
|
32
|
+
backLabel = backAria,
|
33
|
+
|
34
|
+
className,
|
35
|
+
...attrs
|
36
|
+
}: AccountPickerProps & HTMLAttributes<HTMLDivElement>) {
|
37
|
+
return (
|
38
|
+
<div {...attrs} className={clsx('flex flex-col', className)}>
|
39
|
+
<p className="font-medium p-4">Sign in as...</p>
|
40
|
+
|
41
|
+
{accounts.map((account) => {
|
42
|
+
const [name, identifier] = [
|
43
|
+
account.name,
|
44
|
+
account.preferred_username,
|
45
|
+
account.email,
|
46
|
+
account.sub,
|
47
|
+
].filter(Boolean) as [string, string?]
|
48
|
+
|
49
|
+
return (
|
50
|
+
<button
|
51
|
+
key={account.sub}
|
52
|
+
className="cursor-pointer text-start flex items-center justify-between py-2 px-6 border-t border-b -mb-px hover:bg-slate-100 border-slate-200 dark:border-slate-700 dark:hover:bg-slate-900"
|
53
|
+
onClick={() => onAccount(account)}
|
54
|
+
role="button"
|
55
|
+
aria-label={accountAria(account)}
|
56
|
+
>
|
57
|
+
<div className="pr-2 flex items-center justify-start max-w-full overflow-hidden">
|
58
|
+
{account.picture && (
|
59
|
+
<img
|
60
|
+
crossOrigin="anonymous"
|
61
|
+
src={account.picture}
|
62
|
+
alt={name}
|
63
|
+
className="w-8 h-8 mr-2 rounded-full"
|
64
|
+
/>
|
65
|
+
)}
|
66
|
+
<div className="min-w-0 my-2 flex-auto truncate">
|
67
|
+
<span className="font-semibold">{name}</span>
|
68
|
+
{identifier && (
|
69
|
+
<span className="ml-2 text-sm text-neutral-500 dark:text-neutral-400">
|
70
|
+
{identifier}
|
71
|
+
</span>
|
72
|
+
)}
|
73
|
+
</div>
|
74
|
+
</div>
|
75
|
+
<span className="scale-x-50 font-semibold text-xl">></span>
|
76
|
+
</button>
|
77
|
+
)
|
78
|
+
})}
|
79
|
+
{onOther && (
|
80
|
+
<button
|
81
|
+
className="cursor-pointer text-start flex items-center justify-between py-2 px-6 border-t border-b hover:bg-slate-100 border-slate-200 dark:border-slate-700 dark:hover:bg-slate-900"
|
82
|
+
onClick={onOther}
|
83
|
+
aria-label={otherAria}
|
84
|
+
role="button"
|
85
|
+
>
|
86
|
+
<div className="min-w-0 my-2 flex-auto truncate">{otherLabel}</div>
|
87
|
+
|
88
|
+
<span className="scale-x-50 font-semibold text-xl">></span>
|
89
|
+
</button>
|
90
|
+
)}
|
91
|
+
|
92
|
+
<div className="flex-auto" />
|
93
|
+
|
94
|
+
{onBack && (
|
95
|
+
<div className="p-4 flex flex-wrap items-center justify-between">
|
96
|
+
<button
|
97
|
+
type="button"
|
98
|
+
onClick={() => onBack()}
|
99
|
+
className="py-2 bg-transparent text-primary rounded-md font-light"
|
100
|
+
aria-label={backAria}
|
101
|
+
>
|
102
|
+
{backLabel}
|
103
|
+
</button>
|
104
|
+
</div>
|
105
|
+
)}
|
106
|
+
</div>
|
107
|
+
)
|
108
|
+
}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
import { OAuthClientMetadata } from '@atproto/oauth-types'
|
2
|
+
import { HTMLAttributes } from 'react'
|
3
|
+
|
4
|
+
import { UrlViewer } from './url-viewer'
|
5
|
+
|
6
|
+
export type ClientIdentifierProps = {
|
7
|
+
clientId: string
|
8
|
+
clientMetadata: OAuthClientMetadata
|
9
|
+
as?: keyof JSX.IntrinsicElements
|
10
|
+
}
|
11
|
+
|
12
|
+
export function ClientIdentifier({
|
13
|
+
clientId,
|
14
|
+
clientMetadata,
|
15
|
+
as: As = 'span',
|
16
|
+
...attrs
|
17
|
+
}: ClientIdentifierProps & HTMLAttributes<Element>) {
|
18
|
+
if (clientMetadata.client_uri) {
|
19
|
+
return (
|
20
|
+
<UrlViewer
|
21
|
+
as={As}
|
22
|
+
{...attrs}
|
23
|
+
url={clientMetadata.client_uri}
|
24
|
+
proto
|
25
|
+
path
|
26
|
+
/>
|
27
|
+
)
|
28
|
+
}
|
29
|
+
|
30
|
+
// Fallback to the client ID
|
31
|
+
return <As {...attrs}>{clientId}</As>
|
32
|
+
}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
import { OAuthClientMetadata } from '@atproto/oauth-types'
|
2
|
+
import { HTMLAttributes } from 'react'
|
3
|
+
|
4
|
+
import { ClientIdentifier } from './client-identifier'
|
5
|
+
|
6
|
+
export type ClientNameProps = {
|
7
|
+
clientId: string
|
8
|
+
clientMetadata: OAuthClientMetadata
|
9
|
+
as?: keyof JSX.IntrinsicElements
|
10
|
+
}
|
11
|
+
|
12
|
+
export function ClientName({
|
13
|
+
clientId,
|
14
|
+
clientMetadata,
|
15
|
+
as: As = 'span',
|
16
|
+
...attrs
|
17
|
+
}: ClientNameProps & HTMLAttributes<Element>) {
|
18
|
+
if (clientMetadata.client_name) {
|
19
|
+
return <As {...attrs}>{clientMetadata.client_name}</As>
|
20
|
+
}
|
21
|
+
|
22
|
+
return (
|
23
|
+
<ClientIdentifier
|
24
|
+
clientId={clientId}
|
25
|
+
clientMetadata={clientMetadata}
|
26
|
+
as={As}
|
27
|
+
{...attrs}
|
28
|
+
/>
|
29
|
+
)
|
30
|
+
}
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import { HtmlHTMLAttributes } from 'react'
|
2
|
+
import { clsx } from '../lib/clsx'
|
3
|
+
|
4
|
+
export type ErrorCardProps = {
|
5
|
+
message?: null | string
|
6
|
+
role?: 'alert' | 'status'
|
7
|
+
}
|
8
|
+
|
9
|
+
export function ErrorCard({
|
10
|
+
message,
|
11
|
+
|
12
|
+
role = 'alert',
|
13
|
+
className,
|
14
|
+
...attrs
|
15
|
+
}: Partial<ErrorCardProps> &
|
16
|
+
Omit<HtmlHTMLAttributes<HTMLDivElement>, keyof ErrorCardProps | 'children'>) {
|
17
|
+
return (
|
18
|
+
<div
|
19
|
+
{...attrs}
|
20
|
+
className={clsx(
|
21
|
+
'flex items-center rounded bg-error py-1 px-2 text-white dark:text-black shadow-md',
|
22
|
+
className,
|
23
|
+
)}
|
24
|
+
role={role}
|
25
|
+
>
|
26
|
+
<svg
|
27
|
+
className="fill-current h-4 w-4"
|
28
|
+
xmlns="http://www.w3.org/2000/svg"
|
29
|
+
viewBox="0 0 20 20"
|
30
|
+
>
|
31
|
+
<path d="M2.93 17.07A10 10 0 1 1 17.07 2.93 10 10 0 0 1 2.93 17.07zm12.73-1.41A8 8 0 1 0 4.34 4.34a8 8 0 0 0 11.32 11.32zM9 11V9h2v6H9v-4zm0-6h2v2H9V5z" />
|
32
|
+
</svg>
|
33
|
+
|
34
|
+
<div className="ml-4">
|
35
|
+
<p>
|
36
|
+
{typeof message === 'string' ? message : 'An unknown error occurred'}
|
37
|
+
</p>
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
)
|
41
|
+
}
|
@@ -0,0 +1,42 @@
|
|
1
|
+
import { HTMLAttributes } from 'react'
|
2
|
+
import { LinkDefinition } from '../backend-data'
|
3
|
+
import { clsx } from '../lib/clsx'
|
4
|
+
|
5
|
+
export type HelpCardProps = {
|
6
|
+
links?: readonly LinkDefinition[]
|
7
|
+
}
|
8
|
+
|
9
|
+
export function HelpCard({
|
10
|
+
links,
|
11
|
+
|
12
|
+
className,
|
13
|
+
...attrs
|
14
|
+
}: HelpCardProps &
|
15
|
+
Omit<
|
16
|
+
HTMLAttributes<HTMLParagraphElement>,
|
17
|
+
keyof HelpCardProps | 'children'
|
18
|
+
>) {
|
19
|
+
const helpLink = links?.find((l) => l.rel === 'help')
|
20
|
+
|
21
|
+
if (!helpLink) return null
|
22
|
+
|
23
|
+
return (
|
24
|
+
<p
|
25
|
+
className={clsx(
|
26
|
+
'text-sm rounded-md bg-slate-100 text-slate-800 dark:bg-slate-800 dark:text-slate-400 p-3',
|
27
|
+
className,
|
28
|
+
)}
|
29
|
+
{...attrs}
|
30
|
+
>
|
31
|
+
Having trouble?{' '}
|
32
|
+
<a
|
33
|
+
href={helpLink.href}
|
34
|
+
rel={helpLink.rel}
|
35
|
+
target="_blank"
|
36
|
+
className="text-primary"
|
37
|
+
>
|
38
|
+
Contact {helpLink.title}
|
39
|
+
</a>
|
40
|
+
</p>
|
41
|
+
)
|
42
|
+
}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
import { HTMLAttributes, ReactNode } from 'react'
|
2
|
+
import { clsx } from '../lib/clsx'
|
3
|
+
|
4
|
+
export type LayoutTitlePageProps = {
|
5
|
+
title?: ReactNode
|
6
|
+
subtitle?: ReactNode
|
7
|
+
}
|
8
|
+
|
9
|
+
export function LayoutTitlePage({
|
10
|
+
children,
|
11
|
+
title,
|
12
|
+
subtitle,
|
13
|
+
...attrs
|
14
|
+
}: LayoutTitlePageProps &
|
15
|
+
Omit<HTMLAttributes<HTMLDivElement>, keyof LayoutTitlePageProps>) {
|
16
|
+
return (
|
17
|
+
<div
|
18
|
+
{...attrs}
|
19
|
+
className={clsx(
|
20
|
+
attrs.className,
|
21
|
+
'flex justify-center items-stretch min-h-screen bg-white text-slate-900 dark:bg-slate-900 dark:text-slate-100',
|
22
|
+
)}
|
23
|
+
>
|
24
|
+
<div className="w-1/2 hidden p-4 md:grid content-center justify-items-end text-right dark:bg-transparent dark:border-r bg-slate-100 dark:bg-slate-800 dark:border-slate-700">
|
25
|
+
{title && (
|
26
|
+
<h1 className="text-3xl lg:text-5xl mt-4 font-semibold mb-4 text-primary">
|
27
|
+
{title}
|
28
|
+
</h1>
|
29
|
+
)}
|
30
|
+
|
31
|
+
{subtitle && (
|
32
|
+
<p className="max-w-xs text-slate-500 dark:text-slate-500">
|
33
|
+
{subtitle}
|
34
|
+
</p>
|
35
|
+
)}
|
36
|
+
</div>
|
37
|
+
|
38
|
+
<div className="flex items-stretch md:items-center w-full justify-center px-6 md:justify-start md:px-12">
|
39
|
+
{children}
|
40
|
+
</div>
|
41
|
+
</div>
|
42
|
+
)
|
43
|
+
}
|
@@ -0,0 +1,58 @@
|
|
1
|
+
import { PropsWithChildren } from 'react'
|
2
|
+
|
3
|
+
export type LayoutWelcomeProps = {
|
4
|
+
name?: string
|
5
|
+
logo?: string
|
6
|
+
links?: Array<{
|
7
|
+
title: string
|
8
|
+
href: string
|
9
|
+
rel?: string
|
10
|
+
}>
|
11
|
+
logoAlt?: string
|
12
|
+
}
|
13
|
+
|
14
|
+
export function LayoutWelcome({
|
15
|
+
name,
|
16
|
+
logo,
|
17
|
+
logoAlt = name || 'Logo',
|
18
|
+
links,
|
19
|
+
children,
|
20
|
+
}: PropsWithChildren<LayoutWelcomeProps>) {
|
21
|
+
return (
|
22
|
+
<div className="min-h-screen w-full flex items-center justify-center flex-col bg-white text-slate-900 dark:bg-slate-900 dark:text-slate-100">
|
23
|
+
<div className="w-full max-w-screen-sm overflow-hidden flex-grow flex flex-col items-center justify-center">
|
24
|
+
{logo && (
|
25
|
+
<img
|
26
|
+
src={logo}
|
27
|
+
alt={logoAlt}
|
28
|
+
className="w-16 h-16 md:w-24 md:h-24 mb-8"
|
29
|
+
/>
|
30
|
+
)}
|
31
|
+
|
32
|
+
{name && (
|
33
|
+
<h1 className="text-2xl md:text-4xl mb-8 mx-4 text-center font-bold">
|
34
|
+
{name}
|
35
|
+
</h1>
|
36
|
+
)}
|
37
|
+
|
38
|
+
{children}
|
39
|
+
</div>
|
40
|
+
|
41
|
+
{links != null && links.length > 0 && (
|
42
|
+
<nav className="w-full max-w-screen-sm overflow-hidden mt-4 border-t border-t-slate-200 dark:border-t-slate-700 flex flex-wrap justify-center">
|
43
|
+
{links.map((link) => (
|
44
|
+
<a
|
45
|
+
key={link.href}
|
46
|
+
href={link.href}
|
47
|
+
rel={link.rel}
|
48
|
+
target="_blank"
|
49
|
+
className="m-2 md:m-4 text-xs md:text-sm text-primary hover:underline"
|
50
|
+
>
|
51
|
+
{link.title}
|
52
|
+
</a>
|
53
|
+
))}
|
54
|
+
</nav>
|
55
|
+
)}
|
56
|
+
</div>
|
57
|
+
)
|
58
|
+
}
|