@cosmicdrift/kumiko-samples 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/README.md +1 -1
- package/package.json +2 -2
- package/packages/bundled-features/package.json +9 -2
- package/packages/bundled-features/src/agent-tools/changes.json +6 -0
- package/packages/bundled-features/src/agent-tools/tool-catalog.ts +1 -1
- package/packages/bundled-features/src/agent-tools/tool-dispatch.ts +9 -9
- package/packages/bundled-features/src/audit/changes.json +12 -0
- package/packages/bundled-features/src/audit/handlers/audit-events.ts +1 -1
- package/packages/bundled-features/src/audit/screens.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/auth-user-row.ts +10 -10
- package/packages/bundled-features/src/auth-email-password/feature.ts +6 -6
- package/packages/bundled-features/src/auth-email-password/handlers/change-password.write.ts +3 -3
- package/packages/bundled-features/src/auth-email-password/handlers/confirm-token-flow.ts +5 -5
- package/packages/bundled-features/src/auth-email-password/handlers/invite-accept-with-login.write.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/invite-accept.write.ts +18 -18
- package/packages/bundled-features/src/auth-email-password/handlers/invite-create.write.ts +12 -12
- package/packages/bundled-features/src/auth-email-password/handlers/invite-info.query.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/invite-signup-complete.write.ts +24 -26
- package/packages/bundled-features/src/auth-email-password/handlers/login.write.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/self-registration-status.query.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/signup-confirm.write.ts +34 -37
- package/packages/bundled-features/src/auth-email-password/handlers/signup-request.write.ts +6 -7
- package/packages/bundled-features/src/auth-email-password/handlers/switch-tenant-mfa-gate.write.ts +1 -5
- package/packages/bundled-features/src/auth-email-password/index.ts +5 -5
- package/packages/bundled-features/src/auth-email-password/lockout-store.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/seeding.ts +63 -66
- package/packages/bundled-features/src/auth-email-password/signup-token-store.ts +8 -8
- package/packages/bundled-features/src/auth-email-password/testing.ts +3 -3
- package/packages/bundled-features/src/auth-email-password/web/auth-client.ts +57 -57
- package/packages/bundled-features/src/auth-email-password/web/auth-form-primitives.tsx +14 -14
- package/packages/bundled-features/src/auth-email-password/web/auth-gate.tsx +15 -16
- package/packages/bundled-features/src/auth-email-password/web/client-plugin.ts +11 -12
- package/packages/bundled-features/src/auth-email-password/web/confirm-account-unlock-screen.tsx +1 -1
- package/packages/bundled-features/src/auth-email-password/web/constants.ts +3 -3
- package/packages/bundled-features/src/auth-email-password/web/default-topbar-actions.tsx +14 -14
- package/packages/bundled-features/src/auth-email-password/web/forgot-password-screen.tsx +11 -11
- package/packages/bundled-features/src/auth-email-password/web/index.ts +5 -5
- package/packages/bundled-features/src/auth-email-password/web/invite-accept-screen.tsx +17 -17
- package/packages/bundled-features/src/auth-email-password/web/login-screen.tsx +3 -4
- package/packages/bundled-features/src/auth-email-password/web/reset-password-screen.tsx +16 -17
- package/packages/bundled-features/src/auth-email-password/web/session.tsx +34 -34
- package/packages/bundled-features/src/auth-email-password/web/signup-complete-screen.tsx +3 -3
- package/packages/bundled-features/src/auth-email-password/web/signup-screen.tsx +14 -14
- package/packages/bundled-features/src/auth-email-password/web/tenant-switcher.tsx +26 -27
- package/packages/bundled-features/src/auth-email-password/web/use-shell-user.ts +12 -13
- package/packages/bundled-features/src/auth-email-password/web/user-menu.tsx +17 -18
- package/packages/bundled-features/src/auth-email-password/web/verify-email-screen.tsx +11 -12
- package/packages/bundled-features/src/auth-foundation/boot-checks.ts +4 -4
- package/packages/bundled-features/src/auth-foundation/resolve-anonymous-access.ts +4 -4
- package/packages/bundled-features/src/auth-foundation/types.ts +2 -2
- package/packages/bundled-features/src/auth-mfa/changes.json +6 -0
- package/packages/bundled-features/src/auth-mfa/feature-exports.ts +2 -2
- package/packages/bundled-features/src/auth-mfa/feature.ts +6 -0
- package/packages/bundled-features/src/auth-mfa/handlers/disable.write.ts +3 -3
- package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm-preauth.write.ts +4 -4
- package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm.write.ts +2 -2
- package/packages/bundled-features/src/auth-mfa/handlers/enable-start-preauth.write.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/handlers/reencrypt.job.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/handlers/regenerate-recovery.write.ts +5 -5
- package/packages/bundled-features/src/auth-mfa/handlers/verify.write.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/token-secrets.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/web/client-plugin.ts +2 -2
- package/packages/bundled-features/src/auth-mfa/web/i18n.ts +9 -4
- package/packages/bundled-features/src/auth-mfa/web/index.ts +4 -4
- package/packages/bundled-features/src/auth-mfa/web/mfa-client.ts +17 -16
- package/packages/bundled-features/src/auth-mfa/web/mfa-code-or-recovery-field.tsx +68 -0
- package/packages/bundled-features/src/auth-mfa/web/mfa-disable-dialog.tsx +23 -13
- package/packages/bundled-features/src/auth-mfa/web/mfa-regenerate-recovery-dialog.tsx +23 -13
- package/packages/bundled-features/src/auth-mfa/web/mfa-setup-preauth-screen.tsx +15 -6
- package/packages/bundled-features/src/auth-mfa/web/mfa-verify-screen.tsx +71 -24
- package/packages/bundled-features/src/billing-foundation/aggregate-id.ts +10 -11
- package/packages/bundled-features/src/billing-foundation/changes.json +55 -0
- package/packages/bundled-features/src/billing-foundation/checkout-core.ts +32 -42
- package/packages/bundled-features/src/billing-foundation/consumer-protection/confirmation-mail.ts +8 -2
- package/packages/bundled-features/src/billing-foundation/consumer-protection/consent-gate.ts +2 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/issue-confirmation.ts +14 -3
- package/packages/bundled-features/src/billing-foundation/consumer-protection/mail-notifications.ts +3 -4
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-receipt-limit.ts +12 -6
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-record.ts +35 -19
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-request.ts +12 -8
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-revoke.ts +14 -8
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-texts.ts +5 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/withdrawal-period.ts +8 -10
- package/packages/bundled-features/src/billing-foundation/entities.ts +27 -27
- package/packages/bundled-features/src/billing-foundation/events.ts +23 -21
- package/packages/bundled-features/src/billing-foundation/feature.ts +45 -44
- package/packages/bundled-features/src/billing-foundation/get-subscription-for-tenant.ts +3 -5
- package/packages/bundled-features/src/billing-foundation/handlers/billing-plans.query.ts +71 -6
- package/packages/bundled-features/src/billing-foundation/handlers/create-checkout-session.write.ts +19 -17
- package/packages/bundled-features/src/billing-foundation/handlers/create-portal-session.write.ts +11 -12
- package/packages/bundled-features/src/billing-foundation/handlers/list-subscriptions.query.ts +4 -4
- package/packages/bundled-features/src/billing-foundation/handlers/plan-switch-preview.query.ts +65 -0
- package/packages/bundled-features/src/billing-foundation/handlers/process-event.write.ts +29 -22
- package/packages/bundled-features/src/billing-foundation/handlers/start-plan-checkout.write.ts +44 -8
- package/packages/bundled-features/src/billing-foundation/handlers/switch-plan.write.ts +72 -82
- package/packages/bundled-features/src/billing-foundation/handlers/sync-subscription.write.ts +14 -1
- package/packages/bundled-features/src/billing-foundation/i18n.ts +22 -0
- package/packages/bundled-features/src/billing-foundation/index.ts +2 -0
- package/packages/bundled-features/src/billing-foundation/plan-catalog.ts +62 -27
- package/packages/bundled-features/src/billing-foundation/plan-switch.ts +84 -0
- package/packages/bundled-features/src/billing-foundation/projection.ts +38 -37
- package/packages/bundled-features/src/billing-foundation/subscription-tier-sync.ts +3 -3
- package/packages/bundled-features/src/billing-foundation/tenant-destroy-hook.ts +7 -8
- package/packages/bundled-features/src/billing-foundation/types.ts +144 -66
- package/packages/bundled-features/src/billing-foundation/validate-options.ts +19 -0
- package/packages/bundled-features/src/billing-foundation/web/billing-plans-panel.tsx +123 -51
- package/packages/bundled-features/src/billing-foundation/web/checkout-consent-dialog.tsx +89 -42
- package/packages/bundled-features/src/billing-foundation/web/constants.ts +4 -0
- package/packages/bundled-features/src/billing-foundation/web/plan-price.ts +55 -0
- package/packages/bundled-features/src/billing-foundation/web/plan-switch-confirm-dialog.tsx +224 -0
- package/packages/bundled-features/src/billing-foundation/webhook-handler.ts +1 -1
- package/packages/bundled-features/src/cap-counter/aggregate-id.ts +8 -9
- package/packages/bundled-features/src/cap-counter/cap-reservation.ts +5 -1
- package/packages/bundled-features/src/cap-counter/changes.json +18 -0
- package/packages/bundled-features/src/cap-counter/constants.ts +11 -12
- package/packages/bundled-features/src/cap-counter/enforce-cap.ts +66 -68
- package/packages/bundled-features/src/cap-counter/entity.ts +29 -29
- package/packages/bundled-features/src/cap-counter/feature.ts +34 -35
- package/packages/bundled-features/src/cap-counter/handlers/increment-rolling.write.ts +31 -31
- package/packages/bundled-features/src/cap-counter/handlers/mark-soft-warned.write.ts +4 -5
- package/packages/bundled-features/src/cap-counter/stock-cap-guard.ts +9 -2
- package/packages/bundled-features/src/cap-counter/with-cap-enforcement.ts +3 -5
- package/packages/bundled-features/src/cap-overview/handlers/caps-usage.query.ts +1 -3
- package/packages/bundled-features/src/cap-overview/handlers/tenant-caps-list.query.ts +1 -1
- package/packages/bundled-features/src/channel-email/changes.json +6 -0
- package/packages/bundled-features/src/channel-email/feature.ts +1 -1
- package/packages/bundled-features/src/channel-email/smtp-transport.ts +34 -31
- package/packages/bundled-features/src/channel-in-app/handlers/unread-count.query.ts +3 -4
- package/packages/bundled-features/src/compliance-profiles/feature.ts +15 -16
- package/packages/bundled-features/src/compliance-profiles/handlers/for-tenant.query.ts +3 -6
- package/packages/bundled-features/src/compliance-profiles/handlers/list-profiles.query.ts +5 -5
- package/packages/bundled-features/src/compliance-profiles/handlers/needs-profile.query.ts +4 -4
- package/packages/bundled-features/src/compliance-profiles/handlers/set-profile.write.ts +13 -14
- package/packages/bundled-features/src/compliance-profiles/handlers/sub-processors.query.ts +9 -11
- package/packages/bundled-features/src/compliance-profiles/resolve-for-tenant.ts +7 -7
- package/packages/bundled-features/src/compliance-profiles/schema/profile-selection.ts +18 -23
- package/packages/bundled-features/src/compliance-profiles/seeding.ts +14 -15
- package/packages/bundled-features/src/compliance-profiles-ops/handlers/tenants-missing-profile.query.ts +3 -3
- package/packages/bundled-features/src/compliance-profiles-ops/index.ts +2 -2
- package/packages/bundled-features/src/config/changes.json +12 -0
- package/packages/bundled-features/src/config/handlers/cascade.query.ts +4 -2
- package/packages/bundled-features/src/config/handlers/readiness.query.ts +7 -7
- package/packages/bundled-features/src/config/handlers/reencrypt.job.ts +4 -5
- package/packages/bundled-features/src/config/handlers/set.write.ts +4 -4
- package/packages/bundled-features/src/config/handlers/values.query.ts +4 -2
- package/packages/bundled-features/src/config/resolver.ts +4 -4
- package/packages/bundled-features/src/config/table.ts +10 -10
- package/packages/bundled-features/src/config/write-helpers.ts +28 -9
- package/packages/bundled-features/src/crypto-shredding/changes.json +6 -0
- package/packages/bundled-features/src/crypto-shredding/handlers/forget-subject.write.ts +23 -21
- package/packages/bundled-features/src/custom-fields/aggregate-id.ts +16 -17
- package/packages/bundled-features/src/custom-fields/entity.ts +49 -47
- package/packages/bundled-features/src/custom-fields/events.ts +7 -8
- package/packages/bundled-features/src/custom-fields/feature.ts +70 -72
- package/packages/bundled-features/src/custom-fields/handlers/clear-custom-field.write.ts +9 -8
- package/packages/bundled-features/src/custom-fields/handlers/define-tenant-field.write.ts +28 -26
- package/packages/bundled-features/src/custom-fields/handlers/delete-system-field.write.ts +6 -7
- package/packages/bundled-features/src/custom-fields/handlers/delete-tenant-field.write.ts +12 -13
- package/packages/bundled-features/src/custom-fields/handlers/set-custom-field.write.ts +25 -28
- package/packages/bundled-features/src/custom-fields/handlers/update-tenant-field.write.ts +6 -6
- package/packages/bundled-features/src/custom-fields/lib/field-access.ts +2 -2
- package/packages/bundled-features/src/custom-fields/lib/parse-serialized-field.ts +1 -1
- package/packages/bundled-features/src/custom-fields/lib/quota.ts +1 -1
- package/packages/bundled-features/src/custom-fields/lib/value-schema.ts +10 -12
- package/packages/bundled-features/src/custom-fields/run-retention.ts +3 -3
- package/packages/bundled-features/src/custom-fields/schemas.ts +14 -14
- package/packages/bundled-features/src/custom-fields/web/client-plugin.tsx +2 -5
- package/packages/bundled-features/src/custom-fields/web/constants.ts +2 -2
- package/packages/bundled-features/src/custom-fields/web/custom-fields-form-section.tsx +26 -26
- package/packages/bundled-features/src/custom-fields/wire-for-entity.ts +65 -67
- package/packages/bundled-features/src/custom-fields/wire-user-data-rights.ts +3 -3
- package/packages/bundled-features/src/data-retention/_internal/parse-override.ts +2 -3
- package/packages/bundled-features/src/data-retention/feature.ts +11 -18
- package/packages/bundled-features/src/data-retention/handlers/policy-for.query.ts +6 -6
- package/packages/bundled-features/src/data-retention/keep-for.ts +17 -17
- package/packages/bundled-features/src/data-retention/override-schema.ts +13 -15
- package/packages/bundled-features/src/data-retention/presets.ts +18 -23
- package/packages/bundled-features/src/data-retention/resolve-for-tenant.ts +1 -1
- package/packages/bundled-features/src/data-retention/resolve-tenant-preset.ts +17 -16
- package/packages/bundled-features/src/data-retention/resolver.ts +33 -32
- package/packages/bundled-features/src/data-retention/run-retention-cleanup.ts +71 -58
- package/packages/bundled-features/src/data-retention/schema/tenant-retention-override.ts +13 -11
- package/packages/bundled-features/src/delivery/changes.json +30 -0
- package/packages/bundled-features/src/delivery/channel-context.ts +9 -3
- package/packages/bundled-features/src/delivery/db/queries/preferences.ts +2 -2
- package/packages/bundled-features/src/delivery/delivery-service.ts +35 -5
- package/packages/bundled-features/src/delivery/feature.ts +3 -3
- package/packages/bundled-features/src/delivery/handlers/log.query.ts +1 -1
- package/packages/bundled-features/src/delivery/handlers/preferences.query.ts +20 -1
- package/packages/bundled-features/src/delivery/handlers/unsubscribe-page-chrome.query.ts +1 -1
- package/packages/bundled-features/src/delivery/tables.ts +9 -8
- package/packages/bundled-features/src/delivery/unsubscribe-link.ts +3 -1
- package/packages/bundled-features/src/delivery/unsubscribe-page-strings.ts +1 -0
- package/packages/bundled-features/src/delivery/unsubscribe-page.ts +6 -0
- package/packages/bundled-features/src/delivery/unsubscribe.ts +40 -19
- package/packages/bundled-features/src/delivery/upsert-preference.ts +3 -4
- package/packages/bundled-features/src/document-ingest-foundation/entity.ts +5 -5
- package/packages/bundled-features/src/document-ingest-foundation/events.ts +2 -2
- package/packages/bundled-features/src/document-ingest-foundation/feature.ts +2 -2
- package/packages/bundled-features/src/document-ingest-foundation/pages.ts +1 -1
- package/packages/bundled-features/src/document-ingest-foundation/tenant-destroy-hook.ts +4 -4
- package/packages/bundled-features/src/feature-toggles/compose-tier-resolver.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/feature.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/global-feature-state-table.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/handlers/registered.query.ts +5 -5
- package/packages/bundled-features/src/feature-toggles/toggle-runtime.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/toggle-sync-signal.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/web/constants.ts +1 -1
- package/packages/bundled-features/src/file-derivatives/feature.ts +2 -2
- package/packages/bundled-features/src/file-derivatives/handlers/public-variant.query.ts +1 -1
- package/packages/bundled-features/src/file-derivatives/presets.ts +1 -1
- package/packages/bundled-features/src/file-foundation/feature.ts +6 -6
- package/packages/bundled-features/src/file-foundation/index.ts +1 -0
- package/packages/bundled-features/src/file-foundation/read-file-ref-content.ts +7 -1
- package/packages/bundled-features/src/file-provider-inmemory/feature.ts +16 -16
- package/packages/bundled-features/src/file-provider-s3/env-named-feature.ts +0 -2
- package/packages/bundled-features/src/file-provider-s3/feature.ts +16 -16
- package/packages/bundled-features/src/file-provider-s3/lib/s3-provider.ts +6 -6
- package/packages/bundled-features/src/files/README.md +1 -1
- package/packages/bundled-features/src/files/feature.ts +6 -6
- package/packages/bundled-features/src/files-tenant-data/handlers/sweep-orphaned-derivatives.job.ts +5 -5
- package/packages/bundled-features/src/files-tenant-data/hooks.ts +24 -26
- package/packages/bundled-features/src/files-tenant-data/index.ts +1 -1
- package/packages/bundled-features/src/folders/feature.ts +1 -1
- package/packages/bundled-features/src/folders/web/folder-manager.tsx +2 -2
- package/packages/bundled-features/src/folders/web/tree.ts +5 -5
- package/packages/bundled-features/src/form-draft/changes.json +6 -0
- package/packages/bundled-features/src/form-draft/db/queries/cleanup.ts +3 -3
- package/packages/bundled-features/src/form-draft/db/queries/owned-file-refs.ts +1 -1
- package/packages/bundled-features/src/form-draft/decrypt-draft.ts +4 -1
- package/packages/bundled-features/src/form-draft/entity.ts +3 -3
- package/packages/bundled-features/src/form-draft/feature.ts +4 -5
- package/packages/bundled-features/src/form-draft/handlers/discard.write.ts +1 -1
- package/packages/bundled-features/src/form-draft/release-file-refs.ts +6 -6
- package/packages/bundled-features/src/form-draft/schemas.ts +3 -3
- package/packages/bundled-features/src/form-draft/web/constants.ts +0 -2
- package/packages/bundled-features/src/host-routing/README.md +1 -1
- package/packages/bundled-features/src/host-routing/changes.json +6 -0
- package/packages/bundled-features/src/host-routing/dispatch.ts +16 -17
- package/packages/bundled-features/src/host-routing/options.ts +2 -1
- package/packages/bundled-features/src/inbound-mail-foundation/aggregate-id.ts +19 -19
- package/packages/bundled-features/src/inbound-mail-foundation/changes.json +18 -0
- package/packages/bundled-features/src/inbound-mail-foundation/connect-routes.ts +4 -3
- package/packages/bundled-features/src/inbound-mail-foundation/constants.ts +30 -33
- package/packages/bundled-features/src/inbound-mail-foundation/entities.ts +47 -48
- package/packages/bundled-features/src/inbound-mail-foundation/events.ts +54 -50
- package/packages/bundled-features/src/inbound-mail-foundation/feature.ts +39 -39
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/account-state.ts +8 -8
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/connect-account.write.ts +25 -26
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/disconnect-account.write.ts +7 -7
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/ingest-message.write.ts +50 -51
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-accounts.query.ts +8 -8
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-messages.query.ts +10 -10
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/scope-visibility.ts +3 -4
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/update-account.write.ts +27 -15
- package/packages/bundled-features/src/inbound-mail-foundation/i18n.ts +0 -1
- package/packages/bundled-features/src/inbound-mail-foundation/oauth-state.ts +16 -15
- package/packages/bundled-features/src/inbound-mail-foundation/projection.ts +31 -29
- package/packages/bundled-features/src/inbound-mail-foundation/provider-factory.ts +9 -9
- package/packages/bundled-features/src/inbound-mail-foundation/retention-sweep.ts +45 -41
- package/packages/bundled-features/src/inbound-mail-foundation/screens.ts +0 -3
- package/packages/bundled-features/src/inbound-mail-foundation/tenant-destroy-hook.ts +14 -16
- package/packages/bundled-features/src/inbound-mail-foundation/types.ts +70 -70
- package/packages/bundled-features/src/inbound-mail-foundation/watch-supervisor.ts +101 -84
- package/packages/bundled-features/src/inbound-provider-imap/credential-document.ts +13 -13
- package/packages/bundled-features/src/inbound-provider-imap/feature.ts +42 -40
- package/packages/bundled-features/src/inbound-provider-imap/imap-client.ts +20 -19
- package/packages/bundled-features/src/inbound-provider-inmemory/feature.ts +21 -21
- package/packages/bundled-features/src/jobs/changes.json +13 -0
- package/packages/bundled-features/src/jobs/db/queries/retention.ts +2 -2
- package/packages/bundled-features/src/jobs/db/queries/stale-run-sweep.ts +3 -3
- package/packages/bundled-features/src/jobs/events.ts +1 -1
- package/packages/bundled-features/src/jobs/feature.ts +20 -11
- package/packages/bundled-features/src/jobs/handlers/detail.query.ts +4 -4
- package/packages/bundled-features/src/jobs/handlers/list.query.ts +1 -1
- package/packages/bundled-features/src/jobs/handlers/projection-rebuild.job.ts +1 -1
- package/packages/bundled-features/src/jobs/handlers/reindex-entity.job.ts +1 -1
- package/packages/bundled-features/src/jobs/handlers/retry.write.ts +1 -1
- package/packages/bundled-features/src/jobs/handlers/tenant-failures.query.ts +45 -40
- package/packages/bundled-features/src/jobs/handlers/tenant-runs.query.ts +63 -59
- package/packages/bundled-features/src/jobs/job-instant.ts +1 -1
- package/packages/bundled-features/src/jobs/job-run-logger.ts +19 -19
- package/packages/bundled-features/src/jobs/job-run-table.ts +3 -3
- package/packages/bundled-features/src/jobs/screens.ts +1 -1
- package/packages/bundled-features/src/jobs/tenant-job-failure-table.ts +1 -1
- package/packages/bundled-features/src/jobs/tenant-job-run-table.ts +1 -1
- package/packages/bundled-features/src/ledger/entity.ts +5 -5
- package/packages/bundled-features/src/ledger/feature.ts +3 -3
- package/packages/bundled-features/src/ledger/handlers/confirm-schedule-period.write.ts +3 -3
- package/packages/bundled-features/src/ledger/recurring.ts +12 -12
- package/packages/bundled-features/src/ledger/schemas.ts +1 -1
- package/packages/bundled-features/src/ledger/web/constants.ts +2 -2
- package/packages/bundled-features/src/ledger/web/index.ts +7 -7
- package/packages/bundled-features/src/legal-pages/README.md +1 -1
- package/packages/bundled-features/src/legal-pages/feature.ts +40 -41
- package/packages/bundled-features/src/legal-pages/markdown.ts +3 -3
- package/packages/bundled-features/src/legal-pages/web/client-plugin.ts +23 -24
- package/packages/bundled-features/src/legal-pages/web/index.ts +0 -2
- package/packages/bundled-features/src/mail-foundation/changes.json +6 -0
- package/packages/bundled-features/src/mail-foundation/feature.ts +31 -30
- package/packages/bundled-features/src/mail-transport-inmemory/feature.ts +27 -28
- package/packages/bundled-features/src/mail-transport-smtp/feature.ts +20 -20
- package/packages/bundled-features/src/managed-pages/branding.ts +6 -6
- package/packages/bundled-features/src/managed-pages/feature.ts +62 -62
- package/packages/bundled-features/src/managed-pages/handlers/by-slug.query.ts +5 -6
- package/packages/bundled-features/src/managed-pages/handlers/by-tenant-published.query.ts +8 -8
- package/packages/bundled-features/src/managed-pages/handlers/set.write.ts +5 -7
- package/packages/bundled-features/src/managed-pages/screens/page-screens.ts +11 -11
- package/packages/bundled-features/src/managed-pages/seeding.ts +8 -8
- package/packages/bundled-features/src/managed-pages/table.ts +16 -15
- package/packages/bundled-features/src/managed-pages/web/client-plugin.tsx +6 -6
- package/packages/bundled-features/src/managed-pages/web/i18n.ts +1 -1
- package/packages/bundled-features/src/notes-history/entity.ts +4 -4
- package/packages/bundled-features/src/notes-history/feature.ts +2 -2
- package/packages/bundled-features/src/notes-history-user-data/hooks.ts +1 -1
- package/packages/bundled-features/src/page-render/layout.ts +9 -9
- package/packages/bundled-features/src/page-render/markdown.ts +11 -11
- package/packages/bundled-features/src/page-render/security-headers.ts +7 -6
- package/packages/bundled-features/src/personal-access-tokens/feature.ts +9 -6
- package/packages/bundled-features/src/personal-access-tokens/roles.ts +2 -2
- package/packages/bundled-features/src/readiness/handlers/status.query.ts +3 -3
- package/packages/bundled-features/src/renderer-foundation/api.ts +12 -13
- package/packages/bundled-features/src/renderer-foundation/constants.ts +2 -2
- package/packages/bundled-features/src/renderer-foundation/feature.ts +7 -7
- package/packages/bundled-features/src/renderer-foundation/types.ts +11 -12
- package/packages/bundled-features/src/renderer-pdf/changes.json +6 -0
- package/packages/bundled-features/src/renderer-pdf/render-table-pdf.ts +27 -10
- package/packages/bundled-features/src/secrets/feature.ts +9 -9
- package/packages/bundled-features/src/secrets/web/constants.ts +2 -2
- package/packages/bundled-features/src/seo/feature.ts +3 -3
- package/packages/bundled-features/src/sessions/constants.ts +1 -1
- package/packages/bundled-features/src/sessions/feature.ts +16 -11
- package/packages/bundled-features/src/sessions/handlers/revoke-all-for-user.write.ts +2 -2
- package/packages/bundled-features/src/sessions/handlers/revoke-all-others.write.ts +2 -2
- package/packages/bundled-features/src/sessions/handlers/revoke.write.ts +1 -1
- package/packages/bundled-features/src/sessions/schema/user-session.ts +4 -4
- package/packages/bundled-features/src/sessions/screens.ts +2 -2
- package/packages/bundled-features/src/sessions/session-callbacks.ts +2 -2
- package/packages/bundled-features/src/sessions/session-revoked-event.ts +2 -2
- package/packages/bundled-features/src/shared/assert-no-where-rule-in-ownership-write.ts +1 -1
- package/packages/bundled-features/src/shared/decrypt-stored-pii.ts +11 -1
- package/packages/bundled-features/src/shared/encrypt-for-direct-write.ts +1 -1
- package/packages/bundled-features/src/shared/index.ts +1 -1
- package/packages/bundled-features/src/shared/mail-template-body.ts +10 -3
- package/packages/bundled-features/src/shared/map-with-concurrency.ts +5 -4
- package/packages/bundled-features/src/shared/parent-visibility.ts +2 -2
- package/packages/bundled-features/src/shared/password-hashing.ts +1 -1
- package/packages/bundled-features/src/shared/signup-handover.ts +1 -2
- package/packages/bundled-features/src/shared/single-use-token-store.ts +1 -1
- package/packages/bundled-features/src/step-dispatcher/changes.json +6 -0
- package/packages/bundled-features/src/step-dispatcher/feature.ts +1 -0
- package/packages/bundled-features/src/subscription-dodo/changes.json +14 -0
- package/packages/bundled-features/src/subscription-dodo/client.ts +45 -0
- package/packages/bundled-features/src/subscription-dodo/constants.ts +24 -0
- package/packages/bundled-features/src/subscription-dodo/feature.ts +207 -0
- package/packages/bundled-features/src/subscription-dodo/index.ts +16 -0
- package/packages/bundled-features/src/subscription-dodo/plugin-methods.ts +345 -0
- package/packages/bundled-features/src/subscription-dodo/runtime.ts +126 -0
- package/packages/bundled-features/src/subscription-dodo/verify-webhook.ts +262 -0
- package/packages/bundled-features/src/subscription-mollie/constants.ts +15 -17
- package/packages/bundled-features/src/subscription-mollie/feature.ts +41 -42
- package/packages/bundled-features/src/subscription-mollie/index.ts +3 -3
- package/packages/bundled-features/src/subscription-mollie/plugin-methods.ts +17 -16
- package/packages/bundled-features/src/subscription-mollie/verify-webhook.ts +34 -34
- package/packages/bundled-features/src/subscription-stripe/changes.json +12 -0
- package/packages/bundled-features/src/subscription-stripe/constants.ts +4 -6
- package/packages/bundled-features/src/subscription-stripe/feature.ts +45 -43
- package/packages/bundled-features/src/subscription-stripe/index.ts +6 -6
- package/packages/bundled-features/src/subscription-stripe/plugin-methods.ts +22 -27
- package/packages/bundled-features/src/subscription-stripe/runtime.ts +9 -8
- package/packages/bundled-features/src/subscription-stripe/verify-webhook.ts +62 -64
- package/packages/bundled-features/src/tags/feature.ts +3 -3
- package/packages/bundled-features/src/tags/screens.ts +1 -1
- package/packages/bundled-features/src/template-resolver/api.ts +41 -14
- package/packages/bundled-features/src/template-resolver/changes.json +48 -0
- package/packages/bundled-features/src/template-resolver/compile-document-body.ts +1 -0
- package/packages/bundled-features/src/template-resolver/feature.ts +2 -2
- package/packages/bundled-features/src/template-resolver/handlers/bundle-import.ts +3 -2
- package/packages/bundled-features/src/template-resolver/handlers/copy-locale.write.ts +27 -5
- package/packages/bundled-features/src/template-resolver/handlers/diff-to-system.query.ts +3 -2
- package/packages/bundled-features/src/template-resolver/handlers/document-base.ts +3 -2
- package/packages/bundled-features/src/template-resolver/handlers/find-by-id.query.ts +8 -7
- package/packages/bundled-features/src/template-resolver/handlers/list.query.ts +19 -20
- package/packages/bundled-features/src/template-resolver/handlers/overview.query.ts +15 -5
- package/packages/bundled-features/src/template-resolver/handlers/shared.ts +2 -2
- package/packages/bundled-features/src/template-resolver/handlers/template-write.ts +3 -3
- package/packages/bundled-features/src/template-resolver/handlers/tenant-override-counts.query.ts +9 -5
- package/packages/bundled-features/src/template-resolver/handlers/tenant-override-selection.ts +8 -6
- package/packages/bundled-features/src/template-resolver/handlers/tenant-overrides.query.ts +44 -5
- package/packages/bundled-features/src/template-resolver/handlers/upsert-system.write.ts +3 -4
- package/packages/bundled-features/src/template-resolver/handlers/upsert-tenant.write.ts +4 -5
- package/packages/bundled-features/src/template-resolver/handlers/usage.query.ts +37 -26
- package/packages/bundled-features/src/template-resolver/handlers/validate.query.ts +7 -2
- package/packages/bundled-features/src/template-resolver/seeding.ts +36 -18
- package/packages/bundled-features/src/template-resolver/store-template-resource.ts +22 -4
- package/packages/bundled-features/src/template-resolver/table.ts +13 -14
- package/packages/bundled-features/src/template-resolver/template-delivery-policy.ts +0 -11
- package/packages/bundled-features/src/template-resolver/template-meta.ts +12 -4
- package/packages/bundled-features/src/template-resolver/template-preview.ts +11 -3
- package/packages/bundled-features/src/template-resolver/web/client-plugin.tsx +2 -2
- package/packages/bundled-features/src/template-resolver/web/constants.ts +7 -5
- package/packages/bundled-features/src/template-resolver/web/index.ts +7 -0
- package/packages/bundled-features/src/template-resolver/web/mail-layout-constants.ts +8 -0
- package/packages/bundled-features/src/tenant/changes.json +6 -0
- package/packages/bundled-features/src/tenant/feature.ts +7 -7
- package/packages/bundled-features/src/tenant/handlers/member-directory.query.ts +10 -4
- package/packages/bundled-features/src/tenant/handlers/members.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/memberships.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/team-list.query.ts +1 -1
- package/packages/bundled-features/src/tenant/handlers/tenant-directory.query.ts +8 -5
- package/packages/bundled-features/src/tenant/invitation-table.ts +37 -40
- package/packages/bundled-features/src/tenant/membership-table.ts +3 -3
- package/packages/bundled-features/src/tenant/schema/tenant.ts +7 -9
- package/packages/bundled-features/src/tenant/screens.ts +1 -1
- package/packages/bundled-features/src/tenant/seeding.ts +19 -18
- package/packages/bundled-features/src/tenant/testing.ts +5 -6
- package/packages/bundled-features/src/tenant/web/constants.ts +2 -2
- package/packages/bundled-features/src/tenant-handover/events.ts +5 -7
- package/packages/bundled-features/src/tenant-handover/feature.ts +1 -1
- package/packages/bundled-features/src/tenant-handover/grant.ts +1 -1
- package/packages/bundled-features/src/tenant-handover/handlers/claim.write.ts +1 -1
- package/packages/bundled-features/src/tenant-handover/move-entity-graph.ts +8 -9
- package/packages/bundled-features/src/tenant-handover/signup-handover-provider.ts +1 -2
- package/packages/bundled-features/src/tenant-handover/transfer-graph.ts +4 -5
- package/packages/bundled-features/src/tenant-lifecycle/boot-checks.ts +1 -1
- package/packages/bundled-features/src/tenant-lifecycle/changes.json +6 -0
- package/packages/bundled-features/src/tenant-lifecycle/constants.ts +5 -0
- package/packages/bundled-features/src/tenant-lifecycle/feature.ts +1 -1
- package/packages/bundled-features/src/tenant-lifecycle/run-tenant-destroy.ts +7 -3
- package/packages/bundled-features/src/tenant-lifecycle/stages.ts +1 -1
- package/packages/bundled-features/src/tenant-settings/constants.ts +1 -1
- package/packages/bundled-features/src/tenant-settings/tenant-defaults.ts +12 -5
- package/packages/bundled-features/src/tier-engine/aggregate-id.ts +15 -16
- package/packages/bundled-features/src/tier-engine/changes.json +6 -0
- package/packages/bundled-features/src/tier-engine/compose-app.ts +14 -14
- package/packages/bundled-features/src/tier-engine/entity.ts +18 -19
- package/packages/bundled-features/src/tier-engine/feature.ts +88 -87
- package/packages/bundled-features/src/tier-engine/handlers/active-tier.query.ts +6 -7
- package/packages/bundled-features/src/tier-engine/handlers/get-tenant-tier.query.ts +4 -4
- package/packages/bundled-features/src/tier-engine/handlers/set-tenant-tier.write.ts +12 -9
- package/packages/bundled-features/src/tier-engine/tier-resolver.ts +2 -2
- package/packages/bundled-features/src/tier-engine/trial.ts +13 -13
- package/packages/bundled-features/src/tier-engine/web/constants.ts +3 -3
- package/packages/bundled-features/src/tier-engine/web/index.ts +4 -4
- package/packages/bundled-features/src/user/db/queries/stream-tenant-backfill.ts +8 -8
- package/packages/bundled-features/src/user/handlers/create.write.ts +4 -4
- package/packages/bundled-features/src/user/schema/user.ts +45 -44
- package/packages/bundled-features/src/user/seeding.ts +40 -40
- package/packages/bundled-features/src/user/testing.ts +3 -3
- package/packages/bundled-features/src/user-data-rights/audit-download.ts +27 -28
- package/packages/bundled-features/src/user-data-rights/boot-checks.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/deletion-token.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/feature.ts +112 -113
- package/packages/bundled-features/src/user-data-rights/handlers/cancel-deletion.write.ts +9 -9
- package/packages/bundled-features/src/user-data-rights/handlers/confirm-deletion-by-token.write.ts +8 -8
- package/packages/bundled-features/src/user-data-rights/handlers/download-by-job.query.ts +29 -30
- package/packages/bundled-features/src/user-data-rights/handlers/download-by-token.query.ts +40 -42
- package/packages/bundled-features/src/user-data-rights/handlers/export-status.query.ts +8 -9
- package/packages/bundled-features/src/user-data-rights/handlers/lift-restriction.write.ts +7 -8
- package/packages/bundled-features/src/user-data-rights/handlers/list-download-attempts.query.ts +2 -2
- package/packages/bundled-features/src/user-data-rights/handlers/my-audit-log.query.ts +4 -4
- package/packages/bundled-features/src/user-data-rights/handlers/request-deletion-by-email.write.ts +30 -29
- package/packages/bundled-features/src/user-data-rights/handlers/request-deletion.write.ts +15 -18
- package/packages/bundled-features/src/user-data-rights/handlers/request-export.write.ts +42 -41
- package/packages/bundled-features/src/user-data-rights/handlers/restrict-account.write.ts +22 -19
- package/packages/bundled-features/src/user-data-rights/handlers/run-forget-cleanup.write.ts +8 -8
- package/packages/bundled-features/src/user-data-rights/index.ts +8 -10
- package/packages/bundled-features/src/user-data-rights/lib/default-mailers.ts +3 -3
- package/packages/bundled-features/src/user-data-rights/lib/update-user-lifecycle.ts +24 -27
- package/packages/bundled-features/src/user-data-rights/run-export-jobs.ts +169 -280
- package/packages/bundled-features/src/user-data-rights/run-forget-cleanup.ts +87 -108
- package/packages/bundled-features/src/user-data-rights/run-user-export.ts +67 -69
- package/packages/bundled-features/src/user-data-rights/schema/download-attempt.ts +11 -11
- package/packages/bundled-features/src/user-data-rights/schema/download-token.ts +37 -41
- package/packages/bundled-features/src/user-data-rights/schema/export-job.ts +65 -67
- package/packages/bundled-features/src/user-data-rights/token-helpers.ts +21 -25
- package/packages/bundled-features/src/user-data-rights/web/client-plugin.tsx +6 -6
- package/packages/bundled-features/src/user-data-rights/web/confirm-deletion-screen.tsx +6 -5
- package/packages/bundled-features/src/user-data-rights/web/constants.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/web/index.ts +5 -5
- package/packages/bundled-features/src/user-data-rights/web/privacy-center-screen.tsx +14 -13
- package/packages/bundled-features/src/user-data-rights/web/public-deletion-gate.tsx +13 -12
- package/packages/bundled-features/src/user-data-rights/web/request-deletion-screen.tsx +6 -6
- package/packages/bundled-features/src/user-data-rights/zip-path.ts +41 -40
- package/packages/bundled-features/src/user-data-rights-defaults/feature.ts +15 -15
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/delivery-attempt.userdata-hook.ts +3 -5
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/file-ref.userdata-hook.ts +45 -51
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/job-run.userdata-hook.ts +2 -2
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/notification-preference.userdata-hook.ts +1 -1
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/user-session.userdata-hook.ts +3 -3
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/user.userdata-hook.ts +32 -31
- package/packages/bundled-features/src/user-profile/handlers/change-email.write.ts +13 -13
- package/packages/bundled-features/src/user-profile/index.ts +3 -3
- package/packages/bundled-features/src/user-profile/web/client-plugin.ts +1 -1
- package/packages/bundled-features/src/user-profile/web/constants.ts +1 -1
- package/packages/bundled-features/src/user-profile/web/profile-screen.tsx +1 -1
- package/packages/bundled-features/src/waitlist/changes.json +18 -0
- package/packages/bundled-features/src/waitlist/handlers/export-purge.write.ts +2 -1
- package/packages/bundled-features/src/waitlist/handlers/submit.write.ts +5 -5
- package/packages/bundled-features/src/waitlist/import.ts +5 -0
- package/packages/bundled-features/src/waitlist/legacy-migrate.ts +22 -3
- package/packages/bundled-features/src/waitlist/link-on-signup.ts +20 -10
- package/packages/bundled-features/src/waitlist/options.ts +3 -0
- package/packages/bundled-features/src/workflow-runner/aggregate-id.ts +1 -1
- package/packages/bundled-features/src/workflow-runner/event-subscriber.ts +4 -5
- package/packages/bundled-features/src/workflow-runner/event-trigger.ts +4 -15
- package/packages/bundled-features/src/workflow-runner/feature.ts +2 -2
- package/packages/bundled-features/src/workflow-runner/handlers/resume-run.write.ts +4 -4
- package/packages/bundled-features/src/workflow-runner/pending-projection.ts +6 -7
- package/packages/bundled-features/src/workflow-runner/runner.ts +6 -6
- package/packages/bundled-features/src/workflow-runner/tables.ts +6 -6
- package/packages/bundled-features/src/workflow-runner/workflow-registry.ts +1 -1
- package/samples/apps/styleguide/src/features/widgets/i18n.ts +11 -0
- package/samples/apps/styleguide/src/features/widgets/web/Widgets.tsx +24 -0
- package/samples/apps/use-all-bundled/e2e-billing-gallery/gallery-constants.ts +5 -0
- package/samples/apps/use-all-bundled/e2e-billing-gallery/gallery-features.ts +90 -15
- package/samples/apps/use-all-bundled/e2e-billing-gallery/server.ts +16 -6
- package/samples/apps/use-all-bundled/feature-manifest.json +120 -3
- package/samples/apps/use-all-bundled/src/run-config.ts +9 -3
- package/samples/recipes/auth-mfa/README.md +5 -0
- package/samples/recipes/auth-mfa/package.json +5 -2
- package/samples/recipes/auth-mfa/src/web/confirmation-code-step.tsx +49 -0
- package/samples/recipes/auth-mfa/tsconfig.json +8 -0
- package/samples/recipes/env-composition/README.md +3 -1
- package/samples/recipes/env-composition/src/env.ts +2 -0
- package/samples/recipes/legal-pages/README.md +1 -1
- package/samples/recipes/rate-limiting/README.md +18 -0
- package/samples/recipes/rate-limiting/src/feature.ts +12 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/stored-user-email.ts +0 -12
|
@@ -2,34 +2,33 @@
|
|
|
2
2
|
//
|
|
3
3
|
// mail-foundation as a Kumiko bundled feature.
|
|
4
4
|
//
|
|
5
|
-
// **
|
|
6
|
-
// 1. **Plugin
|
|
7
|
-
// ("mailTransport", ...)`. Provider
|
|
8
|
-
// mail-transport-brevo-api, ...)
|
|
9
|
-
// 2. **Tenant
|
|
10
|
-
//
|
|
11
|
-
// 3. **createTransportForTenant(ctx, tenantId)**
|
|
12
|
-
//
|
|
13
|
-
// aufruft.
|
|
5
|
+
// **What this feature provides:**
|
|
6
|
+
// 1. **Plugin API** for mail transport providers via `r.extendsRegistrar
|
|
7
|
+
// ("mailTransport", ...)`. Provider features (mail-transport-smtp,
|
|
8
|
+
// mail-transport-brevo-api, ...) register by name.
|
|
9
|
+
// 2. **Tenant config key** `provider`: a selection value that determines at
|
|
10
|
+
// runtime which registered plugin is used.
|
|
11
|
+
// 3. **createTransportForTenant(ctx, tenantId)** factory that looks up the
|
|
12
|
+
// selected plugin in the registry and calls its `build` method.
|
|
14
13
|
//
|
|
15
|
-
// **
|
|
16
|
-
//
|
|
17
|
-
// -
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
// -
|
|
22
|
-
//
|
|
23
|
-
//
|
|
14
|
+
// **What this foundation no longer does (compared with the first
|
|
15
|
+
// iteration):**
|
|
16
|
+
// - No SMTP/Brevo/Postmark-specific config keys in mail-foundation.
|
|
17
|
+
// Provider-specific config (host/port/from/authUser for SMTP,
|
|
18
|
+
// apiUrl/accountId for Brevo, etc.) lives in the respective provider
|
|
19
|
+
// plugin feature.
|
|
20
|
+
// - No direct import of `createSmtpTransport`. The foundation knows only
|
|
21
|
+
// the `EmailTransport` interface (type import, no runtime coupling), not
|
|
22
|
+
// the concrete implementation.
|
|
24
23
|
//
|
|
25
|
-
// **Pattern
|
|
26
|
-
// delivery
|
|
27
|
-
// channel-email
|
|
28
|
-
// "email", {...})`.
|
|
24
|
+
// **Pattern precedent:** identical to `delivery` + `channel-email`. The
|
|
25
|
+
// delivery feature declares `r.extendsRegistrar("deliveryChannel")`, and
|
|
26
|
+
// channel-email registers via `r.useExtension("deliveryChannel",
|
|
27
|
+
// "email", {...})`. The foundation ↔ provider separation is the same.
|
|
29
28
|
//
|
|
30
|
-
// **Standalone:**
|
|
31
|
-
// `channel-email` (
|
|
32
|
-
//
|
|
29
|
+
// **Standalone:** The foundation can be used without tier-engine. Existing
|
|
30
|
+
// `channel-email` (app-wide mail sender via delivery) remains unchanged—an
|
|
31
|
+
// additive feature.
|
|
33
32
|
|
|
34
33
|
import {
|
|
35
34
|
type EmailTransport,
|
|
@@ -76,9 +75,9 @@ export const MAIL_TRANSPORT_EXTENSION = "mailTransport" as const;
|
|
|
76
75
|
* config — tenant config reads (the plugin's host/port/from/...)
|
|
77
76
|
* registry — extension lookup in the factory (not plugin-internal)
|
|
78
77
|
* secrets — tenant secret reads (smtp.password)
|
|
79
|
-
* auditUserId — audit identity for secret reads. Handler path:
|
|
80
|
-
*
|
|
81
|
-
* r.job wrap sets a system identity.
|
|
78
|
+
* auditUserId — audit identity for secret reads. Handler path: unset,
|
|
79
|
+
* requireSecretsContext falls back to ctx.user.id; worker path:
|
|
80
|
+
* the r.job wrap sets a system identity.
|
|
82
81
|
*/
|
|
83
82
|
export type MailTransportContext = {
|
|
84
83
|
readonly config?: ConfigAccessor;
|
|
@@ -97,8 +96,8 @@ export type MailTransportContext = {
|
|
|
97
96
|
* an EmailTransport. Per-call construction so a tenant editing config
|
|
98
97
|
* sees the change on the next mail.
|
|
99
98
|
*
|
|
100
|
-
* **Plugin-
|
|
101
|
-
*
|
|
99
|
+
* **Plugin-author warning:** `ctx` is EXPLICITLY a MailTransportContext,
|
|
100
|
+
* not a full HandlerContext (see the MailTransportContext doc).
|
|
102
101
|
*/
|
|
103
102
|
export type MailTransportPlugin = {
|
|
104
103
|
readonly build: (ctx: MailTransportContext, tenantId: string) => Promise<EmailTransport>;
|
|
@@ -277,6 +276,8 @@ export type TenantMailTransportScope = {
|
|
|
277
276
|
export function tenantMailTransport(
|
|
278
277
|
scope: TenantMailTransportScope,
|
|
279
278
|
): Promise<EmailTransport | null> {
|
|
279
|
+
// Without a tenant config the provider cannot be read: use the app transport.
|
|
280
|
+
if (scope.config === undefined) return Promise.resolve(null);
|
|
280
281
|
return createTransportForTenantIfConfigured(
|
|
281
282
|
{
|
|
282
283
|
config: scope.config,
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
// kumiko-feature-version: 1
|
|
2
2
|
//
|
|
3
|
-
// mail-transport-inmemory — In-
|
|
4
|
-
// foundation
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
3
|
+
// mail-transport-inmemory — In-memory email transport for the mail-
|
|
4
|
+
// foundation plugin API. Collects emails in a per-tenant buffer
|
|
5
|
+
// instead of sending them through a real SMTP server. Designed for
|
|
6
|
+
// demos, sample apps, and tests that should run without Mailpit,
|
|
7
|
+
// Mailcrab, or real SMTP.
|
|
8
8
|
//
|
|
9
|
-
// **
|
|
10
|
-
// 1. Plugin
|
|
11
|
-
// "inmemory", { build })`. Tenants
|
|
12
|
-
// "mail-foundation:config:provider"
|
|
13
|
-
//
|
|
14
|
-
// 2. **
|
|
15
|
-
//
|
|
16
|
-
//
|
|
9
|
+
// **What this feature provides:**
|
|
10
|
+
// 1. Plugin registration via `r.useExtension("mailTransport",
|
|
11
|
+
// "inmemory", { build })`. Tenants set
|
|
12
|
+
// "mail-foundation:config:provider" to "inmemory" and receive
|
|
13
|
+
// the buffered variant.
|
|
14
|
+
// 2. **Per-tenant inbox.** Each tenant has its own mail buffer
|
|
15
|
+
// (Map<tenantId, EmailMessage[]>). Demo apps can read the inbox
|
|
16
|
+
// via `getInbox(tenantId)` and render a UI.
|
|
17
17
|
//
|
|
18
|
-
// **Pattern
|
|
18
|
+
// **Pattern reference:** mirrors mail-transport-smtp.
|
|
19
19
|
//
|
|
20
|
-
// **
|
|
21
|
-
//
|
|
22
|
-
//
|
|
20
|
+
// **NOT for production.** The buffer is in process memory and is lost
|
|
21
|
+
// on restart. Cap counters and the audit trail remain correct because
|
|
22
|
+
// they are tied to the event store, not the transport.
|
|
23
23
|
|
|
24
24
|
import type {
|
|
25
25
|
EmailMessage,
|
|
@@ -39,9 +39,9 @@ const FEATURE_NAME = "mail-transport-inmemory";
|
|
|
39
39
|
// Per-tenant in-memory buffer
|
|
40
40
|
// =============================================================================
|
|
41
41
|
//
|
|
42
|
-
//
|
|
43
|
-
//
|
|
44
|
-
//
|
|
42
|
+
// The module-level Map is needed because the plugin build call creates
|
|
43
|
+
// a new transport wrapper for each send, while all wrappers for the
|
|
44
|
+
// same tenant must point to the same buffer. Map<tenantId,
|
|
45
45
|
// InMemoryTransport>.
|
|
46
46
|
|
|
47
47
|
const transportsByTenant = new Map<string, ReturnType<typeof createInMemoryTransport>>();
|
|
@@ -56,16 +56,16 @@ function getOrCreateTransportForTenant(tenantId: string) {
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
/**
|
|
59
|
-
* Demo/
|
|
60
|
-
*
|
|
59
|
+
* Demo/test helper: reads the emails "sent" for a tenant. A query
|
|
60
|
+
* handler in the sample app uses this to render the inbox UI.
|
|
61
61
|
*/
|
|
62
62
|
export function getInbox(tenantId: string): readonly EmailMessage[] {
|
|
63
63
|
return transportsByTenant.get(tenantId)?.sent ?? [];
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
/**
|
|
67
|
-
* Demo/
|
|
68
|
-
*
|
|
67
|
+
* Demo/test helper: clears a tenant's buffer, for example between
|
|
68
|
+
* test scenarios.
|
|
69
69
|
*/
|
|
70
70
|
export function clearInbox(tenantId: string): void {
|
|
71
71
|
const t = transportsByTenant.get(tenantId);
|
|
@@ -82,10 +82,9 @@ export function createMailTransportInMemoryFeature() {
|
|
|
82
82
|
r.describe(
|
|
83
83
|
'Registers an in-process `"inmemory"` provider for `mail-foundation` that buffers sent mails per tenant instead of contacting an SMTP server. Use `getInbox(tenantId)` and `clearInbox(tenantId)` in demo apps and tests; not for production (buffer is process-memory, lost on restart).',
|
|
84
84
|
);
|
|
85
|
-
//
|
|
86
|
-
//
|
|
87
|
-
//
|
|
88
|
-
// extension-point "mailTransport" definiert.
|
|
85
|
+
// No `config` or `secrets` requirement: the in-memory transport has
|
|
86
|
+
// no configuration and no secret. The only hard requirement is
|
|
87
|
+
// mail-foundation, which defines the "mailTransport" extension point.
|
|
89
88
|
r.requires({ features: ["mail-foundation"] });
|
|
90
89
|
|
|
91
90
|
const plugin: MailTransportPlugin = {
|
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
// kumiko-feature-version: 1
|
|
2
2
|
//
|
|
3
|
-
// mail-transport-smtp — concrete SMTP
|
|
4
|
-
// mail-foundation plugin
|
|
3
|
+
// mail-transport-smtp — concrete SMTP implementation for the
|
|
4
|
+
// mail-foundation plugin API.
|
|
5
5
|
//
|
|
6
|
-
// **
|
|
7
|
-
// 1. Provider-
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
// API
|
|
11
|
-
// 2. **Plugin
|
|
12
|
-
// "smtp", { build })`.
|
|
13
|
-
//
|
|
14
|
-
// 3. `build(ctx, tenantId)`
|
|
15
|
-
// `createSmtpTransport()`
|
|
16
|
-
//
|
|
17
|
-
//
|
|
6
|
+
// **What this feature provides:**
|
|
7
|
+
// 1. Provider-specific tenant config (host/port/secure/from/authUser)
|
|
8
|
+
// and secret (smtp.password). Self-contained — mail-foundation does not
|
|
9
|
+
// know these keys; when an app owner switches between SMTP and the Brevo
|
|
10
|
+
// API, each plugin has its own independent config sets.
|
|
11
|
+
// 2. **Plugin registration** via `r.useExtension("mailTransport",
|
|
12
|
+
// "smtp", { build })`. At boot, mail-foundation's factory lookup maps
|
|
13
|
+
// the name "smtp" to the build function.
|
|
14
|
+
// 3. `build(ctx, tenantId)` reads the config keys and secret, then calls
|
|
15
|
+
// `createSmtpTransport()` from channel-email. This is the plugin's
|
|
16
|
+
// ONLY cross-feature import, deliberately kept local so
|
|
17
|
+
// mail-foundation remains provider-independent.
|
|
18
18
|
//
|
|
19
|
-
// **Pattern
|
|
20
|
-
// `delivery`.
|
|
21
|
-
// mail-foundation's "mailTransport"
|
|
19
|
+
// **Pattern reference:** mirrors `channel-email` registering itself for
|
|
20
|
+
// `delivery`. This feature is analogous: it registers for
|
|
21
|
+
// mail-foundation's "mailTransport" extension point.
|
|
22
22
|
//
|
|
23
|
-
// **Boot
|
|
23
|
+
// **Boot dependencies:**
|
|
24
24
|
// - `mail-foundation` — extension-point owner
|
|
25
|
-
// - `config` —
|
|
26
|
-
// - `secrets` —
|
|
25
|
+
// - `config` — for the tenant config keys
|
|
26
|
+
// - `secrets` — for the encrypted SMTP password
|
|
27
27
|
|
|
28
28
|
import type { lookup } from "node:dns/promises";
|
|
29
29
|
import {
|
|
@@ -20,13 +20,13 @@ import { type BrandingTokens, EMPTY_BRANDING } from "../page-render/index.ts";
|
|
|
20
20
|
// `write: access.withSystem(access.admin)` — tenant admins self-service via
|
|
21
21
|
// configEdit AND the system actor (ctx.systemWriteAs) may provision/migrate
|
|
22
22
|
// these keys. The scope default (`access.admin`, admin-only) has no system
|
|
23
|
-
// path, so a continuity migration could not set them
|
|
24
|
-
//
|
|
23
|
+
// path, so a continuity migration could not set them. Adding SYSTEM_ROLE
|
|
24
|
+
// keeps the keys human-writable (checkWriteAccess collapses to
|
|
25
25
|
// system-only only when system is the SOLE writer), so self-service survives.
|
|
26
26
|
//
|
|
27
|
-
// CONTINUITY (
|
|
27
|
+
// CONTINUITY (Prod trap): these keys land under
|
|
28
28
|
// `managed-pages:config:branding-*`, NOT the live `publicstatus:config:
|
|
29
|
-
// branding-*`. The publicstatus consumer
|
|
29
|
+
// branding-*`. The publicstatus consumer MUST migrate the existing
|
|
30
30
|
// read_config_values rows to the new QNs per tenant BEFORE switching the read
|
|
31
31
|
// path, or every tenant resets to defaults on deploy. The migration is
|
|
32
32
|
// deliberately NOT built here — the source QNs belong to the consumer app.
|
|
@@ -37,7 +37,7 @@ import { type BrandingTokens, EMPTY_BRANDING } from "../page-render/index.ts";
|
|
|
37
37
|
// also renders. text keys carry an explicit length cap too — `validateType`
|
|
38
38
|
// only checks the JS type, and the configEdit `maxLength` is client-side, so a
|
|
39
39
|
// direct config:write:set would otherwise be unbounded (the page body is
|
|
40
|
-
// likewise capped
|
|
40
|
+
// likewise capped).
|
|
41
41
|
const HEX_PATTERN = {
|
|
42
42
|
regex: "^$|^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
|
|
43
43
|
} as const;
|
|
@@ -67,7 +67,7 @@ export const MANAGED_PAGES_CSS_FEATURE = "managed-pages-css";
|
|
|
67
67
|
// site-url`. BRANDING_QN below is the single source those QN strings are read
|
|
68
68
|
// from (configEdit screen + render read); the integration test pins write-
|
|
69
69
|
// target == read-source end-to-end.
|
|
70
|
-
// Admin self-service + system provisioning
|
|
70
|
+
// Admin self-service + system provisioning.
|
|
71
71
|
const BRANDING_WRITE = access.withSystem(access.admin);
|
|
72
72
|
|
|
73
73
|
export const BRANDING_KEYS = {
|
|
@@ -23,13 +23,13 @@ import { MANAGED_PAGES_I18N } from "./web/i18n.ts";
|
|
|
23
23
|
// 60s-shared-cache saves the origin-revalidate roundtrip; CMS edits are live within 60s.
|
|
24
24
|
const PUBLIC_PAGE_CACHE = { kind: "revalidate", maxAgeSeconds: 60 } as const;
|
|
25
25
|
|
|
26
|
-
// QN
|
|
27
|
-
//
|
|
28
|
-
//
|
|
26
|
+
// QN constant as a documented public contract — the render path calls
|
|
27
|
+
// the by-slug query in-process via systemQuery (without importing the
|
|
28
|
+
// handler's code, symmetrically with the legal-pages pattern).
|
|
29
29
|
const BY_SLUG_QN = "managed-pages:query:by-slug";
|
|
30
30
|
|
|
31
|
-
// Raw
|
|
32
|
-
//
|
|
31
|
+
// Raw handler return from bySlugQuery (published-only) — systemQuery dispatches
|
|
32
|
+
// directly to the handler, without the `{data}` envelope used on the /api/query wire.
|
|
33
33
|
type BySlugQueryResult = {
|
|
34
34
|
title: string;
|
|
35
35
|
body: string;
|
|
@@ -83,61 +83,61 @@ export type ManagedPagesWrapLayout = (opts: {
|
|
|
83
83
|
}) => string;
|
|
84
84
|
|
|
85
85
|
export type ManagedPagesOptions = {
|
|
86
|
-
/** Host → tenantId
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
* tenantId (
|
|
90
|
-
*
|
|
86
|
+
/** Host → tenantId for anonymous per-tenant delivery. NULL → 404 (no
|
|
87
|
+
* tenant for this host). Apex/marketing apps provide their subdomain or
|
|
88
|
+
* custom-domain resolution here; single-tenant apps return a constant
|
|
89
|
+
* tenantId (or SYSTEM_TENANT_ID). Required because the apex host has no
|
|
90
|
+
* ambient ctx.tenantId. */
|
|
91
91
|
readonly resolveApexTenant: (host: string) => Promise<string | null> | string | null;
|
|
92
|
-
/** Custom
|
|
93
|
-
*
|
|
94
|
-
* **`branding`
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
* (
|
|
98
|
-
* `brandingHeaderHtml(branding)` + `brandingStyleBlock(branding)` (
|
|
99
|
-
*
|
|
100
|
-
* customCss)`
|
|
101
|
-
*
|
|
102
|
-
*
|
|
92
|
+
/** Custom layout wrapper (branding/chrome). Default: a minimal page-render
|
|
93
|
+
* skeleton. Receives slug + SEO meta for free use.
|
|
94
|
+
* **`branding` is RAW, untrusted tenant input.** `title`/`description`
|
|
95
|
+
* are only length-capped on write, NOT HTML-escaped; `customCss` is
|
|
96
|
+
* unsanitized. The wrapper MUST emit them through the boundary helpers
|
|
97
|
+
* (all re-exported from `@cosmicdrift/kumiko-bundled-features/managed-pages`):
|
|
98
|
+
* `brandingHeaderHtml(branding)` + `brandingStyleBlock(branding)` (which
|
|
99
|
+
* escape header/theme) and, with allowCustomCss, `tenantStyleBlock(branding.
|
|
100
|
+
* customCss)` in the `<head>` plus `TENANT_CONTENT_ATTR` on the body
|
|
101
|
+
* container. A custom wrapper that interpolates `branding.title` itself is
|
|
102
|
+
* stored XSS; the default wrapper uses the helpers throughout. */
|
|
103
103
|
readonly wrapLayout?: ManagedPagesWrapLayout;
|
|
104
|
-
/**
|
|
104
|
+
/** Base path for page routes. Default "/p" → GET /p/:slug. */
|
|
105
105
|
readonly basePath?: string;
|
|
106
|
-
/** Default
|
|
106
|
+
/** Default language when `?lang=` is missing. Default "en". */
|
|
107
107
|
readonly defaultLang?: string;
|
|
108
|
-
/**
|
|
109
|
-
* `branding-custom-css`
|
|
110
|
-
*
|
|
111
|
-
* Default **false** (fail-closed — opt-in
|
|
112
|
-
*
|
|
113
|
-
* `managed-pages-css
|
|
114
|
-
*
|
|
115
|
-
*
|
|
108
|
+
/** Enables the per-tenant custom CSS capability (raw, untrusted): a
|
|
109
|
+
* `branding-custom-css` config key + a CSS field in the branding editor +
|
|
110
|
+
* render emission as a scoped, allowlist-sanitized `<style data-tenant-css>`.
|
|
111
|
+
* Default **false** (fail-closed — opt-in for untrusted tenant input). Even
|
|
112
|
+
* when true, emission is additionally gated per tenant by the
|
|
113
|
+
* `managed-pages-css` toggle (createManagedPagesCssFeature) once a
|
|
114
|
+
* feature-toggles/tier-engine runtime is wired. The render-time sanitizer
|
|
115
|
+
* (page-render/css-sanitize) is the safety boundary. */
|
|
116
116
|
readonly allowCustomCss?: boolean;
|
|
117
117
|
};
|
|
118
118
|
|
|
119
|
-
// managed-pages —
|
|
120
|
-
//
|
|
121
|
-
// (`GET /p/:slug`)
|
|
122
|
-
//
|
|
123
|
-
//
|
|
124
|
-
//
|
|
119
|
+
// managed-pages — tenant-editable, server-rendered public pages.
|
|
120
|
+
// Generalizes the legal-pages rendering pattern: a dynamic slug route
|
|
121
|
+
// (`GET /p/:slug`) that resolves the tenant from the Host (resolveApexTenant),
|
|
122
|
+
// loads the published page, renders hardened Markdown (page-render), and wraps
|
|
123
|
+
// it in chrome through an optional wrapLayout. Drafts → 404. Per-tenant
|
|
124
|
+
// content is cache-isolated through `Vary: Host`.
|
|
125
125
|
//
|
|
126
|
-
// Admin
|
|
127
|
-
// SystemAdmin)
|
|
128
|
-
//
|
|
129
|
-
// same
|
|
126
|
+
// Admin authoring: registers entityList + entityEdit for `page` (TenantAdmin/
|
|
127
|
+
// SystemAdmin) and the convention CRUD handlers dispatched by the renderer.
|
|
128
|
+
// The screens MUST live here (the boot validator requires the entity reference
|
|
129
|
+
// in the same feature); navigation/workspace remains the app's responsibility.
|
|
130
130
|
//
|
|
131
|
-
//
|
|
132
|
-
// • anonymousAccess
|
|
133
|
-
// —
|
|
134
|
-
//
|
|
135
|
-
//
|
|
136
|
-
// • Admin
|
|
137
|
-
// page-list" })`
|
|
138
|
-
// (cross-feature Nav→Screen
|
|
139
|
-
// TenantAdmin.
|
|
140
|
-
// flat-nav
|
|
131
|
+
// App bootstrap requirements:
|
|
132
|
+
// • anonymousAccess must be wired to honor the X-Tenant header
|
|
133
|
+
// — multi-tenant apps use a tenantResolver (or no defaultTenantId).
|
|
134
|
+
// A fixed defaultTenantId locks the app to single-tenant mode and rejects
|
|
135
|
+
// the per-page X-Tenant with 400 tenant_mismatch.
|
|
136
|
+
// • Admin UI: the app exposes these screens via `r.nav({ screen:
|
|
137
|
+
// "managed-pages:screen:page-list" })` plus a workspace entry
|
|
138
|
+
// (cross-feature Nav→Screen is globally validated) and grants its admins
|
|
139
|
+
// TenantAdmin. Without navigation, the screens remain dormant — no leak in
|
|
140
|
+
// flat-nav apps that use managed-pages only for public rendering.
|
|
141
141
|
export function createManagedPagesFeature(opts: ManagedPagesOptions): FeatureDefinition {
|
|
142
142
|
const wrapLayout: ManagedPagesWrapLayout =
|
|
143
143
|
opts.wrapLayout ??
|
|
@@ -192,8 +192,8 @@ export function createManagedPagesFeature(opts: ManagedPagesOptions): FeatureDef
|
|
|
192
192
|
path: `${basePath}/:slug`,
|
|
193
193
|
anonymous: true,
|
|
194
194
|
handler: async (c, { systemQuery }) => {
|
|
195
|
-
// `param("slug")`
|
|
196
|
-
//
|
|
195
|
+
// `param("slug")` is string|undefined because `path` is a computed
|
|
196
|
+
// template (Hono infers `:slug` only from string literals).
|
|
197
197
|
const slug = c.req.param("slug");
|
|
198
198
|
if (!slug) return c.text("not found", 404);
|
|
199
199
|
const lang = c.req.query("lang") || defaultLang;
|
|
@@ -204,13 +204,13 @@ export function createManagedPagesFeature(opts: ManagedPagesOptions): FeatureDef
|
|
|
204
204
|
const tenantId = await opts.resolveApexTenant(host);
|
|
205
205
|
if (!tenantId) return c.text("not found", 404);
|
|
206
206
|
|
|
207
|
-
// Page
|
|
208
|
-
// process
|
|
209
|
-
//
|
|
210
|
-
//
|
|
211
|
-
//
|
|
212
|
-
//
|
|
213
|
-
//
|
|
207
|
+
// Page and branding are read in parallel, both forced through systemQuery
|
|
208
|
+
// in-process for the host-resolved tenantId (no X-Tenant header trick
|
|
209
|
+
// through app.fetch — for a host-based anonymousAccess resolver, that
|
|
210
|
+
// would look like a client override and would rightly be rejected by
|
|
211
|
+
// resolverTrust: "authoritative"; see systemQuery's documentation in
|
|
212
|
+
// http-route.ts). Branding is decorative → a failure degrades to the
|
|
213
|
+
// unbranded default and never blocks the page.
|
|
214
214
|
let pageSettled: { ok: true; data: BySlugQueryResult } | { ok: false };
|
|
215
215
|
let brandingResult: BrandingTokens;
|
|
216
216
|
try {
|
|
@@ -246,8 +246,8 @@ export function createManagedPagesFeature(opts: ManagedPagesOptions): FeatureDef
|
|
|
246
246
|
"content-type": "text/html; charset=utf-8",
|
|
247
247
|
vary: "Host",
|
|
248
248
|
} as const;
|
|
249
|
-
// 304 (
|
|
250
|
-
//
|
|
249
|
+
// 304 (unchanged revision) and HEAD both skip Markdown rendering — the body
|
|
250
|
+
// would be discarded anyway.
|
|
251
251
|
if (etagMatches(c.req.raw.headers.get("if-none-match"), etag) || c.req.method === "HEAD") {
|
|
252
252
|
return cachedSecurePageResponse(c.req.raw, {
|
|
253
253
|
body: null,
|
|
@@ -3,12 +3,11 @@ import { defineQueryHandler } from "@cosmicdrift/kumiko-framework/engine";
|
|
|
3
3
|
import * as z from "zod";
|
|
4
4
|
import { type PageRow, pagesTable } from "../table.ts";
|
|
5
5
|
|
|
6
|
-
// Public
|
|
7
|
-
//
|
|
8
|
-
// via X-Tenant = Host-resolved-tenant
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
// diese Query.
|
|
6
|
+
// Public read by (tenantId, slug, lang), including anonymous access for landing and
|
|
7
|
+
// marketing pages. The tenant comes from query.user.tenantId, set on the render path
|
|
8
|
+
// via X-Tenant = Host-resolved-tenant. Returns ONLY published pages with a body:
|
|
9
|
+
// drafts and empty pages are invisible to anonymous visitors (the route returns 404).
|
|
10
|
+
// Admin editing uses the entity list/edit screens instead of this query.
|
|
12
11
|
export const bySlugQuery = defineQueryHandler({
|
|
13
12
|
name: "by-slug",
|
|
14
13
|
schema: z.object({
|
|
@@ -3,12 +3,12 @@ import { defineQueryHandler } from "@cosmicdrift/kumiko-framework/engine";
|
|
|
3
3
|
import * as z from "zod";
|
|
4
4
|
import { type PageRow, pagesTable } from "../table.ts";
|
|
5
5
|
|
|
6
|
-
// Public
|
|
7
|
-
// sitemap.xml/llms.txt (
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
// Anonymous
|
|
6
|
+
// Public read of all published pages for a tenant, used to discover URLs for
|
|
7
|
+
// sitemap.xml/llms.txt (see the seo feature). Unlike by-slug, which fetches one
|
|
8
|
+
// slug's content, this lists all published slugs in one query, filtered in SQL
|
|
9
|
+
// with `published = true`; drafts never appear, and only slug/title/updatedAt are
|
|
10
|
+
// returned because discovery does not require body content.
|
|
11
|
+
// Anonymous access is explicit in roles, matching text-content's by-tenant.
|
|
12
12
|
export type PublishedPageSummary = {
|
|
13
13
|
readonly slug: string;
|
|
14
14
|
readonly lang: string;
|
|
@@ -19,8 +19,8 @@ export type PublishedPageSummary = {
|
|
|
19
19
|
export const byTenantPublishedQuery = defineQueryHandler({
|
|
20
20
|
name: "by-tenant-published",
|
|
21
21
|
schema: z.object({
|
|
22
|
-
/** Optional cross-tenant read —
|
|
23
|
-
* by-slug.query
|
|
22
|
+
/** Optional cross-tenant read — only for SystemAdmin. Matches the override
|
|
23
|
+
* logic in by-slug.query. */
|
|
24
24
|
tenantIdOverride: z.string().min(1).optional(),
|
|
25
25
|
}),
|
|
26
26
|
access: { roles: ["anonymous", "User", "TenantAdmin", "SystemAdmin"] },
|
|
@@ -18,12 +18,10 @@ const langSchema = z
|
|
|
18
18
|
|
|
19
19
|
const executor = createEventStoreExecutor(pagesTable, pageEntity, { entityName: "page" });
|
|
20
20
|
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
// wenn im Payload weggelassen (undefined) — damit ein Publish-Toggle nicht
|
|
26
|
-
// den Body überschreiben muss und umgekehrt.
|
|
21
|
+
// Upserts one page per (tenantId, slug, lang). The tenant scope defaults to event.user;
|
|
22
|
+
// SystemAdmin can write to another tenant via `tenantIdOverride` (typically SYSTEM_TENANT_ID
|
|
23
|
+
// for app-wide pages). On update, omitted published/description/ogImage values are preserved
|
|
24
|
+
// so a publish toggle does not overwrite the body, and vice versa.
|
|
27
25
|
export const setWrite = defineWriteHandler({
|
|
28
26
|
name: "set",
|
|
29
27
|
schema: z.object({
|
|
@@ -34,7 +32,7 @@ export const setWrite = defineWriteHandler({
|
|
|
34
32
|
description: z.string().max(500).nullable().optional(),
|
|
35
33
|
ogImage: z.string().max(2000).nullable().optional(),
|
|
36
34
|
published: z.boolean().optional(),
|
|
37
|
-
/** Cross-tenant write —
|
|
35
|
+
/** Cross-tenant write — only SystemAdmin (for example, SYSTEM_TENANT_ID pages). */
|
|
38
36
|
tenantIdOverride: z.string().min(1).optional(),
|
|
39
37
|
}),
|
|
40
38
|
access: { roles: ["TenantAdmin", "SystemAdmin"] },
|
|
@@ -3,14 +3,14 @@ import type {
|
|
|
3
3
|
EntityListScreenDefinition,
|
|
4
4
|
} from "@cosmicdrift/kumiko-framework/engine";
|
|
5
5
|
|
|
6
|
-
// Admin
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
// (
|
|
12
|
-
//
|
|
13
|
-
//
|
|
6
|
+
// Admin authoring screens for the `page` entity. These are JSON-safe data only —
|
|
7
|
+
// the generic DataTable/form renderer mounts them, so no React component is
|
|
8
|
+
// needed. Both MUST be registered in the managed-pages feature (not in the
|
|
9
|
+
// app): the boot validator requires `entity: "page"` to be declared in the
|
|
10
|
+
// same feature as the screen. Navigation and workspace placement remain app-
|
|
11
|
+
// specific (`default` workspace is an app singleton) — the app points to this
|
|
12
|
+
// via `r.nav({ screen: "managed-pages:screen:page-list" })`.
|
|
13
|
+
// Cross-feature Nav→Screen is validated against the global screen QN set.
|
|
14
14
|
|
|
15
15
|
const ADMIN_ROLES = ["TenantAdmin", "SystemAdmin"] as const;
|
|
16
16
|
|
|
@@ -72,9 +72,9 @@ export const pageEditScreen: EntityEditScreenDefinition = {
|
|
|
72
72
|
{ field: "title", span: 2 },
|
|
73
73
|
{ field: "description", span: 2 },
|
|
74
74
|
{ field: "ogImage", span: 2 },
|
|
75
|
-
// Publish/Unpublish:
|
|
76
|
-
//
|
|
77
|
-
// rowAction-payload
|
|
75
|
+
// Publish/Unpublish: the `published` toggle here IS the publishing
|
|
76
|
+
// mechanism (there is no separate one-click list action —
|
|
77
|
+
// rowAction-payload cannot inject constants).
|
|
78
78
|
{ field: "published", span: 1 },
|
|
79
79
|
],
|
|
80
80
|
},
|