@dusted/anqst 1.0.0 → 1.5.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 (76) hide show
  1. package/README.md +15 -0
  2. package/dist/src/app.js +103 -77
  3. package/dist/src/base93.js +124 -0
  4. package/dist/src/build-stamp.js +1 -1
  5. package/dist/src/codecgenerators/basecodecemitters/bigint-qint64/decoder.js +35 -0
  6. package/dist/src/codecgenerators/basecodecemitters/bigint-qint64/encoder.js +36 -0
  7. package/dist/src/codecgenerators/basecodecemitters/bigint-quint64/decoder.js +26 -0
  8. package/dist/src/codecgenerators/basecodecemitters/bigint-quint64/encoder.js +38 -0
  9. package/dist/src/codecgenerators/basecodecemitters/binary-blob/decoder.js +28 -0
  10. package/dist/src/codecgenerators/basecodecemitters/binary-blob/encoder.js +34 -0
  11. package/dist/src/codecgenerators/basecodecemitters/binary-buffer/decoder.js +29 -0
  12. package/dist/src/codecgenerators/basecodecemitters/binary-buffer/encoder.js +36 -0
  13. package/dist/src/codecgenerators/basecodecemitters/binary-float32Array/decoder.js +46 -0
  14. package/dist/src/codecgenerators/basecodecemitters/binary-float32Array/encoder.js +49 -0
  15. package/dist/src/codecgenerators/basecodecemitters/binary-float64Array/decoder.js +46 -0
  16. package/dist/src/codecgenerators/basecodecemitters/binary-float64Array/encoder.js +47 -0
  17. package/dist/src/codecgenerators/basecodecemitters/binary-int16Array/decoder.js +46 -0
  18. package/dist/src/codecgenerators/basecodecemitters/binary-int16Array/encoder.js +49 -0
  19. package/dist/src/codecgenerators/basecodecemitters/binary-int32Array/decoder.js +50 -0
  20. package/dist/src/codecgenerators/basecodecemitters/binary-int32Array/encoder.js +52 -0
  21. package/dist/src/codecgenerators/basecodecemitters/binary-int8Array/decoder.js +38 -0
  22. package/dist/src/codecgenerators/basecodecemitters/binary-int8Array/encoder.js +44 -0
  23. package/dist/src/codecgenerators/basecodecemitters/binary-typedArray/decoder.js +33 -0
  24. package/dist/src/codecgenerators/basecodecemitters/binary-typedArray/encoder.js +34 -0
  25. package/dist/src/codecgenerators/basecodecemitters/binary-uint16Array/decoder.js +46 -0
  26. package/dist/src/codecgenerators/basecodecemitters/binary-uint16Array/encoder.js +49 -0
  27. package/dist/src/codecgenerators/basecodecemitters/binary-uint32Array/decoder.js +46 -0
  28. package/dist/src/codecgenerators/basecodecemitters/binary-uint32Array/encoder.js +49 -0
  29. package/dist/src/codecgenerators/basecodecemitters/binary-uint8Array/decoder.js +28 -0
  30. package/dist/src/codecgenerators/basecodecemitters/binary-uint8Array/encoder.js +34 -0
  31. package/dist/src/codecgenerators/basecodecemitters/boolean/decoder.js +34 -0
  32. package/dist/src/codecgenerators/basecodecemitters/boolean/encoder.js +40 -0
  33. package/dist/src/codecgenerators/basecodecemitters/dynamic-json/decoder.js +43 -0
  34. package/dist/src/codecgenerators/basecodecemitters/dynamic-json/encoder.js +45 -0
  35. package/dist/src/codecgenerators/basecodecemitters/dynamic-object/decoder.js +44 -0
  36. package/dist/src/codecgenerators/basecodecemitters/dynamic-object/encoder.js +46 -0
  37. package/dist/src/codecgenerators/basecodecemitters/integer-int16/decoder.js +32 -0
  38. package/dist/src/codecgenerators/basecodecemitters/integer-int16/encoder.js +43 -0
  39. package/dist/src/codecgenerators/basecodecemitters/integer-int32/decoder.js +26 -0
  40. package/dist/src/codecgenerators/basecodecemitters/integer-int32/encoder.js +37 -0
  41. package/dist/src/codecgenerators/basecodecemitters/integer-int8/decoder.js +26 -0
  42. package/dist/src/codecgenerators/basecodecemitters/integer-int8/encoder.js +37 -0
  43. package/dist/src/codecgenerators/basecodecemitters/integer-qint16/decoder.js +36 -0
  44. package/dist/src/codecgenerators/basecodecemitters/integer-qint16/encoder.js +36 -0
  45. package/dist/src/codecgenerators/basecodecemitters/integer-qint32/decoder.js +25 -0
  46. package/dist/src/codecgenerators/basecodecemitters/integer-qint32/encoder.js +36 -0
  47. package/dist/src/codecgenerators/basecodecemitters/integer-qint8/decoder.js +36 -0
  48. package/dist/src/codecgenerators/basecodecemitters/integer-qint8/encoder.js +36 -0
  49. package/dist/src/codecgenerators/basecodecemitters/integer-quint16/decoder.js +26 -0
  50. package/dist/src/codecgenerators/basecodecemitters/integer-quint16/encoder.js +38 -0
  51. package/dist/src/codecgenerators/basecodecemitters/integer-quint32/decoder.js +27 -0
  52. package/dist/src/codecgenerators/basecodecemitters/integer-quint32/encoder.js +39 -0
  53. package/dist/src/codecgenerators/basecodecemitters/integer-quint8/decoder.js +26 -0
  54. package/dist/src/codecgenerators/basecodecemitters/integer-quint8/encoder.js +38 -0
  55. package/dist/src/codecgenerators/basecodecemitters/integer-uint16/decoder.js +30 -0
  56. package/dist/src/codecgenerators/basecodecemitters/integer-uint16/encoder.js +42 -0
  57. package/dist/src/codecgenerators/basecodecemitters/integer-uint32/decoder.js +31 -0
  58. package/dist/src/codecgenerators/basecodecemitters/integer-uint32/encoder.js +43 -0
  59. package/dist/src/codecgenerators/basecodecemitters/integer-uint8/decoder.js +30 -0
  60. package/dist/src/codecgenerators/basecodecemitters/integer-uint8/encoder.js +40 -0
  61. package/dist/src/codecgenerators/basecodecemitters/number/decoder.js +26 -0
  62. package/dist/src/codecgenerators/basecodecemitters/number/encoder.js +38 -0
  63. package/dist/src/codecgenerators/basecodecemitters/shared/comments.js +13 -0
  64. package/dist/src/codecgenerators/basecodecemitters/shared/contracts.js +2 -0
  65. package/dist/src/codecgenerators/basecodecemitters/shared/fixedwidth.js +53 -0
  66. package/dist/src/codecgenerators/basecodecemitters/shared/index.js +21 -0
  67. package/dist/src/codecgenerators/basecodecemitters/shared/positionalBase93.js +48 -0
  68. package/dist/src/codecgenerators/basecodecemitters/shared/rawbytes.js +30 -0
  69. package/dist/src/codecgenerators/basecodecemitters/string/decoder.js +43 -0
  70. package/dist/src/codecgenerators/basecodecemitters/string/encoder.js +43 -0
  71. package/dist/src/codecgenerators/basecodecemitters/stringArray/decoder.js +80 -0
  72. package/dist/src/codecgenerators/basecodecemitters/stringArray/encoder.js +57 -0
  73. package/dist/src/emit.js +760 -120
  74. package/dist/src/structured-top-level-codecs.js +1305 -0
  75. package/package.json +2 -3
  76. package/spec/AnQst-Spec-DSL.d.ts +15 -8
