@kurot/ui-document 0.1.0 → 0.3.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 (188) hide show
  1. package/README.md +112 -12
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +2 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/kurot/assets/UIAssetRegistry.d.ts +47 -0
  7. package/dist/kurot/assets/UIAssetRegistry.d.ts.map +1 -0
  8. package/dist/kurot/assets/UIAssetRegistry.js +139 -0
  9. package/dist/kurot/assets/UIAssetRegistry.js.map +1 -0
  10. package/dist/kurot/assets/UIProjectDefinition.d.ts +33 -0
  11. package/dist/kurot/assets/UIProjectDefinition.d.ts.map +1 -0
  12. package/dist/kurot/assets/UIProjectDefinition.js +2 -0
  13. package/dist/kurot/assets/UIProjectDefinition.js.map +1 -0
  14. package/dist/kurot/assets/assetTraversal.d.ts +30 -0
  15. package/dist/kurot/assets/assetTraversal.d.ts.map +1 -0
  16. package/dist/kurot/assets/assetTraversal.js +96 -0
  17. package/dist/kurot/assets/assetTraversal.js.map +1 -0
  18. package/dist/kurot/assets/index.d.ts +4 -0
  19. package/dist/kurot/assets/index.d.ts.map +1 -0
  20. package/dist/kurot/assets/index.js +3 -0
  21. package/dist/kurot/assets/index.js.map +1 -0
  22. package/dist/kurot/assets/validateUIAssetInstances.d.ts +9 -0
  23. package/dist/kurot/assets/validateUIAssetInstances.d.ts.map +1 -0
  24. package/dist/kurot/assets/validateUIAssetInstances.js +114 -0
  25. package/dist/kurot/assets/validateUIAssetInstances.js.map +1 -0
  26. package/dist/kurot/assets/validateUIAssetOverrides.d.ts +8 -0
  27. package/dist/kurot/assets/validateUIAssetOverrides.d.ts.map +1 -0
  28. package/dist/kurot/assets/validateUIAssetOverrides.js +55 -0
  29. package/dist/kurot/assets/validateUIAssetOverrides.js.map +1 -0
  30. package/dist/kurot/assets/validateUIAssetRegistry.d.ts +8 -0
  31. package/dist/kurot/assets/validateUIAssetRegistry.d.ts.map +1 -0
  32. package/dist/kurot/assets/validateUIAssetRegistry.js +79 -0
  33. package/dist/kurot/assets/validateUIAssetRegistry.js.map +1 -0
  34. package/dist/kurot/assets/validateUIProjectReferences.d.ts +8 -0
  35. package/dist/kurot/assets/validateUIProjectReferences.d.ts.map +1 -0
  36. package/dist/kurot/assets/validateUIProjectReferences.js +50 -0
  37. package/dist/kurot/assets/validateUIProjectReferences.js.map +1 -0
  38. package/dist/kurot/catalog/properties/basic-component-properties.d.ts.map +1 -1
  39. package/dist/kurot/catalog/properties/basic-component-properties.js +8 -10
  40. package/dist/kurot/catalog/properties/basic-component-properties.js.map +1 -1
  41. package/dist/kurot/catalog/properties/foundation-properties.d.ts.map +1 -1
  42. package/dist/kurot/catalog/properties/foundation-properties.js +6 -17
  43. package/dist/kurot/catalog/properties/foundation-properties.js.map +1 -1
  44. package/dist/kurot/document/create.d.ts +20 -0
  45. package/dist/kurot/document/create.d.ts.map +1 -1
  46. package/dist/kurot/document/create.js +10 -0
  47. package/dist/kurot/document/create.js.map +1 -1
  48. package/dist/kurot/document/createAssetContract.d.ts +39 -0
  49. package/dist/kurot/document/createAssetContract.d.ts.map +1 -0
  50. package/dist/kurot/document/createAssetContract.js +17 -0
  51. package/dist/kurot/document/createAssetContract.js.map +1 -0
  52. package/dist/kurot/document/createComponentInstance.d.ts +34 -0
  53. package/dist/kurot/document/createComponentInstance.d.ts.map +1 -0
  54. package/dist/kurot/document/createComponentInstance.js +13 -0
  55. package/dist/kurot/document/createComponentInstance.js.map +1 -0
  56. package/dist/kurot/document/createReferences.d.ts +14 -0
  57. package/dist/kurot/document/createReferences.d.ts.map +1 -0
  58. package/dist/kurot/document/createReferences.js +29 -0
  59. package/dist/kurot/document/createReferences.js.map +1 -0
  60. package/dist/kurot/document/index.d.ts +5 -0
  61. package/dist/kurot/document/index.d.ts.map +1 -1
  62. package/dist/kurot/document/index.js +3 -0
  63. package/dist/kurot/document/index.js.map +1 -1
  64. package/dist/kurot/document/query.d.ts.map +1 -1
  65. package/dist/kurot/document/query.js +16 -0
  66. package/dist/kurot/document/query.js.map +1 -1
  67. package/dist/kurot/editing/UIDocumentHistory.d.ts +41 -0
  68. package/dist/kurot/editing/UIDocumentHistory.d.ts.map +1 -0
  69. package/dist/kurot/editing/UIDocumentHistory.js +95 -0
  70. package/dist/kurot/editing/UIDocumentHistory.js.map +1 -0
  71. package/dist/kurot/editing/UIEditError.d.ts +24 -0
  72. package/dist/kurot/editing/UIEditError.d.ts.map +1 -0
  73. package/dist/kurot/editing/UIEditError.js +25 -0
  74. package/dist/kurot/editing/UIEditError.js.map +1 -0
  75. package/dist/kurot/editing/UIOperation.d.ts +134 -0
  76. package/dist/kurot/editing/UIOperation.d.ts.map +1 -0
  77. package/dist/kurot/editing/UIOperation.js +2 -0
  78. package/dist/kurot/editing/UIOperation.js.map +1 -0
  79. package/dist/kurot/editing/UITransaction.d.ts +69 -0
  80. package/dist/kurot/editing/UITransaction.d.ts.map +1 -0
  81. package/dist/kurot/editing/UITransaction.js +2 -0
  82. package/dist/kurot/editing/UITransaction.js.map +1 -0
  83. package/dist/kurot/editing/applyContractOperation.d.ts +11 -0
  84. package/dist/kurot/editing/applyContractOperation.d.ts.map +1 -0
  85. package/dist/kurot/editing/applyContractOperation.js +76 -0
  86. package/dist/kurot/editing/applyContractOperation.js.map +1 -0
  87. package/dist/kurot/editing/applyInstanceOperation.d.ts +11 -0
  88. package/dist/kurot/editing/applyInstanceOperation.d.ts.map +1 -0
  89. package/dist/kurot/editing/applyInstanceOperation.js +150 -0
  90. package/dist/kurot/editing/applyInstanceOperation.js.map +1 -0
  91. package/dist/kurot/editing/applyNodeOperation.d.ts +11 -0
  92. package/dist/kurot/editing/applyNodeOperation.d.ts.map +1 -0
  93. package/dist/kurot/editing/applyNodeOperation.js +133 -0
  94. package/dist/kurot/editing/applyNodeOperation.js.map +1 -0
  95. package/dist/kurot/editing/applyUIOperation.d.ts +11 -0
  96. package/dist/kurot/editing/applyUIOperation.d.ts.map +1 -0
  97. package/dist/kurot/editing/applyUIOperation.js +46 -0
  98. package/dist/kurot/editing/applyUIOperation.js.map +1 -0
  99. package/dist/kurot/editing/applyUITransaction.d.ts +6 -0
  100. package/dist/kurot/editing/applyUITransaction.d.ts.map +1 -0
  101. package/dist/kurot/editing/applyUITransaction.js +64 -0
  102. package/dist/kurot/editing/applyUITransaction.js.map +1 -0
  103. package/dist/kurot/editing/diffUIDocuments.d.ts +35 -0
  104. package/dist/kurot/editing/diffUIDocuments.d.ts.map +1 -0
  105. package/dist/kurot/editing/diffUIDocuments.js +137 -0
  106. package/dist/kurot/editing/diffUIDocuments.js.map +1 -0
  107. package/dist/kurot/editing/editHelpers.d.ts +44 -0
  108. package/dist/kurot/editing/editHelpers.d.ts.map +1 -0
  109. package/dist/kurot/editing/editHelpers.js +90 -0
  110. package/dist/kurot/editing/editHelpers.js.map +1 -0
  111. package/dist/kurot/editing/index.d.ts +10 -0
  112. package/dist/kurot/editing/index.d.ts.map +1 -0
  113. package/dist/kurot/editing/index.js +6 -0
  114. package/dist/kurot/editing/index.js.map +1 -0
  115. package/dist/kurot/editing/nodeTree.d.ts +40 -0
  116. package/dist/kurot/editing/nodeTree.d.ts.map +1 -0
  117. package/dist/kurot/editing/nodeTree.js +156 -0
  118. package/dist/kurot/editing/nodeTree.js.map +1 -0
  119. package/dist/kurot/model/UIAssetContract.d.ts +139 -0
  120. package/dist/kurot/model/UIAssetContract.d.ts.map +1 -0
  121. package/dist/kurot/model/UIAssetContract.js +2 -0
  122. package/dist/kurot/model/UIAssetContract.js.map +1 -0
  123. package/dist/kurot/model/UIAssetKind.d.ts +5 -0
  124. package/dist/kurot/model/UIAssetKind.d.ts.map +1 -0
  125. package/dist/kurot/model/UIAssetKind.js +2 -0
  126. package/dist/kurot/model/UIAssetKind.js.map +1 -0
  127. package/dist/kurot/model/UIComponentInstance.d.ts +46 -0
  128. package/dist/kurot/model/UIComponentInstance.d.ts.map +1 -0
  129. package/dist/kurot/model/UIComponentInstance.js +2 -0
  130. package/dist/kurot/model/UIComponentInstance.js.map +1 -0
  131. package/dist/kurot/model/UIDocument.d.ts +10 -0
  132. package/dist/kurot/model/UIDocument.d.ts.map +1 -1
  133. package/dist/kurot/model/UIDocument.js.map +1 -1
  134. package/dist/kurot/model/UINode.d.ts +10 -0
  135. package/dist/kurot/model/UINode.d.ts.map +1 -1
  136. package/dist/kurot/model/UIReference.d.ts +57 -0
  137. package/dist/kurot/model/UIReference.d.ts.map +1 -0
  138. package/dist/kurot/model/UIReference.js +2 -0
  139. package/dist/kurot/model/UIReference.js.map +1 -0
  140. package/dist/kurot/model/index.d.ts +4 -0
  141. package/dist/kurot/model/index.d.ts.map +1 -1
  142. package/dist/kurot/model/index.js.map +1 -1
  143. package/dist/kurot/schema/UIComponentDefinition.d.ts +11 -2
  144. package/dist/kurot/schema/UIComponentDefinition.d.ts.map +1 -1
  145. package/dist/kurot/schema/UIComponentRegistry.js +6 -0
  146. package/dist/kurot/schema/UIComponentRegistry.js.map +1 -1
  147. package/dist/kurot/schema/index.d.ts +1 -0
  148. package/dist/kurot/schema/index.d.ts.map +1 -1
  149. package/dist/kurot/schema/index.js +1 -0
  150. package/dist/kurot/schema/index.js.map +1 -1
  151. package/dist/kurot/schema/matchesUIPropertyDefinition.d.ts +7 -0
  152. package/dist/kurot/schema/matchesUIPropertyDefinition.d.ts.map +1 -0
  153. package/dist/kurot/schema/matchesUIPropertyDefinition.js +65 -0
  154. package/dist/kurot/schema/matchesUIPropertyDefinition.js.map +1 -0
  155. package/dist/kurot/schema/validateComponentDefinition.d.ts.map +1 -1
  156. package/dist/kurot/schema/validateComponentDefinition.js +40 -1
  157. package/dist/kurot/schema/validateComponentDefinition.js.map +1 -1
  158. package/dist/kurot/schema/validateUIDocumentComponents.d.ts +1 -0
  159. package/dist/kurot/schema/validateUIDocumentComponents.d.ts.map +1 -1
  160. package/dist/kurot/schema/validateUIDocumentComponents.js +12 -39
  161. package/dist/kurot/schema/validateUIDocumentComponents.js.map +1 -1
  162. package/dist/kurot/serialization/json.d.ts.map +1 -1
  163. package/dist/kurot/serialization/json.js +126 -0
  164. package/dist/kurot/serialization/json.js.map +1 -1
  165. package/dist/kurot/validation/UIDiagnostic.d.ts +1 -1
  166. package/dist/kurot/validation/UIDiagnostic.d.ts.map +1 -1
  167. package/dist/kurot/validation/validateUIAssetContract.d.ts +7 -0
  168. package/dist/kurot/validation/validateUIAssetContract.d.ts.map +1 -0
  169. package/dist/kurot/validation/validateUIAssetContract.js +154 -0
  170. package/dist/kurot/validation/validateUIAssetContract.js.map +1 -0
  171. package/dist/kurot/validation/validateUIAssetModes.d.ts +6 -0
  172. package/dist/kurot/validation/validateUIAssetModes.d.ts.map +1 -0
  173. package/dist/kurot/validation/validateUIAssetModes.js +57 -0
  174. package/dist/kurot/validation/validateUIAssetModes.js.map +1 -0
  175. package/dist/kurot/validation/validateUIComponentInstance.d.ts +6 -0
  176. package/dist/kurot/validation/validateUIComponentInstance.d.ts.map +1 -0
  177. package/dist/kurot/validation/validateUIComponentInstance.js +77 -0
  178. package/dist/kurot/validation/validateUIComponentInstance.js.map +1 -0
  179. package/dist/kurot/validation/validateUIDocument.d.ts.map +1 -1
  180. package/dist/kurot/validation/validateUIDocument.js +51 -73
  181. package/dist/kurot/validation/validateUIDocument.js.map +1 -1
  182. package/dist/kurot/validation/validationHelpers.d.ts +26 -0
  183. package/dist/kurot/validation/validationHelpers.d.ts.map +1 -0
  184. package/dist/kurot/validation/validationHelpers.js +120 -0
  185. package/dist/kurot/validation/validationHelpers.js.map +1 -0
  186. package/dist/kurot/version.d.ts +1 -1
  187. package/dist/kurot/version.js +1 -1
  188. package/package.json +2 -2
