@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
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderTsBoundaryCodecHelpers = exports.renderCppBoundaryCodecHelpers = void 0;
4
+ exports.buildBoundaryCodecCatalog = buildBoundaryCodecCatalog;
5
+ exports.getBoundaryPayloadSite = getBoundaryPayloadSite;
6
+ exports.getBoundaryParameterSite = getBoundaryParameterSite;
7
+ const debug_dump_1 = require("./debug-dump");
8
+ const boundary_codec_model_1 = require("./boundary-codec-model");
9
+ const boundary_codec_analysis_1 = require("./boundary-codec-analysis");
10
+ const boundary_codec_plan_1 = require("./boundary-codec-plan");
11
+ var boundary_codec_render_1 = require("./boundary-codec-render");
12
+ Object.defineProperty(exports, "renderCppBoundaryCodecHelpers", { enumerable: true, get: function () { return boundary_codec_render_1.renderCppBoundaryCodecHelpers; } });
13
+ Object.defineProperty(exports, "renderTsBoundaryCodecHelpers", { enumerable: true, get: function () { return boundary_codec_render_1.renderTsBoundaryCodecHelpers; } });
14
+ function renderAnalysisNode(node, level, lines, visitedNamed = new Set()) {
15
+ const pad = " ".repeat(level);
16
+ if (node.nodeKind === "leaf") {
17
+ lines.push(`${pad}- leaf ${node.path.join(".")} :: ${node.leaf.logicalKind} -> ${node.leaf.region}`);
18
+ return;
19
+ }
20
+ if (node.nodeKind === "finite-domain") {
21
+ lines.push(`${pad}- finite-domain ${node.path.join(".")} :: ${node.domain.primitive} {${node.domain.variants.map((variant) => variant.tsLiteralText).join(", ")}}`);
22
+ return;
23
+ }
24
+ if (node.nodeKind === "array") {
25
+ lines.push(`${pad}- array ${node.path.join(".")} :: count metadata required`);
26
+ renderAnalysisNode(node.element, level + 1, lines, visitedNamed);
27
+ return;
28
+ }
29
+ if (node.nodeKind === "named") {
30
+ lines.push(`${pad}- named ${node.name}`);
31
+ if (visitedNamed.has(node.name)) {
32
+ lines.push(`${pad} [recursive]`);
33
+ return;
34
+ }
35
+ visitedNamed.add(node.name);
36
+ renderAnalysisNode(node.target, level + 1, lines, visitedNamed);
37
+ return;
38
+ }
39
+ lines.push(`${pad}- struct ${node.path.join(".")}`);
40
+ for (const field of node.fields) {
41
+ lines.push(`${pad} field ${field.name}${field.optional ? "?" : ""}`);
42
+ renderAnalysisNode(field.node, level + 2, lines, visitedNamed);
43
+ }
44
+ }
45
+ function renderPlanNode(node, level, lines, visitedNamed = new Set()) {
46
+ const pad = " ".repeat(level);
47
+ const loweringText = (lowering) => `ts:${lowering.tsEncode.mode}/${lowering.tsDecode.mode} cpp:${lowering.cppEncode.mode}/${lowering.cppDecode.mode}`;
48
+ if (node.nodeKind === "leaf") {
49
+ if (node.blobEntryId) {
50
+ lines.push(`${pad}- blob leaf ${node.path.join(".")} packing=${node.selectedPacking} lowering=${loweringText(node.lowering)} -> ${node.blobEntryId}`);
51
+ }
52
+ else {
53
+ lines.push(`${pad}- ${node.leaf.region} leaf ${node.path.join(".")} packing=${node.selectedPacking} lowering=${loweringText(node.lowering)} -> ${node.itemEntryId}`);
54
+ }
55
+ return;
56
+ }
57
+ if (node.nodeKind === "finite-domain") {
58
+ if (node.representation.kind === "identity-text") {
59
+ lines.push(`${pad}- finite-domain ${node.path.join(".")} identity-text lowering=${loweringText(node.lowering)} -> ${node.itemEntryId}`);
60
+ }
61
+ else {
62
+ lines.push(`${pad}- finite-domain ${node.path.join(".")} code=${node.representation.scalarKind} lowering=${loweringText(node.lowering)} -> ${node.blobEntryId}`);
63
+ }
64
+ return;
65
+ }
66
+ if (node.nodeKind === "array") {
67
+ lines.push(`${pad}- array ${node.path.join(".")} extent=${node.extentStrategy}${node.countEntryId ? ` count=${node.countEntryId}` : ""}`);
68
+ renderPlanNode(node.element, level + 1, lines, visitedNamed);
69
+ return;
70
+ }
71
+ if (node.nodeKind === "named") {
72
+ lines.push(`${pad}- named ${node.name}`);
73
+ if (visitedNamed.has(node.name)) {
74
+ lines.push(`${pad} [recursive]`);
75
+ return;
76
+ }
77
+ visitedNamed.add(node.name);
78
+ renderPlanNode(node.target, level + 1, lines, visitedNamed);
79
+ return;
80
+ }
81
+ lines.push(`${pad}- struct ${node.path.join(".")} ordering=${node.ordering}`);
82
+ for (const field of node.fields) {
83
+ lines.push(`${pad} field ${field.name}${field.optional ? `? presence=${field.presenceStrategy}:${field.presenceEntryId}` : ""}`);
84
+ renderPlanNode(field.node, level + 2, lines, visitedNamed);
85
+ }
86
+ }
87
+ function renderBoundaryDebugSummaries(plans) {
88
+ const analysisChunks = [];
89
+ const planChunks = [];
90
+ for (const plan of plans) {
91
+ analysisChunks.push(`codec ${plan.codecId} :: ${plan.typeText}`);
92
+ analysisChunks.push(`summary ${JSON.stringify(plan.analysis.summary)}`);
93
+ renderAnalysisNode(plan.analysis.root, 1, analysisChunks);
94
+ analysisChunks.push("");
95
+ planChunks.push(`codec ${plan.codecId} :: ${plan.typeText}`);
96
+ planChunks.push(`decodePolicy=${plan.decodePolicy} blob=${plan.blobEntries.length} items=${plan.itemEntries.length} kinds=${plan.requirements.itemKinds.join(",") || "none"} itemCountHeaderKinds=${plan.requirements.itemCountHeaderKinds.join(",") || "none"}`);
97
+ renderPlanNode(plan.root, 1, planChunks);
98
+ planChunks.push("");
99
+ }
100
+ return {
101
+ analyses: `${analysisChunks.join("\n")}\n`,
102
+ plans: `${planChunks.join("\n")}\n`
103
+ };
104
+ }
105
+ function buildBoundaryCodecCatalog(spec) {
106
+ const analyzer = new boundary_codec_analysis_1.BoundaryTransportAnalyzer(spec);
107
+ const plans = [];
108
+ const plansByCodecId = new Map();
109
+ const codecIdByTypeText = new Map();
110
+ const payloadSites = new Map();
111
+ const parameterSites = new Map();
112
+ const usedCodecIds = new Set();
113
+ const ensureCodec = (typeText, pathHintParts) => {
114
+ const existing = codecIdByTypeText.get(typeText);
115
+ if (existing)
116
+ return existing;
117
+ const proposed = `AnQstStructured_${(0, boundary_codec_model_1.sanitizeIdentifier)((0, boundary_codec_model_1.stripAnQstType)(typeText).replace(/\s+/g, "_"))}`;
118
+ let codecId = proposed;
119
+ let suffix = 2;
120
+ while (usedCodecIds.has(codecId)) {
121
+ codecId = `${proposed}_${suffix++}`;
122
+ }
123
+ usedCodecIds.add(codecId);
124
+ codecIdByTypeText.set(typeText, codecId);
125
+ const analysis = analyzer.analyzeTypeText(typeText, pathHintParts);
126
+ const plan = (0, boundary_codec_plan_1.buildBoundaryCodecPlan)(codecId, analysis);
127
+ plans.push(plan);
128
+ plansByCodecId.set(codecId, plan);
129
+ return codecId;
130
+ };
131
+ for (const service of spec.services) {
132
+ for (const member of service.members) {
133
+ if (member.payloadTypeText && member.payloadTypeText.trim() !== "void") {
134
+ const site = {
135
+ siteKey: (0, boundary_codec_model_1.codecSiteKey)("payload", service.name, member.name, null),
136
+ kind: "payload",
137
+ serviceName: service.name,
138
+ memberName: member.name,
139
+ parameterName: null,
140
+ typeText: member.payloadTypeText,
141
+ codecId: ensureCodec(member.payloadTypeText, [service.name, member.name, "Payload"])
142
+ };
143
+ payloadSites.set(site.siteKey, site);
144
+ }
145
+ for (const parameter of member.parameters) {
146
+ const site = {
147
+ siteKey: (0, boundary_codec_model_1.codecSiteKey)("parameter", service.name, member.name, parameter.name),
148
+ kind: "parameter",
149
+ serviceName: service.name,
150
+ memberName: member.name,
151
+ parameterName: parameter.name,
152
+ typeText: parameter.typeText,
153
+ codecId: ensureCodec(parameter.typeText, [service.name, member.name, parameter.name])
154
+ };
155
+ parameterSites.set(site.siteKey, site);
156
+ }
157
+ }
158
+ }
159
+ const debug = renderBoundaryDebugSummaries(plans);
160
+ (0, debug_dump_1.writeDebugFile)(process.cwd(), "codecs/boundary-transport-analysis.txt", debug.analyses);
161
+ (0, debug_dump_1.writeDebugFile)(process.cwd(), "codecs/boundary-plans.txt", debug.plans);
162
+ return {
163
+ plans,
164
+ plansByCodecId,
165
+ payloadSites,
166
+ parameterSites
167
+ };
168
+ }
169
+ function getBoundaryPayloadSite(catalog, serviceName, memberName) {
170
+ return catalog.payloadSites.get((0, boundary_codec_model_1.codecSiteKey)("payload", serviceName, memberName, null));
171
+ }
172
+ function getBoundaryParameterSite(catalog, serviceName, memberName, parameterName) {
173
+ return catalog.parameterSites.get((0, boundary_codec_model_1.codecSiteKey)("parameter", serviceName, memberName, parameterName));
174
+ }