package/README.md CHANGED
@@ -75,6 +75,8 @@ Settings file (`./AnQst/<WidgetName>.settings.json`) owns project-local AnQst co
75
75
  - If `QWidget` is enabled and `angular.json` exists:
76
76
  - runs production Angular build
77
77
  - embeds built web assets into generated Qt widget `webapp/`.
78
+ - Generated Qt integration CMake consumes the existing `./AnQst/generated` widget tree and fails fast if the required generated files are missing.
79
+ - Downstream CMake no longer invokes `npm`, `npx`, or `anqst`; run `anqst build` first, then build C++ against the generated tree.
78
80
  - If `--designerplugin` is enabled:
79
81
  - requires `ANQST_WEBBASE_DIR`
80
82
  - emits plugin sources in `./AnQst/generated/backend/cpp/qt/<WidgetName>_widget/designerPlugin`
@@ -140,3 +142,16 @@ code AnQst/BurgerConstructor.AnQst.d.ts
140
142
  npx @dusted/anqst test
141
143
  npx @dusted/anqst build
142
144
  ```
145
+
146
+ ## Two-stage workflow
147
+
148
+ ```bash
149
+ # Stage 1: Node/Angular/generation environment
150
+ npx @dusted/anqst build
151
+
152
+ # Stage 2: pure Qt/CMake environment, consuming the generated tree
153
+ cmake -S . -B build
154
+ cmake --build build
155
+ ```
156
+
157
+ Both stages must use the exact outputs from the same prior `anqst build` invocation.
package/dist/src/app.js CHANGED
@@ -19,7 +19,7 @@ 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
- const build_stamp_1 = require("./build-stamp");
22
+ const ANQSTGEN_ACTIVE_STAMP_FILE = ".anqstgen-version-active.json";
23
23
  function renderHelp() {
24
24
  const version = readActiveBuildStamp();
25
25
  return [
@@ -135,8 +135,27 @@ function runTest(cwd) {
135
135
  message: verification.message
136
136
  };
137
137
  }
138
+ function resolveAnQstGenRoot() {
139
+ return node_path_1.default.resolve(__dirname, "..", "..");
140
+ }
138
141
  function readActiveBuildStamp() {
139
- return build_stamp_1.ANQST_BUILD_STAMP;
142
+ if (process.env.ANQST_BUILD_STAMP && process.env.ANQST_BUILD_STAMP.trim().length > 0) {
143
+ return process.env.ANQST_BUILD_STAMP.trim();
144
+ }
145
+ const activePath = node_path_1.default.join(resolveAnQstGenRoot(), ANQSTGEN_ACTIVE_STAMP_FILE);
146
+ if (!node_fs_1.default.existsSync(activePath)) {
147
+ return "unknown_build_0";
148
+ }
149
+ try {
150
+ const parsed = JSON.parse(node_fs_1.default.readFileSync(activePath, "utf8"));
151
+ if (typeof parsed.active === "string" && parsed.active.trim().length > 0) {
152
+ return parsed.active.trim();
153
+ }
154
+ }
155
+ catch {
156
+ // Fallback to deterministic unknown stamp.
157
+ }
158
+ return "unknown_build_0";
140
159
  }
141
160
  function runDesignerPluginBuild(cwd, widgetName) {
142
161
  const layout = (0, layout_1.resolveGeneratedLayoutPaths)(cwd, widgetName);
@@ -176,94 +195,101 @@ function runDesignerPluginBuild(cwd, widgetName) {
176
195
  }
177
196
  function runBuild(cwd, designerPlugin = false) {
178
197
  const buildVersion = readActiveBuildStamp();
179
- const specPath = (0, project_1.resolveAnQstSpecPath)(cwd);
180
- const configuredWidgetName = (0, project_1.resolveAnQstWidgetName)(cwd);
181
- const generationTargets = resolveGenerationTargetsFromCwd(cwd, true);
182
- const parsed = (0, parser_1.parseSpecFile)(specPath);
183
- (0, verify_1.verifySpec)(parsed);
184
- if (parsed.widgetName !== configuredWidgetName) {
185
- throw new errors_1.VerifyError(`Settings widgetName '${configuredWidgetName}' does not match spec namespace '${parsed.widgetName}'.`);
186
- }
187
- resetGeneratedTargets(cwd, parsed.widgetName, generationTargets);
188
- const outputs = (0, emit_1.generateOutputs)(parsed, generationTargets);
189
- (0, emit_1.writeGeneratedOutputs)(cwd, outputs);
190
- if (generationTargets.emitQWidget) {
191
- (0, emit_1.installQtIntegrationCMake)(cwd, parsed.widgetName);
192
- }
193
- const hasAngularProject = generationTargets.emitQWidget && node_fs_1.default.existsSync(node_path_1.default.join(cwd, "angular.json"));
194
- if (hasAngularProject) {
195
- const angularBuild = (0, node_child_process_1.spawnSync)("npx", ["ng", "build", "--configuration", "production"], {
196
- cwd,
197
- stdio: "inherit",
198
- shell: process.platform === "win32"
199
- });
200
- if (angularBuild.status !== 0) {
201
- throw new errors_1.VerifyError("Angular build failed while preparing embedded widget assets.");
198
+ process.env.ANQST_BUILD_STAMP = buildVersion;
199
+ try {
200
+ const specPath = (0, project_1.resolveAnQstSpecPath)(cwd);
201
+ const configuredWidgetName = (0, project_1.resolveAnQstWidgetName)(cwd);
202
+ const generationTargets = resolveGenerationTargetsFromCwd(cwd, true);
203
+ const parsed = (0, parser_1.parseSpecFile)(specPath);
204
+ (0, verify_1.verifySpec)(parsed);
205
+ if (parsed.widgetName !== configuredWidgetName) {
206
+ throw new errors_1.VerifyError(`Settings widgetName '${configuredWidgetName}' does not match spec namespace '${parsed.widgetName}'.`);
202
207
  }
203
- }
204
- if (generationTargets.emitQWidget) {
205
- const embedded = (0, emit_1.installEmbeddedWebBundle)(cwd, parsed.widgetName);
206
- if (hasAngularProject && !embedded) {
207
- throw new errors_1.VerifyError("Unable to embed Angular output. Ensure ng build produced a dist bundle with index.html.");
208
+ resetGeneratedTargets(cwd, parsed.widgetName, generationTargets);
209
+ const outputs = (0, emit_1.generateOutputs)(parsed, generationTargets);
210
+ (0, emit_1.writeGeneratedOutputs)(cwd, outputs);
211
+ if (generationTargets.emitQWidget) {
212
+ (0, emit_1.installQtIntegrationCMake)(cwd, parsed.widgetName);
208
213
  }
209
- }
210
- let designerPluginBuilt = false;
211
- if (designerPlugin) {
212
- if (!generationTargets.emitQWidget) {
213
- console.warn("[AnQst] --designerplugin requested but QWidget target is not enabled. Skipping designer plugin build.");
214
+ const hasAngularProject = generationTargets.emitQWidget && node_fs_1.default.existsSync(node_path_1.default.join(cwd, "angular.json"));
215
+ if (hasAngularProject) {
216
+ const angularBuild = (0, node_child_process_1.spawnSync)("npx", ["ng", "build", "--configuration", "production"], {
217
+ cwd,
218
+ stdio: "inherit",
219
+ shell: process.platform === "win32"
220
+ });
221
+ if (angularBuild.status !== 0) {
222
+ throw new errors_1.VerifyError("Angular build failed while preparing embedded widget assets.");
223
+ }
214
224
  }
215
- else {
216
- const widgetCategory = (0, project_1.resolveAnQstWidgetCategory)(cwd);
217
- (0, emit_1.installQtDesignerPluginCMake)(cwd, parsed.widgetName, { widgetCategory });
218
- runDesignerPluginBuild(cwd, parsed.widgetName);
219
- designerPluginBuilt = true;
225
+ if (generationTargets.emitQWidget) {
226
+ 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.");
229
+ }
230
+ }
231
+ let designerPluginBuilt = false;
232
+ if (designerPlugin) {
233
+ if (!generationTargets.emitQWidget) {
234
+ console.warn("[AnQst] --designerplugin requested but QWidget target is not enabled. Skipping designer plugin build.");
235
+ }
236
+ else {
237
+ const widgetCategory = (0, project_1.resolveAnQstWidgetCategory)(cwd);
238
+ (0, emit_1.installQtDesignerPluginCMake)(cwd, parsed.widgetName, { widgetCategory });
239
+ runDesignerPluginBuild(cwd, parsed.widgetName);
240
+ designerPluginBuilt = true;
241
+ }
242
+ }
243
+ if (!generationTargets.emitAngularService && !generationTargets.emitQWidget && !generationTargets.emitNodeExpressWs) {
244
+ return {
245
+ success: true,
246
+ message: [
247
+ "Build completed.",
248
+ ` anqst version ${buildVersion}`,
249
+ " No outputs selected by AnQst.generate."
250
+ ].join("\n")
251
+ };
252
+ }
253
+ const layout = (0, layout_1.resolveGeneratedLayoutPaths)(cwd, parsed.widgetName);
254
+ const detailLines = [];
255
+ if (generationTargets.emitAngularService) {
256
+ 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"))}`);
259
+ }
260
+ if (generationTargets.emitQWidget) {
261
+ detailLines.push(" Target QWidget:");
262
+ detailLines.push(` - Qt integration CMake: ${(0, layout_1.toProjectRelative)(cwd, node_path_1.default.join(layout.cppCmakeRoot, "CMakeLists.txt"))}`);
263
+ detailLines.push(` - Widget output root: ${(0, layout_1.toProjectRelative)(cwd, layout.cppQtWidgetRoot)}`);
264
+ detailLines.push(" - C++ handoff: downstream CMake consumes this generated tree directly");
265
+ detailLines.push(" - Embedded web assets refreshed from Angular build");
266
+ }
267
+ if (generationTargets.emitNodeExpressWs) {
268
+ detailLines.push(" Target node_express_ws:");
269
+ detailLines.push(` - Module output root: ${(0, layout_1.toProjectRelative)(cwd, layout.nodeExpressRoot)}`);
270
+ }
271
+ if (designerPluginBuilt) {
272
+ const pluginBinaryPath = (0, layout_1.normalizeSlashes)(node_path_1.default.join((0, layout_1.toProjectRelative)(cwd, layout.designerPluginBuildRoot), designerPluginBinaryName(parsed.widgetName)));
273
+ detailLines.push(" Target QtDesignerPlugin:");
274
+ detailLines.push(` - Build output: ${(0, layout_1.toProjectRelative)(cwd, layout.designerPluginBuildRoot)}`);
275
+ detailLines.push(` - Plugin binary: ${pluginBinaryPath}`);
276
+ detailLines.push(" - Install target dir: <QT_INSTALL_PLUGINS>/designer");
277
+ detailLines.push(" - Discover QT_INSTALL_PLUGINS: qmake -query QT_INSTALL_PLUGINS");
278
+ detailLines.push(` - Example install: cp ${pluginBinaryPath} \"$(qmake -query QT_INSTALL_PLUGINS)/designer/\"`);
279
+ detailLines.push(` - User-local install: mkdir -p \"$HOME/.local/lib/qt5/plugins/designer\" && cp ${pluginBinaryPath} \"$HOME/.local/lib/qt5/plugins/designer/\"`);
220
280
  }
