@cosmicdrift/kumiko-bundled-features 0.374.0 → 0.377.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/dist/account-security/constants.d.ts +1 -0
- package/dist/account-security/constants.js +1 -0
- package/dist/account-security/index.d.ts +1 -1
- package/dist/account-security/index.js +1 -1
- package/dist/admin-shell/web/client-plugin.d.ts +1 -1
- package/dist/audit/web/client-plugin.d.ts +1 -1
- package/dist/auth-email-password/mail-notifications.js +1 -1
- package/dist/auth-email-password/web/auth-client.js +1 -1
- package/dist/auth-email-password/web/auth-form-primitives.js +1 -1
- package/dist/auth-email-password/web/default-topbar-actions.js +1 -1
- package/dist/auth-email-password/web/index.js +1 -1
- package/dist/auth-email-password/web/session.js +1 -1
- package/dist/auth-email-password/web/tenant-menu-items.js +1 -1
- package/dist/auth-email-password/web/tenant-switcher.js +1 -1
- package/dist/auth-email-password/web/user-menu.js +1 -1
- package/dist/auth-foundation/env.d.ts +9 -0
- package/dist/auth-foundation/env.js +21 -0
- package/dist/auth-foundation/index.d.ts +1 -0
- package/dist/auth-foundation/index.js +1 -0
- package/dist/auth-mfa/schema/user-mfa.d.ts +6 -6
- package/dist/billing-foundation/consumer-protection/confirmation-mail.js +1 -1
- package/dist/billing-foundation/consumer-protection/termination-pages.js +1 -1
- package/dist/billing-foundation/contact-card.d.ts +2 -0
- package/dist/billing-foundation/contact-card.js +16 -0
- package/dist/billing-foundation/entities.d.ts +8 -8
- package/dist/billing-foundation/handlers/billing-plans.query.js +1 -1
- package/dist/billing-foundation/index.d.ts +1 -1
- package/dist/billing-foundation/plan-catalog.js +1 -0
- package/dist/billing-foundation/projection.d.ts +8 -8
- package/dist/billing-foundation/types.d.ts +11 -0
- package/dist/billing-foundation/validate-options.js +13 -0
- package/dist/billing-foundation/web/billing-contact-plan.d.ts +5 -0
- package/dist/billing-foundation/web/billing-contact-plan.js +17 -0
- package/dist/billing-foundation/web/billing-plans-panel.js +5 -13
- package/dist/billing-foundation/web/cancel-contract-dialog.js +2 -2
- package/dist/billing-foundation/web/checkout-consent-dialog.d.ts +1 -1
- package/dist/billing-foundation/web/checkout-consent-dialog.js +1 -0
- package/dist/billing-foundation/web/client-plugin.d.ts +1 -1
- package/dist/billing-foundation/web/localized-params.d.ts +1 -0
- package/dist/billing-foundation/web/localized-params.js +11 -0
- package/dist/cap-counter/entity.d.ts +1 -1
- package/dist/cap-overview/web/cap-cards-panel.js +3 -3
- package/dist/cap-overview/web/client-plugin.d.ts +1 -1
- package/dist/channel-email/email-channel.d.ts +2 -1
- package/dist/compliance-profiles/web/client-plugin.d.ts +1 -1
- package/dist/config/feature.js +2 -2
- package/dist/config/table.d.ts +6 -6
- package/dist/custom-fields/entity.d.ts +4 -4
- package/dist/custom-fields/web/client-plugin.d.ts +1 -1
- package/dist/data-retention/schema/tenant-retention-override.d.ts +4 -4
- package/dist/delivery/tables.d.ts +6 -6
- package/dist/delivery/unsubscribe-page.js +1 -1
- package/dist/delivery/web/client-plugin.d.ts +1 -1
- package/dist/delivery/web/delivery-status-cell.js +1 -1
- package/dist/document-ingest-foundation/entity.d.ts +4 -4
- package/dist/feature-toggles/web/client-plugin.d.ts +1 -1
- package/dist/file-provider-s3/env-named-feature.d.ts +17 -0
- package/dist/file-provider-s3/env-named-feature.js +23 -0
- package/dist/file-provider-s3/env-schema.d.ts +7 -0
- package/dist/file-provider-s3/env-schema.js +15 -10
- package/dist/file-provider-s3/index.d.ts +1 -0
- package/dist/file-provider-s3/index.js +1 -0
- package/dist/folders/entity.d.ts +8 -8
- package/dist/folders/web/client-plugin.d.ts +1 -1
- package/dist/form-draft/entity.d.ts +2 -2
- package/dist/host-routing/constants.d.ts +2 -0
- package/dist/host-routing/constants.js +3 -0
- package/dist/host-routing/dispatch.d.ts +1 -1
- package/dist/host-routing/dispatch.js +35 -25
- package/dist/host-routing/feature.js +100 -27
- package/dist/host-routing/host.d.ts +9 -0
- package/dist/host-routing/host.js +24 -2
- package/dist/host-routing/index.d.ts +2 -1
- package/dist/host-routing/index.js +1 -0
- package/dist/host-routing/options.d.ts +14 -0
- package/dist/host-routing/redirects.d.ts +6 -0
- package/dist/host-routing/redirects.js +27 -0
- package/dist/host-routing/tenant-lookup.d.ts +7 -0
- package/dist/host-routing/tenant-lookup.js +39 -0
- package/dist/host-routing/validate-options.js +34 -1
- package/dist/inbound-mail-foundation/entities.d.ts +25 -25
- package/dist/inbound-mail-foundation/feature.js +7 -0
- package/dist/inbound-mail-foundation/i18n.d.ts +3 -0
- package/dist/inbound-mail-foundation/i18n.js +35 -0
- package/dist/inbound-mail-foundation/index.d.ts +1 -0
- package/dist/inbound-mail-foundation/index.js +1 -0
- package/dist/inbound-mail-foundation/projection.d.ts +20 -20
- package/dist/inbound-mail-foundation/screens.d.ts +7 -0
- package/dist/inbound-mail-foundation/screens.js +86 -0
- package/dist/inbound-mail-foundation/types.d.ts +2 -2
- package/dist/jobs/job-run-table.d.ts +6 -6
- package/dist/jobs/web/client-plugin.d.ts +1 -1
- package/dist/ledger/entity.d.ts +13 -13
- package/dist/legal-pages/feature.js +11 -1
- package/dist/legal-pages/layout.d.ts +2 -2
- package/dist/legal-pages/layout.js +4 -4
- package/dist/legal-pages/web/client-plugin.d.ts +1 -1
- package/dist/mail-foundation/feature.d.ts +20 -21
- package/dist/mail-foundation/feature.js +1 -1
- package/dist/managed-pages/table.d.ts +12 -12
- package/dist/managed-pages/web/client-plugin.d.ts +1 -1
- package/dist/notes-history/entity.d.ts +12 -12
- package/dist/notes-history/web/client-plugin.d.ts +1 -1
- package/dist/page-render/branding.js +1 -1
- package/dist/page-render/layout.d.ts +1 -1
- package/dist/page-render/layout.js +2 -2
- package/dist/page-render/markdown.js +1 -1
- package/dist/personal-access-tokens/i18n.js +1 -1
- package/dist/personal-access-tokens/schema/api-token.d.ts +6 -6
- package/dist/personal-access-tokens/screens.js +1 -1
- package/dist/secrets/feature.d.ts +1 -1
- package/dist/secrets/feature.js +3 -3
- package/dist/secrets/table.d.ts +1 -1
- package/dist/seo/sitemap.js +1 -1
- package/dist/sessions/schema/user-session.d.ts +4 -4
- package/dist/shared/mail-template-body.js +1 -1
- package/dist/shared/purge-files-reaching-subject.js +98 -3
- package/dist/tags/entity.d.ts +9 -9
- package/dist/tags/web/client-plugin.d.ts +1 -1
- package/dist/template-resolver/document-blocks.d.ts +5 -0
- package/dist/template-resolver/document-blocks.js +21 -0
- package/dist/template-resolver/document-ops.d.ts +167 -0
- package/dist/template-resolver/document-ops.js +390 -0
- package/dist/template-resolver/document-sanitizer.d.ts +3 -0
- package/dist/template-resolver/document-sanitizer.js +6 -0
- package/dist/template-resolver/feature.d.ts +2 -0
- package/dist/template-resolver/feature.js +4 -0
- package/dist/template-resolver/handlers/bundle-import.js +1 -0
- package/dist/template-resolver/handlers/document-base.d.ts +23 -0
- package/dist/template-resolver/handlers/document-base.js +55 -0
- package/dist/template-resolver/handlers/document-blocks.query.d.ts +22 -0
- package/dist/template-resolver/handlers/document-blocks.query.js +46 -0
- package/dist/template-resolver/handlers/export-bundle.query.d.ts +1 -0
- package/dist/template-resolver/handlers/export-bundle.query.js +9 -2
- package/dist/template-resolver/handlers/import-bundle-system.write.d.ts +1 -0
- package/dist/template-resolver/handlers/import-bundle.write.d.ts +1 -0
- package/dist/template-resolver/handlers/patch-draft.write.d.ts +66 -0
- package/dist/template-resolver/handlers/patch-draft.write.js +105 -0
- package/dist/template-resolver/handlers/preview.query.d.ts +1 -0
- package/dist/template-resolver/handlers/preview.query.js +2 -1
- package/dist/template-resolver/handlers/send-test.write.d.ts +1 -0
- package/dist/template-resolver/handlers/send-test.write.js +2 -1
- package/dist/template-resolver/handlers/template-write.d.ts +2 -0
- package/dist/template-resolver/handlers/template-write.js +14 -2
- package/dist/template-resolver/handlers/validate.query.d.ts +10 -4
- package/dist/template-resolver/handlers/validate.query.js +12 -7
- package/dist/template-resolver/{web/placeholder-text.js → placeholder-text.js} +1 -1
- package/dist/template-resolver/qualified-names.d.ts +2 -0
- package/dist/template-resolver/qualified-names.js +2 -0
- package/dist/template-resolver/seeding.d.ts +1 -0
- package/dist/template-resolver/seeding.js +2 -1
- package/dist/template-resolver/table.d.ts +10 -10
- package/dist/template-resolver/template-bundle.d.ts +1 -0
- package/dist/template-resolver/template-bundle.js +6 -1
- package/dist/template-resolver/template-preview.d.ts +4 -1
- package/dist/template-resolver/template-preview.js +16 -3
- package/dist/template-resolver/template-validation.d.ts +2 -1
- package/dist/template-resolver/template-validation.js +1 -1
- package/dist/template-resolver/user-content-table.d.ts +10 -10
- package/dist/template-resolver/web/client-plugin.d.ts +1 -1
- package/dist/template-resolver/web/client-plugin.js +3 -3
- package/dist/template-resolver/web/document-tiptap-editor.js +1 -1
- package/dist/template-resolver/web/document-toolbar-blocks.d.ts +2 -5
- package/dist/template-resolver/web/document-toolbar-blocks.js +1 -21
- package/dist/template-resolver/web/i18n.js +14 -0
- package/dist/template-resolver/web/placeholder-line-editor.js +2 -2
- package/dist/tenant/invitation-table.d.ts +6 -6
- package/dist/tenant/membership-table.d.ts +4 -4
- package/dist/tenant/schema/tenant.d.ts +6 -6
- package/dist/tenant/web/client-plugin.d.ts +1 -1
- package/dist/tenant/web/member-status-cell.js +1 -1
- package/dist/tier-engine/entity.d.ts +1 -1
- package/dist/tier-engine/tier-resolver.d.ts +1 -1
- package/dist/tier-engine/web/client-plugin.d.ts +1 -1
- package/dist/user/schema/user.d.ts +12 -12
- package/dist/user-data-rights/env.d.ts +5 -0
- package/dist/user-data-rights/env.js +11 -0
- package/dist/user-data-rights/feature.js +4 -2
- package/dist/user-data-rights/index.d.ts +1 -0
- package/dist/user-data-rights/index.js +1 -0
- package/dist/user-data-rights/lib/mail-transport-resolver.js +1 -1
- package/dist/user-data-rights/lib/storage-provider-resolver.js +1 -1
- package/dist/user-data-rights/mail-notifications.js +1 -1
- package/dist/user-data-rights/schema/download-attempt.d.ts +14 -14
- package/dist/user-data-rights/schema/download-token.d.ts +8 -8
- package/dist/user-data-rights/schema/export-job.d.ts +6 -6
- package/dist/user-data-rights/web/client-plugin.d.ts +1 -1
- package/dist/user-data-rights/web/privacy-center-screen.js +2 -2
- package/dist/waitlist/entity.d.ts +14 -14
- package/dist/waitlist/legacy-migrate.d.ts +2 -0
- package/dist/waitlist/legacy-migrate.js +38 -3
- package/package.json +16 -11
- package/src/account-security/changes.json +6 -0
- package/src/auth-foundation/changes.json +6 -0
- package/src/billing-foundation/changes.json +6 -0
- package/src/channel-email/changes.json +6 -0
- package/src/crypto-shredding/changes.json +6 -0
- package/src/file-provider-s3/changes.json +6 -0
- package/src/host-routing/changes.json +6 -0
- package/src/inbound-mail-foundation/changes.json +7 -0
- package/src/legal-pages/changes.json +6 -0
- package/src/template-resolver/changes.json +18 -0
- package/src/user-data-rights/changes.json +6 -0
- package/src/waitlist/changes.json +6 -0
- /package/dist/template-resolver/{web/placeholder-text.d.ts → placeholder-text.d.ts} +0 -0
|
@@ -14,7 +14,7 @@ export declare const userContentEntryEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
14
14
|
readonly sensitive?: boolean;
|
|
15
15
|
readonly writeOnly?: boolean;
|
|
16
16
|
readonly readAsInstruction?: boolean;
|
|
17
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
17
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
18
18
|
readonly default?: string;
|
|
19
19
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
20
20
|
readonly multiline?: boolean | {
|
|
@@ -37,7 +37,7 @@ export declare const userContentEntryEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
37
37
|
readonly sensitive?: boolean;
|
|
38
38
|
readonly writeOnly?: boolean;
|
|
39
39
|
readonly readAsInstruction?: boolean;
|
|
40
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
40
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
41
41
|
readonly default?: string;
|
|
42
42
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
43
43
|
readonly multiline?: boolean | {
|
|
@@ -89,7 +89,7 @@ export declare const userContentEntryEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
89
89
|
readonly sensitive?: boolean;
|
|
90
90
|
readonly writeOnly?: boolean;
|
|
91
91
|
readonly readAsInstruction?: boolean;
|
|
92
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
92
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
93
93
|
readonly default?: string;
|
|
94
94
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
95
95
|
readonly multiline?: boolean | {
|
|
@@ -112,7 +112,7 @@ export declare const userContentEntryEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
112
112
|
readonly sensitive?: boolean;
|
|
113
113
|
readonly writeOnly?: boolean;
|
|
114
114
|
readonly readAsInstruction?: boolean;
|
|
115
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
115
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
116
116
|
readonly default?: string;
|
|
117
117
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
118
118
|
readonly multiline?: boolean | {
|
|
@@ -135,7 +135,7 @@ export declare const userContentEntryEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
135
135
|
readonly sensitive?: boolean;
|
|
136
136
|
readonly writeOnly?: boolean;
|
|
137
137
|
readonly readAsInstruction?: boolean;
|
|
138
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
138
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
139
139
|
readonly default?: string;
|
|
140
140
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
141
141
|
readonly multiline?: boolean | {
|
|
@@ -200,7 +200,7 @@ export declare const userContentEntriesTable: import("@cosmicdrift/kumiko-framew
|
|
|
200
200
|
readonly sensitive?: boolean;
|
|
201
201
|
readonly writeOnly?: boolean;
|
|
202
202
|
readonly readAsInstruction?: boolean;
|
|
203
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
203
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
204
204
|
readonly default?: string;
|
|
205
205
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
206
206
|
readonly multiline?: boolean | {
|
|
@@ -223,7 +223,7 @@ export declare const userContentEntriesTable: import("@cosmicdrift/kumiko-framew
|
|
|
223
223
|
readonly sensitive?: boolean;
|
|
224
224
|
readonly writeOnly?: boolean;
|
|
225
225
|
readonly readAsInstruction?: boolean;
|
|
226
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
226
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
227
227
|
readonly default?: string;
|
|
228
228
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
229
229
|
readonly multiline?: boolean | {
|
|
@@ -275,7 +275,7 @@ export declare const userContentEntriesTable: import("@cosmicdrift/kumiko-framew
|
|
|
275
275
|
readonly sensitive?: boolean;
|
|
276
276
|
readonly writeOnly?: boolean;
|
|
277
277
|
readonly readAsInstruction?: boolean;
|
|
278
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
278
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
279
279
|
readonly default?: string;
|
|
280
280
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
281
281
|
readonly multiline?: boolean | {
|
|
@@ -298,7 +298,7 @@ export declare const userContentEntriesTable: import("@cosmicdrift/kumiko-framew
|
|
|
298
298
|
readonly sensitive?: boolean;
|
|
299
299
|
readonly writeOnly?: boolean;
|
|
300
300
|
readonly readAsInstruction?: boolean;
|
|
301
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
301
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
302
302
|
readonly default?: string;
|
|
303
303
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
304
304
|
readonly multiline?: boolean | {
|
|
@@ -321,7 +321,7 @@ export declare const userContentEntriesTable: import("@cosmicdrift/kumiko-framew
|
|
|
321
321
|
readonly sensitive?: boolean;
|
|
322
322
|
readonly writeOnly?: boolean;
|
|
323
323
|
readonly readAsInstruction?: boolean;
|
|
324
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
324
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
325
325
|
readonly default?: string;
|
|
326
326
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
327
327
|
readonly multiline?: boolean | {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { TreeNode } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
|
-
import { type ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
2
|
+
import { type ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
3
3
|
export type BlockSummary = {
|
|
4
4
|
readonly slug: string;
|
|
5
5
|
readonly locale: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { EMPTY_VALUE_PLACEHOLDER } from "@cosmicdrift/kumiko-headless";
|
|
2
|
+
import { EMPTY_VALUE_PLACEHOLDER } from "@cosmicdrift/kumiko-renderer/headless";
|
|
3
3
|
// @runtime client
|
|
4
4
|
// Client feature factory for the text-block content tree. Apps mount it via
|
|
5
5
|
// createKumikoApp({ clientFeatures: [textBlocksClient()] }); it loads the
|
|
@@ -12,9 +12,9 @@ import { EMPTY_VALUE_PLACEHOLDER } from "@cosmicdrift/kumiko-headless";
|
|
|
12
12
|
// **State**: TreeNode.state = "filled" when content is set, otherwise "stub"
|
|
13
13
|
// (a hint that the slug exists but is empty).
|
|
14
14
|
import { useShellUser } from "@cosmicdrift/kumiko-bundled-features/auth-email-password/web";
|
|
15
|
-
import { CSRF_HEADER_NAME, readCsrfToken } from "@cosmicdrift/kumiko-dispatcher-live";
|
|
16
15
|
import { ContentPreview, useAppFeatures, useContentEditor, useDispatcher, usePrimitives, useQuery, useTranslation, } from "@cosmicdrift/kumiko-renderer";
|
|
17
|
-
import {
|
|
16
|
+
import { CSRF_HEADER_NAME, readCsrfToken } from "@cosmicdrift/kumiko-renderer/live";
|
|
17
|
+
import { PlainContentEditor, RichContentEditor, } from "@cosmicdrift/kumiko-renderer/web";
|
|
18
18
|
import { useEffect, useId, useState } from "react";
|
|
19
19
|
import { collectionHandlerName, collectionQueryName, TemplateResolverHandlers, TemplateResolverQueries, } from "../qualified-names.js";
|
|
20
20
|
import { DocumentBlocksContext, DocumentContentEditor } from "./document-editor.js";
|
|
@@ -6,7 +6,7 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
|
|
|
6
6
|
// collection is rendered. Variables are inserted as `variable` nodes only,
|
|
7
7
|
// never as `{{name}}` text, so the sanitizer's schema keeps them.
|
|
8
8
|
import { TextareaContentEditor, usePrimitives, useTranslation, VariableChips, } from "@cosmicdrift/kumiko-renderer";
|
|
9
|
-
import { cn } from "@cosmicdrift/kumiko-renderer
|
|
9
|
+
import { cn } from "@cosmicdrift/kumiko-renderer/web";
|
|
10
10
|
import { isOneOf } from "@cosmicdrift/kumiko-types/type-guards";
|
|
11
11
|
import { EditorContent, useEditor, useEditorState } from "@tiptap/react";
|
|
12
12
|
import { BubbleMenu } from "@tiptap/react/menus";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ContentEditorProps } from "@cosmicdrift/kumiko-renderer";
|
|
2
2
|
import type { ReactNode } from "react";
|
|
3
|
-
|
|
3
|
+
import type { DocumentToolbarBlock } from "../document-blocks.ts";
|
|
4
4
|
/** Imperative access for an outside panel (placeholder list, resource list). */
|
|
5
5
|
export type DocumentEditorHandle = {
|
|
6
6
|
readonly insertPlaceholder: (name: string) => void;
|
|
@@ -35,7 +35,4 @@ export type DocumentEditorProps = ContentEditorProps & {
|
|
|
35
35
|
/** Called with the handle once the editor exists and with null when it is destroyed (unmount or rebuild), so a held handle never outlives its editor. */
|
|
36
36
|
readonly onEditorReady?: (handle: DocumentEditorHandle | null) => void;
|
|
37
37
|
};
|
|
38
|
-
export
|
|
39
|
-
export declare const PDF_DOCUMENT_BLOCKS: readonly ["align", "image", "table", "divider", "repeat", "steps", "pageBreak"];
|
|
40
|
-
/** Block set for a template-resource kind; every kind except "document-pdf" gets the mail set. */
|
|
41
|
-
export declare function documentBlocksForKind(kind: string | undefined): readonly DocumentToolbarBlock[];
|
|
38
|
+
export { type DocumentToolbarBlock, documentBlocksForKind, MAIL_DOCUMENT_BLOCKS, PDF_DOCUMENT_BLOCKS, } from "../document-blocks.ts";
|
|
@@ -1,21 +1 @@
|
|
|
1
|
-
export
|
|
2
|
-
"image",
|
|
3
|
-
"table",
|
|
4
|
-
"button",
|
|
5
|
-
"divider",
|
|
6
|
-
"repeat",
|
|
7
|
-
"steps",
|
|
8
|
-
];
|
|
9
|
-
export const PDF_DOCUMENT_BLOCKS = [
|
|
10
|
-
"align",
|
|
11
|
-
"image",
|
|
12
|
-
"table",
|
|
13
|
-
"divider",
|
|
14
|
-
"repeat",
|
|
15
|
-
"steps",
|
|
16
|
-
"pageBreak",
|
|
17
|
-
];
|
|
18
|
-
/** Block set for a template-resource kind; every kind except "document-pdf" gets the mail set. */
|
|
19
|
-
export function documentBlocksForKind(kind) {
|
|
20
|
-
return kind === "document-pdf" ? PDF_DOCUMENT_BLOCKS : MAIL_DOCUMENT_BLOCKS;
|
|
21
|
-
}
|
|
1
|
+
export { documentBlocksForKind, MAIL_DOCUMENT_BLOCKS, PDF_DOCUMENT_BLOCKS, } from "../document-blocks.js";
|
|
@@ -66,6 +66,20 @@ export const defaultTranslations = {
|
|
|
66
66
|
"templateResolver.checks.sizeUnderCap": "The mail is within the 10 MiB size limit",
|
|
67
67
|
"templateResolver.checks.requiredPlaceholders": "All required placeholders are used",
|
|
68
68
|
"templateResolver.errors.preview.renderFailed": "The preview could not be rendered.",
|
|
69
|
+
"templateResolver.errors.patch.unknownBlock": "The block {blockId} does not exist in the template.",
|
|
70
|
+
"templateResolver.errors.patch.blockRemoved": "The block {blockId} was already removed by an earlier step.",
|
|
71
|
+
"templateResolver.errors.patch.textNotFound": "The text {find} was not found in the block.",
|
|
72
|
+
"templateResolver.errors.patch.textAmbiguous": "The text {find} occurs {count} times in the block; use a longer text.",
|
|
73
|
+
"templateResolver.errors.patch.blockNotAllowed": "The block type {type} is not available in {kind} templates.",
|
|
74
|
+
"templateResolver.errors.patch.blockTypeMismatch": "This step needs a {expected} block, but the block is a {actual}.",
|
|
75
|
+
"templateResolver.errors.patch.invalidResourceKey": "The image key {resource} is not valid.",
|
|
76
|
+
"templateResolver.errors.patch.invalidButtonHref": "A button target must be a placeholder in double curly braces.",
|
|
77
|
+
"templateResolver.errors.patch.invalidVariableName": "The variable name {name} is not valid.",
|
|
78
|
+
"templateResolver.errors.patch.invalidVariableDefinition": "The definition of the variable {name} is not valid.",
|
|
79
|
+
"templateResolver.errors.patch.invalidDocument": "The change would produce an invalid document.",
|
|
80
|
+
"templateResolver.errors.patch.invalidMetaKey": "The meta key {key} is not allowed.",
|
|
81
|
+
"templateResolver.errors.patch.variablesDeclaredByFeature": "The variables of {slug} are fixed by the application and cannot be changed.",
|
|
82
|
+
"templateResolver.errors.patch.requiredPlaceholderRemoved": "The change removes required placeholders: {names}",
|
|
69
83
|
"templateResolver.errors.testMail.noChannel": "No email channel is set up, so no test mail can be sent.",
|
|
70
84
|
"templateResolver.errors.testMail.noAddress": "Your account has no email address to send the test mail to.",
|
|
71
85
|
"templateResolver.errors.testMail.failed": "The test mail could not be sent.",
|
|
@@ -4,16 +4,16 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
4
4
|
// Single-line editor for plain-text fields that carry {{placeholders}}
|
|
5
5
|
// (subject, preheader). The stored value stays plain text; placeholders show
|
|
6
6
|
// as chips while editing. Lives in the same lazy chunk as the document editor.
|
|
7
|
-
import { cn } from "@cosmicdrift/kumiko-renderer
|
|
7
|
+
import { cn } from "@cosmicdrift/kumiko-renderer/web";
|
|
8
8
|
import { Extension, Node } from "@tiptap/core";
|
|
9
9
|
import { Placeholder, UndoRedo } from "@tiptap/extensions";
|
|
10
10
|
import { EditorContent, useEditor } from "@tiptap/react";
|
|
11
11
|
import StarterKit from "@tiptap/starter-kit";
|
|
12
12
|
import { useMemo, useState } from "react";
|
|
13
13
|
import { DocumentVariable } from "../document-schema.js";
|
|
14
|
+
import { contentToLine, lineToContent, singleLine } from "../placeholder-text.js";
|
|
14
15
|
import { createVariableView } from "./document-editor-extensions.js";
|
|
15
16
|
import { createEditorHandle } from "./editor-handle.js";
|
|
16
|
-
import { contentToLine, lineToContent, singleLine } from "./placeholder-text.js";
|
|
17
17
|
import { useStableByKey } from "./use-stable-by-key.js";
|
|
18
18
|
const LineDocument = Node.create({ name: "doc", topNode: true, content: "paragraph" });
|
|
19
19
|
// One line only: Enter must not split the paragraph.
|
|
@@ -21,7 +21,7 @@ export declare const tenantInvitationEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
21
21
|
readonly sensitive?: boolean;
|
|
22
22
|
readonly writeOnly?: boolean;
|
|
23
23
|
readonly readAsInstruction?: boolean;
|
|
24
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
24
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
25
25
|
readonly default?: string;
|
|
26
26
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
27
27
|
readonly multiline?: boolean | {
|
|
@@ -44,7 +44,7 @@ export declare const tenantInvitationEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
44
44
|
readonly sensitive?: boolean;
|
|
45
45
|
readonly writeOnly?: boolean;
|
|
46
46
|
readonly readAsInstruction?: boolean;
|
|
47
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
47
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
48
48
|
readonly default?: string;
|
|
49
49
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
50
50
|
readonly multiline?: boolean | {
|
|
@@ -92,7 +92,7 @@ export declare const tenantInvitationEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
92
92
|
readonly sensitive?: boolean;
|
|
93
93
|
readonly writeOnly?: boolean;
|
|
94
94
|
readonly readAsInstruction?: boolean;
|
|
95
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
95
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
96
96
|
readonly default?: string;
|
|
97
97
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
98
98
|
readonly multiline?: boolean | {
|
|
@@ -151,7 +151,7 @@ export declare const tenantInvitationsTable: import("@cosmicdrift/kumiko-framewo
|
|
|
151
151
|
readonly sensitive?: boolean;
|
|
152
152
|
readonly writeOnly?: boolean;
|
|
153
153
|
readonly readAsInstruction?: boolean;
|
|
154
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
154
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
155
155
|
readonly default?: string;
|
|
156
156
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
157
157
|
readonly multiline?: boolean | {
|
|
@@ -174,7 +174,7 @@ export declare const tenantInvitationsTable: import("@cosmicdrift/kumiko-framewo
|
|
|
174
174
|
readonly sensitive?: boolean;
|
|
175
175
|
readonly writeOnly?: boolean;
|
|
176
176
|
readonly readAsInstruction?: boolean;
|
|
177
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
177
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
178
178
|
readonly default?: string;
|
|
179
179
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
180
180
|
readonly multiline?: boolean | {
|
|
@@ -222,7 +222,7 @@ export declare const tenantInvitationsTable: import("@cosmicdrift/kumiko-framewo
|
|
|
222
222
|
readonly sensitive?: boolean;
|
|
223
223
|
readonly writeOnly?: boolean;
|
|
224
224
|
readonly readAsInstruction?: boolean;
|
|
225
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
225
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
226
226
|
readonly default?: string;
|
|
227
227
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
228
228
|
readonly multiline?: boolean | {
|
|
@@ -13,7 +13,7 @@ export declare const tenantMembershipEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
13
13
|
readonly sensitive?: boolean;
|
|
14
14
|
readonly writeOnly?: boolean;
|
|
15
15
|
readonly readAsInstruction?: boolean;
|
|
16
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
16
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
17
17
|
readonly default?: string;
|
|
18
18
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
19
19
|
readonly multiline?: boolean | {
|
|
@@ -36,7 +36,7 @@ export declare const tenantMembershipEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
36
36
|
readonly sensitive?: boolean;
|
|
37
37
|
readonly writeOnly?: boolean;
|
|
38
38
|
readonly readAsInstruction?: boolean;
|
|
39
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
39
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
40
40
|
readonly default?: string;
|
|
41
41
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
42
42
|
readonly multiline?: boolean | {
|
|
@@ -61,7 +61,7 @@ export declare const tenantMembershipsTable: import("@cosmicdrift/kumiko-framewo
|
|
|
61
61
|
readonly sensitive?: boolean;
|
|
62
62
|
readonly writeOnly?: boolean;
|
|
63
63
|
readonly readAsInstruction?: boolean;
|
|
64
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
64
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
65
65
|
readonly default?: string;
|
|
66
66
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
67
67
|
readonly multiline?: boolean | {
|
|
@@ -84,7 +84,7 @@ export declare const tenantMembershipsTable: import("@cosmicdrift/kumiko-framewo
|
|
|
84
84
|
readonly sensitive?: boolean;
|
|
85
85
|
readonly writeOnly?: boolean;
|
|
86
86
|
readonly readAsInstruction?: boolean;
|
|
87
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
87
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
88
88
|
readonly default?: string;
|
|
89
89
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
90
90
|
readonly multiline?: boolean | {
|
|
@@ -15,7 +15,7 @@ export declare const tenantEntity: import("@cosmicdrift/kumiko-types/fields").En
|
|
|
15
15
|
readonly sensitive?: boolean;
|
|
16
16
|
readonly writeOnly?: boolean;
|
|
17
17
|
readonly readAsInstruction?: boolean;
|
|
18
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
18
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
19
19
|
readonly default?: string;
|
|
20
20
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
21
21
|
readonly multiline?: boolean | {
|
|
@@ -38,7 +38,7 @@ export declare const tenantEntity: import("@cosmicdrift/kumiko-types/fields").En
|
|
|
38
38
|
readonly sensitive?: boolean;
|
|
39
39
|
readonly writeOnly?: boolean;
|
|
40
40
|
readonly readAsInstruction?: boolean;
|
|
41
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
41
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
42
42
|
readonly default?: string;
|
|
43
43
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
44
44
|
readonly multiline?: boolean | {
|
|
@@ -105,7 +105,7 @@ export declare const tenantEntity: import("@cosmicdrift/kumiko-types/fields").En
|
|
|
105
105
|
readonly sensitive?: boolean;
|
|
106
106
|
readonly writeOnly?: boolean;
|
|
107
107
|
readonly readAsInstruction?: boolean;
|
|
108
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
108
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
109
109
|
readonly default?: string;
|
|
110
110
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
111
111
|
readonly multiline?: boolean | {
|
|
@@ -175,7 +175,7 @@ export declare const tenantTable: import("@cosmicdrift/kumiko-framework/db").Ent
|
|
|
175
175
|
readonly sensitive?: boolean;
|
|
176
176
|
readonly writeOnly?: boolean;
|
|
177
177
|
readonly readAsInstruction?: boolean;
|
|
178
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
178
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
179
179
|
readonly default?: string;
|
|
180
180
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
181
181
|
readonly multiline?: boolean | {
|
|
@@ -198,7 +198,7 @@ export declare const tenantTable: import("@cosmicdrift/kumiko-framework/db").Ent
|
|
|
198
198
|
readonly sensitive?: boolean;
|
|
199
199
|
readonly writeOnly?: boolean;
|
|
200
200
|
readonly readAsInstruction?: boolean;
|
|
201
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
201
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
202
202
|
readonly default?: string;
|
|
203
203
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
204
204
|
readonly multiline?: boolean | {
|
|
@@ -265,7 +265,7 @@ export declare const tenantTable: import("@cosmicdrift/kumiko-framework/db").Ent
|
|
|
265
265
|
readonly sensitive?: boolean;
|
|
266
266
|
readonly writeOnly?: boolean;
|
|
267
267
|
readonly readAsInstruction?: boolean;
|
|
268
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
268
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
269
269
|
readonly default?: string;
|
|
270
270
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
271
271
|
readonly multiline?: boolean | {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type TranslationsByLocale } from "@cosmicdrift/kumiko-renderer";
|
|
2
|
-
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
2
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
3
3
|
export type TenantClientOptions = {
|
|
4
4
|
readonly translations?: TranslationsByLocale;
|
|
5
5
|
};
|
|
@@ -5,7 +5,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
5
5
|
// screens.ts). The list frame itself is the generic declarative
|
|
6
6
|
// projectionList renderer — only this one cell stays TSX.
|
|
7
7
|
import { useTranslation } from "@cosmicdrift/kumiko-renderer";
|
|
8
|
-
import { StatusBadge } from "@cosmicdrift/kumiko-renderer
|
|
8
|
+
import { StatusBadge } from "@cosmicdrift/kumiko-renderer/web";
|
|
9
9
|
import { translateOrRaw } from "../../shared/web/translate-or-raw.js";
|
|
10
10
|
const STATUS_TONE = {
|
|
11
11
|
active: "ok",
|
|
@@ -14,7 +14,7 @@ export declare const tierAssignmentEntity: import("@cosmicdrift/kumiko-types/fie
|
|
|
14
14
|
readonly sensitive?: boolean;
|
|
15
15
|
readonly writeOnly?: boolean;
|
|
16
16
|
readonly readAsInstruction?: boolean;
|
|
17
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
17
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
18
18
|
readonly default?: string;
|
|
19
19
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
20
20
|
readonly multiline?: boolean | {
|
|
@@ -21,7 +21,7 @@ export declare function createTierResolver<TTier extends string, TCaps>(deps: Ti
|
|
|
21
21
|
readonly sensitive?: boolean;
|
|
22
22
|
readonly writeOnly?: boolean;
|
|
23
23
|
readonly readAsInstruction?: boolean;
|
|
24
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
24
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
25
25
|
readonly default?: string;
|
|
26
26
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
27
27
|
readonly multiline?: boolean | {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type TranslationsByLocale } from "@cosmicdrift/kumiko-renderer";
|
|
2
|
-
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
2
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
3
3
|
export type TierEngineClientOptions = {
|
|
4
4
|
/** Per-key overrides over the default bundles (de/en). */
|
|
5
5
|
readonly translations?: TranslationsByLocale;
|
|
@@ -42,7 +42,7 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
|
|
|
42
42
|
readonly sensitive?: boolean;
|
|
43
43
|
readonly writeOnly?: boolean;
|
|
44
44
|
readonly readAsInstruction?: boolean;
|
|
45
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
45
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
46
46
|
readonly default?: string;
|
|
47
47
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
48
48
|
readonly multiline?: boolean | {
|
|
@@ -65,7 +65,7 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
|
|
|
65
65
|
readonly sensitive?: boolean;
|
|
66
66
|
readonly writeOnly?: boolean;
|
|
67
67
|
readonly readAsInstruction?: boolean;
|
|
68
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
68
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
69
69
|
readonly default?: string;
|
|
70
70
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
71
71
|
readonly multiline?: boolean | {
|
|
@@ -88,7 +88,7 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
|
|
|
88
88
|
readonly sensitive?: boolean;
|
|
89
89
|
readonly writeOnly?: boolean;
|
|
90
90
|
readonly readAsInstruction?: boolean;
|
|
91
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
91
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
92
92
|
readonly default?: string;
|
|
93
93
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
94
94
|
readonly multiline?: boolean | {
|
|
@@ -111,7 +111,7 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
|
|
|
111
111
|
readonly sensitive?: boolean;
|
|
112
112
|
readonly writeOnly?: boolean;
|
|
113
113
|
readonly readAsInstruction?: boolean;
|
|
114
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
114
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
115
115
|
readonly default?: string;
|
|
116
116
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
117
117
|
readonly multiline?: boolean | {
|
|
@@ -143,7 +143,7 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
|
|
|
143
143
|
readonly sensitive?: boolean;
|
|
144
144
|
readonly writeOnly?: boolean;
|
|
145
145
|
readonly readAsInstruction?: boolean;
|
|
146
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
146
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
147
147
|
readonly default?: string;
|
|
148
148
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
149
149
|
readonly multiline?: boolean | {
|
|
@@ -210,7 +210,7 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
|
|
|
210
210
|
readonly sensitive?: boolean;
|
|
211
211
|
readonly writeOnly?: boolean;
|
|
212
212
|
readonly readAsInstruction?: boolean;
|
|
213
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
213
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
214
214
|
readonly default?: string;
|
|
215
215
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
216
216
|
readonly multiline?: boolean | {
|
|
@@ -235,7 +235,7 @@ export declare const userTable: import("@cosmicdrift/kumiko-framework/db").Entit
|
|
|
235
235
|
readonly sensitive?: boolean;
|
|
236
236
|
readonly writeOnly?: boolean;
|
|
237
237
|
readonly readAsInstruction?: boolean;
|
|
238
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
238
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
239
239
|
readonly default?: string;
|
|
240
240
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
241
241
|
readonly multiline?: boolean | {
|
|
@@ -258,7 +258,7 @@ export declare const userTable: import("@cosmicdrift/kumiko-framework/db").Entit
|
|
|
258
258
|
readonly sensitive?: boolean;
|
|
259
259
|
readonly writeOnly?: boolean;
|
|
260
260
|
readonly readAsInstruction?: boolean;
|
|
261
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
261
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
262
262
|
readonly default?: string;
|
|
263
263
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
264
264
|
readonly multiline?: boolean | {
|
|
@@ -281,7 +281,7 @@ export declare const userTable: import("@cosmicdrift/kumiko-framework/db").Entit
|
|
|
281
281
|
readonly sensitive?: boolean;
|
|
282
282
|
readonly writeOnly?: boolean;
|
|
283
283
|
readonly readAsInstruction?: boolean;
|
|
284
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
284
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
285
285
|
readonly default?: string;
|
|
286
286
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
287
287
|
readonly multiline?: boolean | {
|
|
@@ -304,7 +304,7 @@ export declare const userTable: import("@cosmicdrift/kumiko-framework/db").Entit
|
|
|
304
304
|
readonly sensitive?: boolean;
|
|
305
305
|
readonly writeOnly?: boolean;
|
|
306
306
|
readonly readAsInstruction?: boolean;
|
|
307
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
307
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
308
308
|
readonly default?: string;
|
|
309
309
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
310
310
|
readonly multiline?: boolean | {
|
|
@@ -336,7 +336,7 @@ export declare const userTable: import("@cosmicdrift/kumiko-framework/db").Entit
|
|
|
336
336
|
readonly sensitive?: boolean;
|
|
337
337
|
readonly writeOnly?: boolean;
|
|
338
338
|
readonly readAsInstruction?: boolean;
|
|
339
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
339
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
340
340
|
readonly default?: string;
|
|
341
341
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
342
342
|
readonly multiline?: boolean | {
|
|
@@ -403,7 +403,7 @@ export declare const userTable: import("@cosmicdrift/kumiko-framework/db").Entit
|
|
|
403
403
|
readonly sensitive?: boolean;
|
|
404
404
|
readonly writeOnly?: boolean;
|
|
405
405
|
readonly readAsInstruction?: boolean;
|
|
406
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
406
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
407
407
|
readonly default?: string;
|
|
408
408
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
409
409
|
readonly multiline?: boolean | {
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
const MIN_DELETION_TOKEN_SECRET_LENGTH = 32;
|
|
3
|
+
/** Optional dedicated HMAC key of the anonymous deletion-confirmation links. */
|
|
4
|
+
export const deletionTokenSecretEnvSchema = z.object({
|
|
5
|
+
DELETION_TOKEN_SECRET: z
|
|
6
|
+
.string()
|
|
7
|
+
.min(MIN_DELETION_TOKEN_SECRET_LENGTH)
|
|
8
|
+
.optional()
|
|
9
|
+
.describe("Dedicated HMAC secret for the anonymous deletion-confirmation links. Unset: derived from JWT_SECRET.")
|
|
10
|
+
.meta({ kumiko: { pulumi: { generator: "openssl rand -hex 24", secret: true } } }),
|
|
11
|
+
});
|
|
@@ -7,6 +7,7 @@ import { isPlainObject } from "@cosmicdrift/kumiko-types/type-guards";
|
|
|
7
7
|
import { createConfigAccessor } from "../config/index.js";
|
|
8
8
|
import { validateGdprHookCompleteness, validateGdprPiiHookCoverage } from "./boot-checks.js";
|
|
9
9
|
import { EXPORT_SECTION_EXTENSION_NAME, PRIVACY_CENTER_SCREEN_ID, STATUS_OPTION_KEY_PREFIX, USER_ME_QUERY, UserDataRightsHandlers, } from "./constants.js";
|
|
10
|
+
import { deletionTokenSecretEnvSchema } from "./env.js";
|
|
10
11
|
import { cancelDeletionWrite } from "./handlers/cancel-deletion.write.js";
|
|
11
12
|
import { createConfirmDeletionByTokenHandler } from "./handlers/confirm-deletion-by-token.write.js";
|
|
12
13
|
import { downloadAttemptListQuery } from "./handlers/download-attempt-list.query.js";
|
|
@@ -57,6 +58,7 @@ export function createUserDataRightsFeature(opts = {}) {
|
|
|
57
58
|
recommended: false,
|
|
58
59
|
});
|
|
59
60
|
r.requires({ features: ["user", "data-retention", "compliance-profiles", "sessions"] });
|
|
61
|
+
r.envSchema(deletionTokenSecretEnvSchema);
|
|
60
62
|
r.usesApi("compliance.forTenant");
|
|
61
63
|
r.usesApi("retention.policyFor");
|
|
62
64
|
// S2.U6 — restrict-account ruft sessions.revokeAllForUser cross-feature.
|
|
@@ -430,7 +432,7 @@ export function createUserDataRightsFeature(opts = {}) {
|
|
|
430
432
|
// SYSTEM_USER_ID ist die framework-weite Konvention. Der job-
|
|
431
433
|
// Discriminator wird via handlerName="user-data-rights:run-export-
|
|
432
434
|
// jobs" im Secret-Read-Audit erfasst.
|
|
433
|
-
const exportUserId =
|
|
435
|
+
const exportUserId = SYSTEM_USER_ID;
|
|
434
436
|
const exportDb = ctx.db.unsafeRaw(); // @cast-boundary db-operator — jobs never run inside a DbTx
|
|
435
437
|
const exportRegistry = ctx.registry;
|
|
436
438
|
// JobContext carries ctx.meter (raw), not ctx.metrics — that bound
|
|
@@ -512,7 +514,7 @@ export function createUserDataRightsFeature(opts = {}) {
|
|
|
512
514
|
throw new Error("run-forget-cleanup: ctx.registry required (JobContext incomplete)");
|
|
513
515
|
}
|
|
514
516
|
const T = (await import("@cosmicdrift/kumiko-framework/time")).getTemporal();
|
|
515
|
-
const forgetUserId =
|
|
517
|
+
const forgetUserId = SYSTEM_USER_ID;
|
|
516
518
|
const forgetDb = ctx.db.unsafeRaw(); // @cast-boundary db-operator — jobs never run inside a DbTx
|
|
517
519
|
const forgetRegistry = ctx.registry;
|
|
518
520
|
const tenantModel = await resolveAppTenantModel({
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { TENANT_MODEL_CONFIG_KEY } from "./constants.ts";
|
|
2
|
+
export { deletionTokenSecretEnvSchema } from "./env.ts";
|
|
2
3
|
export { createUserDataRightsFeature, type UserDataRightsOptions } from "./feature.ts";
|
|
3
4
|
export type { SendDeletionVerificationEmailFn } from "./handlers/request-deletion-by-email.write.ts";
|
|
4
5
|
export { denyIfTargetOutsideAdminTenant, TARGET_USER_NOT_IN_ADMIN_TENANT, } from "./lib/deny-if-target-outside-admin-tenant.ts";
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { TENANT_MODEL_CONFIG_KEY } from "./constants.js";
|
|
2
|
+
export { deletionTokenSecretEnvSchema } from "./env.js";
|
|
2
3
|
export { createUserDataRightsFeature } from "./feature.js";
|
|
3
4
|
export { denyIfTargetOutsideAdminTenant, TARGET_USER_NOT_IN_ADMIN_TENANT, } from "./lib/deny-if-target-outside-admin-tenant.js";
|
|
4
5
|
export { isSystemAdminActor } from "./lib/is-admin-actor.js";
|
|
@@ -14,6 +14,6 @@ export function makeTenantMailTransportResolver(ctx) {
|
|
|
14
14
|
}
|
|
15
15
|
const config = createConfigAccessor(ctx.registry, ctx.configResolver, tenantId, // @cast-boundary engine-payload: TenantId brand
|
|
16
16
|
ctx.userId, ctx.db);
|
|
17
|
-
return createTransportForTenant({ config, registry: ctx.registry, secrets: ctx.secrets,
|
|
17
|
+
return createTransportForTenant({ config, registry: ctx.registry, secrets: ctx.secrets, auditUserId: ctx.userId }, tenantId, ctx.handlerName);
|
|
18
18
|
};
|
|
19
19
|
}
|
|
@@ -15,6 +15,6 @@ export function makeTenantStorageProviderResolver(ctx) {
|
|
|
15
15
|
}
|
|
16
16
|
const config = createConfigAccessor(ctx.registry, ctx.configResolver, tenantId, // @cast-boundary engine-payload: TenantId brand
|
|
17
17
|
ctx.userId, ctx.db);
|
|
18
|
-
return createFileProviderForTenant({ config, registry: ctx.registry, secrets: ctx.secrets,
|
|
18
|
+
return createFileProviderForTenant({ config, registry: ctx.registry, secrets: ctx.secrets, auditUserId: ctx.userId }, tenantId, ctx.handlerName);
|
|
19
19
|
};
|
|
20
20
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { QnTypes, qn, templateVariable, } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
2
|
import { hasMailTranslationKey, listMailLocales, mailT, resolveMailLocale, } from "@cosmicdrift/kumiko-framework/i18n";
|
|
3
|
-
import { escapeHtml } from "@cosmicdrift/kumiko-headless";
|
|
3
|
+
import { escapeHtml } from "@cosmicdrift/kumiko-renderer/headless";
|
|
4
4
|
import { mailParagraph } from "../shared/index.js";
|
|
5
5
|
import { USER_DATA_RIGHTS_FEATURE } from "./constants.js";
|
|
6
6
|
const ALL_GDPR_MAIL_KINDS = [
|