@cosmicdrift/kumiko-samples 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/package.json +1 -1
- package/packages/bundled-features/package.json +6 -4
- package/packages/bundled-features/src/account-security/changes.json +6 -0
- package/packages/bundled-features/src/account-security/constants.ts +1 -0
- package/packages/bundled-features/src/account-security/index.ts +1 -0
- package/packages/bundled-features/src/admin-shell/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/audit/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/auth-email-password/mail-notifications.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/web/auth-client.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/web/auth-form-primitives.tsx +1 -1
- package/packages/bundled-features/src/auth-email-password/web/client-plugin.ts +3 -3
- package/packages/bundled-features/src/auth-email-password/web/default-topbar-actions.tsx +1 -1
- package/packages/bundled-features/src/auth-email-password/web/index.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/web/session.tsx +1 -1
- package/packages/bundled-features/src/auth-email-password/web/tenant-menu-items.tsx +1 -1
- package/packages/bundled-features/src/auth-email-password/web/tenant-switcher.tsx +1 -1
- package/packages/bundled-features/src/auth-email-password/web/user-menu.tsx +1 -1
- package/packages/bundled-features/src/auth-foundation/changes.json +6 -0
- package/packages/bundled-features/src/auth-foundation/env.ts +27 -0
- package/packages/bundled-features/src/auth-foundation/index.ts +1 -0
- package/packages/bundled-features/src/billing-foundation/changes.json +6 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/confirmation-mail.ts +1 -1
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-pages.ts +1 -1
- package/packages/bundled-features/src/billing-foundation/contact-card.ts +14 -0
- package/packages/bundled-features/src/billing-foundation/handlers/billing-plans.query.ts +1 -1
- package/packages/bundled-features/src/billing-foundation/index.ts +1 -0
- package/packages/bundled-features/src/billing-foundation/plan-catalog.ts +1 -0
- package/packages/bundled-features/src/billing-foundation/types.ts +12 -0
- package/packages/bundled-features/src/billing-foundation/validate-options.ts +16 -0
- package/packages/bundled-features/src/billing-foundation/web/billing-contact-plan.tsx +32 -0
- package/packages/bundled-features/src/billing-foundation/web/billing-plans-panel.tsx +5 -15
- package/packages/bundled-features/src/billing-foundation/web/cancel-contract-dialog.tsx +2 -2
- package/packages/bundled-features/src/billing-foundation/web/checkout-consent-dialog.tsx +1 -1
- package/packages/bundled-features/src/billing-foundation/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/billing-foundation/web/localized-params.ts +14 -0
- package/packages/bundled-features/src/cap-overview/web/cap-cards-panel.tsx +3 -3
- package/packages/bundled-features/src/cap-overview/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/channel-email/changes.json +6 -0
- package/packages/bundled-features/src/channel-email/email-channel.ts +2 -1
- package/packages/bundled-features/src/compliance-profiles/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/config/feature.ts +2 -2
- package/packages/bundled-features/src/crypto-shredding/changes.json +6 -0
- package/packages/bundled-features/src/custom-fields/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/delivery/unsubscribe-page.ts +1 -1
- package/packages/bundled-features/src/delivery/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/delivery/web/delivery-status-cell.tsx +1 -1
- package/packages/bundled-features/src/feature-toggles/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/file-provider-s3/changes.json +6 -0
- package/packages/bundled-features/src/file-provider-s3/env-named-feature.ts +45 -0
- package/packages/bundled-features/src/file-provider-s3/env-schema.ts +20 -13
- package/packages/bundled-features/src/file-provider-s3/index.ts +4 -0
- package/packages/bundled-features/src/folders/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/folders/web/folder-section.tsx +3 -4
- package/packages/bundled-features/src/host-routing/README.md +7 -0
- package/packages/bundled-features/src/host-routing/changes.json +6 -0
- package/packages/bundled-features/src/host-routing/constants.ts +4 -0
- package/packages/bundled-features/src/host-routing/dispatch.ts +34 -26
- package/packages/bundled-features/src/host-routing/feature.ts +122 -41
- package/packages/bundled-features/src/host-routing/host.ts +28 -1
- package/packages/bundled-features/src/host-routing/index.ts +3 -0
- package/packages/bundled-features/src/host-routing/options.ts +45 -2
- package/packages/bundled-features/src/host-routing/redirects.ts +33 -0
- package/packages/bundled-features/src/host-routing/tenant-lookup.ts +65 -0
- package/packages/bundled-features/src/host-routing/validate-options.ts +48 -1
- package/packages/bundled-features/src/inbound-mail-foundation/changes.json +7 -0
- package/packages/bundled-features/src/inbound-mail-foundation/feature.ts +8 -0
- package/packages/bundled-features/src/inbound-mail-foundation/i18n.ts +42 -0
- package/packages/bundled-features/src/inbound-mail-foundation/index.ts +4 -0
- package/packages/bundled-features/src/inbound-mail-foundation/screens.ts +100 -0
- package/packages/bundled-features/src/inbound-mail-foundation/types.ts +2 -2
- package/packages/bundled-features/src/jobs/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/legal-pages/changes.json +6 -0
- package/packages/bundled-features/src/legal-pages/feature.ts +14 -1
- package/packages/bundled-features/src/legal-pages/layout.ts +6 -6
- package/packages/bundled-features/src/legal-pages/web/client-plugin.ts +1 -1
- package/packages/bundled-features/src/mail-foundation/feature.ts +21 -22
- package/packages/bundled-features/src/managed-pages/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/notes-history/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/page-render/branding.ts +1 -1
- package/packages/bundled-features/src/page-render/layout.ts +2 -2
- package/packages/bundled-features/src/page-render/markdown.ts +1 -1
- package/packages/bundled-features/src/personal-access-tokens/i18n.ts +1 -1
- package/packages/bundled-features/src/personal-access-tokens/screens.ts +1 -1
- package/packages/bundled-features/src/secrets/feature.ts +4 -4
- package/packages/bundled-features/src/seo/sitemap.ts +1 -1
- package/packages/bundled-features/src/shared/mail-template-body.ts +1 -1
- package/packages/bundled-features/src/shared/purge-files-reaching-subject.ts +127 -2
- package/packages/bundled-features/src/tags/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/template-resolver/changes.json +18 -0
- package/packages/bundled-features/src/template-resolver/document-blocks.ts +34 -0
- package/packages/bundled-features/src/template-resolver/document-ops.ts +515 -0
- package/packages/bundled-features/src/template-resolver/document-sanitizer.ts +9 -0
- package/packages/bundled-features/src/template-resolver/feature.ts +4 -0
- package/packages/bundled-features/src/template-resolver/handlers/bundle-import.ts +1 -0
- package/packages/bundled-features/src/template-resolver/handlers/document-base.ts +86 -0
- package/packages/bundled-features/src/template-resolver/handlers/document-blocks.query.ts +48 -0
- package/packages/bundled-features/src/template-resolver/handlers/export-bundle.query.ts +11 -3
- package/packages/bundled-features/src/template-resolver/handlers/patch-draft.write.ts +125 -0
- package/packages/bundled-features/src/template-resolver/handlers/preview.query.ts +2 -1
- package/packages/bundled-features/src/template-resolver/handlers/send-test.write.ts +2 -1
- package/packages/bundled-features/src/template-resolver/handlers/template-write.ts +22 -1
- package/packages/bundled-features/src/template-resolver/handlers/validate.query.ts +24 -9
- package/packages/bundled-features/src/template-resolver/{web/placeholder-text.ts → placeholder-text.ts} +1 -1
- package/packages/bundled-features/src/template-resolver/qualified-names.ts +2 -0
- package/packages/bundled-features/src/template-resolver/seeding.ts +3 -1
- package/packages/bundled-features/src/template-resolver/template-bundle.ts +6 -1
- package/packages/bundled-features/src/template-resolver/template-preview.ts +24 -8
- package/packages/bundled-features/src/template-resolver/template-validation.ts +1 -1
- package/packages/bundled-features/src/template-resolver/web/client-plugin.tsx +3 -3
- package/packages/bundled-features/src/template-resolver/web/document-tiptap-editor.tsx +1 -1
- package/packages/bundled-features/src/template-resolver/web/document-toolbar-blocks.ts +7 -33
- package/packages/bundled-features/src/template-resolver/web/i18n.ts +24 -0
- package/packages/bundled-features/src/template-resolver/web/placeholder-line-editor.tsx +2 -2
- package/packages/bundled-features/src/tenant/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/tenant/web/member-status-cell.tsx +1 -1
- package/packages/bundled-features/src/tier-engine/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/user-data-rights/changes.json +6 -0
- package/packages/bundled-features/src/user-data-rights/env.ts +15 -0
- package/packages/bundled-features/src/user-data-rights/feature.ts +4 -2
- package/packages/bundled-features/src/user-data-rights/index.ts +1 -0
- package/packages/bundled-features/src/user-data-rights/lib/mail-transport-resolver.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/lib/storage-provider-resolver.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/mail-notifications.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/user-data-rights/web/privacy-center-screen.tsx +2 -2
- package/packages/bundled-features/src/waitlist/changes.json +6 -0
- package/packages/bundled-features/src/waitlist/legacy-migrate.ts +51 -2
- package/samples/apps/admin-console/package.json +0 -3
- package/samples/apps/admin-console/src/app/client.tsx +1 -1
- package/samples/apps/admin-console/src/app/shell.tsx +1 -1
- package/samples/apps/config-demo/package.json +1 -3
- package/samples/apps/config-demo/src/app/client.tsx +1 -1
- package/samples/apps/config-demo/src/app/shell.tsx +2 -2
- package/samples/apps/config-demo/src/features/demo/web/index.ts +1 -1
- package/samples/apps/config-demo/tsconfig.json +0 -12
- package/samples/apps/marketing-demo/package.json +1 -3
- package/samples/apps/marketing-demo/src/app/client.tsx +1 -1
- package/samples/apps/marketing-demo/src/app/shell.tsx +1 -1
- package/samples/apps/marketing-demo/src/features/assets/web/index.ts +1 -1
- package/samples/apps/marketing-demo/src/features/helpdesk/web/index.ts +1 -1
- package/samples/apps/showcase/package.json +1 -3
- package/samples/apps/showcase/src/app/client.tsx +1 -1
- package/samples/apps/showcase/src/app/shell.tsx +1 -1
- package/samples/apps/showcase/src/features/demos/web/index.ts +1 -1
- package/samples/apps/showcase/src/features/demos/web/pages/sidebar-panel.tsx +1 -1
- package/samples/apps/showcase/src/features/demos/web/pages/toast.tsx +1 -1
- package/samples/apps/showcase/src/features/items/web/index.ts +1 -1
- package/samples/apps/styleguide/package.json +1 -3
- package/samples/apps/styleguide/src/app/client.tsx +1 -1
- package/samples/apps/styleguide/src/app/shell.tsx +2 -2
- package/samples/apps/styleguide/src/features/ai-settings/web.ts +1 -1
- package/samples/apps/styleguide/src/features/content/web.tsx +2 -2
- package/samples/apps/styleguide/src/features/demo/web.ts +1 -1
- package/samples/apps/styleguide/src/features/examples/web.ts +1 -1
- package/samples/apps/styleguide/src/features/gallery/web/Gallery.tsx +1 -1
- package/samples/apps/styleguide/src/features/gallery/web/index.ts +1 -1
- package/samples/apps/styleguide/src/features/widgets/demo-locale.ts +1 -1
- package/samples/apps/styleguide/src/features/widgets/lib/format.ts +1 -1
- package/samples/apps/styleguide/src/features/widgets/web/DashboardFilterEcho.tsx +1 -1
- package/samples/apps/styleguide/src/features/widgets/web/FormExamples.tsx +1 -1
- package/samples/apps/styleguide/src/features/widgets/web/Widgets.tsx +1 -1
- package/samples/apps/styleguide/src/features/widgets/web/index.ts +1 -1
- package/samples/apps/styleguide/tsconfig.json +0 -12
- package/samples/apps/ui-walkthrough/package.json +1 -3
- package/samples/apps/ui-walkthrough/src/app/client.tsx +1 -1
- package/samples/apps/ui-walkthrough/src/app/shell.tsx +1 -1
- package/samples/apps/ui-walkthrough/src/features/billing/web/index.ts +1 -1
- package/samples/apps/ui-walkthrough/src/features/rental/web/index.ts +1 -1
- package/samples/apps/ui-walkthrough/src/features/tasks/web/index.ts +1 -1
- package/samples/apps/ui-walkthrough/src/features/vehicles/web/index.ts +1 -1
- package/samples/apps/use-all-bundled/bin/main.ts +3 -2
- package/samples/apps/use-all-bundled/e2e-billing-gallery/gallery-features.ts +12 -0
- package/samples/apps/use-all-bundled/e2e-billing-gallery/server.ts +1 -1
- package/samples/apps/use-all-bundled/feature-manifest.json +1 -0
- package/samples/apps/use-all-bundled/package.json +1 -3
- package/samples/apps/use-all-bundled/src/app/client.tsx +1 -1
- package/samples/apps/use-all-bundled/src/app/dev-app-options.ts +5 -4
- package/samples/apps/use-all-bundled/src/app/shell.tsx +1 -1
- package/samples/apps/use-all-bundled/src/run-config.ts +10 -1
- package/samples/apps/workspaces/package.json +1 -3
- package/samples/apps/workspaces/src/app/client.tsx +1 -1
- package/samples/apps/workspaces/src/app/shell.tsx +1 -1
- package/samples/apps/workspaces/src/features/demo/web/index.ts +1 -1
- package/samples/apps/workspaces/src/features/demo-driver/web/index.ts +1 -1
- package/samples/recipes/apex-landing/package.json +1 -1
- package/samples/recipes/apex-landing/src/feature.ts +1 -1
- package/samples/recipes/apex-surface-auth/README.md +1 -1
- package/samples/recipes/apex-surface-auth/src/feature.ts +2 -2
- package/samples/recipes/compose-stacks/README.md +7 -4
- package/samples/recipes/embedded-entity-form/package.json +0 -1
- package/samples/recipes/embedded-entity-form/src/web/accept-suggestion-drawer.tsx +1 -1
- package/samples/recipes/notes-history-basic/README.md +1 -1
- package/samples/recipes/record-detail-layout/package.json +0 -1
- package/samples/recipes/tags-basic/README.md +1 -1
- package/samples/recipes/user-profile/README.md +1 -1
- package/samples/recipes/wizard-form/package.json +0 -1
- package/samples/recipes/wizard-form/src/web/index.ts +2 -2
- package/samples/recipes/wizard-form/src/web/listing-review-section.tsx +2 -2
- package/samples/recipes/writeform-section/package.json +0 -1
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
type TranslationsByLocale,
|
|
9
9
|
translationsByLocaleFromKeys,
|
|
10
10
|
} from "@cosmicdrift/kumiko-renderer";
|
|
11
|
-
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
11
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
12
12
|
import { TIER_ENGINE_FEATURE } from "../constants.ts";
|
|
13
13
|
import { TIER_ENGINE_I18N } from "../i18n.ts";
|
|
14
14
|
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "0.376.0",
|
|
4
|
+
"type": "improvement",
|
|
5
|
+
"title": "DELETION_TOKEN_SECRET is part of the env schema",
|
|
6
|
+
"detail": "The feature declares DELETION_TOKEN_SECRET through its env schema, so the dry run and the pulumi inventory list it. Unset, it is derived from JWT_SECRET as before."
|
|
7
|
+
},
|
|
2
8
|
{
|
|
3
9
|
"version": "0.372.0",
|
|
4
10
|
"type": "fix",
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
|
|
3
|
+
const MIN_DELETION_TOKEN_SECRET_LENGTH = 32;
|
|
4
|
+
|
|
5
|
+
/** Optional dedicated HMAC key of the anonymous deletion-confirmation links. */
|
|
6
|
+
export const deletionTokenSecretEnvSchema = z.object({
|
|
7
|
+
DELETION_TOKEN_SECRET: z
|
|
8
|
+
.string()
|
|
9
|
+
.min(MIN_DELETION_TOKEN_SECRET_LENGTH)
|
|
10
|
+
.optional()
|
|
11
|
+
.describe(
|
|
12
|
+
"Dedicated HMAC secret for the anonymous deletion-confirmation links. Unset: derived from JWT_SECRET.",
|
|
13
|
+
)
|
|
14
|
+
.meta({ kumiko: { pulumi: { generator: "openssl rand -hex 24", secret: true } } }),
|
|
15
|
+
});
|
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
USER_ME_QUERY,
|
|
26
26
|
UserDataRightsHandlers,
|
|
27
27
|
} from "./constants.ts";
|
|
28
|
+
import { deletionTokenSecretEnvSchema } from "./env.ts";
|
|
28
29
|
import { cancelDeletionWrite } from "./handlers/cancel-deletion.write.ts";
|
|
29
30
|
import { createConfirmDeletionByTokenHandler } from "./handlers/confirm-deletion-by-token.write.ts";
|
|
30
31
|
import { downloadAttemptListQuery } from "./handlers/download-attempt-list.query.ts";
|
|
@@ -198,6 +199,7 @@ export function createUserDataRightsFeature(opts: UserDataRightsOptions = {}): F
|
|
|
198
199
|
recommended: false,
|
|
199
200
|
});
|
|
200
201
|
r.requires({ features: ["user", "data-retention", "compliance-profiles", "sessions"] });
|
|
202
|
+
r.envSchema(deletionTokenSecretEnvSchema);
|
|
201
203
|
r.usesApi("compliance.forTenant");
|
|
202
204
|
r.usesApi("retention.policyFor");
|
|
203
205
|
// S2.U6 — restrict-account ruft sessions.revokeAllForUser cross-feature.
|
|
@@ -615,7 +617,7 @@ export function createUserDataRightsFeature(opts: UserDataRightsOptions = {}): F
|
|
|
615
617
|
// SYSTEM_USER_ID ist die framework-weite Konvention. Der job-
|
|
616
618
|
// Discriminator wird via handlerName="user-data-rights:run-export-
|
|
617
619
|
// jobs" im Secret-Read-Audit erfasst.
|
|
618
|
-
const exportUserId =
|
|
620
|
+
const exportUserId = SYSTEM_USER_ID;
|
|
619
621
|
const exportDb =
|
|
620
622
|
ctx.db.unsafeRaw() as import("@cosmicdrift/kumiko-framework/db").DbConnection; // @cast-boundary db-operator — jobs never run inside a DbTx
|
|
621
623
|
const exportRegistry = ctx.registry;
|
|
@@ -708,7 +710,7 @@ export function createUserDataRightsFeature(opts: UserDataRightsOptions = {}): F
|
|
|
708
710
|
throw new Error("run-forget-cleanup: ctx.registry required (JobContext incomplete)");
|
|
709
711
|
}
|
|
710
712
|
const T = (await import("@cosmicdrift/kumiko-framework/time")).getTemporal();
|
|
711
|
-
const forgetUserId =
|
|
713
|
+
const forgetUserId = SYSTEM_USER_ID;
|
|
712
714
|
const forgetDb =
|
|
713
715
|
ctx.db.unsafeRaw() as import("@cosmicdrift/kumiko-framework/db").DbConnection; // @cast-boundary db-operator — jobs never run inside a DbTx
|
|
714
716
|
const forgetRegistry = ctx.registry;
|
|
@@ -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 {
|
|
@@ -42,7 +42,7 @@ export function makeTenantMailTransportResolver(
|
|
|
42
42
|
ctx.db,
|
|
43
43
|
);
|
|
44
44
|
return createTransportForTenant(
|
|
45
|
-
{ config, registry: ctx.registry, secrets: ctx.secrets,
|
|
45
|
+
{ config, registry: ctx.registry, secrets: ctx.secrets, auditUserId: ctx.userId },
|
|
46
46
|
tenantId,
|
|
47
47
|
ctx.handlerName,
|
|
48
48
|
);
|
|
@@ -41,7 +41,7 @@ export function makeTenantStorageProviderResolver(
|
|
|
41
41
|
ctx.db,
|
|
42
42
|
);
|
|
43
43
|
return createFileProviderForTenant(
|
|
44
|
-
{ config, registry: ctx.registry, secrets: ctx.secrets,
|
|
44
|
+
{ config, registry: ctx.registry, secrets: ctx.secrets, auditUserId: ctx.userId },
|
|
45
45
|
tenantId,
|
|
46
46
|
ctx.handlerName,
|
|
47
47
|
);
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
mailT,
|
|
13
13
|
resolveMailLocale,
|
|
14
14
|
} from "@cosmicdrift/kumiko-framework/i18n";
|
|
15
|
-
import { escapeHtml } from "@cosmicdrift/kumiko-headless";
|
|
15
|
+
import { escapeHtml } from "@cosmicdrift/kumiko-renderer/headless";
|
|
16
16
|
import { mailParagraph } from "../shared/index.ts";
|
|
17
17
|
import { USER_DATA_RIGHTS_FEATURE } from "./constants.ts";
|
|
18
18
|
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
// money-horse) must carry the option over at feature setup.
|
|
17
17
|
|
|
18
18
|
import { mergeTranslations, type TranslationsByLocale } from "@cosmicdrift/kumiko-renderer";
|
|
19
|
-
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
19
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
20
20
|
import { EXPORT_SECTION_EXTENSION_NAME, USER_DATA_RIGHTS_FEATURE } from "../constants.ts";
|
|
21
21
|
import { defaultTranslations } from "./i18n.ts";
|
|
22
22
|
import { ExportSection } from "./privacy-center-screen.tsx";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EMPTY_VALUE_PLACEHOLDER } from "@cosmicdrift/kumiko-headless";
|
|
1
|
+
import { EMPTY_VALUE_PLACEHOLDER } from "@cosmicdrift/kumiko-renderer/headless";
|
|
2
2
|
// @runtime client
|
|
3
3
|
// Export section (Art. 20) — the one part of user-data-rights' privacy-center
|
|
4
4
|
// screen that stays custom (fw#2312). Registered as an EditExtensionSection
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
useQuery,
|
|
18
18
|
useTranslation,
|
|
19
19
|
} from "@cosmicdrift/kumiko-renderer";
|
|
20
|
-
import { postWithDownload } from "@cosmicdrift/kumiko-renderer
|
|
20
|
+
import { postWithDownload } from "@cosmicdrift/kumiko-renderer/web";
|
|
21
21
|
import { propertyOf } from "@cosmicdrift/kumiko-types/type-guards";
|
|
22
22
|
import { type ReactNode, useEffect, useState } from "react";
|
|
23
23
|
import {
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "0.377.0",
|
|
4
|
+
"type": "fix",
|
|
5
|
+
"title": "migrateLegacyWaitlist no longer replays legacy events on rebuild",
|
|
6
|
+
"detail": "The legacy event stream of each migrated row is archived, so a projection rebuild does not resurrect the old id next to the imported entry. The report gains archivedStreams."
|
|
7
|
+
},
|
|
2
8
|
{
|
|
3
9
|
"version": "0.370.0",
|
|
4
10
|
"type": "breaking",
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
PII_ERASED_SENTINEL,
|
|
6
6
|
} from "@cosmicdrift/kumiko-framework/crypto";
|
|
7
7
|
import {
|
|
8
|
+
countWhere,
|
|
8
9
|
createTenantDb,
|
|
9
10
|
selectMany,
|
|
10
11
|
table,
|
|
@@ -14,10 +15,16 @@ import {
|
|
|
14
15
|
uuid,
|
|
15
16
|
} from "@cosmicdrift/kumiko-framework/db";
|
|
16
17
|
import { SYSTEM_TENANT_ID } from "@cosmicdrift/kumiko-framework/engine";
|
|
18
|
+
import {
|
|
19
|
+
archiveStream,
|
|
20
|
+
createArchivedStreamsTable,
|
|
21
|
+
eventsTable,
|
|
22
|
+
isStreamArchived,
|
|
23
|
+
} from "@cosmicdrift/kumiko-framework/event-store";
|
|
17
24
|
import type { DbConnection } from "@cosmicdrift/kumiko-types/db-connection";
|
|
18
25
|
import { Temporal } from "@cosmicdrift/kumiko-types/temporal";
|
|
19
26
|
import { WAITLIST_STATUS, type WaitlistStatus } from "./constants.ts";
|
|
20
|
-
import { importWaitlistEntry, type WaitlistImportEntry } from "./import.ts";
|
|
27
|
+
import { importWaitlistEntry, type WaitlistImportEntry, waitlistImportId } from "./import.ts";
|
|
21
28
|
|
|
22
29
|
export const LEGACY_WAITLIST_SOURCES = ["offlot", "publicstatus"] as const;
|
|
23
30
|
export type LegacyWaitlistSource = (typeof LEGACY_WAITLIST_SOURCES)[number];
|
|
@@ -46,8 +53,13 @@ export type LegacyWaitlistMigrateReport = {
|
|
|
46
53
|
readonly created: number;
|
|
47
54
|
readonly skipped: number;
|
|
48
55
|
readonly unreadable: number;
|
|
56
|
+
/** Event streams of the legacy rows (same aggregate type) taken out of projection replay. */
|
|
57
|
+
readonly archivedStreams: number;
|
|
49
58
|
};
|
|
50
59
|
|
|
60
|
+
const LEGACY_AGGREGATE_TYPE = "waitlistEntry";
|
|
61
|
+
const LEGACY_STREAM_ARCHIVE_REASON = "migrated to a new waitlist entry id by waitlist-migrate";
|
|
62
|
+
|
|
51
63
|
type LegacyRow = Readonly<Record<string, unknown>>;
|
|
52
64
|
|
|
53
65
|
function toInstant(value: unknown): Temporal.Instant | undefined {
|
|
@@ -189,6 +201,34 @@ async function readLegacyRows(
|
|
|
189
201
|
});
|
|
190
202
|
}
|
|
191
203
|
|
|
204
|
+
// A legacy offlot row is the projection of an event stream of the same aggregate type under the
|
|
205
|
+
// old row id, written in the system tenant like every waitlist entry. The imported entry gets a
|
|
206
|
+
// new id, so a rebuild would replay the old stream next to it and bring every migrated entry back
|
|
207
|
+
// twice; archived streams are excluded from replay. The offlot default source table is the entity
|
|
208
|
+
// table itself, so its row ids are live entries by design and no id check can tell a wrong table.
|
|
209
|
+
async function archiveLegacyStream(
|
|
210
|
+
db: DbConnection,
|
|
211
|
+
legacyId: string,
|
|
212
|
+
importedId: string,
|
|
213
|
+
): Promise<number> {
|
|
214
|
+
if (legacyId === importedId) return 0;
|
|
215
|
+
if (await isStreamArchived(db, SYSTEM_TENANT_ID, legacyId)) return 0;
|
|
216
|
+
const legacyEvents = await countWhere(db, eventsTable, {
|
|
217
|
+
tenantId: SYSTEM_TENANT_ID,
|
|
218
|
+
aggregateId: legacyId,
|
|
219
|
+
aggregateType: LEGACY_AGGREGATE_TYPE,
|
|
220
|
+
});
|
|
221
|
+
if (legacyEvents === 0) return 0;
|
|
222
|
+
await archiveStream(db, {
|
|
223
|
+
tenantId: SYSTEM_TENANT_ID,
|
|
224
|
+
aggregateId: legacyId,
|
|
225
|
+
aggregateType: LEGACY_AGGREGATE_TYPE,
|
|
226
|
+
archivedBy: "waitlist-migrate",
|
|
227
|
+
reason: LEGACY_STREAM_ARCHIVE_REASON,
|
|
228
|
+
});
|
|
229
|
+
return 1;
|
|
230
|
+
}
|
|
231
|
+
|
|
192
232
|
// Idempotent: the new entry id derives from the source row id, so a re-run finds
|
|
193
233
|
// what an earlier run wrote and skips it. Writes go through the waitlist entity
|
|
194
234
|
// executor (events, projection, subject encryption), never into tables directly.
|
|
@@ -200,6 +240,8 @@ export async function migrateLegacyWaitlist(
|
|
|
200
240
|
let created = 0;
|
|
201
241
|
let skipped = 0;
|
|
202
242
|
let unreadable = 0;
|
|
243
|
+
let archivedStreams = 0;
|
|
244
|
+
if (!options.dryRun && options.from === "offlot") await createArchivedStreamsTable(db);
|
|
203
245
|
for (const row of rows) {
|
|
204
246
|
const entry =
|
|
205
247
|
options.from === "offlot"
|
|
@@ -215,6 +257,13 @@ export async function migrateLegacyWaitlist(
|
|
|
215
257
|
if (outcome === "created") created += 1;
|
|
216
258
|
else skipped += 1;
|
|
217
259
|
});
|
|
260
|
+
if (!options.dryRun && options.from === "offlot") {
|
|
261
|
+
archivedStreams += await archiveLegacyStream(
|
|
262
|
+
db,
|
|
263
|
+
String(row["id"]),
|
|
264
|
+
waitlistImportId(entry.sourceKey),
|
|
265
|
+
);
|
|
266
|
+
}
|
|
218
267
|
}
|
|
219
|
-
return { read: rows.length, created, skipped, unreadable };
|
|
268
|
+
return { read: rows.length, created, skipped, unreadable, archivedStreams };
|
|
220
269
|
}
|
|
@@ -9,11 +9,8 @@
|
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"@cosmicdrift/kumiko-bundled-features": "workspace:*",
|
|
11
11
|
"@cosmicdrift/kumiko-dev-server": "workspace:*",
|
|
12
|
-
"@cosmicdrift/kumiko-dispatcher-live": "workspace:*",
|
|
13
12
|
"@cosmicdrift/kumiko-framework": "workspace:*",
|
|
14
|
-
"@cosmicdrift/kumiko-headless": "workspace:*",
|
|
15
13
|
"@cosmicdrift/kumiko-renderer": "workspace:*",
|
|
16
|
-
"@cosmicdrift/kumiko-renderer-web": "workspace:*",
|
|
17
14
|
"lucide-react": "^1.14.0",
|
|
18
15
|
"react": "^19.2.6",
|
|
19
16
|
"react-dom": "^19.2.6",
|
|
@@ -5,7 +5,7 @@ import { jobsClient } from "@cosmicdrift/kumiko-bundled-features/jobs/web";
|
|
|
5
5
|
import { tenantClient } from "@cosmicdrift/kumiko-bundled-features/tenant/web";
|
|
6
6
|
import { tierEngineClient } from "@cosmicdrift/kumiko-bundled-features/tier-engine/web";
|
|
7
7
|
import { localeDeClient } from "@cosmicdrift/kumiko-locale-de/web";
|
|
8
|
-
import { createKumikoApp } from "@cosmicdrift/kumiko-renderer
|
|
8
|
+
import { createKumikoApp } from "@cosmicdrift/kumiko-renderer/web";
|
|
9
9
|
import { HomeScreen } from "./home-screen";
|
|
10
10
|
import { AppShell } from "./shell";
|
|
11
11
|
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
DefaultTopbarActions,
|
|
3
3
|
useShellUser,
|
|
4
4
|
} from "@cosmicdrift/kumiko-bundled-features/auth-email-password/web";
|
|
5
|
-
import { type AppSchema, WorkspaceShell } from "@cosmicdrift/kumiko-renderer
|
|
5
|
+
import { type AppSchema, WorkspaceShell } from "@cosmicdrift/kumiko-renderer/web";
|
|
6
6
|
import { MoonStar, Sun } from "lucide-react";
|
|
7
7
|
import type { ReactNode } from "react";
|
|
8
8
|
|
|
@@ -11,10 +11,8 @@
|
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@cosmicdrift/kumiko-bundled-features": "workspace:*",
|
|
13
13
|
"@cosmicdrift/kumiko-dev-server": "workspace:*",
|
|
14
|
-
"@cosmicdrift/kumiko-
|
|
14
|
+
"@cosmicdrift/kumiko-renderer": "workspace:*",
|
|
15
15
|
"@cosmicdrift/kumiko-framework": "workspace:*",
|
|
16
|
-
"@cosmicdrift/kumiko-headless": "workspace:*",
|
|
17
|
-
"@cosmicdrift/kumiko-renderer-web": "workspace:*",
|
|
18
16
|
"react": "^19.2.6",
|
|
19
17
|
"react-dom": "^19.2.6",
|
|
20
18
|
"@cosmicdrift/kumiko-locale-de": "workspace:*"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { configClient } from "@cosmicdrift/kumiko-bundled-features/config/web";
|
|
2
2
|
import { localeDeClient } from "@cosmicdrift/kumiko-locale-de/web";
|
|
3
|
-
import { createKumikoApp } from "@cosmicdrift/kumiko-renderer
|
|
3
|
+
import { createKumikoApp } from "@cosmicdrift/kumiko-renderer/web";
|
|
4
4
|
import { configDemoClient } from "../features/demo/web";
|
|
5
5
|
import { AppShell } from "./shell";
|
|
6
6
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { AppSchema } from "@cosmicdrift/kumiko-renderer
|
|
2
|
-
import { DefaultAppShell } from "@cosmicdrift/kumiko-renderer
|
|
1
|
+
import type { AppSchema } from "@cosmicdrift/kumiko-renderer/web";
|
|
2
|
+
import { DefaultAppShell } from "@cosmicdrift/kumiko-renderer/web";
|
|
3
3
|
import type { ReactNode } from "react";
|
|
4
4
|
|
|
5
5
|
// Logo-Kachel + Wortmarke — wie SidebarBrand (sidebar-brand.tsx). Die
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
1
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
2
2
|
import { configDemoTranslations } from "../i18n";
|
|
3
3
|
|
|
4
4
|
export const configDemoClient: ClientFeatureDefinition = {
|
|
@@ -14,18 +14,6 @@
|
|
|
14
14
|
"@cosmicdrift/kumiko-dev-server/*": [
|
|
15
15
|
"../../../packages/dev-server/src/*"
|
|
16
16
|
],
|
|
17
|
-
"@cosmicdrift/kumiko-renderer-web": [
|
|
18
|
-
"../../../packages/renderer-web/src/index.ts"
|
|
19
|
-
],
|
|
20
|
-
"@cosmicdrift/kumiko-renderer-web/*": [
|
|
21
|
-
"../../../packages/renderer-web/src/*"
|
|
22
|
-
],
|
|
23
|
-
"@cosmicdrift/kumiko-dispatcher-live": [
|
|
24
|
-
"../../../packages/dispatcher-live/src/index.ts"
|
|
25
|
-
],
|
|
26
|
-
"@cosmicdrift/kumiko-headless": [
|
|
27
|
-
"../../../packages/headless/src/index.ts"
|
|
28
|
-
],
|
|
29
17
|
"@cosmicdrift/kumiko-renderer": [
|
|
30
18
|
"../../../packages/renderer/src/index.ts"
|
|
31
19
|
],
|
|
@@ -11,10 +11,8 @@
|
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@cosmicdrift/kumiko-bundled-features": "workspace:*",
|
|
13
13
|
"@cosmicdrift/kumiko-dev-server": "workspace:*",
|
|
14
|
-
"@cosmicdrift/kumiko-
|
|
14
|
+
"@cosmicdrift/kumiko-renderer": "workspace:*",
|
|
15
15
|
"@cosmicdrift/kumiko-framework": "workspace:*",
|
|
16
|
-
"@cosmicdrift/kumiko-headless": "workspace:*",
|
|
17
|
-
"@cosmicdrift/kumiko-renderer-web": "workspace:*",
|
|
18
16
|
"@cosmicdrift/kumiko-types": "workspace:*",
|
|
19
17
|
"react": "^19.2.6",
|
|
20
18
|
"react-dom": "^19.2.6",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// shared shell, alles aus dem Framework-Default.
|
|
3
3
|
|
|
4
4
|
import { localeDeClient } from "@cosmicdrift/kumiko-locale-de/web";
|
|
5
|
-
import { createKumikoApp } from "@cosmicdrift/kumiko-renderer
|
|
5
|
+
import { createKumikoApp } from "@cosmicdrift/kumiko-renderer/web";
|
|
6
6
|
import { assetsClient } from "../features/assets/web";
|
|
7
7
|
import { helpdeskClient } from "../features/helpdesk/web";
|
|
8
8
|
import { AppShell } from "./shell";
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// „Kumiko Demo", Light-Mode-default (kein Theme-Toggle für screenshots
|
|
3
3
|
// damit immer der gleiche Look).
|
|
4
4
|
|
|
5
|
-
import { type AppSchema, DefaultAppShell } from "@cosmicdrift/kumiko-renderer
|
|
5
|
+
import { type AppSchema, DefaultAppShell } from "@cosmicdrift/kumiko-renderer/web";
|
|
6
6
|
import type { ReactNode } from "react";
|
|
7
7
|
|
|
8
8
|
// Logo-Kachel + Wortmarke — wie SidebarBrand (sidebar-brand.tsx). Die
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Assets — ClientFeatureDefinition. Pure Schema-driven, keine Custom-
|
|
2
2
|
// Components. Render läuft über Standard-RenderList + RenderEdit.
|
|
3
3
|
|
|
4
|
-
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
4
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
5
5
|
import { assetsTranslations } from "../i18n";
|
|
6
6
|
|
|
7
7
|
export const assetsClient: ClientFeatureDefinition = {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
1
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
2
2
|
import { helpdeskTranslations } from "../i18n";
|
|
3
3
|
|
|
4
4
|
export const helpdeskClient: ClientFeatureDefinition = {
|
|
@@ -11,10 +11,8 @@
|
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@cosmicdrift/kumiko-bundled-features": "workspace:*",
|
|
13
13
|
"@cosmicdrift/kumiko-dev-server": "workspace:*",
|
|
14
|
-
"@cosmicdrift/kumiko-
|
|
14
|
+
"@cosmicdrift/kumiko-renderer": "workspace:*",
|
|
15
15
|
"@cosmicdrift/kumiko-framework": "workspace:*",
|
|
16
|
-
"@cosmicdrift/kumiko-headless": "workspace:*",
|
|
17
|
-
"@cosmicdrift/kumiko-renderer-web": "workspace:*",
|
|
18
16
|
"lucide-react": "^1.14.0",
|
|
19
17
|
"react": "^19.2.6",
|
|
20
18
|
"react-dom": "^19.2.6",
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// via clientFeatures.components.
|
|
5
5
|
|
|
6
6
|
import { localeDeClient } from "@cosmicdrift/kumiko-locale-de/web";
|
|
7
|
-
import { createKumikoApp } from "@cosmicdrift/kumiko-renderer
|
|
7
|
+
import { createKumikoApp } from "@cosmicdrift/kumiko-renderer/web";
|
|
8
8
|
import { demosClient } from "../features/demos/web";
|
|
9
9
|
import { itemsClient } from "../features/items/web";
|
|
10
10
|
import { AppShell } from "./shell";
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// merged das in den CustomScreens-Context, KumikoScreen schaut darin
|
|
4
4
|
// nach wenn ein Schema-Screen `type: "custom"` hat.
|
|
5
5
|
|
|
6
|
-
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
6
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
7
7
|
import { demosTranslations } from "../i18n";
|
|
8
8
|
import { BannerDemo } from "./pages/banner";
|
|
9
9
|
import { ButtonsDemo } from "./pages/buttons";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { usePrimitives } from "@cosmicdrift/kumiko-renderer";
|
|
2
|
-
import { SidebarPanel } from "@cosmicdrift/kumiko-renderer
|
|
2
|
+
import { SidebarPanel } from "@cosmicdrift/kumiko-renderer/web";
|
|
3
3
|
import { type ReactNode, useState } from "react";
|
|
4
4
|
import { DemoPage, DemoSection } from "../components/page";
|
|
5
5
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { usePrimitives } from "@cosmicdrift/kumiko-renderer";
|
|
2
|
-
import { useToast } from "@cosmicdrift/kumiko-renderer
|
|
2
|
+
import { useToast } from "@cosmicdrift/kumiko-renderer/web";
|
|
3
3
|
import { type ReactNode, useState } from "react";
|
|
4
4
|
import { DemoPage, DemoSection } from "../components/page";
|
|
5
5
|
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
// Native-Plattform würde parallel dazu in features/items/native/
|
|
7
7
|
// liegen — translations werden geteilt, components/UI nicht.
|
|
8
8
|
|
|
9
|
-
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
9
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
10
10
|
import { itemsTranslations } from "../i18n";
|
|
11
11
|
|
|
12
12
|
export const itemsClient: ClientFeatureDefinition = {
|
|
@@ -3,10 +3,8 @@
|
|
|
3
3
|
"dependencies": {
|
|
4
4
|
"@cosmicdrift/kumiko-bundled-features": "workspace:*",
|
|
5
5
|
"@cosmicdrift/kumiko-dev-server": "workspace:*",
|
|
6
|
-
"@cosmicdrift/kumiko-
|
|
6
|
+
"@cosmicdrift/kumiko-renderer": "workspace:*",
|
|
7
7
|
"@cosmicdrift/kumiko-framework": "workspace:*",
|
|
8
|
-
"@cosmicdrift/kumiko-headless": "workspace:*",
|
|
9
|
-
"@cosmicdrift/kumiko-renderer-web": "workspace:*",
|
|
10
8
|
"react": "^19.2.6",
|
|
11
9
|
"react-dom": "^19.2.6",
|
|
12
10
|
"@cosmicdrift/kumiko-locale-de": "workspace:*"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { configClient } from "@cosmicdrift/kumiko-bundled-features/config/web";
|
|
2
2
|
import { localeDeClient } from "@cosmicdrift/kumiko-locale-de/web";
|
|
3
|
-
import { createKumikoApp } from "@cosmicdrift/kumiko-renderer
|
|
3
|
+
import { createKumikoApp } from "@cosmicdrift/kumiko-renderer/web";
|
|
4
4
|
import { aiSettingsClient } from "../features/ai-settings/web";
|
|
5
5
|
import { contentClient } from "../features/content/web";
|
|
6
6
|
import { styleguideClient } from "../features/demo/web";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useNav } from "@cosmicdrift/kumiko-renderer";
|
|
2
|
-
import type { AppSchema } from "@cosmicdrift/kumiko-renderer
|
|
2
|
+
import type { AppSchema } from "@cosmicdrift/kumiko-renderer/web";
|
|
3
3
|
import {
|
|
4
4
|
DefaultAppShell,
|
|
5
5
|
EditorPanel,
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
SidebarBrand,
|
|
8
8
|
SidebarUser,
|
|
9
9
|
useResolvers,
|
|
10
|
-
} from "@cosmicdrift/kumiko-renderer
|
|
10
|
+
} from "@cosmicdrift/kumiko-renderer/web";
|
|
11
11
|
import { GalleryVerticalEnd } from "lucide-react";
|
|
12
12
|
import type { ReactNode } from "react";
|
|
13
13
|
|
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
// sofort im Sidebar-Tree. Der content:edit-Resolver rendert das Anlege-
|
|
7
7
|
// Formular (leeres target) bzw. die Detail-Ansicht (target mit id).
|
|
8
8
|
|
|
9
|
-
import { CSRF_HEADER_NAME, readCsrfToken } from "@cosmicdrift/kumiko-dispatcher-live";
|
|
10
9
|
import type {
|
|
11
10
|
TargetRef,
|
|
12
11
|
TreeChildrenSubscribe,
|
|
13
12
|
TreeNode,
|
|
14
13
|
} from "@cosmicdrift/kumiko-framework/engine";
|
|
15
14
|
import { useDispatcher, usePrimitives, useQuery } from "@cosmicdrift/kumiko-renderer";
|
|
16
|
-
import
|
|
15
|
+
import { CSRF_HEADER_NAME, readCsrfToken } from "@cosmicdrift/kumiko-renderer/live";
|
|
16
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
17
17
|
import { type FormEvent, type ReactNode, useEffect, useState } from "react";
|
|
18
18
|
|
|
19
19
|
type Page = { readonly id: string; readonly slug: string; readonly title: string };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { formatMoney } from "@cosmicdrift/kumiko-renderer
|
|
1
|
+
import { formatMoney } from "@cosmicdrift/kumiko-renderer/web";
|
|
2
2
|
|
|
3
3
|
// `locale` comes from useLocale(), whose default resolver reads it
|
|
4
4
|
// unvalidated from localStorage/navigator.language — a structurally invalid
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// DashboardFilterDefinition in feature.ts).
|
|
5
5
|
|
|
6
6
|
import { type ExtensionSectionProps, useTranslation } from "@cosmicdrift/kumiko-renderer";
|
|
7
|
-
import { SectionCard } from "@cosmicdrift/kumiko-renderer
|
|
7
|
+
import { SectionCard } from "@cosmicdrift/kumiko-renderer/web";
|
|
8
8
|
import type { ReactNode } from "react";
|
|
9
9
|
|
|
10
10
|
export function DashboardFilterEcho({ filterParams }: ExtensionSectionProps): ReactNode {
|
|
@@ -36,7 +36,7 @@ import {
|
|
|
36
36
|
TextField,
|
|
37
37
|
TimeseriesChart,
|
|
38
38
|
useDraft,
|
|
39
|
-
} from "@cosmicdrift/kumiko-renderer
|
|
39
|
+
} from "@cosmicdrift/kumiko-renderer/web";
|
|
40
40
|
import { Wallet } from "lucide-react";
|
|
41
41
|
import { type ReactNode, useEffect, useMemo, useState } from "react";
|
|
42
42
|
import { euro, percent } from "../lib/format";
|
|
@@ -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
|
import { WIDGETS_I18N } from "../i18n";
|
|
4
4
|
import { DashboardFilterEcho } from "./DashboardFilterEcho";
|
|
5
5
|
import { DashboardKpiIcon } from "./DashboardKpiIcon";
|