@kurot/cli 1.0.2

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 (162) hide show
  1. package/CHANGELOG.md +128 -0
  2. package/README.md +296 -0
  3. package/dist/commands/build.d.ts +3 -0
  4. package/dist/commands/build.d.ts.map +1 -0
  5. package/dist/commands/build.js +59 -0
  6. package/dist/commands/build.js.map +1 -0
  7. package/dist/commands/clean.d.ts +3 -0
  8. package/dist/commands/clean.d.ts.map +1 -0
  9. package/dist/commands/clean.js +15 -0
  10. package/dist/commands/clean.js.map +1 -0
  11. package/dist/commands/create.d.ts +3 -0
  12. package/dist/commands/create.d.ts.map +1 -0
  13. package/dist/commands/create.js +24 -0
  14. package/dist/commands/create.js.map +1 -0
  15. package/dist/commands/dev.d.ts +3 -0
  16. package/dist/commands/dev.d.ts.map +1 -0
  17. package/dist/commands/dev.js +25 -0
  18. package/dist/commands/dev.js.map +1 -0
  19. package/dist/core/config.d.ts +94 -0
  20. package/dist/core/config.d.ts.map +1 -0
  21. package/dist/core/config.js +70 -0
  22. package/dist/core/config.js.map +1 -0
  23. package/dist/core/dev-server.d.ts +21 -0
  24. package/dist/core/dev-server.d.ts.map +1 -0
  25. package/dist/core/dev-server.js +113 -0
  26. package/dist/core/dev-server.js.map +1 -0
  27. package/dist/core/errors.d.ts +16 -0
  28. package/dist/core/errors.d.ts.map +1 -0
  29. package/dist/core/errors.js +23 -0
  30. package/dist/core/errors.js.map +1 -0
  31. package/dist/core/exml/ast.d.ts +243 -0
  32. package/dist/core/exml/ast.d.ts.map +1 -0
  33. package/dist/core/exml/ast.js +8 -0
  34. package/dist/core/exml/ast.js.map +1 -0
  35. package/dist/core/exml/codegen.d.ts +23 -0
  36. package/dist/core/exml/codegen.d.ts.map +1 -0
  37. package/dist/core/exml/codegen.js +422 -0
  38. package/dist/core/exml/codegen.js.map +1 -0
  39. package/dist/core/exml/exml-parser.d.ts +27 -0
  40. package/dist/core/exml/exml-parser.d.ts.map +1 -0
  41. package/dist/core/exml/exml-parser.js +466 -0
  42. package/dist/core/exml/exml-parser.js.map +1 -0
  43. package/dist/core/exml/index.d.ts +52 -0
  44. package/dist/core/exml/index.d.ts.map +1 -0
  45. package/dist/core/exml/index.js +51 -0
  46. package/dist/core/exml/index.js.map +1 -0
  47. package/dist/core/exml/registry.d.ts +92 -0
  48. package/dist/core/exml/registry.d.ts.map +1 -0
  49. package/dist/core/exml/registry.js +177 -0
  50. package/dist/core/exml/registry.js.map +1 -0
  51. package/dist/core/exml/xml-parser.d.ts +61 -0
  52. package/dist/core/exml/xml-parser.d.ts.map +1 -0
  53. package/dist/core/exml/xml-parser.js +201 -0
  54. package/dist/core/exml/xml-parser.js.map +1 -0
  55. package/dist/core/namespace-external-plugin.d.ts +45 -0
  56. package/dist/core/namespace-external-plugin.d.ts.map +1 -0
  57. package/dist/core/namespace-external-plugin.js +66 -0
  58. package/dist/core/namespace-external-plugin.js.map +1 -0
  59. package/dist/core/pipeline.d.ts +75 -0
  60. package/dist/core/pipeline.d.ts.map +1 -0
  61. package/dist/core/pipeline.js +30 -0
  62. package/dist/core/pipeline.js.map +1 -0
  63. package/dist/core/plugins/clean-output.d.ts +3 -0
  64. package/dist/core/plugins/clean-output.d.ts.map +1 -0
  65. package/dist/core/plugins/clean-output.js +11 -0
  66. package/dist/core/plugins/clean-output.js.map +1 -0
  67. package/dist/core/plugins/compile-custom-namespaces.d.ts +19 -0
  68. package/dist/core/plugins/compile-custom-namespaces.d.ts.map +1 -0
  69. package/dist/core/plugins/compile-custom-namespaces.js +104 -0
  70. package/dist/core/plugins/compile-custom-namespaces.js.map +1 -0
  71. package/dist/core/plugins/compile-engine.d.ts +19 -0
  72. package/dist/core/plugins/compile-engine.d.ts.map +1 -0
  73. package/dist/core/plugins/compile-engine.js +75 -0
  74. package/dist/core/plugins/compile-engine.js.map +1 -0
  75. package/dist/core/plugins/compile-exml.d.ts +14 -0
  76. package/dist/core/plugins/compile-exml.d.ts.map +1 -0
  77. package/dist/core/plugins/compile-exml.js +223 -0
  78. package/dist/core/plugins/compile-exml.js.map +1 -0
  79. package/dist/core/plugins/compile-source.d.ts +14 -0
  80. package/dist/core/plugins/compile-source.d.ts.map +1 -0
  81. package/dist/core/plugins/compile-source.js +132 -0
  82. package/dist/core/plugins/compile-source.js.map +1 -0
  83. package/dist/core/plugins/copy-assets.d.ts +12 -0
  84. package/dist/core/plugins/copy-assets.d.ts.map +1 -0
  85. package/dist/core/plugins/copy-assets.js +33 -0
  86. package/dist/core/plugins/copy-assets.js.map +1 -0
  87. package/dist/core/plugins/generate-html.d.ts +16 -0
  88. package/dist/core/plugins/generate-html.d.ts.map +1 -0
  89. package/dist/core/plugins/generate-html.js +137 -0
  90. package/dist/core/plugins/generate-html.js.map +1 -0
  91. package/dist/core/plugins/index.d.ts +21 -0
  92. package/dist/core/plugins/index.d.ts.map +1 -0
  93. package/dist/core/plugins/index.js +39 -0
  94. package/dist/core/plugins/index.js.map +1 -0
  95. package/dist/core/plugins/manifest.d.ts +14 -0
  96. package/dist/core/plugins/manifest.d.ts.map +1 -0
  97. package/dist/core/plugins/manifest.js +28 -0
  98. package/dist/core/plugins/manifest.js.map +1 -0
  99. package/dist/core/project.d.ts +95 -0
  100. package/dist/core/project.d.ts.map +1 -0
  101. package/dist/core/project.js +79 -0
  102. package/dist/core/project.js.map +1 -0
  103. package/dist/core/template.d.ts +13 -0
  104. package/dist/core/template.d.ts.map +1 -0
  105. package/dist/core/template.js +79 -0
  106. package/dist/core/template.js.map +1 -0
  107. package/dist/define.d.ts +2 -0
  108. package/dist/define.d.ts.map +1 -0
  109. package/dist/define.js +2 -0
  110. package/dist/define.js.map +1 -0
  111. package/dist/index.d.ts +3 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +19 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/utils/fs.d.ts +5 -0
  116. package/dist/utils/fs.d.ts.map +1 -0
  117. package/dist/utils/fs.js +30 -0
  118. package/dist/utils/fs.js.map +1 -0
  119. package/dist/utils/logger.d.ts +11 -0
  120. package/dist/utils/logger.d.ts.map +1 -0
  121. package/dist/utils/logger.js +18 -0
  122. package/dist/utils/logger.js.map +1 -0
  123. package/package.json +45 -0
  124. package/templates/empty/kurot.config.ts +13 -0
  125. package/templates/empty/package.json +17 -0
  126. package/templates/empty/pnpm-workspace.yaml +3 -0
  127. package/templates/empty/src/Main.ts +32 -0
  128. package/templates/empty/template/web/index.html +38 -0
  129. package/templates/empty/tsconfig.json +10 -0
  130. package/templates/game/kurot.config.ts +16 -0
  131. package/templates/game/package.json +19 -0
  132. package/templates/game/pnpm-workspace.yaml +3 -0
  133. package/templates/game/resource/assets/eui.json +24 -0
  134. package/templates/game/resource/assets/eui.png +0 -0
  135. package/templates/game/resource/default.res.json +15 -0
  136. package/templates/game/resource/default.thm.json +19 -0
  137. package/templates/game/resource/skins/ButtonSkin.exml +16 -0
  138. package/templates/game/resource/skins/CheckBoxSkin.exml +18 -0
  139. package/templates/game/resource/skins/ComboBoxSkin.exml +31 -0
  140. package/templates/game/resource/skins/GroupSkin.exml +4 -0
  141. package/templates/game/resource/skins/HScrollBarSkin.exml +6 -0
  142. package/templates/game/resource/skins/HSliderSkin.exml +7 -0
  143. package/templates/game/resource/skins/ImageSkin.exml +4 -0
  144. package/templates/game/resource/skins/ItemRendererSkin.exml +15 -0
  145. package/templates/game/resource/skins/LabelSkin.exml +7 -0
  146. package/templates/game/resource/skins/ListSkin.exml +11 -0
  147. package/templates/game/resource/skins/PanelSkin.exml +15 -0
  148. package/templates/game/resource/skins/ProgressBarSkin.exml +11 -0
  149. package/templates/game/resource/skins/RadioButtonSkin.exml +18 -0
  150. package/templates/game/resource/skins/ScrollerSkin.exml +8 -0
  151. package/templates/game/resource/skins/TabBarSkin.exml +6 -0
  152. package/templates/game/resource/skins/TextInputSkin.exml +22 -0
  153. package/templates/game/resource/skins/ToggleButtonSkin.exml +21 -0
  154. package/templates/game/resource/skins/ToggleSwitchSkin.exml +15 -0
  155. package/templates/game/resource/skins/VScrollBarSkin.exml +6 -0
  156. package/templates/game/resource/skins/VSliderSkin.exml +7 -0
  157. package/templates/game/resource/skins/ViewStackSkin.exml +4 -0
  158. package/templates/game/src/LoadingUI.ts +27 -0
  159. package/templates/game/src/Main.ts +165 -0
  160. package/templates/game/template/web/index.html +109 -0
  161. package/templates/game/template/web/logo.png +0 -0
  162. package/templates/game/tsconfig.json +10 -0
