@cosmicdrift/kumiko-headless 0.34.2 → 0.35.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-headless",
3
- "version": "0.34.2",
3
+ "version": "0.35.0",
4
4
  "description": "Headless UI logic for Kumiko — Dispatcher contract, Form-Controller, View-Model, Nav-Resolver. Plattform- und React-frei; jeder Renderer (renderer, renderer-web, renderer-native, …) komponiert darauf.",
5
5
  "license": "BUSL-1.1",
6
6
  "author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
package/src/index.ts CHANGED
@@ -77,6 +77,7 @@ export type {
77
77
  ListColumnViewModel,
78
78
  ListRowViewModel,
79
79
  ListViewModel,
80
+ RuntimeRenderer,
80
81
  ScreenSlots,
81
82
  Translate,
82
83
  } from "./view-model";
@@ -57,7 +57,7 @@ describe("computeListViewModel", () => {
57
57
  });
58
58
 
59
59
  test("object-form column carries renderer through to the view model", () => {
60
- const fmt = (v: unknown) => `${v} !`;
60
+ const fmt = { format: "currency" as const, symbol: "€" };
61
61
  const vm = computeListViewModel({
62
62
  screen: listScreen([{ field: "title", renderer: fmt }]),
63
63
  entity: taskEntity,
@@ -66,7 +66,7 @@ describe("computeListViewModel", () => {
66
66
  featureName: "tasks",
67
67
  });
68
68
 
69
- expect(vm.columns[0]?.renderer).toBe(fmt);
69
+ expect(vm.columns[0]?.renderer).toEqual(fmt);
70
70
  });
71
71
 
72
72
  test("rows map to { id, values } with id pulled from the row", () => {
@@ -16,6 +16,7 @@ export type {
16
16
  ListColumnViewModel,
17
17
  ListRowViewModel,
18
18
  ListViewModel,
19
+ RuntimeRenderer,
19
20
  ScreenSlots,
20
21
  Translate,
21
22
  } from "./types";
@@ -7,6 +7,11 @@ import type {
7
7
  ScreenSlots,
8
8
  } from "@cosmicdrift/kumiko-framework/ui-types";
9
9
 
10
+ // Runtime-only renderer — function form allowed here because the renderer
11
+ // layer (render-list) injects reference-column lookup closures at mount time.
12
+ // Never serialized to JSON.
13
+ export type RuntimeRenderer = (value: unknown, row?: Readonly<Record<string, unknown>>) => string;
14
+
10
15
  // View-Models — plain data structures produced by computeListViewModel and
11
16
  // computeEditViewModel. They flatten the combined [screen-def + entity-def
12
17
  // + row-data + user] inputs into a shape the renderer draws directly,
@@ -29,12 +34,13 @@ import type {
29
34
  // One column, fully resolved. `label` is the localized string the
30
35
  // renderer puts in the column header; view-model builder runs it through
31
36
  // LocaleResolver.translate() from the i18nKey wired onto the field.
32
- // `renderer` passes through ScreenDefinition's FieldRenderer verbatim.
37
+ // `renderer` passes through ScreenDefinition's FieldRenderer verbatim; the
38
+ // renderer layer may also inject a RuntimeRenderer closure (reference lookups).
33
39
  export type ListColumnViewModel = {
34
40
  readonly field: string;
35
41
  readonly label: string;
36
42
  readonly type: string; // field-type ("text", "number", "money", ...)
37
- readonly renderer?: FieldRenderer;
43
+ readonly renderer?: FieldRenderer | RuntimeRenderer;
38
44
  readonly sortable: boolean;
39
45
  /** Nur bei `type: "select"` — translated Option-Labels keyed nach raw
40
46
  * value. Renderer rendert `optionLabels[value]` statt humanizeSlug