@cosmicdrift/kumiko-framework 0.257.0 → 0.258.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 (138) hide show
  1. package/package.json +3 -3
  2. package/src/__tests__/anonymous-access.integration.test.ts +3 -3
  3. package/src/__tests__/derived-fields.integration.test.ts +1 -1
  4. package/src/__tests__/entity-list-limits.integration.test.ts +1 -1
  5. package/src/__tests__/error-contract.integration.test.ts +1 -1
  6. package/src/__tests__/ownership-where-write-path.integration.test.ts +1 -1
  7. package/src/__tests__/ownership.integration.test.ts +7 -3
  8. package/src/__tests__/schema-cli-rebuild.integration.test.ts +2 -2
  9. package/src/__tests__/transition-guard.integration.test.ts +3 -3
  10. package/src/api/__tests__/api.test.ts +21 -3
  11. package/src/api/__tests__/batch.integration.test.ts +3 -3
  12. package/src/api/__tests__/body-limit.test.ts +7 -1
  13. package/src/api/__tests__/dispatcher-live.integration.test.ts +1 -1
  14. package/src/api/__tests__/http-route-rate-limit.integration.test.ts +7 -1
  15. package/src/api/__tests__/metrics-endpoint.test.ts +7 -1
  16. package/src/api/__tests__/nested-write.integration.test.ts +3 -3
  17. package/src/api/__tests__/server-boot-guards.test.ts +11 -4
  18. package/src/bun-db/__tests__/write-brand.test.ts +4 -1
  19. package/src/db/__tests__/apply-entity-event-tenant.integration.test.ts +1 -1
  20. package/src/db/__tests__/assert-exists-in.integration.test.ts +1 -1
  21. package/src/db/__tests__/assert-no-unreachable-live-rows.integration.test.ts +2 -2
  22. package/src/db/__tests__/collect-table-metas.test.ts +9 -5
  23. package/src/db/__tests__/compound-types.test.ts +1 -1
  24. package/src/db/__tests__/config-seed.integration.test.ts +3 -3
  25. package/src/db/__tests__/eagerload.integration.test.ts +7 -7
  26. package/src/db/__tests__/entity-table-from-registry.test.ts +8 -2
  27. package/src/db/__tests__/entity-table-meta-source.test.ts +7 -3
  28. package/src/db/__tests__/entity-table-types.test.ts +4 -4
  29. package/src/db/__tests__/event-store-executor-list.integration.test.ts +9 -2
  30. package/src/db/__tests__/event-store-executor-reference-search.integration.test.ts +4 -4
  31. package/src/db/__tests__/event-store-executor-reference-sort.integration.test.ts +3 -3
  32. package/src/db/__tests__/event-store-executor-write-verbs.integration.test.ts +4 -4
  33. package/src/db/__tests__/event-store-executor.integration.test.ts +11 -6
  34. package/src/db/__tests__/event-store-system-stream.integration.test.ts +2 -2
  35. package/src/db/__tests__/implicit-projection-equivalence.integration.test.ts +6 -4
  36. package/src/db/__tests__/located-timestamp.test.ts +1 -1
  37. package/src/db/__tests__/money.test.ts +1 -1
  38. package/src/db/__tests__/multi-row-insert.integration.test.ts +3 -3
  39. package/src/db/__tests__/parent-ref-clause.test.ts +213 -0
  40. package/src/db/__tests__/schema-migration.integration.test.ts +30 -14
  41. package/src/db/__tests__/source-shadow-create.integration.test.ts +1 -1
  42. package/src/db/__tests__/table-builder-indexes.test.ts +14 -12
  43. package/src/db/__tests__/table-builder-required.test.ts +2 -2
  44. package/src/db/__tests__/tenant-db-where-merge.integration.test.ts +1 -1
  45. package/src/db/__tests__/tenant-db-where-merge.test.ts +5 -2
  46. package/src/db/__tests__/tenant-db.integration.test.ts +2 -2
  47. package/src/db/__tests__/unique-violation-mapping.integration.test.ts +2 -2
  48. package/src/db/event-store-executor-read.ts +97 -19
  49. package/src/db/parent-ref-clause.ts +182 -0
  50. package/src/db/table-builder.ts +7 -0
  51. package/src/engine/__tests__/boot-validator-action-wiring.test.ts +50 -8
  52. package/src/engine/__tests__/boot-validator-detail-for.test.ts +28 -4
  53. package/src/engine/__tests__/boot-validator-entity-list.test.ts +20 -4
  54. package/src/engine/__tests__/boot-validator-i18n-keys.test.ts +9 -3
  55. package/src/engine/__tests__/boot-validator.test.ts +716 -91
  56. package/src/engine/__tests__/define-feature-entity-mapping.test.ts +2 -2
  57. package/src/engine/__tests__/engine.test.ts +128 -37
  58. package/src/engine/__tests__/entity-handlers.test.ts +3 -3
  59. package/src/engine/__tests__/entity-presave-wiring.integration.test.ts +4 -4
  60. package/src/engine/__tests__/entity-restore-tenant-isolation.integration.test.ts +1 -1
  61. package/src/engine/__tests__/entity-write-crosstenant.integration.test.ts +1 -1
  62. package/src/engine/__tests__/extend-entity-projection.test.ts +1 -1
  63. package/src/engine/__tests__/extends-registrar.test.ts +13 -3
  64. package/src/engine/__tests__/factories-long-text.test.ts +10 -6
  65. package/src/engine/__tests__/feature-crud-shorthand.test.ts +1 -1
  66. package/src/engine/__tests__/feature-crud-verb-access.integration.test.ts +1 -1
  67. package/src/engine/__tests__/multiselect-filter.integration.test.ts +1 -1
  68. package/src/engine/__tests__/nav.test.ts +1 -1
  69. package/src/engine/__tests__/pipeline-handler.integration.test.ts +1 -1
  70. package/src/engine/__tests__/pipeline-observability.integration.test.ts +1 -1
  71. package/src/engine/__tests__/pipeline-performance.integration.test.ts +1 -1
  72. package/src/engine/__tests__/projection-detail-actions.test.ts +6 -1
  73. package/src/engine/__tests__/projection-detail-singleton.test.ts +6 -1
  74. package/src/engine/__tests__/projection-detail-tabs.test.ts +6 -1
  75. package/src/engine/__tests__/projection-list-filter.integration.test.ts +7 -2
  76. package/src/engine/__tests__/projection.test.ts +1 -1
  77. package/src/engine/__tests__/registry.test.ts +13 -3
  78. package/src/engine/__tests__/schema-builder.test.ts +39 -11
  79. package/src/engine/__tests__/screen.test.ts +21 -15
  80. package/src/engine/__tests__/search-payload-extension.test.ts +15 -3
  81. package/src/engine/__tests__/store-table.test.ts +6 -3
  82. package/src/engine/__tests__/validate-projection-allowlist.test.ts +12 -4
  83. package/src/engine/__tests__/validation-hooks.test.ts +7 -1
  84. package/src/engine/boot-validator/__tests__/ownership.test.ts +2 -2
  85. package/src/engine/boot-validator/__tests__/parent-ref.test.ts +149 -0
  86. package/src/engine/boot-validator/action-wiring.ts +7 -7
  87. package/src/engine/boot-validator/index.ts +2 -0
  88. package/src/engine/boot-validator/parent-ref.ts +96 -0
  89. package/src/engine/boot-validator/projection-list-screens.ts +36 -23
  90. package/src/engine/boot-validator/query-output-columns.ts +2 -1
  91. package/src/engine/boot-validator/query-refs.ts +2 -1
  92. package/src/engine/boot-validator/screens.ts +322 -131
  93. package/src/engine/build-config-feature-schema.ts +2 -2
  94. package/src/engine/define-handler.ts +6 -0
  95. package/src/engine/entity-handlers.ts +6 -1
  96. package/src/engine/factories.ts +2 -0
  97. package/src/engine/feature-entity-handlers.ts +5 -0
  98. package/src/engine/index.ts +6 -0
  99. package/src/engine/ownership.ts +15 -0
  100. package/src/engine/pattern-library/mixed-schemas.ts +1 -0
  101. package/src/engine/screen-helpers.ts +25 -0
  102. package/src/engine/types/index.ts +5 -0
  103. package/src/es-ops/__tests__/runner.integration.test.ts +1 -1
  104. package/src/event-store/__tests__/upcaster.integration.test.ts +1 -1
  105. package/src/files/__tests__/file-field-pipeline.integration.test.ts +1 -1
  106. package/src/files/__tests__/files.integration.test.ts +1 -1
  107. package/src/files/file-ref-entity.ts +9 -9
  108. package/src/i18n/__tests__/i18n.test.ts +7 -1
  109. package/src/i18n/required-surface-keys.ts +48 -0
  110. package/src/migrations/__tests__/kumiko-drift.integration.test.ts +3 -1
  111. package/src/migrations/__tests__/pending-rebuilds.integration.test.ts +2 -2
  112. package/src/pipeline/__tests__/archive-stream.integration.test.ts +1 -1
  113. package/src/pipeline/__tests__/cascade-handler.integration.test.ts +23 -8
  114. package/src/pipeline/__tests__/cascade-handler.test.ts +18 -3
  115. package/src/pipeline/__tests__/causation-chain.integration.test.ts +1 -1
  116. package/src/pipeline/__tests__/ctx-bridge.integration.test.ts +5 -3
  117. package/src/pipeline/__tests__/dispatcher.test.ts +42 -6
  118. package/src/pipeline/__tests__/domain-events-projections.integration.test.ts +2 -2
  119. package/src/pipeline/__tests__/fetch-for-writing.integration.test.ts +1 -1
  120. package/src/pipeline/__tests__/lifecycle-pipeline.test.ts +42 -6
  121. package/src/pipeline/__tests__/load-aggregate-query.integration.test.ts +2 -2
  122. package/src/pipeline/__tests__/msp-multi-hop.integration.test.ts +1 -1
  123. package/src/pipeline/__tests__/msp-rebuild.integration.test.ts +6 -2
  124. package/src/pipeline/__tests__/multi-stream-projection.integration.test.ts +6 -2
  125. package/src/pipeline/__tests__/perf-rebuild.integration.test.ts +1 -1
  126. package/src/pipeline/__tests__/post-query-hook.integration.test.ts +3 -3
  127. package/src/pipeline/__tests__/projection-rebuild.integration.test.ts +3 -3
  128. package/src/pipeline/__tests__/query-projection.integration.test.ts +1 -1
  129. package/src/pipeline/__tests__/rebuild-poison-quarantine.integration.test.ts +2 -2
  130. package/src/pipeline/__tests__/search-consumer-named-events.integration.test.ts +13 -2
  131. package/src/pipeline/__tests__/try-append-event.integration.test.ts +1 -1
  132. package/src/search/__tests__/reindex-entity.integration.test.ts +6 -1
  133. package/src/search/__tests__/search-pii-derived-index.integration.test.ts +7 -1
  134. package/src/stack/__tests__/ownership-boot-guard.integration.test.ts +1 -1
  135. package/src/testing/__tests__/e2e-generator.test.ts +15 -5
  136. package/src/testing/e2e-generator.ts +2 -0
  137. package/src/testing/shared-entities.ts +4 -2
  138. package/src/ui-types/index.ts +4 -0
