@dusted/anqst 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +45 -4
  2. package/dist/src/app.js +78 -24
  3. package/dist/src/base93.js +0 -72
  4. package/dist/src/boundary-codec-analysis.js +468 -0
  5. package/dist/src/boundary-codec-leaves.js +602 -0
  6. package/dist/src/boundary-codec-model.js +77 -0
  7. package/dist/src/boundary-codec-plan.js +522 -0
  8. package/dist/src/boundary-codec-render.js +1738 -0
  9. package/dist/src/boundary-codecs.js +174 -0
  10. package/dist/src/emit.js +1960 -207
  11. package/dist/src/layout.js +9 -3
  12. package/dist/src/program.js +1 -1
  13. package/dist/src/project.js +3 -3
  14. package/package.json +2 -2
  15. package/spec/AnQst-Spec-DSL.d.ts +22 -24
  16. package/dist/src/codecgenerators/basecodecemitters/bigint-qint64/decoder.js +0 -35
  17. package/dist/src/codecgenerators/basecodecemitters/bigint-qint64/encoder.js +0 -36
  18. package/dist/src/codecgenerators/basecodecemitters/bigint-quint64/decoder.js +0 -26
  19. package/dist/src/codecgenerators/basecodecemitters/bigint-quint64/encoder.js +0 -38
  20. package/dist/src/codecgenerators/basecodecemitters/binary-blob/decoder.js +0 -28
  21. package/dist/src/codecgenerators/basecodecemitters/binary-blob/encoder.js +0 -34
  22. package/dist/src/codecgenerators/basecodecemitters/binary-buffer/decoder.js +0 -29
  23. package/dist/src/codecgenerators/basecodecemitters/binary-buffer/encoder.js +0 -36
  24. package/dist/src/codecgenerators/basecodecemitters/binary-float32Array/decoder.js +0 -46
  25. package/dist/src/codecgenerators/basecodecemitters/binary-float32Array/encoder.js +0 -49
  26. package/dist/src/codecgenerators/basecodecemitters/binary-float64Array/decoder.js +0 -46
  27. package/dist/src/codecgenerators/basecodecemitters/binary-float64Array/encoder.js +0 -47
  28. package/dist/src/codecgenerators/basecodecemitters/binary-int16Array/decoder.js +0 -46
  29. package/dist/src/codecgenerators/basecodecemitters/binary-int16Array/encoder.js +0 -49
  30. package/dist/src/codecgenerators/basecodecemitters/binary-int32Array/decoder.js +0 -50
  31. package/dist/src/codecgenerators/basecodecemitters/binary-int32Array/encoder.js +0 -52
  32. package/dist/src/codecgenerators/basecodecemitters/binary-int8Array/decoder.js +0 -38
  33. package/dist/src/codecgenerators/basecodecemitters/binary-int8Array/encoder.js +0 -44
  34. package/dist/src/codecgenerators/basecodecemitters/binary-typedArray/decoder.js +0 -33
  35. package/dist/src/codecgenerators/basecodecemitters/binary-typedArray/encoder.js +0 -34
  36. package/dist/src/codecgenerators/basecodecemitters/binary-uint16Array/decoder.js +0 -46
  37. package/dist/src/codecgenerators/basecodecemitters/binary-uint16Array/encoder.js +0 -49
  38. package/dist/src/codecgenerators/basecodecemitters/binary-uint32Array/decoder.js +0 -46
  39. package/dist/src/codecgenerators/basecodecemitters/binary-uint32Array/encoder.js +0 -49
  40. package/dist/src/codecgenerators/basecodecemitters/binary-uint8Array/decoder.js +0 -28
  41. package/dist/src/codecgenerators/basecodecemitters/binary-uint8Array/encoder.js +0 -34
  42. package/dist/src/codecgenerators/basecodecemitters/boolean/decoder.js +0 -34
  43. package/dist/src/codecgenerators/basecodecemitters/boolean/encoder.js +0 -40
  44. package/dist/src/codecgenerators/basecodecemitters/dynamic-json/decoder.js +0 -43
  45. package/dist/src/codecgenerators/basecodecemitters/dynamic-json/encoder.js +0 -45
  46. package/dist/src/codecgenerators/basecodecemitters/dynamic-object/decoder.js +0 -44
  47. package/dist/src/codecgenerators/basecodecemitters/dynamic-object/encoder.js +0 -46
  48. package/dist/src/codecgenerators/basecodecemitters/integer-int16/decoder.js +0 -32
  49. package/dist/src/codecgenerators/basecodecemitters/integer-int16/encoder.js +0 -43
  50. package/dist/src/codecgenerators/basecodecemitters/integer-int32/decoder.js +0 -26
  51. package/dist/src/codecgenerators/basecodecemitters/integer-int32/encoder.js +0 -37
  52. package/dist/src/codecgenerators/basecodecemitters/integer-int8/decoder.js +0 -26
  53. package/dist/src/codecgenerators/basecodecemitters/integer-int8/encoder.js +0 -37
  54. package/dist/src/codecgenerators/basecodecemitters/integer-qint16/decoder.js +0 -36
  55. package/dist/src/codecgenerators/basecodecemitters/integer-qint16/encoder.js +0 -36
  56. package/dist/src/codecgenerators/basecodecemitters/integer-qint32/decoder.js +0 -25
  57. package/dist/src/codecgenerators/basecodecemitters/integer-qint32/encoder.js +0 -36
  58. package/dist/src/codecgenerators/basecodecemitters/integer-qint8/decoder.js +0 -36
  59. package/dist/src/codecgenerators/basecodecemitters/integer-qint8/encoder.js +0 -36
  60. package/dist/src/codecgenerators/basecodecemitters/integer-quint16/decoder.js +0 -26
  61. package/dist/src/codecgenerators/basecodecemitters/integer-quint16/encoder.js +0 -38
  62. package/dist/src/codecgenerators/basecodecemitters/integer-quint32/decoder.js +0 -27
  63. package/dist/src/codecgenerators/basecodecemitters/integer-quint32/encoder.js +0 -39
  64. package/dist/src/codecgenerators/basecodecemitters/integer-quint8/decoder.js +0 -26
  65. package/dist/src/codecgenerators/basecodecemitters/integer-quint8/encoder.js +0 -38
  66. package/dist/src/codecgenerators/basecodecemitters/integer-uint16/decoder.js +0 -30
  67. package/dist/src/codecgenerators/basecodecemitters/integer-uint16/encoder.js +0 -42
  68. package/dist/src/codecgenerators/basecodecemitters/integer-uint32/decoder.js +0 -31
  69. package/dist/src/codecgenerators/basecodecemitters/integer-uint32/encoder.js +0 -43
  70. package/dist/src/codecgenerators/basecodecemitters/integer-uint8/decoder.js +0 -30
  71. package/dist/src/codecgenerators/basecodecemitters/integer-uint8/encoder.js +0 -40
  72. package/dist/src/codecgenerators/basecodecemitters/number/decoder.js +0 -26
  73. package/dist/src/codecgenerators/basecodecemitters/number/encoder.js +0 -38
  74. package/dist/src/codecgenerators/basecodecemitters/shared/comments.js +0 -13
  75. package/dist/src/codecgenerators/basecodecemitters/shared/contracts.js +0 -2
  76. package/dist/src/codecgenerators/basecodecemitters/shared/fixedwidth.js +0 -53
  77. package/dist/src/codecgenerators/basecodecemitters/shared/index.js +0 -21
  78. package/dist/src/codecgenerators/basecodecemitters/shared/positionalBase93.js +0 -48
  79. package/dist/src/codecgenerators/basecodecemitters/shared/rawbytes.js +0 -30
  80. package/dist/src/codecgenerators/basecodecemitters/string/decoder.js +0 -43
  81. package/dist/src/codecgenerators/basecodecemitters/string/encoder.js +0 -43
  82. package/dist/src/codecgenerators/basecodecemitters/stringArray/decoder.js +0 -80
  83. package/dist/src/codecgenerators/basecodecemitters/stringArray/encoder.js +0 -57
  84. package/dist/src/structured-top-level-codecs.js +0 -1305
