@clusterenvision/ui-framework 1.0.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 (193) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +295 -0
  3. package/dist/ai-assistant-Db002XYC.d.ts +92 -0
  4. package/dist/ai-assistant-EobSUV70.d.cts +92 -0
  5. package/dist/browser-DnHpnWwE.d.cts +354 -0
  6. package/dist/browser-Dx4oKf5e.d.ts +354 -0
  7. package/dist/browser-signals-07qodpYT.d.cts +66 -0
  8. package/dist/browser-signals-07qodpYT.d.ts +66 -0
  9. package/dist/browser-signals.cjs +32 -0
  10. package/dist/browser-signals.cjs.map +1 -0
  11. package/dist/browser-signals.d.cts +1 -0
  12. package/dist/browser-signals.d.ts +1 -0
  13. package/dist/browser-signals.js +3 -0
  14. package/dist/browser-signals.js.map +1 -0
  15. package/dist/browser.cjs +197 -0
  16. package/dist/browser.cjs.map +1 -0
  17. package/dist/browser.d.cts +13 -0
  18. package/dist/browser.d.ts +13 -0
  19. package/dist/browser.js +12 -0
  20. package/dist/browser.js.map +1 -0
  21. package/dist/chunk-22HQL2Y4.js +568 -0
  22. package/dist/chunk-22HQL2Y4.js.map +1 -0
  23. package/dist/chunk-3ZBRNFEE.js +1525 -0
  24. package/dist/chunk-3ZBRNFEE.js.map +1 -0
  25. package/dist/chunk-4HRORR2Q.js +1953 -0
  26. package/dist/chunk-4HRORR2Q.js.map +1 -0
  27. package/dist/chunk-4L3UXVL5.cjs +68 -0
  28. package/dist/chunk-4L3UXVL5.cjs.map +1 -0
  29. package/dist/chunk-6BYWFGQY.cjs +226 -0
  30. package/dist/chunk-6BYWFGQY.cjs.map +1 -0
  31. package/dist/chunk-7SCIB5HP.js +57 -0
  32. package/dist/chunk-7SCIB5HP.js.map +1 -0
  33. package/dist/chunk-BBAUALNU.js +888 -0
  34. package/dist/chunk-BBAUALNU.js.map +1 -0
  35. package/dist/chunk-CHLDE4JQ.js +715 -0
  36. package/dist/chunk-CHLDE4JQ.js.map +1 -0
  37. package/dist/chunk-CXTAUXLG.cjs +71 -0
  38. package/dist/chunk-CXTAUXLG.cjs.map +1 -0
  39. package/dist/chunk-D2USIT6V.js +121 -0
  40. package/dist/chunk-D2USIT6V.js.map +1 -0
  41. package/dist/chunk-D3H5CGVD.js +36 -0
  42. package/dist/chunk-D3H5CGVD.js.map +1 -0
  43. package/dist/chunk-DQBX75NJ.js +92 -0
  44. package/dist/chunk-DQBX75NJ.js.map +1 -0
  45. package/dist/chunk-DRPG2DFX.js +208 -0
  46. package/dist/chunk-DRPG2DFX.js.map +1 -0
  47. package/dist/chunk-EFOOXCY7.cjs +41 -0
  48. package/dist/chunk-EFOOXCY7.cjs.map +1 -0
  49. package/dist/chunk-FFCZSYC7.cjs +906 -0
  50. package/dist/chunk-FFCZSYC7.cjs.map +1 -0
  51. package/dist/chunk-FNXIYAET.cjs +1593 -0
  52. package/dist/chunk-FNXIYAET.cjs.map +1 -0
  53. package/dist/chunk-I6GNUM3P.cjs +63 -0
  54. package/dist/chunk-I6GNUM3P.cjs.map +1 -0
  55. package/dist/chunk-IHAMVLRY.js +129 -0
  56. package/dist/chunk-IHAMVLRY.js.map +1 -0
  57. package/dist/chunk-IRBUKIRF.cjs +133 -0
  58. package/dist/chunk-IRBUKIRF.cjs.map +1 -0
  59. package/dist/chunk-KPG5HAHK.cjs +97 -0
  60. package/dist/chunk-KPG5HAHK.cjs.map +1 -0
  61. package/dist/chunk-N7Q2ESLG.cjs +130 -0
  62. package/dist/chunk-N7Q2ESLG.cjs.map +1 -0
  63. package/dist/chunk-PFBEIFVS.js +180 -0
  64. package/dist/chunk-PFBEIFVS.js.map +1 -0
  65. package/dist/chunk-PVZVFICK.cjs +318 -0
  66. package/dist/chunk-PVZVFICK.cjs.map +1 -0
  67. package/dist/chunk-Q3KH6HMU.js +305 -0
  68. package/dist/chunk-Q3KH6HMU.js.map +1 -0
  69. package/dist/chunk-QPAAV32J.cjs +1985 -0
  70. package/dist/chunk-QPAAV32J.cjs.map +1 -0
  71. package/dist/chunk-R6XQUMWT.cjs +61 -0
  72. package/dist/chunk-R6XQUMWT.cjs.map +1 -0
  73. package/dist/chunk-SA5UD5B6.js +92 -0
  74. package/dist/chunk-SA5UD5B6.js.map +1 -0
  75. package/dist/chunk-SM35JOYD.cjs +211 -0
  76. package/dist/chunk-SM35JOYD.cjs.map +1 -0
  77. package/dist/chunk-SZQNIMYI.cjs +592 -0
  78. package/dist/chunk-SZQNIMYI.cjs.map +1 -0
  79. package/dist/chunk-T6T7QE4J.js +224 -0
  80. package/dist/chunk-T6T7QE4J.js.map +1 -0
  81. package/dist/chunk-TIF372DZ.js +65 -0
  82. package/dist/chunk-TIF372DZ.js.map +1 -0
  83. package/dist/chunk-V6JCOBGY.js +69 -0
  84. package/dist/chunk-V6JCOBGY.js.map +1 -0
  85. package/dist/chunk-VHUXNDW2.cjs +189 -0
  86. package/dist/chunk-VHUXNDW2.cjs.map +1 -0
  87. package/dist/chunk-W3LNNY3U.cjs +729 -0
  88. package/dist/chunk-W3LNNY3U.cjs.map +1 -0
  89. package/dist/chunk-ZUWSU4OA.js +61 -0
  90. package/dist/chunk-ZUWSU4OA.js.map +1 -0
  91. package/dist/chunk-ZWUA2LPB.cjs +103 -0
  92. package/dist/chunk-ZWUA2LPB.cjs.map +1 -0
  93. package/dist/cli/index.cjs +566 -0
  94. package/dist/cli/index.cjs.map +1 -0
  95. package/dist/cli/index.d.cts +1 -0
  96. package/dist/cli/index.d.ts +1 -0
  97. package/dist/cli/index.js +558 -0
  98. package/dist/cli/index.js.map +1 -0
  99. package/dist/compiler/index.cjs +80 -0
  100. package/dist/compiler/index.cjs.map +1 -0
  101. package/dist/compiler/index.d.cts +130 -0
  102. package/dist/compiler/index.d.ts +130 -0
  103. package/dist/compiler/index.js +3 -0
  104. package/dist/compiler/index.js.map +1 -0
  105. package/dist/component-BVzvepw9.d.cts +90 -0
  106. package/dist/component-wTxZ2BPD.d.ts +90 -0
  107. package/dist/index-CpxDa60m.d.cts +644 -0
  108. package/dist/index-CpxDa60m.d.ts +644 -0
  109. package/dist/index.cjs +1356 -0
  110. package/dist/index.cjs.map +1 -0
  111. package/dist/index.d.cts +165 -0
  112. package/dist/index.d.ts +165 -0
  113. package/dist/index.js +772 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/lib/dom.cjs +102 -0
  116. package/dist/lib/dom.cjs.map +1 -0
  117. package/dist/lib/dom.d.cts +373 -0
  118. package/dist/lib/dom.d.ts +373 -0
  119. package/dist/lib/dom.js +3 -0
  120. package/dist/lib/dom.js.map +1 -0
  121. package/dist/lib/icons.cjs +20 -0
  122. package/dist/lib/icons.cjs.map +1 -0
  123. package/dist/lib/icons.d.cts +64 -0
  124. package/dist/lib/icons.d.ts +64 -0
  125. package/dist/lib/icons.js +3 -0
  126. package/dist/lib/icons.js.map +1 -0
  127. package/dist/lib/index.cjs +247 -0
  128. package/dist/lib/index.cjs.map +1 -0
  129. package/dist/lib/index.d.cts +30 -0
  130. package/dist/lib/index.d.ts +30 -0
  131. package/dist/lib/index.js +92 -0
  132. package/dist/lib/index.js.map +1 -0
  133. package/dist/lib/theme.cjs +56 -0
  134. package/dist/lib/theme.cjs.map +1 -0
  135. package/dist/lib/theme.d.cts +27 -0
  136. package/dist/lib/theme.d.ts +27 -0
  137. package/dist/lib/theme.js +3 -0
  138. package/dist/lib/theme.js.map +1 -0
  139. package/dist/router-B9kms5XQ.d.ts +124 -0
  140. package/dist/router-YnpW_sIK.d.cts +124 -0
  141. package/dist/runtime/adapters/angular.cjs +48 -0
  142. package/dist/runtime/adapters/angular.cjs.map +1 -0
  143. package/dist/runtime/adapters/angular.d.cts +38 -0
  144. package/dist/runtime/adapters/angular.d.ts +38 -0
  145. package/dist/runtime/adapters/angular.js +46 -0
  146. package/dist/runtime/adapters/angular.js.map +1 -0
  147. package/dist/runtime/adapters/react.cjs +41 -0
  148. package/dist/runtime/adapters/react.cjs.map +1 -0
  149. package/dist/runtime/adapters/react.d.cts +26 -0
  150. package/dist/runtime/adapters/react.d.ts +26 -0
  151. package/dist/runtime/adapters/react.js +39 -0
  152. package/dist/runtime/adapters/react.js.map +1 -0
  153. package/dist/runtime/adapters/vue.cjs +44 -0
  154. package/dist/runtime/adapters/vue.cjs.map +1 -0
  155. package/dist/runtime/adapters/vue.d.cts +37 -0
  156. package/dist/runtime/adapters/vue.d.ts +37 -0
  157. package/dist/runtime/adapters/vue.js +42 -0
  158. package/dist/runtime/adapters/vue.js.map +1 -0
  159. package/dist/runtime/components/ai-assistant.cjs +18 -0
  160. package/dist/runtime/components/ai-assistant.cjs.map +1 -0
  161. package/dist/runtime/components/ai-assistant.d.cts +8 -0
  162. package/dist/runtime/components/ai-assistant.d.ts +8 -0
  163. package/dist/runtime/components/ai-assistant.js +9 -0
  164. package/dist/runtime/components/ai-assistant.js.map +1 -0
  165. package/dist/runtime/components/ai-summary-card.cjs +18 -0
  166. package/dist/runtime/components/ai-summary-card.cjs.map +1 -0
  167. package/dist/runtime/components/ai-summary-card.d.cts +19 -0
  168. package/dist/runtime/components/ai-summary-card.d.ts +19 -0
  169. package/dist/runtime/components/ai-summary-card.js +9 -0
  170. package/dist/runtime/components/ai-summary-card.js.map +1 -0
  171. package/dist/runtime/router.cjs +429 -0
  172. package/dist/runtime/router.cjs.map +1 -0
  173. package/dist/runtime/router.d.cts +2 -0
  174. package/dist/runtime/router.d.ts +2 -0
  175. package/dist/runtime/router.js +421 -0
  176. package/dist/runtime/router.js.map +1 -0
  177. package/dist/runtime/server.cjs +125 -0
  178. package/dist/runtime/server.cjs.map +1 -0
  179. package/dist/runtime/server.d.cts +27 -0
  180. package/dist/runtime/server.d.ts +27 -0
  181. package/dist/runtime/server.js +117 -0
  182. package/dist/runtime/server.js.map +1 -0
  183. package/dist/runtime/workflow/index.cjs +282 -0
  184. package/dist/runtime/workflow/index.cjs.map +1 -0
  185. package/dist/runtime/workflow/index.d.cts +1 -0
  186. package/dist/runtime/workflow/index.d.ts +1 -0
  187. package/dist/runtime/workflow/index.js +5 -0
  188. package/dist/runtime/workflow/index.js.map +1 -0
  189. package/dist/tracing-DGdvMCEl.d.cts +109 -0
  190. package/dist/tracing-DGdvMCEl.d.ts +109 -0
  191. package/dist/types-C4RXXKfk.d.cts +76 -0
  192. package/dist/types-C4RXXKfk.d.ts +76 -0
  193. package/package.json +166 -0
