@cosmicdrift/kumiko-samples 0.364.0 → 0.365.1

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.
Files changed (148) hide show
  1. package/LICENSE +1 -1
  2. package/package.json +1 -1
  3. package/packages/bundled-features/package.json +1 -1
  4. package/packages/bundled-features/src/audit/changes.json +12 -0
  5. package/packages/bundled-features/src/audit/feature.ts +1 -1
  6. package/packages/bundled-features/src/audit/run-escape-hatch-retention.ts +63 -11
  7. package/packages/bundled-features/src/auth-email-password/bootstrap.ts +1 -3
  8. package/packages/bundled-features/src/auth-email-password/changes.json +18 -0
  9. package/packages/bundled-features/src/auth-email-password/feature.ts +4 -7
  10. package/packages/bundled-features/src/auth-email-password/handlers/invite-accept-with-login.write.ts +2 -3
  11. package/packages/bundled-features/src/auth-email-password/handlers/invite-create.write.ts +6 -4
  12. package/packages/bundled-features/src/auth-email-password/handlers/switch-tenant-mfa-gate.write.ts +2 -2
  13. package/packages/bundled-features/src/auth-email-password/magic-link-mail.ts +7 -3
  14. package/packages/bundled-features/src/auth-email-password/mail-i18n.ts +10 -0
  15. package/packages/bundled-features/src/billing-foundation/changes.json +12 -0
  16. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-record.ts +8 -1
  17. package/packages/bundled-features/src/billing-foundation/i18n.ts +6 -0
  18. package/packages/bundled-features/src/billing-foundation/subscription-tier-sync.ts +10 -2
  19. package/packages/bundled-features/src/cap-counter/book-cap-usage.ts +20 -8
  20. package/packages/bundled-features/src/cap-counter/cap-reservation.ts +7 -2
  21. package/packages/bundled-features/src/cap-counter/changes.json +13 -0
  22. package/packages/bundled-features/src/cap-counter/handlers/increment-rolling.write.ts +2 -0
  23. package/packages/bundled-features/src/cap-overview/changes.json +6 -0
  24. package/packages/bundled-features/src/cap-overview/handlers/tenant-caps-list.query.ts +2 -1
  25. package/packages/bundled-features/src/cap-overview/handlers/tenant-options.query.ts +2 -1
  26. package/packages/bundled-features/src/channel-discord/discord-channel.ts +4 -2
  27. package/packages/bundled-features/src/channel-email/changes.json +18 -0
  28. package/packages/bundled-features/src/channel-email/email-channel.ts +30 -20
  29. package/packages/bundled-features/src/channel-email/smtp-transport.ts +7 -1
  30. package/packages/bundled-features/src/channel-slack/slack-channel.ts +4 -2
  31. package/packages/bundled-features/src/channel-teams/teams-channel.ts +4 -2
  32. package/packages/bundled-features/src/crypto-shredding/changes.json +7 -0
  33. package/packages/bundled-features/src/crypto-shredding/handlers/forget-subject.write.ts +7 -1
  34. package/packages/bundled-features/src/custom-fields/db/queries/retention.ts +2 -2
  35. package/packages/bundled-features/src/data-retention/run-retention-cleanup.ts +4 -5
  36. package/packages/bundled-features/src/delivery/attachment-ref.ts +18 -1
  37. package/packages/bundled-features/src/delivery/changes.json +12 -0
  38. package/packages/bundled-features/src/delivery/delivery-service.ts +93 -92
  39. package/packages/bundled-features/src/document-ingest-foundation/changes.json +6 -0
  40. package/packages/bundled-features/src/feature-toggles/changes.json +7 -0
  41. package/packages/bundled-features/src/feature-toggles/toggle-runtime.ts +26 -12
  42. package/packages/bundled-features/src/files-tenant-data/index.ts +3 -1
  43. package/packages/bundled-features/src/form-draft/db/queries/owned-file-refs.ts +12 -3
  44. package/packages/bundled-features/src/form-draft/handlers/discard.write.ts +1 -1
  45. package/packages/bundled-features/src/jobs/changes.json +12 -0
  46. package/packages/bundled-features/src/jobs/job-run-logger.ts +5 -2
  47. package/packages/bundled-features/src/metrics/changes.json +6 -0
  48. package/packages/bundled-features/src/metrics/filters.ts +28 -12
  49. package/packages/bundled-features/src/personal-access-tokens/changes.json +6 -0
  50. package/packages/bundled-features/src/personal-access-tokens/revoke-for-user.ts +7 -8
  51. package/packages/bundled-features/src/secrets/changes.json +6 -0
  52. package/packages/bundled-features/src/secrets/handlers/delete.write.ts +3 -1
  53. package/packages/bundled-features/src/secrets/write-gate.ts +8 -2
  54. package/packages/bundled-features/src/shared/index.ts +8 -0
  55. package/packages/bundled-features/src/shared/resource-image-formats.ts +31 -0
  56. package/packages/bundled-features/src/shared/sharp-input-limits.ts +7 -8
  57. package/packages/bundled-features/src/step-dispatcher/changes.json +8 -1
  58. package/packages/bundled-features/src/step-dispatcher/constants.ts +22 -0
  59. package/packages/bundled-features/src/step-dispatcher/deliver-dispatch-request.ts +236 -0
  60. package/packages/bundled-features/src/step-dispatcher/feature.ts +65 -118
  61. package/packages/bundled-features/src/step-dispatcher/webhook-runner.ts +40 -14
  62. package/packages/bundled-features/src/template-resolver/changes.json +81 -0
  63. package/packages/bundled-features/src/template-resolver/compile-document-body.ts +78 -12
  64. package/packages/bundled-features/src/template-resolver/compile-steps-block.ts +68 -0
  65. package/packages/bundled-features/src/template-resolver/constants.ts +11 -1
  66. package/packages/bundled-features/src/template-resolver/document-sanitizer.ts +3 -0
  67. package/packages/bundled-features/src/template-resolver/document-schema.ts +7 -1
  68. package/packages/bundled-features/src/template-resolver/document-steps.ts +114 -0
  69. package/packages/bundled-features/src/template-resolver/feature.ts +12 -0
  70. package/packages/bundled-features/src/template-resolver/handlers/bundle-import.ts +81 -39
  71. package/packages/bundled-features/src/template-resolver/handlers/collection-set.write.ts +4 -3
  72. package/packages/bundled-features/src/template-resolver/handlers/copy-locale.write.ts +111 -61
  73. package/packages/bundled-features/src/template-resolver/handlers/diff-to-system.query.ts +1 -0
  74. package/packages/bundled-features/src/template-resolver/handlers/import-bundle-system.write.ts +25 -15
  75. package/packages/bundled-features/src/template-resolver/handlers/import-bundle.write.ts +12 -1
  76. package/packages/bundled-features/src/template-resolver/handlers/overview.query.ts +12 -2
  77. package/packages/bundled-features/src/template-resolver/handlers/resource-upload.write.ts +48 -9
  78. package/packages/bundled-features/src/template-resolver/handlers/validate.query.ts +4 -1
  79. package/packages/bundled-features/src/template-resolver/index.ts +6 -1
  80. package/packages/bundled-features/src/template-resolver/layout-appearance.ts +25 -9
  81. package/packages/bundled-features/src/template-resolver/mail-constants.ts +4 -0
  82. package/packages/bundled-features/src/template-resolver/resource-image.ts +9 -16
  83. package/packages/bundled-features/src/template-resolver/seeding.ts +2 -0
  84. package/packages/bundled-features/src/template-resolver/store-template-resource.ts +390 -124
  85. package/packages/bundled-features/src/template-resolver/template-bundle.ts +4 -0
  86. package/packages/bundled-features/src/template-resolver/template-draft.ts +1 -1
  87. package/packages/bundled-features/src/template-resolver/template-meta.ts +8 -0
  88. package/packages/bundled-features/src/template-resolver/template-preview.ts +1 -1
  89. package/packages/bundled-features/src/template-resolver/template-resources.ts +2 -43
  90. package/packages/bundled-features/src/template-resolver/template-validation.ts +15 -9
  91. package/packages/bundled-features/src/template-resolver/web/document-editor-extensions.ts +34 -0
  92. package/packages/bundled-features/src/template-resolver/web/document-editor.tsx +3 -2
  93. package/packages/bundled-features/src/template-resolver/web/document-tiptap-editor.tsx +56 -11
  94. package/packages/bundled-features/src/template-resolver/web/document-toolbar-blocks.ts +6 -3
  95. package/packages/bundled-features/src/template-resolver/web/i18n.ts +7 -0
  96. package/packages/bundled-features/src/template-resolver/web/index.ts +1 -0
  97. package/packages/bundled-features/src/template-resolver/web/placeholder-line-editor.tsx +14 -5
  98. package/packages/bundled-features/src/tenant/changes.json +6 -0
  99. package/packages/bundled-features/src/tenant/handlers/update-member-roles.write.ts +3 -8
  100. package/packages/bundled-features/src/tenant/seeding.ts +33 -27
  101. package/packages/bundled-features/src/tenant-handover/move-entity-graph.ts +14 -3
  102. package/packages/bundled-features/src/tenant-lifecycle/changes.json +6 -0
  103. package/packages/bundled-features/src/tenant-lifecycle/run-tenant-destroy.ts +9 -1
  104. package/packages/bundled-features/src/tenant-lifecycle/stages.ts +9 -3
  105. package/packages/bundled-features/src/tier-engine/changes.json +12 -0
  106. package/packages/bundled-features/src/tier-engine/constants.ts +9 -0
  107. package/packages/bundled-features/src/tier-engine/entity.ts +9 -4
  108. package/packages/bundled-features/src/tier-engine/handlers/set-tenant-tier.write.ts +8 -5
  109. package/packages/bundled-features/src/tier-engine/index.ts +2 -0
  110. package/packages/bundled-features/src/user/constants.ts +1 -0
  111. package/packages/bundled-features/src/user/invited-global-roles.ts +2 -4
  112. package/packages/bundled-features/src/user-data-rights/changes.json +6 -0
  113. package/packages/bundled-features/src/user-data-rights/email-templates.ts +0 -1
  114. package/packages/bundled-features/src/user-data-rights/i18n.ts +5 -0
  115. package/packages/bundled-features/src/user-data-rights/lib/update-user-lifecycle.ts +13 -2
  116. package/packages/bundled-features/src/user-data-rights/run-forget-cleanup.ts +7 -1
  117. package/packages/bundled-features/src/waitlist/changes.json +18 -0
  118. package/packages/bundled-features/src/waitlist/feature.ts +1 -1
  119. package/packages/bundled-features/src/waitlist/handlers/invite.write.ts +35 -3
  120. package/packages/bundled-features/src/waitlist/handlers/reject.write.ts +2 -17
  121. package/packages/bundled-features/src/waitlist/handlers/submit.write.ts +33 -9
  122. package/packages/bundled-features/src/waitlist/i18n.ts +9 -0
  123. package/packages/bundled-features/src/waitlist/lib.ts +20 -0
  124. package/packages/bundled-features/src/workflow-runner/feature.ts +1 -1
  125. package/samples/apps/ui-walkthrough/src/run-config.ts +14 -1
  126. package/samples/apps/use-all-bundled/README.md +3 -13
  127. package/samples/apps/use-all-bundled/feature-manifest.json +4 -4
  128. package/samples/apps/use-all-bundled/scripts/check-coverage.ts +34 -118
  129. package/samples/apps/use-all-bundled/src/app/notes-feature.ts +1 -1
  130. package/samples/apps/use-all-bundled/src/run-config.ts +0 -3
  131. package/samples/recipes/auth-mfa/README.md +2 -1
  132. package/samples/recipes/auth-mfa/src/feature.ts +1 -0
  133. package/samples/recipes/custom-handlers/README.md +4 -3
  134. package/samples/recipes/custom-handlers/src/feature.ts +21 -12
  135. package/samples/recipes/dashboard-stats/README.md +38 -0
  136. package/samples/recipes/dashboard-stats/package.json +8 -0
  137. package/samples/recipes/dashboard-stats/src/feature.ts +104 -0
  138. package/samples/recipes/legal-pages/README.md +2 -2
  139. package/samples/recipes/managed-pages/README.md +2 -2
  140. package/samples/recipes/pdf-audit-export/README.md +2 -1
  141. package/samples/recipes/pdf-audit-export/package.json +1 -1
  142. package/samples/recipes/pdf-audit-export/src/feature.ts +68 -48
  143. package/samples/recipes/workflow-engine/src/db/queries/suspended-runs.ts +2 -2
  144. package/samples/apps/use-all-bundled/schema/generate.ts +0 -617
  145. package/samples/apps/use-all-bundled/schema/migrations/meta/0000_snapshot.json +0 -3055
  146. package/samples/apps/use-all-bundled/schema/migrations/meta/_journal.json +0 -13
  147. package/samples/apps/use-all-bundled/schema/schema.generated.ts +0 -94
  148. package/samples/apps/use-all-bundled/schema/schema.ts +0 -9
