@cosmicdrift/kumiko-framework 0.195.0 → 0.196.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cosmicdrift/kumiko-framework",
3
- "version": "0.195.0",
3
+ "version": "0.196.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>",
@@ -186,7 +186,7 @@
186
186
  "./package.json": "./package.json"
187
187
  },
188
188
  "dependencies": {
189
- "@cosmicdrift/kumiko-types": "0.195.0",
189
+ "@cosmicdrift/kumiko-types": "0.196.0",
190
190
  "bullmq": "^5.76.7",
191
191
  "bun-types": "^1.3.13",
192
192
  "hono": "^4.13.1",
@@ -202,7 +202,7 @@
202
202
  "zod": "^4.4.3"
203
203
  },
204
204
  "devDependencies": {
205
- "@cosmicdrift/kumiko-dispatcher-live": "0.195.0",
205
+ "@cosmicdrift/kumiko-dispatcher-live": "0.196.0",
206
206
  "bun-types": "^1.3.13",
207
207
  "pino-pretty": "^13.1.3"
208
208
  },
@@ -4,11 +4,12 @@
4
4
  // into validateColumnRendererForm, splitting them would create a
5
5
  // same-folder require cycle.
6
6
 
7
+ import { NO_WIDGET_FIELD_TYPES } from "@cosmicdrift/kumiko-types/fields";
7
8
  import { rowMetaFieldNames } from "../../db/table-builder";
8
9
  import { isValidQn, qualifyEntityName } from "../qualified-name";
9
10
  import { getAllowedFilterOps, isFieldFilterable } from "../screen-filter-ops";
10
11
  import { isExtensionEditSection, normalizeEditField, normalizeListColumn } from "../screen-helpers";
11
- import type { EntityDefinition, FeatureDefinition, FieldDefinition } from "../types";
12
+ import type { EntityDefinition, FeatureDefinition } from "../types";
12
13
  import type {
13
14
  DashboardCustomPanel,
14
15
  DashboardFilterDefinition,
@@ -24,16 +25,6 @@ import type {
24
25
  ToolbarAction,
25
26
  } from "../types/screen";
26
27
 
27
- // Mirrors FIELD_TYPES_WITHOUT_WIDGET in packages/renderer/src/app/form-schema.ts.
28
- // Can't import it directly — renderer depends on framework, not the reverse.
29
- // Keep both lists in sync when a field type gains or loses an auto-wired widget.
30
- const NO_WIDGET_FIELD_TYPES: ReadonlySet<FieldDefinition["type"]> = new Set([
31
- "jsonb",
32
- "embedded",
33
- "files",
34
- "images",
35
- ]);
36
-
37
28
  // A field type in NO_WIDGET_FIELD_TYPES renders read-only on the auto-wired
38
29
  // entityEdit path (#1925) — a required field the user can never fill would
39
30
  // block every save. Only the statically-resolvable case is caught here: a
@@ -48,7 +39,7 @@ function validateNoWidgetRequiredField(
48
39
  ): void {
49
40
  const fieldDef = entityDef.fields[fieldSpec.field];
50
41
  // skip: field doesn't exist or its type already has a widget — nothing to validate.
51
- if (fieldDef === undefined || !NO_WIDGET_FIELD_TYPES.has(fieldDef.type)) return;
42
+ if (fieldDef === undefined || !NO_WIDGET_FIELD_TYPES.includes(fieldDef.type)) return;
52
43
  // Embedded LIST fields (`multiple: true`) get their own EmbeddedListField
53
44
  // grid widget (#1838) — only plain (non-list) embedded has no widget.
54
45
  const isEmbeddedList = fieldDef.type === "embedded" && fieldDef.multiple === true;
@@ -124,7 +115,7 @@ function validateRowActionNavigateParams(
124
115
  function validateWizardLayout(
125
116
  featureName: string,
126
117
  screenId: string,
127
- screenType: "entityEdit" | "actionForm",
118
+ screenType: "entityEdit" | "actionForm" | "configEdit",
128
119
  layout: EditLayout,
129
120
  featureMap: ReadonlyMap<string, FeatureDefinition>,
130
121
  ): void {
@@ -458,6 +449,7 @@ export function validateScreens(
458
449
  }
459
450
  }
460
451
  }
452
+ validateWizardLayout(feature.name, screenId, "configEdit", screen.layout, featureMap);
461
453
  // configKeys: jeder fieldName muss einen Mapping-Eintrag haben,
462
454
  // jeder qualifizierte Key muss in der Registry existieren.
463
455
  for (const fname of fieldNames) {
@@ -20,6 +20,7 @@
20
20
  // When adding a symbol here, verify it's either a type or a pure
21
21
  // helper with no cross-module side-effects.
22
22
 
23
+ export { NO_WIDGET_FIELD_TYPES } from "@cosmicdrift/kumiko-types/fields";
23
24
  export type { DerivedCellRoundingTarget } from "../engine/embedded-derived";
24
25
  export { computeDerivedCellValue, roundDerivedCellValue } from "../engine/embedded-derived";
25
26
  export type { ParsedRefTarget } from "../engine/parse-ref-target";