@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,566 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ var chunk4L3UXVL5_cjs = require('../chunk-4L3UXVL5.cjs');
5
+ var chunkI6GNUM3P_cjs = require('../chunk-I6GNUM3P.cjs');
6
+ var chunkIRBUKIRF_cjs = require('../chunk-IRBUKIRF.cjs');
7
+ var chunkFFCZSYC7_cjs = require('../chunk-FFCZSYC7.cjs');
8
+ var commander = require('commander');
9
+ var promises = require('fs/promises');
10
+ var path = require('path');
11
+ var chokidar = require('chokidar');
12
+ var fg = require('fast-glob');
13
+ var pc = require('picocolors');
14
+ var genMapping = require('@jridgewell/gen-mapping');
15
+ var fs = require('fs');
16
+ var child_process = require('child_process');
17
+
18
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
19
+
20
+ var chokidar__default = /*#__PURE__*/_interopDefault(chokidar);
21
+ var fg__default = /*#__PURE__*/_interopDefault(fg);
22
+ var pc__default = /*#__PURE__*/_interopDefault(pc);
23
+
24
+ async function runCompile(pattern, options = {}) {
25
+ const compiler = new ComponentFileCompiler(options);
26
+ const files = await compiler.compileInitial(pattern);
27
+ if (!files.length && !options.watch) {
28
+ console.warn(pc__default.default.yellow("No .cex files found."));
29
+ return;
30
+ }
31
+ if (options.watch) {
32
+ await compiler.watch(pattern);
33
+ }
34
+ }
35
+ var ComponentFileCompiler = class {
36
+ constructor(options) {
37
+ this.options = options;
38
+ }
39
+ options;
40
+ async compileInitial(pattern) {
41
+ const entries = Array.isArray(pattern) ? pattern : [pattern];
42
+ const files = await fg__default.default(entries, { absolute: true });
43
+ await Promise.all(files.map((file) => this.compileFile(file)));
44
+ return files;
45
+ }
46
+ async watch(pattern) {
47
+ const entries = Array.isArray(pattern) ? pattern : [pattern];
48
+ const watcher = chokidar__default.default.watch(entries, { ignoreInitial: true });
49
+ console.log(pc__default.default.cyan("Watching .cex files for changes..."));
50
+ const recompile = async (file) => {
51
+ await this.compileFile(file);
52
+ };
53
+ watcher.on("add", (file) => {
54
+ void recompile(file);
55
+ });
56
+ watcher.on("change", (file) => {
57
+ void recompile(file);
58
+ });
59
+ watcher.on("unlink", (file) => {
60
+ void this.removeOutput(file);
61
+ console.log(pc__default.default.dim(`removed ${path.relative(process.cwd(), file)}`));
62
+ });
63
+ await new Promise((resolve4, reject) => {
64
+ watcher.on("error", (error) => {
65
+ const normalized = error instanceof Error ? error : new Error(String(error));
66
+ console.error(pc__default.default.red(`Watcher error: ${normalized.message}`));
67
+ reject(normalized);
68
+ });
69
+ const close = () => {
70
+ watcher.close().then(resolve4).catch((err) => {
71
+ const normalized = err instanceof Error ? err : new Error(String(err));
72
+ reject(normalized);
73
+ });
74
+ };
75
+ process.once("SIGINT", close);
76
+ process.once("SIGTERM", close);
77
+ });
78
+ }
79
+ async compileFile(file) {
80
+ try {
81
+ const source = await promises.readFile(file, "utf8");
82
+ const { template, styles } = parseComponentFile(source);
83
+ const scopeId = styles.length ? chunkIRBUKIRF_cjs.createStyleScopeId(`${file}:${styles.join("|")}`) : void 0;
84
+ const compiled = chunkFFCZSYC7_cjs.compileTemplate(template, {
85
+ ...this.options,
86
+ name: this.options.name ?? deriveName(file),
87
+ scopeId
88
+ });
89
+ if (scopeId) {
90
+ compiled.scopeId = scopeId;
91
+ }
92
+ if (styles.length) {
93
+ compiled.styles = scopeId ? chunkIRBUKIRF_cjs.scopeStyles(styles, scopeId) : styles;
94
+ }
95
+ await this.writeOutput(file, compiled, source);
96
+ this.logSuccess(file);
97
+ } catch (error) {
98
+ this.logError(file, error);
99
+ }
100
+ }
101
+ async writeOutput(file, compiled, source) {
102
+ const outFile = this.resolveOutFile(file);
103
+ await promises.mkdir(path.dirname(outFile), { recursive: true });
104
+ const emission = emitModule(compiled, {
105
+ outFile,
106
+ source,
107
+ sourcePath: file,
108
+ withSourceMap: Boolean(this.options.sourceMap)
109
+ });
110
+ await promises.writeFile(outFile, emission.code, "utf8");
111
+ if (emission.map) {
112
+ await promises.writeFile(`${outFile}.map`, JSON.stringify(emission.map, null, 2), "utf8");
113
+ }
114
+ }
115
+ async removeOutput(file) {
116
+ const outFile = this.resolveOutFile(file);
117
+ await promises.rm(outFile, { force: true });
118
+ if (this.options.sourceMap) {
119
+ await promises.rm(`${outFile}.map`, { force: true });
120
+ }
121
+ }
122
+ resolveOutFile(file) {
123
+ const outDir = this.options.outDir ? path.resolve(this.options.outDir) : path.dirname(file);
124
+ return path.join(outDir, `${deriveName(file)}.cex.ts`);
125
+ }
126
+ logSuccess(file) {
127
+ const outFile = this.resolveOutFile(file);
128
+ console.log(pc__default.default.green(`compiled ${path.relative(process.cwd(), file)} -> ${path.relative(process.cwd(), outFile)}`));
129
+ }
130
+ logError(file, error) {
131
+ const message = error instanceof Error ? error.message : String(error);
132
+ console.error(pc__default.default.red(`failed to compile ${path.relative(process.cwd(), file)}: ${message}`));
133
+ }
134
+ };
135
+ function parseComponentFile(source) {
136
+ const templatePattern = /<template>([\s\S]*?)<\/template>/i;
137
+ const templateMatch = templatePattern.exec(source);
138
+ if (!templateMatch) {
139
+ throw new Error("Missing <template> block.");
140
+ }
141
+ const styleMatches = Array.from(source.matchAll(/<style[^>]*>([\s\S]*?)<\/style>/gi));
142
+ const styles = styleMatches.map((match) => match[1].trim()).filter(Boolean);
143
+ return { template: templateMatch[1], styles };
144
+ }
145
+ function emitModule(compiled, options) {
146
+ const payload = JSON.stringify(compiled, null, 2);
147
+ let code = `import type { CompiledTemplate } from '@clusterenvision/ui-framework/compiler';
148
+ export const template = ${payload} satisfies CompiledTemplate;
149
+ export default template;
150
+ `;
151
+ let map;
152
+ if (options.withSourceMap) {
153
+ const relSource = path.relative(path.dirname(options.outFile), options.sourcePath).replace(/\\/g, "/");
154
+ const mapping = new genMapping.GenMapping({ file: path.basename(options.outFile) });
155
+ genMapping.setSourceContent(mapping, relSource, options.source);
156
+ genMapping.addMapping(mapping, {
157
+ source: relSource,
158
+ original: { line: 1, column: 0 },
159
+ generated: { line: 1, column: 0 }
160
+ });
161
+ map = genMapping.toEncodedMap(mapping);
162
+ code += `//# sourceMappingURL=${path.basename(options.outFile)}.map
163
+ `;
164
+ }
165
+ return { code, map };
166
+ }
167
+ function deriveName(file) {
168
+ const base = file.split("/").pop() ?? "component";
169
+ return base.replace(/\.[^.]+$/, "");
170
+ }
171
+ var VALID_FORMATS = /* @__PURE__ */ new Set(["chrome", "events"]);
172
+ async function runRuntimeTimeline(options) {
173
+ const format = options.format ?? "chrome";
174
+ if (!VALID_FORMATS.has(format)) {
175
+ throw new Error(`Unsupported format '${format}'. Expected one of: ${[...VALID_FORMATS].join(", ")}`);
176
+ }
177
+ const events = await readTraceEvents(options.input);
178
+ const payload = format === "chrome" ? buildChromeTracePayload(events) : buildEventsPayload(events);
179
+ if (options.output) {
180
+ await fs.promises.writeFile(options.output, payload, "utf8");
181
+ return;
182
+ }
183
+ process.stdout.write(`${payload}
184
+ `);
185
+ }
186
+ async function readTraceEvents(filePath) {
187
+ const contents = await fs.promises.readFile(filePath, "utf8");
188
+ const trimmed = contents.trim();
189
+ if (!trimmed) {
190
+ return [];
191
+ }
192
+ const serialized = trimmed.startsWith("[") ? JSON.parse(trimmed) : trimmed.split("\n").map((line) => line.trim()).filter(Boolean).map((line) => JSON.parse(line));
193
+ return serialized.map((event) => ({
194
+ ...event,
195
+ timestamp: new Date(event.timestamp)
196
+ }));
197
+ }
198
+ function buildChromeTracePayload(events) {
199
+ const document = chunkI6GNUM3P_cjs.buildRuntimeChromeTraceDocument(events);
200
+ return JSON.stringify(document, null, 2);
201
+ }
202
+ function buildEventsPayload(events) {
203
+ const serialized = events.map((event) => ({
204
+ ...event,
205
+ timestamp: event.timestamp.toISOString()
206
+ }));
207
+ return JSON.stringify(serialized, null, 2);
208
+ }
209
+ var VALID_FORMATS2 = /* @__PURE__ */ new Set(["chrome", "events"]);
210
+ async function runWorkflowTimeline(options) {
211
+ const format = options.format ?? "chrome";
212
+ if (!VALID_FORMATS2.has(format)) {
213
+ throw new Error(`Unsupported format '${format}'. Expected one of: ${[...VALID_FORMATS2].join(", ")}`);
214
+ }
215
+ const events = await readTraceEvents2(options.input);
216
+ const payload = format === "chrome" ? buildChromeTracePayload2(events) : buildEventsPayload2(events);
217
+ if (options.output) {
218
+ await fs.promises.writeFile(options.output, payload, "utf8");
219
+ return;
220
+ }
221
+ process.stdout.write(`${payload}
222
+ `);
223
+ }
224
+ async function readTraceEvents2(filePath) {
225
+ const contents = await fs.promises.readFile(filePath, "utf8");
226
+ const trimmed = contents.trim();
227
+ if (!trimmed) {
228
+ return [];
229
+ }
230
+ const serialized = trimmed.startsWith("[") ? JSON.parse(trimmed) : trimmed.split("\n").map((line) => line.trim()).filter(Boolean).map((line) => JSON.parse(line));
231
+ return serialized.map((event) => ({
232
+ ...event,
233
+ timestamp: new Date(event.timestamp)
234
+ }));
235
+ }
236
+ function buildChromeTracePayload2(events) {
237
+ const document = chunk4L3UXVL5_cjs.buildChromeTraceDocument(events);
238
+ return JSON.stringify(document, null, 2);
239
+ }
240
+ function buildEventsPayload2(events) {
241
+ const serialized = events.map((event) => ({
242
+ ...event,
243
+ timestamp: event.timestamp.toISOString()
244
+ }));
245
+ return JSON.stringify(serialized, null, 2);
246
+ }
247
+ async function loadConfig(configPath) {
248
+ const resolved = path.resolve(configPath ?? "ceui.config.json");
249
+ const raw = await promises.readFile(resolved, "utf8");
250
+ const parsed = JSON.parse(raw);
251
+ const config = validateConfig(parsed);
252
+ return { path: resolved, config };
253
+ }
254
+ function validateConfig(input) {
255
+ if (!input || typeof input !== "object") {
256
+ throw new Error("Config must be a JSON object.");
257
+ }
258
+ const obj = input;
259
+ const compile = obj.compile;
260
+ if (!compile || typeof compile !== "object") {
261
+ throw new Error('Config must include a "compile" object.');
262
+ }
263
+ const compileObj = compile;
264
+ const patterns = compileObj.patterns;
265
+ if (!Array.isArray(patterns) || patterns.length === 0 || !patterns.every((item) => typeof item === "string")) {
266
+ throw new Error('"compile.patterns" must be a non-empty array of strings.');
267
+ }
268
+ const outDir = compileObj.outDir;
269
+ if (outDir !== void 0 && typeof outDir !== "string") {
270
+ throw new Error('"compile.outDir" must be a string when provided.');
271
+ }
272
+ const sourceMap = compileObj.sourceMap;
273
+ if (sourceMap !== void 0 && typeof sourceMap !== "boolean") {
274
+ throw new Error('"compile.sourceMap" must be a boolean when provided.');
275
+ }
276
+ return {
277
+ compile: {
278
+ patterns,
279
+ outDir,
280
+ sourceMap
281
+ }
282
+ };
283
+ }
284
+ async function scaffoldApp(name, options = {}) {
285
+ const root = path.resolve(process.cwd(), name);
286
+ await ensureEmptyDir(root, options.force);
287
+ await promises.mkdir(path.join(root, "src"), { recursive: true });
288
+ await writeFileSafe(
289
+ path.join(root, "package.json"),
290
+ JSON.stringify(
291
+ {
292
+ name,
293
+ version: "0.1.0",
294
+ private: true,
295
+ type: "module",
296
+ scripts: {
297
+ build: "ceui build",
298
+ watch: "ceui watch",
299
+ test: "ceui test",
300
+ typecheck: "tsc --noEmit"
301
+ },
302
+ dependencies: {
303
+ "@clusterenvision/ui-framework": "^1.0.0",
304
+ "@clusterenvision/ui-webcomponents": "^1.1.0",
305
+ "@clusterenvision/ce-ui-scss": "^1.94.2"
306
+ },
307
+ devDependencies: {
308
+ "@types/node": "^22.7.4",
309
+ typescript: "^5.9.3"
310
+ }
311
+ },
312
+ null,
313
+ 2
314
+ ),
315
+ options.force
316
+ );
317
+ await writeFileSafe(
318
+ path.join(root, "ceui.config.json"),
319
+ JSON.stringify(
320
+ {
321
+ compile: {
322
+ patterns: ["src/**/*.cex"],
323
+ outDir: "src/generated",
324
+ sourceMap: true
325
+ }
326
+ },
327
+ null,
328
+ 2
329
+ ),
330
+ options.force
331
+ );
332
+ await writeFileSafe(
333
+ path.join(root, "src", "app.cex"),
334
+ `<template>
335
+ <main class="app">
336
+ <h1>CE UI App</h1>
337
+ <p>Welcome to your new workspace.</p>
338
+ </main>
339
+ </template>
340
+
341
+ <style>
342
+ .app {
343
+ font-family: "Space Grotesk", sans-serif;
344
+ padding: 48px;
345
+ }
346
+ </style>
347
+ `,
348
+ options.force
349
+ );
350
+ await writeFileSafe(
351
+ path.join(root, "src", "main.ts"),
352
+ `import { defineComponent, renderComponent } from '@clusterenvision/ui-framework';
353
+ import template from './generated/app.cex.js';
354
+
355
+ const App = defineComponent({
356
+ name: 'App',
357
+ template,
358
+ });
359
+
360
+ const target = document.getElementById('app');
361
+ if (target) {
362
+ renderComponent(App, { target });
363
+ }
364
+ `,
365
+ options.force
366
+ );
367
+ await writeFileSafe(
368
+ path.join(root, "index.html"),
369
+ `<!doctype html>
370
+ <html lang="en">
371
+ <head>
372
+ <meta charset="utf-8" />
373
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
374
+ <title>${name}</title>
375
+ </head>
376
+ <body>
377
+ <div id="app"></div>
378
+ <script type="module" src="/src/main.ts"></script>
379
+ </body>
380
+ </html>
381
+ `,
382
+ options.force
383
+ );
384
+ await writeFileSafe(
385
+ path.join(root, "tsconfig.json"),
386
+ JSON.stringify(
387
+ {
388
+ compilerOptions: {
389
+ target: "ES2022",
390
+ module: "ESNext",
391
+ moduleResolution: "Bundler",
392
+ strict: true,
393
+ lib: ["ES2022", "DOM"]
394
+ },
395
+ include: ["src"]
396
+ },
397
+ null,
398
+ 2
399
+ ),
400
+ options.force
401
+ );
402
+ console.log(pc__default.default.green(`Scaffolded CE UI app at ${root}`));
403
+ }
404
+ async function scaffoldComponent(name, options = {}) {
405
+ const dir = path.resolve(process.cwd(), options.dir ?? "src/components");
406
+ await promises.mkdir(dir, { recursive: true });
407
+ const fileBase = name.replace(/\s+/g, "");
408
+ const cexPath = path.join(dir, `${fileBase}.cex`);
409
+ const tsPath = path.join(dir, `${fileBase}.ts`);
410
+ await writeFileSafe(
411
+ cexPath,
412
+ `<template>
413
+ <section class="${fileBase}">
414
+ <h2>${fileBase}</h2>
415
+ <slot></slot>
416
+ </section>
417
+ </template>
418
+
419
+ <style>
420
+ .${fileBase} {
421
+ padding: 16px;
422
+ }
423
+ </style>
424
+ `,
425
+ options.force
426
+ );
427
+ await writeFileSafe(
428
+ tsPath,
429
+ `import { defineComponent } from '@clusterenvision/ui-framework';
430
+ import template from './${fileBase}.cex.js';
431
+
432
+ export const ${fileBase} = defineComponent({
433
+ name: '${fileBase}',
434
+ template,
435
+ });
436
+ `,
437
+ options.force
438
+ );
439
+ console.log(pc__default.default.green(`Scaffolded component ${fileBase} in ${dir}`));
440
+ }
441
+ async function ensureEmptyDir(target, force) {
442
+ try {
443
+ const stats = await promises.stat(target);
444
+ if (!stats.isDirectory()) {
445
+ throw new Error(`${target} exists and is not a directory.`);
446
+ }
447
+ const entries = await promises.readdir(target);
448
+ if (entries.length > 0 && !force) {
449
+ throw new Error(`${target} is not empty. Use --force to overwrite.`);
450
+ }
451
+ } catch (error) {
452
+ const code = error.code;
453
+ if (code === "ENOENT") {
454
+ await promises.mkdir(target, { recursive: true });
455
+ return;
456
+ }
457
+ if (force) {
458
+ await promises.mkdir(target, { recursive: true });
459
+ return;
460
+ }
461
+ throw error;
462
+ }
463
+ }
464
+ async function writeFileSafe(path, contents, force) {
465
+ if (!force) {
466
+ try {
467
+ await promises.stat(path);
468
+ throw new Error(`${path} already exists. Use --force to overwrite.`);
469
+ } catch (error) {
470
+ const code = error.code;
471
+ if (code !== "ENOENT") {
472
+ throw error;
473
+ }
474
+ }
475
+ }
476
+ await promises.writeFile(path, contents, "utf8");
477
+ }
478
+ var DEFAULT_PATTERNS = ["tests/**/*.spec.{js,ts}", "tests/**/*.test.{js,ts}"];
479
+ async function runTests(options = {}) {
480
+ const patterns = options.patterns?.length ? options.patterns : DEFAULT_PATTERNS;
481
+ const files = await fg__default.default(patterns, { absolute: true });
482
+ if (!files.length) {
483
+ console.log(pc__default.default.yellow("No test files found."));
484
+ return;
485
+ }
486
+ await runNodeTest(files);
487
+ }
488
+ function runNodeTest(files) {
489
+ return new Promise((resolve4, reject) => {
490
+ const child = child_process.spawn(process.execPath, ["--test", ...files], { stdio: "inherit" });
491
+ child.on("exit", (code) => {
492
+ if (code === 0) {
493
+ resolve4();
494
+ return;
495
+ }
496
+ reject(new Error(`Test run failed with code ${String(code ?? "unknown")}.`));
497
+ });
498
+ child.on("error", (error) => {
499
+ reject(error);
500
+ });
501
+ });
502
+ }
503
+
504
+ // src/cli/index.ts
505
+ var program = new commander.Command();
506
+ program.name("ceui").description("CE UI framework tooling").version("0.1.0");
507
+ 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) => {
508
+ if (options.config) {
509
+ const loaded = await loadConfig(options.config);
510
+ const { compile } = loaded.config;
511
+ options.outDir ??= compile.outDir;
512
+ options.sourceMap ??= compile.sourceMap;
513
+ }
514
+ await runCompile(patterns, {
515
+ outDir: options.outDir,
516
+ watch: options.watch,
517
+ sourceMap: options.sourceMap
518
+ });
519
+ });
520
+ program.command("build").description("Compile .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
+ });
527
+ });
528
+ program.command("watch").description("Watch and recompile .cex files using ceui.config.json").option("-c, --config <file>", "Config file path").action(async (options) => {
529
+ const loaded = await loadConfig(options.config);
530
+ const { compile } = loaded.config;
531
+ await runCompile(compile.patterns, {
532
+ outDir: compile.outDir,
533
+ sourceMap: compile.sourceMap,
534
+ watch: true
535
+ });
536
+ });
537
+ var create = program.command("create").description("Scaffold CE UI apps or components");
538
+ create.command("app").argument("<name>", "App folder name").option("--force", "Overwrite existing files", false).action(async (name, options) => {
539
+ await scaffoldApp(name, { force: Boolean(options.force) });
540
+ });
541
+ 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) => {
542
+ await scaffoldComponent(name, {
543
+ dir: options.dir,
544
+ force: Boolean(options.force)
545
+ });
546
+ });
547
+ 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) => {
548
+ await runWorkflowTimeline({
549
+ input: options.input,
550
+ output: options.output,
551
+ format: options.format
552
+ });
553
+ });
554
+ 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) => {
555
+ await runRuntimeTimeline({
556
+ input: options.input,
557
+ output: options.output,
558
+ format: options.format
559
+ });
560
+ });
561
+ program.command("test").description("Run Node.js test runner with default patterns").option("-p, --pattern <patterns...>", "Test file patterns").action(async (options) => {
562
+ await runTests({ patterns: options.pattern });
563
+ });
564
+ void program.parseAsync(process.argv);
565
+ //# sourceMappingURL=index.cjs.map
566
+ //# sourceMappingURL=index.cjs.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":["pc","fg","chokidar","relative","resolve","readFile","createStyleScopeId","compileTemplate","scopeStyles","mkdir","dirname","writeFile","rm","join","GenMapping","basename","setSourceContent","addMapping","toEncodedMap","fs","buildRuntimeChromeTraceDocument","VALID_FORMATS","readTraceEvents","buildChromeTracePayload","buildEventsPayload","buildChromeTraceDocument","stat","readdir","spawn","Command"],"mappings":"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","file":"index.cjs","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"]}
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node