@kurot/ui-document 0.5.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +9 -12
  2. package/dist/kurot/document/create-asset-contract.d.ts +4 -0
  3. package/dist/kurot/document/create-asset-contract.d.ts.map +1 -1
  4. package/dist/kurot/document/create-asset-contract.js +1 -0
  5. package/dist/kurot/document/create-asset-contract.js.map +1 -1
  6. package/dist/kurot/model/UIAssetContract.d.ts +4 -0
  7. package/dist/kurot/model/UIAssetContract.d.ts.map +1 -1
  8. package/dist/kurot/model/UIDocument.d.ts +1 -1
  9. package/dist/kurot/model/index.d.ts +1 -0
  10. package/dist/kurot/model/index.d.ts.map +1 -1
  11. package/dist/kurot/model/index.js +1 -0
  12. package/dist/kurot/model/index.js.map +1 -1
  13. package/dist/kurot/serialization/UIDocumentParseError.d.ts +1 -1
  14. package/dist/kurot/serialization/UIDocumentParseError.js +1 -1
  15. package/dist/kurot/serialization/index.d.ts +1 -1
  16. package/dist/kurot/serialization/index.d.ts.map +1 -1
  17. package/dist/kurot/serialization/index.js +1 -1
  18. package/dist/kurot/serialization/index.js.map +1 -1
  19. package/dist/kurot/serialization/xml/xml-contract-parser.d.ts +7 -0
  20. package/dist/kurot/serialization/xml/xml-contract-parser.d.ts.map +1 -0
  21. package/dist/kurot/serialization/xml/xml-contract-parser.js +200 -0
  22. package/dist/kurot/serialization/xml/xml-contract-parser.js.map +1 -0
  23. package/dist/kurot/serialization/xml/xml-contract-serializer.d.ts +6 -0
  24. package/dist/kurot/serialization/xml/xml-contract-serializer.d.ts.map +1 -0
  25. package/dist/kurot/serialization/xml/xml-contract-serializer.js +111 -0
  26. package/dist/kurot/serialization/xml/xml-contract-serializer.js.map +1 -0
  27. package/dist/kurot/serialization/xml/xml-node.d.ts +18 -0
  28. package/dist/kurot/serialization/xml/xml-node.d.ts.map +1 -0
  29. package/dist/kurot/serialization/xml/xml-node.js +230 -0
  30. package/dist/kurot/serialization/xml/xml-node.js.map +1 -0
  31. package/dist/kurot/serialization/xml/xml-parser.d.ts +10 -0
  32. package/dist/kurot/serialization/xml/xml-parser.d.ts.map +1 -0
  33. package/dist/kurot/serialization/xml/xml-parser.js +134 -0
  34. package/dist/kurot/serialization/xml/xml-parser.js.map +1 -0
  35. package/dist/kurot/serialization/xml/xml-values.d.ts +23 -0
  36. package/dist/kurot/serialization/xml/xml-values.d.ts.map +1 -0
  37. package/dist/kurot/serialization/xml/xml-values.js +133 -0
  38. package/dist/kurot/serialization/xml/xml-values.js.map +1 -0
  39. package/dist/kurot/serialization/xml.d.ts +14 -0
  40. package/dist/kurot/serialization/xml.d.ts.map +1 -0
  41. package/dist/kurot/serialization/xml.js +164 -0
  42. package/dist/kurot/serialization/xml.js.map +1 -0
  43. package/dist/kurot/validation/UIDiagnostic.d.ts +1 -1
  44. package/dist/kurot/validation/UIDiagnostic.d.ts.map +1 -1
  45. package/dist/kurot/validation/validateUIAssetContract.d.ts.map +1 -1
  46. package/dist/kurot/validation/validateUIAssetContract.js +7 -0
  47. package/dist/kurot/validation/validateUIAssetContract.js.map +1 -1
  48. package/package.json +1 -1
  49. package/dist/kurot/serialization/json.d.ts +0 -10
  50. package/dist/kurot/serialization/json.d.ts.map +0 -1
  51. package/dist/kurot/serialization/json.js +0 -234
  52. package/dist/kurot/serialization/json.js.map +0 -1
