@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
|
@@ -11,29 +11,28 @@ export declare const subscriptionMollieEnvSchema: z.ZodObject<{
|
|
|
11
11
|
MOLLIE_API_KEY: z.ZodString;
|
|
12
12
|
}, z.core.$strip>;
|
|
13
13
|
export type SubscriptionMollieOptions = {
|
|
14
|
-
/** Mollie
|
|
15
|
-
*
|
|
14
|
+
/** Mollie API key (`test_...` or `live_...`). App-wide, mounted from
|
|
15
|
+
* process.env or system configuration. */
|
|
16
16
|
readonly apiKey: string;
|
|
17
|
-
/** Foundation
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* webhooks an diese URL. Typisch:
|
|
17
|
+
/** Foundation webhook URL registered by the app builder in the Mollie
|
|
18
|
+
* dashboard. The plugin passes it to Mollie when creating a payment;
|
|
19
|
+
* Mollie sends payment-event webhooks to this URL. Typically:
|
|
21
20
|
* `https://app.example.com/api/subscription/webhook/mollie`. */
|
|
22
21
|
readonly webhookUrl: string;
|
|
23
|
-
/** Price-to-tier
|
|
24
|
-
* metadata (= `metadata.priceId`
|
|
25
|
-
* createCheckoutSession
|
|
22
|
+
/** Price-to-tier map. The plugin reads the priceId from the subscription
|
|
23
|
+
* metadata (= `metadata.priceId` set by the app builder when calling
|
|
24
|
+
* createCheckoutSession) and maps it to a tier name. */
|
|
26
25
|
readonly priceToTier: Readonly<Record<string, string>>;
|
|
27
|
-
/** Mollie
|
|
28
|
-
*
|
|
29
|
-
*
|
|
26
|
+
/** Mollie subscription setup per priceId. Mollie has no native price-ID
|
|
27
|
+
* concept, so the app builder must provide an amount/interval/description
|
|
28
|
+
* for each virtual priceId. */
|
|
30
29
|
readonly priceToConfig: Readonly<Record<string, MolliePriceConfig>>;
|
|
31
|
-
/** @internal Test-only injection
|
|
32
|
-
*
|
|
33
|
-
* factory
|
|
34
|
-
*
|
|
35
|
-
* factory
|
|
36
|
-
*
|
|
30
|
+
/** @internal Test-only injection port: replaces the verify-webhook fetch
|
|
31
|
+
* client with a mock instance. Production leaves this undefined; the
|
|
32
|
+
* factory builds the adapter from `createMollieClient(apiKey)`. The
|
|
33
|
+
* integration test (mollie-foundation.integration.ts) uses it so the real
|
|
34
|
+
* factory code (drift validation, plugin registration) runs in the test
|
|
35
|
+
* path without making Mollie API calls. */
|
|
37
36
|
readonly _clientShapeForTests?: MollieClientShape;
|
|
38
37
|
};
|
|
39
38
|
export declare function createSubscriptionMollieFeature(options: SubscriptionMollieOptions): FeatureDefinition;
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
// kumiko-feature-version: 1
|
|
2
2
|
//
|
|
3
|
-
// subscription-mollie — Mollie
|
|
4
|
-
//
|
|
3
|
+
// subscription-mollie — Mollie plugin for subscription-foundation
|
|
4
|
+
// plugin API (EU compliance for the DACH mid-market).
|
|
5
5
|
//
|
|
6
|
-
// **Factory
|
|
7
|
-
// mount
|
|
8
|
-
//
|
|
9
|
-
// 4.5.0
|
|
10
|
-
//
|
|
11
|
-
//
|
|
6
|
+
// **Factory pattern (analogous to subscription-stripe):** reads the API key
|
|
7
|
+
// at mount time from the factory options (typically process.env from the app
|
|
8
|
+
// builder's bin/server.ts). Mollie has NO webhook secret — Mollie SDK
|
|
9
|
+
// 4.5.0 provides no native HMAC signature verification API. Security comes
|
|
10
|
+
// from non-guessable IDs + API validation; the app builder can optionally
|
|
11
|
+
// add a URL-token wrapper in front.
|
|
12
12
|
//
|
|
13
|
-
// **
|
|
13
|
+
// **Scope:**
|
|
14
14
|
// - verifyAndParseWebhook ✓ (lazy-fetch payment + subscription via
|
|
15
|
-
// Mollie
|
|
16
|
-
// - createCheckoutSession ✓ (Mollie's
|
|
17
|
-
//
|
|
18
|
-
// - createPortalSession ✗ (Mollie
|
|
19
|
-
// - cancelSubscription ✗ (Mollie
|
|
20
|
-
// subId;
|
|
21
|
-
// via Mollie
|
|
15
|
+
// Mollie API, heuristic event-type mapping)
|
|
16
|
+
// - createCheckoutSession ✓ (Mollie's multistep flow: create customer
|
|
17
|
+
// + first payment with sequenceType="first" → redirectUrl)
|
|
18
|
+
// - createPortalSession ✗ (Mollie has no customer portal)
|
|
19
|
+
// - cancelSubscription ✗ (Mollie additionally requires customerId besides
|
|
20
|
+
// subId; the plugin contract does not pass it through — the app builder
|
|
21
|
+
// cancels via the Mollie dashboard or a custom route)
|
|
22
22
|
//
|
|
23
|
-
// **
|
|
23
|
+
// **Example usage in run-config.ts:**
|
|
24
24
|
//
|
|
25
25
|
// const features = [
|
|
26
26
|
// billingFoundationFeature,
|
|
@@ -64,8 +64,8 @@ export function createSubscriptionMollieFeature(options) {
|
|
|
64
64
|
if (options.webhookUrl.length === 0) {
|
|
65
65
|
throw new Error("subscription-mollie: webhookUrl is empty. Set the foundation-webhook-URL where Mollie sends events.");
|
|
66
66
|
}
|
|
67
|
-
// Drift
|
|
68
|
-
//
|
|
67
|
+
// Drift guard: priceToTier and priceToConfig must have identical keys;
|
|
68
|
+
// otherwise verifyAndParseWebhook silently returns null.
|
|
69
69
|
const tierKeys = new Set(Object.keys(options.priceToTier));
|
|
70
70
|
const configKeys = new Set(Object.keys(options.priceToConfig));
|
|
71
71
|
const missingInConfig = [...tierKeys].filter((k) => !configKeys.has(k));
|
|
@@ -76,9 +76,9 @@ export function createSubscriptionMollieFeature(options) {
|
|
|
76
76
|
`priceIds in config but missing tier: [${missingInTier.join(", ")}]`);
|
|
77
77
|
}
|
|
78
78
|
const client = createMollieClient({ apiKey: options.apiKey });
|
|
79
|
-
// Adapter
|
|
80
|
-
//
|
|
81
|
-
//
|
|
79
|
+
// Adapter that binds the plugin's minimal fetch client to the full Mollie
|
|
80
|
+
// client. The minimal plugin fetch API lets tests mock it without mocking
|
|
81
|
+
// the full MollieClient.
|
|
82
82
|
const fetchAdapter = options._clientShapeForTests ?? {
|
|
83
83
|
payments: { get: (id) => client.payments.get(id) },
|
|
84
84
|
customerSubscriptions: {
|
|
@@ -107,8 +107,8 @@ export function createSubscriptionMollieFeature(options) {
|
|
|
107
107
|
const plugin = {
|
|
108
108
|
verifyAndParseWebhook: verifyAndParse,
|
|
109
109
|
createCheckoutSession: checkoutSession,
|
|
110
|
-
// createPortalSession
|
|
111
|
-
// plugin-methods.ts
|
|
110
|
+
// createPortalSession and cancelSubscription are intentionally omitted;
|
|
111
|
+
// see plugin-methods.ts for why.
|
|
112
112
|
priceToTier: options.priceToTier,
|
|
113
113
|
};
|
|
114
114
|
r.useExtension("subscriptionProvider", MOLLIE_PROVIDER_NAME, plugin);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Public API of the subscription-mollie bundled-feature.
|
|
2
2
|
//
|
|
3
|
-
// **Internal-only** (
|
|
4
|
-
// - verifyAndParseMollieWebhook (
|
|
3
|
+
// **Internal-only** (not in the public barrel—the App Builder never uses it directly):
|
|
4
|
+
// - verifyAndParseMollieWebhook (called internally by the feature.ts factory)
|
|
5
5
|
// - mapMollieEventType / mapMollieStatus / extractMollieId (pure helpers,
|
|
6
|
-
// test-only
|
|
6
|
+
// test-only—direct-import from the file if ever genuinely needed externally)
|
|
7
7
|
export { MOLLIE_PROVIDER_NAME, SUBSCRIPTION_MOLLIE_FEATURE } from "./constants.js";
|
|
8
8
|
export { createSubscriptionMollieFeature, subscriptionMollieEnvSchema, } from "./feature.js";
|
|
@@ -2,8 +2,8 @@ import type { SubscriptionProviderPlugin } from "@cosmicdrift/kumiko-bundled-fea
|
|
|
2
2
|
import type { HandlerContext } from "@cosmicdrift/kumiko-framework/engine";
|
|
3
3
|
import type { MollieClient } from "@mollie/api-client";
|
|
4
4
|
export type MollieCheckoutOptions = Parameters<NonNullable<SubscriptionProviderPlugin["createCheckoutSession"]>>[1];
|
|
5
|
-
/** Mollie
|
|
6
|
-
*
|
|
5
|
+
/** Mollie has no native price ID concept; the App Builder maintains
|
|
6
|
+
* an amount/interval/description for each virtual priceId. */
|
|
7
7
|
export type MolliePriceConfig = {
|
|
8
8
|
/** Mollie-format: 2-decimal string, z.B. `"9.99"`. */
|
|
9
9
|
readonly amountValue: string;
|
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
// Mollie
|
|
2
|
-
// createCheckoutSession
|
|
3
|
-
//
|
|
1
|
+
// Mollie plugin methods for the POST-tenant-resolution phase:
|
|
2
|
+
// createCheckoutSession only. createPortalSession and cancelSubscription
|
|
3
|
+
// are not implemented because Mollie's API does not provide these patterns
|
|
4
|
+
// 1:1:
|
|
4
5
|
//
|
|
5
|
-
// - **Portal:** Mollie
|
|
6
|
-
//
|
|
7
|
-
// - **Cancel:** Mollie
|
|
8
|
-
//
|
|
9
|
-
//
|
|
6
|
+
// - **Portal:** Mollie has no customer portal, so the App Builder UI must
|
|
7
|
+
// render it itself.
|
|
8
|
+
// - **Cancel:** Mollie requires (customerId, subId), but the plugin contract
|
|
9
|
+
// passes through only subId. The App Builder cancels through the Mollie
|
|
10
|
+
// dashboard or a custom route until the Foundation contract is extended.
|
|
10
11
|
//
|
|
11
|
-
// **Mollie
|
|
12
|
-
// payment
|
|
13
|
-
// Mollie
|
|
14
|
-
//
|
|
12
|
+
// **The Mollie checkout flow has multiple steps:** create customer → first
|
|
13
|
+
// payment with sequenceType="first" (= mandate setup) → user pays →
|
|
14
|
+
// Mollie webhook → verify-webhook creates the Mollie subscription
|
|
15
|
+
// idempotently (see verify-webhook.ts ensureSubscriptionForMandate).
|
|
15
16
|
import { SequenceType } from "@mollie/api-client";
|
|
16
17
|
export function createMollieCheckoutSession(client, priceToConfig, appWebhookUrl) {
|
|
17
18
|
return async (_ctx, options) => {
|
|
@@ -36,8 +37,8 @@ export function createMollieCheckoutSession(client, priceToConfig, appWebhookUrl
|
|
|
36
37
|
// sequenceType "first", so verifyAndParseMollieWebhook drops them before
|
|
37
38
|
// any mandate/subscription handling.
|
|
38
39
|
const sequenceType = options.mode === "payment" ? SequenceType.oneoff : SequenceType.first;
|
|
39
|
-
// payments.create
|
|
40
|
-
//
|
|
40
|
+
// payments.create is overloaded (Promise or void with a callback);
|
|
41
|
+
// explicitly cast to the Promise<Payment> overload.
|
|
41
42
|
const payment = (await client.payments.create({
|
|
42
43
|
amount: { currency: priceCfg.amountCurrency, value: priceCfg.amountValue },
|
|
43
44
|
description: priceCfg.description,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { type SubscriptionEvent, type SubscriptionEventType, type SubscriptionStatus } from "@cosmicdrift/kumiko-bundled-features/billing-foundation";
|
|
2
2
|
import type { Payment as MolliePayment, Subscription as MollieSubscription } from "@mollie/api-client";
|
|
3
3
|
import type { MolliePriceConfig } from "./plugin-methods.ts";
|
|
4
|
-
/** Minimal
|
|
5
|
-
*
|
|
6
|
-
* feature.ts
|
|
4
|
+
/** Minimal subset of the Mollie client used by the plugin — kept separate
|
|
5
|
+
* so tests can mock it without the full MollieClient. The adapter in
|
|
6
|
+
* feature.ts bridges it to the real SDK. */
|
|
7
7
|
export type MollieClientShape = {
|
|
8
8
|
readonly payments: {
|
|
9
9
|
readonly get: (id: string) => Promise<MolliePayment>;
|
|
@@ -23,18 +23,18 @@ export type MollieClientShape = {
|
|
|
23
23
|
};
|
|
24
24
|
};
|
|
25
25
|
export type MollieWebhookOptions = {
|
|
26
|
-
/** priceId (=
|
|
26
|
+
/** priceId (= virtual key from subscription.metadata) → tier name. */
|
|
27
27
|
readonly priceToTier: Readonly<Record<string, string>>;
|
|
28
|
-
/** priceId → amount/interval/description.
|
|
29
|
-
* flow
|
|
30
|
-
*
|
|
28
|
+
/** priceId → amount/interval/description. Needed for the mandate-setup
|
|
29
|
+
* flow's `customerSubscriptions.create` call. The app builder maintains
|
|
30
|
+
* this map once in the factory options. */
|
|
31
31
|
readonly priceToConfig: Readonly<Record<string, MolliePriceConfig>>;
|
|
32
32
|
};
|
|
33
33
|
export declare function verifyAndParseMollieWebhook(client: MollieClientShape, options: MollieWebhookOptions): (rawBody: string, headers: Record<string, string>) => Promise<SubscriptionEvent | null>;
|
|
34
|
-
/**
|
|
34
|
+
/** Extracts `id` from rawBody — supports form-urlencoded and JSON. */
|
|
35
35
|
export declare function extractMollieId(rawBody: string, headers: Record<string, string>): string | null;
|
|
36
|
-
/** Mollie
|
|
37
|
-
*
|
|
36
|
+
/** Mollie subscription + optional payment → SubscriptionEventType.
|
|
37
|
+
* Heuristic because Mollie has no explicitly typed events. */
|
|
38
38
|
export declare function mapMollieEventType(subscription: MollieSubscription, triggerPayment: MolliePayment | null): SubscriptionEventType | null;
|
|
39
39
|
/** Mollie-status → normalized. */
|
|
40
40
|
export declare function mapMollieStatus(mollieStatus: MollieSubscription["status"]): SubscriptionStatus;
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
// verifyAndParseMollieWebhook
|
|
2
|
-
//
|
|
3
|
-
// `verifyAndParseWebhook
|
|
1
|
+
// verifyAndParseMollieWebhook: Mollie-specific lazy fetch plus event-type
|
|
2
|
+
// heuristic. The plugin build (feature.ts) registers it as
|
|
3
|
+
// `verifyAndParseWebhook`.
|
|
4
4
|
//
|
|
5
|
-
// Mollie's classic
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
5
|
+
// Mollie's classic webhook sends only an `id` (form-urlencoded or JSON), so
|
|
6
|
+
// the payment and subscription are lazily fetched through the Mollie API.
|
|
7
|
+
// sub_xxx events are NOT supported; app builders get them indirectly through
|
|
8
|
+
// tr_xxx payment events (Mollie sends both in parallel for normal lifecycle
|
|
9
|
+
// events).
|
|
10
10
|
//
|
|
11
|
-
// **Mandate
|
|
12
|
-
// `payment.subscriptionId === null` (Mollie's
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
11
|
+
// **Mandate setup flow:** the first paid payment arrives with
|
|
12
|
+
// `payment.subscriptionId === null` (Mollie's pattern: the app builder must
|
|
13
|
+
// call `customerSubscriptions.create` itself). The plugin does that
|
|
14
|
+
// (idempotent via a list check) so the foundation receives a created event
|
|
15
|
+
// with a subscription id.
|
|
16
16
|
import { parseProviderConsentId, SubscriptionEventTypes, SubscriptionStatuses, } from "@cosmicdrift/kumiko-bundled-features/billing-foundation";
|
|
17
17
|
import { createFallbackLogger } from "@cosmicdrift/kumiko-framework/logging";
|
|
18
18
|
import { Temporal } from "@cosmicdrift/kumiko-types/temporal";
|
|
@@ -53,7 +53,7 @@ export function verifyAndParseMollieWebhook(client, options) {
|
|
|
53
53
|
return null;
|
|
54
54
|
}
|
|
55
55
|
else {
|
|
56
|
-
// One-shot
|
|
56
|
+
// One-shot or first-payment-failed events are outside our domain.
|
|
57
57
|
return null;
|
|
58
58
|
}
|
|
59
59
|
}
|
|
@@ -80,8 +80,8 @@ export function verifyAndParseMollieWebhook(client, options) {
|
|
|
80
80
|
const status = mapMollieStatus(subscription.status);
|
|
81
81
|
const periodEndSource = subscription.nextPaymentDate ?? subscription.startDate;
|
|
82
82
|
if (!periodEndSource) {
|
|
83
|
-
// Mollie
|
|
84
|
-
//
|
|
83
|
+
// Mollie API drift: valid subscriptions have at least startDate. Fail
|
|
84
|
+
// loudly so the app owner's monitoring can detect the drift.
|
|
85
85
|
throw new Error(`subscription-mollie: subscription ${subscription.id} has neither nextPaymentDate nor startDate`);
|
|
86
86
|
}
|
|
87
87
|
const currentPeriodEnd = mollieDateStringToInstantIso(periodEndSource);
|
|
@@ -103,9 +103,9 @@ export function verifyAndParseMollieWebhook(client, options) {
|
|
|
103
103
|
// =============================================================================
|
|
104
104
|
// Mandate-setup: subscription on-the-fly erstellen
|
|
105
105
|
// =============================================================================
|
|
106
|
-
/** first-payment-paid
|
|
107
|
-
* Idempotent via list
|
|
108
|
-
*
|
|
106
|
+
/** `first-payment-paid` without subscriptionId → create a Mollie subscription.
|
|
107
|
+
* Idempotent via a list check (replay-safe). Returns null for incomplete
|
|
108
|
+
* metadata or an unknown priceId. */
|
|
109
109
|
async function ensureSubscriptionForMandate(client, options, payment) {
|
|
110
110
|
const customerId = payment.customerId;
|
|
111
111
|
if (!customerId)
|
|
@@ -136,9 +136,9 @@ async function ensureSubscriptionForMandate(client, options, payment) {
|
|
|
136
136
|
});
|
|
137
137
|
}
|
|
138
138
|
// =============================================================================
|
|
139
|
-
// Helpers (exported
|
|
139
|
+
// Helpers (exported for tests)
|
|
140
140
|
// =============================================================================
|
|
141
|
-
/**
|
|
141
|
+
/** Extracts `id` from rawBody — supports form-urlencoded and JSON. */
|
|
142
142
|
export function extractMollieId(rawBody, headers) {
|
|
143
143
|
const contentType = headers["content-type"] ?? "";
|
|
144
144
|
if (contentType.includes("application/json")) {
|
|
@@ -156,8 +156,8 @@ export function extractMollieId(rawBody, headers) {
|
|
|
156
156
|
const params = new URLSearchParams(rawBody);
|
|
157
157
|
return params.get("id");
|
|
158
158
|
}
|
|
159
|
-
/** Mollie
|
|
160
|
-
*
|
|
159
|
+
/** Mollie subscription + optional payment → SubscriptionEventType.
|
|
160
|
+
* Heuristic because Mollie has no explicitly typed events. */
|
|
161
161
|
export function mapMollieEventType(subscription, triggerPayment) {
|
|
162
162
|
if (subscription.status === "canceled" || subscription.status === "completed") {
|
|
163
163
|
return SubscriptionEventTypes.canceled;
|
|
@@ -184,10 +184,10 @@ export function mapMollieStatus(mollieStatus) {
|
|
|
184
184
|
return SubscriptionStatuses.active;
|
|
185
185
|
case "canceled":
|
|
186
186
|
case "completed":
|
|
187
|
-
// completed =
|
|
187
|
+
// completed = all `times` charges have run → treat it like canceled.
|
|
188
188
|
return SubscriptionStatuses.canceled;
|
|
189
189
|
case "suspended":
|
|
190
|
-
//
|
|
190
|
+
// Invalid mandate / payment method failed → grace period.
|
|
191
191
|
return SubscriptionStatuses.pastDue;
|
|
192
192
|
case "pending":
|
|
193
193
|
return SubscriptionStatuses.incomplete;
|
|
@@ -195,8 +195,8 @@ export function mapMollieStatus(mollieStatus) {
|
|
|
195
195
|
return SubscriptionStatuses.incomplete;
|
|
196
196
|
}
|
|
197
197
|
}
|
|
198
|
-
/** Mollie
|
|
199
|
-
* Throws
|
|
198
|
+
/** Mollie provides dates as YYYY-MM-DD; Foundation requires an ISO Instant.
|
|
199
|
+
* Throws on malformed input (= Mollie API drift, which should fail loudly). */
|
|
200
200
|
function mollieDateStringToInstantIso(dateString) {
|
|
201
201
|
return Temporal.Instant.from(`${dateString.slice(0, 10)}T00:00:00Z`).toString();
|
|
202
202
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Feature name
|
|
2
2
|
export const SUBSCRIPTION_STRIPE_FEATURE = "subscription-stripe";
|
|
3
|
-
// entityName under
|
|
4
|
-
//
|
|
3
|
+
// entityName under which the plugin registers itself as
|
|
4
|
+
// "subscriptionProvider". It must match the path segment in the webhook URL
|
|
5
5
|
// `/api/subscription/webhook/stripe`.
|
|
6
6
|
export const STRIPE_PROVIDER_NAME = "stripe";
|
|
7
7
|
// Config-key short-names, qualified to `subscription-stripe:config:<name>`
|
|
@@ -11,10 +11,8 @@ export const STRIPE_PROVIDER_NAME = "stripe";
|
|
|
11
11
|
export const STRIPE_API_KEY_CONFIG = "api-key";
|
|
12
12
|
export const STRIPE_WEBHOOK_SECRET_CONFIG = "webhook-secret";
|
|
13
13
|
export const STRIPE_BILLING_LIVE_CONFIG = "billingLive";
|
|
14
|
-
//
|
|
15
|
-
// Stripe
|
|
16
|
-
// mappen. Stripe hat ~80 event-types insgesamt; wir filtern auf 5.
|
|
17
|
-
// =============================================================================
|
|
14
|
+
// Stripe event types that map to normalized SubscriptionEventTypes.
|
|
15
|
+
// Stripe has approximately 80 event types; we filter to five.
|
|
18
16
|
export const StripeEventTypes = {
|
|
19
17
|
customerSubscriptionCreated: "customer.subscription.created",
|
|
20
18
|
customerSubscriptionUpdated: "customer.subscription.updated",
|
|
@@ -28,17 +28,17 @@ export declare function stripeEnvSchema<const TPrice extends string>(options: {
|
|
|
28
28
|
STRIPE_API_KEY: z.ZodOptional<z.ZodString>;
|
|
29
29
|
} & StripePriceEnvShape<TPrice> extends infer T ? { -readonly [P in keyof T]: T[P]; } : never, z.core.$strip>;
|
|
30
30
|
export type SubscriptionStripeOptions = {
|
|
31
|
-
/** Bridge-fallback webhook
|
|
32
|
-
* `subscription-stripe:config:webhook-secret
|
|
33
|
-
*
|
|
31
|
+
/** Bridge-fallback webhook secret. Optional: v2 reads from the
|
|
32
|
+
* `subscription-stripe:config:webhook-secret` key (backing:"secrets").
|
|
33
|
+
* Set only during the env→secrets transition phase / in tests. */
|
|
34
34
|
readonly webhookSecret?: string;
|
|
35
|
-
/** Bridge-fallback
|
|
36
|
-
* `subscription-stripe:config:api-key
|
|
35
|
+
/** Bridge-fallback API key. Optional: v2 reads from the
|
|
36
|
+
* `subscription-stripe:config:api-key` key (backing:"secrets"). */
|
|
37
37
|
readonly apiKey?: string;
|
|
38
|
-
/** Price-to-tier
|
|
39
|
-
* (subscription.items.data[0].price.id)
|
|
40
|
-
* App-
|
|
41
|
-
* → null (event ignored). */
|
|
38
|
+
/** Price-to-tier mapping. The plugin reads the price ID from the Stripe
|
|
39
|
+
* event (subscription.items.data[0].price.id) and maps it to a tier name.
|
|
40
|
+
* App-specific, so it remains a factory option. If the price ID is absent
|
|
41
|
+
* from the mapping → null (event ignored). */
|
|
42
42
|
readonly priceToTier?: Readonly<Record<string, string>>;
|
|
43
43
|
/** Whether a mode:"payment" checkout (one-off top-ups etc.) gets a Stripe
|
|
44
44
|
* invoice — a receipt/invoice document Stripe generates and sends to the
|
|
@@ -56,11 +56,11 @@ export type SubscriptionStripeOptions = {
|
|
|
56
56
|
readonly oneOffPriceIds?: readonly string[];
|
|
57
57
|
};
|
|
58
58
|
/**
|
|
59
|
-
* Factory
|
|
60
|
-
* key-presence
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* extension
|
|
59
|
+
* Factory for the subscription-stripe feature. Always mounts (no
|
|
60
|
+
* key-presence guard) — activity is gated at runtime through config/secrets
|
|
61
|
+
* (following the feature-toggles pattern). The returned FeatureDefinition
|
|
62
|
+
* registers the plugin under billing-foundation's "subscriptionProvider"
|
|
63
|
+
* extension with entityName "stripe".
|
|
64
64
|
*/
|
|
65
65
|
export declare function createSubscriptionStripeFeature(options?: SubscriptionStripeOptions): FeatureWithEnvSchema<FeatureDefinition, typeof subscriptionStripeEnvSchema.shape>;
|
|
66
66
|
export {};
|
|
@@ -1,35 +1,36 @@
|
|
|
1
1
|
// kumiko-feature-version: 3
|
|
2
2
|
//
|
|
3
|
-
// subscription-stripe — Stripe
|
|
4
|
-
//
|
|
3
|
+
// subscription-stripe — Stripe plugin for the billing-foundation
|
|
4
|
+
// plugin API.
|
|
5
5
|
//
|
|
6
|
-
// **Runtime
|
|
7
|
-
//
|
|
8
|
-
// mount-time
|
|
9
|
-
//
|
|
6
|
+
// **Runtime config (v3):** Stripe credentials and the billing-live master
|
|
7
|
+
// switch come from the config feature AT RUNTIME, no longer from a
|
|
8
|
+
// mount-time closure. This allows keys to rotate and production to go live
|
|
9
|
+
// without a redeploy — and the input form is generated automatically.
|
|
10
10
|
// - `subscription-stripe:config:api-key` + `:webhook-secret` → system
|
|
11
|
-
// config keys
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
11
|
+
// config keys with **backing:"secrets"**: the value is envelope-encrypted
|
|
12
|
+
// in the secrets store under SYSTEM_TENANT_ID and addressed as a
|
|
13
|
+
// config key. `mask` derives the sysadmin configEdit screen +
|
|
14
|
+
// Settings-Hub navigation — the app no longer needs handwritten
|
|
15
|
+
// r.screen/r.nav entries (v2 used `r.secret` keys + an app-owned form).
|
|
16
16
|
// - `subscription-stripe:config:billing-live` (shortKey `billingLive`,
|
|
17
|
-
// kebab-
|
|
18
|
-
// (boolean, default false).
|
|
19
|
-
//
|
|
20
|
-
//
|
|
17
|
+
// kebab-qualified by r.config) → **system config**
|
|
18
|
+
// (boolean, default false). The master switch: without it, checkout may
|
|
19
|
+
// not create a Stripe session; this is enforced in the
|
|
20
|
+
// createCheckoutSession gate.
|
|
21
21
|
//
|
|
22
|
-
// **Factory
|
|
23
|
-
// apiKey, webhookSecret, priceToTier })`
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
// (Stripe
|
|
27
|
-
//
|
|
22
|
+
// **Factory options as fallback:** `createSubscriptionStripeFeature({
|
|
23
|
+
// apiKey, webhookSecret, priceToTier })` remains — apiKey/webhookSecret
|
|
24
|
+
// are now OPTIONAL and serve only as fallbacks during the env→secrets
|
|
25
|
+
// bridge phase and in tests that do not wire a secrets context. `priceToTier`
|
|
26
|
+
// (Stripe price ID → app tier name) remains a factory option: it is
|
|
27
|
+
// app-specific, is not a secret, and changes infrequently.
|
|
28
28
|
//
|
|
29
|
-
// **Webhook + system
|
|
30
|
-
// (
|
|
31
|
-
//
|
|
32
|
-
// webhook
|
|
29
|
+
// **Webhook + system secrets:** verifyAndParseWebhook is pre-tenant
|
|
30
|
+
// (no ctx). The billing-foundation webhook handler passes a system-scoped
|
|
31
|
+
// SecretsContext as the third argument, from which the plugin reads the
|
|
32
|
+
// api key + webhook secret without auditing (a sanctioned framework-internal
|
|
33
|
+
// read).
|
|
33
34
|
import { access, createSystemConfig, defineFeature, } from "@cosmicdrift/kumiko-framework/engine";
|
|
34
35
|
import { featureWithEnvSchema } from "@cosmicdrift/kumiko-framework/env";
|
|
35
36
|
import * as z from "zod";
|
|
@@ -92,11 +93,11 @@ function validateOneOffPriceIds(priceIds) {
|
|
|
92
93
|
}
|
|
93
94
|
}
|
|
94
95
|
/**
|
|
95
|
-
* Factory
|
|
96
|
-
* key-presence
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
* extension
|
|
96
|
+
* Factory for the subscription-stripe feature. Always mounts (no
|
|
97
|
+
* key-presence guard) — activity is gated at runtime through config/secrets
|
|
98
|
+
* (following the feature-toggles pattern). The returned FeatureDefinition
|
|
99
|
+
* registers the plugin under billing-foundation's "subscriptionProvider"
|
|
100
|
+
* extension with entityName "stripe".
|
|
100
101
|
*/
|
|
101
102
|
export function createSubscriptionStripeFeature(options = {}) {
|
|
102
103
|
validateOneOffPriceIds(options.oneOffPriceIds ?? []);
|
|
@@ -118,15 +119,15 @@ export function createSubscriptionStripeFeature(options = {}) {
|
|
|
118
119
|
// the value lives envelope-encrypted in the secrets store under
|
|
119
120
|
// SYSTEM_TENANT_ID, while `mask` derives the sysadmin settings screen +
|
|
120
121
|
// Settings-Hub nav (no hand-written r.screen/r.nav in the consuming app).
|
|
121
|
-
// billingLive is the
|
|
122
|
+
// billingLive is the master switch. The factory-fallback
|
|
122
123
|
// (options.apiKey/.webhookSecret) covers the env→secrets bridge + tests.
|
|
123
124
|
const configKeys = r.config({
|
|
124
125
|
keys: {
|
|
125
126
|
[STRIPE_API_KEY_CONFIG]: createSystemConfig("text", {
|
|
126
127
|
backing: "secrets",
|
|
127
|
-
// Prefix
|
|
128
|
-
//
|
|
129
|
-
// base62
|
|
128
|
+
// Prefix guard, matching subscriptionStripeEnvSchema:
|
|
129
|
+
// catches the wrong-field paste error (pk_/price_) without
|
|
130
|
+
// constraining the base62 body. Anchored, with no backtracking → no ReDoS.
|
|
130
131
|
pattern: { regex: "^(sk|rk)_(test|live)_" },
|
|
131
132
|
write: access.systemAdmin,
|
|
132
133
|
read: access.admin,
|
|
@@ -171,6 +172,7 @@ export function createSubscriptionStripeFeature(options = {}) {
|
|
|
171
172
|
const priceCache = createStripePriceCache();
|
|
172
173
|
const portalConfigurationCache = new Map();
|
|
173
174
|
const plugin = {
|
|
175
|
+
displayName: "Stripe",
|
|
174
176
|
verifyAndParseWebhook: verifyAndParseStripeWebhook(runtimes.webhook, {
|
|
175
177
|
priceToTier: options.priceToTier ?? {},
|
|
176
178
|
}),
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
// Public API of the subscription-stripe bundled
|
|
1
|
+
// Public API of the subscription-stripe bundled feature.
|
|
2
2
|
//
|
|
3
|
-
// **Internal-only** (
|
|
4
|
-
// - StripeWebhookOptions / verifyAndParseStripeWebhook (
|
|
5
|
-
// feature.ts factory
|
|
6
|
-
// - mapStripeEventType / mapStripeStatus (pure helpers,
|
|
7
|
-
//
|
|
3
|
+
// **Internal-only** (not in the public barrel — the App Builder never uses it directly):
|
|
4
|
+
// - StripeWebhookOptions / verifyAndParseStripeWebhook (called internally by the
|
|
5
|
+
// feature.ts factory)
|
|
6
|
+
// - mapStripeEventType / mapStripeStatus (pure helpers, for tests only;
|
|
7
|
+
// import directly from the file only if truly needed externally)
|
|
8
8
|
export { STRIPE_PROVIDER_NAME, StripeEventTypes, SUBSCRIPTION_STRIPE_FEATURE, } from "./constants.js";
|
|
9
9
|
export { createSubscriptionStripeFeature, stripeEnvSchema, subscriptionStripeEnvSchema, } from "./feature.js";
|