@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,57 @@
1
+ import { addUIDiagnostic, isPlainRecord, validateKnownKeys, validateNonEmptyString, validatePropertyValue, } from './validationHelpers.js';
2
+ const MODE_KEYS = new Set(['description', 'overrides']);
3
+ const OVERRIDE_KEYS = new Set(['property', 'targetId', 'value']);
4
+ /**
5
+ * Validates a named collection of runtime-neutral states or variants.
6
+ */
7
+ export function validateUIAssetModes(value, path, diagnostics, nodeIds) {
8
+ if (!validateNamedModes(value, path, diagnostics))
9
+ return;
10
+ for (const [name, definition] of Object.entries(value)) {
11
+ const definitionPath = `${path}.${name}`;
12
+ if (!isPlainRecord(definition)) {
13
+ addUIDiagnostic(diagnostics, 'invalid-asset-contract', definitionPath, 'State or variant definition must be an object.');
14
+ continue;
15
+ }
16
+ validateKnownKeys(definition, MODE_KEYS, definitionPath, diagnostics);
17
+ if (definition.description !== undefined) {
18
+ validateNonEmptyString(definition.description, `${definitionPath}.description`, 'Description', diagnostics);
19
+ }
20
+ validateOverrides(definition.overrides, `${definitionPath}.overrides`, diagnostics, nodeIds);
21
+ }
22
+ }
23
+ function validateOverrides(value, path, diagnostics, nodeIds) {
24
+ if (!Array.isArray(value)) {
25
+ addUIDiagnostic(diagnostics, 'invalid-asset-contract', path, 'State or variant overrides must be an array.');
26
+ return;
27
+ }
28
+ for (let index = 0; index < value.length; index++) {
29
+ validatePropertyOverride(value[index], `${path}[${index}]`, diagnostics, nodeIds);
30
+ }
31
+ }
32
+ function validatePropertyOverride(value, path, diagnostics, nodeIds) {
33
+ if (!isPlainRecord(value)) {
34
+ addUIDiagnostic(diagnostics, 'invalid-asset-contract', path, 'Property override must be an object.');
35
+ return;
36
+ }
37
+ validateKnownKeys(value, OVERRIDE_KEYS, path, diagnostics);
38
+ if (validateNonEmptyString(value.targetId, `${path}.targetId`, 'Target node id', diagnostics) &&
39
+ !nodeIds.has(value.targetId)) {
40
+ addUIDiagnostic(diagnostics, 'unknown-node-reference', `${path}.targetId`, `Node "${value.targetId}" does not exist in this asset.`);
41
+ }
42
+ validateNonEmptyString(value.property, `${path}.property`, 'Property name', diagnostics);
43
+ validatePropertyValue(value.value, `${path}.value`, diagnostics);
44
+ }
45
+ function validateNamedModes(value, path, diagnostics) {
46
+ if (!isPlainRecord(value)) {
47
+ addUIDiagnostic(diagnostics, 'invalid-asset-contract', path, 'Asset contract states and variants must be objects.');
48
+ return false;
49
+ }
50
+ for (const name of Object.keys(value)) {
51
+ if (name.trim().length > 0)
52
+ continue;
53
+ addUIDiagnostic(diagnostics, 'invalid-asset-contract', path, 'State and variant names must not be empty.');
54
+ }
55
+ return true;
56
+ }
57
+ //# sourceMappingURL=validateUIAssetModes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateUIAssetModes.js","sourceRoot":"","sources":["../../../src/kurot/validation/validateUIAssetModes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { UIDiagnostic } from './UIDiagnostic.js';
2
+ /**
3
+ * Validates one reusable component instance and visits its projected children.
4
+ */
5
+ export declare function validateUIComponentInstance(value: unknown, path: string, diagnostics: UIDiagnostic[], validateNode: (value: unknown, path: string) => void): void;
6
+ //# sourceMappingURL=validateUIComponentInstance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateUIComponentInstance.d.ts","sourceRoot":"","sources":["../../../src/kurot/validation/validateUIComponentInstance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAmBtD;;GAEG;AACH,wBAAgB,2BAA2B,CAC1C,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,YAAY,EAAE,EAC3B,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GAClD,IAAI,CAmBN"}
@@ -0,0 +1,77 @@
1
+ import { addUIDiagnostic, isPlainRecord, validateAssetReference, validateKnownKeys, validateNonEmptyString, validatePropertyValue, } from './validationHelpers.js';
2
+ const INSTANCE_KEYS = new Set([
3
+ 'overrides',
4
+ 'parameters',
5
+ 'slots',
6
+ 'source',
7
+ 'variant',
8
+ ]);
9
+ const OVERRIDE_KEYS = new Set(['part', 'property', 'value']);
10
+ /**
11
+ * Validates one reusable component instance and visits its projected children.
12
+ */
13
+ export function validateUIComponentInstance(value, path, diagnostics, validateNode) {
14
+ if (!isPlainRecord(value)) {
15
+ addUIDiagnostic(diagnostics, 'invalid-component-instance', path, 'Component instance must be an object.');
16
+ return;
17
+ }
18
+ validateKnownKeys(value, INSTANCE_KEYS, path, diagnostics);
19
+ validateAssetReference(value.source, `${path}.source`, diagnostics);
20
+ validateParameters(value.parameters, `${path}.parameters`, diagnostics);
21
+ if (value.variant !== undefined) {
22
+ validateNonEmptyString(value.variant, `${path}.variant`, 'Variant', diagnostics);
23
+ }
24
+ validateOverrides(value.overrides, `${path}.overrides`, diagnostics);
25
+ validateSlots(value.slots, `${path}.slots`, diagnostics, validateNode);
26
+ }
27
+ function validateParameters(value, path, diagnostics) {
28
+ if (!isPlainRecord(value)) {
29
+ addUIDiagnostic(diagnostics, 'invalid-component-instance', path, 'Instance parameters must be an object.');
30
+ return;
31
+ }
32
+ for (const [name, parameter] of Object.entries(value)) {
33
+ if (name.trim().length === 0) {
34
+ addUIDiagnostic(diagnostics, 'invalid-component-instance', path, 'Instance parameter names must not be empty.');
35
+ continue;
36
+ }
37
+ validatePropertyValue(parameter, `${path}.${name}`, diagnostics);
38
+ }
39
+ }
40
+ function validateOverrides(value, path, diagnostics) {
41
+ if (!Array.isArray(value)) {
42
+ addUIDiagnostic(diagnostics, 'invalid-component-instance', path, 'Instance overrides must be an array.');
43
+ return;
44
+ }
45
+ for (let index = 0; index < value.length; index++) {
46
+ const overridePath = `${path}[${index}]`;
47
+ const override = value[index];
48
+ if (!isPlainRecord(override)) {
49
+ addUIDiagnostic(diagnostics, 'invalid-component-instance', overridePath, 'Instance override must be an object.');
50
+ continue;
51
+ }
52
+ validateKnownKeys(override, OVERRIDE_KEYS, overridePath, diagnostics);
53
+ validateNonEmptyString(override.part, `${overridePath}.part`, 'Part name', diagnostics);
54
+ validateNonEmptyString(override.property, `${overridePath}.property`, 'Property name', diagnostics);
55
+ validatePropertyValue(override.value, `${overridePath}.value`, diagnostics);
56
+ }
57
+ }
58
+ function validateSlots(value, path, diagnostics, validateNode) {
59
+ if (!isPlainRecord(value)) {
60
+ addUIDiagnostic(diagnostics, 'invalid-component-instance', path, 'Instance slots must be an object.');
61
+ return;
62
+ }
63
+ for (const [name, children] of Object.entries(value)) {
64
+ const slotPath = `${path}.${name}`;
65
+ if (name.trim().length === 0) {
66
+ addUIDiagnostic(diagnostics, 'invalid-component-instance', path, 'Instance slot names must not be empty.');
67
+ }
68
+ if (!Array.isArray(children)) {
69
+ addUIDiagnostic(diagnostics, 'invalid-component-instance', slotPath, 'Instance slot content must be an array.');
70
+ continue;
71
+ }
72
+ for (let index = 0; index < children.length; index++) {
73
+ validateNode(children[index], `${slotPath}[${index}]`);
74
+ }
75
+ }
76
+ }
77
+ //# sourceMappingURL=validateUIComponentInstance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateUIComponentInstance.js","sourceRoot":"","sources":["../../../src/kurot/validation/validateUIComponentInstance.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validateUIDocument.d.ts","sourceRoot":"","sources":["../../../src/kurot/validation/validateUIDocument.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,mBAAmB,CAAC;AAKxE;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,EAAE,CAgBjE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE"}
1
+ {"version":3,"file":"validateUIDocument.d.ts","sourceRoot":"","sources":["../../../src/kurot/validation/validateUIDocument.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AA6BtD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,EAAE,CAwBjE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE"}
@@ -1,23 +1,42 @@
1
1
  import { UI_DOCUMENT_KIND } from '../model/UIDocument.js';
2
2
  import { UI_DOCUMENT_FORMAT_VERSION } from '../version.js';
3
- const DOCUMENT_KEYS = new Set(['kind', 'formatVersion', 'id', 'root']);
4
- const NODE_KEYS = new Set(['id', 'type', 'properties', 'children']);
3
+ import { validateUIAssetContract } from './validateUIAssetContract.js';
4
+ import { validateUIComponentInstance } from './validateUIComponentInstance.js';
5
+ import { addUIDiagnostic, isPlainRecord, validateAssetReference, validateKnownKeys, validateNonEmptyString, validatePropertyValue, } from './validationHelpers.js';
6
+ const DOCUMENT_KEYS = new Set([
7
+ 'assetKind',
8
+ 'contract',
9
+ 'formatVersion',
10
+ 'id',
11
+ 'kind',
12
+ 'root',
13
+ ]);
14
+ const NODE_KEYS = new Set([
15
+ 'appearance',
16
+ 'children',
17
+ 'id',
18
+ 'instance',
19
+ 'properties',
20
+ 'type',
21
+ ]);
5
22
  /**
6
23
  * Validates unknown input against the current semantic document format.
7
24
  */
8
25
  export function validateUIDocument(value) {
9
26
  const diagnostics = [];
10
- if (!isRecord(value)) {
11
- addDiagnostic(diagnostics, 'invalid-document', '$', 'Document must be an object.');
27
+ if (!isPlainRecord(value)) {
28
+ addUIDiagnostic(diagnostics, 'invalid-document', '$', 'Document must be an object.');
12
29
  return diagnostics;
13
30
  }
14
31
  validateKnownKeys(value, DOCUMENT_KEYS, '$', diagnostics);
15
32
  validateExactValue(value.kind, UI_DOCUMENT_KIND, '$.kind', diagnostics);
16
33
  validateFormatVersion(value.formatVersion, diagnostics);
17
34
  validateNonEmptyString(value.id, '$.id', 'Document id', diagnostics);
35
+ const assetKind = validateAssetKind(value.assetKind, diagnostics);
18
36
  const nodeIds = new Map();
19
37
  const nodeStack = new WeakSet();
20
38
  validateNode(value.root, '$.root', diagnostics, nodeIds, nodeStack);
39
+ validateUIAssetContract(value.contract, assetKind, '$.contract', diagnostics, new Set(nodeIds.keys()));
21
40
  return diagnostics;
22
41
  }
23
42
  /**
@@ -27,12 +46,12 @@ export function isUIDocument(value) {
27
46
  return validateUIDocument(value).length === 0;
28
47
  }
29
48
  function validateNode(value, path, diagnostics, nodeIds, nodeStack) {
30
- if (!isRecord(value)) {
31
- addDiagnostic(diagnostics, 'invalid-value', path, 'Node must be an object.');
49
+ if (!isPlainRecord(value)) {
50
+ addUIDiagnostic(diagnostics, 'invalid-value', path, 'Node must be an object.');
32
51
  return;
33
52
  }
34
53
  if (nodeStack.has(value)) {
35
- addDiagnostic(diagnostics, 'invalid-value', path, 'Node tree must not contain cycles.');
54
+ addUIDiagnostic(diagnostics, 'invalid-value', path, 'Node tree must not contain cycles.');
36
55
  return;
37
56
  }
38
57
  nodeStack.add(value);
@@ -40,29 +59,37 @@ function validateNode(value, path, diagnostics, nodeIds, nodeStack) {
40
59
  validateNodeId(value.id, `${path}.id`, diagnostics, nodeIds);
41
60
  validateNonEmptyString(value.type, `${path}.type`, 'Node type', diagnostics);
42
61
  validateProperties(value.properties, `${path}.properties`, diagnostics);
43
- if (!Array.isArray(value.children)) {
44
- addDiagnostic(diagnostics, 'invalid-value', `${path}.children`, 'Node children must be an array.');
62
+ if (value.appearance !== undefined) {
63
+ validateAssetReference(value.appearance, `${path}.appearance`, diagnostics);
45
64
  }
46
- else {
47
- for (let index = 0; index < value.children.length; index++) {
48
- validateNode(value.children[index], `${path}.children[${index}]`, diagnostics, nodeIds, nodeStack);
49
- }
65
+ if (value.instance !== undefined) {
66
+ validateUIComponentInstance(value.instance, `${path}.instance`, diagnostics, (child, childPath) => validateNode(child, childPath, diagnostics, nodeIds, nodeStack));
50
67
  }
68
+ validateChildren(value.children, `${path}.children`, diagnostics, nodeIds, nodeStack);
51
69
  nodeStack.delete(value);
52
70
  }
71
+ function validateChildren(value, path, diagnostics, nodeIds, nodeStack) {
72
+ if (!Array.isArray(value)) {
73
+ addUIDiagnostic(diagnostics, 'invalid-value', path, 'Node children must be an array.');
74
+ return;
75
+ }
76
+ for (let index = 0; index < value.length; index++) {
77
+ validateNode(value[index], `${path}[${index}]`, diagnostics, nodeIds, nodeStack);
78
+ }
79
+ }
53
80
  function validateNodeId(value, path, diagnostics, nodeIds) {
54
81
  if (!validateNonEmptyString(value, path, 'Node id', diagnostics))
55
82
  return;
56
83
  const firstPath = nodeIds.get(value);
57
84
  if (firstPath) {
58
- addDiagnostic(diagnostics, 'duplicate-node-id', path, `Node id "${value}" is already used at ${firstPath}.`);
85
+ addUIDiagnostic(diagnostics, 'duplicate-node-id', path, `Node id "${value}" is already used at ${firstPath}.`);
59
86
  return;
60
87
  }
61
88
  nodeIds.set(value, path);
62
89
  }
63
90
  function validateProperties(value, path, diagnostics) {
64
- if (!isRecord(value)) {
65
- addDiagnostic(diagnostics, 'invalid-value', path, 'Node properties must be an object.');
91
+ if (!isPlainRecord(value)) {
92
+ addUIDiagnostic(diagnostics, 'invalid-value', path, 'Node properties must be an object.');
66
93
  return;
67
94
  }
68
95
  const valueStack = new WeakSet();
@@ -70,74 +97,25 @@ function validateProperties(value, path, diagnostics) {
70
97
  validatePropertyValue(propertyValue, `${path}.${key}`, diagnostics, valueStack);
71
98
  }
72
99
  }
73
- function validatePropertyValue(value, path, diagnostics, valueStack) {
74
- if (typeof value === 'string' || typeof value === 'boolean')
75
- return;
76
- if (typeof value === 'number') {
77
- if (!Number.isFinite(value)) {
78
- addDiagnostic(diagnostics, 'invalid-property-value', path, 'Numeric property values must be finite.');
79
- }
80
- return;
81
- }
82
- if (!value || typeof value !== 'object') {
83
- addDiagnostic(diagnostics, 'invalid-property-value', path, 'Property value must be serializable and must not be null or undefined.');
84
- return;
85
- }
86
- if (valueStack.has(value)) {
87
- addDiagnostic(diagnostics, 'invalid-property-value', path, 'Property value must not contain cyclic references.');
88
- return;
100
+ function validateAssetKind(value, diagnostics) {
101
+ if (value === 'appearance' || value === 'component' || value === 'screen') {
102
+ return value;
89
103
  }
90
- valueStack.add(value);
91
- if (Array.isArray(value)) {
92
- for (let index = 0; index < value.length; index++) {
93
- validatePropertyValue(value[index], `${path}[${index}]`, diagnostics, valueStack);
94
- }
95
- }
96
- else if (isRecord(value)) {
97
- for (const [key, nestedValue] of Object.entries(value)) {
98
- validatePropertyValue(nestedValue, `${path}.${key}`, diagnostics, valueStack);
99
- }
100
- }
101
- else {
102
- addDiagnostic(diagnostics, 'invalid-property-value', path, 'Property object must be a plain string-keyed object.');
103
- }
104
- valueStack.delete(value);
104
+ addUIDiagnostic(diagnostics, 'invalid-asset-kind', '$.assetKind', 'Asset kind must be "screen", "component", or "appearance".');
105
+ return undefined;
105
106
  }
106
107
  function validateFormatVersion(value, diagnostics) {
107
108
  if (!Number.isInteger(value)) {
108
- addDiagnostic(diagnostics, 'invalid-value', '$.formatVersion', 'Format version must be an integer.');
109
+ addUIDiagnostic(diagnostics, 'invalid-value', '$.formatVersion', 'Format version must be an integer.');
109
110
  return;
110
111
  }
111
112
  if (value !== UI_DOCUMENT_FORMAT_VERSION) {
112
- addDiagnostic(diagnostics, 'unsupported-version', '$.formatVersion', `Format version ${String(value)} is not supported. Expected ${UI_DOCUMENT_FORMAT_VERSION}.`);
113
+ addUIDiagnostic(diagnostics, 'unsupported-version', '$.formatVersion', `Format version ${String(value)} is not supported. Expected ${UI_DOCUMENT_FORMAT_VERSION}.`);
113
114
  }
114
115
  }
115
116
  function validateExactValue(value, expected, path, diagnostics) {
116
117
  if (value !== expected) {
117
- addDiagnostic(diagnostics, 'invalid-value', path, `Value must be "${expected}".`);
118
- }
119
- }
120
- function validateNonEmptyString(value, path, label, diagnostics) {
121
- if (typeof value !== 'string' || value.trim().length === 0) {
122
- addDiagnostic(diagnostics, 'invalid-value', path, `${label} must be a non-empty string.`);
123
- return false;
118
+ addUIDiagnostic(diagnostics, 'invalid-value', path, `Value must be "${expected}".`);
124
119
  }
125
- return true;
126
- }
127
- function validateKnownKeys(value, knownKeys, path, diagnostics) {
128
- for (const key of Object.keys(value)) {
129
- if (knownKeys.has(key))
130
- continue;
131
- addDiagnostic(diagnostics, 'unexpected-property', `${path}.${key}`, `Property "${key}" is not part of the current document format.`);
132
- }
133
- }
134
- function isRecord(value) {
135
- if (typeof value !== 'object' || value === null || Array.isArray(value))
136
- return false;
137
- const prototype = Object.getPrototypeOf(value);
138
- return prototype === Object.prototype || prototype === null;
139
- }
140
- function addDiagnostic(diagnostics, code, path, message) {
141
- diagnostics.push({ code, severity: 'error', path, message });
142
120
  }
143
121
  //# sourceMappingURL=validateUIDocument.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validateUIDocument.js","sourceRoot":"","sources":["../../../src/kurot/validation/validateUIDocument.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAG3D,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AACvE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;AAEpE;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAChD,MAAM,WAAW,GAAmB,EAAE,CAAC;IACvC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,aAAa,CAAC,WAAW,EAAE,kBAAkB,EAAE,GAAG,EAAE,6BAA6B,CAAC,CAAC;QACnF,OAAO,WAAW,CAAC;IACpB,CAAC;IAED,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;IAC1D,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IACxE,qBAAqB,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACxD,sBAAsB,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;IAErE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,OAAO,EAAU,CAAC;IACxC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACpE,OAAO,WAAW,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc;IAC1C,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,YAAY,CACpB,KAAc,EACd,IAAY,EACZ,WAA2B,EAC3B,OAA4B,EAC5B,SAA0B;IAE1B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,aAAa,CAAC,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,yBAAyB,CAAC,CAAC;QAC7E,OAAO;IACR,CAAC;IACD,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,aAAa,CAAC,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,oCAAoC,CAAC,CAAC;QACxF,OAAO;IACR,CAAC;IAED,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACvD,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,IAAI,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC7D,sBAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IAC7E,kBAAkB,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,IAAI,aAAa,EAAE,WAAW,CAAC,CAAC;IAExE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,aAAa,CACZ,WAAW,EACX,eAAe,EACf,GAAG,IAAI,WAAW,EAClB,iCAAiC,CACjC,CAAC;IACH,CAAC;SAAM,CAAC;QACP,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YAC5D,YAAY,CACX,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EACrB,GAAG,IAAI,aAAa,KAAK,GAAG,EAC5B,WAAW,EACX,OAAO,EACP,SAAS,CACT,CAAC;QACH,CAAC;IACF,CAAC;IACD,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,cAAc,CACtB,KAAc,EACd,IAAY,EACZ,WAA2B,EAC3B,OAA4B;IAE5B,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC;QAAE,OAAO;IAEzE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,SAAS,EAAE,CAAC;QACf,aAAa,CACZ,WAAW,EACX,mBAAmB,EACnB,IAAI,EACJ,YAAY,KAAK,wBAAwB,SAAS,GAAG,CACrD,CAAC;QACF,OAAO;IACR,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,kBAAkB,CAC1B,KAAc,EACd,IAAY,EACZ,WAA2B;IAE3B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,aAAa,CAAC,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,oCAAoC,CAAC,CAAC;QACxF,OAAO;IACR,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,OAAO,EAAU,CAAC;IACzC,KAAK,MAAM,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,qBAAqB,CAAC,aAAa,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IACjF,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB,CAC7B,KAAc,EACd,IAAY,EACZ,WAA2B,EAC3B,UAA2B;IAE3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO;IACpE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,aAAa,CACZ,WAAW,EACX,wBAAwB,EACxB,IAAI,EACJ,yCAAyC,CACzC,CAAC;QACH,CAAC;QACD,OAAO;IACR,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACzC,aAAa,CACZ,WAAW,EACX,wBAAwB,EACxB,IAAI,EACJ,wEAAwE,CACxE,CAAC;QACF,OAAO;IACR,CAAC;IACD,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,aAAa,CACZ,WAAW,EACX,wBAAwB,EACxB,IAAI,EACJ,oDAAoD,CACpD,CAAC;QACF,OAAO;IACR,CAAC;IAED,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACtB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YACnD,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QACnF,CAAC;IACF,CAAC;SAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,qBAAqB,CAAC,WAAW,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QAC/E,CAAC;IACF,CAAC;SAAM,CAAC;QACP,aAAa,CACZ,WAAW,EACX,wBAAwB,EACxB,IAAI,EACJ,sDAAsD,CACtD,CAAC;IACH,CAAC;IACD,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc,EAAE,WAA2B;IACzE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,aAAa,CACZ,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,oCAAoC,CACpC,CAAC;QACF,OAAO;IACR,CAAC;IACD,IAAI,KAAK,KAAK,0BAA0B,EAAE,CAAC;QAC1C,aAAa,CACZ,WAAW,EACX,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,MAAM,CAAC,KAAK,CAAC,+BAA+B,0BAA0B,GAAG,CAC3F,CAAC;IACH,CAAC;AACF,CAAC;AAED,SAAS,kBAAkB,CAC1B,KAAc,EACd,QAAgB,EAChB,IAAY,EACZ,WAA2B;IAE3B,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxB,aAAa,CACZ,WAAW,EACX,eAAe,EACf,IAAI,EACJ,kBAAkB,QAAQ,IAAI,CAC9B,CAAC;IACH,CAAC;AACF,CAAC;AAED,SAAS,sBAAsB,CAC9B,KAAc,EACd,IAAY,EACZ,KAAa,EACb,WAA2B;IAE3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,aAAa,CAAC,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,KAAK,8BAA8B,CAAC,CAAC;QAC1F,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB,CACzB,KAA8B,EAC9B,SAA8B,EAC9B,IAAY,EACZ,WAA2B;IAE3B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QACjC,aAAa,CACZ,WAAW,EACX,qBAAqB,EACrB,GAAG,IAAI,IAAI,GAAG,EAAE,EAChB,aAAa,GAAG,+CAA+C,CAC/D,CAAC;IACH,CAAC;AACF,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtF,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAkB,CAAC;IAChE,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;AAC7D,CAAC;AAED,SAAS,aAAa,CACrB,WAA2B,EAC3B,IAAsB,EACtB,IAAY,EACZ,OAAe;IAEf,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAC9D,CAAC"}
1
+ {"version":3,"file":"validateUIDocument.js","sourceRoot":"","sources":["../../../src/kurot/validation/validateUIDocument.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAE3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EACN,eAAe,EACf,aAAa,EACb,sBAAsB,EACtB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,GACrB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC7B,WAAW;IACX,UAAU;IACV,eAAe;IACf,IAAI;IACJ,MAAM;IACN,MAAM;CACN,CAAC,CAAC;AACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACzB,YAAY;IACZ,UAAU;IACV,IAAI;IACJ,UAAU;IACV,YAAY;IACZ,MAAM;CACN,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAChD,MAAM,WAAW,GAAmB,EAAE,CAAC;IACvC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,eAAe,CAAC,WAAW,EAAE,kBAAkB,EAAE,GAAG,EAAE,6BAA6B,CAAC,CAAC;QACrF,OAAO,WAAW,CAAC;IACpB,CAAC;IAED,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;IAC1D,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IACxE,qBAAqB,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACxD,sBAAsB,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAElE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,OAAO,EAAU,CAAC;IACxC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACpE,uBAAuB,CACtB,KAAK,CAAC,QAAQ,EACd,SAAS,EACT,YAAY,EACZ,WAAW,EACX,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CACvB,CAAC;IACF,OAAO,WAAW,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc;IAC1C,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,YAAY,CACpB,KAAc,EACd,IAAY,EACZ,WAA2B,EAC3B,OAA4B,EAC5B,SAA0B;IAE1B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,eAAe,CAAC,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,yBAAyB,CAAC,CAAC;QAC/E,OAAO;IACR,CAAC;IACD,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,eAAe,CAAC,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,oCAAoC,CAAC,CAAC;QAC1F,OAAO;IACR,CAAC;IAED,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACvD,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,IAAI,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC7D,sBAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IAC7E,kBAAkB,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,IAAI,aAAa,EAAE,WAAW,CAAC,CAAC;IACxE,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,sBAAsB,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,IAAI,aAAa,EAAE,WAAW,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,2BAA2B,CAC1B,KAAK,CAAC,QAAQ,EACd,GAAG,IAAI,WAAW,EAClB,WAAW,EACX,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CACpB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,CAAC,CAChE,CAAC;IACH,CAAC;IACD,gBAAgB,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,IAAI,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACtF,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,gBAAgB,CACxB,KAAc,EACd,IAAY,EACZ,WAA2B,EAC3B,OAA4B,EAC5B,SAA0B;IAE1B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,eAAe,CAAC,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,iCAAiC,CAAC,CAAC;QACvF,OAAO;IACR,CAAC;IACD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACnD,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAClF,CAAC;AACF,CAAC;AAED,SAAS,cAAc,CACtB,KAAc,EACd,IAAY,EACZ,WAA2B,EAC3B,OAA4B;IAE5B,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC;QAAE,OAAO;IAEzE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,SAAS,EAAE,CAAC;QACf,eAAe,CACd,WAAW,EACX,mBAAmB,EACnB,IAAI,EACJ,YAAY,KAAK,wBAAwB,SAAS,GAAG,CACrD,CAAC;QACF,OAAO;IACR,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,kBAAkB,CAC1B,KAAc,EACd,IAAY,EACZ,WAA2B;IAE3B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,eAAe,CAAC,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,oCAAoC,CAAC,CAAC;QAC1F,OAAO;IACR,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,OAAO,EAAU,CAAC;IACzC,KAAK,MAAM,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,qBAAqB,CAAC,aAAa,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IACjF,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CACzB,KAAc,EACd,WAA2B;IAE3B,IAAI,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC3E,OAAO,KAAK,CAAC;IACd,CAAC;IACD,eAAe,CACd,WAAW,EACX,oBAAoB,EACpB,aAAa,EACb,4DAA4D,CAC5D,CAAC;IACF,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc,EAAE,WAA2B;IACzE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,eAAe,CACd,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,oCAAoC,CACpC,CAAC;QACF,OAAO;IACR,CAAC;IACD,IAAI,KAAK,KAAK,0BAA0B,EAAE,CAAC;QAC1C,eAAe,CACd,WAAW,EACX,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,MAAM,CAAC,KAAK,CAAC,+BAA+B,0BAA0B,GAAG,CAC3F,CAAC;IACH,CAAC;AACF,CAAC;AAED,SAAS,kBAAkB,CAC1B,KAAc,EACd,QAAgB,EAChB,IAAY,EACZ,WAA2B;IAE3B,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxB,eAAe,CACd,WAAW,EACX,eAAe,EACf,IAAI,EACJ,kBAAkB,QAAQ,IAAI,CAC9B,CAAC;IACH,CAAC;AACF,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { UIDiagnostic, UIDiagnosticCode } from './UIDiagnostic.js';
2
+ /**
3
+ * Adds one stable error diagnostic to a mutable validation result.
4
+ */
5
+ export declare function addUIDiagnostic(diagnostics: UIDiagnostic[], code: UIDiagnosticCode, path: string, message: string): void;
6
+ /**
7
+ * Returns whether a value is a plain string-keyed object.
8
+ */
9
+ export declare function isPlainRecord(value: unknown): value is Record<string, unknown>;
10
+ /**
11
+ * Reports object keys that are outside an exact semantic shape.
12
+ */
13
+ export declare function validateKnownKeys(value: Record<string, unknown>, knownKeys: ReadonlySet<string>, path: string, diagnostics: UIDiagnostic[]): void;
14
+ /**
15
+ * Validates a required non-empty semantic identifier.
16
+ */
17
+ export declare function validateNonEmptyString(value: unknown, path: string, label: string, diagnostics: UIDiagnostic[]): value is string;
18
+ /**
19
+ * Validates one recursive serializable property value and tagged references.
20
+ */
21
+ export declare function validatePropertyValue(value: unknown, path: string, diagnostics: UIDiagnostic[], valueStack?: WeakSet<object>): void;
22
+ /**
23
+ * Validates a stable reference to another editable UI asset.
24
+ */
25
+ export declare function validateAssetReference(value: unknown, path: string, diagnostics: UIDiagnostic[]): void;
26
+ //# sourceMappingURL=validationHelpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validationHelpers.d.ts","sourceRoot":"","sources":["../../../src/kurot/validation/validationHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAiBxE;;GAEG;AACH,wBAAgB,eAAe,CAC9B,WAAW,EAAE,YAAY,EAAE,EAC3B,IAAI,EAAE,gBAAgB,EACtB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACb,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAI9E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,EAC9B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,YAAY,EAAE,GACzB,IAAI,CAUN;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACrC,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,YAAY,EAAE,GACzB,KAAK,IAAI,MAAM,CAMjB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACpC,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,YAAY,EAAE,EAC3B,UAAU,GAAE,OAAO,CAAC,MAAM,CAAiB,GACzC,IAAI,CAmDN;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACrC,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,YAAY,EAAE,GACzB,IAAI,CAeN"}
@@ -0,0 +1,120 @@
1
+ const RESOURCE_TYPES = new Set([
2
+ 'animation',
3
+ 'font',
4
+ 'image',
5
+ 'spine',
6
+ 'sprite-frame',
7
+ ]);
8
+ const TOKEN_TYPES = new Set([
9
+ 'color',
10
+ 'number',
11
+ 'spacing',
12
+ 'string',
13
+ 'typography',
14
+ ]);
15
+ /**
16
+ * Adds one stable error diagnostic to a mutable validation result.
17
+ */
18
+ export function addUIDiagnostic(diagnostics, code, path, message) {
19
+ diagnostics.push({ code, severity: 'error', path, message });
20
+ }
21
+ /**
22
+ * Returns whether a value is a plain string-keyed object.
23
+ */
24
+ export function isPlainRecord(value) {
25
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
26
+ return false;
27
+ const prototype = Object.getPrototypeOf(value);
28
+ return prototype === Object.prototype || prototype === null;
29
+ }
30
+ /**
31
+ * Reports object keys that are outside an exact semantic shape.
32
+ */
33
+ export function validateKnownKeys(value, knownKeys, path, diagnostics) {
34
+ for (const key of Object.keys(value)) {
35
+ if (knownKeys.has(key))
36
+ continue;
37
+ addUIDiagnostic(diagnostics, 'unexpected-property', `${path}.${key}`, `Property "${key}" is not part of the current document format.`);
38
+ }
39
+ }
40
+ /**
41
+ * Validates a required non-empty semantic identifier.
42
+ */
43
+ export function validateNonEmptyString(value, path, label, diagnostics) {
44
+ if (typeof value !== 'string' || value.trim().length === 0) {
45
+ addUIDiagnostic(diagnostics, 'invalid-value', path, `${label} must be a non-empty string.`);
46
+ return false;
47
+ }
48
+ return true;
49
+ }
50
+ /**
51
+ * Validates one recursive serializable property value and tagged references.
52
+ */
53
+ export function validatePropertyValue(value, path, diagnostics, valueStack = new WeakSet()) {
54
+ if (typeof value === 'string' || typeof value === 'boolean')
55
+ return;
56
+ if (typeof value === 'number') {
57
+ if (!Number.isFinite(value)) {
58
+ addUIDiagnostic(diagnostics, 'invalid-property-value', path, 'Numeric property values must be finite.');
59
+ }
60
+ return;
61
+ }
62
+ if (!value || typeof value !== 'object') {
63
+ addUIDiagnostic(diagnostics, 'invalid-property-value', path, 'Property value must be serializable and must not be null or undefined.');
64
+ return;
65
+ }
66
+ if (valueStack.has(value)) {
67
+ addUIDiagnostic(diagnostics, 'invalid-property-value', path, 'Property value must not contain cyclic references.');
68
+ return;
69
+ }
70
+ valueStack.add(value);
71
+ if (Array.isArray(value)) {
72
+ for (let index = 0; index < value.length; index++) {
73
+ validatePropertyValue(value[index], `${path}[${index}]`, diagnostics, valueStack);
74
+ }
75
+ }
76
+ else if (isPlainRecord(value)) {
77
+ validateTaggedReference(value, path, diagnostics);
78
+ for (const [key, nestedValue] of Object.entries(value)) {
79
+ validatePropertyValue(nestedValue, `${path}.${key}`, diagnostics, valueStack);
80
+ }
81
+ }
82
+ else {
83
+ addUIDiagnostic(diagnostics, 'invalid-property-value', path, 'Property object must be a plain string-keyed object.');
84
+ }
85
+ valueStack.delete(value);
86
+ }
87
+ /**
88
+ * Validates a stable reference to another editable UI asset.
89
+ */
90
+ export function validateAssetReference(value, path, diagnostics) {
91
+ if (!isPlainRecord(value)) {
92
+ addUIDiagnostic(diagnostics, 'invalid-asset-reference', path, 'Asset reference must be an object.');
93
+ return;
94
+ }
95
+ validateKnownKeys(value, new Set(['assetId', 'kind']), path, diagnostics);
96
+ if (value.kind !== 'asset') {
97
+ addUIDiagnostic(diagnostics, 'invalid-asset-reference', `${path}.kind`, 'Asset reference kind must be "asset".');
98
+ }
99
+ validateNonEmptyString(value.assetId, `${path}.assetId`, 'Asset id', diagnostics);
100
+ }
101
+ function validateTaggedReference(value, path, diagnostics) {
102
+ if (value.kind === 'resource') {
103
+ validateKnownKeys(value, new Set(['key', 'kind', 'resourceType']), path, diagnostics);
104
+ validateNonEmptyString(value.key, `${path}.key`, 'Resource key', diagnostics);
105
+ if (!RESOURCE_TYPES.has(String(value.resourceType))) {
106
+ addUIDiagnostic(diagnostics, 'invalid-resource-reference', `${path}.resourceType`, `Unsupported resource type "${String(value.resourceType)}".`);
107
+ }
108
+ }
109
+ else if (value.kind === 'token') {
110
+ validateKnownKeys(value, new Set(['key', 'kind', 'tokenType']), path, diagnostics);
111
+ validateNonEmptyString(value.key, `${path}.key`, 'Token key', diagnostics);
112
+ if (!TOKEN_TYPES.has(String(value.tokenType))) {
113
+ addUIDiagnostic(diagnostics, 'invalid-token-reference', `${path}.tokenType`, `Unsupported token type "${String(value.tokenType)}".`);
114
+ }
115
+ }
116
+ else if (value.kind === 'asset') {
117
+ validateAssetReference(value, path, diagnostics);
118
+ }
119
+ }
120
+ //# sourceMappingURL=validationHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validationHelpers.js","sourceRoot":"","sources":["../../../src/kurot/validation/validationHelpers.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * Latest semantic document format understood by this package.
3
3
  */
4
- export declare const UI_DOCUMENT_FORMAT_VERSION = 1;
4
+ export declare const UI_DOCUMENT_FORMAT_VERSION = 2;
5
5
  //# sourceMappingURL=version.d.ts.map
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * Latest semantic document format understood by this package.
3
3
  */
4
- export const UI_DOCUMENT_FORMAT_VERSION = 1;
4
+ export const UI_DOCUMENT_FORMAT_VERSION = 2;
5
5
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kurot/ui-document",
3
- "version": "0.1.0",
3
+ "version": "0.3.1",
4
4
  "description": "Headless semantic document model for Kurot UI tooling, editors, CLI workflows, and AI agents",
5
5
  "author": "Kelvin <kyia.x52@gmail.com>",
6
6
  "license": "MIT",
@@ -22,7 +22,7 @@
22
22
  "build": "tsc --build",
23
23
  "dev": "tsc --watch",
24
24
  "clean": "rm -rf dist",
25
- "test": "vitest run",
25
+ "test": "tsc --project tsconfig.test.json && vitest run",
26
26
  "test:watch": "vitest",
27
27
  "prepublishOnly": "npm run clean && npm run build"
28
28
  },