221
- }
222
- if (!generationTargets.emitAngularService && !generationTargets.emitQWidget && !generationTargets.emitNodeExpressWs) {
223
281
  return {
224
282
  success: true,
225
283
  message: [
226
284
  "Build completed.",
227
285
  ` anqst version ${buildVersion}`,
228
- " No outputs selected by AnQst.generate."
286
+ ...detailLines
229
287
  ].join("\n")
230
288
  };
231
289
  }
232
- const layout = (0, layout_1.resolveGeneratedLayoutPaths)(cwd, parsed.widgetName);
233
- const detailLines = [];
234
- if (generationTargets.emitAngularService) {
235
- detailLines.push(" Target AngularService:");
236
- detailLines.push(` - Services output: ${(0, layout_1.toProjectRelative)(cwd, node_path_1.default.join(layout.frontendRoot, "services"))}`);
237
- detailLines.push(` - Types output: ${(0, layout_1.toProjectRelative)(cwd, node_path_1.default.join(layout.frontendRoot, "types"))}`);
238
- }
239
- if (generationTargets.emitQWidget) {
240
- detailLines.push(" Target QWidget:");
241
- detailLines.push(` - Qt integration CMake: ${(0, layout_1.toProjectRelative)(cwd, node_path_1.default.join(layout.cppCmakeRoot, "CMakeLists.txt"))}`);
242
- detailLines.push(` - Widget output root: ${(0, layout_1.toProjectRelative)(cwd, layout.cppQtWidgetRoot)}`);
243
- detailLines.push(" - Embedded web assets refreshed from Angular build");
244
- }
245
- if (generationTargets.emitNodeExpressWs) {
246
- detailLines.push(" Target node_express_ws:");
247
- detailLines.push(` - Module output root: ${(0, layout_1.toProjectRelative)(cwd, layout.nodeExpressRoot)}`);
248
- }
249
- if (designerPluginBuilt) {
250
- const pluginBinaryPath = (0, layout_1.normalizeSlashes)(node_path_1.default.join((0, layout_1.toProjectRelative)(cwd, layout.designerPluginBuildRoot), designerPluginBinaryName(parsed.widgetName)));
251
- detailLines.push(" Target QtDesignerPlugin:");
252
- detailLines.push(` - Build output: ${(0, layout_1.toProjectRelative)(cwd, layout.designerPluginBuildRoot)}`);
253
- detailLines.push(` - Plugin binary: ${pluginBinaryPath}`);
254
- detailLines.push(" - Install target dir: <QT_INSTALL_PLUGINS>/designer");
255
- detailLines.push(" - Discover QT_INSTALL_PLUGINS: qmake -query QT_INSTALL_PLUGINS");
256
- detailLines.push(` - Example install: cp ${pluginBinaryPath} \"$(qmake -query QT_INSTALL_PLUGINS)/designer/\"`);
257
- detailLines.push(` - User-local install: mkdir -p \"$HOME/.local/lib/qt5/plugins/designer\" && cp ${pluginBinaryPath} \"$HOME/.local/lib/qt5/plugins/designer/\"`);
290
+ finally {
291
+ delete process.env.ANQST_BUILD_STAMP;
258
292
  }
259
- return {
260
- success: true,
261
- message: [
262
- "Build completed.",
263
- ` anqst version ${buildVersion}`,
264
- ...detailLines
265
- ].join("\n")
266
- };
267
293
  }