@@ -0,0 +1,64 @@
1
+ import { validateUIDocument } from '../validation/validateUIDocument.js';
2
+ import { applyUIOperationUnchecked } from './applyUIOperation.js';
3
+ import { diffUIDocuments } from './diffUIDocuments.js';
4
+ import { UIEditError } from './UIEditError.js';
5
+ /**
6
+ * Applies an ordered transaction atomically against one revision snapshot.
7
+ */
8
+ export function applyUITransaction(snapshot, transaction, options = {}) {
9
+ validateTransaction(snapshot, transaction);
10
+ let document = snapshot.document;
11
+ const inverses = [];
12
+ for (let index = 0; index < transaction.operations.length; index++) {
13
+ try {
14
+ const result = applyUIOperationUnchecked(document, transaction.operations[index]);
15
+ document = result.document;
16
+ inverses.unshift(result.inverse);
17
+ }
18
+ catch (error) {
19
+ if (!(error instanceof UIEditError))
20
+ throw error;
21
+ throw new UIEditError(error.code, `Transaction operation ${index} failed: ${error.message}`, `$.operations[${index}]${error.path === '$' ? '' : error.path.slice(1)}`, error.diagnostics);
22
+ }
23
+ }
24
+ const diagnostics = [
25
+ ...validateUIDocument(document),
26
+ ...(options.validate?.(document) ?? []),
27
+ ];
28
+ if (diagnostics.length > 0) {
29
+ throw new UIEditError('invalid-edit-result', 'Transaction produced an invalid UI document.', '$', diagnostics);
30
+ }
31
+ const revision = snapshot.revision + 1;
32
+ return Object.freeze({
33
+ document,
34
+ revision,
35
+ transaction,
36
+ inverse: {
37
+ id: `${transaction.id}:inverse`,
38
+ expectedRevision: revision,
39
+ summary: `Undo: ${transaction.summary}`,
40
+ operations: inverses,
41
+ },
42
+ changes: diffUIDocuments(snapshot.document, document),
43
+ });
44
+ }
45
+ function validateTransaction(snapshot, transaction) {
46
+ if (!Number.isInteger(snapshot.revision) || snapshot.revision < 0) {
47
+ throw new UIEditError('invalid-operation', 'Snapshot revision must be a non-negative integer.', '$.revision');
48
+ }
49
+ if (transaction.expectedRevision !== snapshot.revision) {
50
+ const message = `Transaction expected revision ${transaction.expectedRevision}, ` +
51
+ `but the current revision is ${snapshot.revision}.`;
52
+ throw new UIEditError('revision-conflict', message, '$.expectedRevision');
53
+ }
54
+ if (transaction.id.trim().length === 0) {
55
+ throw new UIEditError('invalid-operation', 'Transaction id must not be empty.', '$.id');
56
+ }
57
+ if (transaction.summary.trim().length === 0) {
58
+ throw new UIEditError('invalid-operation', 'Transaction summary must not be empty.', '$.summary');
59
+ }
60
+ if (transaction.operations.length === 0) {
61
+ throw new UIEditError('transaction-empty', 'Transaction must contain at least one operation.', '$.operations');
62
+ }
63
+ }
64
+ //# sourceMappingURL=applyUITransaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applyUITransaction.js","sourceRoot":"","sources":["../../../src/kurot/editing/applyUITransaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { UIDocument } from '../model/UIDocument.js';
2
+ /**
3
+ * Stable semantic change categories used by review and history interfaces.
4
+ */
5
+ export type UIDocumentChangeKind = 'appearance-changed' | 'contract-changed' | 'instance-changed' | 'node-added' | 'node-moved' | 'node-property-changed' | 'node-removed' | 'node-type-changed';
6
+ /**
7
+ * One deterministic difference between two semantic document snapshots.
8
+ */
9
+ export interface UIDocumentChange {
10
+ /**
11
+ * Semantic category suitable for editor grouping.
12
+ */
13
+ readonly kind: UIDocumentChangeKind;
14
+ /**
15
+ * Stable node identity when the change belongs to a node.
16
+ */
17
+ readonly nodeId?: string;
18
+ /**
19
+ * JSON-style path in the resulting semantic document.
20
+ */
21
+ readonly path: string;
22
+ /**
23
+ * Value from the input snapshot when meaningful.
24
+ */
25
+ readonly before?: unknown;
26
+ /**
27
+ * Value from the resulting snapshot when meaningful.
28
+ */
29
+ readonly after?: unknown;
30
+ }
31
+ /**
32
+ * Produces a deterministic semantic summary without mutating either document.
33
+ */
34
+ export declare function diffUIDocuments(before: UIDocument, after: UIDocument): readonly UIDocumentChange[];
35
+ //# sourceMappingURL=diffUIDocuments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diffUIDocuments.d.ts","sourceRoot":"","sources":["../../../src/kurot/editing/diffUIDocuments.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIzD;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAC7B,oBAAoB,GACpB,kBAAkB,GAClB,kBAAkB,GAClB,YAAY,GACZ,YAAY,GACZ,uBAAuB,GACvB,cAAc,GACd,mBAAmB,CAAC;AAEvB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IAEpC;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CACzB;AAQD;;GAEG;AACH,wBAAgB,eAAe,CAC9B,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,UAAU,GACf,SAAS,gBAAgB,EAAE,CAiB7B"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Produces a deterministic semantic summary without mutating either document.
3
+ */
4
+ export function diffUIDocuments(before, after) {
5
+ const changes = [];
6
+ if (!equalValue(before.contract, after.contract)) {
7
+ changes.push({
8
+ kind: 'contract-changed',
9
+ path: '$.contract',
10
+ before: before.contract,
11
+ after: after.contract,
12
+ });
13
+ }
14
+ const beforeNodes = indexNodes(before.root);
15
+ const afterNodes = indexNodes(after.root);
16
+ const nodeIds = [...new Set([...beforeNodes.keys(), ...afterNodes.keys()])].sort();
17
+ for (const nodeId of nodeIds) {
18
+ diffNode(nodeId, beforeNodes.get(nodeId), afterNodes.get(nodeId), changes);
19
+ }
20
+ return changes;
21
+ }
22
+ function diffNode(nodeId, before, after, changes) {
23
+ if (!before && after) {
24
+ changes.push({ kind: 'node-added', nodeId, path: nodePath(nodeId), after: after.node });
25
+ return;
26
+ }
27
+ if (before && !after) {
28
+ changes.push({ kind: 'node-removed', nodeId, path: nodePath(nodeId), before: before.node });
29
+ return;
30
+ }
31
+ if (!before || !after)
32
+ return;
33
+ if (!equalValue(before.target, after.target) || before.index !== after.index) {
34
+ changes.push({
35
+ kind: 'node-moved',
36
+ nodeId,
37
+ path: nodePath(nodeId),
38
+ before: { target: before.target, index: before.index },
39
+ after: { target: after.target, index: after.index },
40
+ });
41
+ }
42
+ if (before.node.type !== after.node.type) {
43
+ changes.push({
44
+ kind: 'node-type-changed',
45
+ nodeId,
46
+ path: `${nodePath(nodeId)}.type`,
47
+ before: before.node.type,
48
+ after: after.node.type,
49
+ });
50
+ }
51
+ diffProperties(nodeId, before.node, after.node, changes);
52
+ if (!equalValue(withoutSlots(before.node.instance), withoutSlots(after.node.instance))) {
53
+ changes.push({
54
+ kind: 'instance-changed',
55
+ nodeId,
56
+ path: `${nodePath(nodeId)}.instance`,
57
+ before: withoutSlots(before.node.instance),
58
+ after: withoutSlots(after.node.instance),
59
+ });
60
+ }
61
+ if (!equalValue(before.node.appearance, after.node.appearance)) {
62
+ changes.push({
63
+ kind: 'appearance-changed',
64
+ nodeId,
65
+ path: `${nodePath(nodeId)}.appearance`,
66
+ before: before.node.appearance,
67
+ after: after.node.appearance,
68
+ });
69
+ }
70
+ }
71
+ function diffProperties(nodeId, before, after, changes) {
72
+ const names = [
73
+ ...new Set([...Object.keys(before.properties), ...Object.keys(after.properties)]),
74
+ ].sort();
75
+ for (const name of names) {
76
+ if (equalValue(before.properties[name], after.properties[name]))
77
+ continue;
78
+ changes.push({
79
+ kind: 'node-property-changed',
80
+ nodeId,
81
+ path: `${nodePath(nodeId)}.properties.${name}`,
82
+ before: before.properties[name],
83
+ after: after.properties[name],
84
+ });
85
+ }
86
+ }
87
+ function indexNodes(root) {
88
+ const nodes = new Map();
89
+ visit(root, undefined, 0, nodes);
90
+ return nodes;
91
+ }
92
+ function visit(node, target, index, nodes) {
93
+ nodes.set(node.id, { node, target, index });
94
+ for (let childIndex = 0; childIndex < node.children.length; childIndex++) {
95
+ visit(node.children[childIndex], { collection: 'children', parentId: node.id }, childIndex, nodes);
96
+ }
97
+ if (!node.instance)
98
+ return;
99
+ for (const slot of Object.keys(node.instance.slots).sort()) {
100
+ const children = node.instance.slots[slot];
101
+ for (let childIndex = 0; childIndex < children.length; childIndex++) {
102
+ visit(children[childIndex], { collection: 'slot', parentId: node.id, slot }, childIndex, nodes);
103
+ }
104
+ }
105
+ }
106
+ function withoutSlots(instance) {
107
+ if (!instance)
108
+ return undefined;
109
+ const { slots: _slots, ...value } = instance;
110
+ return value;
111
+ }
112
+ function equalValue(a, b) {
113
+ return stableStringify(a) === stableStringify(b);
114
+ }
115
+ function stableStringify(value) {
116
+ return JSON.stringify(normalize(value));
117
+ }
118
+ function normalize(value) {
119
+ if (Array.isArray(value))
120
+ return value.map(normalize);
121
+ if (typeof value !== 'object' || value === null)
122
+ return value;
123
+ return Object.fromEntries(Object.entries(value)
124
+ .sort(([a], [b]) => compareStrings(a, b))
125
+ .map(([key, child]) => [key, normalize(child)]));
126
+ }
127
+ function nodePath(nodeId) {
128
+ return `$.nodes[${JSON.stringify(nodeId)}]`;
129
+ }
130
+ function compareStrings(a, b) {
131
+ if (a < b)
132
+ return -1;
133
+ if (a > b)
134
+ return 1;
135
+ return 0;
136
+ }
137
+ //# sourceMappingURL=diffUIDocuments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diffUIDocuments.js","sourceRoot":"","sources":["../../../src/kurot/editing/diffUIDocuments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { UIComponentInstance } from '../model/UIComponentInstance.js';
2
+ import type { UIDocument } from '../model/UIDocument.js';
3
+ import type { UINode } from '../model/UINode.js';
4
+ import { UIEditError } from './UIEditError.js';
5
+ import type { UIChildTarget, UIOperation, UIOperationResult } from './UIOperation.js';
6
+ /**
7
+ * Replaces one node while preserving the immutable document root.
8
+ */
9
+ export declare function updateNode(document: UIDocument, nodeId: string, update: (node: UINode) => {
10
+ readonly documentNode: UINode;
11
+ readonly inverse: UIOperation;
12
+ }): UIOperationResult;
13
+ /**
14
+ * Replaces the reusable-instance payload on one immutable node.
15
+ */
16
+ export declare function updateInstance(document: UIDocument, nodeId: string, update: (instance: UIComponentInstance) => {
17
+ readonly instance: UIComponentInstance;
18
+ readonly inverse: UIOperation;
19
+ }): UIOperationResult;
20
+ /**
21
+ * Verifies that a child collection exists and accepts the requested index.
22
+ */
23
+ export declare function validateTarget(root: UINode, target: UIChildTarget, index: number): void;
24
+ /**
25
+ * Rejects an inserted subtree whose IDs collide with the current document.
26
+ */
27
+ export declare function assertInsertIdsAvailable(root: UINode, inserted: UINode): void;
28
+ /**
29
+ * Returns a non-empty semantic name or raises a structured edit error.
30
+ */
31
+ export declare function requireName(value: string, label: string): string;
32
+ /**
33
+ * Creates the standard missing-node edit error.
34
+ */
35
+ export declare function nodeNotFound(nodeId: string, path: string): UIEditError;
36
+ /**
37
+ * Creates the standard missing-instance edit error.
38
+ */
39
+ export declare function missingInstance(nodeId: string): UIEditError;
40
+ /**
41
+ * Creates the standard missing semantic value edit error.
42
+ */
43
+ export declare function missingValue(label: string, path: string): UIEditError;
44
+ //# sourceMappingURL=editHelpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editHelpers.d.ts","sourceRoot":"","sources":["../../../src/kurot/editing/editHelpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EACX,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,MAAM,kBAAkB,CAAC;AAG1B;;GAEG;AACH,wBAAgB,UAAU,CACzB,QAAQ,EAAE,UAAU,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;CAC9B,GACC,iBAAiB,CASnB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC7B,QAAQ,EAAE,UAAU,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK;IAC1C,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;CAC9B,GACC,iBAAiB,CASnB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,MAAM,GACX,IAAI,CAyBN;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAc7E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAEtE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAM3D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAErE"}
@@ -0,0 +1,90 @@
1
+ import { findUINode, visitUINodes } from '../document/query.js';
2
+ import { UIEditError } from './UIEditError.js';
3
+ import { getUIChildCount, updateUINode } from './nodeTree.js';
4
+ /**
5
+ * Replaces one node while preserving the immutable document root.
6
+ */
7
+ export function updateNode(document, nodeId, update) {
8
+ let inverse;
9
+ const root = updateUINode(document.root, nodeId, node => {
10
+ const result = update(node);
11
+ inverse = result.inverse;
12
+ return result.documentNode;
13
+ });
14
+ if (!root || !inverse)
15
+ throw nodeNotFound(nodeId, '$.nodeId');
16
+ return { document: { ...document, root }, inverse };
17
+ }
18
+ /**
19
+ * Replaces the reusable-instance payload on one immutable node.
20
+ */
21
+ export function updateInstance(document, nodeId, update) {
22
+ return updateNode(document, nodeId, node => {
23
+ if (!node.instance)
24
+ throw missingInstance(node.id);
25
+ const result = update(node.instance);
26
+ return {
27
+ documentNode: { ...node, instance: result.instance },
28
+ inverse: result.inverse,
29
+ };
30
+ });
31
+ }
32
+ /**
33
+ * Verifies that a child collection exists and accepts the requested index.
34
+ */
35
+ export function validateTarget(root, target, index) {
36
+ const parent = findUINode(root, target.parentId);
37
+ if (!parent)
38
+ throw nodeNotFound(target.parentId, '$.target.parentId');
39
+ if (target.collection === 'children' && parent.instance) {
40
+ throw new UIEditError('invalid-parent', 'Reusable instances accept projected children through Slots only.', '$.target');
41
+ }
42
+ if (target.collection === 'slot' && !parent.instance) {
43
+ throw new UIEditError('invalid-parent', `Node "${parent.id}" is not a reusable component instance.`, '$.target');
44
+ }
45
+ const count = getUIChildCount(root, target);
46
+ if (count === undefined || !Number.isInteger(index) || index < 0 || index > count) {
47
+ throw new UIEditError('index-out-of-range', `Child index ${index} is outside the range 0..${String(count ?? 0)}.`, '$.index');
48
+ }
49
+ }
50
+ /**
51
+ * Rejects an inserted subtree whose IDs collide with the current document.
52
+ */
53
+ export function assertInsertIdsAvailable(root, inserted) {
54
+ const existing = new Set();
55
+ visitUINodes(root, node => existing.add(node.id));
56
+ const insertedIds = new Set();
57
+ visitUINodes(inserted, node => {
58
+ if (existing.has(node.id) || insertedIds.has(node.id)) {
59
+ throw new UIEditError('duplicate-node-id', `Node id "${node.id}" is already present in the document or inserted subtree.`, '$.node.id');
60
+ }
61
+ insertedIds.add(node.id);
62
+ });
63
+ }
64
+ /**
65
+ * Returns a non-empty semantic name or raises a structured edit error.
66
+ */
67
+ export function requireName(value, label) {
68
+ if (value.trim().length > 0)
69
+ return value;
70
+ throw new UIEditError('invalid-operation', `${label} must not be empty.`, '$');
71
+ }
72
+ /**
73
+ * Creates the standard missing-node edit error.
74
+ */
75
+ export function nodeNotFound(nodeId, path) {
76
+ return new UIEditError('node-not-found', `Node "${nodeId}" does not exist.`, path);
77
+ }
78
+ /**
79
+ * Creates the standard missing-instance edit error.
80
+ */
81
+ export function missingInstance(nodeId) {
82
+ return new UIEditError('missing-instance', `Node "${nodeId}" is not a reusable component instance.`, '$.nodeId');
83
+ }
84
+ /**
85
+ * Creates the standard missing semantic value edit error.
86
+ */
87
+ export function missingValue(label, path) {
88
+ return new UIEditError('invalid-operation', `${label} does not exist.`, path);
89
+ }
90
+ //# sourceMappingURL=editHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editHelpers.js","sourceRoot":"","sources":["../../../src/kurot/editing/editHelpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export { applyUIOperation } from './applyUIOperation.js';
2
+ export { applyUITransaction } from './applyUITransaction.js';
3
+ export { diffUIDocuments } from './diffUIDocuments.js';
4
+ export type { UIDocumentChange, UIDocumentChangeKind, } from './diffUIDocuments.js';
5
+ export { UIDocumentHistory } from './UIDocumentHistory.js';
6
+ export { UIEditError } from './UIEditError.js';
7
+ export type { UIEditErrorCode } from './UIEditError.js';
8
+ export type { UIChildTarget, UIOperation, UIOperationResult, } from './UIOperation.js';
9
+ export type { ApplyUITransactionOptions, UIRevisionSnapshot, UITransaction, UITransactionResult, UITransactionValidator, } from './UITransaction.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/kurot/editing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EACX,gBAAgB,EAChB,oBAAoB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,YAAY,EACX,aAAa,EACb,WAAW,EACX,iBAAiB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACX,yBAAyB,EACzB,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,sBAAsB,GACtB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { applyUIOperation } from './applyUIOperation.js';
2
+ export { applyUITransaction } from './applyUITransaction.js';
3
+ export { diffUIDocuments } from './diffUIDocuments.js';
4
+ export { UIDocumentHistory } from './UIDocumentHistory.js';
5
+ export { UIEditError } from './UIEditError.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/kurot/editing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAKvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { UINode } from '../model/UINode.js';
2
+ import type { UIChildTarget } from './UIOperation.js';
3
+ /**
4
+ * Removed subtree and its exact former child location.
5
+ */
6
+ export interface UIRemovedNode {
7
+ /**
8
+ * Removed subtree root.
9
+ */
10
+ readonly node: UINode;
11
+ /**
12
+ * Updated immutable document root.
13
+ */
14
+ readonly root: UINode;
15
+ /**
16
+ * Former parent collection.
17
+ */
18
+ readonly target: UIChildTarget;
19
+ /**
20
+ * Former collection index.
21
+ */
22
+ readonly index: number;
23
+ }
24
+ /**
25
+ * Immutably updates a node across ordinary and projected Slot children.
26
+ */
27
+ export declare function updateUINode(root: UINode, nodeId: string, update: (node: UINode) => UINode): UINode | undefined;
28
+ /**
29
+ * Immutably inserts a subtree into an ordinary or projected child collection.
30
+ */
31
+ export declare function insertUINode(root: UINode, target: UIChildTarget, index: number, node: UINode): UINode | undefined;
32
+ /**
33
+ * Immutably removes a non-root subtree and records its former location.
34
+ */
35
+ export declare function removeUINode(root: UINode, nodeId: string): UIRemovedNode | undefined;
36
+ /**
37
+ * Returns the current size of an ordinary or projected child collection.
38
+ */
39
+ export declare function getUIChildCount(root: UINode, target: UIChildTarget): number | undefined;
40
+ //# sourceMappingURL=nodeTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeTree.d.ts","sourceRoot":"","sources":["../../../src/kurot/editing/nodeTree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAC9B,MAAM,GAAG,SAAS,CA8BpB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACV,MAAM,GAAG,SAAS,CAcpB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEpF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAUvF"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Immutably updates a node across ordinary and projected Slot children.
3
+ */
4
+ export function updateUINode(root, nodeId, update) {
5
+ if (root.id === nodeId)
6
+ return update(root);
7
+ let changed = false;
8
+ const children = root.children.map(child => {
9
+ const result = updateUINode(child, nodeId, update);
10
+ if (!result)
11
+ return child;
12
+ changed = true;
13
+ return result;
14
+ });
15
+ let instance = root.instance;
16
+ if (instance) {
17
+ let slotsChanged = false;
18
+ const slots = Object.fromEntries(Object.entries(instance.slots).map(([name, nodes]) => [
19
+ name,
20
+ nodes.map(child => {
21
+ const result = updateUINode(child, nodeId, update);
22
+ if (!result)
23
+ return child;
24
+ slotsChanged = true;
25
+ return result;
26
+ }),
27
+ ]));
28
+ if (slotsChanged) {
29
+ changed = true;
30
+ instance = { ...instance, slots };
31
+ }
32
+ }
33
+ return changed ? { ...root, children, ...(instance ? { instance } : {}) } : undefined;
34
+ }
35
+ /**
36
+ * Immutably inserts a subtree into an ordinary or projected child collection.
37
+ */
38
+ export function insertUINode(root, target, index, node) {
39
+ return updateUINode(root, target.parentId, parent => {
40
+ if (target.collection === 'children') {
41
+ const children = insertAt(parent.children, index, node);
42
+ return { ...parent, children };
43
+ }
44
+ if (!parent.instance)
45
+ return parent;
46
+ const current = parent.instance.slots[target.slot] ?? [];
47
+ const slots = {
48
+ ...parent.instance.slots,
49
+ [target.slot]: insertAt(current, index, node),
50
+ };
51
+ return { ...parent, instance: { ...parent.instance, slots } };
52
+ });
53
+ }
54
+ /**
55
+ * Immutably removes a non-root subtree and records its former location.
56
+ */
57
+ export function removeUINode(root, nodeId) {
58
+ return removeFromDescendants(root, nodeId);
59
+ }
60
+ /**
61
+ * Returns the current size of an ordinary or projected child collection.
62
+ */
63
+ export function getUIChildCount(root, target) {
64
+ let count;
65
+ updateUINode(root, target.parentId, parent => {
66
+ count =
67
+ target.collection === 'children'
68
+ ? parent.children.length
69
+ : parent.instance?.slots[target.slot]?.length ?? 0;
70
+ return parent;
71
+ });
72
+ return count;
73
+ }
74
+ function removeFromDescendants(parent, nodeId) {
75
+ const childIndex = parent.children.findIndex(child => child.id === nodeId);
76
+ if (childIndex >= 0) {
77
+ return {
78
+ node: parent.children[childIndex],
79
+ root: {
80
+ ...parent,
81
+ children: removeAt(parent.children, childIndex),
82
+ },
83
+ target: { collection: 'children', parentId: parent.id },
84
+ index: childIndex,
85
+ };
86
+ }
87
+ if (parent.instance) {
88
+ for (const slot of Object.keys(parent.instance.slots).sort()) {
89
+ const nodes = parent.instance.slots[slot];
90
+ const slotIndex = nodes.findIndex(child => child.id === nodeId);
91
+ if (slotIndex < 0)
92
+ continue;
93
+ return {
94
+ node: nodes[slotIndex],
95
+ root: {
96
+ ...parent,
97
+ instance: {
98
+ ...parent.instance,
99
+ slots: {
100
+ ...parent.instance.slots,
101
+ [slot]: removeAt(nodes, slotIndex),
102
+ },
103
+ },
104
+ },
105
+ target: { collection: 'slot', parentId: parent.id, slot },
106
+ index: slotIndex,
107
+ };
108
+ }
109
+ }
110
+ return removeNested(parent, nodeId);
111
+ }
112
+ function removeNested(parent, nodeId) {
113
+ for (const child of parent.children) {
114
+ const removed = removeFromDescendants(child, nodeId);
115
+ if (!removed)
116
+ continue;
117
+ return {
118
+ ...removed,
119
+ root: {
120
+ ...parent,
121
+ children: parent.children.map(item => item.id === child.id ? removed.root : item),
122
+ },
123
+ };
124
+ }
125
+ if (!parent.instance)
126
+ return undefined;
127
+ for (const slot of Object.keys(parent.instance.slots).sort()) {
128
+ const nodes = parent.instance.slots[slot];
129
+ for (const child of nodes) {
130
+ const removed = removeFromDescendants(child, nodeId);
131
+ if (!removed)
132
+ continue;
133
+ return {
134
+ ...removed,
135
+ root: {
136
+ ...parent,
137
+ instance: {
138
+ ...parent.instance,
139
+ slots: {
140
+ ...parent.instance.slots,
141
+ [slot]: nodes.map(item => item.id === child.id ? removed.root : item),
142
+ },
143
+ },
144
+ },
145
+ };
146
+ }
147
+ }
148
+ return undefined;
149
+ }
150
+ function insertAt(values, index, value) {
151
+ return [...values.slice(0, index), value, ...values.slice(index)];
152
+ }
153
+ function removeAt(values, index) {
154
+ return [...values.slice(0, index), ...values.slice(index + 1)];
155
+ }
156
+ //# sourceMappingURL=nodeTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeTree.js","sourceRoot":"","sources":["../../../src/kurot/editing/nodeTree.ts"],"names":[],"mappings":"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"}