package/README.md CHANGED
@@ -43,7 +43,7 @@ Settings file (`./AnQst/<WidgetName>.settings.json`) owns project-local AnQst co
43
43
  "layoutVersion": 2,
44
44
  "widgetName": "<WidgetName>",
45
45
  "spec": "./AnQst/<WidgetName>.AnQst.d.ts",
46
- "generate": ["QWidget", "AngularService", "node_express_ws"],
46
+ "generate": ["QWidget", "AngularService", "VanillaTS", "VanillaJS", "node_express_ws"],
47
47
  "widgetCategory": "AnQst Widgets"
48
48
  }
49
49
  ```
@@ -63,6 +63,16 @@ Settings file (`./AnQst/<WidgetName>.settings.json`) owns project-local AnQst co
63
63
  - Updates `tsconfig.json` (when present):
64
64
  - `compilerOptions.paths["anqst-generated/*"] = ["AnQst/generated/frontend/<WidgetName>_Angular/*"]`
65
65
 
66
+ Available generate targets:
67
+
68
+ - Browser frontend targets:
69
+ - `AngularService`
70
+ - `VanillaTS`
71
+ - `VanillaJS`
72
+ - Backend targets:
73
+ - `QWidget`
74
+ - `node_express_ws`
75
+
66
76
  - `anqst test`
67
77
  - Loads settings from `package.json.AnQst`.
68
78
  - Verifies the configured spec.
@@ -72,9 +82,11 @@ Settings file (`./AnQst/<WidgetName>.settings.json`) owns project-local AnQst co
72
82
  - Verifies spec and regenerates selected targets.
73
83
  - Writes only under `./AnQst/generated`.
74
84
  - Removes selected target roots before regeneration (no stale generated files).
75
- - If `QWidget` is enabled and `angular.json` exists:
76
- - runs production Angular build
85
+ - If `QWidget` is enabled and a browser build output is present under project `dist/`:
77
86
  - embeds built web assets into generated Qt widget `webapp/`.
87
+ - If `QWidget` is enabled and `angular.json` exists:
88
+ - `anqst build` may invoke a production Angular build before embedding.
89
+ - Browser bundle discovery is frontend-profile-neutral: Angular and Vanilla browser outputs are both expected to produce a dist tree containing `index.html`.
78
90
  - Generated Qt integration CMake consumes the existing `./AnQst/generated` widget tree and fails fast if the required generated files are missing.
79
91
  - Downstream CMake no longer invokes `npm`, `npx`, or `anqst`; run `anqst build` first, then build C++ against the generated tree.
80
92
  - If `--designerplugin` is enabled:
@@ -106,6 +118,8 @@ Settings file (`./AnQst/<WidgetName>.settings.json`) owns project-local AnQst co
106
118
  generated/
107
119
  frontend/
108
120
  <WidgetName>_Angular/
121
+ <WidgetName>_VanillaTS/
122
+ <WidgetName>_VanillaJS/
109
123
  backend/
110
124
  node/
111
125
  express/
@@ -143,10 +157,37 @@ npx @dusted/anqst test
143
157
  npx @dusted/anqst build
144
158
  ```
