@kurot/ui-document 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +112 -12
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/kurot/assets/UIAssetRegistry.d.ts +47 -0
- package/dist/kurot/assets/UIAssetRegistry.d.ts.map +1 -0
- package/dist/kurot/assets/UIAssetRegistry.js +139 -0
- package/dist/kurot/assets/UIAssetRegistry.js.map +1 -0
- package/dist/kurot/assets/UIProjectDefinition.d.ts +33 -0
- package/dist/kurot/assets/UIProjectDefinition.d.ts.map +1 -0
- package/dist/kurot/assets/UIProjectDefinition.js +2 -0
- package/dist/kurot/assets/UIProjectDefinition.js.map +1 -0
- package/dist/kurot/assets/assetTraversal.d.ts +30 -0
- package/dist/kurot/assets/assetTraversal.d.ts.map +1 -0
- package/dist/kurot/assets/assetTraversal.js +96 -0
- package/dist/kurot/assets/assetTraversal.js.map +1 -0
- package/dist/kurot/assets/index.d.ts +4 -0
- package/dist/kurot/assets/index.d.ts.map +1 -0
- package/dist/kurot/assets/index.js +3 -0
- package/dist/kurot/assets/index.js.map +1 -0
- package/dist/kurot/assets/validateUIAssetInstances.d.ts +9 -0
- package/dist/kurot/assets/validateUIAssetInstances.d.ts.map +1 -0
- package/dist/kurot/assets/validateUIAssetInstances.js +114 -0
- package/dist/kurot/assets/validateUIAssetInstances.js.map +1 -0
- package/dist/kurot/assets/validateUIAssetOverrides.d.ts +8 -0
- package/dist/kurot/assets/validateUIAssetOverrides.d.ts.map +1 -0
- package/dist/kurot/assets/validateUIAssetOverrides.js +55 -0
- package/dist/kurot/assets/validateUIAssetOverrides.js.map +1 -0
- package/dist/kurot/assets/validateUIAssetRegistry.d.ts +8 -0
- package/dist/kurot/assets/validateUIAssetRegistry.d.ts.map +1 -0
- package/dist/kurot/assets/validateUIAssetRegistry.js +79 -0
- package/dist/kurot/assets/validateUIAssetRegistry.js.map +1 -0
- package/dist/kurot/assets/validateUIProjectReferences.d.ts +8 -0
- package/dist/kurot/assets/validateUIProjectReferences.d.ts.map +1 -0
- package/dist/kurot/assets/validateUIProjectReferences.js +50 -0
- package/dist/kurot/assets/validateUIProjectReferences.js.map +1 -0
- package/dist/kurot/catalog/properties/basic-component-properties.d.ts.map +1 -1
- package/dist/kurot/catalog/properties/basic-component-properties.js +8 -10
- package/dist/kurot/catalog/properties/basic-component-properties.js.map +1 -1
- package/dist/kurot/catalog/properties/foundation-properties.d.ts.map +1 -1
- package/dist/kurot/catalog/properties/foundation-properties.js +6 -17
- package/dist/kurot/catalog/properties/foundation-properties.js.map +1 -1
- package/dist/kurot/document/create.d.ts +20 -0
- package/dist/kurot/document/create.d.ts.map +1 -1
- package/dist/kurot/document/create.js +10 -0
- package/dist/kurot/document/create.js.map +1 -1
- package/dist/kurot/document/createAssetContract.d.ts +39 -0
- package/dist/kurot/document/createAssetContract.d.ts.map +1 -0
- package/dist/kurot/document/createAssetContract.js +17 -0
- package/dist/kurot/document/createAssetContract.js.map +1 -0
- package/dist/kurot/document/createComponentInstance.d.ts +34 -0
- package/dist/kurot/document/createComponentInstance.d.ts.map +1 -0
- package/dist/kurot/document/createComponentInstance.js +13 -0
- package/dist/kurot/document/createComponentInstance.js.map +1 -0
- package/dist/kurot/document/createReferences.d.ts +14 -0
- package/dist/kurot/document/createReferences.d.ts.map +1 -0
- package/dist/kurot/document/createReferences.js +29 -0
- package/dist/kurot/document/createReferences.js.map +1 -0
- package/dist/kurot/document/index.d.ts +5 -0
- package/dist/kurot/document/index.d.ts.map +1 -1
- package/dist/kurot/document/index.js +3 -0
- package/dist/kurot/document/index.js.map +1 -1
- package/dist/kurot/document/query.d.ts.map +1 -1
- package/dist/kurot/document/query.js +16 -0
- package/dist/kurot/document/query.js.map +1 -1
- package/dist/kurot/editing/UIDocumentHistory.d.ts +41 -0
- package/dist/kurot/editing/UIDocumentHistory.d.ts.map +1 -0
- package/dist/kurot/editing/UIDocumentHistory.js +95 -0
- package/dist/kurot/editing/UIDocumentHistory.js.map +1 -0
- package/dist/kurot/editing/UIEditError.d.ts +24 -0
- package/dist/kurot/editing/UIEditError.d.ts.map +1 -0
- package/dist/kurot/editing/UIEditError.js +25 -0
- package/dist/kurot/editing/UIEditError.js.map +1 -0
- package/dist/kurot/editing/UIOperation.d.ts +134 -0
- package/dist/kurot/editing/UIOperation.d.ts.map +1 -0
- package/dist/kurot/editing/UIOperation.js +2 -0
- package/dist/kurot/editing/UIOperation.js.map +1 -0
- package/dist/kurot/editing/UITransaction.d.ts +69 -0
- package/dist/kurot/editing/UITransaction.d.ts.map +1 -0
- package/dist/kurot/editing/UITransaction.js +2 -0
- package/dist/kurot/editing/UITransaction.js.map +1 -0
- package/dist/kurot/editing/applyContractOperation.d.ts +11 -0
- package/dist/kurot/editing/applyContractOperation.d.ts.map +1 -0
- package/dist/kurot/editing/applyContractOperation.js +76 -0
- package/dist/kurot/editing/applyContractOperation.js.map +1 -0
- package/dist/kurot/editing/applyInstanceOperation.d.ts +11 -0
- package/dist/kurot/editing/applyInstanceOperation.d.ts.map +1 -0
- package/dist/kurot/editing/applyInstanceOperation.js +150 -0
- package/dist/kurot/editing/applyInstanceOperation.js.map +1 -0
- package/dist/kurot/editing/applyNodeOperation.d.ts +11 -0
- package/dist/kurot/editing/applyNodeOperation.d.ts.map +1 -0
- package/dist/kurot/editing/applyNodeOperation.js +133 -0
- package/dist/kurot/editing/applyNodeOperation.js.map +1 -0
- package/dist/kurot/editing/applyUIOperation.d.ts +11 -0
- package/dist/kurot/editing/applyUIOperation.d.ts.map +1 -0
- package/dist/kurot/editing/applyUIOperation.js +46 -0
- package/dist/kurot/editing/applyUIOperation.js.map +1 -0
- package/dist/kurot/editing/applyUITransaction.d.ts +6 -0
- package/dist/kurot/editing/applyUITransaction.d.ts.map +1 -0
- package/dist/kurot/editing/applyUITransaction.js +64 -0
- package/dist/kurot/editing/applyUITransaction.js.map +1 -0
- package/dist/kurot/editing/diffUIDocuments.d.ts +35 -0
- package/dist/kurot/editing/diffUIDocuments.d.ts.map +1 -0
- package/dist/kurot/editing/diffUIDocuments.js +137 -0
- package/dist/kurot/editing/diffUIDocuments.js.map +1 -0
- package/dist/kurot/editing/editHelpers.d.ts +44 -0
- package/dist/kurot/editing/editHelpers.d.ts.map +1 -0
- package/dist/kurot/editing/editHelpers.js +90 -0
- package/dist/kurot/editing/editHelpers.js.map +1 -0
- package/dist/kurot/editing/index.d.ts +10 -0
- package/dist/kurot/editing/index.d.ts.map +1 -0
- package/dist/kurot/editing/index.js +6 -0
- package/dist/kurot/editing/index.js.map +1 -0
- package/dist/kurot/editing/nodeTree.d.ts +40 -0
- package/dist/kurot/editing/nodeTree.d.ts.map +1 -0
- package/dist/kurot/editing/nodeTree.js +156 -0
- package/dist/kurot/editing/nodeTree.js.map +1 -0
- package/dist/kurot/model/UIAssetContract.d.ts +139 -0
- package/dist/kurot/model/UIAssetContract.d.ts.map +1 -0
- package/dist/kurot/model/UIAssetContract.js +2 -0
- package/dist/kurot/model/UIAssetContract.js.map +1 -0
- package/dist/kurot/model/UIAssetKind.d.ts +5 -0
- package/dist/kurot/model/UIAssetKind.d.ts.map +1 -0
- package/dist/kurot/model/UIAssetKind.js +2 -0
- package/dist/kurot/model/UIAssetKind.js.map +1 -0
- package/dist/kurot/model/UIComponentInstance.d.ts +46 -0
- package/dist/kurot/model/UIComponentInstance.d.ts.map +1 -0
- package/dist/kurot/model/UIComponentInstance.js +2 -0
- package/dist/kurot/model/UIComponentInstance.js.map +1 -0
- package/dist/kurot/model/UIDocument.d.ts +10 -0
- package/dist/kurot/model/UIDocument.d.ts.map +1 -1
- package/dist/kurot/model/UIDocument.js.map +1 -1
- package/dist/kurot/model/UINode.d.ts +10 -0
- package/dist/kurot/model/UINode.d.ts.map +1 -1
- package/dist/kurot/model/UIReference.d.ts +57 -0
- package/dist/kurot/model/UIReference.d.ts.map +1 -0
- package/dist/kurot/model/UIReference.js +2 -0
- package/dist/kurot/model/UIReference.js.map +1 -0
- package/dist/kurot/model/index.d.ts +4 -0
- package/dist/kurot/model/index.d.ts.map +1 -1
- package/dist/kurot/model/index.js.map +1 -1
- package/dist/kurot/schema/UIComponentDefinition.d.ts +11 -2
- package/dist/kurot/schema/UIComponentDefinition.d.ts.map +1 -1
- package/dist/kurot/schema/UIComponentRegistry.js +6 -0
- package/dist/kurot/schema/UIComponentRegistry.js.map +1 -1
- package/dist/kurot/schema/index.d.ts +1 -0
- package/dist/kurot/schema/index.d.ts.map +1 -1
- package/dist/kurot/schema/index.js +1 -0
- package/dist/kurot/schema/index.js.map +1 -1
- package/dist/kurot/schema/matchesUIPropertyDefinition.d.ts +7 -0
- package/dist/kurot/schema/matchesUIPropertyDefinition.d.ts.map +1 -0
- package/dist/kurot/schema/matchesUIPropertyDefinition.js +65 -0
- package/dist/kurot/schema/matchesUIPropertyDefinition.js.map +1 -0
- package/dist/kurot/schema/validateComponentDefinition.d.ts.map +1 -1
- package/dist/kurot/schema/validateComponentDefinition.js +40 -1
- package/dist/kurot/schema/validateComponentDefinition.js.map +1 -1
- package/dist/kurot/schema/validateUIDocumentComponents.d.ts +1 -0
- package/dist/kurot/schema/validateUIDocumentComponents.d.ts.map +1 -1
- package/dist/kurot/schema/validateUIDocumentComponents.js +12 -39
- package/dist/kurot/schema/validateUIDocumentComponents.js.map +1 -1
- package/dist/kurot/serialization/json.d.ts.map +1 -1
- package/dist/kurot/serialization/json.js +126 -0
- package/dist/kurot/serialization/json.js.map +1 -1
- package/dist/kurot/validation/UIDiagnostic.d.ts +1 -1
- package/dist/kurot/validation/UIDiagnostic.d.ts.map +1 -1
- package/dist/kurot/validation/validateUIAssetContract.d.ts +7 -0
- package/dist/kurot/validation/validateUIAssetContract.d.ts.map +1 -0
- package/dist/kurot/validation/validateUIAssetContract.js +154 -0
- package/dist/kurot/validation/validateUIAssetContract.js.map +1 -0
- package/dist/kurot/validation/validateUIAssetModes.d.ts +6 -0
- package/dist/kurot/validation/validateUIAssetModes.d.ts.map +1 -0
- package/dist/kurot/validation/validateUIAssetModes.js +57 -0
- package/dist/kurot/validation/validateUIAssetModes.js.map +1 -0
- package/dist/kurot/validation/validateUIComponentInstance.d.ts +6 -0
- package/dist/kurot/validation/validateUIComponentInstance.d.ts.map +1 -0
- package/dist/kurot/validation/validateUIComponentInstance.js +77 -0
- package/dist/kurot/validation/validateUIComponentInstance.js.map +1 -0
- package/dist/kurot/validation/validateUIDocument.d.ts.map +1 -1
- package/dist/kurot/validation/validateUIDocument.js +51 -73
- package/dist/kurot/validation/validateUIDocument.js.map +1 -1
- package/dist/kurot/validation/validationHelpers.d.ts +26 -0
- package/dist/kurot/validation/validationHelpers.d.ts.map +1 -0
- package/dist/kurot/validation/validationHelpers.js +120 -0
- package/dist/kurot/validation/validationHelpers.js.map +1 -0
- package/dist/kurot/version.d.ts +1 -1
- package/dist/kurot/version.js +1 -1
- 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":"
|
|
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
|
-
|
|
4
|
-
|
|
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 (!
|
|
11
|
-
|
|
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 (!
|
|
31
|
-
|
|
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
|
-
|
|
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 (
|
|
44
|
-
|
|
62
|
+
if (value.appearance !== undefined) {
|
|
63
|
+
validateAssetReference(value.appearance, `${path}.appearance`, diagnostics);
|
|
45
64
|
}
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
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 (!
|
|
65
|
-
|
|
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
|
|
74
|
-
if (
|
|
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
|
-
|
|
91
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"validateUIDocument.js","sourceRoot":"","sources":["../../../src/kurot/validation/validateUIDocument.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"AAEA,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC9B,WAAW;IACX,MAAM;IACN,OAAO;IACP,OAAO;IACP,cAAc;CACd,CAAC,CAAC;AACH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC3B,OAAO;IACP,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,YAAY;CACZ,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,eAAe,CAC9B,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;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC3C,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;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAChC,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,eAAe,CACd,WAAW,EACX,qBAAqB,EACrB,GAAG,IAAI,IAAI,GAAG,EAAE,EAChB,aAAa,GAAG,+CAA+C,CAC/D,CAAC;IACH,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACrC,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,eAAe,CAAC,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,KAAK,8BAA8B,CAAC,CAAC;QAC5F,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACpC,KAAc,EACd,IAAY,EACZ,WAA2B,EAC3B,aAA8B,IAAI,OAAO,EAAE;IAE3C,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,eAAe,CACd,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,eAAe,CACd,WAAW,EACX,wBAAwB,EACxB,IAAI,EACJ,wEAAwE,CACxE,CAAC;QACF,OAAO;IACR,CAAC;IACD,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,eAAe,CACd,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,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,uBAAuB,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAClD,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,eAAe,CACd,WAAW,EACX,wBAAwB,EACxB,IAAI,EACJ,sDAAsD,CACtD,CAAC;IACH,CAAC;IACD,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACrC,KAAc,EACd,IAAY,EACZ,WAA2B;IAE3B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,eAAe,CAAC,WAAW,EAAE,yBAAyB,EAAE,IAAI,EAAE,oCAAoC,CAAC,CAAC;QACpG,OAAO;IACR,CAAC;IACD,iBAAiB,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAC1E,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,eAAe,CACd,WAAW,EACX,yBAAyB,EACzB,GAAG,IAAI,OAAO,EACd,uCAAuC,CACvC,CAAC;IACH,CAAC;IACD,sBAAsB,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,uBAAuB,CAC/B,KAA8B,EAC9B,IAAY,EACZ,WAA2B;IAE3B,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,iBAAiB,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QACtF,sBAAsB,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,MAAM,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;QAC9E,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YACrD,eAAe,CACd,WAAW,EACX,4BAA4B,EAC5B,GAAG,IAAI,eAAe,EACtB,8BAA8B,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAC5D,CAAC;QACH,CAAC;IACF,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACnC,iBAAiB,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QACnF,sBAAsB,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAC3E,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YAC/C,eAAe,CACd,WAAW,EACX,yBAAyB,EACzB,GAAG,IAAI,YAAY,EACnB,2BAA2B,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CACtD,CAAC;QACH,CAAC;IACF,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACnC,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAClD,CAAC;AACF,CAAC"}
|
package/dist/kurot/version.d.ts
CHANGED
package/dist/kurot/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kurot/ui-document",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
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
|
},
|