268
294
  function parseSpecCommandArg(commandName, specArg, extraArgs) {
269
295
  const allArgs = [specArg, ...extraArgs].filter((arg) => typeof arg === "string" && arg.length > 0);
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BASE93_ALPHABET = void 0;
4
+ exports.emitBase93Encoder = emitBase93Encoder;
5
+ exports.emitBase93Decoder = emitBase93Decoder;
6
+ exports.emitBase93CppFunctions = emitBase93CppFunctions;
7
+ exports.BASE93_ALPHABET = Array.from({ length: 95 }, (_, i) => String.fromCharCode(0x20 + i))
8
+ .filter(c => c !== '"' && c !== '\\')
9
+ .join('');
10
+ function emitBase93Encoder() {
11
+ return `function(d) {
12
+ var A = "${exports.BASE93_ALPHABET}", n = d.length, f = n >>> 2, r = n & 3,
13
+ o = new Array(f * 5 + (r ? r + 1 : 0)), p = 0, i, v, b, j;
14
+ for (i = 0; i < f; i++) {
15
+ b = i << 2;
16
+ v = ((d[b] << 24) | (d[b+1] << 16) | (d[b+2] << 8) | d[b+3]) >>> 0;
17
+ o[p+4] = A[v % 93]; v = (v / 93) | 0;
18
+ o[p+3] = A[v % 93]; v = (v / 93) | 0;
19
+ o[p+2] = A[v % 93]; v = (v / 93) | 0;
20
+ o[p+1] = A[v % 93];
21
+ o[p] = A[(v / 93) | 0];
22
+ p += 5;
23
+ }
24
+ if (r) {
25
+ b = f << 2; v = 0;
26
+ for (j = 0; j < r; j++) v = (v << 8) | d[b + j];
27
+ for (j = r; j >= 0; j--) { o[p + j] = A[v % 93]; v = (v / 93) | 0; }
28
+ }
29
+ return o.join("");
30
+ }`;
31
+ }
32
+ function emitBase93Decoder() {
33
+ return `function(s) {
34
+ var n = s.length, f = (n / 5) | 0, r = n - f * 5,
35
+ o = new Uint8Array(f * 4 + (r ? r - 1 : 0)), p = 0, i, v, c, b;
36
+ for (i = 0; i < f; i++) {
37
+ b = i * 5;
38
+ c = s.charCodeAt(b); v = c - 32 - ((c > 34) ? 1 : 0) - ((c > 92) ? 1 : 0);
39
+ c = s.charCodeAt(b + 1); v = v * 93 + c - 32 - ((c > 34) ? 1 : 0) - ((c > 92) ? 1 : 0);
40
+ c = s.charCodeAt(b + 2); v = v * 93 + c - 32 - ((c > 34) ? 1 : 0) - ((c > 92) ? 1 : 0);
41
+ c = s.charCodeAt(b + 3); v = v * 93 + c - 32 - ((c > 34) ? 1 : 0) - ((c > 92) ? 1 : 0);
42
+ c = s.charCodeAt(b + 4); v = v * 93 + c - 32 - ((c > 34) ? 1 : 0) - ((c > 92) ? 1 : 0);
43
+ o[p] = v >>> 24; o[p+1] = (v >>> 16) & 255; o[p+2] = (v >>> 8) & 255; o[p+3] = v & 255;
44
+ p += 4;
45
+ }
46
+ if (r) {
47
+ v = 0;
48
+ for (i = 0; i < r; i++) { c = s.charCodeAt(f * 5 + i); v = v * 93 + c - 32 - ((c > 34) ? 1 : 0) - ((c > 92) ? 1 : 0); }
49
+ for (i = r - 2; i >= 0; i--) { o[p + i] = v & 255; v = (v / 256) | 0; }
50
+ }
51
+ return o;
52
+ }`;
53
+ }
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
+ }
@@ -2,4 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ANQST_BUILD_STAMP = void 0;
4
4
  // Generated by scripts/build-with-stamp.js. Do not edit by hand.
