@atproto/oauth-provider 0.3.1 → 0.5.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/.linguirc +57 -0
- package/CHANGELOG.md +29 -0
- package/LICENSE.txt +1 -1
- package/dist/account/account-manager.d.ts +17 -3
- package/dist/account/account-manager.d.ts.map +1 -1
- package/dist/account/account-manager.js +102 -8
- package/dist/account/account-manager.js.map +1 -1
- package/dist/account/account-store.d.ts +81 -15
- package/dist/account/account-store.d.ts.map +1 -1
- package/dist/account/account-store.js +70 -19
- package/dist/account/account-store.js.map +1 -1
- package/dist/account/sign-in-data.d.ts +28 -0
- package/dist/account/sign-in-data.d.ts.map +1 -0
- package/dist/account/sign-in-data.js +16 -0
- package/dist/account/sign-in-data.js.map +1 -0
- package/dist/account/sign-up-data.d.ts +26 -0
- package/dist/account/sign-up-data.d.ts.map +1 -0
- package/dist/account/sign-up-data.js +11 -0
- package/dist/account/sign-up-data.js.map +1 -0
- package/dist/assets/app/bundle-manifest.json +598 -6
- package/dist/assets/app/index-ItwwtJ8r.js +36 -0
- package/dist/assets/app/index-ItwwtJ8r.js.map +1 -0
- package/dist/assets/app/main-B_dNxQo_.js +4 -0
- package/dist/assets/app/main-B_dNxQo_.js.map +1 -0
- package/dist/assets/app/main-CSatvmRR.css +3 -0
- package/dist/assets/app/main-CSatvmRR.js +306 -0
- package/dist/assets/app/main-CSatvmRR.js.map +1 -0
- package/dist/assets/app/messages-BQeltXSF.js +4 -0
- package/dist/assets/app/messages-BQeltXSF.js.map +1 -0
- package/dist/assets/app/messages-BQkEhfjg.js +4 -0
- package/dist/assets/app/messages-BQkEhfjg.js.map +1 -0
- package/dist/assets/app/messages-BUjKj_UJ.js +4 -0
- package/dist/assets/app/messages-BUjKj_UJ.js.map +1 -0
- package/dist/assets/app/messages-BWIQa8fO.js +4 -0
- package/dist/assets/app/messages-BWIQa8fO.js.map +1 -0
- package/dist/assets/app/messages-BaNVb0bp.js +4 -0
- package/dist/assets/app/messages-BaNVb0bp.js.map +1 -0
- package/dist/assets/app/messages-BaizVXcF.js +4 -0
- package/dist/assets/app/messages-BaizVXcF.js.map +1 -0
- package/dist/assets/app/messages-BfoClA1Y.js +4 -0
- package/dist/assets/app/messages-BfoClA1Y.js.map +1 -0
- package/dist/assets/app/messages-BsKGDZnC.js +4 -0
- package/dist/assets/app/messages-BsKGDZnC.js.map +1 -0
- package/dist/assets/app/messages-Bu-TJhml.js +4 -0
- package/dist/assets/app/messages-Bu-TJhml.js.map +1 -0
- package/dist/assets/app/messages-BvOKnBQk.js +4 -0
- package/dist/assets/app/messages-BvOKnBQk.js.map +1 -0
- package/dist/assets/app/messages-BxDzCiWz.js +4 -0
- package/dist/assets/app/messages-BxDzCiWz.js.map +1 -0
- package/dist/assets/app/messages-CDgFOy4S.js +4 -0
- package/dist/assets/app/messages-CDgFOy4S.js.map +1 -0
- package/dist/assets/app/messages-CLbTz0o9.js +4 -0
- package/dist/assets/app/messages-CLbTz0o9.js.map +1 -0
- package/dist/assets/app/messages-CNwSh0t7.js +4 -0
- package/dist/assets/app/messages-CNwSh0t7.js.map +1 -0
- package/dist/assets/app/messages-CSMNJ6P8.js +4 -0
- package/dist/assets/app/messages-CSMNJ6P8.js.map +1 -0
- package/dist/assets/app/messages-CZQUw3mp.js +4 -0
- package/dist/assets/app/messages-CZQUw3mp.js.map +1 -0
- package/dist/assets/app/messages-CZT41oVp.js +4 -0
- package/dist/assets/app/messages-CZT41oVp.js.map +1 -0
- package/dist/assets/app/messages-C_b-d3t8.js +4 -0
- package/dist/assets/app/messages-C_b-d3t8.js.map +1 -0
- package/dist/assets/app/messages-C_u3MTc2.js +4 -0
- package/dist/assets/app/messages-C_u3MTc2.js.map +1 -0
- package/dist/assets/app/messages-Cn8nHZic.js +4 -0
- package/dist/assets/app/messages-Cn8nHZic.js.map +1 -0
- package/dist/assets/app/messages-CtDywJUm.js +4 -0
- package/dist/assets/app/messages-CtDywJUm.js.map +1 -0
- package/dist/assets/app/messages-CurtIjBF.js +4 -0
- package/dist/assets/app/messages-CurtIjBF.js.map +1 -0
- package/dist/assets/app/messages-Cv6zIbaP.js +4 -0
- package/dist/assets/app/messages-Cv6zIbaP.js.map +1 -0
- package/dist/assets/app/messages-D1eLQuPE.js +4 -0
- package/dist/assets/app/messages-D1eLQuPE.js.map +1 -0
- package/dist/assets/app/messages-D8vHEaYW.js +4 -0
- package/dist/assets/app/messages-D8vHEaYW.js.map +1 -0
- package/dist/assets/app/messages-DJ1Q4GeC.js +4 -0
- package/dist/assets/app/messages-DJ1Q4GeC.js.map +1 -0
- package/dist/assets/app/messages-DRL3exqd.js +4 -0
- package/dist/assets/app/messages-DRL3exqd.js.map +1 -0
- package/dist/assets/app/messages-DWLPQRTp.js +4 -0
- package/dist/assets/app/messages-DWLPQRTp.js.map +1 -0
- package/dist/assets/app/messages-DjVaE9YE.js +4 -0
- package/dist/assets/app/messages-DjVaE9YE.js.map +1 -0
- package/dist/assets/app/messages-DqpMfFJR.js +4 -0
- package/dist/assets/app/messages-DqpMfFJR.js.map +1 -0
- package/dist/assets/app/messages-ETjhJBEN.js +4 -0
- package/dist/assets/app/messages-ETjhJBEN.js.map +1 -0
- package/dist/assets/app/messages-EUKrgrGn.js +4 -0
- package/dist/assets/app/messages-EUKrgrGn.js.map +1 -0
- package/dist/assets/app/messages-QQrOUcPW.js +4 -0
- package/dist/assets/app/messages-QQrOUcPW.js.map +1 -0
- package/dist/assets/app/messages-e2QGqFL6.js +4 -0
- package/dist/assets/app/messages-e2QGqFL6.js.map +1 -0
- package/dist/assets/app/messages-p61py7gD.js +4 -0
- package/dist/assets/app/messages-p61py7gD.js.map +1 -0
- package/dist/assets/asset.d.ts +1 -0
- package/dist/assets/asset.d.ts.map +1 -1
- package/dist/assets/assets-middleware.d.ts.map +1 -1
- package/dist/assets/assets-middleware.js +12 -7
- package/dist/assets/assets-middleware.js.map +1 -1
- package/dist/assets/index.d.ts +3 -2
- package/dist/assets/index.d.ts.map +1 -1
- package/dist/assets/index.js +13 -1
- package/dist/assets/index.js.map +1 -1
- package/dist/client/client-store.d.ts +3 -3
- package/dist/client/client-store.d.ts.map +1 -1
- package/dist/client/client-store.js +6 -5
- package/dist/client/client-store.js.map +1 -1
- package/dist/device/device-manager.d.ts +12 -13
- package/dist/device/device-manager.d.ts.map +1 -1
- package/dist/device/device-manager.js +5 -3
- package/dist/device/device-manager.js.map +1 -1
- package/dist/device/device-store.d.ts +3 -3
- package/dist/device/device-store.d.ts.map +1 -1
- package/dist/device/device-store.js +10 -9
- package/dist/device/device-store.js.map +1 -1
- package/dist/dpop/dpop-manager.d.ts +15 -7
- package/dist/dpop/dpop-manager.d.ts.map +1 -1
- package/dist/dpop/dpop-manager.js +17 -3
- package/dist/dpop/dpop-manager.js.map +1 -1
- package/dist/dpop/dpop-nonce.d.ts +11 -5
- package/dist/dpop/dpop-nonce.d.ts.map +1 -1
- package/dist/dpop/dpop-nonce.js +47 -38
- package/dist/dpop/dpop-nonce.js.map +1 -1
- package/dist/errors/handle-unavailable-error.d.ts +11 -0
- package/dist/errors/handle-unavailable-error.d.ts.map +1 -0
- package/dist/errors/handle-unavailable-error.js +19 -0
- package/dist/errors/handle-unavailable-error.js.map +1 -0
- package/dist/errors/invalid-request-error.d.ts +6 -8
- package/dist/errors/invalid-request-error.d.ts.map +1 -1
- package/dist/errors/invalid-request-error.js +10 -8
- package/dist/errors/invalid-request-error.js.map +1 -1
- package/dist/lib/csp/index.d.ts +18 -0
- package/dist/lib/csp/index.d.ts.map +1 -0
- package/dist/lib/csp/index.js +72 -0
- package/dist/lib/csp/index.js.map +1 -0
- package/dist/lib/hcaptcha.d.ts +177 -0
- package/dist/lib/hcaptcha.d.ts.map +1 -0
- package/dist/lib/hcaptcha.js +155 -0
- package/dist/lib/hcaptcha.js.map +1 -0
- package/dist/lib/html/build-document.d.ts +11 -3
- package/dist/lib/html/build-document.d.ts.map +1 -1
- package/dist/lib/html/build-document.js +51 -15
- package/dist/lib/html/build-document.js.map +1 -1
- package/dist/lib/http/middleware.d.ts.map +1 -1
- package/dist/lib/http/middleware.js +4 -1
- package/dist/lib/http/middleware.js.map +1 -1
- package/dist/lib/http/request.d.ts +18 -3
- package/dist/lib/http/request.d.ts.map +1 -1
- package/dist/lib/http/request.js +56 -23
- package/dist/lib/http/request.js.map +1 -1
- package/dist/lib/http/response.d.ts +4 -2
- package/dist/lib/http/response.d.ts.map +1 -1
- package/dist/lib/http/response.js +23 -5
- package/dist/lib/http/response.js.map +1 -1
- package/dist/lib/locale.d.ts +15 -0
- package/dist/lib/locale.d.ts.map +1 -0
- package/dist/lib/locale.js +17 -0
- package/dist/lib/locale.js.map +1 -0
- package/dist/lib/util/function.d.ts +2 -2
- package/dist/lib/util/function.d.ts.map +1 -1
- package/dist/lib/util/function.js.map +1 -1
- package/dist/lib/util/type.d.ts +88 -1
- package/dist/lib/util/type.d.ts.map +1 -1
- package/dist/lib/util/type.js +41 -0
- package/dist/lib/util/type.js.map +1 -1
- package/dist/metadata/build-metadata.d.ts +2 -2
- package/dist/metadata/build-metadata.d.ts.map +1 -1
- package/dist/metadata/build-metadata.js.map +1 -1
- package/dist/oauth-errors.d.ts +1 -0
- package/dist/oauth-errors.d.ts.map +1 -1
- package/dist/oauth-errors.js +3 -1
- package/dist/oauth-errors.js.map +1 -1
- package/dist/oauth-hooks.d.ts +60 -3
- package/dist/oauth-hooks.d.ts.map +1 -1
- package/dist/oauth-hooks.js +3 -3
- package/dist/oauth-hooks.js.map +1 -1
- package/dist/oauth-provider.d.ts +28 -22
- package/dist/oauth-provider.d.ts.map +1 -1
- package/dist/oauth-provider.js +212 -211
- package/dist/oauth-provider.js.map +1 -1
- package/dist/oauth-verifier.d.ts +1 -1
- package/dist/oauth-verifier.d.ts.map +1 -1
- package/dist/oauth-verifier.js +2 -1
- package/dist/oauth-verifier.js.map +1 -1
- package/dist/output/build-authorize-data.d.ts +0 -1
- package/dist/output/build-authorize-data.d.ts.map +1 -1
- package/dist/output/build-authorize-data.js +0 -1
- package/dist/output/build-authorize-data.js.map +1 -1
- package/dist/output/build-customization-data.d.ts +232 -0
- package/dist/output/build-customization-data.d.ts.map +1 -0
- package/dist/output/build-customization-data.js +145 -0
- package/dist/output/build-customization-data.js.map +1 -0
- package/dist/output/output-manager.d.ts +16 -9
- package/dist/output/output-manager.d.ts.map +1 -1
- package/dist/output/output-manager.js +78 -42
- package/dist/output/output-manager.js.map +1 -1
- package/dist/output/send-authorize-redirect.d.ts +9 -6
- package/dist/output/send-authorize-redirect.d.ts.map +1 -1
- package/dist/output/send-authorize-redirect.js +20 -14
- package/dist/output/send-authorize-redirect.js.map +1 -1
- package/dist/output/send-web-page.d.ts +7 -2
- package/dist/output/send-web-page.d.ts.map +1 -1
- package/dist/output/send-web-page.js +37 -21
- package/dist/output/send-web-page.js.map +1 -1
- package/dist/request/request-manager.d.ts +1 -1
- package/dist/request/request-manager.d.ts.map +1 -1
- package/dist/request/request-manager.js +4 -4
- package/dist/request/request-manager.js.map +1 -1
- package/dist/request/request-store.d.ts +3 -3
- package/dist/request/request-store.d.ts.map +1 -1
- package/dist/request/request-store.js +11 -10
- package/dist/request/request-store.js.map +1 -1
- package/dist/token/token-store.d.ts +4 -4
- package/dist/token/token-store.d.ts.map +1 -1
- package/dist/token/token-store.js +13 -12
- package/dist/token/token-store.js.map +1 -1
- package/package.json +46 -21
- package/rollup.config.js +61 -17
- package/src/account/account-manager.ts +159 -8
- package/src/account/account-store.ts +127 -32
- package/src/account/sign-in-data.ts +15 -0
- package/src/account/sign-up-data.ts +11 -0
- package/src/assets/app/app.tsx +31 -16
- package/src/assets/app/backend-data.ts +15 -60
- package/src/assets/app/backend-types.ts +66 -0
- package/src/assets/app/components/forms/button-toggle-visibility.tsx +43 -0
- package/src/assets/app/components/forms/button.tsx +60 -0
- package/src/assets/app/components/forms/fieldset.tsx +55 -0
- package/src/assets/app/components/forms/form-card-async.tsx +103 -0
- package/src/assets/app/components/forms/form-card.tsx +49 -0
- package/src/assets/app/components/forms/input-checkbox.tsx +73 -0
- package/src/assets/app/components/forms/input-container.tsx +107 -0
- package/src/assets/app/components/forms/input-email-address.tsx +66 -0
- package/src/assets/app/components/forms/input-new-password.tsx +62 -0
- package/src/assets/app/components/forms/input-password.tsx +88 -0
- package/src/assets/app/components/forms/input-text.tsx +76 -0
- package/src/assets/app/components/forms/input-token.tsx +94 -0
- package/src/assets/app/components/forms/wizard-card.tsx +116 -0
- package/src/assets/app/components/layouts/layout-title-page.tsx +77 -0
- package/src/assets/app/components/layouts/layout-welcome.tsx +73 -0
- package/src/assets/app/components/utils/account-identifier.tsx +23 -0
- package/src/assets/app/components/utils/account-image.tsx +33 -0
- package/src/assets/app/components/utils/admonition.tsx +52 -0
- package/src/assets/app/components/utils/client-name.tsx +45 -0
- package/src/assets/app/components/utils/error-card.tsx +93 -0
- package/src/assets/app/components/utils/error-message.tsx +62 -0
- package/src/assets/app/components/utils/help-card.tsx +46 -0
- package/src/assets/app/components/utils/icons.tsx +88 -0
- package/src/assets/app/components/utils/link-anchor.tsx +28 -0
- package/src/assets/app/components/utils/link-title.tsx +26 -0
- package/src/assets/app/components/utils/multi-lang-string.tsx +56 -0
- package/src/assets/app/components/utils/password-strength-label.tsx +37 -0
- package/src/assets/app/components/utils/password-strength-meter.tsx +58 -0
- package/src/assets/app/components/{url-viewer.tsx → utils/url-viewer.tsx} +9 -6
- package/src/assets/app/hooks/use-api.ts +128 -55
- package/src/assets/app/hooks/use-async-action.ts +120 -0
- package/src/assets/app/hooks/use-browser-color-scheme.ts +31 -0
- package/src/assets/app/hooks/use-csrf-token.ts +1 -1
- package/src/assets/app/hooks/use-random-string.ts +37 -0
- package/src/assets/app/hooks/use-stepper.ts +87 -0
- package/src/assets/app/index.html +182 -0
- package/src/assets/app/lib/api.ts +248 -79
- package/src/assets/app/lib/clsx.ts +5 -8
- package/src/assets/app/lib/json-client.ts +94 -0
- package/src/assets/app/lib/password.ts +98 -0
- package/src/assets/app/lib/ref.ts +17 -0
- package/src/assets/app/locales/an/messages.po +492 -0
- package/src/assets/app/locales/ast/messages.po +492 -0
- package/src/assets/app/locales/ca/messages.po +492 -0
- package/src/assets/app/locales/da/messages.po +492 -0
- package/src/assets/app/locales/de/messages.po +492 -0
- package/src/assets/app/locales/el/messages.po +492 -0
- package/src/assets/app/locales/en/messages.po +492 -0
- package/src/assets/app/locales/en-GB/messages.po +492 -0
- package/src/assets/app/locales/es/messages.po +492 -0
- package/src/assets/app/locales/eu/messages.po +492 -0
- package/src/assets/app/locales/fi/messages.po +492 -0
- package/src/assets/app/locales/fr/messages.po +492 -0
- package/src/assets/app/locales/ga/messages.po +492 -0
- package/src/assets/app/locales/gl/messages.po +492 -0
- package/src/assets/app/locales/hi/messages.po +492 -0
- package/src/assets/app/locales/hu/messages.po +492 -0
- package/src/assets/app/locales/ia/messages.po +492 -0
- package/src/assets/app/locales/id/messages.po +492 -0
- package/src/assets/app/locales/it/messages.po +492 -0
- package/src/assets/app/locales/ja/messages.po +492 -0
- package/src/assets/app/locales/km/messages.po +492 -0
- package/src/assets/app/locales/ko/messages.po +492 -0
- package/src/assets/app/locales/load.ts +8 -0
- package/src/assets/app/locales/locale-context.ts +19 -0
- package/src/assets/app/locales/locale-provider.tsx +112 -0
- package/src/assets/app/locales/locale-selector.tsx +58 -0
- package/src/assets/app/locales/locales.ts +168 -0
- package/src/assets/app/locales/ne/messages.po +492 -0
- package/src/assets/app/locales/nl/messages.po +492 -0
- package/src/assets/app/locales/pl/messages.po +492 -0
- package/src/assets/app/locales/pt-BR/messages.po +492 -0
- package/src/assets/app/locales/ro/messages.po +492 -0
- package/src/assets/app/locales/ru/messages.po +492 -0
- package/src/assets/app/locales/sv/messages.po +492 -0
- package/src/assets/app/locales/th/messages.po +492 -0
- package/src/assets/app/locales/tr/messages.po +492 -0
- package/src/assets/app/locales/uk/messages.po +492 -0
- package/src/assets/app/locales/vi/messages.po +492 -0
- package/src/assets/app/locales/zh-CN/messages.po +492 -0
- package/src/assets/app/locales/zh-HK/messages.po +492 -0
- package/src/assets/app/locales/zh-TW/messages.po +492 -0
- package/src/assets/app/main.css +23 -2
- package/src/assets/app/main.tsx +24 -8
- package/src/assets/app/views/authorize/accept/accept-form.tsx +150 -0
- package/src/assets/app/views/authorize/accept/accept-view.tsx +70 -0
- package/src/assets/app/views/authorize/authorize-view.tsx +180 -0
- package/src/assets/app/views/authorize/reset-password/reset-password-confirm-form.tsx +88 -0
- package/src/assets/app/views/authorize/reset-password/reset-password-request-form.tsx +80 -0
- package/src/assets/app/views/authorize/reset-password/reset-password-view.tsx +127 -0
- package/src/assets/app/views/authorize/sign-in/sign-in-form.tsx +244 -0
- package/src/assets/app/views/authorize/sign-in/sign-in-picker.tsx +116 -0
- package/src/assets/app/views/authorize/sign-in/sign-in-view.tsx +145 -0
- package/src/assets/app/views/authorize/sign-up/sign-up-account-form.tsx +140 -0
- package/src/assets/app/views/authorize/sign-up/sign-up-disclaimer.tsx +51 -0
- package/src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx +289 -0
- package/src/assets/app/views/authorize/sign-up/sign-up-hcaptcha-form.tsx +108 -0
- package/src/assets/app/views/authorize/sign-up/sign-up-view.tsx +158 -0
- package/src/assets/app/views/authorize/welcome/welcome-view.tsx +56 -0
- package/src/assets/app/views/error/error-view.tsx +31 -0
- package/src/assets/asset.ts +1 -0
- package/src/assets/assets-middleware.ts +13 -8
- package/src/assets/index.ts +15 -2
- package/src/client/client-store.ts +10 -12
- package/src/device/device-manager.ts +14 -15
- package/src/device/device-store.ts +9 -15
- package/src/dpop/dpop-manager.ts +20 -8
- package/src/dpop/dpop-nonce.ts +58 -40
- package/src/errors/handle-unavailable-error.ts +18 -0
- package/src/errors/invalid-request-error.ts +10 -8
- package/src/lib/csp/index.ts +98 -0
- package/src/lib/hcaptcha.ts +182 -0
- package/src/lib/html/build-document.ts +60 -16
- package/src/lib/http/middleware.ts +4 -3
- package/src/lib/http/request.ts +81 -28
- package/src/lib/http/response.ts +22 -9
- package/src/lib/locale.ts +21 -0
- package/src/lib/util/function.ts +0 -3
- package/src/lib/util/type.ts +130 -1
- package/src/metadata/build-metadata.ts +2 -1
- package/src/oauth-errors.ts +1 -0
- package/src/oauth-hooks.ts +69 -3
- package/src/oauth-provider.ts +410 -315
- package/src/oauth-verifier.ts +3 -1
- package/src/output/build-authorize-data.ts +1 -3
- package/src/output/build-customization-data.ts +189 -0
- package/src/output/output-manager.ts +111 -48
- package/src/output/send-authorize-redirect.ts +43 -36
- package/src/output/send-web-page.ts +40 -26
- package/src/request/request-manager.ts +4 -4
- package/src/request/request-store.ts +12 -16
- package/src/token/token-store.ts +14 -18
- package/tailwind.config.js +5 -0
- package/tsconfig.backend.tsbuildinfo +1 -1
- package/tsconfig.frontend.tsbuildinfo +1 -1
- package/tsconfig.tools.tsbuildinfo +1 -1
- package/vite.config.mjs +16 -0
- package/.postcssrc.yml +0 -3
- package/dist/assets/app/main.css +0 -3
- package/dist/assets/app/main.js +0 -20
- package/dist/assets/app/main.js.map +0 -1
- package/dist/output/customization.d.ts +0 -27
- package/dist/output/customization.d.ts.map +0 -1
- package/dist/output/customization.js +0 -88
- package/dist/output/customization.js.map +0 -1
- package/src/assets/app/components/accept-form.tsx +0 -137
- package/src/assets/app/components/account-identifier.tsx +0 -18
- package/src/assets/app/components/account-picker.tsx +0 -127
- package/src/assets/app/components/button.tsx +0 -34
- package/src/assets/app/components/client-name.tsx +0 -37
- package/src/assets/app/components/fieldset.tsx +0 -26
- package/src/assets/app/components/form-card.tsx +0 -47
- package/src/assets/app/components/help-card.tsx +0 -42
- package/src/assets/app/components/icons/alert-icon.tsx +0 -5
- package/src/assets/app/components/icons/at-symbol-icon.tsx +0 -5
- package/src/assets/app/components/icons/caret-right-icon.tsx +0 -5
- package/src/assets/app/components/icons/lock-icon.tsx +0 -5
- package/src/assets/app/components/icons/token-icon.tsx +0 -5
- package/src/assets/app/components/icons/util.tsx +0 -17
- package/src/assets/app/components/info-card.tsx +0 -45
- package/src/assets/app/components/input-checkbox.tsx +0 -47
- package/src/assets/app/components/input-container.tsx +0 -37
- package/src/assets/app/components/input-layout.tsx +0 -47
- package/src/assets/app/components/input-text.tsx +0 -69
- package/src/assets/app/components/layout-title-page.tsx +0 -60
- package/src/assets/app/components/layout-welcome.tsx +0 -74
- package/src/assets/app/components/sign-in-form.tsx +0 -337
- package/src/assets/app/components/sign-up-account-form.tsx +0 -194
- package/src/assets/app/components/sign-up-disclaimer.tsx +0 -44
- package/src/assets/app/views/accept-view.tsx +0 -55
- package/src/assets/app/views/authorize-view.tsx +0 -106
- package/src/assets/app/views/error-view.tsx +0 -36
- package/src/assets/app/views/sign-in-view.tsx +0 -111
- package/src/assets/app/views/sign-up-view.tsx +0 -86
- package/src/assets/app/views/welcome-view.tsx +0 -54
- package/src/output/customization.ts +0 -118
@@ -1,106 +0,0 @@
|
|
1
|
-
import { useEffect, useState } from 'react'
|
2
|
-
|
3
|
-
import type { AuthorizeData, CustomizationData } from '../backend-data'
|
4
|
-
import { LayoutTitlePage } from '../components/layout-title-page'
|
5
|
-
import { useApi } from '../hooks/use-api'
|
6
|
-
import { useBoundDispatch } from '../hooks/use-bound-dispatch'
|
7
|
-
import { AcceptView } from './accept-view'
|
8
|
-
import { SignInView } from './sign-in-view'
|
9
|
-
import { SignUpView } from './sign-up-view'
|
10
|
-
import { WelcomeView } from './welcome-view'
|
11
|
-
|
12
|
-
export type AuthorizeViewProps = {
|
13
|
-
authorizeData: AuthorizeData
|
14
|
-
customizationData?: CustomizationData
|
15
|
-
}
|
16
|
-
|
17
|
-
export function AuthorizeView({
|
18
|
-
authorizeData,
|
19
|
-
customizationData,
|
20
|
-
}: AuthorizeViewProps) {
|
21
|
-
const forceSignIn = authorizeData?.loginHint != null
|
22
|
-
|
23
|
-
const [view, setView] = useState<
|
24
|
-
'welcome' | 'sign-in' | 'sign-up' | 'accept' | 'done'
|
25
|
-
>(forceSignIn ? 'sign-in' : 'welcome')
|
26
|
-
|
27
|
-
const showDone = useBoundDispatch(setView, 'done')
|
28
|
-
const showSignIn = useBoundDispatch(setView, 'sign-in')
|
29
|
-
// const showSignUp = useBoundDispatch(setView, 'sign-up')
|
30
|
-
const showAccept = useBoundDispatch(setView, 'accept')
|
31
|
-
const showWelcome = useBoundDispatch(setView, 'welcome')
|
32
|
-
|
33
|
-
const { sessions, setSession, doAccept, doReject, doSignIn, doSignUp } =
|
34
|
-
useApi(authorizeData, { onRedirected: showDone })
|
35
|
-
|
36
|
-
const session = sessions.find((s) => s.selected && !s.loginRequired)
|
37
|
-
useEffect(() => {
|
38
|
-
if (session) {
|
39
|
-
if (session.consentRequired) showAccept()
|
40
|
-
else doAccept(session.account)
|
41
|
-
}
|
42
|
-
}, [session, doAccept, showAccept])
|
43
|
-
|
44
|
-
if (view === 'welcome') {
|
45
|
-
return (
|
46
|
-
<WelcomeView
|
47
|
-
name={customizationData?.name}
|
48
|
-
logo={customizationData?.logo}
|
49
|
-
links={customizationData?.links}
|
50
|
-
onSignIn={showSignIn}
|
51
|
-
// onSignUp={showSignUp}
|
52
|
-
onCancel={doReject}
|
53
|
-
/>
|
54
|
-
)
|
55
|
-
}
|
56
|
-
|
57
|
-
if (view === 'sign-up') {
|
58
|
-
return (
|
59
|
-
<SignUpView
|
60
|
-
links={customizationData?.links}
|
61
|
-
onSignUp={doSignUp}
|
62
|
-
onBack={showWelcome}
|
63
|
-
/>
|
64
|
-
)
|
65
|
-
}
|
66
|
-
|
67
|
-
if (view === 'sign-in') {
|
68
|
-
return (
|
69
|
-
<SignInView
|
70
|
-
loginHint={authorizeData.loginHint}
|
71
|
-
sessions={sessions}
|
72
|
-
setSession={setSession}
|
73
|
-
onSignIn={doSignIn}
|
74
|
-
onBack={forceSignIn ? doReject : showWelcome}
|
75
|
-
/>
|
76
|
-
)
|
77
|
-
}
|
78
|
-
|
79
|
-
if (view === 'accept' && session) {
|
80
|
-
return (
|
81
|
-
<AcceptView
|
82
|
-
clientId={authorizeData.clientId}
|
83
|
-
clientMetadata={authorizeData.clientMetadata}
|
84
|
-
clientTrusted={authorizeData.clientTrusted}
|
85
|
-
account={session.account}
|
86
|
-
scopeDetails={authorizeData.scopeDetails}
|
87
|
-
onAccept={() => doAccept(session.account)}
|
88
|
-
onReject={doReject}
|
89
|
-
onBack={
|
90
|
-
forceSignIn
|
91
|
-
? undefined
|
92
|
-
: () => {
|
93
|
-
setSession(null)
|
94
|
-
setView(sessions.length ? 'sign-in' : 'welcome')
|
95
|
-
}
|
96
|
-
}
|
97
|
-
/>
|
98
|
-
)
|
99
|
-
}
|
100
|
-
|
101
|
-
return (
|
102
|
-
<LayoutTitlePage title="Login complete">
|
103
|
-
You are being redirected...
|
104
|
-
</LayoutTitlePage>
|
105
|
-
)
|
106
|
-
}
|
@@ -1,36 +0,0 @@
|
|
1
|
-
import { CustomizationData, ErrorData } from '../backend-data'
|
2
|
-
import { InfoCard } from '../components/info-card'
|
3
|
-
import { LayoutWelcome, LayoutWelcomeProps } from '../components/layout-welcome'
|
4
|
-
import { Override } from '../lib/util'
|
5
|
-
|
6
|
-
export type ErrorViewProps = Override<
|
7
|
-
Omit<LayoutWelcomeProps, keyof CustomizationData>,
|
8
|
-
{
|
9
|
-
customizationData?: CustomizationData
|
10
|
-
errorData?: ErrorData
|
11
|
-
}
|
12
|
-
>
|
13
|
-
|
14
|
-
export function ErrorView({
|
15
|
-
errorData,
|
16
|
-
customizationData,
|
17
|
-
...props
|
18
|
-
}: ErrorViewProps) {
|
19
|
-
return (
|
20
|
-
<LayoutWelcome {...customizationData} {...props}>
|
21
|
-
<InfoCard role="alert">{getUserFriendlyMessage(errorData)}</InfoCard>
|
22
|
-
</LayoutWelcome>
|
23
|
-
)
|
24
|
-
}
|
25
|
-
|
26
|
-
function getUserFriendlyMessage(errorData?: ErrorData) {
|
27
|
-
const desc = errorData?.error_description
|
28
|
-
if (
|
29
|
-
desc === 'This request has expired' ||
|
30
|
-
desc?.startsWith('Unknown request_uri') // Request was removed from database
|
31
|
-
) {
|
32
|
-
return 'This sign-in session has expired'
|
33
|
-
} else {
|
34
|
-
return desc || 'An unknown error occurred'
|
35
|
-
}
|
36
|
-
}
|
@@ -1,111 +0,0 @@
|
|
1
|
-
import { useCallback, useEffect, useMemo, useState } from 'react'
|
2
|
-
|
3
|
-
import { Session } from '../backend-data'
|
4
|
-
import { AccountPicker } from '../components/account-picker'
|
5
|
-
import { LayoutTitlePage } from '../components/layout-title-page'
|
6
|
-
import { SignInForm, SignInFormOutput } from '../components/sign-in-form'
|
7
|
-
|
8
|
-
export type SignInViewProps = {
|
9
|
-
sessions: readonly Session[]
|
10
|
-
setSession: (sub: string | null) => void
|
11
|
-
loginHint?: string
|
12
|
-
|
13
|
-
onSignIn: (credentials: SignInFormOutput) => void | PromiseLike<void>
|
14
|
-
onBack?: () => void
|
15
|
-
}
|
16
|
-
|
17
|
-
export function SignInView({
|
18
|
-
loginHint,
|
19
|
-
sessions,
|
20
|
-
setSession,
|
21
|
-
|
22
|
-
onSignIn,
|
23
|
-
onBack,
|
24
|
-
}: SignInViewProps) {
|
25
|
-
const session = useMemo(() => sessions.find((s) => s.selected), [sessions])
|
26
|
-
const clearSession = useCallback(() => setSession(null), [setSession])
|
27
|
-
const accounts = useMemo(() => sessions.map((s) => s.account), [sessions])
|
28
|
-
const [showSignInForm, setShowSignInForm] = useState(sessions.length === 0)
|
29
|
-
|
30
|
-
useEffect(() => {
|
31
|
-
// Make sure the "back" action shows the account picker instead of the
|
32
|
-
// sign-in form (since the account was added to the list of current
|
33
|
-
// sessions).
|
34
|
-
if (session) setShowSignInForm(false)
|
35
|
-
}, [session])
|
36
|
-
|
37
|
-
if (session) {
|
38
|
-
// All set (parent view will handle the redirect)
|
39
|
-
if (!session.loginRequired) return null
|
40
|
-
|
41
|
-
return (
|
42
|
-
<LayoutTitlePage
|
43
|
-
title="Sign in"
|
44
|
-
subtitle="Confirm your password to continue"
|
45
|
-
>
|
46
|
-
<SignInForm
|
47
|
-
onSubmit={onSignIn}
|
48
|
-
onCancel={clearSession}
|
49
|
-
cancelAria="Back" // to account picker
|
50
|
-
usernameDefault={
|
51
|
-
session.account.preferred_username || session.account.sub
|
52
|
-
}
|
53
|
-
usernameReadonly={true}
|
54
|
-
rememberDefault={true}
|
55
|
-
/>
|
56
|
-
</LayoutTitlePage>
|
57
|
-
)
|
58
|
-
}
|
59
|
-
|
60
|
-
if (loginHint) {
|
61
|
-
return (
|
62
|
-
<LayoutTitlePage title="Sign in" subtitle="Enter your password">
|
63
|
-
<SignInForm
|
64
|
-
onSubmit={onSignIn}
|
65
|
-
onCancel={onBack}
|
66
|
-
cancelAria="Back"
|
67
|
-
usernameDefault={loginHint}
|
68
|
-
usernameReadonly={true}
|
69
|
-
/>
|
70
|
-
</LayoutTitlePage>
|
71
|
-
)
|
72
|
-
}
|
73
|
-
|
74
|
-
if (sessions.length === 0) {
|
75
|
-
return (
|
76
|
-
<LayoutTitlePage
|
77
|
-
title="Sign in"
|
78
|
-
subtitle="Enter your username and password"
|
79
|
-
>
|
80
|
-
<SignInForm onSubmit={onSignIn} onCancel={onBack} cancelAria="Back" />
|
81
|
-
</LayoutTitlePage>
|
82
|
-
)
|
83
|
-
}
|
84
|
-
|
85
|
-
if (showSignInForm) {
|
86
|
-
return (
|
87
|
-
<LayoutTitlePage
|
88
|
-
title="Sign in"
|
89
|
-
subtitle="Enter your username and password"
|
90
|
-
>
|
91
|
-
<SignInForm
|
92
|
-
onSubmit={onSignIn}
|
93
|
-
onCancel={() => setShowSignInForm(false)}
|
94
|
-
cancelAria="Back" // to account picker
|
95
|
-
/>
|
96
|
-
</LayoutTitlePage>
|
97
|
-
)
|
98
|
-
}
|
99
|
-
|
100
|
-
return (
|
101
|
-
<LayoutTitlePage title="Sign in" subtitle="Select from an existing account">
|
102
|
-
<AccountPicker
|
103
|
-
accounts={accounts}
|
104
|
-
onAccount={(a) => setSession(a.sub)}
|
105
|
-
onOther={() => setShowSignInForm(true)}
|
106
|
-
onBack={onBack}
|
107
|
-
backAria="Back" // to previous view
|
108
|
-
/>
|
109
|
-
</LayoutTitlePage>
|
110
|
-
)
|
111
|
-
}
|
@@ -1,86 +0,0 @@
|
|
1
|
-
import { ReactNode, useCallback, useState } from 'react'
|
2
|
-
|
3
|
-
import { LinkDefinition } from '../backend-data'
|
4
|
-
import { HelpCard } from '../components/help-card'
|
5
|
-
import { LayoutTitlePage } from '../components/layout-title-page'
|
6
|
-
import {
|
7
|
-
SignUpAccountForm,
|
8
|
-
SignUpAccountFormOutput,
|
9
|
-
} from '../components/sign-up-account-form'
|
10
|
-
import { SignUpDisclaimer } from '../components/sign-up-disclaimer'
|
11
|
-
import { Button } from '../components/button'
|
12
|
-
|
13
|
-
export type SignUpViewProps = {
|
14
|
-
stepName?: (step: number, total: number) => ReactNode
|
15
|
-
stepTitle?: (step: number, total: number) => ReactNode
|
16
|
-
|
17
|
-
links?: LinkDefinition[]
|
18
|
-
onSignUp: (data: {
|
19
|
-
username: string
|
20
|
-
password: string
|
21
|
-
extra?: Record<string, string>
|
22
|
-
}) => void | PromiseLike<void>
|
23
|
-
onBack?: () => void
|
24
|
-
}
|
25
|
-
|
26
|
-
export function SignUpView({
|
27
|
-
stepName = (step, total) => `Step ${step} of ${total}`,
|
28
|
-
stepTitle = (step, total) => {
|
29
|
-
switch (step) {
|
30
|
-
case 1:
|
31
|
-
return 'Your account'
|
32
|
-
default:
|
33
|
-
return null
|
34
|
-
}
|
35
|
-
},
|
36
|
-
|
37
|
-
links,
|
38
|
-
|
39
|
-
onSignUp,
|
40
|
-
onBack,
|
41
|
-
}: SignUpViewProps) {
|
42
|
-
const [_credentials, setCredentials] =
|
43
|
-
useState<null | SignUpAccountFormOutput>(null)
|
44
|
-
const [step, setStep] = useState<1 | 2>(1)
|
45
|
-
|
46
|
-
const stepCount = 2
|
47
|
-
|
48
|
-
const doSubmitAccount = useCallback(
|
49
|
-
(credentials: SignUpAccountFormOutput) => {
|
50
|
-
setCredentials(credentials)
|
51
|
-
setStep(2)
|
52
|
-
},
|
53
|
-
[onSignUp, setCredentials, setStep],
|
54
|
-
)
|
55
|
-
|
56
|
-
return (
|
57
|
-
<LayoutTitlePage
|
58
|
-
title="Create Account"
|
59
|
-
subtitle="We're so excited to have you join us!"
|
60
|
-
>
|
61
|
-
<div className="flex flex-col">
|
62
|
-
<p className="mt-4 text-slate-400 dark:text-slate-600">
|
63
|
-
{stepName(step, stepCount)}
|
64
|
-
</p>
|
65
|
-
<h2 className="font-medium text-xl mb-4">
|
66
|
-
{stepTitle(step, stepCount)}
|
67
|
-
</h2>
|
68
|
-
|
69
|
-
{step === 1 && (
|
70
|
-
<SignUpAccountForm
|
71
|
-
className="flex-grow"
|
72
|
-
onSubmit={doSubmitAccount}
|
73
|
-
onCancel={onBack}
|
74
|
-
cancelLabel="Back"
|
75
|
-
>
|
76
|
-
<SignUpDisclaimer links={links} />
|
77
|
-
</SignUpAccountForm>
|
78
|
-
)}
|
79
|
-
|
80
|
-
{step === 2 && <Button onClick={() => setStep(1)}>Back</Button>}
|
81
|
-
|
82
|
-
<HelpCard className="mb-4" links={links} />
|
83
|
-
</div>
|
84
|
-
</LayoutTitlePage>
|
85
|
-
)
|
86
|
-
}
|
@@ -1,54 +0,0 @@
|
|
1
|
-
import { Button } from '../components/button'
|
2
|
-
import { LayoutWelcome, LayoutWelcomeProps } from '../components/layout-welcome'
|
3
|
-
|
4
|
-
export type WelcomeViewParams = LayoutWelcomeProps & {
|
5
|
-
onSignIn?: () => void
|
6
|
-
signInLabel?: string
|
7
|
-
|
8
|
-
onSignUp?: () => void
|
9
|
-
signUpLabel?: string
|
10
|
-
|
11
|
-
onCancel?: () => void
|
12
|
-
cancelLabel?: string
|
13
|
-
}
|
14
|
-
|
15
|
-
export function WelcomeView({
|
16
|
-
onSignUp,
|
17
|
-
signUpLabel = 'Create a new account',
|
18
|
-
onSignIn,
|
19
|
-
signInLabel = 'Sign in',
|
20
|
-
onCancel,
|
21
|
-
cancelLabel = 'Cancel',
|
22
|
-
|
23
|
-
...props
|
24
|
-
}: WelcomeViewParams) {
|
25
|
-
return (
|
26
|
-
<LayoutWelcome {...props}>
|
27
|
-
{onSignUp && (
|
28
|
-
<Button
|
29
|
-
className={'m-1 w-60 max-w-full'}
|
30
|
-
color={onSignIn ? 'brand' : undefined}
|
31
|
-
onClick={onSignUp}
|
32
|
-
>
|
33
|
-
{signUpLabel}
|
34
|
-
</Button>
|
35
|
-
)}
|
36
|
-
|
37
|
-
{onSignIn && (
|
38
|
-
<Button
|
39
|
-
className={'m-1 w-60 max-w-full'}
|
40
|
-
color={onSignUp ? undefined : 'brand'}
|
41
|
-
onClick={onSignIn}
|
42
|
-
>
|
43
|
-
{signInLabel}
|
44
|
-
</Button>
|
45
|
-
)}
|
46
|
-
|
47
|
-
{onCancel && (
|
48
|
-
<Button className="m-1 w-60 max-w-full" onClick={onCancel}>
|
49
|
-
{cancelLabel}
|
50
|
-
</Button>
|
51
|
-
)}
|
52
|
-
</LayoutWelcome>
|
53
|
-
)
|
54
|
-
}
|
@@ -1,118 +0,0 @@
|
|
1
|
-
// Matches colors defined in tailwind.config.js
|
2
|
-
const colorNames = ['brand', 'error', 'warning'] as const
|
3
|
-
type ColorName = (typeof colorNames)[number]
|
4
|
-
const isColorName = (name: string): name is ColorName =>
|
5
|
-
(colorNames as readonly string[]).includes(name)
|
6
|
-
|
7
|
-
export type Customization = {
|
8
|
-
name?: string
|
9
|
-
logo?: string
|
10
|
-
colors?: { [_ in ColorName]?: string }
|
11
|
-
links?: Array<{
|
12
|
-
href: string
|
13
|
-
title: string
|
14
|
-
rel?: string
|
15
|
-
}>
|
16
|
-
}
|
17
|
-
|
18
|
-
export function buildCustomizationData({
|
19
|
-
name,
|
20
|
-
logo,
|
21
|
-
links,
|
22
|
-
}: Customization = {}) {
|
23
|
-
return {
|
24
|
-
name,
|
25
|
-
logo,
|
26
|
-
links,
|
27
|
-
}
|
28
|
-
}
|
29
|
-
|
30
|
-
export function buildCustomizationCss(customization?: Customization) {
|
31
|
-
const vars = Array.from(buildCustomizationVars(customization))
|
32
|
-
if (vars.length) return `:root { ${vars.join(' ')} }`
|
33
|
-
|
34
|
-
return ''
|
35
|
-
}
|
36
|
-
|
37
|
-
export function* buildCustomizationVars(customization?: Customization) {
|
38
|
-
if (customization?.colors) {
|
39
|
-
for (const [name, value] of Object.entries(customization.colors)) {
|
40
|
-
if (!isColorName(name)) {
|
41
|
-
throw new TypeError(`Invalid color name: ${name}`)
|
42
|
-
}
|
43
|
-
|
44
|
-
// Skip undefined values
|
45
|
-
if (value === undefined) continue
|
46
|
-
|
47
|
-
const { r, g, b, a } = parseColor(value)
|
48
|
-
|
49
|
-
// Tailwind does not apply alpha values to base colors
|
50
|
-
if (a !== undefined) throw new TypeError('Alpha not supported')
|
51
|
-
|
52
|
-
yield `--color-${name}: ${r} ${g} ${b};`
|
53
|
-
}
|
54
|
-
}
|
55
|
-
}
|
56
|
-
|
57
|
-
type RgbaColor = { r: number; g: number; b: number; a?: number }
|
58
|
-
function parseColor(color: unknown): RgbaColor {
|
59
|
-
if (typeof color !== 'string') {
|
60
|
-
throw new TypeError(`Invalid color value: ${typeof color}`)
|
61
|
-
}
|
62
|
-
|
63
|
-
if (color.startsWith('#')) {
|
64
|
-
if (color.length === 4 || color.length === 5) {
|
65
|
-
const r = parseUi8Hex(color.slice(1, 2))
|
66
|
-
const g = parseUi8Hex(color.slice(2, 3))
|
67
|
-
const b = parseUi8Hex(color.slice(3, 4))
|
68
|
-
const a = color.length > 4 ? parseUi8Hex(color.slice(4, 5)) : undefined
|
69
|
-
return { r, g, b, a }
|
70
|
-
}
|
71
|
-
|
72
|
-
if (color.length === 7 || color.length === 9) {
|
73
|
-
const r = parseUi8Hex(color.slice(1, 3))
|
74
|
-
const g = parseUi8Hex(color.slice(3, 5))
|
75
|
-
const b = parseUi8Hex(color.slice(5, 7))
|
76
|
-
const a = color.length > 8 ? parseUi8Hex(color.slice(7, 9)) : undefined
|
77
|
-
return { r, g, b, a }
|
78
|
-
}
|
79
|
-
|
80
|
-
throw new TypeError(`Invalid hex color: ${color}`)
|
81
|
-
}
|
82
|
-
|
83
|
-
const rgbMatch = color.match(
|
84
|
-
/^\s*rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)\s*$/,
|
85
|
-
)
|
86
|
-
if (rgbMatch) {
|
87
|
-
const r = parseUi8Dec(rgbMatch[1])
|
88
|
-
const g = parseUi8Dec(rgbMatch[2])
|
89
|
-
const b = parseUi8Dec(rgbMatch[3])
|
90
|
-
return { r, g, b }
|
91
|
-
}
|
92
|
-
|
93
|
-
const rgbaMatch = color.match(
|
94
|
-
/^\s*rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)\s*$/,
|
95
|
-
)
|
96
|
-
if (rgbaMatch) {
|
97
|
-
const r = parseUi8Dec(rgbaMatch[1])
|
98
|
-
const g = parseUi8Dec(rgbaMatch[2])
|
99
|
-
const b = parseUi8Dec(rgbaMatch[3])
|
100
|
-
const a = parseUi8Dec(rgbaMatch[4])
|
101
|
-
return { r, g, b, a }
|
102
|
-
}
|
103
|
-
|
104
|
-
throw new TypeError(`Unsupported color format: ${color}`)
|
105
|
-
}
|
106
|
-
|
107
|
-
function parseUi8Hex(v: string) {
|
108
|
-
return asUi8(parseInt(v, 16))
|
109
|
-
}
|
110
|
-
|
111
|
-
function parseUi8Dec(v: string) {
|
112
|
-
return asUi8(parseInt(v, 10))
|
113
|
-
}
|
114
|
-
|
115
|
-
function asUi8(v: number) {
|
116
|
-
if (v >= 0 && v <= 255 && v === (v | 0)) return v
|
117
|
-
throw new TypeError(`Invalid color component: ${v}`)
|
118
|
-
}
|