145
159
 
160
+ ## Vanilla browser usage
161
+
162
+ Minimal browser-global usage for `VanillaJS`:
163
+
164
+ ```html
165
+ <script src="./AnQst/generated/frontend/BurgerConstructor_VanillaJS/index.js"></script>
166
+ <script>
167
+ (async () => {
168
+ const frontend = await window.AnQstGenerated.widgets.BurgerConstructor.createFrontend();
169
+ const ok = await frontend.services.BurgerService.validateDraft({ name: "Classic" });
170
+ console.log(ok);
171
+ })();
172
+ </script>
173
+ ```
174
+
175
+ TypeScript authors use the same runtime shape with typings from `VanillaTS`:
176
+
177
+ ```ts
178
+ /// <reference path="./AnQst/generated/frontend/BurgerConstructor_VanillaTS/index.d.ts" />
179
+
180
+ async function boot() {
181
+ const frontend = await window.AnQstGenerated.widgets.BurgerConstructor.createFrontend();
182
+ const ok = await frontend.services.BurgerService.validateDraft({ name: "Classic" });
183
+ console.log(frontend.diagnostics.state(), ok);
184
+ }
185
+ ```
186
+
146
187
  ## Two-stage workflow
147
188
 
148
189
  ```bash
149
- # Stage 1: Node/Angular/generation environment
190
+ # Stage 1: browser/backend/generation environment
150
191
  npx @dusted/anqst build
151
192
 
152
193
  # Stage 2: pure Qt/CMake environment, consuming the generated tree
package/dist/src/app.js CHANGED
@@ -19,6 +19,12 @@ const project_1 = require("./project");
19
19
  const layout_1 = require("./layout");
20
20
  const parser_1 = require("./parser");
21
21
  const verify_1 = require("./verify");
22
+ class CliUsageError extends Error {
23
+ constructor(message) {
24
+ super(message);
25
+ this.name = "CliUsageError";
26
+ }
27
+ }
22
28
  const ANQSTGEN_ACTIVE_STAMP_FILE = ".anqstgen-version-active.json";
23
29
  function renderHelp() {
24
30
  const version = readActiveBuildStamp();
@@ -59,7 +65,13 @@ function resetGeneratedTargets(cwd, widgetName, targets) {
59
65
  const layout = (0, layout_1.resolveGeneratedLayoutPaths)(cwd, widgetName);
60
66
  const roots = new Set();
61
67
  if (targets.emitAngularService) {
62
- roots.add(layout.frontendRoot);
68
+ roots.add(layout.angularFrontendRoot);
69
+ }
70
+ if (targets.emitVanillaTS) {
71
+ roots.add(layout.vanillaTsFrontendRoot);
72
+ }
73
+ if (targets.emitVanillaJS) {
74
+ roots.add(layout.vanillaJsFrontendRoot);
63
75
  }
64
76
  if (targets.emitNodeExpressWs) {
65
77
  roots.add(layout.nodeExpressRoot);
@@ -78,15 +90,19 @@ function resetGeneratedTargets(cwd, widgetName, targets) {
78
90
  function buildGenerateSummary(cwd, specPath, widgetName, generationTargets) {
79
91
  const layout = (0, layout_1.resolveGeneratedLayoutPaths)(cwd, widgetName);
80
92
  const relativeSpecFile = (0, layout_1.normalizeSlashes)(node_path_1.default.relative(cwd, specPath));
81
- const servicePath = (0, layout_1.toProjectRelative)(cwd, node_path_1.default.join(layout.frontendRoot, "services"));
82
- const typePath = (0, layout_1.toProjectRelative)(cwd, node_path_1.default.join(layout.frontendRoot, "types"));
83
93
  const widgetRootPath = (0, layout_1.toProjectRelative)(cwd, layout.cppQtWidgetRoot);
84
94
  const nodePath = (0, layout_1.toProjectRelative)(cwd, layout.nodeExpressRoot);
85
95
  const messageLines = [];
86
96
  messageLines.push(`AnQst spec ${relativeSpecFile} built.`);
87
97
  if (generationTargets.emitAngularService) {
88
- messageLines.push(` Services are available from ${servicePath}.`);
89
- messageLines.push(` Generated types are available from ${typePath}.`);
98
+ messageLines.push(` Angular services are available from ${(0, layout_1.toProjectRelative)(cwd, node_path_1.default.join(layout.angularFrontendRoot, "services"))}.`);
99
+ messageLines.push(` Angular generated types are available from ${(0, layout_1.toProjectRelative)(cwd, node_path_1.default.join(layout.angularFrontendRoot, "types"))}.`);
100
+ }
101
+ if (generationTargets.emitVanillaTS) {
102
+ messageLines.push(` VanillaTS browser bundle is available from ${(0, layout_1.toProjectRelative)(cwd, layout.vanillaTsFrontendRoot)}.`);
103
+ }
104
+ if (generationTargets.emitVanillaJS) {
105
+ messageLines.push(` VanillaJS browser bundle is available from ${(0, layout_1.toProjectRelative)(cwd, layout.vanillaJsFrontendRoot)}.`);
90
106
  }
91
107
  if (generationTargets.emitQWidget) {
92
108
  messageLines.push(` Widget library available in ${widgetRootPath}.`);
@@ -94,7 +110,11 @@ function buildGenerateSummary(cwd, specPath, widgetName, generationTargets) {
94
110
  if (generationTargets.emitNodeExpressWs) {
95
111
  messageLines.push(` Node Express WS module available in ${nodePath}.`);
96
112
  }
97
- if (!generationTargets.emitAngularService && !generationTargets.emitQWidget && !generationTargets.emitNodeExpressWs) {
113
+ if (!generationTargets.emitAngularService
114
+ && !generationTargets.emitVanillaTS
115
+ && !generationTargets.emitVanillaJS
116
+ && !generationTargets.emitQWidget
117
+ && !generationTargets.emitNodeExpressWs) {
98
118
  messageLines.push(" No outputs selected by AnQst.generate.");
99
119
  }
100
120
  return `\n${messageLines.join("\n")}\n`;
@@ -211,8 +231,8 @@ function runBuild(cwd, designerPlugin = false) {
211
231
  if (generationTargets.emitQWidget) {
212
232
  (0, emit_1.installQtIntegrationCMake)(cwd, parsed.widgetName);
213
233
  }
214
- const hasAngularProject = generationTargets.emitQWidget && node_fs_1.default.existsSync(node_path_1.default.join(cwd, "angular.json"));
215
- if (hasAngularProject) {
234
+ const shouldRunAngularBuild = generationTargets.emitQWidget && node_fs_1.default.existsSync(node_path_1.default.join(cwd, "angular.json"));
235
+ if (shouldRunAngularBuild) {
216
236
  const angularBuild = (0, node_child_process_1.spawnSync)("npx", ["ng", "build", "--configuration", "production"], {
217
237
  cwd,
218
238
  stdio: "inherit",
@@ -224,8 +244,8 @@ function runBuild(cwd, designerPlugin = false) {
224
244
  }
225
245
  if (generationTargets.emitQWidget) {
226
246
  const embedded = (0, emit_1.installEmbeddedWebBundle)(cwd, parsed.widgetName);
227
- if (hasAngularProject && !embedded) {
228
- throw new errors_1.VerifyError("Unable to embed Angular output. Ensure ng build produced a dist bundle with index.html.");
247
+ if (shouldRunAngularBuild && !embedded) {
248
+ throw new errors_1.VerifyError("Unable to embed browser output. Ensure the browser build produced a dist bundle with index.html.");
229
249
  }
230
250
  }
231
251
  let designerPluginBuilt = false;
@@ -240,7 +260,11 @@ function runBuild(cwd, designerPlugin = false) {
240
260
  designerPluginBuilt = true;
241
261
  }
242
262
  }
243
- if (!generationTargets.emitAngularService && !generationTargets.emitQWidget && !generationTargets.emitNodeExpressWs) {
263
+ if (!generationTargets.emitAngularService
264
+ && !generationTargets.emitVanillaTS
265
+ && !generationTargets.emitVanillaJS
266
+ && !generationTargets.emitQWidget
267
+ && !generationTargets.emitNodeExpressWs) {
244
268
  return {
245
269
  success: true,
246
270
  message: [
@@ -254,15 +278,25 @@ function runBuild(cwd, designerPlugin = false) {
254
278
  const detailLines = [];
255
279
  if (generationTargets.emitAngularService) {
256
280
  detailLines.push(" Target AngularService:");
257
- detailLines.push(` - Services output: ${(0, layout_1.toProjectRelative)(cwd, node_path_1.default.join(layout.frontendRoot, "services"))}`);
258
- detailLines.push(` - Types output: ${(0, layout_1.toProjectRelative)(cwd, node_path_1.default.join(layout.frontendRoot, "types"))}`);
281
+ detailLines.push(` - Services output: ${(0, layout_1.toProjectRelative)(cwd, node_path_1.default.join(layout.angularFrontendRoot, "services"))}`);
282
+ detailLines.push(` - Types output: ${(0, layout_1.toProjectRelative)(cwd, node_path_1.default.join(layout.angularFrontendRoot, "types"))}`);
283
+ }
284
+ if (generationTargets.emitVanillaTS) {
285
+ detailLines.push(" Target VanillaTS:");
286
+ detailLines.push(` - Browser bundle root: ${(0, layout_1.toProjectRelative)(cwd, layout.vanillaTsFrontendRoot)}`);
287
+ detailLines.push(` - Browser global: window.AnQstGenerated.widgets.${parsed.widgetName}`);
288
+ }
289
+ if (generationTargets.emitVanillaJS) {
290
+ detailLines.push(" Target VanillaJS:");
291
+ detailLines.push(` - Browser bundle root: ${(0, layout_1.toProjectRelative)(cwd, layout.vanillaJsFrontendRoot)}`);
292
+ detailLines.push(` - Browser global: window.AnQstGenerated.widgets.${parsed.widgetName}`);
259
293
  }
260
294
  if (generationTargets.emitQWidget) {
261
295
  detailLines.push(" Target QWidget:");
262
296
  detailLines.push(` - Qt integration CMake: ${(0, layout_1.toProjectRelative)(cwd, node_path_1.default.join(layout.cppCmakeRoot, "CMakeLists.txt"))}`);
263
297
  detailLines.push(` - Widget output root: ${(0, layout_1.toProjectRelative)(cwd, layout.cppQtWidgetRoot)}`);
264
298
  detailLines.push(" - C++ handoff: downstream CMake consumes this generated tree directly");
265
- detailLines.push(" - Embedded web assets refreshed from Angular build");
299
+ detailLines.push(" - Embedded web assets refreshed from detected browser dist output");
266
300
  }
267
301
  if (generationTargets.emitNodeExpressWs) {
268
302
  detailLines.push(" Target node_express_ws:");
@@ -296,12 +330,12 @@ function parseSpecCommandArg(commandName, specArg, extraArgs) {
296
330
  const positional = [];
297
331
  for (const arg of allArgs) {
298
332
  if (arg.startsWith("-")) {
299
- throw new Error(`Unknown ${commandName} flag '${arg}'. ${usageFor(commandName)}`);
333
+ throw new CliUsageError(`Unknown ${commandName} flag '${arg}'. ${usageFor(commandName)}`);
300
334
  }
301
335
  positional.push(arg);
302
336
  }
303
337
  if (positional.length !== 1) {
304
- throw new Error(usageFor(commandName));
338
+ throw new CliUsageError(usageFor(commandName));
305
339
  }
306
340
  return positional[0];
307
341
  }
@@ -328,12 +362,12 @@ function parseBuildCommandArgs(specArg, extraArgs) {
328
362
  continue;
329
363
  }
330
364
  if (arg.startsWith("-")) {
331
- throw new Error(`Unknown build flag '${arg}'. ${usageFor("build")}`);
365
+ throw new CliUsageError(`Unknown build flag '${arg}'. ${usageFor("build")}`);
332
366
  }
333
367
  positional.push(arg);
334
368
  }
335
369
  if (positional.length > 0) {
336
- throw new Error(`Unexpected extra argument '${positional[0]}'. ${usageFor("build")}`);
370
+ throw new CliUsageError(`Unexpected extra argument '${positional[0]}'. ${usageFor("build")}`);
337
371
  }
338
372
  return { designerPlugin };
339
373
  }
@@ -347,15 +381,15 @@ function parseCleanCommandArgs(specArg, extraArgs) {
347
381
  continue;
348
382
  }
349
383
  if (arg.startsWith("-")) {
350
- throw new Error(`Unknown clean flag '${arg}'. Use -f or --force.`);
384
+ throw new CliUsageError(`Unknown clean flag '${arg}'. Use -f or --force.`);
351
385
  }
352
386
  if (targetPathArg !== null) {
353
- throw new Error(`Unexpected extra argument '${arg}'. Usage: anqst clean <path> [-f|--force]`);
387
+ throw new CliUsageError(`Unexpected extra argument '${arg}'. Usage: anqst clean <path> [-f|--force]`);
354
388
  }
355
389
  targetPathArg = arg;
356
390
  }
357
391
  if (targetPathArg === null) {
358
- throw new Error("Usage: anqst clean <path> [-f|--force]");
392
+ throw new CliUsageError("Usage: anqst clean <path> [-f|--force]");
359
393
  }
360
394
  return { targetPathArg, force };
361
395
  }
@@ -430,6 +464,8 @@ function toGenerationTargets(targets) {
430
464
  return {
431
465
  emitQWidget: targets.includes("QWidget"),
432
466
  emitAngularService: targets.includes("AngularService"),
467
+ emitVanillaTS: targets.includes("VanillaTS"),
468
+ emitVanillaJS: targets.includes("VanillaJS"),
433
469
  emitNodeExpressWs: targets.includes("node_express_ws")
434
470
  };
435
471
  }
@@ -446,7 +482,9 @@ function runClean(pathArg, force) {
446
482
  const context = (0, project_1.resolveAnQstSettings)(targetRoot);
447
483
  const layout = (0, layout_1.resolveGeneratedLayoutPaths)(targetRoot, context.settings.widgetName);
448
484
  const widgetDirs = [
449
- (0, layout_1.normalizeSlashes)(node_path_1.default.relative(targetRoot, layout.frontendRoot)),
485
+ (0, layout_1.normalizeSlashes)(node_path_1.default.relative(targetRoot, layout.angularFrontendRoot)),
486
+ (0, layout_1.normalizeSlashes)(node_path_1.default.relative(targetRoot, layout.vanillaTsFrontendRoot)),
487
+ (0, layout_1.normalizeSlashes)(node_path_1.default.relative(targetRoot, layout.vanillaJsFrontendRoot)),
450
488
  (0, layout_1.normalizeSlashes)(node_path_1.default.relative(targetRoot, layout.nodeExpressRoot)),
451
489
  (0, layout_1.normalizeSlashes)(node_path_1.default.relative(targetRoot, layout.cppQtWidgetRoot)),
452
490
  (0, layout_1.normalizeSlashes)(node_path_1.default.relative(targetRoot, layout.cppCmakeRoot)),
@@ -476,6 +514,19 @@ function renderInstallAliasMessage() {
476
514
  return text;
477
515
  return `\x1b[38;5;214m${text}\x1b[0m`;
478
516
  }
517
+ function formatUnexpectedError(error) {
518
+ if (!(error instanceof Error)) {
519
+ return `[AnQst] ${String(error)}`;
520
+ }
521
+ const lines = [`[AnQst] ${error.message}`];
522
+ const stack = typeof error.stack === "string" ? error.stack.trim() : "";
523
+ if (stack.length > 0) {
524
+ lines.push("");
525
+ lines.push("Stack trace:");
526
+ lines.push(stack);
527
+ }
528
+ return lines.join("\n");
529
+ }
479
530
  function runCommand(command, specArg, extraArgs = []) {
480
531
  try {
481
532
  if (!command) {
@@ -545,8 +596,11 @@ function runCommand(command, specArg, extraArgs = []) {
545
596
  console.error((0, errors_1.formatVerifyError)(error));
546
597
  return 1;
547
598
  }
548
- const message = error instanceof Error ? error.message : String(error);
549
- console.error(`[AnQst] ${message}`);
599
+ if (error instanceof CliUsageError) {
600
+ console.error(error.message);
601
+ return 1;
602
+ }
603
+ console.error(formatUnexpectedError(error));
550
604
  return 1;
551
605
  }
552
606
  }
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BASE93_ALPHABET = void 0;
4
4
  exports.emitBase93Encoder = emitBase93Encoder;
5
5
  exports.emitBase93Decoder = emitBase93Decoder;
6
- exports.emitBase93CppFunctions = emitBase93CppFunctions;
7
6
  exports.BASE93_ALPHABET = Array.from({ length: 95 }, (_, i) => String.fromCharCode(0x20 + i))
8
7
  .filter(c => c !== '"' && c !== '\\')
9
8
  .join('');
@@ -51,74 +50,3 @@ for (i = r - 2; i >= 0; i--) { o[p + i] = v & 255; v = (v / 256) | 0; }
51
50
  return o;
52
51
  }`;
53
52
  }
54
- function emitBase93CppFunctions() {
55
- return `inline int base93AlphabetIndex(char c) {
56
- const unsigned char uc = static_cast<unsigned char>(c);
57
- return static_cast<int>(uc) - 32 - (uc > 34) - (uc > 92);
58
- }
59
-
60
- inline std::string base93Encode(const std::vector<std::uint8_t>& d) {
61
- static constexpr char A[] = "${exports.BASE93_ALPHABET}";
62
- const std::size_t n = d.size();
63
- const std::size_t f = n >> 2;
64
- const std::size_t r = n & 3;
65
- std::string o(f * 5 + (r ? r + 1 : 0), '\\0');
66
- std::size_t p = 0;
67
- for (std::size_t i = 0; i < f; ++i) {
68
- const std::size_t b = i << 2;
69
- std::uint32_t v =
70
- (static_cast<std::uint32_t>(d[b]) << 24) |
71
- (static_cast<std::uint32_t>(d[b + 1]) << 16) |
72
- (static_cast<std::uint32_t>(d[b + 2]) << 8) |
73
- static_cast<std::uint32_t>(d[b + 3]);
74
- o[p + 4] = A[v % 93u]; v /= 93u;
75
- o[p + 3] = A[v % 93u]; v /= 93u;
76
- o[p + 2] = A[v % 93u]; v /= 93u;
77
- o[p + 1] = A[v % 93u];
78
- o[p] = A[v / 93u];
79
- p += 5;
80
- }
81
- if (r) {
82
- const std::size_t b = f << 2;
83
- std::uint32_t v = 0;
84
- for (std::size_t j = 0; j < r; ++j) v = (v << 8) | d[b + j];
85
- for (std::size_t j = r + 1; j-- > 0;) {
86
- o[p + j] = A[v % 93u];
87
- v /= 93u;
88
- }
89
- }
90
- return o;
91
- }
92
-
93
- inline std::vector<std::uint8_t> base93Decode(const std::string& s) {
94
- const std::size_t n = s.size();
95
- const std::size_t f = n / 5;
96
- const std::size_t r = n - f * 5;
97
- std::vector<std::uint8_t> o(f * 4 + (r ? r - 1 : 0));
98
- std::size_t p = 0;
99
- for (std::size_t i = 0; i < f; ++i) {
100
- const std::size_t b = i * 5;
101
- std::uint32_t v = static_cast<std::uint32_t>(base93AlphabetIndex(s[b]));
102
- v = v * 93u + static_cast<std::uint32_t>(base93AlphabetIndex(s[b + 1]));
103
- v = v * 93u + static_cast<std::uint32_t>(base93AlphabetIndex(s[b + 2]));
104
- v = v * 93u + static_cast<std::uint32_t>(base93AlphabetIndex(s[b + 3]));
105
- v = v * 93u + static_cast<std::uint32_t>(base93AlphabetIndex(s[b + 4]));
106
- o[p] = static_cast<std::uint8_t>(v >> 24);
107
- o[p + 1] = static_cast<std::uint8_t>((v >> 16) & 255u);
108
- o[p + 2] = static_cast<std::uint8_t>((v >> 8) & 255u);
109
- o[p + 3] = static_cast<std::uint8_t>(v & 255u);
110
- p += 4;
111
- }
112
- if (r) {
113
- std::uint32_t v = 0;
114
- for (std::size_t i = 0; i < r; ++i) {
115
- v = v * 93u + static_cast<std::uint32_t>(base93AlphabetIndex(s[f * 5 + i]));
116
- }
117
- for (std::size_t i = r - 1; i-- > 0;) {
118
- o[p + i] = static_cast<std::uint8_t>(v & 255u);
119
- v /= 256u;
120
- }
121
- }
122
- return o;
123
- }`;
124
- }