@cosmicdrift/kumiko-framework 0.332.0 → 0.334.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.
Files changed (38) hide show
  1. package/dist/db/eagerload.js +2 -1
  2. package/dist/engine/boot-validator/config-deps.js +13 -0
  3. package/dist/engine/boot-validator/pii-retention.js +39 -2
  4. package/dist/engine/boot-validator/screens.js +38 -6
  5. package/dist/engine/build-app-schema.js +3 -0
  6. package/dist/engine/build-config-feature-schema.js +98 -21
  7. package/dist/engine/config-helpers.d.ts +2 -2
  8. package/dist/engine/entity-handlers.js +7 -2
  9. package/dist/engine/extension-names.d.ts +12 -1
  10. package/dist/engine/extension-names.js +7 -0
  11. package/dist/engine/feature-ast/extractors/index.d.ts +1 -1
  12. package/dist/engine/feature-ast/extractors/index.js +1 -1
  13. package/dist/engine/feature-ast/extractors/round5.d.ts +1 -0
  14. package/dist/engine/feature-ast/extractors/round5.js +5 -0
  15. package/dist/engine/feature-ast/parse.js +3 -1
  16. package/dist/engine/feature-entity-handlers.js +22 -0
  17. package/dist/engine/field-access.d.ts +2 -0
  18. package/dist/engine/field-access.js +40 -0
  19. package/dist/engine/index.d.ts +4 -3
  20. package/dist/engine/index.js +3 -3
  21. package/dist/engine/role-assignment.d.ts +11 -1
  22. package/dist/engine/role-assignment.js +64 -3
  23. package/dist/engine/schema-builder.d.ts +1 -0
  24. package/dist/engine/schema-builder.js +11 -1
  25. package/dist/engine/types/index.d.ts +1 -1
  26. package/dist/files/file-ref-entity.d.ts +6 -0
  27. package/dist/files/file-ref-table.d.ts +6 -0
  28. package/dist/i18n/required-surface-keys.js +24 -3
  29. package/dist/i18n/settings-hub-keys.js +18 -4
  30. package/dist/pipeline/dispatch-batch.js +8 -3
  31. package/dist/pipeline/dispatch-write.js +5 -2
  32. package/dist/pipeline/dispatcher-utils.js +4 -1
  33. package/dist/pipeline/write-result-masking.d.ts +6 -0
  34. package/dist/pipeline/write-result-masking.js +36 -0
  35. package/dist/testing/shared-entities.d.ts +10 -0
  36. package/dist/ui-types/index.d.ts +2 -2
  37. package/package.json +4 -4
  38. package/src/changes.json +12 -0