5
- exports.ANQST_BUILD_STAMP = "1.0.0/7bd720a_dirty_build_1/2026-03-29";
5
+ exports.ANQST_BUILD_STAMP = "unknown/unknown_build_0/1970-01-01";
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ /**
3
+ * Base codec emitter: AnQst.Type.qint64 — TypeScript decoder (standalone base93 string → bigint).
4
+ *
5
+ * - Decodes base93 to 8 bytes, then reads signed 64-bit two's complement via BigInt64Array.
6
+ * - C++ decoder uses memcpy from decoded bytes into qint64 (see emitCppDecoder).
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.decoderEmitter = exports.descriptor = void 0;
10
+ const fixedwidth_1 = require("../shared/fixedwidth");
11
+ const FIXED_WIDTH = {
12
+ byteWidth: 8,
13
+ tsViewCtor: "BigInt64Array",
14
+ cppType: "qint64"
15
+ };
16
+ exports.descriptor = {
17
+ codecId: "bigint-qint64",
18
+ specPath: "RefinedSpecs/Codecs/BigInt_qint64_Codec.md",
19
+ tsType: "bigint",
20
+ cppType: "qint64",
21
+ wireCategory: "fixed-width-scalar",
22
+ strategySummary: "Decode standalone base93 to 8 bytes, reinterpret as qint64 / BigInt64Array[0] as bigint.",
23
+ fixedWidth: FIXED_WIDTH
24
+ };
25
+ const TS_FN = "decodeQint64Standalone";
26
+ const CPP_FN = "decodeQint64Standalone";
27
+ exports.decoderEmitter = {
28
+ descriptor: exports.descriptor,
29
+ emitTsDecoder() {
30
+ return (0, fixedwidth_1.emitTsFixedWidthStandaloneDecoder)(TS_FN, FIXED_WIDTH);
31
+ },
32
+ emitCppDecoder() {
33
+ return (0, fixedwidth_1.emitCppFixedWidthStandaloneDecoder)(CPP_FN, FIXED_WIDTH);
34
+ }
35
+ };
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ /**
3
+ * Base codec emitter: AnQst.Type.qint64 — TypeScript encoder (bigint → standalone base93 string).
4
+ *
5
+ * - 8-byte signed two's complement via BigInt64Array; platform-native byte order.
6
+ * - Standalone wire: one base93 string (10 characters for 8 bytes).
7
+ * - C++ side mirrors layout with memcpy into qint64 (see emitCppEncoder).
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.encoderEmitter = exports.descriptor = void 0;
11
+ const fixedwidth_1 = require("../shared/fixedwidth");
12
+ const FIXED_WIDTH = {
13
+ byteWidth: 8,
14
+ tsViewCtor: "BigInt64Array",
15
+ cppType: "qint64"
16
+ };
17
+ exports.descriptor = {
18
+ codecId: "bigint-qint64",
19
+ specPath: "RefinedSpecs/Codecs/BigInt_qint64_Codec.md",
20
+ tsType: "bigint",
21
+ cppType: "qint64",
22
+ wireCategory: "fixed-width-scalar",
23
+ strategySummary: "Serialize qint64 as 8-byte signed two's complement (BigInt64Array / C++ memcpy), then base93-encode to a standalone JSON string.",
24
+ fixedWidth: FIXED_WIDTH
25
+ };
26
+ const TS_FN = "encodeQint64Standalone";
27
+ const CPP_FN = "encodeQint64Standalone";
28
+ exports.encoderEmitter = {
29
+ descriptor: exports.descriptor,
30
+ emitTsEncoder() {
31
+ return (0, fixedwidth_1.emitTsFixedWidthStandaloneEncoder)(TS_FN, FIXED_WIDTH);
32
+ },
33
+ emitCppEncoder() {
34
+ return (0, fixedwidth_1.emitCppFixedWidthStandaloneEncoder)(CPP_FN, FIXED_WIDTH);
35
+ }
36
+ };
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ /**
3
+ * Decoder emitter for the AnQst base-type codec `AnQst.Type.quint64`.
4
+ *
5
+ * Reverses the standalone encoder: base93 string → 8 bytes → `BigUint64Array` → bigint (≥ 0n).
6
+ * C++ decodes to `quint64` via `std::memcpy` from decoded bytes.
7
+ *
8
+ * Spec: RefinedSpecs/Codecs/BigInt_quint64_Codec.md
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.decoder = exports.descriptor = void 0;
12
+ const fixedwidth_1 = require("../shared/fixedwidth");
13
+ const encoder_1 = require("./encoder");
14
+ Object.defineProperty(exports, "descriptor", { enumerable: true, get: function () { return encoder_1.descriptor; } });
15
+ const fixedWidth = encoder_1.descriptor.fixedWidth;
16
+ const TS_FN = "decodeQuint64Standalone";
17
+ const CPP_FN = "decodeQuint64Standalone";
18
+ exports.decoder = {
19
+ descriptor: encoder_1.descriptor,
20
+ emitTsDecoder() {
21
+ return (0, fixedwidth_1.emitTsFixedWidthStandaloneDecoder)(TS_FN, fixedWidth);
22
+ },
23
+ emitCppDecoder() {
24
+ return (0, fixedwidth_1.emitCppFixedWidthStandaloneDecoder)(CPP_FN, fixedWidth);
25
+ }
26
+ };
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ /**
3
+ * Emitter for the AnQst base-type codec `AnQst.Type.quint64`.
4
+ *
5
+ * Maps TypeScript `bigint` to an 8-byte unsigned little-endian representation via
6
+ * `BigUint64Array`, then to a standalone base93 string (10 characters). C++ uses
7
+ * `quint64` with `std::memcpy` for the same 8-byte layout on the host platform.
8
+ *
9
+ * Spec: RefinedSpecs/Codecs/BigInt_quint64_Codec.md
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.encoder = exports.descriptor = void 0;
13
+ const fixedwidth_1 = require("../shared/fixedwidth");
14
+ const fixedWidth = {
15
+ byteWidth: 8,
16
+ tsViewCtor: "BigUint64Array",
17
+ cppType: "quint64"
18
+ };
19
+ exports.descriptor = {
20
+ codecId: "bigint-quint64",
21
+ specPath: "RefinedSpecs/Codecs/BigInt_quint64_Codec.md",
22
+ tsType: "bigint",
23
+ cppType: "quint64",
24
+ wireCategory: "fixed-width-scalar",
25
+ strategySummary: "8-byte unsigned host-endian representation (BigUint64Array / memcpy into quint64), base93 standalone string (10 chars).",
26
+ fixedWidth
27
+ };
28
+ const TS_FN = "encodeQuint64Standalone";
29
+ const CPP_FN = "encodeQuint64Standalone";
30
+ exports.encoder = {
31
+ descriptor: exports.descriptor,
32
+ emitTsEncoder() {
33
+ return (0, fixedwidth_1.emitTsFixedWidthStandaloneEncoder)(TS_FN, fixedWidth);
34
+ },
35
+ emitCppEncoder() {
36
+ return (0, fixedwidth_1.emitCppFixedWidthStandaloneEncoder)(CPP_FN, fixedWidth);
37
+ }
38
+ };
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /**
3
+ * Base codec emitter (decode): `AnQst.Type.blob`.
4
+ * Decoding mirrors `AnQst.Type.buffer`: base93 text reconstructs the original raw bytes as ArrayBuffer/QByteArray.
5
+ * This file preserves blob-specific descriptor identity while reusing the shared raw-byte scaffold.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.decoderEmitter = exports.descriptor = void 0;
9
+ const comments_1 = require("../shared/comments");
10
+ const rawbytes_1 = require("../shared/rawbytes");
11
+ const encoder_1 = require("./encoder");
12
+ Object.defineProperty(exports, "descriptor", { enumerable: true, get: function () { return encoder_1.descriptor; } });
13
+ const TS_FN = "decodeBinaryBlobStandalone";
14
+ const CPP_FN = "decodeBinaryBlobStandalone";
15
+ const strategyComment = (0, comments_1.emitStrategyComment)("Base codec emitter (decode): AnQst.Type.blob / QByteArray", [
16
+ "Base93-decodes the standalone wire string back into the original opaque byte sequence.",
17
+ "Wire layout is intentionally identical to AnQst.Type.buffer; the distinction is semantic descriptor metadata.",
18
+ "Expects base93Decode in scope; C++ reconstructs QByteArray directly from decoded bytes."
19
+ ]);
20
+ exports.decoderEmitter = {
21
+ descriptor: encoder_1.descriptor,
22
+ emitTsDecoder() {
23
+ return `${strategyComment}\n\n${(0, rawbytes_1.emitTsRawByteStandaloneDecoder)(TS_FN, "bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength)")}`;
24
+ },
25
+ emitCppDecoder() {
26
+ return `${strategyComment}\n\n${(0, rawbytes_1.emitCppRawByteStandaloneDecoder)(CPP_FN, "QByteArray(reinterpret_cast<const char*>(bytes.data()), static_cast<int>(bytes.size()))")}`;
27
+ }
28
+ };
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ /**
3
+ * Base codec emitter (encode): `AnQst.Type.blob`.
4
+ * Wire shape is identical to `AnQst.Type.buffer`: raw ArrayBuffer bytes become one base93 string.
5
+ * This emitter keeps distinct blob descriptor metadata while reusing the shared raw-byte scaffold.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.encoderEmitter = exports.descriptor = void 0;
9
+ const comments_1 = require("../shared/comments");
10
+ const rawbytes_1 = require("../shared/rawbytes");
11
+ exports.descriptor = {
12
+ codecId: "binary-blob",
13
+ specPath: "RefinedSpecs/Codecs/Binary_blob_Codec.md",
14
+ tsType: "ArrayBuffer",
15
+ cppType: "QByteArray",
16
+ wireCategory: "binary",
17
+ strategySummary: "Serialize ArrayBuffer / QByteArray raw bytes as one base93 string; wire-identical to buffer, but with blob-specific descriptor metadata."
18
+ };
19
+ const TS_FN = "encodeBinaryBlobStandalone";
20
+ const CPP_FN = "encodeBinaryBlobStandalone";
21
+ const strategyComment = (0, comments_1.emitStrategyComment)("Base codec emitter (encode): AnQst.Type.blob / QByteArray", [
22
+ "Treats the payload as opaque bytes and base93-encodes them into one standalone JSON string.",
23
+ "Wire layout is intentionally identical to AnQst.Type.buffer; only descriptor identity differs.",
24
+ "Expects base93Encode in scope; C++ path reads QByteArray bytes without adding length/type metadata."
25
+ ]);
26
+ exports.encoderEmitter = {
27
+ descriptor: exports.descriptor,
28
+ emitTsEncoder() {
29
+ return `${strategyComment}\n\n${(0, rawbytes_1.emitTsRawByteStandaloneEncoder)(TS_FN, "new Uint8Array(value)")}`;
30
+ },
31
+ emitCppEncoder() {
32
+ return `${strategyComment}\n\n${(0, rawbytes_1.emitCppRawByteStandaloneEncoder)(CPP_FN, "std::vector<std::uint8_t>(reinterpret_cast<const std::uint8_t*>(value.constData()), reinterpret_cast<const std::uint8_t*>(value.constData()) + value.size())")}`;
33
+ }
34
+ };
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ /**
3
+ * Base codec emitter (decode): standalone base93 string → `ArrayBuffer` / `QByteArray`.
4
+ * The decoder reconstructs the exact raw byte sequence and returns the decoded backing buffer in TS.
5
+ * Composite codecs must decide where buffer-length metadata lives when a variable-length buffer shares a
6
+ * payload with sibling fields; this file only emits the standalone leaf helper and documents that strategy.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.decoder = exports.descriptor = void 0;
10
+ const comments_1 = require("../shared/comments");
11
+ const rawbytes_1 = require("../shared/rawbytes");
12
+ const encoder_1 = require("./encoder");
13
+ Object.defineProperty(exports, "descriptor", { enumerable: true, get: function () { return encoder_1.descriptor; } });
14
+ const TS_FN = "decodeAnqstBase_buffer";
15
+ const CPP_FN = "decodeAnqstBase_buffer";
16
+ const strategyComment = (0, comments_1.emitStrategyComment)("Base codec emitter (decode): AnQst.Type.buffer / ArrayBuffer", [
17
+ "Base93-decodes the standalone wire string to raw bytes and returns the resulting opaque byte sequence.",
18
+ "TypeScript returns the ArrayBuffer backing the decoded Uint8Array without an extra copy; C++ rebuilds QByteArray from decoded bytes.",
19
+ "Composite codecs should read byte-length metadata from their planned numeric blob or trailing-position convention before consuming a buffer payload; that structured orchestration is intentionally not wired here."
20
+ ]);
21
+ exports.decoder = {
22
+ descriptor: encoder_1.descriptor,
23
+ emitTsDecoder() {
24
+ return `${strategyComment}\n\n${(0, rawbytes_1.emitTsRawByteStandaloneDecoder)(TS_FN, "bytes.buffer")}`;
25
+ },
26
+ emitCppDecoder() {
27
+ return `${strategyComment}\n\n${(0, rawbytes_1.emitCppRawByteStandaloneDecoder)(CPP_FN, "QByteArray(bytes.begin(), bytes.end())")}`;
28
+ }
29
+ };
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ /**
3
+ * Base codec emitter (encode): `AnQst.Type.buffer` / `ArrayBuffer` ↔ `QByteArray`.
4
+ * Standalone wire shape is one base93 string over the raw bytes, including `""` for an empty buffer.
5
+ * Composite codecs should keep the variable-length buffer payload in its own string slot and pair it with
6
+ * byte-length metadata when sibling fields make boundaries ambiguous; that structured integration is
7
+ * documented here but intentionally not emitted by this leaf helper.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.encoder = exports.descriptor = void 0;
11
+ const comments_1 = require("../shared/comments");
12
+ const rawbytes_1 = require("../shared/rawbytes");
13
+ exports.descriptor = {
14
+ codecId: "AnQst.Type.buffer",
15
+ specPath: "RefinedSpecs/Codecs/Binary_buffer_Codec.md",
16
+ tsType: "ArrayBuffer",
17
+ cppType: "QByteArray",
18
+ wireCategory: "binary",
19
+ strategySummary: "ArrayBuffer/QByteArray raw bytes encoded as one standalone base93 string; composite codecs keep the payload in its own string slot and carry byte length separately when needed."
20
+ };
21
+ const TS_FN = "encodeAnqstBase_buffer";
22
+ const CPP_FN = "encodeAnqstBase_buffer";
23
+ const strategyComment = (0, comments_1.emitStrategyComment)("Base codec emitter (encode): AnQst.Type.buffer / ArrayBuffer", [
24
+ "Treats the domain value as an opaque byte sequence and base93-encodes it as one standalone string.",
25
+ "TypeScript reads bytes through Uint8Array(value); C++ reads QByteArray through begin()/end() into std::vector<std::uint8_t>.",
26
+ "Composite codecs should keep this variable-length payload in its own wire string position and carry byte-length metadata separately when boundary disambiguation is required; that orchestration is not emitted here."
27
+ ]);
28
+ exports.encoder = {
29
+ descriptor: exports.descriptor,
30
+ emitTsEncoder() {
31
+ return `${strategyComment}\n\n${(0, rawbytes_1.emitTsRawByteStandaloneEncoder)(TS_FN, "new Uint8Array(value)")}`;
32
+ },
33
+ emitCppEncoder() {
34
+ return `${strategyComment}\n\n${(0, rawbytes_1.emitCppRawByteStandaloneEncoder)(CPP_FN, "std::vector<std::uint8_t>(value.begin(), value.end())")}`;
35
+ }
36
+ };