@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,422 @@
1
+ /**
2
+ * Code generator — converts SkinIR into JavaScript source code.
3
+ *
4
+ * Generates ESM-compatible factory functions that create and configure
5
+ * Skin instances with all components, states, and bindings.
6
+ */
7
+ import { lookupComponent } from './registry.js';
8
+ /**
9
+ * Generate JavaScript source code from a SkinIR.
10
+ *
11
+ * @param ir - The skin intermediate representation
12
+ * @param options - Code generation options
13
+ * @returns Generated JS source string
14
+ */
15
+ export function generateCode(ir, _options) {
16
+ return new CodeGen(ir).generate();
17
+ }
18
+ // ── Code generator ───────────────────────────────────────────────────
19
+ class CodeGen {
20
+ ir;
21
+ lines = [];
22
+ indent = 0;
23
+ constructor(ir) {
24
+ this.ir = ir;
25
+ }
26
+ generate() {
27
+ this.emitHeader();
28
+ this.emitImports();
29
+ this.emitFunction();
30
+ return this.lines.join('\n') + '\n';
31
+ }
32
+ // ── Header comment ────────────────────────────────────────────────
33
+ emitHeader() {
34
+ this.line(`// Generated from ${this.ir.className || 'Skin'}.exml`);
35
+ this.line('// @generated — do not edit manually');
36
+ this.line('');
37
+ }
38
+ // ── Imports ───────────────────────────────────────────────────────
39
+ emitImports() {
40
+ // Group imports by module
41
+ const moduleImports = new Map();
42
+ for (const [className, modulePath] of this.ir.imports) {
43
+ if (!moduleImports.has(modulePath)) {
44
+ moduleImports.set(modulePath, new Set());
45
+ }
46
+ moduleImports.get(modulePath).add(className);
47
+ }
48
+ // Also ensure we import Binding if there are any bindings
49
+ let hasBindings = this.hasBindingsInTree(this.ir.children);
50
+ if (hasBindings) {
51
+ if (!moduleImports.has('@kurot/ui')) {
52
+ moduleImports.set('@kurot/ui', new Set());
53
+ }
54
+ moduleImports.get('@kurot/ui').add('Binding');
55
+ }
56
+ // Egret encodes Rectangle-valued properties such as scale9Grid as a
57
+ // comma-separated EXML attribute (for example "1,3,8,8").
58
+ if (this.hasPropertyInTree('scale9Grid')) {
59
+ if (!moduleImports.has('@kurot/core')) {
60
+ moduleImports.set('@kurot/core', new Set());
61
+ }
62
+ moduleImports.get('@kurot/core').add('Rectangle');
63
+ }
64
+ // Ensure State, AddItems, SetProperty are imported if we have states
65
+ if (this.ir.states.length > 0) {
66
+ if (!moduleImports.has('@kurot/ui')) {
67
+ moduleImports.set('@kurot/ui', new Set());
68
+ }
69
+ const uiImports = moduleImports.get('@kurot/ui');
70
+ uiImports.add('State');
71
+ uiImports.add('SetProperty'); // always needed for node state-specific props
72
+ for (const state of this.ir.states) {
73
+ for (const override of state.overrides) {
74
+ uiImports.add(override.type);
75
+ }
76
+ }
77
+ }
78
+ for (const [modulePath, classes] of moduleImports) {
79
+ const names = [...classes].sort().join(', ');
80
+ this.line(`import { ${names} } from "${modulePath}";`);
81
+ }
82
+ this.line('');
83
+ }
84
+ // ── Factory function ──────────────────────────────────────────────
85
+ emitFunction() {
86
+ const funcName = this.factoryName(this.ir.className);
87
+ this.line(`export function ${funcName}() {`);
88
+ this.indent++;
89
+ // Create skin instance
90
+ this.line('const skin = new Skin();');
91
+ // Set skin parts
92
+ if (this.ir.skinParts.length > 0) {
93
+ this.line(`skin.skinParts = ${JSON.stringify(this.ir.skinParts)};`);
94
+ }
95
+ // Set skin dimensions
96
+ if (this.ir.width != null) {
97
+ this.line(`skin.width = ${this.ir.width};`);
98
+ }
99
+ if (this.ir.height != null) {
100
+ this.line(`skin.height = ${this.ir.height};`);
101
+ }
102
+ for (const prop of this.ir.properties) {
103
+ if (!prop.state)
104
+ this.emitPropertyAssignment('skin', prop.name, prop.value);
105
+ }
106
+ // Create and configure all nodes
107
+ this.emitNodeDeclarations(this.ir.children, 'skin');
108
+ // Set elementsContent on skin
109
+ const defaultChildren = this.ir.children.filter(n => n.includeIn.length === 0 && n.excludeFrom.length === 0);
110
+ if (defaultChildren.length > 0) {
111
+ const childVars = defaultChildren.map(n => n.varName).join(', ');
112
+ this.line(`skin.elementsContent = [${childVars}];`);
113
+ }
114
+ // Emit declarations (non-visual)
115
+ for (const decl of this.ir.declarations) {
116
+ this.emitNodeCreation(decl);
117
+ this.emitNodeProperties(decl);
118
+ }
119
+ // Emit states
120
+ this.emitStates();
121
+ this.line('return skin;');
122
+ this.indent--;
123
+ this.line('}');
124
+ }
125
+ // ── Node declarations ─────────────────────────────────────────────
126
+ emitNodeDeclarations(nodes, parentVar) {
127
+ for (const node of nodes) {
128
+ this.emitNodeCreation(node);
129
+ this.emitNodeProperties(node);
130
+ this.emitNodePropertyChildren(node);
131
+ // Recurse into children
132
+ this.emitNodeDeclarations(node.children, node.varName);
133
+ // Assign children to default property
134
+ const defaultPropChildren = node.children.filter(c => c.includeIn.length === 0 && c.excludeFrom.length === 0);
135
+ if (defaultPropChildren.length > 0) {
136
+ const info = lookupComponent(node.className);
137
+ const defaultProp = info?.defaultProperty ?? 'elementsContent';
138
+ const isArray = info?.isArray !== false;
139
+ const childVars = defaultPropChildren.map(c => c.varName).join(', ');
140
+ if (isArray) {
141
+ this.line(`${node.varName}.${defaultProp} = [${childVars}];`);
142
+ }
143
+ else {
144
+ // Single-value property: assign first child directly
145
+ this.line(`${node.varName}.${defaultProp} = ${defaultPropChildren[0].varName};`);
146
+ }
147
+ }
148
+ }
149
+ }
150
+ emitNodeCreation(node) {
151
+ this.line(`const ${node.varName} = new ${node.className}();`);
152
+ // If node has an id, set it on the skin (skin part)
153
+ if (node.id) {
154
+ this.line(`skin.${node.id} = ${node.varName};`);
155
+ }
156
+ else {
157
+ // If node has state-specific properties, register it on skin by varName
158
+ // so SetProperty can resolve it via skin.getPart(varName)
159
+ const hasStateProps = node.properties.some(p => p.state);
160
+ if (hasStateProps) {
161
+ this.line(`skin.${node.varName} = ${node.varName};`);
162
+ }
163
+ }
164
+ }
165
+ // ── Properties ────────────────────────────────────────────────────
166
+ emitNodeProperties(node) {
167
+ for (const prop of node.properties) {
168
+ if (prop.state) {
169
+ // State-specific property → handled via SetProperty override
170
+ continue;
171
+ }
172
+ this.emitPropertyAssignment(node.varName, prop.name, prop.value);
173
+ }
174
+ }
175
+ emitPropertyAssignment(target, prop, value) {
176
+ // Handle percent width/height specially
177
+ if (value.type === 'percent') {
178
+ if (prop === 'width') {
179
+ this.line(`${target}.percentWidth = ${value.value};`);
180
+ return;
181
+ }
182
+ if (prop === 'height') {
183
+ this.line(`${target}.percentHeight = ${value.value};`);
184
+ return;
185
+ }
186
+ }
187
+ // Handle bindings
188
+ if (value.type === 'binding') {
189
+ this.emitBinding(target, prop, value.expression);
190
+ return;
191
+ }
192
+ this.line(`${target}.${prop} = ${this.propertyValueToJS(prop, value)};`);
193
+ }
194
+ emitBinding(target, prop, expression) {
195
+ // The expression is already stripped of outer braces by parseValue().
196
+ // Check whether it contains inner braces (template binding like "Hello {name}!").
197
+ if (expression.includes('{')) {
198
+ // Template binding: Binding.bindProperties
199
+ const parts = parseBindingTemplate(expression);
200
+ if (parts.some(p => p.type === 'binding')) {
201
+ const templates = [];
202
+ const chainIndex = [];
203
+ for (let i = 0; i < parts.length; i++) {
204
+ if (parts[i].type === 'literal') {
205
+ templates.push(`"${escapeJS(parts[i].value)}"`);
206
+ }
207
+ else {
208
+ templates.push(`"${parts[i].value}"`);
209
+ chainIndex.push(i);
210
+ }
211
+ }
212
+ this.line(`Binding.bindProperties(this, [${templates.join(', ')}], [${chainIndex.join(', ')}], ${target}, "${prop}");`);
213
+ }
214
+ }
215
+ else {
216
+ // Simple binding: Binding.bindProperty(host, ['chain'], target, 'prop')
217
+ this.line(`Binding.bindProperty(this, ["${expression.split('.').join('", "')}"], ${target}, "${prop}");`);
218
+ }
219
+ }
220
+ // ── Property children ─────────────────────────────────────────────
221
+ emitNodePropertyChildren(node) {
222
+ for (const pc of node.propertyChildren) {
223
+ for (const child of pc.nodes) {
224
+ if (typeof child === 'string') {
225
+ this.line(`${node.varName}.${pc.propertyName} = ${JSON.stringify(child)};`);
226
+ }
227
+ else {
228
+ this.emitNodeCreation(child);
229
+ this.emitNodeProperties(child);
230
+ this.line(`${node.varName}.${pc.propertyName} = ${child.varName};`);
231
+ }
232
+ }
233
+ }
234
+ }
235
+ // ── States ────────────────────────────────────────────────────────
236
+ emitStates() {
237
+ if (this.ir.states.length === 0)
238
+ return;
239
+ const stateLines = [];
240
+ for (const state of this.ir.states) {
241
+ stateLines.push(this.generateStateExpr(state));
242
+ }
243
+ this.line(`skin.states = [${stateLines.join(', ')}];`);
244
+ }
245
+ generateStateExpr(state) {
246
+ // Collect overrides: explicit overrides from State element + state-specific props from nodes
247
+ const allOverrides = [...state.overrides];
248
+ // Add SetProperty overrides from node properties with this state name or matching stateGroup
249
+ const nodeOverrides = this.collectStatePropertyOverrides(this.ir.children);
250
+ for (const prop of this.ir.properties) {
251
+ if (prop.state) {
252
+ nodeOverrides.push({
253
+ stateName: prop.state,
254
+ targetId: '',
255
+ propName: prop.name,
256
+ value: prop.value,
257
+ });
258
+ }
259
+ }
260
+ for (const { stateName, targetId, propName, value } of nodeOverrides) {
261
+ // Match by state name or by stateGroup membership
262
+ const matches = stateName === state.name || state.stateGroups.includes(stateName);
263
+ if (matches) {
264
+ allOverrides.push({ type: 'SetProperty', targetId, name: propName, value });
265
+ }
266
+ }
267
+ if (allOverrides.length === 0) {
268
+ return `new State("${state.name}")`;
269
+ }
270
+ const overrides = allOverrides.map(o => this.generateOverrideExpr(o)).join(', ');
271
+ return `new State("${state.name}", [${overrides}])`;
272
+ }
273
+ generateOverrideExpr(override) {
274
+ switch (override.type) {
275
+ case 'AddItems': {
276
+ const o = override;
277
+ return `new AddItems("${o.targetId}", "${o.destinationId}", ${o.position}, "${o.propertyName}")`;
278
+ }
279
+ case 'SetProperty': {
280
+ const o = override;
281
+ return `new SetProperty("${o.targetId}", "${o.name}", ${this.propertyValueToJS(o.name, o.value)})`;
282
+ }
283
+ default:
284
+ return '/* unknown override */';
285
+ }
286
+ }
287
+ collectStatePropertyOverrides(nodes) {
288
+ const result = [];
289
+ for (const node of nodes) {
290
+ for (const prop of node.properties) {
291
+ if (prop.state) {
292
+ result.push({
293
+ stateName: prop.state,
294
+ targetId: node.id ?? node.varName,
295
+ propName: prop.name,
296
+ value: prop.value,
297
+ });
298
+ }
299
+ }
300
+ result.push(...this.collectStatePropertyOverrides(node.children));
301
+ }
302
+ return result;
303
+ }
304
+ // ── Value helpers ─────────────────────────────────────────────────
305
+ valueToJS(value) {
306
+ switch (value.type) {
307
+ case 'literal':
308
+ return literalToJS(value);
309
+ case 'percent':
310
+ return String(value.value);
311
+ case 'binding':
312
+ return `/* binding: ${value.expression} */`;
313
+ case 'ref':
314
+ return value.varName;
315
+ default:
316
+ return 'undefined';
317
+ }
318
+ }
319
+ propertyValueToJS(prop, value) {
320
+ if (prop === 'scale9Grid' && value.type === 'literal' && typeof value.value === 'string') {
321
+ const parts = value.value.split(',').map(part => Number(part.trim()));
322
+ if (parts.length === 4 && parts.every(Number.isFinite)) {
323
+ return `new Rectangle(${parts.join(', ')})`;
324
+ }
325
+ }
326
+ return this.valueToJS(value);
327
+ }
328
+ // ── Utilities ─────────────────────────────────────────────────────
329
+ line(text) {
330
+ if (text === '') {
331
+ this.lines.push('');
332
+ }
333
+ else {
334
+ this.lines.push('\t'.repeat(this.indent) + text);
335
+ }
336
+ }
337
+ factoryName(className) {
338
+ if (!className)
339
+ return 'createSkin';
340
+ // Convert "skins.MySkin" → "createMySkin"
341
+ const parts = className.split('.');
342
+ const base = parts[parts.length - 1];
343
+ return `create${base}`;
344
+ }
345
+ hasBindingsInTree(nodes) {
346
+ for (const node of nodes) {
347
+ for (const prop of node.properties) {
348
+ if (prop.value.type === 'binding')
349
+ return true;
350
+ }
351
+ if (this.hasBindingsInTree(node.children))
352
+ return true;
353
+ }
354
+ return false;
355
+ }
356
+ hasPropertyInTree(propertyName) {
357
+ if (this.ir.properties.some(prop => prop.name === propertyName))
358
+ return true;
359
+ const visit = (nodes) => {
360
+ for (const node of nodes) {
361
+ if (node.properties.some(prop => prop.name === propertyName))
362
+ return true;
363
+ if (visit(node.children))
364
+ return true;
365
+ }
366
+ return false;
367
+ };
368
+ return visit(this.ir.children) || visit(this.ir.declarations);
369
+ }
370
+ }
371
+ // ── Utility functions ────────────────────────────────────────────────
372
+ function literalToJS(value) {
373
+ if (value.value === null)
374
+ return 'null';
375
+ if (typeof value.value === 'boolean')
376
+ return value.value ? 'true' : 'false';
377
+ if (typeof value.value === 'number')
378
+ return String(value.value);
379
+ return JSON.stringify(value.value);
380
+ }
381
+ function escapeJS(s) {
382
+ return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n');
383
+ }
384
+ /**
385
+ * Parse a binding template expression.
386
+ * e.g. "Hello {name}!" → [{literal: "Hello "}, {binding: "name"}, {literal: "!"}]
387
+ * e.g. "{data.label}" → [{binding: "data.label"}]
388
+ */
389
+ function parseBindingTemplate(expr) {
390
+ const parts = [];
391
+ let i = 0;
392
+ let current = '';
393
+ while (i < expr.length) {
394
+ if (expr[i] === '{') {
395
+ if (current) {
396
+ parts.push({ type: 'literal', value: current });
397
+ current = '';
398
+ }
399
+ // Find matching }
400
+ let depth = 1;
401
+ let j = i + 1;
402
+ while (j < expr.length && depth > 0) {
403
+ if (expr[j] === '{')
404
+ depth++;
405
+ if (expr[j] === '}')
406
+ depth--;
407
+ j++;
408
+ }
409
+ parts.push({ type: 'binding', value: expr.slice(i + 1, j - 1) });
410
+ i = j;
411
+ }
412
+ else {
413
+ current += expr[i];
414
+ i++;
415
+ }
416
+ }
417
+ if (current) {
418
+ parts.push({ type: 'literal', value: current });
419
+ }
420
+ return parts;
421
+ }
422
+ //# sourceMappingURL=codegen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../../src/core/exml/codegen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
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 type { XElement } from './xml-parser.js';
8
+ import type { NamespaceModule } from './registry.js';
9
+ import type { SkinIR } from './ast.js';
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 declare function parseEXML(source: string, className?: string, customNamespaces?: readonly NamespaceModule[]): SkinIR;
19
+ /**
20
+ * Parse an already-parsed XML root element into a SkinIR.
21
+ *
22
+ * @param root - The parsed XML root element
23
+ * @param customNamespaces - Project-defined EXML namespaces
24
+ * @returns The parsed skin intermediate representation
25
+ */
26
+ export declare function parseSkinRoot(root: XElement, customNamespaces?: readonly NamespaceModule[]): SkinIR;
27
+ //# sourceMappingURL=exml-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exml-parser.d.ts","sourceRoot":"","sources":["../../../src/core/exml/exml-parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAS,MAAM,iBAAiB,CAAC;AAGvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EACX,MAAM,EASN,MAAM,UAAU,CAAC;AAIlB;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACxB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,gBAAgB,GAAE,SAAS,eAAe,EAAO,GAC/C,MAAM,CAOR;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,gBAAgB,GAAE,SAAS,eAAe,EAAO,GAAG,MAAM,CAIvG"}