@@ -10,6 +10,7 @@ import type { ContentFormat, UpsertKind } from "../constants.js";
10
10
  import type { TemplateWriteScope } from "../layout-regions.js";
11
11
  import { imageResourceKeysOf } from "../linked-resources.js";
12
12
  import { type TemplateResourceRow, templateResourcesTable } from "../table.js";
13
+ import { isSystemAdmin } from "../template-draft.js";
13
14
  import { resolveTemplateVariables, systemPlaceholdersFor } from "../template-validation.js";
14
15
  import { contentFormatSchema, kindSchema, localeSchema, templateSlugSchema } from "./shared.js";
15
16
  import { evaluateTemplateWrite } from "./template-gates.js";
@@ -53,7 +54,9 @@ export async function validateTemplateDraft(
53
54
  payload: TemplateDraftInput,
54
55
  ) {
55
56
  const variables = resolveTemplateVariables(ctx.registry, payload.slug, payload.variableSchema);
56
- const { slug, kind, scope, locale } = payload;
57
+ const { slug, kind, locale } = payload;
58
+ // The dry run must not promise what the caller's write handlers would refuse.
59
+ const scope: TemplateWriteScope = isSystemAdmin(user) ? payload.scope : "tenant";
57
60
  const known = [
58
61
  ...(await knownResourceKeys(ctx.db, {
59
62
  tenantId: SYSTEM_TENANT_ID,
@@ -16,6 +16,7 @@ export {
16
16
  CONTENT_FORMATS,
17
17
  type ContentFormat,
18
18
  DEFAULT_MAIL_LAYOUT_SLUG,
19
+ DEFAULT_PDF_LAYOUT_SLUG,
19
20
  DOCUMENT_HTML_KINDS,
20
21
  type DocumentHtmlKind,
21
22
  FALLBACK_LOCALE,
@@ -110,9 +111,11 @@ export {
110
111
  } from "./qualified-names.js";
111
112
  export { mapRecordToVariables } from "./record-mapping.js";
112
113
  export {
114
+ type PreparedTemplateImage,
115
+ prepareTemplateResourceBeforeTransaction,
113
116
  readTemplateResourceMaxBytes,
114
117
  type StoredTemplateResource,
115
- storeTemplateResource,
118
+ storePreparedTemplateResource,
116
119
  } from "./store-template-resource.js";
117
120
  export {
118
121
  type TemplateResourceRow,
@@ -124,9 +127,11 @@ export {
124
127
  isMailTemplateMeta,
125
128
  type LayoutTemplateMeta,
126
129
  MAIL_CATEGORIES,
130
+ MAIL_TONES,
127
131
  type MailCategory,
128
132
  type MailLayoutMeta,
129
133
  type MailTemplateMeta,
134
+ type MailTone,
130
135
  type PdfTemplateMeta,
131
136
  parseTemplateMeta,
132
137
  pdfAttachmentFileNamePatternSchema,
@@ -15,26 +15,42 @@ const FONT_FAMILIES = {
15
15
  serif: "Georgia, 'Times New Roman', serif",
16
16
  } as const;
17
17
 
18
- const BUTTON_COLOR = "#1f5468";
18
+ const DEFAULT_BUTTON_COLOR = "#1f5468";
19
19
  const BUTTON_BASE = "display:inline-block;padding:10px 20px;font-weight:600;text-decoration:none";
20
20
 
21
- const BUTTON_STYLES = {
22
- "filled-rounded": `${BUTTON_BASE};border-radius:6px;background-color:${BUTTON_COLOR};color:#ffffff`,
23
- "filled-square": `${BUTTON_BASE};background-color:${BUTTON_COLOR};color:#ffffff`,
24
- outline: `${BUTTON_BASE};border:2px solid ${BUTTON_COLOR};border-radius:6px;color:${BUTTON_COLOR}`,
25
- } as const;
21
+ type ButtonStyle = NonNullable<MailLayoutMeta["buttonStyle"]>;
22
+
23
+ function buttonStyleCss(style: ButtonStyle, color: string): string {
24
+ switch (style) {
25
+ case "filled-rounded":
26
+ return `${BUTTON_BASE};border-radius:6px;background-color:${color};color:#ffffff`;
27
+ case "filled-square":
28
+ return `${BUTTON_BASE};background-color:${color};color:#ffffff`;
29
+ case "outline":
30
+ return `${BUTTON_BASE};border:2px solid ${color};border-radius:6px;color:${color}`;
31
+ }
32
+ }
26
33
 
27
34
  export function isHexColor(value: string): boolean {
28
35
  return HEX_COLOR_PATTERN.test(value);
29
36
  }
30
37
 
31
- export function mailLayoutAppearance(meta: MailLayoutMeta | unknown): MailLayoutAppearance {
38
+ // The branding accent colors the buttons only where the layout opted into the branding accent line.
39
+ export function mailLayoutAppearance(
40
+ meta: MailLayoutMeta | unknown,
41
+ brandingAccentColor?: string,
42
+ ): MailLayoutAppearance {
32
43
  const parsed = readMailLayoutMeta(meta);
44
+ const accentLine = (parsed.accentLine ?? "none") === "branding";
45
+ const buttonColor =
46
+ accentLine && brandingAccentColor !== undefined && isHexColor(brandingAccentColor)
47
+ ? brandingAccentColor
48
+ : DEFAULT_BUTTON_COLOR;
33
49
  return {
34
50
  width: parsed.width ?? 600,
35
51
  fontFamily: FONT_FAMILIES[parsed.font ?? "sans"],
36
52
  outerBackground: parsed.outerBackground ?? "#f5f5f5",
37
- accentLine: (parsed.accentLine ?? "none") === "branding",
38
- buttonStyle: BUTTON_STYLES[parsed.buttonStyle ?? "filled-rounded"],
53
+ accentLine,
54
+ buttonStyle: buttonStyleCss(parsed.buttonStyle ?? "filled-rounded", buttonColor),
39
55
  };
40
56
  }
@@ -0,0 +1,4 @@
1
+ // @runtime client
2
+ // No imports: web/ re-exports these, and template-meta.ts pulls in zod and the framework engine.
3
+ export const MAIL_TONES = ["accent", "info", "success", "warning", "danger", "neutral"] as const;
4
+ export type MailTone = (typeof MAIL_TONES)[number];
@@ -1,27 +1,20 @@
1
- import { assertNotSvg, SHARP_INPUT_OPTIONS } from "../shared/index.js";
1
+ import {
2
+ assertNotSvg,
3
+ isResourceImageFormat,
4
+ RESOURCE_IMAGE_FORMATS,
5
+ type ResourceImageContentType,
6
+ SHARP_INPUT_OPTIONS,
7
+ } from "../shared/index.js";
2
8
 
3
9
  const MAX_RESOURCE_WIDTH = 1200;
4
10
 
5
- const CONTENT_TYPE_BY_FORMAT = {
6
- png: "image/png",
7
- jpeg: "image/jpeg",
8
- gif: "image/gif",
9
- webp: "image/webp",
10
- } as const;
11
-
12
- type ResourceImageFormat = keyof typeof CONTENT_TYPE_BY_FORMAT;
13
-
14
11
  export type NormalizedResourceImage = {
15
12
  readonly data: Uint8Array;
16
- readonly contentType: (typeof CONTENT_TYPE_BY_FORMAT)[ResourceImageFormat];
13
+ readonly contentType: ResourceImageContentType;
17
14
  readonly width: number;
18
15
  readonly height: number;
19
16
  };
20
17
 
21
- function isResourceImageFormat(format: string | undefined): format is ResourceImageFormat {
22
- return format !== undefined && Object.hasOwn(CONTENT_TYPE_BY_FORMAT, format);
23
- }
24
-
25
18
  // Re-encodes an uploaded image: the stored content type comes from the decoded format, never
26
19
  // from the client, and re-encoding drops metadata and anything appended to the file.
27
20
  // sharp is imported lazily because every app loads template-resolver, few of them need an image decoder.
@@ -40,7 +33,7 @@ export async function normalizeResourceImage(data: Uint8Array): Promise<Normaliz
40
33
  const { data: output, info } = await pipeline.toBuffer({ resolveWithObject: true });
41
34
  return {
42
35
  data: new Uint8Array(output),
43
- contentType: CONTENT_TYPE_BY_FORMAT[format],
36
+ contentType: RESOURCE_IMAGE_FORMATS[format].contentType,
44
37
  width: info.width,
45
38
  height: info.height,
46
39
  };
@@ -155,6 +155,8 @@ export async function seedSystemTemplate(
155
155
  current?.title === rowFields.title &&
156
156
  current?.variableSchema === rowFields.variableSchema &&
157
157
  current?.meta === rowFields.meta &&
158
+ current?.status === rowFields.status &&
159
+ current?.parentTemplateId === rowFields.parentTemplateId &&
158
160
  (linkedResources === undefined || current?.linkedResources === linkedResources)
159
161
  ) {
160
162
  return { id: String(row.id) };