@caelo-cms/shared 0.10.72 → 0.11.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 (184) hide show
  1. package/dist/ai-tools.d.ts +125 -50
  2. package/dist/ai-tools.d.ts.map +1 -1
  3. package/dist/ai-tools.js +48 -36
  4. package/dist/ai-tools.js.map +1 -1
  5. package/dist/build-page.d.ts +110 -30
  6. package/dist/build-page.d.ts.map +1 -1
  7. package/dist/build-page.js +23 -4
  8. package/dist/build-page.js.map +1 -1
  9. package/dist/content.d.ts +201 -100
  10. package/dist/content.d.ts.map +1 -1
  11. package/dist/content.js +176 -74
  12. package/dist/content.js.map +1 -1
  13. package/dist/css-var-aliases.d.ts +20 -0
  14. package/dist/css-var-aliases.d.ts.map +1 -0
  15. package/dist/css-var-aliases.js +95 -0
  16. package/dist/css-var-aliases.js.map +1 -0
  17. package/dist/css-var-scan.d.ts +0 -16
  18. package/dist/css-var-scan.d.ts.map +1 -1
  19. package/dist/css-var-scan.js +24 -0
  20. package/dist/css-var-scan.js.map +1 -1
  21. package/dist/edit-markers.d.ts +41 -5
  22. package/dist/edit-markers.d.ts.map +1 -1
  23. package/dist/edit-markers.js +47 -50
  24. package/dist/edit-markers.js.map +1 -1
  25. package/dist/index.d.ts +3 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +3 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/interactions.js +2 -2
  30. package/dist/interactions.js.map +1 -1
  31. package/dist/link-canonicalise.d.ts.map +1 -1
  32. package/dist/link-canonicalise.js +7 -1
  33. package/dist/link-canonicalise.js.map +1 -1
  34. package/dist/link-refs.d.ts +1 -1
  35. package/dist/link-refs.js +3 -3
  36. package/dist/lists/address.d.ts +34 -0
  37. package/dist/lists/address.d.ts.map +1 -0
  38. package/dist/lists/address.js +43 -0
  39. package/dist/lists/address.js.map +1 -0
  40. package/dist/lists/default-types.d.ts +10 -0
  41. package/dist/lists/default-types.d.ts.map +1 -0
  42. package/dist/lists/default-types.js +91 -0
  43. package/dist/lists/default-types.js.map +1 -0
  44. package/dist/lists/fields.d.ts +152 -0
  45. package/dist/lists/fields.d.ts.map +1 -0
  46. package/dist/lists/fields.js +258 -0
  47. package/dist/lists/fields.js.map +1 -0
  48. package/dist/lists/index.d.ts +14 -0
  49. package/dist/lists/index.d.ts.map +1 -0
  50. package/dist/lists/index.js +15 -0
  51. package/dist/lists/index.js.map +1 -0
  52. package/dist/lists/item-attr.d.ts +26 -0
  53. package/dist/lists/item-attr.d.ts.map +1 -0
  54. package/dist/lists/item-attr.js +31 -0
  55. package/dist/lists/item-attr.js.map +1 -0
  56. package/dist/lists/items.d.ts +105 -0
  57. package/dist/lists/items.d.ts.map +1 -0
  58. package/dist/lists/items.js +304 -0
  59. package/dist/lists/items.js.map +1 -0
  60. package/dist/lists/list-type.d.ts +401 -0
  61. package/dist/lists/list-type.d.ts.map +1 -0
  62. package/dist/lists/list-type.js +275 -0
  63. package/dist/lists/list-type.js.map +1 -0
  64. package/dist/lists/model.d.ts +14 -0
  65. package/dist/lists/model.d.ts.map +1 -0
  66. package/dist/lists/model.js +15 -0
  67. package/dist/lists/model.js.map +1 -0
  68. package/dist/lists/page-type.d.ts +115 -0
  69. package/dist/lists/page-type.d.ts.map +1 -0
  70. package/dist/lists/page-type.js +66 -0
  71. package/dist/lists/page-type.js.map +1 -0
  72. package/dist/lists/refs.d.ts +13 -0
  73. package/dist/lists/refs.d.ts.map +1 -0
  74. package/dist/lists/refs.js +18 -0
  75. package/dist/lists/refs.js.map +1 -0
  76. package/dist/lists/render-data.d.ts +114 -0
  77. package/dist/lists/render-data.d.ts.map +1 -0
  78. package/dist/lists/render-data.js +3 -0
  79. package/dist/lists/render-data.js.map +1 -0
  80. package/dist/lists/render-deps.d.ts +68 -0
  81. package/dist/lists/render-deps.d.ts.map +1 -0
  82. package/dist/lists/render-deps.js +91 -0
  83. package/dist/lists/render-deps.js.map +1 -0
  84. package/dist/lists/resolve-values.d.ts +63 -0
  85. package/dist/lists/resolve-values.d.ts.map +1 -0
  86. package/dist/lists/resolve-values.js +181 -0
  87. package/dist/lists/resolve-values.js.map +1 -0
  88. package/dist/lists/resolve.d.ts +106 -0
  89. package/dist/lists/resolve.d.ts.map +1 -0
  90. package/dist/lists/resolve.js +878 -0
  91. package/dist/lists/resolve.js.map +1 -0
  92. package/dist/lists/scope.d.ts +81 -0
  93. package/dist/lists/scope.d.ts.map +1 -0
  94. package/dist/lists/scope.js +3 -0
  95. package/dist/lists/scope.js.map +1 -0
  96. package/dist/markup-structure.d.ts +8 -0
  97. package/dist/markup-structure.d.ts.map +1 -1
  98. package/dist/markup-structure.js +2 -0
  99. package/dist/markup-structure.js.map +1 -1
  100. package/dist/media.d.ts +1 -1
  101. package/dist/nested-module-render.d.ts +25 -20
  102. package/dist/nested-module-render.d.ts.map +1 -1
  103. package/dist/nested-module-render.js +122 -31
  104. package/dist/nested-module-render.js.map +1 -1
  105. package/dist/page-log.d.ts +1 -1
  106. package/dist/preview-compose.d.ts +24 -21
  107. package/dist/preview-compose.d.ts.map +1 -1
  108. package/dist/preview-compose.js +34 -118
  109. package/dist/preview-compose.js.map +1 -1
  110. package/dist/source-text-transport.d.ts +17 -0
  111. package/dist/source-text-transport.d.ts.map +1 -0
  112. package/dist/source-text-transport.js +71 -0
  113. package/dist/source-text-transport.js.map +1 -0
  114. package/dist/template-engine.d.ts +44 -31
  115. package/dist/template-engine.d.ts.map +1 -1
  116. package/dist/template-engine.js +75 -174
  117. package/dist/template-engine.js.map +1 -1
  118. package/dist/template-sections.d.ts +69 -0
  119. package/dist/template-sections.d.ts.map +1 -0
  120. package/dist/template-sections.js +423 -0
  121. package/dist/template-sections.js.map +1 -0
  122. package/dist/version.d.ts +2 -2
  123. package/dist/version.d.ts.map +1 -1
  124. package/dist/version.js +1 -1
  125. package/dist/version.js.map +1 -1
  126. package/package.json +8 -1
  127. package/src/__tests__/redos-hardening.test.ts +50 -16
  128. package/src/ai-tools-add-module-modes.test.ts +50 -0
  129. package/src/ai-tools.test.ts +10 -0
  130. package/src/ai-tools.ts +51 -37
  131. package/src/build-page.test.ts +34 -3
  132. package/src/build-page.ts +26 -3
  133. package/src/content.test.ts +111 -3
  134. package/src/content.ts +186 -75
  135. package/src/css-var-aliases.test.ts +61 -0
  136. package/src/css-var-aliases.ts +109 -0
  137. package/src/css-var-scan.ts +9 -0
  138. package/src/edit-markers.test.ts +37 -21
  139. package/src/edit-markers.ts +52 -20
  140. package/src/index.ts +3 -1
  141. package/src/interactions.ts +2 -2
  142. package/src/link-canonicalise.test.ts +36 -6
  143. package/src/link-canonicalise.ts +6 -1
  144. package/src/link-refs.test.ts +66 -42
  145. package/src/link-refs.ts +3 -3
  146. package/src/lists/address.ts +75 -0
  147. package/src/lists/default-types.ts +102 -0
  148. package/src/lists/fields.ts +285 -0
  149. package/src/lists/index.ts +16 -0
  150. package/src/lists/item-attr.test.ts +36 -0
  151. package/src/lists/item-attr.ts +49 -0
  152. package/src/lists/items.ts +402 -0
  153. package/src/lists/list-fixtures.test.ts +302 -0
  154. package/src/lists/list-type.ts +306 -0
  155. package/src/lists/lists.test.ts +328 -0
  156. package/src/lists/model.ts +16 -0
  157. package/src/lists/page-type.ts +71 -0
  158. package/src/lists/refs.ts +21 -0
  159. package/src/lists/render-data.ts +125 -0
  160. package/src/lists/render-deps.test.ts +132 -0
  161. package/src/lists/render-deps.ts +144 -0
  162. package/src/lists/resolve-values.ts +224 -0
  163. package/src/lists/resolve.test.ts +295 -0
  164. package/src/lists/resolve.ts +1148 -0
  165. package/src/lists/scope.ts +69 -0
  166. package/src/lists-compose-parity.test.ts +262 -0
  167. package/src/markup-structure.ts +10 -0
  168. package/src/nested-module-render.test.ts +111 -77
  169. package/src/nested-module-render.ts +85 -48
  170. package/src/preview-compose.test.ts +55 -19
  171. package/src/preview-compose.ts +59 -154
  172. package/src/source-text-transport.test.ts +63 -0
  173. package/src/source-text-transport.ts +70 -0
  174. package/src/template-engine-lists.test.ts +553 -0
  175. package/src/template-engine.test.ts +62 -80
  176. package/src/template-engine.ts +102 -245
  177. package/src/template-sections.ts +500 -0
  178. package/src/version.ts +1 -1
  179. package/dist/structured-sets.d.ts +0 -70
  180. package/dist/structured-sets.d.ts.map +0 -1
  181. package/dist/structured-sets.js +0 -92
  182. package/dist/structured-sets.js.map +0 -1
  183. package/src/structured-sets.ts +0 -114
  184. package/src/template-engine-data-lists.test.ts +0 -90