@@ -0,0 +1,230 @@
1
+ import { compareStrings } from '../../shared/strings.js';
2
+ import { decodeXMLValue, encodeXMLValue, escapeXML, parseComplexValue, serializeComplexValue, } from './xml-values.js';
3
+ const RESERVED_ATTRIBUTES = new Set(['appearance', 'appearanceVariant', 'id', 'xmlns']);
4
+ /**
5
+ * Collects custom component namespace prefixes used by a node tree.
6
+ */
7
+ export function collectNodePrefixes(node, prefixes) {
8
+ const separator = node.type.indexOf('.');
9
+ const prefix = separator === -1 ? 'kui' : node.type.slice(0, separator);
10
+ if (prefix !== 'kui')
11
+ prefixes.add(prefix);
12
+ for (const child of node.children) {
13
+ collectNodePrefixes(child, prefixes);
14
+ }
15
+ if (node.instance) {
16
+ for (const nodes of Object.values(node.instance.slots)) {
17
+ for (const child of nodes) {
18
+ collectNodePrefixes(child, prefixes);
19
+ }
20
+ }
21
+ }
22
+ }
23
+ /**
24
+ * Serializes one semantic node using component tags.
25
+ */
26
+ export function serializeNode(node, depth) {
27
+ const indent = ' '.repeat(depth);
28
+ const tag = componentTag(node.type);
29
+ const attributes = [`id="${escapeXML(node.id)}"`];
30
+ const complex = [];
31
+ if (node.appearance) {
32
+ attributes.push(`appearance="${escapeXML(node.appearance.assetId)}"`);
33
+ if (node.appearance.variant !== undefined) {
34
+ attributes.push(`appearanceVariant="${escapeXML(node.appearance.variant)}"`);
35
+ }
36
+ }
37
+ for (const [name, value] of sortedEntries(node.properties)) {
38
+ const encoded = encodeXMLValue(value);
39
+ if (encoded === undefined || RESERVED_ATTRIBUTES.has(name) || name.startsWith('xmlns')) {
40
+ complex.push([name, value]);
41
+ }
42
+ else {
43
+ attributes.push(`${name}="${escapeXML(encoded)}"`);
44
+ }
45
+ }
46
+ if (complex.length === 0 && node.instance === undefined && node.children.length === 0) {
47
+ return [`${indent}<${tag} ${attributes.join(' ')} />`];
48
+ }
49
+ const lines = [`${indent}<${tag} ${attributes.join(' ')}>`];
50
+ if (complex.length > 0) {
51
+ lines.push(`${indent} <properties>`);
52
+ for (const [name, value] of complex) {
53
+ const encoded = encodeXMLValue(value);
54
+ if (encoded !== undefined) {
55
+ lines.push(`${indent} <property name="${escapeXML(name)}" value="${escapeXML(encoded)}" />`);
56
+ }
57
+ else {
58
+ lines.push(`${indent} <property name="${escapeXML(name)}">`);
59
+ lines.push(...serializeComplexValue(value, depth + 3));
60
+ lines.push(`${indent} </property>`);
61
+ }
62
+ }
63
+ lines.push(`${indent} </properties>`);
64
+ }
65
+ if (node.instance)
66
+ lines.push(...serializeInstance(node.instance, depth + 1));
67
+ for (const child of node.children) {
68
+ lines.push(...serializeNode(child, depth + 1));
69
+ }
70
+ lines.push(`${indent}</${tag}>`);
71
+ return lines;
72
+ }
73
+ /**
74
+ * Parses one component element into a semantic node.
75
+ */
76
+ export function parseNode(element, namespaces) {
77
+ const id = requiredAttribute(element, 'id');
78
+ const properties = {};
79
+ let appearance;
80
+ let instance;
81
+ const children = [];
82
+ const appearanceId = element.attributes.appearance;
83
+ if (appearanceId !== undefined) {
84
+ appearance = {
85
+ kind: 'asset',
86
+ assetId: appearanceId,
87
+ ...(element.attributes.appearanceVariant === undefined
88
+ ? {}
89
+ : { variant: element.attributes.appearanceVariant }),
90
+ };
91
+ }
92
+ for (const [name, value] of Object.entries(element.attributes)) {
93
+ if (RESERVED_ATTRIBUTES.has(name) || name.startsWith('xmlns:'))
94
+ continue;
95
+ properties[name] = decodeXMLValue(value);
96
+ }
97
+ for (const child of element.children) {
98
+ if (child.name === 'properties') {
99
+ parseProperties(child, properties);
100
+ }
101
+ else if (child.name === 'instance') {
102
+ if (instance !== undefined)
103
+ throw new Error(`<${element.name}> contains duplicate <instance> metadata.`);
104
+ instance = parseInstance(child, namespaces);
105
+ }
106
+ else {
107
+ children.push(parseNode(child, namespaces));
108
+ }
109
+ }
110
+ return {
111
+ id,
112
+ type: componentType(element.name, namespaces),
113
+ properties,
114
+ ...(instance === undefined ? {} : { instance }),
115
+ ...(appearance === undefined ? {} : { appearance }),
116
+ children,
117
+ };
118
+ }
119
+ function serializeInstance(instance, depth) {
120
+ const indent = ' '.repeat(depth);
121
+ const variant = instance.variant === undefined ? '' : ` variant="${escapeXML(instance.variant)}"`;
122
+ const lines = [`${indent}<instance source="${escapeXML(instance.source.assetId)}"${variant}>`];
123
+ for (const [name, value] of sortedEntries(instance.parameters)) {
124
+ lines.push(...serializeNamedValue('parameter', name, value, depth + 1));
125
+ }
126
+ for (const override of instance.overrides) {
127
+ lines.push(...serializeOverride(override, depth + 1));
128
+ }
129
+ for (const [name, nodes] of sortedEntries(instance.slots)) {
130
+ lines.push(`${indent} <slot name="${escapeXML(name)}">`);
131
+ for (const node of nodes) {
132
+ lines.push(...serializeNode(node, depth + 2));
133
+ }
134
+ lines.push(`${indent} </slot>`);
135
+ }
136
+ lines.push(`${indent}</instance>`);
137
+ return lines;
138
+ }
139
+ function parseInstance(element, namespaces) {
140
+ const parameters = {};
141
+ const overrides = [];
142
+ const slots = {};
143
+ for (const child of element.children) {
144
+ if (child.name === 'parameter') {
145
+ parameters[requiredAttribute(child, 'name')] = parseNamedValue(child);
146
+ }
147
+ else if (child.name === 'override') {
148
+ overrides.push({
149
+ part: requiredAttribute(child, 'part'),
150
+ property: requiredAttribute(child, 'property'),
151
+ value: parseNamedValue(child),
152
+ });
153
+ }
154
+ else if (child.name === 'slot') {
155
+ const name = requiredAttribute(child, 'name');
156
+ slots[name] = child.children.map(node => parseNode(node, namespaces));
157
+ }
158
+ else {
159
+ throw new Error(`Unexpected <${child.name}> inside <instance>.`);
160
+ }
161
+ }
162
+ return {
163
+ source: { kind: 'asset', assetId: requiredAttribute(element, 'source') },
164
+ parameters,
165
+ ...(element.attributes.variant === undefined ? {} : { variant: element.attributes.variant }),
166
+ overrides,
167
+ slots,
168
+ };
169
+ }
170
+ function serializeOverride(override, depth) {
171
+ const attributes = `part="${escapeXML(override.part)}" property="${escapeXML(override.property)}"`;
172
+ return serializeValueElement('override', attributes, override.value, depth);
173
+ }
174
+ function serializeNamedValue(tag, name, value, depth) {
175
+ return serializeValueElement(tag, `name="${escapeXML(name)}"`, value, depth);
176
+ }
177
+ function serializeValueElement(tag, attributes, value, depth) {
178
+ const indent = ' '.repeat(depth);
179
+ const encoded = encodeXMLValue(value);
180
+ if (encoded !== undefined) {
181
+ return [`${indent}<${tag} ${attributes} value="${escapeXML(encoded)}" />`];
182
+ }
183
+ return [
184
+ `${indent}<${tag} ${attributes}>`,
185
+ ...serializeComplexValue(value, depth + 1),
186
+ `${indent}</${tag}>`,
187
+ ];
188
+ }
189
+ function parseProperties(element, properties) {
190
+ for (const child of element.children) {
191
+ if (child.name !== 'property')
192
+ throw new Error(`Unexpected <${child.name}> inside <properties>.`);
193
+ properties[requiredAttribute(child, 'name')] = parseNamedValue(child);
194
+ }
195
+ }
196
+ function parseNamedValue(element) {
197
+ if (element.attributes.value !== undefined)
198
+ return decodeXMLValue(element.attributes.value);
199
+ if (element.children.length !== 1 || element.children[0] === undefined) {
200
+ throw new Error(`<${element.name}> requires a value attribute or one complex value.`);
201
+ }
202
+ return parseComplexValue(element.children[0]);
203
+ }
204
+ function componentTag(type) {
205
+ const separator = type.indexOf('.');
206
+ if (separator === -1)
207
+ return type;
208
+ const prefix = type.slice(0, separator);
209
+ const name = type.slice(separator + 1);
210
+ return prefix === 'kui' ? name : `${prefix}:${name}`;
211
+ }
212
+ function componentType(tag, namespaces) {
213
+ const separator = tag.indexOf(':');
214
+ if (separator === -1)
215
+ return `kui.${tag}`;
216
+ const prefix = tag.slice(0, separator);
217
+ if (!Object.hasOwn(namespaces.prefixes, prefix))
218
+ throw new Error(`Undeclared component namespace prefix "${prefix}".`);
219
+ return `${prefix}.${tag.slice(separator + 1)}`;
220
+ }
221
+ function requiredAttribute(element, name) {
222
+ const value = element.attributes[name];
223
+ if (value === undefined || value.length === 0)
224
+ throw new Error(`<${element.name}> requires ${name}.`);
225
+ return value;
226
+ }
227
+ function sortedEntries(record) {
228
+ return Object.entries(record).sort(([left], [right]) => compareStrings(left, right));
229
+ }
230
+ //# sourceMappingURL=xml-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml-node.js","sourceRoot":"","sources":["../../../../src/kurot/serialization/xml/xml-node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface XMLElement {
2
+ readonly name: string;
3
+ readonly attributes: Readonly<Record<string, string>>;
4
+ readonly children: readonly XMLElement[];
5
+ }
6
+ /**
7
+ * Parses the XML subset used by canonical KUI documents.
8
+ */
9
+ export declare function parseXML(source: string): XMLElement;
10
+ //# sourceMappingURL=xml-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml-parser.d.ts","sourceRoot":"","sources":["../../../../src/kurot/serialization/xml/xml-parser.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,QAAQ,CAAC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;CACzC;AAOD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAGnD"}
@@ -0,0 +1,134 @@
1
+ const NAME = '[A-Za-z_][\\w:.-]*';
2
+ const OPEN_PATTERN = new RegExp(`^<(${NAME})`);
3
+ const CLOSE_PATTERN = new RegExp(`^<\\/(${NAME})\\s*>`);
4
+ const ATTRIBUTE_PATTERN = new RegExp(`^(${NAME})\\s*=\\s*(?:"([^"]*)"|'([^']*)')`);
5
+ /**
6
+ * Parses the XML subset used by canonical KUI documents.
7
+ */
8
+ export function parseXML(source) {
9
+ const parser = new XMLParser(source);
10
+ return parser.parse();
11
+ }
12
+ class XMLParser {
13
+ _source;
14
+ _position = 0;
15
+ constructor(_source) {
16
+ this._source = _source;
17
+ }
18
+ parse() {
19
+ this._skipMiscellaneous();
20
+ const root = this._parseElement();
21
+ this._skipMiscellaneous();
22
+ if (this._position !== this._source.length) {
23
+ throw this._error('Unexpected content after the root element.');
24
+ }
25
+ return root;
26
+ }
27
+ _parseElement() {
28
+ const opening = this._source.slice(this._position).match(OPEN_PATTERN);
29
+ if (!opening || opening[1] === undefined) {
30
+ throw this._error('Expected an XML element.');
31
+ }
32
+ const name = opening[1];
33
+ this._position += opening[0].length;
34
+ const attributes = {};
35
+ for (;;) {
36
+ this._skipWhitespace();
37
+ if (this._source.startsWith('/>', this._position)) {
38
+ this._position += 2;
39
+ return { name, attributes, children: [] };
40
+ }
41
+ if (this._source[this._position] === '>') {
42
+ this._position++;
43
+ break;
44
+ }
45
+ const attribute = this._source.slice(this._position).match(ATTRIBUTE_PATTERN);
46
+ if (!attribute || attribute[1] === undefined) {
47
+ throw this._error(`Invalid attribute in <${name}>.`);
48
+ }
49
+ if (Object.hasOwn(attributes, attribute[1])) {
50
+ throw this._error(`Duplicate attribute "${attribute[1]}" in <${name}>.`);
51
+ }
52
+ attributes[attribute[1]] = decodeXML(attribute[2] ?? attribute[3] ?? '');
53
+ this._position += attribute[0].length;
54
+ }
55
+ const children = [];
56
+ for (;;) {
57
+ this._skipMiscellaneous();
58
+ const closing = this._source.slice(this._position).match(CLOSE_PATTERN);
59
+ if (closing) {
60
+ if (closing[1] !== name) {
61
+ throw this._error(`Expected </${name}>, received </${String(closing[1])}>.`);
62
+ }
63
+ this._position += closing[0].length;
64
+ return { name, attributes, children };
65
+ }
66
+ if (this._position >= this._source.length) {
67
+ throw this._error(`Missing closing tag </${name}>.`);
68
+ }
69
+ if (this._source[this._position] !== '<') {
70
+ const text = this._readText();
71
+ if (text.trim().length > 0) {
72
+ throw this._error(`Text content is not allowed inside <${name}>.`);
73
+ }
74
+ continue;
75
+ }
76
+ children.push(this._parseElement());
77
+ }
78
+ }
79
+ _readText() {
80
+ const start = this._position;
81
+ while (this._position < this._source.length && this._source[this._position] !== '<') {
82
+ this._position++;
83
+ }
84
+ return decodeXML(this._source.slice(start, this._position));
85
+ }
86
+ _skipMiscellaneous() {
87
+ for (;;) {
88
+ this._skipWhitespace();
89
+ if (this._source.startsWith('<!--', this._position)) {
90
+ this._skipThrough('-->', 'Unterminated XML comment.');
91
+ continue;
92
+ }
93
+ if (this._source.startsWith('<?', this._position)) {
94
+ this._skipThrough('?>', 'Unterminated processing instruction.');
95
+ continue;
96
+ }
97
+ return;
98
+ }
99
+ }
100
+ _skipThrough(terminator, message) {
101
+ const end = this._source.indexOf(terminator, this._position + 2);
102
+ if (end === -1) {
103
+ throw this._error(message);
104
+ }
105
+ this._position = end + terminator.length;
106
+ }
107
+ _skipWhitespace() {
108
+ while (/\s/.test(this._source[this._position] ?? '')) {
109
+ this._position++;
110
+ }
111
+ }
112
+ _error(message) {
113
+ return new Error(`${message} (offset ${this._position})`);
114
+ }
115
+ }
116
+ function decodeXML(value) {
117
+ const named = {
118
+ amp: '&',
119
+ apos: "'",
120
+ gt: '>',
121
+ lt: '<',
122
+ quot: '"',
123
+ };
124
+ return value.replace(/&(#x[0-9a-f]+|#\d+|amp|apos|gt|lt|quot);/gi, (match, entity) => {
125
+ if (entity.startsWith('#x')) {
126
+ return String.fromCodePoint(Number.parseInt(entity.slice(2), 16));
127
+ }
128
+ if (entity.startsWith('#')) {
129
+ return String.fromCodePoint(Number.parseInt(entity.slice(1), 10));
130
+ }
131
+ return named[entity] ?? match;
132
+ });
133
+ }
134
+ //# sourceMappingURL=xml-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml-parser.js","sourceRoot":"","sources":["../../../../src/kurot/serialization/xml/xml-parser.ts"],"names":[],"mappings":"AAMA,MAAM,IAAI,GAAG,oBAAoB,CAAC;AAClC,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC;AAC/C,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC;AACxD,MAAM,iBAAiB,GAAG,IAAI,MAAM,CAAC,KAAK,IAAI,mCAAmC,CAAC,CAAC;AAEnF;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAc;IACtC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,SAAS;IAGsB;IAF5B,SAAS,GAAG,CAAC,CAAC;IAEtB,YAAoC,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;IAAG,CAAC;IAEhD,KAAK;QACX,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAClC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC5C,MAAM,IAAI,CAAC,MAAM,CAAC,4CAA4C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAEO,aAAa;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACvE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC1C,MAAM,IAAI,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACpC,MAAM,UAAU,GAA2B,EAAE,CAAC;QAE9C,SAAS,CAAC;YACT,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnD,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;gBACpB,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;YAC3C,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACjB,MAAM;YACP,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC9E,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC9C,MAAM,IAAI,CAAC,MAAM,CAAC,yBAAyB,IAAI,IAAI,CAAC,CAAC;YACtD,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,wBAAwB,SAAS,CAAC,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;YAC1E,CAAC;YACD,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACzE,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACvC,CAAC;QAED,MAAM,QAAQ,GAAiB,EAAE,CAAC;QAClC,SAAS,CAAC;YACT,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACxE,IAAI,OAAO,EAAE,CAAC;gBACb,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;oBACzB,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,iBAAiB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC9E,CAAC;gBACD,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBACpC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;YACvC,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC3C,MAAM,IAAI,CAAC,MAAM,CAAC,yBAAyB,IAAI,IAAI,CAAC,CAAC;YACtD,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC9B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5B,MAAM,IAAI,CAAC,MAAM,CAAC,uCAAuC,IAAI,IAAI,CAAC,CAAC;gBACpE,CAAC;gBACD,SAAS;YACV,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QACrC,CAAC;IACF,CAAC;IAEO,SAAS;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,EAAE,CAAC;YACrF,IAAI,CAAC,SAAS,EAAE,CAAC;QAClB,CAAC;QACD,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7D,CAAC;IAEO,kBAAkB;QACzB,SAAS,CAAC;YACT,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrD,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,2BAA2B,CAAC,CAAC;gBACtD,SAAS;YACV,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnD,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,sCAAsC,CAAC,CAAC;gBAChE,SAAS;YACV,CAAC;YACD,OAAO;QACR,CAAC;IACF,CAAC;IAEO,YAAY,CAAC,UAAkB,EAAE,OAAe;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QACjE,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC;IAC1C,CAAC;IAEO,eAAe;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,SAAS,EAAE,CAAC;QAClB,CAAC;IACF,CAAC;IAEO,MAAM,CAAC,OAAe;QAC7B,OAAO,IAAI,KAAK,CAAC,GAAG,OAAO,YAAY,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IAC3D,CAAC;CACD;AAED,SAAS,SAAS,CAAC,KAAa;IAC/B,MAAM,KAAK,GAAqC;QAC/C,GAAG,EAAE,GAAG;QACR,IAAI,EAAE,GAAG;QACT,EAAE,EAAE,GAAG;QACP,EAAE,EAAE,GAAG;QACP,IAAI,EAAE,GAAG;KACT,CAAC;IACF,OAAO,KAAK,CAAC,OAAO,CAAC,4CAA4C,EAAE,CAAC,KAAK,EAAE,MAAc,EAAE,EAAE;QAC5F,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC;IAC/B,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { UIPropertyValue } from '../../model/UIPropertyValue.js';
2
+ import type { XMLElement } from './xml-parser.js';
3
+ /**
4
+ * Encodes a scalar or reference value for an XML attribute.
5
+ */
6
+ export declare function encodeXMLValue(value: UIPropertyValue): string | undefined;
7
+ /**
8
+ * Decodes the canonical scalar and reference attribute syntax.
9
+ */
10
+ export declare function decodeXMLValue(source: string): UIPropertyValue;
11
+ /**
12
+ * Serializes an array or object property as explicit value elements.
13
+ */
14
+ export declare function serializeComplexValue(value: UIPropertyValue, depth: number): string[];
15
+ /**
16
+ * Parses one explicit array or object value element.
17
+ */
18
+ export declare function parseComplexValue(element: XMLElement): UIPropertyValue;
19
+ /**
20
+ * Escapes text for a double-quoted XML attribute.
21
+ */
22
+ export declare function escapeXML(value: string): string;
23
+ //# sourceMappingURL=xml-values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml-values.d.ts","sourceRoot":"","sources":["../../../../src/kurot/serialization/xml/xml-values.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAOxF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAKlD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,CAiBzE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CAiB9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA6BrF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,eAAe,CAatE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM/C"}
@@ -0,0 +1,133 @@
1
+ import { isUIAssetReference, isUIDesignTokenReference, isUIResourceReference, } from '../../model/UIReference.js';
2
+ import { compareStrings } from '../../shared/strings.js';
3
+ const NUMBER_PATTERN = /^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$/;
4
+ const REFERENCE_PATTERN = /^@(asset|resource|token):/;
5
+ /**
6
+ * Encodes a scalar or reference value for an XML attribute.
7
+ */
8
+ export function encodeXMLValue(value) {
9
+ if (typeof value === 'boolean' || typeof value === 'number') {
10
+ return String(value);
11
+ }
12
+ if (typeof value === 'string') {
13
+ return needsStringEscape(value) ? `\\${value}` : value;
14
+ }
15
+ if (isUIAssetReference(value)) {
16
+ return `@asset:${value.assetId}`;
17
+ }
18
+ if (isUIResourceReference(value)) {
19
+ return `@resource:${value.resourceType}:${value.key}`;
20
+ }
21
+ if (isUIDesignTokenReference(value)) {
22
+ return `@token:${value.tokenType}:${value.key}`;
23
+ }
24
+ return undefined;
25
+ }
26
+ /**
27
+ * Decodes the canonical scalar and reference attribute syntax.
28
+ */
29
+ export function decodeXMLValue(source) {
30
+ if (source.startsWith('\\'))
31
+ return source.slice(1);
32
+ if (source === 'true')
33
+ return true;
34
+ if (source === 'false')
35
+ return false;
36
+ if (NUMBER_PATTERN.test(source))
37
+ return Number(source);
38
+ if (source.startsWith('@asset:')) {
39
+ return { kind: 'asset', assetId: source.slice('@asset:'.length) };
40
+ }
41
+ if (source.startsWith('@resource:')) {
42
+ const [resourceType, ...key] = source.slice('@resource:'.length).split(':');
43
+ return { kind: 'resource', resourceType: resourceType ?? '', key: key.join(':') };
44
+ }
45
+ if (source.startsWith('@token:')) {
46
+ const [tokenType, ...key] = source.slice('@token:'.length).split(':');
47
+ return { kind: 'token', tokenType: tokenType ?? '', key: key.join(':') };
48
+ }
49
+ return source;
50
+ }
51
+ /**
52
+ * Serializes an array or object property as explicit value elements.
53
+ */
54
+ export function serializeComplexValue(value, depth) {
55
+ const indent = ' '.repeat(depth);
56
+ if (Array.isArray(value)) {
57
+ return serializeCollection('array', value.map(item => ['', item]), depth);
58
+ }
59
+ const object = value;
60
+ const entries = Object.entries(object).sort(([left], [right]) => compareStrings(left, right));
61
+ return serializeCollection('object', entries, depth);
62
+ function serializeCollection(name, items, itemDepth) {
63
+ const lines = [`${indent}<${name}>`];
64
+ for (const [key, item] of items) {
65
+ const encoded = encodeXMLValue(item);
66
+ const keyAttribute = key === '' ? '' : ` name="${escapeXML(key)}"`;
67
+ if (encoded !== undefined) {
68
+ lines.push(`${' '.repeat(itemDepth + 1)}<value${keyAttribute} value="${escapeXML(encoded)}" />`);
69
+ continue;
70
+ }
71
+ lines.push(`${' '.repeat(itemDepth + 1)}<value${keyAttribute}>`);
72
+ lines.push(...serializeComplexValue(item, itemDepth + 2));
73
+ lines.push(`${' '.repeat(itemDepth + 1)}</value>`);
74
+ }
75
+ lines.push(`${indent}</${name}>`);
76
+ return lines;
77
+ }
78
+ }
79
+ /**
80
+ * Parses one explicit array or object value element.
81
+ */
82
+ export function parseComplexValue(element) {
83
+ if (element.name === 'array') {
84
+ return element.children.map(parseValueElement);
85
+ }
86
+ if (element.name === 'object') {
87
+ const result = {};
88
+ for (const child of element.children) {
89
+ const name = requiredAttribute(child, 'name');
90
+ result[name] = parseValueElement(child);
91
+ }
92
+ return result;
93
+ }
94
+ throw new Error(`Expected <array> or <object>, received <${element.name}>.`);
95
+ }
96
+ /**
97
+ * Escapes text for a double-quoted XML attribute.
98
+ */
99
+ export function escapeXML(value) {
100
+ return value
101
+ .replaceAll('&', '&amp;')
102
+ .replaceAll('"', '&quot;')
103
+ .replaceAll('<', '&lt;')
104
+ .replaceAll('>', '&gt;');
105
+ }
106
+ function parseValueElement(element) {
107
+ if (element.name !== 'value') {
108
+ throw new Error(`Expected <value>, received <${element.name}>.`);
109
+ }
110
+ const scalar = element.attributes.value;
111
+ if (scalar !== undefined) {
112
+ if (element.children.length > 0) {
113
+ throw new Error('<value> cannot contain both a value attribute and child content.');
114
+ }
115
+ return decodeXMLValue(scalar);
116
+ }
117
+ const child = element.children[0];
118
+ if (child === undefined || element.children.length !== 1) {
119
+ throw new Error('<value> must contain exactly one <array> or <object>.');
120
+ }
121
+ return parseComplexValue(child);
122
+ }
123
+ function requiredAttribute(element, name) {
124
+ const value = element.attributes[name];
125
+ if (value === undefined || value.length === 0) {
126
+ throw new Error(`<${element.name}> requires a non-empty ${name} attribute.`);
127
+ }
128
+ return value;
129
+ }
130
+ function needsStringEscape(value) {
131
+ return value.startsWith('\\') || value === 'true' || value === 'false' || NUMBER_PATTERN.test(value) || REFERENCE_PATTERN.test(value);
132
+ }
133
+ //# sourceMappingURL=xml-values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml-values.js","sourceRoot":"","sources":["../../../../src/kurot/serialization/xml/xml-values.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { UIDocument } from '../model/UIDocument.js';
2
+ /**
3
+ * Default namespace of canonical KUI XML documents.
4
+ */
5
+ export declare const KUI_XML_NAMESPACE = "https://kurot.dev/ui/1";
6
+ /**
7
+ * Serializes a semantic document as canonical KUI XML.
8
+ */
9
+ export declare function serializeUIDocument(document: UIDocument): string;
10
+ /**
11
+ * Parses and validates one canonical KUI XML document.
12
+ */
13
+ export declare function parseUIDocument(source: string): UIDocument;
14
+ //# sourceMappingURL=xml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../../../src/kurot/serialization/xml.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAWzD;;GAEG;AACH,eAAO,MAAM,iBAAiB,2BAA2B,CAAC;AAE1D;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,CAmBhE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAgD1D"}