@@ -0,0 +1,466 @@
1
+ /**
2
+ * EXML Parser — converts an XML element tree into a SkinIR.
3
+ *
4
+ * Walks the XML tree produced by the lightweight XML parser and
5
+ * produces an intermediate representation ready for code generation.
6
+ */
7
+ import { parseXML, filterElements, getTextContent } from './xml-parser.js';
8
+ import { lookupComponent, localName, isPropertyNode, parsePropertyNode } from './registry.js';
9
+ // ── Public API ───────────────────────────────────────────────────────
10
+ /**
11
+ * Parse an EXML source string into a SkinIR.
12
+ *
13
+ * @param source - EXML source text
14
+ * @param className - Optional class name (used for factory function name)
15
+ * @param customNamespaces - Project-defined EXML namespaces
16
+ * @returns The parsed skin intermediate representation
17
+ */
18
+ export function parseEXML(source, className, customNamespaces = []) {
19
+ const root = parseXML(source);
20
+ const ir = parseSkinRoot(root, customNamespaces);
21
+ if (className) {
22
+ ir.className = className;
23
+ }
24
+ return ir;
25
+ }
26
+ /**
27
+ * Parse an already-parsed XML root element into a SkinIR.
28
+ *
29
+ * @param root - The parsed XML root element
30
+ * @param customNamespaces - Project-defined EXML namespaces
31
+ * @returns The parsed skin intermediate representation
32
+ */
33
+ export function parseSkinRoot(root, customNamespaces = []) {
34
+ const ctx = new ParseContext(customNamespaces);
35
+ ctx.processRoot(root);
36
+ return ctx.toIR();
37
+ }
38
+ // ── Parse context ────────────────────────────────────────────────────
39
+ class ParseContext {
40
+ customNamespaces;
41
+ /**
42
+ * Collected imports: className → module.
43
+ */
44
+ imports = new Map();
45
+ /**
46
+ * Skin part IDs.
47
+ */
48
+ skinParts = [];
49
+ /**
50
+ * All nodes (flat list for state processing).
51
+ */
52
+ allNodes = [];
53
+ /**
54
+ * State definitions.
55
+ */
56
+ states = [];
57
+ /**
58
+ * Declarations.
59
+ */
60
+ declarations = [];
61
+ /**
62
+ * Tag names that could not be resolved to a component or namespace.
63
+ */
64
+ unresolvedTags = [];
65
+ /**
66
+ * Counter for generating unique variable names.
67
+ */
68
+ varCounter = 0;
69
+ constructor(customNamespaces) {
70
+ this.customNamespaces = customNamespaces;
71
+ }
72
+ /**
73
+ * Process the root `<eui:Skin>` element.
74
+ */
75
+ processRoot(root) {
76
+ // Root should be a Skin tag
77
+ const rootClass = localName(root.name);
78
+ if (rootClass !== 'Skin') {
79
+ throw new Error(`EXML: expected root element to be Skin, got "${rootClass}"`);
80
+ }
81
+ // Ensure Skin is imported
82
+ this.addImport('Skin', '@kurot/ui');
83
+ // Extract root-level properties (class, width, height, etc.)
84
+ for (const attr of root.attributes) {
85
+ if (attr.name === 'class') {
86
+ this._className = attr.value;
87
+ }
88
+ else if (attr.name === 'width') {
89
+ this._width = this.parseValue(attr.value);
90
+ }
91
+ else if (attr.name === 'height') {
92
+ this._height = this.parseValue(attr.value);
93
+ }
94
+ else if (attr.name === 'states') {
95
+ // Shorthand: states="up,down,disabled" → expand to StateDef list
96
+ const stateNames = attr.value
97
+ .split(',')
98
+ .map(s => s.trim())
99
+ .filter(Boolean);
100
+ for (const name of stateNames) {
101
+ if (!this.states.find(s => s.name === name)) {
102
+ this.states.push({ name, stateGroups: [], overrides: [] });
103
+ }
104
+ }
105
+ }
106
+ else if (attr.name === 'xmlns' || attr.name.startsWith('xmlns:')) {
107
+ // Skip namespace declarations
108
+ }
109
+ else {
110
+ const dotIndex = attr.name.indexOf('.');
111
+ this.rootProperties.push({
112
+ name: dotIndex >= 0 ? attr.name.substring(0, dotIndex) : attr.name,
113
+ state: dotIndex >= 0 ? attr.name.substring(dotIndex + 1) : '',
114
+ value: this.parseValue(attr.value),
115
+ });
116
+ }
117
+ }
118
+ // First pass: collect state definitions from property children
119
+ // (e.g. <eui:states><eui:State name="up"/></eui:states>)
120
+ const childElements = filterElements(root.children);
121
+ this.collectStates(childElements);
122
+ // Second pass: process non-state children
123
+ for (const el of childElements) {
124
+ const cls = localName(el.name);
125
+ const isPropNode = isPropertyNode(el.name);
126
+ const isLowerProp = cls.length > 0 && cls[0] === cls[0].toLowerCase();
127
+ // Skip property nodes (dot notation or lowercase-first like <eui:states>)
128
+ if (isPropNode || isLowerProp)
129
+ continue;
130
+ if (cls === 'Declarations') {
131
+ this.processDeclarations(el);
132
+ continue;
133
+ }
134
+ // Regular child node
135
+ const node = this.parseNode(el);
136
+ if (node) {
137
+ this.allNodes.push(node);
138
+ }
139
+ }
140
+ // Collect state-specific property overrides from nodes
141
+ this.collectStateOverrides();
142
+ }
143
+ /**
144
+ * Class name extracted from the root `class` attribute.
145
+ */
146
+ _className = '';
147
+ /**
148
+ * Root width/height.
149
+ */
150
+ _width;
151
+ _height;
152
+ rootProperties = [];
153
+ /**
154
+ * Collect state definitions from children.
155
+ *
156
+ * Handles both direct `<eui:State>` children and `<eui:states>` property
157
+ * children.
158
+ */
159
+ collectStates(childElements) {
160
+ for (const el of childElements) {
161
+ const cls = localName(el.name);
162
+ // Direct State child
163
+ if (cls === 'State') {
164
+ this.states.push(this.parseState(el));
165
+ continue;
166
+ }
167
+ // Property child with lowercase first char (e.g. <eui:states>)
168
+ const isLowerProp = cls.length > 0 && cls[0] === cls[0].toLowerCase();
169
+ if (isLowerProp || isPropertyNode(el.name)) {
170
+ // Look inside for State elements
171
+ for (const child of filterElements(el.children)) {
172
+ const childCls = localName(child.name);
173
+ if (childCls === 'State') {
174
+ this.states.push(this.parseState(child));
175
+ }
176
+ }
177
+ }
178
+ }
179
+ }
180
+ /**
181
+ * Process a `<Declarations>` element.
182
+ */
183
+ processDeclarations(el) {
184
+ const children = filterElements(el.children);
185
+ for (const child of children) {
186
+ const node = this.parseNode(child);
187
+ if (node)
188
+ this.declarations.push(node);
189
+ }
190
+ }
191
+ /**
192
+ * Parse a `State` element and its overrides.
193
+ */
194
+ parseState(el) {
195
+ const nameAttr = this.getAttr(el, 'name') ?? '';
196
+ const stateGroups = (this.getAttr(el, 'stateGroups') ?? '')
197
+ .split(',')
198
+ .map(s => s.trim())
199
+ .filter(Boolean);
200
+ const overrides = [];
201
+ for (const child of filterElements(el.children)) {
202
+ const cls = localName(child.name);
203
+ if (cls === 'AddItems') {
204
+ overrides.push(this.parseAddItems(child));
205
+ }
206
+ else if (cls === 'SetProperty') {
207
+ overrides.push(this.parseSetProperty(child));
208
+ }
209
+ }
210
+ return { name: nameAttr, stateGroups, overrides };
211
+ }
212
+ /**
213
+ * Parse an `AddItems` override.
214
+ */
215
+ parseAddItems(el) {
216
+ return {
217
+ type: 'AddItems',
218
+ targetId: this.getAttr(el, 'target') ?? '',
219
+ destinationId: this.getAttr(el, 'destination') ?? '',
220
+ position: parseInt(this.getAttr(el, 'position') ?? '-1', 10),
221
+ propertyName: this.getAttr(el, 'propertyName') ?? '',
222
+ };
223
+ }
224
+ /**
225
+ * Parse a `SetProperty` override.
226
+ */
227
+ parseSetProperty(el) {
228
+ const rawValue = this.getAttr(el, 'value') ?? '';
229
+ return {
230
+ type: 'SetProperty',
231
+ targetId: this.getAttr(el, 'target') ?? '',
232
+ name: this.getAttr(el, 'name') ?? '',
233
+ value: this.parseValue(rawValue),
234
+ };
235
+ }
236
+ /**
237
+ * Collected IDs for duplicate detection.
238
+ */
239
+ _idSet = new Set();
240
+ /**
241
+ * Parse a component XML element into a `SkinNode`.
242
+ */
243
+ parseNode(el) {
244
+ const cls = localName(el.name);
245
+ const info = lookupComponent(el.name, this.customNamespaces);
246
+ if (!info) {
247
+ // Unknown component — dropped from the generated skin; the caller
248
+ // (see `unresolvedTags`) is responsible for surfacing this as a warning.
249
+ this.unresolvedTags.push(el.name);
250
+ return null;
251
+ }
252
+ // Register import
253
+ this.addImport(cls, info.module);
254
+ // Generate variable name
255
+ const id = this.getAttr(el, 'id');
256
+ if (id) {
257
+ if (this._idSet.has(id)) {
258
+ throw new Error(`EXML: duplicate id "${id}" in skin`);
259
+ }
260
+ this._idSet.add(id);
261
+ }
262
+ const varName = id || this.genVar(cls);
263
+ // Track skin parts
264
+ if (id) {
265
+ this.skinParts.push(id);
266
+ }
267
+ // Parse properties from attributes
268
+ const properties = [];
269
+ const includeIn = this.getAttr(el, 'includeIn')
270
+ ?.split(',')
271
+ .map(s => s.trim()) ?? [];
272
+ const excludeFrom = this.getAttr(el, 'excludeFrom')
273
+ ?.split(',')
274
+ .map(s => s.trim()) ?? [];
275
+ for (const attr of el.attributes) {
276
+ const attrName = attr.name;
277
+ const attrValue = attr.value;
278
+ // Skip special attributes
279
+ if (attrName === 'id' || attrName === 'includeIn' || attrName === 'excludeFrom')
280
+ continue;
281
+ // Check for state-specific property (e.g. "label.up")
282
+ const dotIdx = attrName.lastIndexOf('.');
283
+ if (dotIdx > 0) {
284
+ const prop = attrName.substring(0, dotIdx);
285
+ const state = attrName.substring(dotIdx + 1);
286
+ properties.push({
287
+ name: prop,
288
+ state,
289
+ value: this.parseValue(attrValue),
290
+ });
291
+ }
292
+ else {
293
+ properties.push({
294
+ name: attrName,
295
+ state: '',
296
+ value: this.parseValue(attrValue),
297
+ });
298
+ }
299
+ }
300
+ // Process child elements
301
+ const children = [];
302
+ const propertyChildren = [];
303
+ for (const child of filterElements(el.children)) {
304
+ // Property node? Egret accepts both owner-qualified nodes such as
305
+ // <eui:Button.label> and lowercase shorthand such as <eui:layout>.
306
+ const childClass = localName(child.name);
307
+ const isLowerProperty = childClass.length > 0 && childClass[0] === childClass[0].toLowerCase();
308
+ if (isPropertyNode(child.name) || isLowerProperty) {
309
+ const parsed = parsePropertyNode(child.name);
310
+ const propertyName = parsed?.property ?? (isLowerProperty ? childClass : '');
311
+ if (propertyName) {
312
+ const childNodes = [];
313
+ // Check for text content
314
+ const text = getTextContent(child.children).trim();
315
+ if (text) {
316
+ childNodes.push(text);
317
+ }
318
+ // Check for element children
319
+ for (const sub of filterElements(child.children)) {
320
+ const node = this.parseNode(sub);
321
+ if (node)
322
+ childNodes.push(node);
323
+ }
324
+ propertyChildren.push({
325
+ propertyName,
326
+ nodes: childNodes,
327
+ });
328
+ }
329
+ continue;
330
+ }
331
+ // Regular child → goes to default property
332
+ const childNode = this.parseNode(child);
333
+ if (childNode) {
334
+ children.push(childNode);
335
+ }
336
+ }
337
+ // Check for text content (useful for Label, etc.)
338
+ const textContent = getTextContent(el.children).trim();
339
+ return {
340
+ className: cls,
341
+ module: info.module,
342
+ varName,
343
+ id,
344
+ properties,
345
+ children,
346
+ propertyChildren,
347
+ includeIn,
348
+ excludeFrom,
349
+ };
350
+ }
351
+ /**
352
+ * Parse a raw attribute value string into a `PropertyValue`.
353
+ */
354
+ parseValue(raw) {
355
+ // Check for binding expression {expr}
356
+ const bindingMatch = raw.match(/^\{(.+)\}$/);
357
+ if (bindingMatch) {
358
+ return { type: 'binding', expression: bindingMatch[1].trim() };
359
+ }
360
+ // Check for percent value
361
+ if (raw.endsWith('%')) {
362
+ const num = parseFloat(raw);
363
+ if (!isNaN(num)) {
364
+ return { type: 'percent', value: num };
365
+ }
366
+ }
367
+ // Check for boolean
368
+ if (raw === 'true')
369
+ return { type: 'literal', value: true };
370
+ if (raw === 'false')
371
+ return { type: 'literal', value: false };
372
+ // Check for null
373
+ if (raw === 'null')
374
+ return { type: 'literal', value: null };
375
+ // Check for number
376
+ const num = Number(raw);
377
+ if (raw !== '' && !isNaN(num)) {
378
+ return { type: 'literal', value: num };
379
+ }
380
+ // Default to string
381
+ return { type: 'literal', value: raw };
382
+ }
383
+ /**
384
+ * After all nodes are parsed, collect state-specific overrides.
385
+ */
386
+ collectStateOverrides() {
387
+ // Process includeIn/excludeFrom on nodes → generate AddItems overrides
388
+ for (const node of this.allNodes) {
389
+ const includedStates = node.includeIn.length > 0
390
+ ? node.includeIn
391
+ : node.excludeFrom.length > 0
392
+ ? this.states.map(state => state.name).filter(name => !node.excludeFrom.includes(name))
393
+ : [];
394
+ if (includedStates.length > 0) {
395
+ // Node should only exist in specified states
396
+ // Generate AddItems for each state, and the node is NOT added to
397
+ // elementsContent by default — it's only added via state overrides
398
+ for (const stateName of includedStates) {
399
+ this.addStateOverride(stateName, {
400
+ type: 'AddItems',
401
+ targetId: node.id ?? node.varName,
402
+ destinationId: '',
403
+ position: -1,
404
+ propertyName: 'elementsContent',
405
+ });
406
+ }
407
+ }
408
+ }
409
+ }
410
+ /**
411
+ * Add an override to an existing state definition.
412
+ */
413
+ addStateOverride(stateName, override) {
414
+ const state = this.states.find(s => s.name === stateName);
415
+ if (state) {
416
+ state.overrides.push(override);
417
+ }
418
+ }
419
+ /**
420
+ * Generate a unique variable name.
421
+ */
422
+ genVar(base) {
423
+ return `_${base.charAt(0).toLowerCase() + base.slice(1)}${++this.varCounter}`;
424
+ }
425
+ /**
426
+ * Get an attribute value by name.
427
+ */
428
+ getAttr(el, name) {
429
+ return el.attributes.find(a => a.name === name)?.value;
430
+ }
431
+ /**
432
+ * Register an import.
433
+ */
434
+ addImport(className, module) {
435
+ this.imports.set(className, module);
436
+ }
437
+ /**
438
+ * Build the final `SkinIR`.
439
+ */
440
+ toIR() {
441
+ // Extract numeric width/height (percent not valid for skin itself)
442
+ let width;
443
+ let height;
444
+ if (this._width?.type === 'literal' && typeof this._width.value === 'number') {
445
+ width = this._width.value;
446
+ }
447
+ if (this._height?.type === 'literal' && typeof this._height.value === 'number') {
448
+ height = this._height.value;
449
+ }
450
+ return {
451
+ className: this._className,
452
+ superClassName: 'Skin',
453
+ width,
454
+ height,
455
+ properties: this.rootProperties,
456
+ imports: this.imports,
457
+ skinParts: this.skinParts,
458
+ children: this.allNodes,
459
+ propertyChildren: [],
460
+ states: this.states,
461
+ declarations: this.declarations,
462
+ unresolvedTags: this.unresolvedTags,
463
+ };
464
+ }
465
+ }
466
+ //# sourceMappingURL=exml-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exml-parser.js","sourceRoot":"","sources":["../../../src/core/exml/exml-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * EXML skin file parser and code generator.
3
+ *
4
+ * Parses EXML (XML-based skin description format) into an intermediate
5
+ * representation (SkinIR), then generates ESM-compatible JavaScript
6
+ * factory functions.
7
+ *
8
+ * ## Usage
9
+ *
10
+ * ```ts
11
+ * import { parseEXML, generateCode } from './exml/index.js';
12
+ *
13
+ * const ir = parseEXML(exmlSource, 'MySkin');
14
+ * const jsCode = generateCode(ir);
15
+ * ```
16
+ */
17
+ export { parseXML, filterElements, getTextContent } from './xml-parser.js';
18
+ export type { XNode, XText, XAttribute, XElement } from './xml-parser.js';
19
+ export type { SkinIR, SkinNode, PropertyAssignment, PropertyValue, PropertyChild, LiteralValue, PercentValue, BindingValue, RefValue, StateDef, StateOverride, StateAddItems, StateSetProperty, StateSetStateProperty, BindingDef, } from './ast.js';
20
+ export { lookupComponent, getDefaultProperty, resolveModule, localName, isPropertyNode, parsePropertyNode, } from './registry.js';
21
+ export type { ComponentInfo, NamespaceModule } from './registry.js';
22
+ export { parseEXML, parseSkinRoot } from './exml-parser.js';
23
+ export { generateCode } from './codegen.js';
24
+ export type { CodeGenOptions } from './codegen.js';
25
+ import type { CodeGenOptions } from './codegen.js';
26
+ import type { NamespaceModule } from './registry.js';
27
+ import type { SkinIR } from './ast.js';
28
+ export interface CompileExmlOptions extends CodeGenOptions {
29
+ /**
30
+ * Project-defined EXML namespaces (see `ProjectConfig.exml.namespaces`).
31
+ */
32
+ customNamespaces?: readonly NamespaceModule[];
33
+ }
34
+ /**
35
+ * Compile an EXML source string directly to JavaScript.
36
+ *
37
+ * @param source - EXML source text
38
+ * @param className - Optional class name (used for factory function name)
39
+ * @param options - Code generation options, plus project-defined namespaces
40
+ * @returns Generated JS source string
41
+ */
42
+ export declare function compileEXML(source: string, className?: string, options?: CompileExmlOptions): string;
43
+ /**
44
+ * Compile an EXML source string to a SkinIR (parse only, no codegen).
45
+ *
46
+ * @param source - EXML source text
47
+ * @param className - Optional class name
48
+ * @param customNamespaces - Project-defined EXML namespaces
49
+ * @returns SkinIR intermediate representation
50
+ */
51
+ export declare function parseToIR(source: string, className?: string, customNamespaces?: readonly NamespaceModule[]): SkinIR;
52
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/exml/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC3E,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG1E,YAAY,EACX,MAAM,EACN,QAAQ,EACR,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,UAAU,GACV,MAAM,UAAU,CAAC;AAGlB,OAAO,EACN,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,SAAS,EACT,cAAc,EACd,iBAAiB,GACjB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGpE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAG5D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAMnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACzD;;OAEG;IACH,gBAAgB,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;CAC9C;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAGpG;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACxB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,gBAAgB,GAAE,SAAS,eAAe,EAAO,GAC/C,MAAM,CAER"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * EXML skin file parser and code generator.
3
+ *
4
+ * Parses EXML (XML-based skin description format) into an intermediate
5
+ * representation (SkinIR), then generates ESM-compatible JavaScript
6
+ * factory functions.
7
+ *
8
+ * ## Usage
9
+ *
10
+ * ```ts
11
+ * import { parseEXML, generateCode } from './exml/index.js';
12
+ *
13
+ * const ir = parseEXML(exmlSource, 'MySkin');
14
+ * const jsCode = generateCode(ir);
15
+ * ```
16
+ */
17
+ // ── XML Parser ───────────────────────────────────────────────────────
18
+ export { parseXML, filterElements, getTextContent } from './xml-parser.js';
19
+ // ── Component Registry ───────────────────────────────────────────────
20
+ export { lookupComponent, getDefaultProperty, resolveModule, localName, isPropertyNode, parsePropertyNode, } from './registry.js';
21
+ // ── EXML Parser ──────────────────────────────────────────────────────
22
+ export { parseEXML, parseSkinRoot } from './exml-parser.js';
23
+ // ── Code Generator ───────────────────────────────────────────────────
24
+ export { generateCode } from './codegen.js';
25
+ // ── Convenience: parse + generate in one step ────────────────────────
26
+ import { parseEXML } from './exml-parser.js';
27
+ import { generateCode } from './codegen.js';
28
+ /**
29
+ * Compile an EXML source string directly to JavaScript.
30
+ *
31
+ * @param source - EXML source text
32
+ * @param className - Optional class name (used for factory function name)
33
+ * @param options - Code generation options, plus project-defined namespaces
34
+ * @returns Generated JS source string
35
+ */
36
+ export function compileEXML(source, className, options) {
37
+ const ir = parseEXML(source, className, options?.customNamespaces ?? []);
38
+ return generateCode(ir, options);
39
+ }
40
+ /**
41
+ * Compile an EXML source string to a SkinIR (parse only, no codegen).
42
+ *
43
+ * @param source - EXML source text
44
+ * @param className - Optional class name
45
+ * @param customNamespaces - Project-defined EXML namespaces
46
+ * @returns SkinIR intermediate representation
47
+ */
48
+ export function parseToIR(source, className, customNamespaces = []) {
49
+ return parseEXML(source, className, customNamespaces);
50
+ }
51
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/exml/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,wEAAwE;AACxE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAsB3E,wEAAwE;AACxE,OAAO,EACN,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,SAAS,EACT,cAAc,EACd,iBAAiB,GACjB,MAAM,eAAe,CAAC;AAGvB,wEAAwE;AACxE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE5D,wEAAwE;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,wEAAwE;AAExE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAY5C;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,SAAkB,EAAE,OAA4B;IAC3F,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,IAAI,EAAE,CAAC,CAAC;IACzE,OAAO,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CACxB,MAAc,EACd,SAAkB,EAClB,mBAA+C,EAAE;IAEjD,OAAO,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;AACvD,CAAC"}