@cosmicdrift/kumiko-bundled-features 0.386.0 → 0.388.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/LICENSE +21 -57
- package/dist/agent-tools/tool-catalog.js +1 -1
- package/dist/agent-tools/tool-dispatch.d.ts +7 -7
- package/dist/agent-tools/tool-dispatch.js +9 -9
- package/dist/audit/handlers/audit-events.js +1 -1
- package/dist/audit/screens.js +1 -1
- package/dist/auth-email-password/feature.js +1 -1
- package/dist/auth-email-password/handlers/change-password.write.js +3 -3
- package/dist/auth-email-password/handlers/confirm-token-flow.js +5 -5
- package/dist/auth-email-password/handlers/invite-accept-with-login.write.js +1 -1
- package/dist/auth-email-password/handlers/invite-accept.write.js +18 -18
- package/dist/auth-email-password/handlers/invite-create.write.d.ts +2 -2
- package/dist/auth-email-password/handlers/invite-create.write.js +10 -10
- package/dist/auth-email-password/handlers/invite-info.query.js +1 -1
- package/dist/auth-email-password/handlers/invite-signup-complete.write.js +24 -26
- package/dist/auth-email-password/handlers/login.write.d.ts +1 -1
- package/dist/auth-email-password/handlers/login.write.js +1 -1
- package/dist/auth-email-password/handlers/self-registration-status.query.js +1 -1
- package/dist/auth-email-password/handlers/signup-confirm.write.js +34 -37
- package/dist/auth-email-password/handlers/signup-request.write.js +6 -7
- package/dist/auth-email-password/handlers/switch-tenant-mfa-gate.write.d.ts +1 -1
- package/dist/auth-email-password/handlers/switch-tenant-mfa-gate.write.js +1 -4
- package/dist/auth-email-password/index.js +5 -5
- package/dist/auth-email-password/lockout-store.js +1 -1
- package/dist/auth-email-password/seeding.d.ts +42 -45
- package/dist/auth-email-password/seeding.js +51 -53
- package/dist/auth-email-password/signup-token-store.js +8 -8
- package/dist/auth-email-password/testing.js +3 -3
- package/dist/auth-email-password/web/auth-client.d.ts +2 -2
- package/dist/auth-email-password/web/auth-client.js +36 -37
- package/dist/auth-email-password/web/auth-form-primitives.js +10 -10
- package/dist/auth-email-password/web/auth-gate.js +15 -16
- package/dist/auth-email-password/web/client-plugin.d.ts +7 -7
- package/dist/auth-email-password/web/client-plugin.js +4 -5
- package/dist/auth-email-password/web/confirm-account-unlock-screen.js +1 -1
- package/dist/auth-email-password/web/constants.js +3 -3
- package/dist/auth-email-password/web/default-topbar-actions.d.ts +8 -8
- package/dist/auth-email-password/web/default-topbar-actions.js +6 -6
- package/dist/auth-email-password/web/forgot-password-screen.d.ts +2 -2
- package/dist/auth-email-password/web/forgot-password-screen.js +9 -9
- package/dist/auth-email-password/web/index.js +5 -5
- package/dist/auth-email-password/web/invite-accept-screen.d.ts +1 -1
- package/dist/auth-email-password/web/invite-accept-screen.js +16 -16
- package/dist/auth-email-password/web/login-screen.d.ts +1 -1
- package/dist/auth-email-password/web/login-screen.js +2 -3
- package/dist/auth-email-password/web/reset-password-screen.d.ts +4 -4
- package/dist/auth-email-password/web/reset-password-screen.js +12 -13
- package/dist/auth-email-password/web/session.d.ts +10 -9
- package/dist/auth-email-password/web/session.js +28 -29
- package/dist/auth-email-password/web/signup-complete-screen.js +3 -3
- package/dist/auth-email-password/web/signup-screen.d.ts +1 -1
- package/dist/auth-email-password/web/signup-screen.js +13 -13
- package/dist/auth-email-password/web/tenant-switcher.d.ts +4 -4
- package/dist/auth-email-password/web/tenant-switcher.js +21 -22
- package/dist/auth-email-password/web/use-shell-user.js +12 -13
- package/dist/auth-email-password/web/user-menu.d.ts +4 -4
- package/dist/auth-email-password/web/user-menu.js +12 -13
- package/dist/auth-email-password/web/verify-email-screen.d.ts +2 -2
- package/dist/auth-email-password/web/verify-email-screen.js +9 -10
- package/dist/auth-foundation/boot-checks.js +4 -4
- package/dist/auth-foundation/resolve-anonymous-access.d.ts +1 -1
- package/dist/auth-foundation/resolve-anonymous-access.js +3 -3
- package/dist/auth-foundation/types.js +2 -2
- package/dist/auth-mfa/feature-exports.d.ts +2 -2
- package/dist/auth-mfa/feature.js +8 -0
- package/dist/auth-mfa/handlers/disable.write.js +3 -3
- package/dist/auth-mfa/handlers/enable-confirm-preauth.write.js +4 -4
- package/dist/auth-mfa/handlers/enable-confirm.write.js +2 -2
- package/dist/auth-mfa/handlers/enable-start-preauth.write.js +1 -1
- package/dist/auth-mfa/handlers/reencrypt.job.js +1 -1
- package/dist/auth-mfa/handlers/regenerate-recovery.write.js +5 -5
- package/dist/auth-mfa/handlers/verify.write.js +1 -1
- package/dist/auth-mfa/token-secrets.js +1 -1
- package/dist/auth-mfa/web/client-plugin.d.ts +1 -1
- package/dist/auth-mfa/web/client-plugin.js +1 -1
- package/dist/auth-mfa/web/i18n.js +8 -4
- package/dist/auth-mfa/web/index.js +4 -4
- package/dist/auth-mfa/web/mfa-client.js +17 -16
- package/dist/auth-mfa/web/mfa-code-or-recovery-field.d.ts +11 -0
- package/dist/auth-mfa/web/mfa-code-or-recovery-field.js +12 -0
- package/dist/auth-mfa/web/mfa-disable-dialog.js +14 -3
- package/dist/auth-mfa/web/mfa-regenerate-recovery-dialog.js +14 -3
- package/dist/auth-mfa/web/mfa-setup-preauth-screen.js +10 -5
- package/dist/auth-mfa/web/mfa-verify-screen.js +32 -11
- package/dist/billing-foundation/aggregate-id.d.ts +5 -5
- package/dist/billing-foundation/aggregate-id.js +10 -11
- package/dist/billing-foundation/checkout-core.d.ts +9 -14
- package/dist/billing-foundation/checkout-core.js +24 -39
- package/dist/billing-foundation/consumer-protection/confirmation-mail.js +8 -2
- package/dist/billing-foundation/consumer-protection/consent-gate.d.ts +1 -0
- package/dist/billing-foundation/consumer-protection/consent-gate.js +1 -0
- package/dist/billing-foundation/consumer-protection/issue-confirmation.js +9 -3
- package/dist/billing-foundation/consumer-protection/mail-notifications.js +3 -1
- package/dist/billing-foundation/consumer-protection/termination-receipt-limit.d.ts +4 -2
- package/dist/billing-foundation/consumer-protection/termination-receipt-limit.js +6 -5
- package/dist/billing-foundation/consumer-protection/termination-record.d.ts +5 -1
- package/dist/billing-foundation/consumer-protection/termination-record.js +27 -17
- package/dist/billing-foundation/consumer-protection/termination-request.js +12 -7
- package/dist/billing-foundation/consumer-protection/termination-revoke.js +12 -7
- package/dist/billing-foundation/consumer-protection/termination-texts.d.ts +1 -1
- package/dist/billing-foundation/consumer-protection/termination-texts.js +3 -0
- package/dist/billing-foundation/consumer-protection/withdrawal-period.d.ts +5 -2
- package/dist/billing-foundation/consumer-protection/withdrawal-period.js +8 -9
- package/dist/billing-foundation/entities.js +27 -27
- package/dist/billing-foundation/events.d.ts +1 -0
- package/dist/billing-foundation/events.js +19 -17
- package/dist/billing-foundation/feature.js +45 -44
- package/dist/billing-foundation/get-subscription-for-tenant.d.ts +3 -3
- package/dist/billing-foundation/get-subscription-for-tenant.js +3 -5
- package/dist/billing-foundation/handlers/billing-plans.query.js +35 -5
- package/dist/billing-foundation/handlers/create-checkout-session.write.js +19 -17
- package/dist/billing-foundation/handlers/create-portal-session.write.js +11 -12
- package/dist/billing-foundation/handlers/list-subscriptions.query.js +4 -4
- package/dist/billing-foundation/handlers/plan-switch-preview.query.d.ts +13 -0
- package/dist/billing-foundation/handlers/plan-switch-preview.query.js +48 -0
- package/dist/billing-foundation/handlers/process-event.write.d.ts +6 -0
- package/dist/billing-foundation/handlers/process-event.write.js +28 -22
- package/dist/billing-foundation/handlers/start-plan-checkout.write.js +32 -5
- package/dist/billing-foundation/handlers/switch-plan.write.d.ts +2 -2
- package/dist/billing-foundation/handlers/switch-plan.write.js +56 -64
- package/dist/billing-foundation/handlers/sync-subscription.write.js +12 -1
- package/dist/billing-foundation/i18n.js +22 -0
- package/dist/billing-foundation/index.d.ts +1 -1
- package/dist/billing-foundation/plan-catalog.d.ts +21 -5
- package/dist/billing-foundation/plan-catalog.js +25 -16
- package/dist/billing-foundation/plan-switch.d.ts +12 -0
- package/dist/billing-foundation/plan-switch.js +60 -0
- package/dist/billing-foundation/projection.d.ts +15 -11
- package/dist/billing-foundation/projection.js +38 -37
- package/dist/billing-foundation/subscription-tier-sync.js +3 -3
- package/dist/billing-foundation/tenant-destroy-hook.d.ts +2 -2
- package/dist/billing-foundation/tenant-destroy-hook.js +7 -7
- package/dist/billing-foundation/types.d.ts +97 -42
- package/dist/billing-foundation/types.js +29 -20
- package/dist/billing-foundation/validate-options.js +17 -0
- package/dist/billing-foundation/web/billing-plans-panel.js +82 -36
- package/dist/billing-foundation/web/checkout-consent-dialog.d.ts +17 -3
- package/dist/billing-foundation/web/checkout-consent-dialog.js +14 -10
- package/dist/billing-foundation/web/constants.d.ts +4 -0
- package/dist/billing-foundation/web/constants.js +4 -0
- package/dist/billing-foundation/web/plan-price.d.ts +15 -0
- package/dist/billing-foundation/web/plan-price.js +32 -0
- package/dist/billing-foundation/web/plan-switch-confirm-dialog.d.ts +15 -0
- package/dist/billing-foundation/web/plan-switch-confirm-dialog.js +66 -0
- package/dist/cap-counter/aggregate-id.js +8 -9
- package/dist/cap-counter/cap-reservation.js +5 -1
- package/dist/cap-counter/constants.js +11 -12
- package/dist/cap-counter/enforce-cap.d.ts +59 -62
- package/dist/cap-counter/enforce-cap.js +49 -49
- package/dist/cap-counter/entity.js +29 -29
- package/dist/cap-counter/feature.js +34 -35
- package/dist/cap-counter/handlers/increment-rolling.write.d.ts +2 -2
- package/dist/cap-counter/handlers/increment-rolling.write.js +31 -31
- package/dist/cap-counter/handlers/mark-soft-warned.write.js +4 -5
- package/dist/cap-counter/stock-cap-guard.js +8 -2
- package/dist/cap-counter/with-cap-enforcement.d.ts +3 -5
- package/dist/channel-email/feature.js +1 -1
- package/dist/channel-email/smtp-transport.d.ts +18 -17
- package/dist/channel-email/smtp-transport.js +24 -21
- package/dist/channel-in-app/handlers/unread-count.query.js +3 -4
- package/dist/compliance-profiles/feature.js +4 -4
- package/dist/compliance-profiles/handlers/for-tenant.query.js +3 -6
- package/dist/compliance-profiles/handlers/list-profiles.query.js +5 -5
- package/dist/compliance-profiles/handlers/needs-profile.query.js +4 -4
- package/dist/compliance-profiles/handlers/set-profile.write.js +13 -14
- package/dist/compliance-profiles/handlers/sub-processors.query.js +9 -11
- package/dist/compliance-profiles/resolve-for-tenant.js +7 -7
- package/dist/compliance-profiles/schema/profile-selection.js +18 -23
- package/dist/compliance-profiles/seeding.js +14 -15
- package/dist/compliance-profiles-ops/handlers/tenants-missing-profile.query.js +3 -3
- package/dist/compliance-profiles-ops/index.js +2 -2
- package/dist/config/handlers/cascade.query.d.ts +5 -0
- package/dist/config/handlers/cascade.query.js +4 -3
- package/dist/config/handlers/readiness.query.d.ts +4 -4
- package/dist/config/handlers/readiness.query.js +1 -1
- package/dist/config/handlers/reencrypt.job.js +4 -5
- package/dist/config/handlers/set.write.js +4 -4
- package/dist/config/handlers/values.query.d.ts +5 -0
- package/dist/config/handlers/values.query.js +4 -3
- package/dist/config/resolver.js +4 -4
- package/dist/config/table.js +10 -10
- package/dist/config/write-helpers.d.ts +1 -0
- package/dist/config/write-helpers.js +19 -10
- package/dist/crypto-shredding/handlers/forget-subject.write.d.ts +2 -2
- package/dist/crypto-shredding/handlers/forget-subject.write.js +25 -21
- package/dist/custom-fields/aggregate-id.d.ts +12 -13
- package/dist/custom-fields/aggregate-id.js +16 -17
- package/dist/custom-fields/entity.js +49 -47
- package/dist/custom-fields/events.js +7 -8
- package/dist/custom-fields/feature.d.ts +14 -14
- package/dist/custom-fields/feature.js +53 -54
- package/dist/custom-fields/handlers/clear-custom-field.write.d.ts +3 -2
- package/dist/custom-fields/handlers/clear-custom-field.write.js +9 -8
- package/dist/custom-fields/handlers/define-tenant-field.write.d.ts +1 -1
- package/dist/custom-fields/handlers/define-tenant-field.write.js +2 -2
- package/dist/custom-fields/handlers/delete-system-field.write.js +6 -7
- package/dist/custom-fields/handlers/delete-tenant-field.write.d.ts +1 -1
- package/dist/custom-fields/handlers/delete-tenant-field.write.js +3 -3
- package/dist/custom-fields/handlers/set-custom-field.write.d.ts +3 -3
- package/dist/custom-fields/handlers/set-custom-field.write.js +25 -28
- package/dist/custom-fields/handlers/update-tenant-field.write.d.ts +1 -1
- package/dist/custom-fields/handlers/update-tenant-field.write.js +1 -1
- package/dist/custom-fields/lib/field-access.js +2 -2
- package/dist/custom-fields/lib/parse-serialized-field.js +1 -1
- package/dist/custom-fields/lib/quota.js +1 -1
- package/dist/custom-fields/lib/value-schema.js +10 -12
- package/dist/custom-fields/run-retention.js +3 -3
- package/dist/custom-fields/schemas.js +14 -14
- package/dist/custom-fields/web/client-plugin.js +2 -5
- package/dist/custom-fields/web/constants.js +2 -2
- package/dist/custom-fields/web/custom-fields-form-section.d.ts +4 -4
- package/dist/custom-fields/web/custom-fields-form-section.js +22 -22
- package/dist/custom-fields/wire-for-entity.js +65 -67
- package/dist/custom-fields/wire-user-data-rights.js +3 -3
- package/dist/data-retention/_internal/parse-override.js +2 -3
- package/dist/data-retention/feature.js +11 -18
- package/dist/data-retention/handlers/policy-for.query.js +6 -6
- package/dist/data-retention/keep-for.d.ts +7 -7
- package/dist/data-retention/keep-for.js +15 -15
- package/dist/data-retention/override-schema.d.ts +3 -4
- package/dist/data-retention/override-schema.js +13 -15
- package/dist/data-retention/presets.d.ts +4 -5
- package/dist/data-retention/presets.js +18 -23
- package/dist/data-retention/resolve-tenant-preset.js +17 -16
- package/dist/data-retention/resolver.d.ts +12 -12
- package/dist/data-retention/resolver.js +24 -23
- package/dist/data-retention/run-retention-cleanup.d.ts +8 -3
- package/dist/data-retention/run-retention-cleanup.js +61 -51
- package/dist/data-retention/schema/tenant-retention-override.js +13 -11
- package/dist/delivery/channel-context.js +6 -3
- package/dist/delivery/db/queries/preferences.js +2 -2
- package/dist/delivery/delivery-service.js +22 -7
- package/dist/delivery/feature.js +2 -2
- package/dist/delivery/handlers/log.query.js +1 -1
- package/dist/delivery/handlers/preferences.query.d.ts +1 -1
- package/dist/delivery/handlers/preferences.query.js +20 -1
- package/dist/delivery/handlers/unsubscribe-page-chrome.query.js +1 -1
- package/dist/delivery/tables.js +9 -8
- package/dist/delivery/unsubscribe-link.d.ts +3 -1
- package/dist/delivery/unsubscribe-page-strings.d.ts +1 -0
- package/dist/delivery/unsubscribe-page-strings.js +1 -0
- package/dist/delivery/unsubscribe-page.d.ts +2 -0
- package/dist/delivery/unsubscribe-page.js +5 -0
- package/dist/delivery/unsubscribe.js +29 -11
- package/dist/document-ingest-foundation/entity.js +4 -4
- package/dist/document-ingest-foundation/events.js +2 -2
- package/dist/document-ingest-foundation/feature.js +2 -2
- package/dist/document-ingest-foundation/pages.js +1 -1
- package/dist/document-ingest-foundation/tenant-destroy-hook.js +4 -4
- package/dist/feature-toggles/compose-tier-resolver.js +1 -1
- package/dist/feature-toggles/feature.js +1 -1
- package/dist/feature-toggles/global-feature-state-table.js +1 -1
- package/dist/feature-toggles/handlers/registered.query.js +5 -5
- package/dist/feature-toggles/toggle-sync-signal.js +1 -1
- package/dist/feature-toggles/web/constants.js +1 -1
- package/dist/file-derivatives/feature.d.ts +1 -1
- package/dist/file-derivatives/feature.js +1 -1
- package/dist/file-derivatives/handlers/public-variant.query.js +1 -1
- package/dist/file-derivatives/presets.js +1 -1
- package/dist/file-foundation/feature.js +6 -6
- package/dist/file-foundation/index.d.ts +1 -1
- package/dist/file-foundation/index.js +1 -1
- package/dist/file-foundation/read-file-ref-content.d.ts +3 -0
- package/dist/file-foundation/read-file-ref-content.js +6 -1
- package/dist/file-provider-inmemory/feature.d.ts +1 -1
- package/dist/file-provider-inmemory/feature.js +16 -16
- package/dist/file-provider-s3/env-named-feature.d.ts +0 -2
- package/dist/file-provider-s3/feature.js +16 -16
- package/dist/file-provider-s3/lib/s3-provider.js +6 -6
- package/dist/files/feature.js +6 -6
- package/dist/files-tenant-data/handlers/sweep-orphaned-derivatives.job.js +4 -4
- package/dist/files-tenant-data/hooks.js +24 -26
- package/dist/files-tenant-data/index.js +1 -1
- package/dist/folders/feature.d.ts +1 -1
- package/dist/folders/web/folder-manager.js +2 -2
- package/dist/folders/web/tree.js +5 -5
- package/dist/form-draft/db/queries/cleanup.js +3 -3
- package/dist/form-draft/db/queries/owned-file-refs.js +1 -1
- package/dist/form-draft/decrypt-draft.js +5 -1
- package/dist/form-draft/entity.js +3 -3
- package/dist/form-draft/feature.js +4 -5
- package/dist/form-draft/handlers/discard.write.js +1 -1
- package/dist/form-draft/release-file-refs.js +6 -6
- package/dist/form-draft/schemas.js +3 -3
- package/dist/form-draft/web/constants.js +0 -2
- package/dist/host-routing/dispatch.js +11 -20
- package/dist/inbound-mail-foundation/aggregate-id.d.ts +13 -13
- package/dist/inbound-mail-foundation/aggregate-id.js +19 -19
- package/dist/inbound-mail-foundation/connect-routes.js +4 -3
- package/dist/inbound-mail-foundation/constants.d.ts +22 -24
- package/dist/inbound-mail-foundation/constants.js +30 -33
- package/dist/inbound-mail-foundation/entities.d.ts +12 -12
- package/dist/inbound-mail-foundation/entities.js +47 -48
- package/dist/inbound-mail-foundation/events.d.ts +4 -3
- package/dist/inbound-mail-foundation/events.js +50 -47
- package/dist/inbound-mail-foundation/feature.js +39 -39
- package/dist/inbound-mail-foundation/handlers/account-state.js +8 -8
- package/dist/inbound-mail-foundation/handlers/connect-account.write.js +25 -26
- package/dist/inbound-mail-foundation/handlers/disconnect-account.write.js +7 -7
- package/dist/inbound-mail-foundation/handlers/ingest-message.write.js +50 -51
- package/dist/inbound-mail-foundation/handlers/list-accounts.query.js +8 -8
- package/dist/inbound-mail-foundation/handlers/list-messages.query.js +10 -10
- package/dist/inbound-mail-foundation/handlers/scope-visibility.js +3 -4
- package/dist/inbound-mail-foundation/handlers/update-account.write.d.ts +2 -2
- package/dist/inbound-mail-foundation/handlers/update-account.write.js +22 -14
- package/dist/inbound-mail-foundation/i18n.js +0 -1
- package/dist/inbound-mail-foundation/oauth-state.d.ts +5 -5
- package/dist/inbound-mail-foundation/oauth-state.js +11 -10
- package/dist/inbound-mail-foundation/projection.d.ts +4 -4
- package/dist/inbound-mail-foundation/projection.js +31 -29
- package/dist/inbound-mail-foundation/provider-factory.d.ts +4 -4
- package/dist/inbound-mail-foundation/provider-factory.js +9 -9
- package/dist/inbound-mail-foundation/retention-sweep.d.ts +5 -3
- package/dist/inbound-mail-foundation/retention-sweep.js +38 -36
- package/dist/inbound-mail-foundation/screens.js +0 -3
- package/dist/inbound-mail-foundation/tenant-destroy-hook.js +14 -16
- package/dist/inbound-mail-foundation/types.d.ts +49 -49
- package/dist/inbound-mail-foundation/types.js +21 -21
- package/dist/inbound-mail-foundation/watch-supervisor.d.ts +10 -10
- package/dist/inbound-mail-foundation/watch-supervisor.js +85 -67
- package/dist/inbound-provider-imap/credential-document.js +13 -13
- package/dist/inbound-provider-imap/feature.d.ts +2 -2
- package/dist/inbound-provider-imap/feature.js +42 -40
- package/dist/inbound-provider-imap/imap-client.d.ts +12 -11
- package/dist/inbound-provider-imap/imap-client.js +20 -19
- package/dist/inbound-provider-inmemory/feature.d.ts +9 -9
- package/dist/inbound-provider-inmemory/feature.js +19 -19
- package/dist/jobs/db/queries/retention.js +2 -2
- package/dist/jobs/db/queries/stale-run-sweep.js +3 -3
- package/dist/jobs/events.js +1 -1
- package/dist/jobs/feature.d.ts +1 -0
- package/dist/jobs/feature.js +13 -10
- package/dist/jobs/handlers/detail.query.js +4 -4
- package/dist/jobs/handlers/list.query.js +1 -1
- package/dist/jobs/handlers/projection-rebuild.job.js +1 -1
- package/dist/jobs/handlers/reindex-entity.job.js +1 -1
- package/dist/jobs/handlers/retry.write.js +1 -1
- package/dist/jobs/handlers/tenant-failures.query.d.ts +1 -1
- package/dist/jobs/handlers/tenant-failures.query.js +45 -41
- package/dist/jobs/handlers/tenant-runs.query.d.ts +1 -1
- package/dist/jobs/handlers/tenant-runs.query.js +54 -50
- package/dist/jobs/job-instant.js +1 -1
- package/dist/jobs/job-run-logger.js +15 -15
- package/dist/jobs/job-run-table.js +3 -3
- package/dist/jobs/screens.js +1 -1
- package/dist/jobs/tenant-job-failure-table.js +1 -1
- package/dist/jobs/tenant-job-run-table.js +1 -1
- package/dist/ledger/entity.js +5 -5
- package/dist/ledger/feature.js +3 -3
- package/dist/ledger/handlers/confirm-schedule-period.write.js +3 -3
- package/dist/ledger/recurring.js +12 -12
- package/dist/ledger/schemas.js +1 -1
- package/dist/ledger/web/constants.js +2 -2
- package/dist/ledger/web/index.js +7 -7
- package/dist/legal-pages/feature.d.ts +4 -4
- package/dist/legal-pages/feature.js +25 -26
- package/dist/legal-pages/markdown.js +3 -3
- package/dist/legal-pages/web/client-plugin.js +23 -24
- package/dist/legal-pages/web/index.js +0 -1
- package/dist/mail-foundation/feature.d.ts +5 -5
- package/dist/mail-foundation/feature.js +27 -25
- package/dist/mail-transport-inmemory/feature.d.ts +4 -4
- package/dist/mail-transport-inmemory/feature.js +27 -28
- package/dist/mail-transport-smtp/feature.js +20 -20
- package/dist/managed-pages/branding.js +6 -6
- package/dist/managed-pages/feature.d.ts +26 -26
- package/dist/managed-pages/feature.js +34 -34
- package/dist/managed-pages/handlers/by-slug.query.js +5 -6
- package/dist/managed-pages/handlers/by-tenant-published.query.js +2 -2
- package/dist/managed-pages/handlers/set.write.js +5 -7
- package/dist/managed-pages/screens/page-screens.js +11 -11
- package/dist/managed-pages/seeding.js +8 -8
- package/dist/managed-pages/table.js +13 -12
- package/dist/managed-pages/web/client-plugin.d.ts +1 -1
- package/dist/managed-pages/web/client-plugin.js +5 -5
- package/dist/managed-pages/web/i18n.js +1 -1
- package/dist/notes-history/entity.js +4 -4
- package/dist/notes-history/feature.d.ts +2 -2
- package/dist/notes-history-user-data/hooks.js +1 -1
- package/dist/page-render/layout.js +9 -9
- package/dist/page-render/markdown.js +11 -11
- package/dist/page-render/security-headers.js +7 -6
- package/dist/personal-access-tokens/feature.d.ts +1 -1
- package/dist/personal-access-tokens/feature.js +9 -5
- package/dist/personal-access-tokens/roles.js +2 -2
- package/dist/readiness/handlers/status.query.js +3 -3
- package/dist/renderer-foundation/api.js +12 -13
- package/dist/renderer-foundation/constants.js +2 -2
- package/dist/renderer-foundation/feature.js +7 -7
- package/dist/renderer-pdf/render-table-pdf.d.ts +1 -1
- package/dist/renderer-pdf/render-table-pdf.js +22 -10
- package/dist/secrets/feature.js +9 -9
- package/dist/secrets/web/constants.js +2 -2
- package/dist/seo/feature.js +3 -3
- package/dist/sessions/constants.d.ts +1 -1
- package/dist/sessions/constants.js +1 -1
- package/dist/sessions/feature.d.ts +2 -2
- package/dist/sessions/feature.js +12 -8
- package/dist/sessions/handlers/revoke-all-for-user.write.js +2 -2
- package/dist/sessions/handlers/revoke-all-others.write.js +2 -2
- package/dist/sessions/handlers/revoke.write.js +1 -1
- package/dist/sessions/schema/user-session.js +4 -4
- package/dist/sessions/screens.js +2 -2
- package/dist/sessions/session-callbacks.js +2 -2
- package/dist/sessions/session-revoked-event.js +2 -2
- package/dist/shared/assert-no-where-rule-in-ownership-write.js +1 -1
- package/dist/shared/decrypt-stored-pii.d.ts +1 -0
- package/dist/shared/decrypt-stored-pii.js +7 -2
- package/dist/shared/encrypt-for-direct-write.js +1 -1
- package/dist/shared/index.d.ts +1 -1
- package/dist/shared/index.js +1 -1
- package/dist/shared/mail-template-body.d.ts +6 -2
- package/dist/shared/mail-template-body.js +7 -4
- package/dist/shared/map-with-concurrency.js +5 -4
- package/dist/shared/parent-visibility.js +2 -2
- package/dist/shared/password-hashing.js +1 -1
- package/dist/shared/signup-handover.js +1 -2
- package/dist/shared/single-use-token-store.js +1 -1
- package/dist/step-dispatcher/feature.js +1 -0
- package/dist/subscription-dodo/client.d.ts +17 -0
- package/dist/subscription-dodo/client.js +31 -0
- package/dist/subscription-dodo/constants.d.ts +12 -0
- package/dist/subscription-dodo/constants.js +19 -0
- package/dist/subscription-dodo/feature.d.ts +37 -0
- package/dist/subscription-dodo/feature.js +144 -0
- package/dist/subscription-dodo/index.d.ts +2 -0
- package/dist/subscription-dodo/index.js +4 -0
- package/dist/subscription-dodo/plugin-methods.d.ts +23 -0
- package/dist/subscription-dodo/plugin-methods.js +260 -0
- package/dist/subscription-dodo/runtime.d.ts +27 -0
- package/dist/subscription-dodo/runtime.js +89 -0
- package/dist/subscription-dodo/verify-webhook.d.ts +37 -0
- package/dist/subscription-dodo/verify-webhook.js +189 -0
- package/dist/subscription-mollie/constants.js +15 -17
- package/dist/subscription-mollie/feature.d.ts +17 -18
- package/dist/subscription-mollie/feature.js +24 -24
- package/dist/subscription-mollie/index.js +3 -3
- package/dist/subscription-mollie/plugin-methods.d.ts +2 -2
- package/dist/subscription-mollie/plugin-methods.js +15 -14
- package/dist/subscription-mollie/verify-webhook.d.ts +10 -10
- package/dist/subscription-mollie/verify-webhook.js +27 -27
- package/dist/subscription-stripe/constants.js +4 -6
- package/dist/subscription-stripe/feature.d.ts +14 -14
- package/dist/subscription-stripe/feature.js +36 -34
- package/dist/subscription-stripe/index.js +6 -6
- package/dist/subscription-stripe/plugin-methods.js +18 -18
- package/dist/subscription-stripe/runtime.d.ts +1 -1
- package/dist/subscription-stripe/runtime.js +8 -7
- package/dist/subscription-stripe/verify-webhook.d.ts +11 -11
- package/dist/subscription-stripe/verify-webhook.js +59 -61
- package/dist/tags/feature.d.ts +3 -3
- package/dist/tags/screens.js +1 -1
- package/dist/template-resolver/api.d.ts +3 -2
- package/dist/template-resolver/api.js +34 -12
- package/dist/template-resolver/compile-document-body.js +1 -0
- package/dist/template-resolver/feature.js +2 -2
- package/dist/template-resolver/handlers/bundle-import.js +3 -3
- package/dist/template-resolver/handlers/copy-locale.write.d.ts +5 -1
- package/dist/template-resolver/handlers/copy-locale.write.js +22 -7
- package/dist/template-resolver/handlers/diff-to-system.query.js +3 -2
- package/dist/template-resolver/handlers/document-base.js +3 -2
- package/dist/template-resolver/handlers/find-by-id.query.js +8 -7
- package/dist/template-resolver/handlers/list.query.js +6 -7
- package/dist/template-resolver/handlers/overview.query.d.ts +3 -0
- package/dist/template-resolver/handlers/overview.query.js +6 -3
- package/dist/template-resolver/handlers/shared.js +2 -2
- package/dist/template-resolver/handlers/template-write.js +3 -3
- package/dist/template-resolver/handlers/tenant-override-counts.query.js +1 -3
- package/dist/template-resolver/handlers/tenant-override-selection.d.ts +2 -1
- package/dist/template-resolver/handlers/tenant-overrides.query.js +28 -5
- package/dist/template-resolver/handlers/upsert-system.write.js +3 -4
- package/dist/template-resolver/handlers/upsert-tenant.write.js +4 -5
- package/dist/template-resolver/handlers/usage.query.d.ts +2 -1
- package/dist/template-resolver/handlers/usage.query.js +26 -16
- package/dist/template-resolver/handlers/validate.query.js +7 -2
- package/dist/template-resolver/seeding.js +30 -14
- package/dist/template-resolver/store-template-resource.d.ts +1 -0
- package/dist/template-resolver/store-template-resource.js +19 -4
- package/dist/template-resolver/table.js +10 -11
- package/dist/template-resolver/template-delivery-policy.d.ts +0 -5
- package/dist/template-resolver/template-delivery-policy.js +0 -6
- package/dist/template-resolver/template-meta.js +7 -4
- package/dist/template-resolver/template-preview.js +4 -3
- package/dist/template-resolver/web/client-plugin.js +2 -2
- package/dist/template-resolver/web/constants.d.ts +2 -2
- package/dist/template-resolver/web/constants.js +3 -3
- package/dist/template-resolver/web/index.d.ts +1 -0
- package/dist/template-resolver/web/index.js +1 -0
- package/dist/template-resolver/web/mail-layout-constants.d.ts +5 -0
- package/dist/template-resolver/web/mail-layout-constants.js +7 -0
- package/dist/tenant/feature.js +7 -7
- package/dist/tenant/handlers/member-directory.query.d.ts +1 -0
- package/dist/tenant/handlers/member-directory.query.js +11 -4
- package/dist/tenant/handlers/members.query.js +1 -1
- package/dist/tenant/handlers/team-list.query.js +1 -1
- package/dist/tenant/handlers/tenant-directory.query.d.ts +1 -0
- package/dist/tenant/handlers/tenant-directory.query.js +9 -5
- package/dist/tenant/invitation-table.js +37 -40
- package/dist/tenant/membership-table.js +3 -3
- package/dist/tenant/schema/tenant.js +7 -9
- package/dist/tenant/screens.js +1 -1
- package/dist/tenant/seeding.d.ts +6 -5
- package/dist/tenant/seeding.js +12 -12
- package/dist/tenant/testing.js +5 -6
- package/dist/tenant/web/constants.js +2 -2
- package/dist/tenant-handover/events.js +5 -7
- package/dist/tenant-handover/feature.js +1 -1
- package/dist/tenant-handover/grant.js +1 -1
- package/dist/tenant-handover/handlers/claim.write.js +1 -1
- package/dist/tenant-handover/move-entity-graph.js +8 -9
- package/dist/tenant-handover/signup-handover-provider.js +1 -2
- package/dist/tenant-handover/transfer-graph.js +4 -5
- package/dist/tenant-lifecycle/boot-checks.js +1 -1
- package/dist/tenant-lifecycle/constants.d.ts +1 -0
- package/dist/tenant-lifecycle/constants.js +4 -0
- package/dist/tenant-lifecycle/feature.js +1 -1
- package/dist/tenant-lifecycle/run-tenant-destroy.js +2 -2
- package/dist/tenant-settings/constants.js +1 -1
- package/dist/tenant-settings/tenant-defaults.d.ts +1 -1
- package/dist/tenant-settings/tenant-defaults.js +9 -2
- package/dist/tier-engine/aggregate-id.d.ts +11 -11
- package/dist/tier-engine/aggregate-id.js +15 -16
- package/dist/tier-engine/compose-app.d.ts +14 -14
- package/dist/tier-engine/compose-app.js +1 -1
- package/dist/tier-engine/entity.js +18 -19
- package/dist/tier-engine/feature.d.ts +19 -17
- package/dist/tier-engine/feature.js +68 -69
- package/dist/tier-engine/handlers/active-tier.query.js +6 -7
- package/dist/tier-engine/handlers/get-tenant-tier.query.js +4 -4
- package/dist/tier-engine/handlers/set-tenant-tier.write.d.ts +7 -8
- package/dist/tier-engine/handlers/set-tenant-tier.write.js +7 -4
- package/dist/tier-engine/tier-resolver.js +2 -2
- package/dist/tier-engine/trial.js +8 -8
- package/dist/tier-engine/web/constants.js +2 -2
- package/dist/tier-engine/web/index.js +4 -4
- package/dist/user/db/queries/stream-tenant-backfill.js +8 -8
- package/dist/user/handlers/create.write.js +4 -4
- package/dist/user/schema/user.d.ts +11 -11
- package/dist/user/schema/user.js +45 -44
- package/dist/user/seeding.d.ts +15 -15
- package/dist/user/seeding.js +28 -28
- package/dist/user/testing.js +3 -3
- package/dist/user-data-rights/audit-download.d.ts +8 -8
- package/dist/user-data-rights/audit-download.js +19 -20
- package/dist/user-data-rights/boot-checks.js +1 -1
- package/dist/user-data-rights/deletion-token.js +1 -1
- package/dist/user-data-rights/feature.d.ts +49 -50
- package/dist/user-data-rights/feature.js +54 -53
- package/dist/user-data-rights/handlers/cancel-deletion.write.js +9 -9
- package/dist/user-data-rights/handlers/confirm-deletion-by-token.write.js +8 -8
- package/dist/user-data-rights/handlers/download-by-job.query.js +29 -30
- package/dist/user-data-rights/handlers/download-by-token.query.js +40 -42
- package/dist/user-data-rights/handlers/export-status.query.js +8 -9
- package/dist/user-data-rights/handlers/lift-restriction.write.js +7 -8
- package/dist/user-data-rights/handlers/list-download-attempts.query.js +2 -2
- package/dist/user-data-rights/handlers/my-audit-log.query.js +4 -4
- package/dist/user-data-rights/handlers/request-deletion-by-email.write.d.ts +5 -5
- package/dist/user-data-rights/handlers/request-deletion-by-email.write.js +16 -15
- package/dist/user-data-rights/handlers/request-deletion.write.d.ts +2 -2
- package/dist/user-data-rights/handlers/request-deletion.write.js +7 -9
- package/dist/user-data-rights/handlers/request-export.write.js +42 -41
- package/dist/user-data-rights/handlers/restrict-account.write.js +22 -19
- package/dist/user-data-rights/handlers/run-forget-cleanup.write.js +8 -8
- package/dist/user-data-rights/index.js +8 -10
- package/dist/user-data-rights/lib/default-mailers.js +3 -3
- package/dist/user-data-rights/lib/update-user-lifecycle.js +14 -17
- package/dist/user-data-rights/run-export-jobs.d.ts +38 -42
- package/dist/user-data-rights/run-export-jobs.js +130 -237
- package/dist/user-data-rights/run-forget-cleanup.d.ts +16 -20
- package/dist/user-data-rights/run-forget-cleanup.js +65 -83
- package/dist/user-data-rights/run-user-export.d.ts +34 -33
- package/dist/user-data-rights/run-user-export.js +55 -57
- package/dist/user-data-rights/schema/download-attempt.js +11 -11
- package/dist/user-data-rights/schema/download-token.js +37 -41
- package/dist/user-data-rights/schema/export-job.d.ts +4 -4
- package/dist/user-data-rights/schema/export-job.js +65 -67
- package/dist/user-data-rights/token-helpers.d.ts +8 -9
- package/dist/user-data-rights/token-helpers.js +21 -25
- package/dist/user-data-rights/web/client-plugin.d.ts +5 -5
- package/dist/user-data-rights/web/client-plugin.js +1 -1
- package/dist/user-data-rights/web/confirm-deletion-screen.js +6 -5
- package/dist/user-data-rights/web/constants.js +1 -1
- package/dist/user-data-rights/web/index.js +5 -5
- package/dist/user-data-rights/web/privacy-center-screen.js +14 -13
- package/dist/user-data-rights/web/public-deletion-gate.d.ts +4 -4
- package/dist/user-data-rights/web/request-deletion-screen.js +6 -6
- package/dist/user-data-rights/zip-path.d.ts +15 -15
- package/dist/user-data-rights/zip-path.js +41 -40
- package/dist/user-data-rights-defaults/feature.js +15 -15
- package/dist/user-data-rights-defaults/hooks/delivery-attempt.userdata-hook.js +3 -5
- package/dist/user-data-rights-defaults/hooks/file-ref.userdata-hook.js +45 -51
- package/dist/user-data-rights-defaults/hooks/job-run.userdata-hook.js +2 -2
- package/dist/user-data-rights-defaults/hooks/notification-preference.userdata-hook.js +1 -1
- package/dist/user-data-rights-defaults/hooks/user-session.userdata-hook.js +3 -3
- package/dist/user-data-rights-defaults/hooks/user.userdata-hook.js +32 -31
- package/dist/user-profile/handlers/change-email.write.js +13 -13
- package/dist/user-profile/index.js +3 -3
- package/dist/user-profile/web/client-plugin.js +1 -1
- package/dist/user-profile/web/constants.js +1 -1
- package/dist/user-profile/web/profile-screen.js +1 -1
- package/dist/waitlist/handlers/export-purge.write.js +2 -1
- package/dist/waitlist/handlers/submit.write.js +5 -5
- package/dist/waitlist/import.d.ts +1 -0
- package/dist/waitlist/import.js +4 -0
- package/dist/waitlist/legacy-migrate.js +17 -6
- package/dist/waitlist/link-on-signup.js +18 -6
- package/dist/waitlist/options.d.ts +3 -0
- package/dist/workflow-runner/aggregate-id.d.ts +1 -1
- package/dist/workflow-runner/aggregate-id.js +1 -1
- package/dist/workflow-runner/event-subscriber.js +4 -5
- package/dist/workflow-runner/event-trigger.js +4 -17
- package/dist/workflow-runner/feature.js +2 -2
- package/dist/workflow-runner/handlers/resume-run.write.js +4 -4
- package/dist/workflow-runner/pending-projection.js +6 -7
- package/dist/workflow-runner/runner.js +6 -6
- package/dist/workflow-runner/tables.js +6 -6
- package/dist/workflow-runner/workflow-registry.js +1 -1
- package/package.json +20 -10
- package/src/agent-tools/changes.json +6 -0
- package/src/audit/changes.json +12 -0
- package/src/auth-mfa/changes.json +6 -0
- package/src/billing-foundation/changes.json +55 -0
- package/src/cap-counter/changes.json +18 -0
- package/src/channel-email/changes.json +6 -0
- package/src/config/changes.json +12 -0
- package/src/crypto-shredding/changes.json +6 -0
- package/src/delivery/changes.json +30 -0
- package/src/form-draft/changes.json +6 -0
- package/src/host-routing/changes.json +6 -0
- package/src/inbound-mail-foundation/changes.json +18 -0
- package/src/jobs/changes.json +13 -0
- package/src/mail-foundation/changes.json +6 -0
- package/src/renderer-pdf/changes.json +6 -0
- package/src/step-dispatcher/changes.json +6 -0
- package/src/subscription-dodo/changes.json +14 -0
- package/src/subscription-stripe/changes.json +12 -0
- package/src/template-resolver/changes.json +48 -0
- package/src/tenant/changes.json +6 -0
- package/src/tenant-lifecycle/changes.json +6 -0
- package/src/tier-engine/changes.json +6 -0
- package/src/waitlist/changes.json +18 -0
- package/dist/billing-foundation/consumer-protection/stored-user-email.d.ts +0 -1
- package/dist/billing-foundation/consumer-protection/stored-user-email.js +0 -8
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
// Browser-
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
1
|
+
// Browser-side wrappers around /api/auth/* using cookie transport: the JWT
|
|
2
|
+
// lives in the HttpOnly kumiko_auth cookie, while the Double-Submit CSRF
|
|
3
|
+
// token lives in the JS-readable kumiko_csrf cookie. Every state-changing
|
|
4
|
+
// request echoes the CSRF token via X-CSRF-Token; otherwise the server
|
|
5
|
+
// rejects it with csrf_token_missing.
|
|
6
6
|
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// nicht divergieren.
|
|
7
|
+
// dispatcher-live uses the same readCsrfToken helper; reusing it here keeps
|
|
8
|
+
// the cookie and header constants from diverging.
|
|
10
9
|
import { parseRoles } from "@cosmicdrift/kumiko-framework/utils";
|
|
11
10
|
import { CSRF_HEADER_NAME, readCsrfToken } from "@cosmicdrift/kumiko-renderer/live";
|
|
12
11
|
export function csrfHeader() {
|
|
@@ -70,8 +69,8 @@ export async function login(req) {
|
|
|
70
69
|
return { kind: "success", data: toLoginResponse(body.token, body.user, body.landingPath) };
|
|
71
70
|
}
|
|
72
71
|
}
|
|
73
|
-
//
|
|
74
|
-
//
|
|
72
|
+
// The server sends error either as a string ("invalid_body") or as a
|
|
73
|
+
// structured object. Extract the most descriptive reason.
|
|
75
74
|
const err = body.error;
|
|
76
75
|
if (typeof err === "string") {
|
|
77
76
|
return { kind: "failure", error: { reason: err } };
|
|
@@ -87,10 +86,10 @@ export async function login(req) {
|
|
|
87
86
|
},
|
|
88
87
|
};
|
|
89
88
|
}
|
|
90
|
-
// POST /api/auth/logout.
|
|
91
|
-
//
|
|
92
|
-
//
|
|
93
|
-
//
|
|
89
|
+
// POST /api/auth/logout. The server revokes the session when
|
|
90
|
+
// sessionRevoker is wired and clears the cookies. A navigation refresh
|
|
91
|
+
// afterward ensures that all caches (React state, query cache) return to
|
|
92
|
+
// an unauthenticated state—the simplest way to restore a clean baseline.
|
|
94
93
|
export async function logout() {
|
|
95
94
|
await fetch("/api/auth/logout", {
|
|
96
95
|
method: "POST",
|
|
@@ -98,11 +97,11 @@ export async function logout() {
|
|
|
98
97
|
headers: { "Content-Type": "application/json", ...csrfHeader() },
|
|
99
98
|
});
|
|
100
99
|
}
|
|
101
|
-
// 4xx/5xx
|
|
102
|
-
//
|
|
100
|
+
// Parse 4xx/5xx responses into AuthTokenFailure. 429 uses a dedicated
|
|
101
|
+
// reason so the UI can display a retry hint.
|
|
103
102
|
async function parseTokenFailure(res) {
|
|
104
103
|
if (res.status === 429) {
|
|
105
|
-
// @cast-boundary engine-payload — server
|
|
104
|
+
// @cast-boundary engine-payload — the server sends details.retryAfterSeconds for 429
|
|
106
105
|
const body = (await res.json().catch(() => ({})));
|
|
107
106
|
const retry = body.error?.details?.retryAfterSeconds;
|
|
108
107
|
return { reason: "rate_limited", ...(retry !== undefined && { retryAfterSeconds: retry }) };
|
|
@@ -127,11 +126,12 @@ export async function requestPasswordReset(email) {
|
|
|
127
126
|
return { ok: true };
|
|
128
127
|
return { ok: false, error: await parseTokenFailure(res) };
|
|
129
128
|
}
|
|
130
|
-
// POST /api/auth/reset-password.
|
|
131
|
-
//
|
|
132
|
-
//
|
|
133
|
-
//
|
|
134
|
-
//
|
|
129
|
+
// POST /api/auth/reset-password. The token comes from the URL and the
|
|
130
|
+
// request includes the new password. On 422, the server collapses all
|
|
131
|
+
// token-verification errors (malformed, bad signature, expired) into the
|
|
132
|
+
// single code `invalid_reset_token` to prevent enumeration. Zod validation
|
|
133
|
+
// failures (newPassword < 8) use a separate 4xx code, "validation_failed".
|
|
134
|
+
// The UI maps reason to an i18n key.
|
|
135
135
|
export async function resetPassword(token, newPassword) {
|
|
136
136
|
const res = await fetch("/api/auth/reset-password", {
|
|
137
137
|
method: "POST",
|
|
@@ -156,9 +156,9 @@ export async function requestEmailVerification(email) {
|
|
|
156
156
|
return { ok: true };
|
|
157
157
|
return { ok: false, error: await parseTokenFailure(res) };
|
|
158
158
|
}
|
|
159
|
-
// POST /api/auth/verify-email.
|
|
160
|
-
//
|
|
161
|
-
// `invalid_verification_token`
|
|
159
|
+
// POST /api/auth/verify-email. VerifyEmailScreen submits this automatically
|
|
160
|
+
// after parsing `?token=...`. The server collapses all verification failures
|
|
161
|
+
// into `invalid_verification_token` to prevent enumeration, as with reset.
|
|
162
162
|
export async function verifyEmail(token) {
|
|
163
163
|
const res = await fetch("/api/auth/verify-email", {
|
|
164
164
|
method: "POST",
|
|
@@ -199,14 +199,13 @@ export async function confirmAccountUnlock(token) {
|
|
|
199
199
|
return { ok: true };
|
|
200
200
|
return { ok: false, error: await parseTokenFailure(res) };
|
|
201
201
|
}
|
|
202
|
-
// POST /api/auth/signup-request. Always
|
|
203
|
-
//
|
|
204
|
-
//
|
|
205
|
-
//
|
|
202
|
+
// POST /api/auth/signup-request. Always returns 200 to prevent enumeration;
|
|
203
|
+
// the response does not reveal whether the email is already registered. The
|
|
204
|
+
// server sends an activation email to the address; following its link takes
|
|
205
|
+
// the user to /signup/complete?token=… to set a password.
|
|
206
206
|
export async function requestSignup(email,
|
|
207
|
-
// Cross-device try-first handover
|
|
208
|
-
//
|
|
209
|
-
// server can verify + rebind it to the signup token. The grant never
|
|
207
|
+
// Cross-device try-first handover: forwards a row-bound tenant-handover
|
|
208
|
+
// grant so the server can verify + rebind it to the signup token. The grant never
|
|
210
209
|
// travels any further than this request — never in the URL, the mail,
|
|
211
210
|
// or the confirm response.
|
|
212
211
|
handover) {
|
|
@@ -243,8 +242,8 @@ export async function confirmSignup(token, password) {
|
|
|
243
242
|
}
|
|
244
243
|
return { ok: false, error: await parseTokenFailure(res) };
|
|
245
244
|
}
|
|
246
|
-
// GET /api/auth/tenants.
|
|
247
|
-
//
|
|
245
|
+
// GET /api/auth/tenants. Returns the current user's memberships; the server
|
|
246
|
+
// returns 401 when the cookie is missing or expired.
|
|
248
247
|
export async function fetchTenants() {
|
|
249
248
|
const res = await fetch("/api/auth/tenants", {
|
|
250
249
|
method: "GET",
|
|
@@ -258,9 +257,9 @@ export async function fetchTenants() {
|
|
|
258
257
|
// @cast-boundary engine-payload — HTTP-API contract, server-side schema-validated
|
|
259
258
|
return (await res.json());
|
|
260
259
|
}
|
|
261
|
-
// POST /api/auth/switch-tenant.
|
|
262
|
-
//
|
|
263
|
-
//
|
|
260
|
+
// POST /api/auth/switch-tenant. Mints a new JWT for the target tenant and
|
|
261
|
+
// rotates both cookies. Returns 400 for already_in_tenant or
|
|
262
|
+
// tenant_switch_not_available, and 403 for not_a_member.
|
|
264
263
|
export async function switchTenant(tenantId) {
|
|
265
264
|
const res = await fetch("/api/auth/switch-tenant", {
|
|
266
265
|
method: "POST",
|
|
@@ -25,21 +25,21 @@ export function useAuthShell() {
|
|
|
25
25
|
export function AuthCard({ title, subtitle, className, headerClassName, titleClassName, bodyClassName, children, }) {
|
|
26
26
|
const { Card } = usePrimitives();
|
|
27
27
|
const shell = useAuthShell() ?? defaultAuthShell;
|
|
28
|
-
// h1 (
|
|
29
|
-
//
|
|
28
|
+
// Keep an h1 (page heading) through the header slot; the Card's default
|
|
29
|
+
// header would be h3. padded:false keeps the form edge-to-edge as before
|
|
30
|
+
// (bare form).
|
|
30
31
|
const card = (_jsx(Card, { className: cn("w-full max-w-sm", className), options: { padded: false }, slots: {
|
|
31
32
|
header: title !== undefined || subtitle !== undefined ? (_jsxs("div", { className: cn("flex flex-col space-y-1.5 p-6 pb-4", headerClassName), children: [title !== undefined && (_jsx("h1", { className: cn("text-xl font-semibold tracking-tight", titleClassName), children: title })), subtitle !== undefined && (_jsx("p", { className: "text-sm text-muted-foreground", children: subtitle }))] })) : undefined,
|
|
32
33
|
}, children: _jsx(BareFormProvider, { children: _jsx("div", { className: cn("p-6 pt-0 flex flex-col gap-4", bodyClassName), children: children }) }) }));
|
|
33
34
|
return shell(card);
|
|
34
35
|
}
|
|
35
|
-
//
|
|
36
|
-
//
|
|
37
|
-
// Browser nicht da ist (SSR-safety) oder der Parameter fehlt.
|
|
36
|
+
// Reads `?<paramName>=<value>` from the current URL, as used by token-bearing
|
|
37
|
+
// pages (reset, verify). Returns "" during SSR or when the parameter is absent.
|
|
38
38
|
//
|
|
39
|
-
//
|
|
40
|
-
// pattern
|
|
41
|
-
//
|
|
42
|
-
//
|
|
39
|
+
// This is intentionally not read through useState/useEffect: that would be a
|
|
40
|
+
// read-once-on-mount pattern, while URL changes are irrelevant here because
|
|
41
|
+
// token pages reload for new tokens. Callers can use
|
|
42
|
+
// useState(() => parseUrlToken(...)) when needed.
|
|
43
43
|
export function parseUrlToken(paramName = "token") {
|
|
44
44
|
if (typeof window === "undefined")
|
|
45
45
|
return "";
|
|
@@ -47,7 +47,7 @@ export function parseUrlToken(paramName = "token") {
|
|
|
47
47
|
}
|
|
48
48
|
// Reads the magic-link token from `?<paramName>=` once on mount, then strips
|
|
49
49
|
// that param from the URL via history.replaceState so the single-use token
|
|
50
|
-
// doesn't linger in browser history / Referer
|
|
50
|
+
// doesn't linger in browser history / Referer. An explicit `override`
|
|
51
51
|
// (server-injected token) short-circuits both the URL read and the scrub.
|
|
52
52
|
export function useUrlToken(override, paramName = "token") {
|
|
53
53
|
const [token] = useState(() => override ?? parseUrlToken(paramName));
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
// Auth
|
|
3
|
-
// "unauthenticated"
|
|
4
|
-
//
|
|
5
|
-
//
|
|
2
|
+
// Auth gate: renders the LoginScreen while the session status is
|
|
3
|
+
// "unauthenticated" and the children otherwise. "loading" shows a
|
|
4
|
+
// minimal placeholder—the initial refresh usually completes in <100ms,
|
|
5
|
+
// so a spinner would be excessive.
|
|
6
6
|
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
7
|
+
// The makeAuthGate factory closes over the LoginScreen component so the
|
|
8
|
+
// gate matches the ClientFeatureDefinition signature (only a `{ children }`
|
|
9
|
+
// prop). This lets the sample configure a custom login screen without
|
|
10
|
+
// replacing the gate.
|
|
11
11
|
import { useLocale } from "@cosmicdrift/kumiko-renderer";
|
|
12
12
|
import { useEffect, useMemo, useState } from "react";
|
|
13
13
|
import { assertNavigableUrl, buildLoginRedirectUrl, followNextOrLandingAfterLogin, } from "./auth-redirect.js";
|
|
@@ -20,12 +20,11 @@ import { SessionBootstrapErrorScreen } from "./session-bootstrap-error.js";
|
|
|
20
20
|
// their own standalone login route outside any gate (createPublicSurface
|
|
21
21
|
// apex pages stack providers, not gates — see auth-mount.tsx recipes).
|
|
22
22
|
// Handing an app raw LoginScreen + telling it to hand-roll the challenge-
|
|
23
|
-
// token swap itself is exactly how
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
// optional package).
|
|
23
|
+
// token swap itself is exactly how the login-time MFA step went missing in a
|
|
24
|
+
// real apex surface; this prevents the *most common* version of that mistake.
|
|
25
|
+
// MFA still only actually works once a consumer wires `mfaVerifyScreen` —
|
|
26
|
+
// omitting it is a silent no-MFA fallback, not something this route can catch
|
|
27
|
+
// on its own (auth-mfa is a separate, optional package).
|
|
29
28
|
export function createLoginRoute(opts = {}) {
|
|
30
29
|
const LoginComponent = opts.loginScreen ?? LoginScreen;
|
|
31
30
|
const MfaVerifyComponent = opts.mfaVerifyScreen;
|
|
@@ -38,7 +37,7 @@ export function createLoginRoute(opts = {}) {
|
|
|
38
37
|
// never considers this session authenticated until verify succeeds.
|
|
39
38
|
const [challengeToken, setChallengeToken] = useState(null);
|
|
40
39
|
const [setupRequest, setSetupRequest] = useState(null);
|
|
41
|
-
// kumiko-lint-ignore no-raw-hooks
|
|
40
|
+
// kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
|
|
42
41
|
useEffect(() => {
|
|
43
42
|
if (status === "authenticated")
|
|
44
43
|
onAuthenticated?.();
|
|
@@ -125,7 +124,7 @@ export function makeAuthGate(opts = {}) {
|
|
|
125
124
|
? resolveLoginRedirectOrNull(loginUrl, locale, { origin, pathname, search, hash })
|
|
126
125
|
: null, [status, locale, origin, pathname, search, hash]);
|
|
127
126
|
const redirectUrl = loginRedirect?.kind === "redirect" ? loginRedirect.url : null;
|
|
128
|
-
// kumiko-lint-ignore no-raw-hooks
|
|
127
|
+
// kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
|
|
129
128
|
useEffect(() => {
|
|
130
129
|
if (redirectUrl !== null)
|
|
131
130
|
window.location.replace(redirectUrl);
|
|
@@ -3,9 +3,9 @@ import type { ComponentType, ReactNode } from "react";
|
|
|
3
3
|
import { type AuthGateOptions, type MfaSetupComponentProps, type MfaVerifyComponentProps } from "./auth-gate.tsx";
|
|
4
4
|
import type { LoginScreenProps } from "./login-screen.tsx";
|
|
5
5
|
export type EmailPasswordClientOptions = {
|
|
6
|
-
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
/** Custom login screen. Default: the shadcn-styled LoginScreen
|
|
7
|
+
* from this module. Provide a component with the same signature for
|
|
8
|
+
* branding or layout overrides. */
|
|
9
9
|
readonly loginScreen?: ComponentType<LoginScreenProps>;
|
|
10
10
|
readonly loginScreenProps?: LoginScreenProps;
|
|
11
11
|
/** auth-mfa's MfaVerifyScreen, wired in from the app so this feature
|
|
@@ -26,10 +26,10 @@ export type EmailPasswordClientOptions = {
|
|
|
26
26
|
readonly loginUrl?: AuthGateOptions["loginUrl"];
|
|
27
27
|
/** Where logout navigates to (root-relative path or http(s) URL). Default: reload. */
|
|
28
28
|
readonly postLogoutUrl?: string;
|
|
29
|
-
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* (`fr`, `es`, …)
|
|
29
|
+
/** Per-locale key overrides. Merged with the default bundles (de/en)
|
|
30
|
+
* from `translations.ts`; each key supplied here takes precedence.
|
|
31
|
+
* Use this for branding ("Sign in" → "Login to Acme") or to add
|
|
32
|
+
* further languages (`fr`, `es`, …). */
|
|
33
33
|
readonly translations?: TranslationsByLocale;
|
|
34
34
|
/** Serve the forgot-password, reset-password and unlock-account pages at
|
|
35
35
|
* their convention paths for signed-out visitors. Apps with their own
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
// Client
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// Strings pro Locale, pro Key.
|
|
1
|
+
// Client feature factory for auth-email-password. App code mounts it in
|
|
2
|
+
// createKumikoApp({ clientFeatures: [emailPasswordClient()] }) to provide
|
|
3
|
+
// session context, AuthGate, and default UI translations (de/en). All of
|
|
4
|
+
// these can be overridden: the login screen and strings per locale and key.
|
|
6
5
|
import { makeSessionAuthGate, } from "./auth-gate.js";
|
|
7
6
|
import { emailPasswordClientActions } from "./client-actions.js";
|
|
8
7
|
import { DefaultAuthPagesGate } from "./default-auth-pages-gate.js";
|
|
@@ -16,7 +16,7 @@ export function ConfirmAccountUnlockScreen({ title, token: tokenProp, loginHref
|
|
|
16
16
|
const token = useUrlToken(tokenProp);
|
|
17
17
|
const [status, setStatus] = useState(token === "" ? "missing-token" : "verifying");
|
|
18
18
|
const startedRef = useRef(false);
|
|
19
|
-
// kumiko-lint-ignore no-raw-hooks
|
|
19
|
+
// kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
|
|
20
20
|
useEffect(() => {
|
|
21
21
|
if (status !== "verifying")
|
|
22
22
|
return;
|
|
@@ -15,7 +15,7 @@ export const AuthHandlers = {
|
|
|
15
15
|
requestEmailVerification: "auth-email-password:write:request-email-verification",
|
|
16
16
|
verifyEmail: "auth-email-password:write:verify-email",
|
|
17
17
|
// Account-Unlock Magic-Link (fixes the lockout-DoS where the monotonic
|
|
18
|
-
// failure-counter re-locks immediately after expiry
|
|
18
|
+
// failure-counter re-locks immediately after expiry). Mirrors
|
|
19
19
|
// reset: request mints an HMAC token + mails it, confirm clears the
|
|
20
20
|
// Redis lockout state.
|
|
21
21
|
requestAccountUnlock: "auth-email-password:write:request-account-unlock",
|
|
@@ -81,7 +81,7 @@ export const AuthErrors = {
|
|
|
81
81
|
invalidSignupToken: "invalid_signup_token",
|
|
82
82
|
signupNotConfigured: "signup_not_configured",
|
|
83
83
|
// Self-signup: confirm rejects an already-registered email instead of
|
|
84
|
-
// reusing the existing user (account takeover
|
|
84
|
+
// reusing the existing user (account takeover). NO
|
|
85
85
|
// anti-enumeration collapse like invalidSignupToken: whoever gets here
|
|
86
86
|
// controls the inbox (has the magic link), so revealing "email exists"
|
|
87
87
|
// is not new information.
|
|
@@ -101,7 +101,7 @@ export const AuthErrors = {
|
|
|
101
101
|
// deliberate enumeration trade-off: the lockout event itself is already
|
|
102
102
|
// observable to the attacker, and legit users benefit from a clear signal.
|
|
103
103
|
accountLocked: "account_locked",
|
|
104
|
-
//
|
|
104
|
+
// (GDPR Art. 18) — account is in Restricted status. Login is
|
|
105
105
|
// explicitly refused with its own code (not collapsed into
|
|
106
106
|
// invalid_credentials) so the UI can say "account is currently paused,
|
|
107
107
|
// click here to lift it". Enumeration leak accepted: restriction is
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import type { ReactNode } from "react";
|
|
2
2
|
export type DefaultTopbarActionsProps = {
|
|
3
|
-
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
/** Maps a tenant ID to a human-readable name (for example, a branded label
|
|
4
|
+
* per tenant). TenantSwitcher's default otherwise displays the first 8
|
|
5
|
+
* characters of the UUID. */
|
|
6
6
|
readonly tenantName?: (tenantId: string) => string;
|
|
7
|
-
/** Slot
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
/** Slot between TenantSwitcher and ThemeToggle. Typical use case:
|
|
8
|
+
* an app-specific LanguageSwitcher. ReactNode, rather than an array, so the
|
|
9
|
+
* app controls the ordering and spacing. */
|
|
10
10
|
readonly extras?: ReactNode;
|
|
11
|
-
/** Light-
|
|
12
|
-
* Lucide
|
|
11
|
+
/** Light-mode icon for ThemeToggle. Default: Unicode ☀. Apps that want
|
|
12
|
+
* Lucide icons or similar can provide a custom icon element. */
|
|
13
13
|
readonly lightIcon?: ReactNode;
|
|
14
14
|
/** Dark-Mode-Icon. Default: Unicode ☾. */
|
|
15
15
|
readonly darkIcon?: ReactNode;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
// TenantSwitcher (
|
|
5
|
-
// ThemeToggle → UserMenu (
|
|
6
|
-
//
|
|
7
|
-
//
|
|
2
|
+
// Composes the standard top-bar actions for apps with auth and workspaces.
|
|
3
|
+
// This bundles the pattern that each app sample would otherwise write by hand:
|
|
4
|
+
// TenantSwitcher (left) → optional extras (for example, LanguageSwitcher) →
|
|
5
|
+
// ThemeToggle → UserMenu (right). Apps with a custom arrangement can still
|
|
6
|
+
// import the individual components directly; DefaultTopbarActions is
|
|
7
|
+
// convenience, not a requirement.
|
|
8
8
|
import { ThemeToggle } from "@cosmicdrift/kumiko-renderer/web";
|
|
9
9
|
import { TenantSwitcher } from "./tenant-switcher.js";
|
|
10
10
|
import { UserMenu } from "./user-menu.js";
|
|
@@ -2,8 +2,8 @@ import { type ReactNode } from "react";
|
|
|
2
2
|
export type ForgotPasswordScreenProps = {
|
|
3
3
|
readonly title?: string;
|
|
4
4
|
readonly subtitle?: ReactNode;
|
|
5
|
-
/** href
|
|
6
|
-
*
|
|
5
|
+
/** href for the "Back to login" link in the success and form states. App-
|
|
6
|
+
* specific — defaults to "/login". */
|
|
7
7
|
readonly loginHref?: string;
|
|
8
8
|
};
|
|
9
9
|
export declare function ForgotPasswordScreen({ title, subtitle, loginHref, }: ForgotPasswordScreenProps): ReactNode;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
// ForgotPasswordScreen —
|
|
3
|
-
// /api/auth/request-password-reset (silent
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
2
|
+
// ForgotPasswordScreen — form with an email input. Submission triggers
|
|
3
|
+
// /api/auth/request-password-reset (silent success, no account enumeration).
|
|
4
|
+
// The UI always shows a "If an account exists, the email is on its way"
|
|
5
|
+
// confirmation, even when the server determines internally that the email
|
|
6
|
+
// does not exist.
|
|
7
7
|
//
|
|
8
|
-
//
|
|
9
|
-
// /forgot-password)
|
|
10
|
-
// "
|
|
8
|
+
// The app is responsible for mounting and exposing the screen at a URL
|
|
9
|
+
// (for example, /forgot-password); the LoginScreen can link to that app
|
|
10
|
+
// route with a "Forgot password?" link.
|
|
11
11
|
import { usePrimitives, useTranslation } from "@cosmicdrift/kumiko-renderer";
|
|
12
12
|
import { useState } from "react";
|
|
13
13
|
import { requestPasswordReset } from "./auth-client.js";
|
|
@@ -19,7 +19,7 @@ export function ForgotPasswordScreen({ title, subtitle, loginHref = "/login", })
|
|
|
19
19
|
const [submitting, setSubmitting] = useState(false);
|
|
20
20
|
const [done, setDone] = useState(false);
|
|
21
21
|
const [error, setError] = useState(null);
|
|
22
|
-
// guard:dup-ok —
|
|
22
|
+
// guard:dup-ok — same submission pattern as signup-screen, but with different API endpoints and state
|
|
23
23
|
const doSubmit = async () => {
|
|
24
24
|
setSubmitting(true);
|
|
25
25
|
setError(null);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
// Public exports
|
|
2
|
-
//
|
|
3
|
-
// password/web
|
|
4
|
-
// `@cosmicdrift/kumiko-bundled-features/auth-email-password`
|
|
5
|
-
// React-/DOM
|
|
1
|
+
// Public exports for the browser side of the auth-email-password feature.
|
|
2
|
+
// Consumed through the subpath export `@cosmicdrift/kumiko-bundled-features/auth-email-
|
|
3
|
+
// password/web`; the server side (defineFeature) lives in
|
|
4
|
+
// `@cosmicdrift/kumiko-bundled-features/auth-email-password` and has no
|
|
5
|
+
// React-/DOM dependencies. This keeps the separation clean, like renderer vs renderer/web.
|
|
6
6
|
export { AuthRequestError, confirmAccountUnlock, confirmSignup, requestAccountUnlock, requestEmailVerification, requestPasswordReset, requestSignup, resetPassword, toLoginResponse, verifyEmail, } from "./auth-client.js";
|
|
7
7
|
export { AuthCard, AuthShellProvider, useAuthShell } from "./auth-form-primitives.js";
|
|
8
8
|
export { createLoginRoute, makeAuthGate, makeSessionAuthGate } from "./auth-gate.js";
|
|
@@ -12,7 +12,7 @@ export type InviteAcceptScreenProps = {
|
|
|
12
12
|
tenantId: string;
|
|
13
13
|
roles: readonly string[];
|
|
14
14
|
}) => string);
|
|
15
|
-
/** Login
|
|
15
|
+
/** Login href for "Mit anderem Account anmelden". Default "/login". */
|
|
16
16
|
readonly loginHref?: string;
|
|
17
17
|
};
|
|
18
18
|
export declare function InviteAcceptScreen({ title, token: tokenProp, loggedInHref, loginHref, }: InviteAcceptScreenProps): ReactNode;
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
// InviteAcceptScreen —
|
|
2
|
+
// InviteAcceptScreen — accepts tenant invitations through a magic link.
|
|
3
3
|
//
|
|
4
|
-
//
|
|
5
|
-
// - Logged
|
|
6
|
-
// invite-accept).
|
|
7
|
-
//
|
|
8
|
-
// - Anonymous:
|
|
9
|
-
//
|
|
10
|
-
//
|
|
4
|
+
// Reads `?token=...` from the URL and selects a flow based on session state:
|
|
5
|
+
// - Logged in with a matching email: one-click accept (Branch 1, via the
|
|
6
|
+
// invite-accept dispatcher). For an email mismatch, show an error and a
|
|
7
|
+
// "Sign in with a different account" link.
|
|
8
|
+
// - Anonymous: email and password form. The "Already have an account?" toggle
|
|
9
|
+
// selects Branch 2 (existing user, login + accept) or Branch 3 (new user,
|
|
10
|
+
// signup + accept).
|
|
11
11
|
//
|
|
12
|
-
// Anti-enumeration: invalidInviteToken
|
|
13
|
-
//
|
|
12
|
+
// Anti-enumeration: invalidInviteToken collapses token, user, and password
|
|
13
|
+
// failures into one code, using the same trade-off as reset.
|
|
14
14
|
//
|
|
15
|
-
// Auto-
|
|
16
|
-
//
|
|
17
|
-
//
|
|
15
|
+
// Auto-login: Branches 2 and 3 set cookies through the server, then the
|
|
16
|
+
// frontend redirects to loggedInHref. Branch 1 already has a session, but the
|
|
17
|
+
// frontend also redirects to loggedInHref so the invitee enters the new tenant.
|
|
18
18
|
import { usePrimitives, useTranslation } from "@cosmicdrift/kumiko-renderer";
|
|
19
19
|
import { useContext, useState } from "react";
|
|
20
20
|
import { csrfHeader } from "./auth-client.js";
|
|
@@ -60,7 +60,7 @@ export function InviteAcceptScreen({ title, token: tokenProp, loggedInHref = "/"
|
|
|
60
60
|
const acceptLoggedIn = async () => {
|
|
61
61
|
setSubmitting(true);
|
|
62
62
|
setError(null);
|
|
63
|
-
// kumiko-lint-ignore no-raw-hooks
|
|
63
|
+
// kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
|
|
64
64
|
const res = await fetch("/api/auth/invite-accept", {
|
|
65
65
|
method: "POST",
|
|
66
66
|
credentials: "same-origin",
|
|
@@ -79,7 +79,7 @@ export function InviteAcceptScreen({ title, token: tokenProp, loggedInHref = "/"
|
|
|
79
79
|
const acceptAnonExisting = async () => {
|
|
80
80
|
setSubmitting(true);
|
|
81
81
|
setError(null);
|
|
82
|
-
// kumiko-lint-ignore no-raw-hooks
|
|
82
|
+
// kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
|
|
83
83
|
const res = await fetch("/api/auth/invite-accept-with-login", {
|
|
84
84
|
method: "POST",
|
|
85
85
|
credentials: "same-origin",
|
|
@@ -98,7 +98,7 @@ export function InviteAcceptScreen({ title, token: tokenProp, loggedInHref = "/"
|
|
|
98
98
|
const acceptAnonNew = async () => {
|
|
99
99
|
setSubmitting(true);
|
|
100
100
|
setError(null);
|
|
101
|
-
// kumiko-lint-ignore no-raw-hooks
|
|
101
|
+
// kumiko-lint-ignore no-raw-hooks not yet converted to the framework hook set
|
|
102
102
|
const res = await fetch("/api/auth/invite-signup-complete", {
|
|
103
103
|
method: "POST",
|
|
104
104
|
credentials: "same-origin",
|
|
@@ -12,7 +12,7 @@ export type LoginScreenProps = {
|
|
|
12
12
|
* default path once the server offers the reset flow (login-options);
|
|
13
13
|
* `null` hides the link deliberately. */
|
|
14
14
|
readonly forgotPasswordHref?: string | null;
|
|
15
|
-
/** Optional href to RequestAccountUnlockScreen
|
|
15
|
+
/** Optional href to RequestAccountUnlockScreen. When set, an
|
|
16
16
|
* account_locked login error renders an "Unlock account?" link inline —
|
|
17
17
|
* the account-lockout escape hatch, since forgotPasswordHref does NOT
|
|
18
18
|
* help here: the lockout gate blocks login before password verify even
|
|
@@ -9,9 +9,8 @@ import { DEFAULT_AUTH_PATHS, DEFAULT_FORGOT_PASSWORD_PATH } from "./auth-paths.j
|
|
|
9
9
|
import { followNextOrLandingAfterLogin } from "./auth-redirect.js";
|
|
10
10
|
import { AuthQueries } from "./constants.js";
|
|
11
11
|
import { useSession } from "./session.js";
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
// fallen auf `auth.errors.loginFailed` zurück.
|
|
12
|
+
// Maps login-handler reason codes to i18n keys and optional interpolation parameters.
|
|
13
|
+
// Unknown codes fall back to `auth.errors.loginFailed`.
|
|
15
14
|
function reasonToKey(failure) {
|
|
16
15
|
switch (failure.reason) {
|
|
17
16
|
case "invalid_credentials":
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { type ReactNode } from "react";
|
|
2
2
|
export type ResetPasswordScreenProps = {
|
|
3
3
|
readonly title?: string;
|
|
4
|
-
/** Override
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
/** Override for the token from the URL. Apps that pass a token during
|
|
5
|
+
* server-side rendering need this. Default: parsed from `?token=...` in
|
|
6
|
+
* the URL. */
|
|
7
7
|
readonly token?: string;
|
|
8
|
-
/** href
|
|
8
|
+
/** href for the "Zum Login" link after success. Default "/login". */
|
|
9
9
|
readonly loginHref?: string;
|
|
10
10
|
};
|
|
11
11
|
export declare function ResetPasswordScreen({ title, token: tokenProp, loginHref, }: ResetPasswordScreenProps): ReactNode;
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
// ResetPasswordScreen
|
|
3
|
-
// new
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
2
|
+
// ResetPasswordScreen reads `?token=...` from the URL and shows fields for
|
|
3
|
+
// a new and confirmed password. Submission calls /api/auth/reset-password
|
|
4
|
+
// with the token. The server collapses all token-verification failures into
|
|
5
|
+
// one code (anti-enumeration), so the UI shows the unified "link invalid or
|
|
6
|
+
// expired" message.
|
|
7
7
|
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
// durch — dann bleibt die URL unangetastet.
|
|
8
|
+
// The token is read once via useUrlToken(): `?token=...` is read on mount and
|
|
9
|
+
// then scrubbed from the URL. Apps that need different behavior can pass a
|
|
10
|
+
// server-injected token through the `token` prop; the URL is then left intact.
|
|
12
11
|
import { usePrimitives, useTranslation } from "@cosmicdrift/kumiko-renderer";
|
|
13
12
|
import { useState } from "react";
|
|
14
13
|
import { resetPassword } from "./auth-client.js";
|
|
@@ -56,10 +55,10 @@ export function ResetPasswordScreen({ title, token: tokenProp, loginHref = "/log
|
|
|
56
55
|
void doSubmit();
|
|
57
56
|
};
|
|
58
57
|
const effectiveTitle = title ?? t("auth.resetPassword.title");
|
|
59
|
-
//
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
//
|
|
58
|
+
// No token in the URL: the user should click the link from their email again
|
|
59
|
+
// or request a new reset. Submitting without a token would only show the
|
|
60
|
+
// invalidResetToken error, which is confusing, so show a clear message
|
|
61
|
+
// immediately instead.
|
|
63
62
|
if (token === "") {
|
|
64
63
|
return (_jsxs(AuthCard, { title: effectiveTitle, children: [_jsx("p", { className: "text-sm text-muted-foreground", children: t("auth.resetPassword.missingToken") }), _jsx(Link, { href: loginHref, variant: "muted", children: t("auth.resetPassword.goToLogin") })] }));
|
|
65
64
|
}
|