@@ -9,6 +9,7 @@ export declare const sharedWidgetEntity: import("@cosmicdrift/kumiko-types/field
9
9
  readonly filterable?: boolean;
10
10
  readonly encrypted?: boolean;
11
11
  readonly sensitive?: boolean;
12
+ readonly writeOnly?: boolean;
12
13
  readonly readAsInstruction?: boolean;
13
14
  readonly format?: "email" | "url" | "phone" | "password";
14
15
  readonly default?: string;
@@ -31,6 +32,7 @@ export declare const sharedWidgetTable: import("../db/table-builder.js").EntityT
31
32
  readonly filterable?: boolean;
32
33
  readonly encrypted?: boolean;
33
34
  readonly sensitive?: boolean;
35
+ readonly writeOnly?: boolean;
34
36
  readonly readAsInstruction?: boolean;
35
37
  readonly format?: "email" | "url" | "phone" | "password";
36
38
  readonly default?: string;
@@ -53,6 +55,7 @@ export declare const sharedUserEntity: import("@cosmicdrift/kumiko-types/fields"
53
55
  readonly filterable?: boolean;
54
56
  readonly encrypted?: boolean;
55
57
  readonly sensitive?: boolean;
58
+ readonly writeOnly?: boolean;
56
59
  readonly readAsInstruction?: boolean;
57
60
  readonly format?: "email" | "url" | "phone" | "password";
58
61
  readonly default?: string;
@@ -73,6 +76,7 @@ export declare const sharedUserEntity: import("@cosmicdrift/kumiko-types/fields"
73
76
  readonly filterable?: boolean;
74
77
  readonly encrypted?: boolean;
75
78
  readonly sensitive?: boolean;
79
+ readonly writeOnly?: boolean;
76
80
  readonly readAsInstruction?: boolean;
77
81
  readonly format?: "email" | "url" | "phone" | "password";
78
82
  readonly default?: string;
@@ -93,6 +97,7 @@ export declare const sharedUserEntity: import("@cosmicdrift/kumiko-types/fields"
93
97
  readonly filterable?: boolean;
94
98
  readonly encrypted?: boolean;
95
99
  readonly sensitive?: boolean;
100
+ readonly writeOnly?: boolean;
96
101
  readonly readAsInstruction?: boolean;
97
102
  readonly format?: "email" | "url" | "phone" | "password";
98
103
  readonly default?: string;
@@ -118,6 +123,7 @@ export declare const sharedUserTable: import("../db/table-builder.js").EntityTab
118
123
  readonly filterable?: boolean;
119
124
  readonly encrypted?: boolean;
120
125
  readonly sensitive?: boolean;
126
+ readonly writeOnly?: boolean;
121
127
  readonly readAsInstruction?: boolean;
122
128
  readonly format?: "email" | "url" | "phone" | "password";
123
129
  readonly default?: string;
@@ -138,6 +144,7 @@ export declare const sharedUserTable: import("../db/table-builder.js").EntityTab
138
144
  readonly filterable?: boolean;
139
145
  readonly encrypted?: boolean;
140
146
  readonly sensitive?: boolean;
147
+ readonly writeOnly?: boolean;
141
148
  readonly readAsInstruction?: boolean;
142
149
  readonly format?: "email" | "url" | "phone" | "password";
143
150
  readonly default?: string;
@@ -158,6 +165,7 @@ export declare const sharedUserTable: import("../db/table-builder.js").EntityTab
158
165
  readonly filterable?: boolean;
159
166
  readonly encrypted?: boolean;
160
167
  readonly sensitive?: boolean;
168
+ readonly writeOnly?: boolean;
161
169
  readonly readAsInstruction?: boolean;
162
170
  readonly format?: "email" | "url" | "phone" | "password";
163
171
  readonly default?: string;
@@ -183,6 +191,7 @@ export declare const sharedItemEntity: import("@cosmicdrift/kumiko-types/fields"
183
191
  readonly filterable?: boolean;
184
192
  readonly encrypted?: boolean;
185
193
  readonly sensitive?: boolean;
194
+ readonly writeOnly?: boolean;
186
195
  readonly readAsInstruction?: boolean;
187
196
  readonly format?: "email" | "url" | "phone" | "password";
188
197
  readonly default?: string;
@@ -224,6 +233,7 @@ export declare const sharedItemTable: import("../db/table-builder.js").EntityTab
224
233
  readonly filterable?: boolean;
225
234
  readonly encrypted?: boolean;
226
235
  readonly sensitive?: boolean;
236
+ readonly writeOnly?: boolean;
227
237
  readonly readAsInstruction?: boolean;
228
238
  readonly format?: "email" | "url" | "phone" | "password";
229
239
  readonly default?: string;
@@ -5,11 +5,11 @@ export type { ParsedRefTarget } from "../engine/parse-ref-target.js";
5
5
  export { parseRefTarget } from "../engine/parse-ref-target.js";
6
6
  export type { FieldsOrGroupsSection } from "../engine/screen-helpers.js";
7
7
  export { evalFieldCondition, explicitListScreenId, isExtensionEditSection, isFieldsEditSection, isFormatSpec, isWriteFormEditSection, normalizeEditField, normalizeListColumn, resolveNavParentScreen, sectionFieldSpecs, } from "../engine/screen-helpers.js";
8
- export type { BooleanFieldDef, DateFieldDef, EmbeddedDerivedCellDef, EntityDefinition, FieldDefinition, FileFieldDef, FilesFieldDef, ImageFieldDef, ImagesFieldDef, NumberFieldDef, SelectFieldDef, SelectOptionTone, TextFieldDef, } from "../engine/types/fields.js";
8
+ export type { BooleanFieldDef, DateFieldDef, EmbeddedDerivedCellDef, EntityDefinition, FieldDefinition, FileFieldDef, FilesFieldDef, ImageFieldDef, ImagesFieldDef, NumberFieldDef, OptionsQueryPayload, OptionsQueryPayloadValue, SelectFieldDef, SelectOptionTone, TextFieldDef, } from "../engine/types/fields.js";
9
9
  export type { AccessRule, OpenToAllAccessRule, OpenToAllDeclaration, OpenToAllPersonalData, RoleAccessPersonalData, RoleAccessRule, } from "../engine/types/handlers.js";
10
10
  export { isOpenToAllGranted, isUiAccessGranted } from "../engine/types/handlers.js";
11
11
  export type { IconKey, NavDefinition, NavIconKey } from "../engine/types/nav.js";
12
- export type { ActionFormRedirect, ActionFormScreenDefinition, ConfigEditScreenDefinition, CustomScreenDefinition, CustomScreenRoute, DashboardChartKind, DashboardChartPanel, DashboardChartTone, DashboardCustomPanel, DashboardFeedPanel, DashboardFilterDefinition, DashboardListPanel, DashboardPanelDefinition, DashboardPanelEmptyState, DashboardPanelQueryOptions, DashboardPanelSpan, DashboardPanelVisibility, DashboardProgressListPanel, DashboardScopeDefinition, DashboardScreenDefinition, DashboardScreenPanel, DashboardStatGroupPanel, DashboardStatPanel, DashboardTimeRangeDefinition, EditExtensionSection, EditFieldSpec, EditFieldsSection, EditLayout, EditRelatedListSection, EditSectionSpec, EditWriteFormSection, EntityEditScreenDefinition, EntityListExpandableRow, EntityListScreenDefinition, FieldCondition, FieldIconKey, FieldRenderer, FormWidth, ListBadgeTone, ListColumnDisplay, ListColumnSpec, ListFacetSpec, ListSortSpec, MetricNavigate, MetricSpec, PlatformComponent, ProjectionDetailScreenDefinition, ProjectionListScreenDefinition, RecordHeaderSubtitlePart, RelatedListToolbarAction, RowAction, RowActionDrawer, RowActionNavigate, RowActionWriteHandler, RowFieldExtractor, ScreenDefinition, ScreenFilter, ScreenFilterOp, ScreenSlots, SecretMintConfirmStep, SecretMintScreenDefinition, SecretReveal, SecretRevealField, SecretsEditScreenDefinition, SecretsEditSection, ToolbarAction, } from "../engine/types/screen.js";
12
+ export type { ActionFormFooterAction, ActionFormRedirect, ActionFormScreenDefinition, ConfigEditScreenDefinition, CustomScreenDefinition, CustomScreenRoute, DashboardChartKind, DashboardChartPanel, DashboardChartTone, DashboardCustomPanel, DashboardFeedPanel, DashboardFilterDefinition, DashboardListPanel, DashboardPanelDefinition, DashboardPanelEmptyState, DashboardPanelQueryOptions, DashboardPanelSpan, DashboardPanelVisibility, DashboardProgressListPanel, DashboardScopeDefinition, DashboardScreenDefinition, DashboardScreenPanel, DashboardStatGroupPanel, DashboardStatPanel, DashboardTimeRangeDefinition, EditExtensionSection, EditFieldSpec, EditFieldsSection, EditLayout, EditRelatedListSection, EditSectionSpec, EditWriteFormSection, EntityEditScreenDefinition, EntityListExpandableRow, EntityListFacetConfig, EntityListFacetExtraOption, EntityListScreenDefinition, FieldCondition, FieldIconKey, FieldRenderer, FormWidth, ListBadgeTone, ListColumnDisplay, ListColumnSpec, ListFacetSpec, ListSortSpec, MetricNavigate, MetricSpec, PlatformComponent, ProjectionDetailScreenDefinition, ProjectionListScreenDefinition, RecordHeaderSubtitlePart, RelatedListGroupBy, RelatedListRowTone, RelatedListToolbarAction, RowAction, RowActionDisplay, RowActionDrawer, RowActionMode, RowActionNavigate, RowActionWriteHandler, RowFieldExtractor, ScreenDefinition, ScreenFilter, ScreenFilterOp, ScreenSlots, SecretMintConfirmStep, SecretMintScreenDefinition, SecretReveal, SecretRevealField, SecretsEditScreenDefinition, SecretsEditSection, ToolbarAction, } from "../engine/types/screen.js";
13
13
  export { metricField } from "../engine/types/screen.js";
14
14
  export type { TargetRef } from "../engine/types/target-ref.js";
15
15
  export type { TreeAction, TreeNode, TreeNodeState } from "../engine/types/tree-node.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cosmicdrift/kumiko-framework",
3
- "version": "0.332.0",
3
+ "version": "0.334.0",
4
4
  "description": "Framework core — engine, pipeline, API, DB, and every other bit that makes Kumiko go.",
5
5
  "license": "BUSL-1.1",
6
6
  "author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
@@ -206,8 +206,8 @@
206
206
  "./package.json": "./package.json"
207
207
  },
208
208
  "dependencies": {
209
- "@cosmicdrift/kumiko-http": "0.332.0",
210
- "@cosmicdrift/kumiko-types": "0.332.0",
209
+ "@cosmicdrift/kumiko-http": "0.334.0",
210
+ "@cosmicdrift/kumiko-types": "0.334.0",
211
211
  "bullmq": "^5.76.7",
212
212
  "bun-types": "^1.3.13",
213
213
  "hono": "^4.13.1",
@@ -223,7 +223,7 @@
223
223
  "zod": "^4.4.3"
224
224
  },
225
225
  "devDependencies": {
226
- "@cosmicdrift/kumiko-dispatcher-live": "0.332.0",
226
+ "@cosmicdrift/kumiko-dispatcher-live": "0.334.0",
227
227
  "bun-types": "^1.3.13",
228
228
  "pino-pretty": "^13.1.3"
229
229
  },
package/src/changes.json CHANGED
@@ -1,4 +1,16 @@
1
1
  [
2
+ {
3
+ "version": "0.334.0",
4
+ "type": "improvement",
5
+ "title": "Settings form gaps: writeForm footer submit, option description/group, dependent optionsQueryPayload, config badge label, writeOnly secret fields",
6
+ "detail": "- A `writeForm` section that fills a whole tab puts its submit button into the pinned form footer.\n- `optionsQuery` rows may carry `description` (muted second line) and `group` (heading). The combobox and the radio list show both. Options with either one never render as segments.\n- `optionsQueryPayload` values may be `{ field: \"<sibling>\" }`. The select reloads when that field changes and clears a value the new rows no longer contain. A cleared config select resets the key, so the inherited value applies again. On config keys, `field` names another key of the same feature on the same settings mask. The boot validator checks the names, and `writeForm` fieldDefs now go through the select checks too.\n- The origin line and cascade level rows on `configEdit` fields show the option label instead of the raw value or id.\n- New `writeOnly: true` on entity text fields with `find: \"secret\"`. Reads return `true` (set) or `null` and never the value. On write, `\"\"` keeps the stored value and `null` clears it. The edit form shows a masked input with a \"set\" placeholder and a remove action. `maskWriteOnlyFields(entity, row)` is exported from `@cosmicdrift/kumiko-framework/engine` for custom query handlers that return executor rows."
7
+ },
8
+ {
9
+ "version": "0.334.0",
10
+ "type": "breaking",
11
+ "title": "Duplicate write/query handler names in one feature fail at definition time",
12
+ "migration": "Rename a custom handler that shares its name with another handler of the same feature, including names r.crud registers (<entity>:list, <entity>:detail, <entity>:create, <entity>:update, <entity>:delete, <entity>:restore). Before, the later registration replaced the earlier one silently."
13
+ },
2
14
  {
3
15
  "version": "0.332.0",
4
16
  "type": "fix",