@@ -20,7 +20,7 @@ import { setupTestStack, type TestStack, TestUsers } from "../../stack";
20
20
  const widgetEntity = createEntity({
21
21
  table: "read_post_query_widgets",
22
22
  fields: {
23
- name: createTextField({ required: true }),
23
+ name: createTextField({ personal: false, reason: "test_fixture", required: true }),
24
24
  },
25
25
  });
26
26
 
@@ -78,11 +78,11 @@ const postQueryFeature = defineFeature("postquerytest", (r) => {
78
78
 
79
79
  const gadgetEntity = createEntity({
80
80
  table: "read_post_query_gadgets",
81
- fields: { name: createTextField({ required: true }) },
81
+ fields: { name: createTextField({ personal: false, reason: "test_fixture", required: true }) },
82
82
  });
83
83
  const gizmoEntity = createEntity({
84
84
  table: "read_post_query_gizmos",
85
- fields: { name: createTextField({ required: true }) },
85
+ fields: { name: createTextField({ personal: false, reason: "test_fixture", required: true }) },
86
86
  });
87
87
 
88
88
  const dropRowHook: PostQueryHookFn = async () => ({ rows: [] });
@@ -47,8 +47,8 @@ import {
47
47
  const itemEntity = createEntity({
48
48
  table: "read_rebuild_items",
49
49
  fields: {
50
- groupId: createTextField({ required: true }),
51
- name: createTextField({ required: true }),
50
+ groupId: createTextField({ personal: false, reason: "test_fixture", required: true }),
51
+ name: createTextField({ personal: false, reason: "test_fixture", required: true }),
52
52
  },
53
53
  softDelete: true,
54
54
  });
@@ -586,7 +586,7 @@ describe("rebuildProjection — online shadow-swap mechanics", () => {
586
586
  // list/progress tests above keep seeing exactly one registered projection.
587
587
  const swapEntity = createEntity({
588
588
  table: "read_swap_indexed",
589
- fields: { label: createTextField({ required: true }) },
589
+ fields: { label: createTextField({ personal: false, reason: "test_fixture", required: true }) },
590
590
  });
591
591
  const swapTable = buildEntityTable("swap-indexed", swapEntity);
592
592
  // Empty apply: a 0-event rebuild still builds the shadow + swaps it in, so
@@ -25,7 +25,7 @@ import {
25
25
 
26
26
  const widgetEntity = createEntity({
27
27
  table: "read_qp_widgets",
28
- fields: { name: createTextField({ required: true }) },
28
+ fields: { name: createTextField({ personal: false, reason: "test_fixture", required: true }) },
29
29
  });
30
30
  const widgetTable = buildEntityTable("qp-widget", widgetEntity);
31
31
 
@@ -48,8 +48,8 @@ const POISON_SQL = "poison-sql";
48
48
  const itemEntity = createEntity({
49
49
  table: "read_poison_items",
50
50
  fields: {
51
- groupId: createTextField({ required: true }),
52
- name: createTextField({ required: true }),
51
+ groupId: createTextField({ personal: false, reason: "test_fixture", required: true }),
52
+ name: createTextField({ personal: false, reason: "test_fixture", required: true }),
53
53
  },
54
54
  });
55
55
  const itemTable = buildEntityTable("poison-item", itemEntity);
@@ -18,7 +18,13 @@ import { SEARCH_CONSUMER_NAME } from "../system-hooks";
18
18
  const noteEntity = createEntity({
19
19
  table: "read_named_search_notes",
20
20
  fields: {
21
- label: createTextField({ required: true, maxLength: 100, searchable: true }),
21
+ label: createTextField({
22
+ personal: false,
23
+ reason: "test_fixture",
24
+ required: true,
25
+ maxLength: 100,
26
+ searchable: true,
27
+ }),
22
28
  },
23
29
  softDelete: true,
24
30
  });
@@ -29,7 +35,12 @@ const noteTable = buildEntityTable("note", noteEntity);
29
35
  const ghostEntity = createEntity({
30
36
  table: "read_named_search_ghosts",
31
37
  fields: {
32
- note: createTextField({ required: true, maxLength: 50 }),
38
+ note: createTextField({
39
+ personal: false,
40
+ reason: "test_fixture",
41
+ required: true,
42
+ maxLength: 50,
43
+ }),
33
44
  },
34
45
  });
35
46
 
@@ -37,7 +37,7 @@ const TAE_AGGREGATE_TYPE = "taeDoc";
37
37
  const markerEntity = createEntity({
38
38
  table: "tae_markers",
39
39
  fields: {
40
- note: createTextField({ required: true }),
40
+ note: createTextField({ personal: false, reason: "test_fixture", required: true }),
41
41
  },
42
42
  });
43
43
  const markerTable = buildEntityTable("taeMarker", markerEntity);
@@ -31,7 +31,12 @@ const widgetEntity = createEntity({
31
31
  table: "read_reindex_widgets",
32
32
  softDelete: true,
33
33
  fields: {
34
- name: createTextField({ required: true, searchable: true }),
34
+ name: createTextField({
35
+ personal: false,
36
+ reason: "test_fixture",
37
+ required: true,
38
+ searchable: true,
39
+ }),
35
40
  },
36
41
  });
37
42
 
@@ -20,7 +20,13 @@ const contactEntity = createEntity({
20
20
  fields: {
21
21
  // personal: "self" → subject = entity id. find: "fuzzy" → searchable via derived index.
22
22
  label: createTextField({ required: true, maxLength: 100, personal: "self", find: "fuzzy" }),
23
- note: createTextField({ required: true, maxLength: 100, searchable: true }),
23
+ note: createTextField({
24
+ personal: false,
25
+ reason: "test_fixture",
26
+ required: true,
27
+ maxLength: 100,
28
+ searchable: true,
29
+ }),
24
30
  },
25
31
  });
26
32
 
@@ -38,7 +38,7 @@ function memoEntity(access: Parameters<typeof createEntity>[0]["access"]) {
38
38
  table: "fwbootguard_memos",
39
39
  fields: {
40
40
  ownerId: createTextField({ required: true }),
41
- title: createTextField({ required: true }),
41
+ title: createTextField({ personal: false, reason: "test_fixture", required: true }),
42
42
  },
43
43
  ...(access ? { access } : {}),
44
44
  });
@@ -16,7 +16,12 @@ import { generateE2ESpec, generateZodFixture } from "../e2e-generator";
16
16
  const taskEntity = createEntity({
17
17
  table: "tasks",
18
18
  fields: {
19
- title: createTextField({ required: true, maxLength: 200 }),
19
+ title: createTextField({
20
+ personal: false,
21
+ reason: "test_fixture",
22
+ required: true,
23
+ maxLength: 200,
24
+ }),
20
25
  done: createBooleanField({ default: false }),
21
26
  status: createSelectField({ options: ["todo", "doing", "done"] as const }),
22
27
  },
@@ -92,7 +97,7 @@ describe("generateE2ESpec", () => {
92
97
  const entity = createEntity({
93
98
  table: "events",
94
99
  fields: {
95
- title: createTextField({ required: true }),
100
+ title: createTextField({ personal: false, reason: "test_fixture", required: true }),
96
101
  day: createDateField(),
97
102
  at: createTimestampField(),
98
103
  },
@@ -180,9 +185,14 @@ describe("generateE2ESpec", () => {
180
185
  const contactEntity = createEntity({
181
186
  table: "contacts",
182
187
  fields: {
183
- name: createTextField({ required: true }),
184
- email: createTextField({ required: true, format: "email" }),
185
- homepage: createTextField({ format: "url" }),
188
+ name: createTextField({ personal: false, reason: "test_fixture", required: true }),
189
+ email: createTextField({
190
+ personal: false,
191
+ reason: "test_fixture",
192
+ required: true,
193
+ format: "email",
194
+ }),
195
+ homepage: createTextField({ personal: false, reason: "test_fixture", format: "url" }),
186
196
  },
187
197
  });
188
198
  const feature = defineFeature("contacts", (r) => {
@@ -108,6 +108,8 @@ export function generateE2ESpec(
108
108
  // actionForm: kein generischer E2E-Spec — Author-defined Handler
109
109
  // braucht Author-defined Test-Daten, die der Generator nicht kennt.
110
110
  if (screen.type === "actionForm") continue;
111
+ // secretMint: same reasoning — author-defined write handler, no generic spec.
112
+ if (screen.type === "secretMint") continue;
111
113
  // configEdit: dito — die Werte werden über config:write:set
112
114
  // pro Field geschrieben, ohne CRUD-Zustand zu generieren wäre der
113
115
  // Spec wertlos. Branding/SMTP/etc. sind Author-spezifisch.
@@ -17,7 +17,9 @@ import {
17
17
  // Used by every pipeline test that only needs SOMETHING to write events
18
18
  // against (event-dispatcher*, event-retention, event-dedup, …).
19
19
  export const sharedWidgetEntity = createEntity({
20
- fields: { name: createTextField({ required: true }) },
20
+ fields: {
21
+ name: createTextField({ required: true, personal: false, reason: "test_fixture" }),
22
+ },
21
23
  softDelete: true,
22
24
  });
23
25
  export const sharedWidgetTable = buildEntityTable("widget", sharedWidgetEntity);
@@ -55,7 +57,7 @@ export const sharedUserTable = buildEntityTable("user", sharedUserEntity);
55
57
  // projection-rebuild — tests that need "a thing you can CRUD".
56
58
  export const sharedItemEntity = createEntity({
57
59
  fields: {
58
- name: createTextField({ required: true }),
60
+ name: createTextField({ required: true, personal: false, reason: "test_fixture" }),
59
61
  price: createNumberField(),
60
62
  },
61
63
  softDelete: true,
@@ -100,6 +100,10 @@ export type {
100
100
  ScreenFilter,
101
101
  ScreenFilterOp,
102
102
  ScreenSlots,
103
+ SecretMintConfirmStep,
104
+ SecretMintScreenDefinition,
105
+ SecretReveal,
106
+ SecretRevealField,
103
107
  SecretsEditScreenDefinition,
104
108
  SecretsEditSection,
105
109
  ToolbarAction,