@@ -0,0 +1,105 @@
1
+ /**
2
+ * List entries — storage shape, validation against a list type, and the
3
+ * pure item-level patch operations (epic #1107, `docs/lists.md` §4).
4
+ *
5
+ * A shared list and a local list (a module field value) store the same
6
+ * array. Children always live under `children` in storage; the loop name
7
+ * a template uses (`children.name` on the node) is a rendering concern,
8
+ * so renaming a loop never rewrites stored data.
9
+ *
10
+ * Every entry carries a UUID that never changes, also not on a move.
11
+ * Diffs, translations (by address, `address.ts`) and page terms
12
+ * (`caelo:term/<listId>/<itemId>`) hang off it.
13
+ */
14
+ import { z } from "zod";
15
+ import { type ListIssue } from "./fields.js";
16
+ import { type ListTypeDef } from "./list-type.js";
17
+ export interface ListItem {
18
+ readonly id: string;
19
+ readonly node: string;
20
+ readonly values: Readonly<Record<string, unknown>>;
21
+ readonly children?: readonly ListItem[];
22
+ readonly query?: Readonly<Record<string, unknown>>;
23
+ }
24
+ /** Input shape: `id` optional (assigned on write). Recursive. */
25
+ export declare const listItemInputSchema: z.ZodType<ListItemInput>;
26
+ export interface ListItemInput {
27
+ id?: string;
28
+ node: string;
29
+ values: Record<string, unknown>;
30
+ children?: ListItemInput[];
31
+ query?: Record<string, unknown>;
32
+ }
33
+ export interface ValidateItemsOptions {
34
+ /** Mints ids for new entries; injectable for deterministic tests. */
35
+ readonly newId?: () => string;
36
+ /** Path prefix for issues (`items` by default). */
37
+ readonly path?: string;
38
+ }
39
+ export interface ValidatedItems {
40
+ readonly items: ListItem[];
41
+ readonly issues: ListIssue[];
42
+ }
43
+ /**
44
+ * Validate entries against `type`, assigning ids to entries without one.
45
+ * Checks node placement, required fields and value shapes, depth, per-level
46
+ * `max`, the total count, duplicate ids, and query overrides (only the
47
+ * source's `editable` knobs). Values for fields a node does not declare
48
+ * are an issue — data the type does not know about would be invisible in
49
+ * the editor and silently dropped by the next full replace.
50
+ */
51
+ export declare function validateListItems(type: ListTypeDef, input: unknown, opts?: ValidateItemsOptions): ValidatedItems;
52
+ /** Depth-first visit of every entry with its parent id and depth (1-based). */
53
+ export declare function walkListItems(items: readonly ListItem[], visit: (item: ListItem, parentId: string | null, depth: number, index: number) => void): void;
54
+ /** Find an entry by id anywhere in the tree. */
55
+ export declare function findListItem(items: readonly ListItem[], id: string): ListItem | null;
56
+ export type ListItemPatch = {
57
+ readonly op: "add";
58
+ readonly parentId?: string | null;
59
+ readonly position?: number;
60
+ readonly item: ListItemInput;
61
+ } | {
62
+ readonly op: "update";
63
+ readonly itemId: string;
64
+ /** Merged into the entry's values; `null` removes a value. */
65
+ readonly values?: Readonly<Record<string, unknown>>;
66
+ readonly query?: Readonly<Record<string, unknown>> | null;
67
+ } | {
68
+ readonly op: "move";
69
+ readonly itemId: string;
70
+ readonly parentId?: string | null;
71
+ readonly position: number;
72
+ } | {
73
+ readonly op: "remove";
74
+ readonly itemId: string;
75
+ };
76
+ /**
77
+ * Apply item-level patches to a tree. Pure; the result still needs
78
+ * {@link validateListItems}. Throws {@link ListPatchError} when a patch
79
+ * names an entry that does not exist (or moves an entry into itself).
80
+ */
81
+ export declare function applyListItemPatches(items: readonly ListItem[], patches: readonly ListItemPatch[]): ListItemInput[];
82
+ /** A patch that cannot apply (unknown id, move into itself). */
83
+ export declare class ListPatchError extends Error {
84
+ readonly path: string;
85
+ constructor(path: string, message: string);
86
+ }
87
+ /** Per-entry change between two versions of a tree (domain events, `docs/lists.md` §9). */
88
+ export type ListItemChange = {
89
+ readonly kind: "added";
90
+ readonly itemId: string;
91
+ } | {
92
+ readonly kind: "updated";
93
+ readonly itemId: string;
94
+ readonly fields: readonly string[];
95
+ readonly before: Readonly<Record<string, unknown>>;
96
+ } | {
97
+ readonly kind: "moved";
98
+ readonly itemId: string;
99
+ } | {
100
+ readonly kind: "removed";
101
+ readonly itemId: string;
102
+ };
103
+ /** Diff two trees by entry id. Deterministic order: removed, added, updated, moved. */
104
+ export declare function diffListItems(before: readonly ListItem[], after: readonly ListItem[]): ListItemChange[];
105
+ //# sourceMappingURL=items.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"items.d.ts","sourceRoot":"","sources":["../../src/lists/items.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,304 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ /**
3
+ * List entries — storage shape, validation against a list type, and the
4
+ * pure item-level patch operations (epic #1107, `docs/lists.md` §4).
5
+ *
6
+ * A shared list and a local list (a module field value) store the same
7
+ * array. Children always live under `children` in storage; the loop name
8
+ * a template uses (`children.name` on the node) is a rendering concern,
9
+ * so renaming a loop never rewrites stored data.
10
+ *
11
+ * Every entry carries a UUID that never changes, also not on a move.
12
+ * Diffs, translations (by address, `address.ts`) and page terms
13
+ * (`caelo:term/<listId>/<itemId>`) hang off it.
14
+ */
15
+ import { z } from "zod";
16
+ import { validateFieldValue } from "./fields.js";
17
+ import { effectiveMaxDepth, LIST_MAX_ITEMS, pageQueryPartialSchema, } from "./list-type.js";
18
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
19
+ /** Input shape: `id` optional (assigned on write). Recursive. */
20
+ export const listItemInputSchema = z.lazy(() => z
21
+ .object({
22
+ id: z.string().regex(UUID_RE, "id must be a lowercase uuid").optional(),
23
+ node: z.string().min(1).max(64),
24
+ values: z.record(z.string(), z.unknown()).default({}),
25
+ children: z.array(listItemInputSchema).optional(),
26
+ query: z.record(z.string(), z.unknown()).optional(),
27
+ })
28
+ .strict());
29
+ /**
30
+ * Validate entries against `type`, assigning ids to entries without one.
31
+ * Checks node placement, required fields and value shapes, depth, per-level
32
+ * `max`, the total count, duplicate ids, and query overrides (only the
33
+ * source's `editable` knobs). Values for fields a node does not declare
34
+ * are an issue — data the type does not know about would be invisible in
35
+ * the editor and silently dropped by the next full replace.
36
+ */
37
+ export function validateListItems(type, input, opts = {}) {
38
+ const root = opts.path ?? "items";
39
+ const issues = [];
40
+ const parsed = z.array(listItemInputSchema).safeParse(input);
41
+ if (!parsed.success) {
42
+ return {
43
+ items: [],
44
+ issues: parsed.error.issues.slice(0, 10).map((i) => ({
45
+ path: `${root}${i.path.map((p) => (typeof p === "number" ? `[${p}]` : `.${String(p)}`)).join("")}`,
46
+ message: i.message,
47
+ })),
48
+ };
49
+ }
50
+ const newId = opts.newId ?? (() => globalThis.crypto.randomUUID());
51
+ const maxDepth = effectiveMaxDepth(type);
52
+ const ids = new Set();
53
+ let count = 0;
54
+ const walk = (items, allow, max, depth, path) => {
55
+ if (max !== undefined && items.length > max) {
56
+ issues.push({ path, message: `at most ${max} entries allowed here, got ${items.length}.` });
57
+ }
58
+ return items.map((it, i) => {
59
+ const at = `${path}[${i}]`;
60
+ count += 1;
61
+ const id = it.id ?? newId();
62
+ if (ids.has(id))
63
+ issues.push({ path: `${at}.id`, message: `duplicate entry id ${id}.` });
64
+ ids.add(id);
65
+ const node = type.nodes[it.node];
66
+ if (!node) {
67
+ issues.push({
68
+ path: `${at}.node`,
69
+ message: `unknown node kind "${it.node}" — the type defines ${Object.keys(type.nodes).join(", ")}.`,
70
+ });
71
+ return { id, node: it.node, values: it.values };
72
+ }
73
+ if (!allow.includes(it.node)) {
74
+ issues.push({
75
+ path: `${at}.node`,
76
+ message: `"${it.node}" is not allowed here — allowed: ${allow.join(", ")}.`,
77
+ });
78
+ }
79
+ if (depth > maxDepth) {
80
+ issues.push({ path: at, message: `nesting deeper than ${maxDepth} levels.` });
81
+ }
82
+ const values = {};
83
+ for (const f of node.fields) {
84
+ const v = Object.hasOwn(it.values, f.name) ? it.values[f.name] : f.default;
85
+ issues.push(...validateFieldValue(f, v, `${at}.values.${f.name}`));
86
+ if (v !== undefined)
87
+ values[f.name] = v;
88
+ }
89
+ for (const k of Object.keys(it.values)) {
90
+ if (!node.fields.some((f) => f.name === k)) {
91
+ issues.push({
92
+ path: `${at}.values.${k}`,
93
+ message: `node "${it.node}" has no field "${k}" — add the field to the type or drop the value.`,
94
+ });
95
+ }
96
+ }
97
+ const out = {
98
+ id,
99
+ node: it.node,
100
+ values,
101
+ };
102
+ if (it.query !== undefined) {
103
+ if (node.source?.kind !== "query") {
104
+ issues.push({ path: `${at}.query`, message: `node "${it.node}" has no query source.` });
105
+ }
106
+ else {
107
+ const q = pageQueryPartialSchema.safeParse(it.query);
108
+ if (!q.success) {
109
+ issues.push({
110
+ path: `${at}.query`,
111
+ message: `invalid query: ${q.error.issues[0]?.message ?? ""}`,
112
+ });
113
+ }
114
+ // A non-editable knob sent with exactly the type's default value
115
+ // restates the type; it is dropped, not refused (e2e-livedit run
116
+ // 40360756064: a news entry repeated `page_type: "news"` and
117
+ // `order` from the type's defaults and the whole list was refused).
118
+ // A different value is still refused: it would be ignored silently.
119
+ const defaults = (node.source.defaults ?? {});
120
+ const query = {};
121
+ for (const [k, v] of Object.entries(it.query)) {
122
+ if (node.source.editable.includes(k)) {
123
+ query[k] = v;
124
+ }
125
+ else if (JSON.stringify(v) !== JSON.stringify(defaults[k])) {
126
+ issues.push({
127
+ path: `${at}.query.${k}`,
128
+ message: `"${k}" is not editable on "${it.node}" — editable: ${node.source.editable.join(", ") || "none"}.`,
129
+ });
130
+ }
131
+ }
132
+ out.query = query;
133
+ }
134
+ }
135
+ if (it.children !== undefined && it.children.length > 0) {
136
+ if (!node.children) {
137
+ issues.push({ path: `${at}.children`, message: `node "${it.node}" takes no children.` });
138
+ }
139
+ else {
140
+ out.children = walk(it.children, node.children.allow, node.children.max, depth + 1, `${at}.children`);
141
+ }
142
+ }
143
+ return out;
144
+ });
145
+ };
146
+ const items = walk(parsed.data, type.root.allow, type.root.max, 1, root);
147
+ if (count > LIST_MAX_ITEMS) {
148
+ issues.push({
149
+ path: root,
150
+ message: `a list holds at most ${LIST_MAX_ITEMS} entries, got ${count}.`,
151
+ });
152
+ }
153
+ return { items, issues };
154
+ }
155
+ /** Depth-first visit of every entry with its parent id and depth (1-based). */
156
+ export function walkListItems(items, visit) {
157
+ const go = (level, parentId, depth) => {
158
+ level.forEach((it, i) => {
159
+ visit(it, parentId, depth, i);
160
+ if (it.children)
161
+ go(it.children, it.id, depth + 1);
162
+ });
163
+ };
164
+ go(items, null, 1);
165
+ }
166
+ /** Find an entry by id anywhere in the tree. */
167
+ export function findListItem(items, id) {
168
+ let hit = null;
169
+ walkListItems(items, (it) => {
170
+ if (hit === null && it.id === id)
171
+ hit = it;
172
+ });
173
+ return hit;
174
+ }
175
+ /**
176
+ * Apply item-level patches to a tree. Pure; the result still needs
177
+ * {@link validateListItems}. Throws {@link ListPatchError} when a patch
178
+ * names an entry that does not exist (or moves an entry into itself).
179
+ */
180
+ export function applyListItemPatches(items, patches) {
181
+ const tree = structuredClone(items);
182
+ patches.forEach((p, i) => {
183
+ const at = `patches[${i}]`;
184
+ switch (p.op) {
185
+ case "add": {
186
+ const level = levelOf(tree, p.parentId ?? null, at);
187
+ insertAt(level, structuredClone(p.item), p.position);
188
+ break;
189
+ }
190
+ case "update": {
191
+ const hit = locate(tree, p.itemId);
192
+ if (!hit)
193
+ throw new ListPatchError(at, `no entry with id ${p.itemId}.`);
194
+ const entry = hit.level[hit.index];
195
+ const values = { ...entry.values };
196
+ for (const [k, v] of Object.entries(p.values ?? {})) {
197
+ if (v === null)
198
+ delete values[k];
199
+ else
200
+ values[k] = v;
201
+ }
202
+ entry.values = values;
203
+ if (p.query === null)
204
+ delete entry.query;
205
+ else if (p.query !== undefined)
206
+ entry.query = { ...p.query };
207
+ break;
208
+ }
209
+ case "move": {
210
+ const hit = locate(tree, p.itemId);
211
+ if (!hit)
212
+ throw new ListPatchError(at, `no entry with id ${p.itemId}.`);
213
+ const [moved] = hit.level.splice(hit.index, 1);
214
+ if (p.parentId && (p.parentId === p.itemId || containsId(moved, p.parentId))) {
215
+ throw new ListPatchError(at, "an entry cannot move into itself or its own children.");
216
+ }
217
+ insertAt(levelOf(tree, p.parentId ?? null, at), moved, p.position);
218
+ break;
219
+ }
220
+ case "remove": {
221
+ const hit = locate(tree, p.itemId);
222
+ if (!hit)
223
+ throw new ListPatchError(at, `no entry with id ${p.itemId}.`);
224
+ hit.level.splice(hit.index, 1);
225
+ break;
226
+ }
227
+ }
228
+ });
229
+ return tree;
230
+ function levelOf(t, parentId, at) {
231
+ if (parentId === null)
232
+ return t;
233
+ const hit = locate(t, parentId);
234
+ if (!hit)
235
+ throw new ListPatchError(at, `no parent entry with id ${parentId}.`);
236
+ const parent = hit.level[hit.index];
237
+ parent.children ??= [];
238
+ return parent.children;
239
+ }
240
+ }
241
+ /** A patch that cannot apply (unknown id, move into itself). */
242
+ export class ListPatchError extends Error {
243
+ path;
244
+ constructor(path, message) {
245
+ super(`${path}: ${message}`);
246
+ this.path = path;
247
+ this.name = "ListPatchError";
248
+ }
249
+ }
250
+ function insertAt(level, item, position) {
251
+ const pos = position === undefined ? level.length : Math.max(0, Math.min(position, level.length));
252
+ level.splice(pos, 0, item);
253
+ }
254
+ function locate(level, id) {
255
+ for (let i = 0; i < level.length; i += 1) {
256
+ const it = level[i];
257
+ if (it.id === id)
258
+ return { level, index: i };
259
+ if (it.children) {
260
+ const hit = locate(it.children, id);
261
+ if (hit)
262
+ return hit;
263
+ }
264
+ }
265
+ return null;
266
+ }
267
+ function containsId(item, id) {
268
+ return (item.children ?? []).some((c) => c.id === id || containsId(c, id));
269
+ }
270
+ /** Diff two trees by entry id. Deterministic order: removed, added, updated, moved. */
271
+ export function diffListItems(before, after) {
272
+ const index = (items) => {
273
+ const m = new Map();
274
+ walkListItems(items, (item, parentId, _d, position) => m.set(item.id, { item, parentId, position }));
275
+ return m;
276
+ };
277
+ const a = index(before);
278
+ const b = index(after);
279
+ const out = [];
280
+ for (const id of a.keys())
281
+ if (!b.has(id))
282
+ out.push({ kind: "removed", itemId: id });
283
+ for (const id of b.keys())
284
+ if (!a.has(id))
285
+ out.push({ kind: "added", itemId: id });
286
+ for (const [id, next] of b) {
287
+ const prev = a.get(id);
288
+ if (!prev)
289
+ continue;
290
+ const keys = new Set([...Object.keys(prev.item.values), ...Object.keys(next.item.values)]);
291
+ const fields = [...keys].filter((k) => JSON.stringify(prev.item.values[k]) !== JSON.stringify(next.item.values[k]));
292
+ if (JSON.stringify(prev.item.query ?? null) !== JSON.stringify(next.item.query ?? null)) {
293
+ fields.push("query");
294
+ }
295
+ if (fields.length > 0) {
296
+ out.push({ kind: "updated", itemId: id, fields, before: prev.item.values });
297
+ }
298
+ if (prev.parentId !== next.parentId || prev.position !== next.position) {
299
+ out.push({ kind: "moved", itemId: id });
300
+ }
301
+ }
302
+ return out;
303
+ }
304
+ //# sourceMappingURL=items.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"items.js","sourceRoot":"","sources":["../../src/lists/items.ts"],"names":[],"mappings":"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"}