@@ -0,0 +1,558 @@
1
+ #!/usr/bin/env node
2
+ import { buildChromeTraceDocument } from '../chunk-TIF372DZ.js';
3
+ import { buildRuntimeChromeTraceDocument } from '../chunk-ZUWSU4OA.js';
4
+ import { createStyleScopeId, scopeStyles } from '../chunk-IHAMVLRY.js';
5
+ import { compileTemplate } from '../chunk-BBAUALNU.js';
6
+ import { Command } from 'commander';
7
+ import { readFile, mkdir, writeFile, rm, stat, readdir } from 'fs/promises';
8
+ import { resolve, join, relative, dirname, basename } from 'path';
9
+ import chokidar from 'chokidar';
10
+ import fg from 'fast-glob';
11
+ import pc from 'picocolors';
12
+ import { GenMapping, setSourceContent, addMapping, toEncodedMap } from '@jridgewell/gen-mapping';
13
+ import { promises } from 'fs';
14
+ import { spawn } from 'child_process';
15
+
16
+ async function runCompile(pattern, options = {}) {
17
+ const compiler = new ComponentFileCompiler(options);
18
+ const files = await compiler.compileInitial(pattern);
19
+ if (!files.length && !options.watch) {
20
+ console.warn(pc.yellow("No .cex files found."));
21
+ return;
22
+ }
23
+ if (options.watch) {
24
+ await compiler.watch(pattern);
25
+ }
26
+ }
27
+ var ComponentFileCompiler = class {
28
+ constructor(options) {
29
+ this.options = options;
30
+ }
31
+ options;
32
+ async compileInitial(pattern) {
33
+ const entries = Array.isArray(pattern) ? pattern : [pattern];
34
+ const files = await fg(entries, { absolute: true });
35
+ await Promise.all(files.map((file) => this.compileFile(file)));
36
+ return files;
37
+ }
38
+ async watch(pattern) {
39
+ const entries = Array.isArray(pattern) ? pattern : [pattern];
40
+ const watcher = chokidar.watch(entries, { ignoreInitial: true });
41
+ console.log(pc.cyan("Watching .cex files for changes..."));
42
+ const recompile = async (file) => {
43
+ await this.compileFile(file);
44
+ };
45
+ watcher.on("add", (file) => {
46
+ void recompile(file);
47
+ });
48
+ watcher.on("change", (file) => {
49
+ void recompile(file);
50
+ });
51
+ watcher.on("unlink", (file) => {
52
+ void this.removeOutput(file);
53
+ console.log(pc.dim(`removed ${relative(process.cwd(), file)}`));
54
+ });
55
+ await new Promise((resolve4, reject) => {
56
+ watcher.on("error", (error) => {
57
+ const normalized = error instanceof Error ? error : new Error(String(error));
58
+ console.error(pc.red(`Watcher error: ${normalized.message}`));
59
+ reject(normalized);
60
+ });
61
+ const close = () => {
62
+ watcher.close().then(resolve4).catch((err) => {
63
+ const normalized = err instanceof Error ? err : new Error(String(err));
64
+ reject(normalized);
65
+ });
66
+ };
67
+ process.once("SIGINT", close);
68
+ process.once("SIGTERM", close);
69
+ });
70
+ }
71
+ async compileFile(file) {
72
+ try {
73
+ const source = await readFile(file, "utf8");
74
+ const { template, styles } = parseComponentFile(source);
75
+ const scopeId = styles.length ? createStyleScopeId(`${file}:${styles.join("|")}`) : void 0;
76
+ const compiled = compileTemplate(template, {
77
+ ...this.options,
78
+ name: this.options.name ?? deriveName(file),
79
+ scopeId
80
+ });
81
+ if (scopeId) {
82
+ compiled.scopeId = scopeId;
83
+ }
84
+ if (styles.length) {
85
+ compiled.styles = scopeId ? scopeStyles(styles, scopeId) : styles;
86
+ }
87
+ await this.writeOutput(file, compiled, source);
88
+ this.logSuccess(file);
89
+ } catch (error) {
90
+ this.logError(file, error);
91
+ }
92
+ }
93
+ async writeOutput(file, compiled, source) {
94
+ const outFile = this.resolveOutFile(file);
95
+ await mkdir(dirname(outFile), { recursive: true });
96
+ const emission = emitModule(compiled, {
97
+ outFile,
98
+ source,
99
+ sourcePath: file,
100
+ withSourceMap: Boolean(this.options.sourceMap)
101
+ });
102
+ await writeFile(outFile, emission.code, "utf8");
103
+ if (emission.map) {
104
+ await writeFile(`${outFile}.map`, JSON.stringify(emission.map, null, 2), "utf8");
105
+ }
106
+ }
107
+ async removeOutput(file) {
108
+ const outFile = this.resolveOutFile(file);
109
+ await rm(outFile, { force: true });
110
+ if (this.options.sourceMap) {
111
+ await rm(`${outFile}.map`, { force: true });
112
+ }
113
+ }
114
+ resolveOutFile(file) {
115
+ const outDir = this.options.outDir ? resolve(this.options.outDir) : dirname(file);
116
+ return join(outDir, `${deriveName(file)}.cex.ts`);
117
+ }
118
+ logSuccess(file) {
119
+ const outFile = this.resolveOutFile(file);
120
+ console.log(pc.green(`compiled ${relative(process.cwd(), file)} -> ${relative(process.cwd(), outFile)}`));
121
+ }
122
+ logError(file, error) {
123
+ const message = error instanceof Error ? error.message : String(error);
124
+ console.error(pc.red(`failed to compile ${relative(process.cwd(), file)}: ${message}`));
125
+ }
126
+ };
127
+ function parseComponentFile(source) {
128
+ const templatePattern = /<template>([\s\S]*?)<\/template>/i;
129
+ const templateMatch = templatePattern.exec(source);
130
+ if (!templateMatch) {
131
+ throw new Error("Missing <template> block.");
132
+ }
133
+ const styleMatches = Array.from(source.matchAll(/<style[^>]*>([\s\S]*?)<\/style>/gi));
134
+ const styles = styleMatches.map((match) => match[1].trim()).filter(Boolean);
135
+ return { template: templateMatch[1], styles };
136
+ }
137
+ function emitModule(compiled, options) {
138
+ const payload = JSON.stringify(compiled, null, 2);
139
+ let code = `import type { CompiledTemplate } from '@clusterenvision/ui-framework/compiler';
140
+ export const template = ${payload} satisfies CompiledTemplate;
141
+ export default template;
142
+ `;
143
+ let map;
144
+ if (options.withSourceMap) {
145
+ const relSource = relative(dirname(options.outFile), options.sourcePath).replace(/\\/g, "/");
146
+ const mapping = new GenMapping({ file: basename(options.outFile) });
147
+ setSourceContent(mapping, relSource, options.source);
148
+ addMapping(mapping, {
149
+ source: relSource,
150
+ original: { line: 1, column: 0 },
151
+ generated: { line: 1, column: 0 }
152
+ });
153
+ map = toEncodedMap(mapping);
154
+ code += `//# sourceMappingURL=${basename(options.outFile)}.map
155
+ `;
156
+ }
157
+ return { code, map };
158
+ }
159
+ function deriveName(file) {
160
+ const base = file.split("/").pop() ?? "component";
161
+ return base.replace(/\.[^.]+$/, "");
162
+ }
163
+ var VALID_FORMATS = /* @__PURE__ */ new Set(["chrome", "events"]);
164
+ async function runRuntimeTimeline(options) {
165
+ const format = options.format ?? "chrome";
166
+ if (!VALID_FORMATS.has(format)) {
167
+ throw new Error(`Unsupported format '${format}'. Expected one of: ${[...VALID_FORMATS].join(", ")}`);
168
+ }
169
+ const events = await readTraceEvents(options.input);
170
+ const payload = format === "chrome" ? buildChromeTracePayload(events) : buildEventsPayload(events);
171
+ if (options.output) {
172
+ await promises.writeFile(options.output, payload, "utf8");
173
+ return;
174
+ }
175
+ process.stdout.write(`${payload}
176
+ `);
177
+ }
178
+ async function readTraceEvents(filePath) {
179
+ const contents = await promises.readFile(filePath, "utf8");
180
+ const trimmed = contents.trim();
181
+ if (!trimmed) {
182
+ return [];
183
+ }
184
+ const serialized = trimmed.startsWith("[") ? JSON.parse(trimmed) : trimmed.split("\n").map((line) => line.trim()).filter(Boolean).map((line) => JSON.parse(line));
185
+ return serialized.map((event) => ({
186
+ ...event,
187
+ timestamp: new Date(event.timestamp)
188
+ }));
189
+ }
190
+ function buildChromeTracePayload(events) {
191
+ const document = buildRuntimeChromeTraceDocument(events);
192
+ return JSON.stringify(document, null, 2);
193
+ }
194
+ function buildEventsPayload(events) {
195
+ const serialized = events.map((event) => ({
196
+ ...event,
197
+ timestamp: event.timestamp.toISOString()
198
+ }));
199
+ return JSON.stringify(serialized, null, 2);
200
+ }
201
+ var VALID_FORMATS2 = /* @__PURE__ */ new Set(["chrome", "events"]);
202
+ async function runWorkflowTimeline(options) {
203
+ const format = options.format ?? "chrome";
204
+ if (!VALID_FORMATS2.has(format)) {
205
+ throw new Error(`Unsupported format '${format}'. Expected one of: ${[...VALID_FORMATS2].join(", ")}`);
206
+ }
207
+ const events = await readTraceEvents2(options.input);
208
+ const payload = format === "chrome" ? buildChromeTracePayload2(events) : buildEventsPayload2(events);
209
+ if (options.output) {
210
+ await promises.writeFile(options.output, payload, "utf8");
211
+ return;
212
+ }
213
+ process.stdout.write(`${payload}
214
+ `);
215
+ }
216
+ async function readTraceEvents2(filePath) {
217
+ const contents = await promises.readFile(filePath, "utf8");
218
+ const trimmed = contents.trim();
219
+ if (!trimmed) {
220
+ return [];
221
+ }
222
+ const serialized = trimmed.startsWith("[") ? JSON.parse(trimmed) : trimmed.split("\n").map((line) => line.trim()).filter(Boolean).map((line) => JSON.parse(line));
223
+ return serialized.map((event) => ({
224
+ ...event,
225
+ timestamp: new Date(event.timestamp)
226
+ }));
227
+ }
228
+ function buildChromeTracePayload2(events) {
229
+ const document = buildChromeTraceDocument(events);
230
+ return JSON.stringify(document, null, 2);
231
+ }
232
+ function buildEventsPayload2(events) {
233
+ const serialized = events.map((event) => ({
234
+ ...event,
235
+ timestamp: event.timestamp.toISOString()
236
+ }));
237
+ return JSON.stringify(serialized, null, 2);
238
+ }
239
+ async function loadConfig(configPath) {
240
+ const resolved = resolve(configPath ?? "ceui.config.json");
241
+ const raw = await readFile(resolved, "utf8");
242
+ const parsed = JSON.parse(raw);
243
+ const config = validateConfig(parsed);
244
+ return { path: resolved, config };
245
+ }
246
+ function validateConfig(input) {
247
+ if (!input || typeof input !== "object") {
248
+ throw new Error("Config must be a JSON object.");
249
+ }
250
+ const obj = input;
251
+ const compile = obj.compile;
252
+ if (!compile || typeof compile !== "object") {
253
+ throw new Error('Config must include a "compile" object.');
254
+ }
255
+ const compileObj = compile;
256
+ const patterns = compileObj.patterns;
257
+ if (!Array.isArray(patterns) || patterns.length === 0 || !patterns.every((item) => typeof item === "string")) {
258
+ throw new Error('"compile.patterns" must be a non-empty array of strings.');
259
+ }
260
+ const outDir = compileObj.outDir;
261
+ if (outDir !== void 0 && typeof outDir !== "string") {
262
+ throw new Error('"compile.outDir" must be a string when provided.');
263
+ }
264
+ const sourceMap = compileObj.sourceMap;
265
+ if (sourceMap !== void 0 && typeof sourceMap !== "boolean") {
266
+ throw new Error('"compile.sourceMap" must be a boolean when provided.');
267
+ }
268
+ return {
269
+ compile: {
270
+ patterns,
271
+ outDir,
272
+ sourceMap
273
+ }
274
+ };
275
+ }
276
+ async function scaffoldApp(name, options = {}) {
277
+ const root = resolve(process.cwd(), name);
278
+ await ensureEmptyDir(root, options.force);
279
+ await mkdir(join(root, "src"), { recursive: true });
280
+ await writeFileSafe(
281
+ join(root, "package.json"),
282
+ JSON.stringify(
283
+ {
284
+ name,
285
+ version: "0.1.0",
286
+ private: true,
287
+ type: "module",
288
+ scripts: {
289
+ build: "ceui build",
290
+ watch: "ceui watch",
291
+ test: "ceui test",
292
+ typecheck: "tsc --noEmit"
293
+ },
294
+ dependencies: {
295
+ "@clusterenvision/ui-framework": "^1.0.0",
296
+ "@clusterenvision/ui-webcomponents": "^1.1.0",
297
+ "@clusterenvision/ce-ui-scss": "^1.94.2"
298
+ },
299
+ devDependencies: {
300
+ "@types/node": "^22.7.4",
301
+ typescript: "^5.9.3"
302
+ }
303
+ },
304
+ null,
305
+ 2
306
+ ),
307
+ options.force
308
+ );
309
+ await writeFileSafe(
310
+ join(root, "ceui.config.json"),
311
+ JSON.stringify(
312
+ {
313
+ compile: {
314
+ patterns: ["src/**/*.cex"],
315
+ outDir: "src/generated",
316
+ sourceMap: true
317
+ }
318
+ },
319
+ null,
320
+ 2
321
+ ),
322
+ options.force
323
+ );
324
+ await writeFileSafe(
325
+ join(root, "src", "app.cex"),
326
+ `<template>
327
+ <main class="app">
328
+ <h1>CE UI App</h1>
329
+ <p>Welcome to your new workspace.</p>
330
+ </main>
331
+ </template>
332
+
333
+ <style>
334
+ .app {
335
+ font-family: "Space Grotesk", sans-serif;
336
+ padding: 48px;
337
+ }
338
+ </style>
339
+ `,
340
+ options.force
341
+ );
342
+ await writeFileSafe(
343
+ join(root, "src", "main.ts"),
344
+ `import { defineComponent, renderComponent } from '@clusterenvision/ui-framework';
345
+ import template from './generated/app.cex.js';
346
+
347
+ const App = defineComponent({
348
+ name: 'App',
349
+ template,
350
+ });
351
+
352
+ const target = document.getElementById('app');
353
+ if (target) {
354
+ renderComponent(App, { target });
355
+ }
356
+ `,
357
+ options.force
358
+ );
359
+ await writeFileSafe(
360
+ join(root, "index.html"),
361
+ `<!doctype html>
362
+ <html lang="en">
363
+ <head>
364
+ <meta charset="utf-8" />
365
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
366
+ <title>${name}</title>
367
+ </head>
368
+ <body>
369
+ <div id="app"></div>
370
+ <script type="module" src="/src/main.ts"></script>
371
+ </body>
372
+ </html>
373
+ `,
374
+ options.force
375
+ );
376
+ await writeFileSafe(
377
+ join(root, "tsconfig.json"),
378
+ JSON.stringify(
379
+ {
380
+ compilerOptions: {
381
+ target: "ES2022",
382
+ module: "ESNext",
383
+ moduleResolution: "Bundler",
384
+ strict: true,
385
+ lib: ["ES2022", "DOM"]
386
+ },
387
+ include: ["src"]
388
+ },
389
+ null,
390
+ 2
391
+ ),
392
+ options.force
393
+ );
394
+ console.log(pc.green(`Scaffolded CE UI app at ${root}`));
395
+ }
396
+ async function scaffoldComponent(name, options = {}) {
397
+ const dir = resolve(process.cwd(), options.dir ?? "src/components");
398
+ await mkdir(dir, { recursive: true });
399
+ const fileBase = name.replace(/\s+/g, "");
400
+ const cexPath = join(dir, `${fileBase}.cex`);
401
+ const tsPath = join(dir, `${fileBase}.ts`);
402
+ await writeFileSafe(
403
+ cexPath,
404
+ `<template>
405
+ <section class="${fileBase}">
406
+ <h2>${fileBase}</h2>
407
+ <slot></slot>
408
+ </section>
409
+ </template>
410
+
411
+ <style>
412
+ .${fileBase} {
413
+ padding: 16px;
414
+ }
415
+ </style>
416
+ `,
417
+ options.force
418
+ );
419
+ await writeFileSafe(
420
+ tsPath,
421
+ `import { defineComponent } from '@clusterenvision/ui-framework';
422
+ import template from './${fileBase}.cex.js';
423
+
424
+ export const ${fileBase} = defineComponent({
425
+ name: '${fileBase}',
426
+ template,
427
+ });
428
+ `,
429
+ options.force
430
+ );
431
+ console.log(pc.green(`Scaffolded component ${fileBase} in ${dir}`));
432
+ }
433
+ async function ensureEmptyDir(target, force) {
434
+ try {
435
+ const stats = await stat(target);
436
+ if (!stats.isDirectory()) {
437
+ throw new Error(`${target} exists and is not a directory.`);
438
+ }
439
+ const entries = await readdir(target);
440
+ if (entries.length > 0 && !force) {
441
+ throw new Error(`${target} is not empty. Use --force to overwrite.`);
442
+ }
443
+ } catch (error) {
444
+ const code = error.code;
445
+ if (code === "ENOENT") {
446
+ await mkdir(target, { recursive: true });
447
+ return;
448
+ }
449
+ if (force) {
450
+ await mkdir(target, { recursive: true });
451
+ return;
452
+ }
453
+ throw error;
454
+ }
455
+ }
456
+ async function writeFileSafe(path, contents, force) {
457
+ if (!force) {
458
+ try {
459
+ await stat(path);
460
+ throw new Error(`${path} already exists. Use --force to overwrite.`);
461
+ } catch (error) {
462
+ const code = error.code;
463
+ if (code !== "ENOENT") {
464
+ throw error;
465
+ }
466
+ }
467
+ }
468
+ await writeFile(path, contents, "utf8");
469
+ }
470
+ var DEFAULT_PATTERNS = ["tests/**/*.spec.{js,ts}", "tests/**/*.test.{js,ts}"];
471
+ async function runTests(options = {}) {
472
+ const patterns = options.patterns?.length ? options.patterns : DEFAULT_PATTERNS;
473
+ const files = await fg(patterns, { absolute: true });
474
+ if (!files.length) {
475
+ console.log(pc.yellow("No test files found."));
476
+ return;
477
+ }
478
+ await runNodeTest(files);
479
+ }
480
+ function runNodeTest(files) {
481
+ return new Promise((resolve4, reject) => {
482
+ const child = spawn(process.execPath, ["--test", ...files], { stdio: "inherit" });
483
+ child.on("exit", (code) => {
484
+ if (code === 0) {
485
+ resolve4();
486
+ return;
487
+ }
488
+ reject(new Error(`Test run failed with code ${String(code ?? "unknown")}.`));
489
+ });
490
+ child.on("error", (error) => {
491
+ reject(error);
492
+ });
493
+ });
494
+ }
495
+
496
+ // src/cli/index.ts
497
+ var program = new Command();
498
+ program.name("ceui").description("CE UI framework tooling").version("0.1.0");
499
+ program.command("compile").argument("<patterns...>", "Glob patterns for .cex files").option("-o, --out-dir <dir>", "Output directory").option("-w, --watch", "Recompile when inputs change", false).option("--source-map", "Emit source maps for generated modules", false).option("-c, --config <file>", "Use config file for defaults").action(async (patterns, options) => {
500
+ if (options.config) {
501
+ const loaded = await loadConfig(options.config);
502
+ const { compile } = loaded.config;
503
+ options.outDir ??= compile.outDir;
504
+ options.sourceMap ??= compile.sourceMap;
505
+ }
506
+ await runCompile(patterns, {
507
+ outDir: options.outDir,
508
+ watch: options.watch,
509
+ sourceMap: options.sourceMap
510
+ });
511
+ });
512
+ program.command("build").description("Compile .cex files using ceui.config.json").option("-c, --config <file>", "Config file path").action(async (options) => {
513
+ const loaded = await loadConfig(options.config);
514
+ const { compile } = loaded.config;
515
+ await runCompile(compile.patterns, {
516
+ outDir: compile.outDir,
517
+ sourceMap: compile.sourceMap
518
+ });
519
+ });
520
+ program.command("watch").description("Watch and recompile .cex files using ceui.config.json").option("-c, --config <file>", "Config file path").action(async (options) => {
521
+ const loaded = await loadConfig(options.config);
522
+ const { compile } = loaded.config;
523
+ await runCompile(compile.patterns, {
524
+ outDir: compile.outDir,
525
+ sourceMap: compile.sourceMap,
526
+ watch: true
527
+ });
528
+ });
529
+ var create = program.command("create").description("Scaffold CE UI apps or components");
530
+ create.command("app").argument("<name>", "App folder name").option("--force", "Overwrite existing files", false).action(async (name, options) => {
531
+ await scaffoldApp(name, { force: Boolean(options.force) });
532
+ });
533
+ create.command("component").argument("<name>", "Component name (PascalCase)").option("-d, --dir <dir>", "Output directory", "src/components").option("--force", "Overwrite existing files", false).action(async (name, options) => {
534
+ await scaffoldComponent(name, {
535
+ dir: options.dir,
536
+ force: Boolean(options.force)
537
+ });
538
+ });
539
+ program.command("workflow:timeline").description("Convert workflow trace JSON/JSONL into Chrome trace format or raw events").requiredOption("-i, --input <file>", "Path to workflow trace file (JSONL or JSON array)").option("-o, --output <file>", "Output file (writes to stdout when omitted)").option("-f, --format <format>", "Output format: chrome | events", "chrome").action(async (options) => {
540
+ await runWorkflowTimeline({
541
+ input: options.input,
542
+ output: options.output,
543
+ format: options.format
544
+ });
545
+ });
546
+ program.command("runtime:timeline").description("Convert renderer/runtime trace JSON/JSONL into Chrome trace format or raw events").requiredOption("-i, --input <file>", "Path to runtime trace file (JSONL or JSON array)").option("-o, --output <file>", "Output file (writes to stdout when omitted)").option("-f, --format <format>", "Output format: chrome | events", "chrome").action(async (options) => {
547
+ await runRuntimeTimeline({
548
+ input: options.input,
549
+ output: options.output,
550
+ format: options.format
551
+ });
552
+ });
553
+ program.command("test").description("Run Node.js test runner with default patterns").option("-p, --pattern <patterns...>", "Test file patterns").action(async (options) => {
554
+ await runTests({ patterns: options.pattern });
555
+ });
556
+ void program.parseAsync(process.argv);
557
+ //# sourceMappingURL=index.js.map
558
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/compile.ts","../../src/cli/runtime-timeline.js","../../src/cli/workflow-timeline.js","../../src/cli/config.ts","../../src/cli/scaffold.ts","../../src/cli/test.ts","../../src/cli/index.ts"],"names":["resolve","fs","VALID_FORMATS","readTraceEvents","buildChromeTracePayload","buildEventsPayload","readFile","mkdir","join","pc","writeFile","fg"],"mappings":";;;;;;;;;;;;;;;AAgBA,eAAsB,UAAA,CAAW,OAAA,EAA4B,OAAA,GAAiC,EAAC,EAAG;AAChG,EAAA,MAAM,QAAA,GAAW,IAAI,qBAAA,CAAsB,OAAO,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,cAAA,CAAe,OAAO,CAAA;AACnD,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,CAAC,QAAQ,KAAA,EAAO;AACnC,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,sBAAsB,CAAC,CAAA;AAC9C,IAAA;AAAA,EACF;AACA,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,MAAM,QAAA,CAAS,MAAM,OAAO,CAAA;AAAA,EAC9B;AACF;AAEA,IAAM,wBAAN,MAA4B;AAAA,EAC1B,YAA6B,OAAA,EAAgC;AAAhC,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAAiC;AAAA,EAAjC,OAAA;AAAA,EAE7B,MAAM,eAAe,OAAA,EAA4B;AAC/C,IAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,OAAA,GAAU,CAAC,OAAO,CAAA;AAC3D,IAAA,MAAM,QAAQ,MAAM,EAAA,CAAG,SAAS,EAAE,QAAA,EAAU,MAAM,CAAA;AAClD,IAAA,MAAM,OAAA,CAAQ,IAAI,KAAA,CAAM,GAAA,CAAI,UAAQ,IAAA,CAAK,WAAA,CAAY,IAAI,CAAC,CAAC,CAAA;AAC3D,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,OAAA,EAA4B;AACtC,IAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,OAAA,GAAU,CAAC,OAAO,CAAA;AAC3D,IAAA,MAAM,UAAU,QAAA,CAAS,KAAA,CAAM,SAAS,EAAE,aAAA,EAAe,MAAM,CAAA;AAC/D,IAAA,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,IAAA,CAAK,oCAAoC,CAAC,CAAA;AAEzD,IAAA,MAAM,SAAA,GAAY,OAAO,IAAA,KAAiB;AACxC,MAAA,MAAM,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,IAC7B,CAAA;AAEA,IAAA,OAAA,CAAQ,EAAA,CAAG,OAAO,CAAA,IAAA,KAAQ;AACxB,MAAA,KAAK,UAAU,IAAI,CAAA;AAAA,IACrB,CAAC,CAAA;AACD,IAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,CAAA,IAAA,KAAQ;AAC3B,MAAA,KAAK,UAAU,IAAI,CAAA;AAAA,IACrB,CAAC,CAAA;AACD,IAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,CAAA,IAAA,KAAQ;AAC3B,MAAA,KAAK,IAAA,CAAK,aAAa,IAAI,CAAA;AAC3B,MAAA,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,CAAA,QAAA,EAAW,QAAA,CAAS,OAAA,CAAQ,GAAA,EAAI,EAAG,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,IAChE,CAAC,CAAA;AAED,IAAA,MAAM,IAAI,OAAA,CAAc,CAACA,QAAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,OAAA,CAAQ,EAAA,CAAG,SAAS,CAAA,KAAA,KAAS;AAC3B,QAAA,MAAM,UAAA,GAAa,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAC3E,QAAA,OAAA,CAAQ,MAAM,EAAA,CAAG,GAAA,CAAI,kBAAkB,UAAA,CAAW,OAAO,EAAE,CAAC,CAAA;AAC5D,QAAA,MAAA,CAAO,UAAU,CAAA;AAAA,MACnB,CAAC,CAAA;AACD,MAAA,MAAM,QAAQ,MAAM;AAClB,QAAA,OAAA,CACG,OAAM,CACN,IAAA,CAAKA,QAAO,CAAA,CACZ,KAAA,CAAM,CAAC,GAAA,KAAiB;AACvB,UAAA,MAAM,UAAA,GAAa,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AACrE,UAAA,MAAA,CAAO,UAAU,CAAA;AAAA,QACnB,CAAC,CAAA;AAAA,MACL,CAAA;AACA,MAAA,OAAA,CAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AAC5B,MAAA,OAAA,CAAQ,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,IAC/B,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,YAAY,IAAA,EAAc;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAC1C,MAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,mBAAmB,MAAM,CAAA;AACtD,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,GAAS,kBAAA,CAAmB,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA,CAAE,CAAA,GAAI,KAAA,CAAA;AACpF,MAAA,MAAM,QAAA,GAAW,gBAAgB,QAAA,EAAU;AAAA,QACzC,GAAG,IAAA,CAAK,OAAA;AAAA,QACR,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,IAAQ,WAAW,IAAI,CAAA;AAAA,QAC1C;AAAA,OACD,CAAA;AACD,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,QAAA,CAAS,OAAA,GAAU,OAAA;AAAA,MACrB;AACA,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,QAAA,CAAS,MAAA,GAAS,OAAA,GAAU,WAAA,CAAY,MAAA,EAAQ,OAAO,CAAA,GAAI,MAAA;AAAA,MAC7D;AACA,MAAA,MAAM,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,QAAA,EAAU,MAAM,CAAA;AAC7C,MAAA,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,IACtB,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,QAAA,CAAS,MAAM,KAAK,CAAA;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,MAAc,WAAA,CAAY,IAAA,EAAc,QAAA,EAA4B,MAAA,EAAgB;AAClF,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AACxC,IAAA,MAAM,MAAM,OAAA,CAAQ,OAAO,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACjD,IAAA,MAAM,QAAA,GAAW,WAAW,QAAA,EAAU;AAAA,MACpC,OAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA,EAAY,IAAA;AAAA,MACZ,aAAA,EAAe,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,SAAS;AAAA,KAC9C,CAAA;AACD,IAAA,MAAM,SAAA,CAAU,OAAA,EAAS,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAC9C,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,MAAM,SAAA,CAAU,CAAA,EAAG,OAAO,CAAA,IAAA,CAAA,EAAQ,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA,EAAG,MAAM,CAAA;AAAA,IACjF;AAAA,EACF;AAAA,EAEA,MAAc,aAAa,IAAA,EAAc;AACvC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AACxC,IAAA,MAAM,EAAA,CAAG,OAAA,EAAS,EAAE,KAAA,EAAO,MAAM,CAAA;AACjC,IAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,MAAA,MAAM,GAAG,CAAA,EAAG,OAAO,QAAQ,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,IAC5C;AAAA,EACF;AAAA,EAEQ,eAAe,IAAA,EAAc;AACnC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,OAAA,CAAQ,KAAK,OAAA,CAAQ,MAAM,CAAA,GAAI,OAAA,CAAQ,IAAI,CAAA;AAChF,IAAA,OAAO,KAAK,MAAA,EAAQ,CAAA,EAAG,UAAA,CAAW,IAAI,CAAC,CAAA,OAAA,CAAS,CAAA;AAAA,EAClD;AAAA,EAEQ,WAAW,IAAA,EAAc;AAC/B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AACxC,IAAA,OAAA,CAAQ,IAAI,EAAA,CAAG,KAAA,CAAM,YAAY,QAAA,CAAS,OAAA,CAAQ,KAAI,EAAG,IAAI,CAAC,CAAA,IAAA,EAAO,SAAS,OAAA,CAAQ,GAAA,IAAO,OAAO,CAAC,EAAE,CAAC,CAAA;AAAA,EAC1G;AAAA,EAEQ,QAAA,CAAS,MAAc,KAAA,EAAgB;AAC7C,IAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,IAAA,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,GAAA,CAAI,CAAA,kBAAA,EAAqB,QAAA,CAAS,OAAA,CAAQ,GAAA,EAAI,EAAG,IAAI,CAAC,CAAA,EAAA,EAAK,OAAO,EAAE,CAAC,CAAA;AAAA,EACxF;AACF,CAAA;AAEA,SAAS,mBAAmB,MAAA,EAAgB;AAC1C,EAAA,MAAM,eAAA,GAAkB,mCAAA;AACxB,EAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,IAAA,CAAK,MAAM,CAAA;AACjD,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,EAC7C;AACA,EAAA,MAAM,eAAe,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,mCAAmC,CAAC,CAAA;AACpF,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,CAAA,KAAA,KAAS,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACxE,EAAA,OAAO,EAAE,QAAA,EAAU,aAAA,CAAc,CAAC,GAAG,MAAA,EAAO;AAC9C;AASA,SAAS,UAAA,CAAW,UAA4B,OAAA,EAAsB;AACpE,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAChD,EAAA,IAAI,IAAA,GAAO,CAAA;AAAA,wBAAA,EACa,OAAO,CAAA;AAAA;AAAA,CAAA;AAG/B,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,EAAG,OAAA,CAAQ,UAAU,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAC3F,IAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,EAAE,MAAM,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA,EAAG,CAAA;AAClE,IAAA,gBAAA,CAAiB,OAAA,EAAS,SAAA,EAAW,OAAA,CAAQ,MAAM,CAAA;AACnD,IAAA,UAAA,CAAW,OAAA,EAAS;AAAA,MAClB,MAAA,EAAQ,SAAA;AAAA,MACR,QAAA,EAAU,EAAE,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,MAC/B,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA;AAAE,KACjC,CAAA;AACD,IAAA,GAAA,GAAM,aAAa,OAAO,CAAA;AAC1B,IAAA,IAAA,IAAQ,CAAA,qBAAA,EAAwB,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAC,CAAA;AAAA,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,EAAE,MAAM,GAAA,EAAI;AACrB;AAEA,SAAS,WAAW,IAAA,EAAc;AAChC,EAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,WAAA;AACtC,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AACpC;ACnLA,IAAM,gCAAgB,IAAI,GAAA,CAAI,CAAC,QAAA,EAAU,QAAQ,CAAC,CAAA;AAElD,eAAsB,mBAAmB,OAAA,EAAS;AAC9C,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,QAAA;AACjC,EAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,MAAM,CAAA,oBAAA,EAAuB,CAAC,GAAG,aAAa,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACvG;AACA,EAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,OAAA,CAAQ,KAAK,CAAA;AAClD,EAAA,MAAM,UAAU,MAAA,KAAW,QAAA,GAAW,wBAAwB,MAAM,CAAA,GAAI,mBAAmB,MAAM,CAAA;AACjG,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAChB,IAAA,MAAMC,QAAA,CAAG,SAAA,CAAU,OAAA,CAAQ,MAAA,EAAQ,SAAS,MAAM,CAAA;AAClD,IAAA;AAAA,EACJ;AACA,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,OAAO;AAAA,CAAI,CAAA;AACvC;AAEA,eAAe,gBAAgB,QAAA,EAAU;AACrC,EAAA,MAAM,QAAA,GAAW,MAAMA,QAAA,CAAG,QAAA,CAAS,UAAU,MAAM,CAAA;AACnD,EAAA,MAAM,OAAA,GAAU,SAAS,IAAA,EAAK;AAC9B,EAAA,IAAI,CAAC,OAAA,EAAS;AACV,IAAA,OAAO,EAAC;AAAA,EACZ;AACA,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,GACnC,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,GAClB,OAAA,CACK,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,IAAA,EAAM,CAAA,CACvB,MAAA,CAAO,OAAO,CAAA,CACd,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AACvC,EAAA,OAAO,UAAA,CAAW,IAAI,CAAA,KAAA,MAAU;AAAA,IAC5B,GAAG,KAAA;AAAA,IACH,SAAA,EAAW,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS;AAAA,GACvC,CAAE,CAAA;AACN;AAEA,SAAS,wBAAwB,MAAA,EAAQ;AACrC,EAAA,MAAM,QAAA,GAAW,gCAAgC,MAAM,CAAA;AACvD,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA;AAC3C;AAEA,SAAS,mBAAmB,MAAA,EAAQ;AAChC,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,MAAU;AAAA,IACpC,GAAG,KAAA;AAAA,IACH,SAAA,EAAW,KAAA,CAAM,SAAA,CAAU,WAAA;AAAY,GAC3C,CAAE,CAAA;AACF,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,UAAA,EAAY,IAAA,EAAM,CAAC,CAAA;AAC7C;AC9CA,IAAMC,iCAAgB,IAAI,GAAA,CAAI,CAAC,QAAA,EAAU,QAAQ,CAAC,CAAA;AAElD,eAAsB,oBAAoB,OAAA,EAAS;AAC/C,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,QAAA;AACjC,EAAA,IAAI,CAACA,cAAAA,CAAc,GAAA,CAAI,MAAM,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,MAAM,CAAA,oBAAA,EAAuB,CAAC,GAAGA,cAAa,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACvG;AACA,EAAA,MAAM,MAAA,GAAS,MAAMC,gBAAAA,CAAgB,OAAA,CAAQ,KAAK,CAAA;AAClD,EAAA,MAAM,UAAU,MAAA,KAAW,QAAA,GAAWC,yBAAwB,MAAM,CAAA,GAAIC,oBAAmB,MAAM,CAAA;AACjG,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAChB,IAAA,MAAMJ,QAAAA,CAAG,SAAA,CAAU,OAAA,CAAQ,MAAA,EAAQ,SAAS,MAAM,CAAA;AAClD,IAAA;AAAA,EACJ;AACA,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,OAAO;AAAA,CAAI,CAAA;AACvC;AAEA,eAAeE,iBAAgB,QAAA,EAAU;AACrC,EAAA,MAAM,QAAA,GAAW,MAAMF,QAAAA,CAAG,QAAA,CAAS,UAAU,MAAM,CAAA;AACnD,EAAA,MAAM,OAAA,GAAU,SAAS,IAAA,EAAK;AAC9B,EAAA,IAAI,CAAC,OAAA,EAAS;AACV,IAAA,OAAO,EAAC;AAAA,EACZ;AACA,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,GACnC,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,GAClB,OAAA,CACG,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,IAAA,EAAM,CAAA,CACvB,MAAA,CAAO,OAAO,CAAA,CACd,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AACrC,EAAA,OAAO,UAAA,CAAW,IAAI,CAAA,KAAA,MAAU;AAAA,IAC5B,GAAG,KAAA;AAAA,IACH,SAAA,EAAW,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS;AAAA,GACvC,CAAE,CAAA;AACN;AAEA,SAASG,yBAAwB,MAAA,EAAQ;AACrC,EAAA,MAAM,QAAA,GAAW,yBAAyB,MAAM,CAAA;AAChD,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA;AAC3C;AAEA,SAASC,oBAAmB,MAAA,EAAQ;AAChC,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,MAAU;AAAA,IACpC,GAAG,KAAA;AAAA,IACH,SAAA,EAAW,KAAA,CAAM,SAAA,CAAU,WAAA;AAAY,GAC3C,CAAE,CAAA;AACF,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,UAAA,EAAY,IAAA,EAAM,CAAC,CAAA;AAC7C;AChCA,eAAsB,WAAW,UAAA,EAA4C;AAC3E,EAAA,MAAM,QAAA,GAAWL,OAAAA,CAAQ,UAAA,IAAc,kBAAkB,CAAA;AACzD,EAAA,MAAM,GAAA,GAAM,MAAMM,QAAAA,CAAS,QAAA,EAAU,MAAM,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,eAAe,MAAM,CAAA;AACpC,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAO;AAClC;AAEO,SAAS,eAAe,KAAA,EAA4B;AACzD,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,EACjD;AACA,EAAA,MAAM,GAAA,GAAM,KAAA;AACZ,EAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC3C,IAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,EAC3D;AACA,EAAA,MAAM,UAAA,GAAa,OAAA;AACnB,EAAA,MAAM,WAAW,UAAA,CAAW,QAAA;AAC5B,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,KAAK,QAAA,CAAS,MAAA,KAAW,CAAA,IAAK,CAAC,SAAS,KAAA,CAAM,CAAA,IAAA,KAAQ,OAAO,IAAA,KAAS,QAAQ,CAAA,EAAG;AAC1G,IAAA,MAAM,IAAI,MAAM,0DAA0D,CAAA;AAAA,EAC5E;AACA,EAAA,MAAM,SAAS,UAAA,CAAW,MAAA;AAC1B,EAAA,IAAI,MAAA,KAAW,MAAA,IAAa,OAAO,MAAA,KAAW,QAAA,EAAU;AACtD,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACpE;AACA,EAAA,MAAM,YAAY,UAAA,CAAW,SAAA;AAC7B,EAAA,IAAI,SAAA,KAAc,MAAA,IAAa,OAAO,SAAA,KAAc,SAAA,EAAW;AAC7D,IAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,EACxE;AACA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS;AAAA,MACP,QAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA;AACF,GACF;AACF;AC3CA,eAAsB,WAAA,CAAY,IAAA,EAAc,OAAA,GAA2B,EAAC,EAAkB;AAC5F,EAAA,MAAM,IAAA,GAAON,OAAAA,CAAQ,OAAA,CAAQ,GAAA,IAAO,IAAI,CAAA;AACxC,EAAA,MAAM,cAAA,CAAe,IAAA,EAAM,OAAA,CAAQ,KAAK,CAAA;AACxC,EAAA,MAAMO,KAAAA,CAAMC,KAAK,IAAA,EAAM,KAAK,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAElD,EAAA,MAAM,aAAA;AAAA,IACJA,IAAAA,CAAK,MAAM,cAAc,CAAA;AAAA,IACzB,IAAA,CAAK,SAAA;AAAA,MACH;AAAA,QACE,IAAA;AAAA,QACA,OAAA,EAAS,OAAA;AAAA,QACT,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,KAAA,EAAO,YAAA;AAAA,UACP,KAAA,EAAO,YAAA;AAAA,UACP,IAAA,EAAM,WAAA;AAAA,UACN,SAAA,EAAW;AAAA,SACb;AAAA,QACA,YAAA,EAAc;AAAA,UACZ,+BAAA,EAAiC,QAAA;AAAA,UACjC,mCAAA,EAAqC,QAAA;AAAA,UACrC,6BAAA,EAA+B;AAAA,SACjC;AAAA,QACA,eAAA,EAAiB;AAAA,UACf,aAAA,EAAe,SAAA;AAAA,UACf,UAAA,EAAY;AAAA;AACd,OACF;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,OAAA,CAAQ;AAAA,GACV;AAEA,EAAA,MAAM,aAAA;AAAA,IACJA,IAAAA,CAAK,MAAM,kBAAkB,CAAA;AAAA,IAC7B,IAAA,CAAK,SAAA;AAAA,MACH;AAAA,QACE,OAAA,EAAS;AAAA,UACP,QAAA,EAAU,CAAC,cAAc,CAAA;AAAA,UACzB,MAAA,EAAQ,eAAA;AAAA,UACR,SAAA,EAAW;AAAA;AACb,OACF;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,OAAA,CAAQ;AAAA,GACV;AAEA,EAAA,MAAM,aAAA;AAAA,IACJA,IAAAA,CAAK,IAAA,EAAM,KAAA,EAAO,SAAS,CAAA;AAAA,IAC3B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,IAcA,OAAA,CAAQ;AAAA,GACV;AAEA,EAAA,MAAM,aAAA;AAAA,IACJA,IAAAA,CAAK,IAAA,EAAM,KAAA,EAAO,SAAS,CAAA;AAAA,IAC3B,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,IAaA,OAAA,CAAQ;AAAA,GACV;AAEA,EAAA,MAAM,aAAA;AAAA,IACJA,IAAAA,CAAK,MAAM,YAAY,CAAA;AAAA,IACvB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAKS,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,IAQb,OAAA,CAAQ;AAAA,GACV;AAEA,EAAA,MAAM,aAAA;AAAA,IACJA,IAAAA,CAAK,MAAM,eAAe,CAAA;AAAA,IAC1B,IAAA,CAAK,SAAA;AAAA,MACH;AAAA,QACE,eAAA,EAAiB;AAAA,UACf,MAAA,EAAQ,QAAA;AAAA,UACR,MAAA,EAAQ,QAAA;AAAA,UACR,gBAAA,EAAkB,SAAA;AAAA,UAClB,MAAA,EAAQ,IAAA;AAAA,UACR,GAAA,EAAK,CAAC,QAAA,EAAU,KAAK;AAAA,SACvB;AAAA,QACA,OAAA,EAAS,CAAC,KAAK;AAAA,OACjB;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,OAAA,CAAQ;AAAA,GACV;AAEA,EAAA,OAAA,CAAQ,IAAIC,EAAAA,CAAG,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAI,EAAE,CAAC,CAAA;AACzD;AAEA,eAAsB,iBAAA,CAAkB,IAAA,EAAc,OAAA,GAAoC,EAAC,EAAkB;AAC3G,EAAA,MAAM,MAAMT,OAAAA,CAAQ,OAAA,CAAQ,KAAI,EAAG,OAAA,CAAQ,OAAO,gBAAgB,CAAA;AAClE,EAAA,MAAMO,KAAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACpC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACxC,EAAA,MAAM,OAAA,GAAUC,IAAAA,CAAK,GAAA,EAAK,CAAA,EAAG,QAAQ,CAAA,IAAA,CAAM,CAAA;AAC3C,EAAA,MAAM,MAAA,GAASA,IAAAA,CAAK,GAAA,EAAK,CAAA,EAAG,QAAQ,CAAA,GAAA,CAAK,CAAA;AAEzC,EAAA,MAAM,aAAA;AAAA,IACJ,OAAA;AAAA,IACA,CAAA;AAAA,kBAAA,EACgB,QAAQ,CAAA;AAAA,QAAA,EAClB,QAAQ,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,GAAA,EAMb,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,IAKT,OAAA,CAAQ;AAAA,GACV;AAEA,EAAA,MAAM,aAAA;AAAA,IACJ,MAAA;AAAA,IACA,CAAA;AAAA,wBAAA,EACsB,QAAQ,CAAA;;AAAA,aAAA,EAEnB,QAAQ,CAAA;AAAA,SAAA,EACZ,QAAQ,CAAA;AAAA;AAAA;AAAA,CAAA;AAAA,IAIf,OAAA,CAAQ;AAAA,GACV;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAIC,GAAG,KAAA,CAAM,CAAA,qBAAA,EAAwB,QAAQ,CAAA,IAAA,EAAO,GAAG,EAAE,CAAC,CAAA;AACpE;AAEA,eAAe,cAAA,CAAe,QAAgB,KAAA,EAAgC;AAC5E,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,MAAM,CAAA;AAC/B,IAAA,IAAI,CAAC,KAAA,CAAM,WAAA,EAAY,EAAG;AACxB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,+BAAA,CAAiC,CAAA;AAAA,IAC5D;AACA,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,MAAM,CAAA;AACpC,IAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,CAAC,KAAA,EAAO;AAChC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,wCAAA,CAA0C,CAAA;AAAA,IACrE;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,OAAQ,KAAA,CAA4B,IAAA;AAC1C,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,MAAMF,KAAAA,CAAM,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAM,CAAA;AACvC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAMA,KAAAA,CAAM,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAM,CAAA;AACvC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAEA,eAAe,aAAA,CAAc,IAAA,EAAc,QAAA,EAAkB,KAAA,EAAgC;AAC3F,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,IAAI,CAAA;AACf,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,0CAAA,CAA4C,CAAA;AAAA,IACrE,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAQ,KAAA,CAA4B,IAAA;AAC1C,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAMG,SAAAA,CAAU,IAAA,EAAM,QAAA,EAAU,MAAM,CAAA;AACxC;AClNA,IAAM,gBAAA,GAAmB,CAAC,yBAAA,EAA2B,yBAAyB,CAAA;AAE9E,eAAsB,QAAA,CAAS,OAAA,GAA8B,EAAC,EAAkB;AAC9E,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,EAAU,MAAA,GAAS,QAAQ,QAAA,GAAW,gBAAA;AAC/D,EAAA,MAAM,QAAQ,MAAMC,EAAAA,CAAG,UAAU,EAAE,QAAA,EAAU,MAAM,CAAA;AACnD,EAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,IAAA,OAAA,CAAQ,GAAA,CAAIF,EAAAA,CAAG,MAAA,CAAO,sBAAsB,CAAC,CAAA;AAC7C,IAAA;AAAA,EACF;AACA,EAAA,MAAM,YAAY,KAAK,CAAA;AACzB;AAEA,SAAS,YAAY,KAAA,EAAgC;AACnD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACT,QAAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,CAAC,QAAA,EAAU,GAAG,KAAK,CAAA,EAAG,EAAE,KAAA,EAAO,SAAA,EAAW,CAAA;AAChF,IAAA,KAAA,CAAM,EAAA,CAAG,QAAQ,CAAA,IAAA,KAAQ;AACvB,MAAA,IAAI,SAAS,CAAA,EAAG;AACd,QAAAA,QAAAA,EAAQ;AACR,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,IAAI,MAAM,CAAA,0BAAA,EAA6B,MAAA,CAAO,QAAQ,SAAS,CAAC,GAAG,CAAC,CAAA;AAAA,IAC7E,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,EAAA,CAAG,SAAS,CAAA,KAAA,KAAS;AACzB,MAAA,MAAA,CAAO,KAAK,CAAA;AAAA,IACd,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;;;ACzBA,IAAM,OAAA,GAAU,IAAI,OAAA,EAAQ;AAE5B,OAAA,CACG,KAAK,MAAM,CAAA,CACX,YAAY,yBAAyB,CAAA,CACrC,QAAQ,OAAO,CAAA;AAElB,OAAA,CACG,OAAA,CAAQ,SAAS,CAAA,CACjB,QAAA,CAAS,eAAA,EAAiB,8BAA8B,CAAA,CACxD,MAAA,CAAO,qBAAA,EAAuB,kBAAkB,CAAA,CAChD,MAAA,CAAO,aAAA,EAAe,8BAAA,EAAgC,KAAK,CAAA,CAC3D,MAAA,CAAO,cAAA,EAAgB,wCAAA,EAA0C,KAAK,CAAA,CACtE,MAAA,CAAO,qBAAA,EAAuB,8BAA8B,CAAA,CAC5D,MAAA,CAAO,OAAO,QAAA,EAAoB,OAAA,KAAwF;AACzH,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,OAAA,CAAQ,MAAM,CAAA;AAC9C,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAA,CAAO,MAAA;AAC3B,IAAA,OAAA,CAAQ,WAAW,OAAA,CAAQ,MAAA;AAC3B,IAAA,OAAA,CAAQ,cAAc,OAAA,CAAQ,SAAA;AAAA,EAChC;AACA,EAAA,MAAM,WAAW,QAAA,EAAU;AAAA,IACzB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,WAAW,OAAA,CAAQ;AAAA,GACpB,CAAA;AACH,CAAC,CAAA;AAEH,OAAA,CACG,OAAA,CAAQ,OAAO,CAAA,CACf,WAAA,CAAY,2CAA2C,CAAA,CACvD,MAAA,CAAO,qBAAA,EAAuB,kBAAkB,CAAA,CAChD,MAAA,CAAO,OAAO,OAAA,KAAiC;AAC9C,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,OAAA,CAAQ,MAAM,CAAA;AAC9C,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAA,CAAO,MAAA;AAC3B,EAAA,MAAM,UAAA,CAAW,QAAQ,QAAA,EAAU;AAAA,IACjC,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,WAAW,OAAA,CAAQ;AAAA,GACpB,CAAA;AACH,CAAC,CAAA;AAEH,OAAA,CACG,OAAA,CAAQ,OAAO,CAAA,CACf,WAAA,CAAY,uDAAuD,CAAA,CACnE,MAAA,CAAO,qBAAA,EAAuB,kBAAkB,CAAA,CAChD,MAAA,CAAO,OAAO,OAAA,KAAiC;AAC9C,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,OAAA,CAAQ,MAAM,CAAA;AAC9C,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAA,CAAO,MAAA;AAC3B,EAAA,MAAM,UAAA,CAAW,QAAQ,QAAA,EAAU;AAAA,IACjC,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,KAAA,EAAO;AAAA,GACR,CAAA;AACH,CAAC,CAAA;AAEH,IAAM,SAAS,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,CAAE,YAAY,mCAAmC,CAAA;AAExF,MAAA,CACG,OAAA,CAAQ,KAAK,CAAA,CACb,QAAA,CAAS,UAAU,iBAAiB,CAAA,CACpC,MAAA,CAAO,SAAA,EAAW,4BAA4B,KAAK,CAAA,CACnD,MAAA,CAAO,OAAO,MAAc,OAAA,KAAiC;AAC5D,EAAA,MAAM,WAAA,CAAY,MAAM,EAAE,KAAA,EAAO,QAAQ,OAAA,CAAQ,KAAK,GAAG,CAAA;AAC3D,CAAC,CAAA;AAEH,MAAA,CACG,OAAA,CAAQ,WAAW,CAAA,CACnB,QAAA,CAAS,UAAU,6BAA6B,CAAA,CAChD,OAAO,iBAAA,EAAmB,kBAAA,EAAoB,gBAAgB,CAAA,CAC9D,MAAA,CAAO,WAAW,0BAAA,EAA4B,KAAK,EACnD,MAAA,CAAO,OAAO,MAAc,OAAA,KAA+C;AAC1E,EAAA,MAAM,kBAAkB,IAAA,EAAM;AAAA,IAC5B,KAAK,OAAA,CAAQ,GAAA;AAAA,IACb,KAAA,EAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK;AAAA,GAC7B,CAAA;AACH,CAAC,CAAA;AAEH,OAAA,CACG,OAAA,CAAQ,mBAAmB,CAAA,CAC3B,WAAA,CAAY,0EAA0E,CAAA,CACtF,cAAA,CAAe,sBAAsB,mDAAmD,CAAA,CACxF,OAAO,qBAAA,EAAuB,6CAA6C,EAC3E,MAAA,CAAO,uBAAA,EAAyB,kCAAkC,QAAQ,CAAA,CAC1E,MAAA,CAAO,OAAO,OAAA,KAA8E;AAC3F,EAAA,MAAM,mBAAA,CAAoB;AAAA,IACxB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AACH,CAAC,CAAA;AAEH,OAAA,CACG,OAAA,CAAQ,kBAAkB,CAAA,CAC1B,WAAA,CAAY,kFAAkF,CAAA,CAC9F,cAAA,CAAe,sBAAsB,kDAAkD,CAAA,CACvF,OAAO,qBAAA,EAAuB,6CAA6C,EAC3E,MAAA,CAAO,uBAAA,EAAyB,kCAAkC,QAAQ,CAAA,CAC1E,MAAA,CAAO,OAAO,OAAA,KAA8E;AAC3F,EAAA,MAAM,kBAAA,CAAmB;AAAA,IACvB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AACH,CAAC,CAAA;AAEH,OAAA,CACG,OAAA,CAAQ,MAAM,CAAA,CACd,WAAA,CAAY,+CAA+C,CAAA,CAC3D,MAAA,CAAO,6BAAA,EAA+B,oBAAoB,CAAA,CAC1D,MAAA,CAAO,OAAO,OAAA,KAAoC;AACjD,EAAA,MAAM,QAAA,CAAS,EAAE,QAAA,EAAU,OAAA,CAAQ,SAAS,CAAA;AAC9C,CAAC,CAAA;AAEH,KAAK,OAAA,CAAQ,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAA","file":"index.js","sourcesContent":["import { readFile, writeFile, mkdir, rm } from 'node:fs/promises';\nimport { dirname, join, relative, resolve, basename } from 'node:path';\nimport chokidar from 'chokidar';\nimport fg from 'fast-glob';\nimport pc from 'picocolors';\nimport { GenMapping, addMapping, setSourceContent, toEncodedMap } from '@jridgewell/gen-mapping';\nimport { compileTemplate } from '../compiler/compileTemplate.js';\nimport type { CompiledTemplate, TemplateCompileOptions } from '../compiler/types.js';\nimport { createStyleScopeId, scopeStyles } from '../shared/styleScope.js';\n\nexport interface CompileCommandOptions extends TemplateCompileOptions {\n outDir?: string;\n watch?: boolean;\n sourceMap?: boolean;\n}\n\nexport async function runCompile(pattern: string | string[], options: CompileCommandOptions = {}) {\n const compiler = new ComponentFileCompiler(options);\n const files = await compiler.compileInitial(pattern);\n if (!files.length && !options.watch) {\n console.warn(pc.yellow('No .cex files found.'));\n return;\n }\n if (options.watch) {\n await compiler.watch(pattern);\n }\n}\n\nclass ComponentFileCompiler {\n constructor(private readonly options: CompileCommandOptions) {}\n\n async compileInitial(pattern: string | string[]) {\n const entries = Array.isArray(pattern) ? pattern : [pattern];\n const files = await fg(entries, { absolute: true });\n await Promise.all(files.map(file => this.compileFile(file)));\n return files;\n }\n\n async watch(pattern: string | string[]) {\n const entries = Array.isArray(pattern) ? pattern : [pattern];\n const watcher = chokidar.watch(entries, { ignoreInitial: true });\n console.log(pc.cyan('Watching .cex files for changes...'));\n\n const recompile = async (file: string) => {\n await this.compileFile(file);\n };\n\n watcher.on('add', file => {\n void recompile(file);\n });\n watcher.on('change', file => {\n void recompile(file);\n });\n watcher.on('unlink', file => {\n void this.removeOutput(file);\n console.log(pc.dim(`removed ${relative(process.cwd(), file)}`));\n });\n\n await new Promise<void>((resolve, reject) => {\n watcher.on('error', error => {\n const normalized = error instanceof Error ? error : new Error(String(error));\n console.error(pc.red(`Watcher error: ${normalized.message}`));\n reject(normalized);\n });\n const close = () => {\n watcher\n .close()\n .then(resolve)\n .catch((err: unknown) => {\n const normalized = err instanceof Error ? err : new Error(String(err));\n reject(normalized);\n });\n };\n process.once('SIGINT', close);\n process.once('SIGTERM', close);\n });\n }\n\n private async compileFile(file: string) {\n try {\n const source = await readFile(file, 'utf8');\n const { template, styles } = parseComponentFile(source);\n const scopeId = styles.length ? createStyleScopeId(`${file}:${styles.join('|')}`) : undefined;\n const compiled = compileTemplate(template, {\n ...this.options,\n name: this.options.name ?? deriveName(file),\n scopeId,\n });\n if (scopeId) {\n compiled.scopeId = scopeId;\n }\n if (styles.length) {\n compiled.styles = scopeId ? scopeStyles(styles, scopeId) : styles;\n }\n await this.writeOutput(file, compiled, source);\n this.logSuccess(file);\n } catch (error) {\n this.logError(file, error);\n }\n }\n\n private async writeOutput(file: string, compiled: CompiledTemplate, source: string) {\n const outFile = this.resolveOutFile(file);\n await mkdir(dirname(outFile), { recursive: true });\n const emission = emitModule(compiled, {\n outFile,\n source,\n sourcePath: file,\n withSourceMap: Boolean(this.options.sourceMap),\n });\n await writeFile(outFile, emission.code, 'utf8');\n if (emission.map) {\n await writeFile(`${outFile}.map`, JSON.stringify(emission.map, null, 2), 'utf8');\n }\n }\n\n private async removeOutput(file: string) {\n const outFile = this.resolveOutFile(file);\n await rm(outFile, { force: true });\n if (this.options.sourceMap) {\n await rm(`${outFile}.map`, { force: true });\n }\n }\n\n private resolveOutFile(file: string) {\n const outDir = this.options.outDir ? resolve(this.options.outDir) : dirname(file);\n return join(outDir, `${deriveName(file)}.cex.ts`);\n }\n\n private logSuccess(file: string) {\n const outFile = this.resolveOutFile(file);\n console.log(pc.green(`compiled ${relative(process.cwd(), file)} -> ${relative(process.cwd(), outFile)}`));\n }\n\n private logError(file: string, error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(pc.red(`failed to compile ${relative(process.cwd(), file)}: ${message}`));\n }\n}\n\nfunction parseComponentFile(source: string) {\n const templatePattern = /<template>([\\s\\S]*?)<\\/template>/i;\n const templateMatch = templatePattern.exec(source);\n if (!templateMatch) {\n throw new Error('Missing <template> block.');\n }\n const styleMatches = Array.from(source.matchAll(/<style[^>]*>([\\s\\S]*?)<\\/style>/gi));\n const styles = styleMatches.map(match => match[1].trim()).filter(Boolean);\n return { template: templateMatch[1], styles };\n}\n\ninterface EmitOptions {\n outFile: string;\n source: string;\n sourcePath: string;\n withSourceMap: boolean;\n}\n\nfunction emitModule(compiled: CompiledTemplate, options: EmitOptions) {\n const payload = JSON.stringify(compiled, null, 2);\n let code = `import type { CompiledTemplate } from '@clusterenvision/ui-framework/compiler';\nexport const template = ${payload} satisfies CompiledTemplate;\nexport default template;\n`;\n let map: object | undefined;\n if (options.withSourceMap) {\n const relSource = relative(dirname(options.outFile), options.sourcePath).replace(/\\\\/g, '/');\n const mapping = new GenMapping({ file: basename(options.outFile) });\n setSourceContent(mapping, relSource, options.source);\n addMapping(mapping, {\n source: relSource,\n original: { line: 1, column: 0 },\n generated: { line: 1, column: 0 },\n });\n map = toEncodedMap(mapping);\n code += `//# sourceMappingURL=${basename(options.outFile)}.map\\n`;\n }\n return { code, map };\n}\n\nfunction deriveName(file: string) {\n const base = file.split('/').pop() ?? 'component';\n return base.replace(/\\.[^.]+$/, '');\n}\n","import { promises as fs } from 'node:fs';\n\nimport { buildRuntimeChromeTraceDocument } from '../runtime/timeline.js';\n\nconst VALID_FORMATS = new Set(['chrome', 'events']);\n\nexport async function runRuntimeTimeline(options) {\n const format = options.format ?? 'chrome';\n if (!VALID_FORMATS.has(format)) {\n throw new Error(`Unsupported format '${format}'. Expected one of: ${[...VALID_FORMATS].join(', ')}`);\n }\n const events = await readTraceEvents(options.input);\n const payload = format === 'chrome' ? buildChromeTracePayload(events) : buildEventsPayload(events);\n if (options.output) {\n await fs.writeFile(options.output, payload, 'utf8');\n return;\n }\n process.stdout.write(`${payload}\\n`);\n}\n\nasync function readTraceEvents(filePath) {\n const contents = await fs.readFile(filePath, 'utf8');\n const trimmed = contents.trim();\n if (!trimmed) {\n return [];\n }\n const serialized = trimmed.startsWith('[')\n ? JSON.parse(trimmed)\n : trimmed\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean)\n .map(line => JSON.parse(line));\n return serialized.map(event => ({\n ...event,\n timestamp: new Date(event.timestamp),\n }));\n}\n\nfunction buildChromeTracePayload(events) {\n const document = buildRuntimeChromeTraceDocument(events);\n return JSON.stringify(document, null, 2);\n}\n\nfunction buildEventsPayload(events) {\n const serialized = events.map(event => ({\n ...event,\n timestamp: event.timestamp.toISOString(),\n }));\n return JSON.stringify(serialized, null, 2);\n}\n","import { promises as fs } from 'node:fs';\n\nimport { buildChromeTraceDocument } from '../runtime/workflow/timeline.js';\n\nconst VALID_FORMATS = new Set(['chrome', 'events']);\n\nexport async function runWorkflowTimeline(options) {\n const format = options.format ?? 'chrome';\n if (!VALID_FORMATS.has(format)) {\n throw new Error(`Unsupported format '${format}'. Expected one of: ${[...VALID_FORMATS].join(', ')}`);\n }\n const events = await readTraceEvents(options.input);\n const payload = format === 'chrome' ? buildChromeTracePayload(events) : buildEventsPayload(events);\n if (options.output) {\n await fs.writeFile(options.output, payload, 'utf8');\n return;\n }\n process.stdout.write(`${payload}\\n`);\n}\n\nasync function readTraceEvents(filePath) {\n const contents = await fs.readFile(filePath, 'utf8');\n const trimmed = contents.trim();\n if (!trimmed) {\n return [];\n }\n const serialized = trimmed.startsWith('[')\n ? JSON.parse(trimmed)\n : trimmed\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean)\n .map(line => JSON.parse(line));\n return serialized.map(event => ({\n ...event,\n timestamp: new Date(event.timestamp),\n }));\n}\n\nfunction buildChromeTracePayload(events) {\n const document = buildChromeTraceDocument(events);\n return JSON.stringify(document, null, 2);\n}\n\nfunction buildEventsPayload(events) {\n const serialized = events.map(event => ({\n ...event,\n timestamp: event.timestamp.toISOString(),\n }));\n return JSON.stringify(serialized, null, 2);\n}\n","import { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\n\nexport interface CeuiCompileConfig {\n patterns: string[];\n outDir?: string;\n sourceMap?: boolean;\n}\n\nexport interface CeuiConfig {\n compile: CeuiCompileConfig;\n}\n\nexport interface LoadedConfig {\n path: string;\n config: CeuiConfig;\n}\n\nexport async function loadConfig(configPath?: string): Promise<LoadedConfig> {\n const resolved = resolve(configPath ?? 'ceui.config.json');\n const raw = await readFile(resolved, 'utf8');\n const parsed = JSON.parse(raw) as unknown;\n const config = validateConfig(parsed);\n return { path: resolved, config };\n}\n\nexport function validateConfig(input: unknown): CeuiConfig {\n if (!input || typeof input !== 'object') {\n throw new Error('Config must be a JSON object.');\n }\n const obj = input as Record<string, unknown>;\n const compile = obj.compile;\n if (!compile || typeof compile !== 'object') {\n throw new Error('Config must include a \"compile\" object.');\n }\n const compileObj = compile as Record<string, unknown>;\n const patterns = compileObj.patterns;\n if (!Array.isArray(patterns) || patterns.length === 0 || !patterns.every(item => typeof item === 'string')) {\n throw new Error('\"compile.patterns\" must be a non-empty array of strings.');\n }\n const outDir = compileObj.outDir;\n if (outDir !== undefined && typeof outDir !== 'string') {\n throw new Error('\"compile.outDir\" must be a string when provided.');\n }\n const sourceMap = compileObj.sourceMap;\n if (sourceMap !== undefined && typeof sourceMap !== 'boolean') {\n throw new Error('\"compile.sourceMap\" must be a boolean when provided.');\n }\n return {\n compile: {\n patterns,\n outDir,\n sourceMap,\n },\n } satisfies CeuiConfig;\n}\n","import { mkdir, readdir, writeFile, stat } from 'node:fs/promises';\nimport { resolve, join } from 'node:path';\nimport pc from 'picocolors';\n\ninterface ScaffoldOptions {\n force?: boolean;\n}\n\ninterface ComponentScaffoldOptions extends ScaffoldOptions {\n dir?: string;\n}\n\nexport async function scaffoldApp(name: string, options: ScaffoldOptions = {}): Promise<void> {\n const root = resolve(process.cwd(), name);\n await ensureEmptyDir(root, options.force);\n await mkdir(join(root, 'src'), { recursive: true });\n\n await writeFileSafe(\n join(root, 'package.json'),\n JSON.stringify(\n {\n name,\n version: '0.1.0',\n private: true,\n type: 'module',\n scripts: {\n build: 'ceui build',\n watch: 'ceui watch',\n test: 'ceui test',\n typecheck: 'tsc --noEmit',\n },\n dependencies: {\n '@clusterenvision/ui-framework': '^1.0.0',\n '@clusterenvision/ui-webcomponents': '^1.1.0',\n '@clusterenvision/ce-ui-scss': '^1.94.2',\n },\n devDependencies: {\n '@types/node': '^22.7.4',\n typescript: '^5.9.3',\n },\n },\n null,\n 2,\n ),\n options.force,\n );\n\n await writeFileSafe(\n join(root, 'ceui.config.json'),\n JSON.stringify(\n {\n compile: {\n patterns: ['src/**/*.cex'],\n outDir: 'src/generated',\n sourceMap: true,\n },\n },\n null,\n 2,\n ),\n options.force,\n );\n\n await writeFileSafe(\n join(root, 'src', 'app.cex'),\n `<template>\n <main class=\"app\">\n <h1>CE UI App</h1>\n <p>Welcome to your new workspace.</p>\n </main>\n</template>\n\n<style>\n .app {\n font-family: \"Space Grotesk\", sans-serif;\n padding: 48px;\n }\n</style>\n`,\n options.force,\n );\n\n await writeFileSafe(\n join(root, 'src', 'main.ts'),\n `import { defineComponent, renderComponent } from '@clusterenvision/ui-framework';\nimport template from './generated/app.cex.js';\n\nconst App = defineComponent({\n name: 'App',\n template,\n});\n\nconst target = document.getElementById('app');\nif (target) {\n renderComponent(App, { target });\n}\n`,\n options.force,\n );\n\n await writeFileSafe(\n join(root, 'index.html'),\n `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${name}</title>\n </head>\n <body>\n <div id=\"app\"></div>\n <script type=\"module\" src=\"/src/main.ts\"></script>\n </body>\n</html>\n`,\n options.force,\n );\n\n await writeFileSafe(\n join(root, 'tsconfig.json'),\n JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'Bundler',\n strict: true,\n lib: ['ES2022', 'DOM'],\n },\n include: ['src'],\n },\n null,\n 2,\n ),\n options.force,\n );\n\n console.log(pc.green(`Scaffolded CE UI app at ${root}`));\n}\n\nexport async function scaffoldComponent(name: string, options: ComponentScaffoldOptions = {}): Promise<void> {\n const dir = resolve(process.cwd(), options.dir ?? 'src/components');\n await mkdir(dir, { recursive: true });\n const fileBase = name.replace(/\\s+/g, '');\n const cexPath = join(dir, `${fileBase}.cex`);\n const tsPath = join(dir, `${fileBase}.ts`);\n\n await writeFileSafe(\n cexPath,\n `<template>\n <section class=\"${fileBase}\">\n <h2>${fileBase}</h2>\n <slot></slot>\n </section>\n</template>\n\n<style>\n .${fileBase} {\n padding: 16px;\n }\n</style>\n`,\n options.force,\n );\n\n await writeFileSafe(\n tsPath,\n `import { defineComponent } from '@clusterenvision/ui-framework';\nimport template from './${fileBase}.cex.js';\n\nexport const ${fileBase} = defineComponent({\n name: '${fileBase}',\n template,\n});\n`,\n options.force,\n );\n\n console.log(pc.green(`Scaffolded component ${fileBase} in ${dir}`));\n}\n\nasync function ensureEmptyDir(target: string, force?: boolean): Promise<void> {\n try {\n const stats = await stat(target);\n if (!stats.isDirectory()) {\n throw new Error(`${target} exists and is not a directory.`);\n }\n const entries = await readdir(target);\n if (entries.length > 0 && !force) {\n throw new Error(`${target} is not empty. Use --force to overwrite.`);\n }\n } catch (error) {\n const code = (error as { code?: string }).code;\n if (code === 'ENOENT') {\n await mkdir(target, { recursive: true });\n return;\n }\n if (force) {\n await mkdir(target, { recursive: true });\n return;\n }\n throw error;\n }\n}\n\nasync function writeFileSafe(path: string, contents: string, force?: boolean): Promise<void> {\n if (!force) {\n try {\n await stat(path);\n throw new Error(`${path} already exists. Use --force to overwrite.`);\n } catch (error) {\n const code = (error as { code?: string }).code;\n if (code !== 'ENOENT') {\n throw error;\n }\n }\n }\n await writeFile(path, contents, 'utf8');\n}\n","import { spawn } from 'node:child_process';\nimport fg from 'fast-glob';\nimport pc from 'picocolors';\n\nexport interface TestCommandOptions {\n patterns?: string[];\n}\n\nconst DEFAULT_PATTERNS = ['tests/**/*.spec.{js,ts}', 'tests/**/*.test.{js,ts}'];\n\nexport async function runTests(options: TestCommandOptions = {}): Promise<void> {\n const patterns = options.patterns?.length ? options.patterns : DEFAULT_PATTERNS;\n const files = await fg(patterns, { absolute: true });\n if (!files.length) {\n console.log(pc.yellow('No test files found.'));\n return;\n }\n await runNodeTest(files);\n}\n\nfunction runNodeTest(files: string[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(process.execPath, ['--test', ...files], { stdio: 'inherit' });\n child.on('exit', code => {\n if (code === 0) {\n resolve();\n return;\n }\n reject(new Error(`Test run failed with code ${String(code ?? 'unknown')}.`));\n });\n child.on('error', error => {\n reject(error);\n });\n });\n}\n","#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { runCompile } from './compile.js';\nimport { runRuntimeTimeline } from './runtime-timeline.js';\nimport { runWorkflowTimeline } from './workflow-timeline.js';\nimport { loadConfig } from './config.js';\nimport { scaffoldApp, scaffoldComponent } from './scaffold.js';\nimport { runTests } from './test.js';\n\nconst program = new Command();\n\nprogram\n .name('ceui')\n .description('CE UI framework tooling')\n .version('0.1.0');\n\nprogram\n .command('compile')\n .argument('<patterns...>', 'Glob patterns for .cex files')\n .option('-o, --out-dir <dir>', 'Output directory')\n .option('-w, --watch', 'Recompile when inputs change', false)\n .option('--source-map', 'Emit source maps for generated modules', false)\n .option('-c, --config <file>', 'Use config file for defaults')\n .action(async (patterns: string[], options: { outDir?: string; watch?: boolean; sourceMap?: boolean; config?: string }) => {\n if (options.config) {\n const loaded = await loadConfig(options.config);\n const { compile } = loaded.config;\n options.outDir ??= compile.outDir;\n options.sourceMap ??= compile.sourceMap;\n }\n await runCompile(patterns, {\n outDir: options.outDir,\n watch: options.watch,\n sourceMap: options.sourceMap,\n });\n });\n\nprogram\n .command('build')\n .description('Compile .cex files using ceui.config.json')\n .option('-c, --config <file>', 'Config file path')\n .action(async (options: { config?: string }) => {\n const loaded = await loadConfig(options.config);\n const { compile } = loaded.config;\n await runCompile(compile.patterns, {\n outDir: compile.outDir,\n sourceMap: compile.sourceMap,\n });\n });\n\nprogram\n .command('watch')\n .description('Watch and recompile .cex files using ceui.config.json')\n .option('-c, --config <file>', 'Config file path')\n .action(async (options: { config?: string }) => {\n const loaded = await loadConfig(options.config);\n const { compile } = loaded.config;\n await runCompile(compile.patterns, {\n outDir: compile.outDir,\n sourceMap: compile.sourceMap,\n watch: true,\n });\n });\n\nconst create = program.command('create').description('Scaffold CE UI apps or components');\n\ncreate\n .command('app')\n .argument('<name>', 'App folder name')\n .option('--force', 'Overwrite existing files', false)\n .action(async (name: string, options: { force?: boolean }) => {\n await scaffoldApp(name, { force: Boolean(options.force) });\n });\n\ncreate\n .command('component')\n .argument('<name>', 'Component name (PascalCase)')\n .option('-d, --dir <dir>', 'Output directory', 'src/components')\n .option('--force', 'Overwrite existing files', false)\n .action(async (name: string, options: { dir?: string; force?: boolean }) => {\n await scaffoldComponent(name, {\n dir: options.dir,\n force: Boolean(options.force),\n });\n });\n\nprogram\n .command('workflow:timeline')\n .description('Convert workflow trace JSON/JSONL into Chrome trace format or raw events')\n .requiredOption('-i, --input <file>', 'Path to workflow trace file (JSONL or JSON array)')\n .option('-o, --output <file>', 'Output file (writes to stdout when omitted)')\n .option('-f, --format <format>', 'Output format: chrome | events', 'chrome')\n .action(async (options: { input: string; output?: string; format?: 'chrome' | 'events' }) => {\n await runWorkflowTimeline({\n input: options.input,\n output: options.output,\n format: options.format,\n });\n });\n\nprogram\n .command('runtime:timeline')\n .description('Convert renderer/runtime trace JSON/JSONL into Chrome trace format or raw events')\n .requiredOption('-i, --input <file>', 'Path to runtime trace file (JSONL or JSON array)')\n .option('-o, --output <file>', 'Output file (writes to stdout when omitted)')\n .option('-f, --format <format>', 'Output format: chrome | events', 'chrome')\n .action(async (options: { input: string; output?: string; format?: 'chrome' | 'events' }) => {\n await runRuntimeTimeline({\n input: options.input,\n output: options.output,\n format: options.format,\n });\n });\n\nprogram\n .command('test')\n .description('Run Node.js test runner with default patterns')\n .option('-p, --pattern <patterns...>', 'Test file patterns')\n .action(async (options: { pattern?: string[] }) => {\n await runTests({ patterns: options.pattern });\n });\n\nvoid program.parseAsync(process.argv);\n"]}