blueprint-runtime 0.0.0-stage → 0.3.1
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.
- package/LICENSE +21 -0
- package/README.md +224 -3
- package/dist/src/blueprint/load.js +83 -0
- package/dist/src/blueprint/load.js.map +1 -0
- package/dist/src/blueprint/plan.js +202 -0
- package/dist/src/blueprint/plan.js.map +1 -0
- package/dist/src/cli.js +182 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/expr/dates.js +152 -0
- package/dist/src/expr/dates.js.map +1 -0
- package/dist/src/expr/decimal.js +66 -0
- package/dist/src/expr/decimal.js.map +1 -0
- package/dist/src/expr/errors.js +31 -0
- package/dist/src/expr/errors.js.map +1 -0
- package/dist/src/expr/evaluate.js +250 -0
- package/dist/src/expr/evaluate.js.map +1 -0
- package/dist/src/expr/functions.js +460 -0
- package/dist/src/expr/functions.js.map +1 -0
- package/dist/src/expr/parser.js +228 -0
- package/dist/src/expr/parser.js.map +1 -0
- package/dist/src/expr/scan.js +101 -0
- package/dist/src/expr/scan.js.map +1 -0
- package/dist/src/expr/values.js +118 -0
- package/dist/src/expr/values.js.map +1 -0
- package/dist/src/findings.js +10 -0
- package/dist/src/findings.js.map +1 -0
- package/dist/src/inspect.js +313 -0
- package/dist/src/inspect.js.map +1 -0
- package/dist/src/json/parse.js +225 -0
- package/dist/src/json/parse.js.map +1 -0
- package/dist/src/registry.js +39 -0
- package/dist/src/registry.js.map +1 -0
- package/dist/src/run/case.js +122 -0
- package/dist/src/run/case.js.map +1 -0
- package/dist/src/run/compare.js +94 -0
- package/dist/src/run/compare.js.map +1 -0
- package/dist/src/run/fixtures.js +122 -0
- package/dist/src/run/fixtures.js.map +1 -0
- package/dist/src/run/modules.js +380 -0
- package/dist/src/run/modules.js.map +1 -0
- package/dist/src/run/operators.js +151 -0
- package/dist/src/run/operators.js.map +1 -0
- package/dist/src/run/scheduler.js +306 -0
- package/dist/src/run/scheduler.js.map +1 -0
- package/dist/src/run/trace.js +2 -0
- package/dist/src/run/trace.js.map +1 -0
- package/package.json +60 -6
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { EXIT } from './findings.js';
|
|
2
|
+
import { loadBlueprint, DEFAULT_LIMITS } from './blueprint/load.js';
|
|
3
|
+
import { ExprSyntaxError, UnsupportedError } from './expr/errors.js';
|
|
4
|
+
import { parseExpression } from './expr/parser.js';
|
|
5
|
+
import { scanTemplate } from './expr/scan.js';
|
|
6
|
+
import { escapePointerToken, isObject } from './json/parse.js';
|
|
7
|
+
import { FILTER_OPERATORS, FUNCTIONS, KEYWORDS, MODULES } from './registry.js';
|
|
8
|
+
import { handlerFor, isOpaqueModule } from './run/modules.js';
|
|
9
|
+
function describeWhere(m, byId) {
|
|
10
|
+
if (m.branch.length === 0)
|
|
11
|
+
return 'main';
|
|
12
|
+
return m.branch
|
|
13
|
+
.map((b) => {
|
|
14
|
+
if (b.kind === 'onerror')
|
|
15
|
+
return `error handler of ${b.owner}`;
|
|
16
|
+
const router = byId.get(b.owner);
|
|
17
|
+
const fallback = router?.elseRoute === b.index ? ' (fallback)' : '';
|
|
18
|
+
return `router ${b.owner} › route ${b.index + 1}${fallback}`;
|
|
19
|
+
})
|
|
20
|
+
.join(' › ');
|
|
21
|
+
}
|
|
22
|
+
/** Every string under a value, with its JSON pointer. */
|
|
23
|
+
function* strings(v, pointer) {
|
|
24
|
+
if (typeof v === 'string')
|
|
25
|
+
yield [v, pointer];
|
|
26
|
+
else if (Array.isArray(v))
|
|
27
|
+
for (let i = 0; i < v.length; i++)
|
|
28
|
+
yield* strings(v[i], `${pointer}/${i}`);
|
|
29
|
+
else if (isObject(v))
|
|
30
|
+
for (const k of Object.keys(v))
|
|
31
|
+
yield* strings(v[k], `${pointer}/${escapePointerToken(k)}`);
|
|
32
|
+
}
|
|
33
|
+
export function inspectBytes(file, bytes, limits = DEFAULT_LIMITS) {
|
|
34
|
+
const loaded = loadBlueprint(bytes, limits);
|
|
35
|
+
const findings = [...loaded.findings];
|
|
36
|
+
const report = {
|
|
37
|
+
schemaVersion: 1,
|
|
38
|
+
tool: 'blueprint-runtime',
|
|
39
|
+
command: 'inspect',
|
|
40
|
+
file,
|
|
41
|
+
sha256: loaded.sha256,
|
|
42
|
+
bytes: loaded.bytes,
|
|
43
|
+
format: loaded.format,
|
|
44
|
+
name: loaded.plan?.name ?? (typeof loaded.doc?.['name'] === 'string' ? loaded.doc['name'] : null),
|
|
45
|
+
semanticHash: loaded.plan?.semanticHash ?? null,
|
|
46
|
+
modules: [],
|
|
47
|
+
expressions: [],
|
|
48
|
+
functions: [],
|
|
49
|
+
filterOperators: [],
|
|
50
|
+
needsClock: false,
|
|
51
|
+
fixtures: [],
|
|
52
|
+
findings,
|
|
53
|
+
verdict: 'eligible',
|
|
54
|
+
exitCode: EXIT.ok,
|
|
55
|
+
};
|
|
56
|
+
const plan = loaded.plan;
|
|
57
|
+
if (plan) {
|
|
58
|
+
const byId = new Map(plan.modules.map((m) => [m.id, m]));
|
|
59
|
+
const locate = (pointer) => loaded.json?.locatePointer(pointer);
|
|
60
|
+
const add = (f) => {
|
|
61
|
+
const loc = f.pointer === undefined ? undefined : locate(f.pointer);
|
|
62
|
+
findings.push(loc ? { ...f, loc } : f);
|
|
63
|
+
};
|
|
64
|
+
const fnCounts = new Map();
|
|
65
|
+
const opCounts = new Map();
|
|
66
|
+
const trigger = plan.modules[0];
|
|
67
|
+
const appTrigger = trigger !== undefined && isOpaqueModule(trigger.module);
|
|
68
|
+
if (appTrigger) {
|
|
69
|
+
report.fixtures.push({ moduleId: trigger.id, module: trigger.module, mode: 'trigger' });
|
|
70
|
+
add({ code: 'TRIGGER_FROM_INPUT', severity: 'warning', message: `The scenario starts with ${trigger.module}: a case's input is the list of bundles this trigger emitted (the connector itself is not verified)`, pointer: `${trigger.pointer}/module` });
|
|
71
|
+
}
|
|
72
|
+
else if (trigger && trigger.module !== 'gateway:CustomWebHook' && trigger.module !== 'util:BasicTrigger') {
|
|
73
|
+
add({ code: 'TRIGGER_UNSUPPORTED', severity: 'unsupported', message: `The scenario starts with ${trigger.module}; only a Custom webhook, the Basic trigger or a third-party app trigger can start a run yet`, pointer: `${trigger.pointer}/module` });
|
|
74
|
+
}
|
|
75
|
+
for (const m of plan.modules) {
|
|
76
|
+
const support = MODULES[m.module];
|
|
77
|
+
const versionOk = support?.versions.includes(m.version) ?? false;
|
|
78
|
+
const opaque = !support && isOpaqueModule(m.module);
|
|
79
|
+
if ((opaque && m !== trigger) || support?.fixture) {
|
|
80
|
+
const mode = opaque ? 'module' : support.fixture;
|
|
81
|
+
report.fixtures.push({ moduleId: m.id, module: m.module, mode });
|
|
82
|
+
add({ code: 'FIXTURE_REQUIRED', severity: 'warning', message: `Module ${m.id} (${m.module}) runs offline only from ${mode === 'http' ? 'an HTTP fixture (the request it builds is checked)' : 'a module fixture (its mapped input is checked; the connector itself is not verified)'}`, pointer: `${m.pointer}/module` });
|
|
83
|
+
}
|
|
84
|
+
if (m.module === 'placeholder:Placeholder') {
|
|
85
|
+
add({ code: 'MODULE_PLACEHOLDER', severity: 'unsupported', message: `Module ${m.id} is an empty module slot (placeholder:Placeholder): the scenario cannot run until it is filled in`, pointer: `${m.pointer}/module` });
|
|
86
|
+
}
|
|
87
|
+
else if (!support && !opaque) {
|
|
88
|
+
add({ code: 'MODULE_UNSUPPORTED', severity: 'unsupported', message: `Module ${m.id} uses ${m.module}, which has no recorded Make behavior in this runtime yet`, pointer: `${m.pointer}/module` });
|
|
89
|
+
}
|
|
90
|
+
else if (support && !versionOk) {
|
|
91
|
+
add({ code: 'MODULE_VERSION_UNSUPPORTED', severity: 'unsupported', message: `Module ${m.id}: ${m.module} version ${m.version} is not covered (known: ${support.versions.join(', ')})`, pointer: `${m.pointer}/version` });
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
handlerFor(m.module)?.check?.(m);
|
|
95
|
+
}
|
|
96
|
+
catch (e) {
|
|
97
|
+
if (!(e instanceof UnsupportedError))
|
|
98
|
+
throw e;
|
|
99
|
+
add({ code: 'MODULE_CONFIG_UNSUPPORTED', severity: 'unsupported', message: e.message, pointer: m.pointer });
|
|
100
|
+
}
|
|
101
|
+
// Filter and router shapes the scheduler refuses (src/run/scheduler.ts).
|
|
102
|
+
const fallbackStart = m.branch.length > 0 && (() => {
|
|
103
|
+
const b = m.branch[m.branch.length - 1];
|
|
104
|
+
const router = byId.get(b.owner);
|
|
105
|
+
return router?.elseRoute === b.index && plan.modules.find((x) => JSON.stringify(x.branch) === JSON.stringify(m.branch)) === m;
|
|
106
|
+
})();
|
|
107
|
+
if (m.filter && !fallbackStart && (m.filter.conditions.length === 0 || m.filter.conditions.some((g) => g.length === 0))) {
|
|
108
|
+
add({ code: 'FILTER_SHAPE_UNSUPPORTED', severity: 'unsupported', message: `Module ${m.id}: a filter with an empty condition group has not been observed in Make`, pointer: `${m.pointer}/filter` });
|
|
109
|
+
}
|
|
110
|
+
if (fallbackStart && m.filter?.conditions.some((g) => g.length > 0)) {
|
|
111
|
+
add({ code: 'FILTER_SHAPE_UNSUPPORTED', severity: 'unsupported', message: `Module ${m.id}: a fallback route with its own conditions has not been observed in Make`, pointer: `${m.pointer}/filter` });
|
|
112
|
+
}
|
|
113
|
+
if (m.module === 'builtin:BasicRouter') {
|
|
114
|
+
const count = m.routeCount ?? 0;
|
|
115
|
+
if (count === 0)
|
|
116
|
+
add({ code: 'ROUTER_SHAPE_UNSUPPORTED', severity: 'unsupported', message: `Router ${m.id} has no routes; a router with nothing attached has not been observed in Make`, pointer: m.pointer });
|
|
117
|
+
if (m.elseRoute !== undefined && m.elseRoute !== count - 1)
|
|
118
|
+
add({ code: 'ROUTER_SHAPE_UNSUPPORTED', severity: 'unsupported', message: `Router ${m.id}: a fallback that is not the last route has not been observed in Make`, pointer: `${m.pointer}/parameters` });
|
|
119
|
+
for (let r = 0; r < count; r++) {
|
|
120
|
+
if (!plan.modules.some((x) => x.branch.length === m.branch.length + 1 && x.branch.at(-1)?.owner === m.id && x.branch.at(-1)?.index === r)) {
|
|
121
|
+
add({ code: 'ROUTER_SHAPE_UNSUPPORTED', severity: 'unsupported', message: `Router ${m.id}: route ${r + 1} is empty; an empty route has not been observed in Make`, pointer: `${m.pointer}/routes/${r}` });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (m.hasErrorHandler) {
|
|
126
|
+
add({ code: 'ERROR_HANDLER_UNSUPPORTED', severity: 'unsupported', message: `Module ${m.id} has an error-handler route; error handlers are not supported yet`, pointer: `${m.pointer}/onerror` });
|
|
127
|
+
}
|
|
128
|
+
// Iterator structure the scheduler can run (src/run/scheduler.ts runIteration, corpus C):
|
|
129
|
+
// iterator → Set variable modules → optional Text aggregator, all in the same flow.
|
|
130
|
+
const sameFlow = (x) => JSON.stringify(x.branch) === JSON.stringify(m.branch);
|
|
131
|
+
if (m.module === 'util:TextAggregator') {
|
|
132
|
+
const feeder = m.parameters['feeder'];
|
|
133
|
+
const source = typeof feeder === 'number' ? byId.get(feeder) : undefined;
|
|
134
|
+
const fromTrigger = source !== undefined && source === trigger && m.branch.length === 0; // T-04
|
|
135
|
+
if (!source || (!fromTrigger && (!m.upstream.includes(source.id) || source.module !== 'builtin:BasicFeeder' || !sameFlow(source)))) {
|
|
136
|
+
add({ code: 'AGGREGATOR_SOURCE_UNSUPPORTED', severity: 'unsupported', message: `Aggregator ${m.id}: only an iterator earlier in the same flow, or the trigger, as the source is supported, got ${JSON.stringify(feeder ?? null)}`, pointer: `${m.pointer}/parameters/feeder` });
|
|
137
|
+
}
|
|
138
|
+
if (fromTrigger) {
|
|
139
|
+
for (const x of plan.modules) {
|
|
140
|
+
if (x.order > trigger.order && x.order < m.order && x.branch.length === 0 && x.module !== 'util:SetVariable2') {
|
|
141
|
+
add({ code: 'ITERATOR_SCOPE_UNSUPPORTED', severity: 'unsupported', message: `Module ${x.id} (${x.module}) runs once per trigger bundle before aggregator ${m.id}: only Set variable has recorded Make behavior there`, pointer: x.pointer });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (!['other', '\n', '\t'].includes(m.parameters['rowSeparator'])) {
|
|
146
|
+
add({ code: 'AGGREGATOR_SEPARATOR_UNSUPPORTED', severity: 'unsupported', message: `Aggregator ${m.id}: row separator ${JSON.stringify(m.parameters['rowSeparator'] ?? null)} has no recorded Make behavior yet`, pointer: `${m.pointer}/parameters/rowSeparator` });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (m.module === 'builtin:BasicFeeder') {
|
|
150
|
+
const aggregator = plan.modules.find((x) => x.module === 'util:TextAggregator' && x.parameters['feeder'] === m.id && x.order > m.order && sameFlow(x));
|
|
151
|
+
// Without an aggregator, the rest of the flow runs once per bundle (C2-noagg).
|
|
152
|
+
const end = aggregator?.order ?? Infinity;
|
|
153
|
+
for (const x of plan.modules) {
|
|
154
|
+
if (x.order > m.order && x.order < end && sameFlow(x) && x.module !== 'util:SetVariable2') {
|
|
155
|
+
add({ code: 'ITERATOR_SCOPE_UNSUPPORTED', severity: 'unsupported', message: `Module ${x.id} (${x.module}) runs once per bundle of iterator ${m.id}: only Set variable has recorded Make behavior there`, pointer: x.pointer });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const operators = [];
|
|
160
|
+
m.filter?.conditions.forEach((group, gi) => group.forEach((c, ci) => {
|
|
161
|
+
operators.push(c.o);
|
|
162
|
+
opCounts.set(c.o, (opCounts.get(c.o) ?? 0) + 1);
|
|
163
|
+
if (!(c.o in FILTER_OPERATORS)) {
|
|
164
|
+
add({ code: 'FILTER_OPERATOR_UNSUPPORTED', severity: 'unsupported', message: `Module ${m.id}: filter operator "${c.o}" has no recorded Make behavior yet`, pointer: `${m.pointer}/filter/conditions/${gi}/${ci}/o` });
|
|
165
|
+
}
|
|
166
|
+
}));
|
|
167
|
+
const im = {
|
|
168
|
+
order: m.order,
|
|
169
|
+
id: m.id,
|
|
170
|
+
module: m.module,
|
|
171
|
+
version: m.version,
|
|
172
|
+
where: describeWhere(m, byId),
|
|
173
|
+
pointer: m.pointer,
|
|
174
|
+
supported: (Boolean(support) && versionOk) || opaque,
|
|
175
|
+
evidence: support?.evidence ?? null,
|
|
176
|
+
filter: m.filter ? { label: m.filter.label, operators } : null,
|
|
177
|
+
};
|
|
178
|
+
if (m.routeCount !== undefined)
|
|
179
|
+
im.routeCount = m.routeCount;
|
|
180
|
+
if (m.elseRoute !== undefined)
|
|
181
|
+
im.elseRoute = m.elseRoute;
|
|
182
|
+
report.modules.push(im);
|
|
183
|
+
// Expressions: mapper, parameters and filter operands.
|
|
184
|
+
const sources = [
|
|
185
|
+
[m.mapper, `${m.pointer}/mapper`],
|
|
186
|
+
[m.parameters, `${m.pointer}/parameters`],
|
|
187
|
+
];
|
|
188
|
+
m.filter?.conditions.forEach((g, gi) => g.forEach((c, ci) => {
|
|
189
|
+
sources.push([c.a, `${m.pointer}/filter/conditions/${gi}/${ci}/a`]);
|
|
190
|
+
if (c.b !== undefined)
|
|
191
|
+
sources.push([c.b, `${m.pointer}/filter/conditions/${gi}/${ci}/b`]);
|
|
192
|
+
}));
|
|
193
|
+
for (const [value, base] of sources) {
|
|
194
|
+
for (const [s, pointer] of strings(value, base)) {
|
|
195
|
+
if (!s.includes('{{'))
|
|
196
|
+
continue;
|
|
197
|
+
const scanned = scanTemplate(s);
|
|
198
|
+
for (const e of scanned.errors) {
|
|
199
|
+
add({ code: 'EXPRESSION_UNTERMINATED', severity: 'unsupported', message: `Module ${m.id}: ${e.message} (Make's handling of this is unknown)`, pointer });
|
|
200
|
+
}
|
|
201
|
+
for (const x of scanned.exprs) {
|
|
202
|
+
try {
|
|
203
|
+
parseExpression(x.text, x.start + 2);
|
|
204
|
+
}
|
|
205
|
+
catch (e) {
|
|
206
|
+
// Not "invalid": Make accepts a scenario with an expression it cannot read and
|
|
207
|
+
// only fails when it runs (corpus NOTES, D2 safety), so the file is still valid.
|
|
208
|
+
if (e instanceof ExprSyntaxError)
|
|
209
|
+
add({ code: 'EXPRESSION_SYNTAX', severity: 'unsupported', message: `Module ${m.id}: {{${x.text.length > 120 ? `${x.text.slice(0, 120)}…` : x.text}}}: bpr cannot read this (${e.message} at character ${e.offset + 1}); how Make reads it has not been recorded`, pointer });
|
|
210
|
+
else if (e instanceof UnsupportedError)
|
|
211
|
+
add({ code: 'EXPRESSION_UNSUPPORTED', severity: 'unsupported', message: `Module ${m.id}: {{${x.text}}}: ${e.message}`, pointer });
|
|
212
|
+
else
|
|
213
|
+
throw e;
|
|
214
|
+
}
|
|
215
|
+
report.expressions.push({ moduleId: m.id, pointer, text: x.text, refs: x.refs, functions: x.functions, keywords: x.keywords, bareWords: x.bareWords });
|
|
216
|
+
for (const f of x.functions)
|
|
217
|
+
fnCounts.set(f, (fnCounts.get(f) ?? 0) + 1);
|
|
218
|
+
for (const k of x.keywords) {
|
|
219
|
+
if (!(k in KEYWORDS))
|
|
220
|
+
add({ code: 'KEYWORD_UNSUPPORTED', severity: 'unsupported', message: `Module ${m.id}: keyword "${k}" has no recorded Make behavior yet`, pointer });
|
|
221
|
+
else if (k === 'now') {
|
|
222
|
+
// Recorded only in a module's mapping, where it is the time the module starts (N-01).
|
|
223
|
+
if (pointer.includes('/filter/') || m.module === 'util:TextAggregator') {
|
|
224
|
+
add({ code: 'KEYWORD_UNSUPPORTED', severity: 'unsupported', message: `Module ${m.id}: "now" in a ${m.module === 'util:TextAggregator' ? 'Text aggregator' : 'filter'} has not been observed in Make (only in a module's mapping)`, pointer });
|
|
225
|
+
}
|
|
226
|
+
else
|
|
227
|
+
report.needsClock = true;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
for (const r of x.refs) {
|
|
231
|
+
if (!byId.has(r.moduleId)) {
|
|
232
|
+
add({ code: 'REF_UNKNOWN_MODULE', severity: 'unsupported', message: `Module ${m.id} references {{${r.moduleId}.${r.path}}}, but there is no module ${r.moduleId} (left over from a deleted module?); what Make reads there has not been recorded`, pointer });
|
|
233
|
+
}
|
|
234
|
+
else if (!m.upstream.includes(r.moduleId)) {
|
|
235
|
+
add({ code: 'REF_NOT_UPSTREAM', severity: 'unsupported', message: `Module ${m.id} references module ${r.moduleId}, which does not run before it on this path; what Make reads there has not been recorded`, pointer });
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
report.functions = [...fnCounts].sort().map(([name, count]) => ({ name, count, supported: name in FUNCTIONS }));
|
|
243
|
+
for (const f of report.functions) {
|
|
244
|
+
if (!f.supported)
|
|
245
|
+
add({ code: 'FUNCTION_UNSUPPORTED', severity: 'unsupported', message: `Function ${f.name}() is used ${f.count}× and has no recorded Make behavior yet` });
|
|
246
|
+
}
|
|
247
|
+
report.filterOperators = [...opCounts].sort().map(([operator, count]) => ({ operator, count, supported: operator in FILTER_OPERATORS }));
|
|
248
|
+
}
|
|
249
|
+
if (findings.some((f) => f.severity === 'error')) {
|
|
250
|
+
report.verdict = 'invalid';
|
|
251
|
+
report.exitCode = EXIT.invalidInput;
|
|
252
|
+
}
|
|
253
|
+
else if (findings.some((f) => f.severity === 'unsupported')) {
|
|
254
|
+
report.verdict = 'unsupported';
|
|
255
|
+
report.exitCode = EXIT.unsupported;
|
|
256
|
+
}
|
|
257
|
+
return report;
|
|
258
|
+
}
|
|
259
|
+
export function renderInspect(r) {
|
|
260
|
+
const out = [];
|
|
261
|
+
const short = (h) => (h ? h.slice(0, 12) : '-');
|
|
262
|
+
out.push(`${r.file}`);
|
|
263
|
+
out.push(` format ${r.format} ${r.bytes} bytes sha256 ${short(r.sha256)} semantic ${short(r.semanticHash)}`);
|
|
264
|
+
if (r.name)
|
|
265
|
+
out.push(` name ${r.name}`);
|
|
266
|
+
if (r.modules.length) {
|
|
267
|
+
out.push('', ` modules (${r.modules.length})`);
|
|
268
|
+
const w = Math.max(...r.modules.map((m) => `${m.module} v${m.version}`.length));
|
|
269
|
+
for (const m of r.modules) {
|
|
270
|
+
const mod = `${m.module} v${m.version}`.padEnd(w);
|
|
271
|
+
const extra = [
|
|
272
|
+
m.routeCount !== undefined ? `${m.routeCount} routes${m.elseRoute !== undefined ? `, fallback = route ${m.elseRoute + 1}` : ''}` : '',
|
|
273
|
+
m.filter ? `filter${m.filter.label ? ` "${m.filter.label}"` : ''}: ${m.filter.operators.join(', ') || 'none'}` : '',
|
|
274
|
+
].filter(Boolean);
|
|
275
|
+
out.push(` ${m.supported ? 'ok ' : 'NO '} ${String(m.id).padStart(3)} ${mod} ${m.where}${extra.length ? ` [${extra.join('; ')}]` : ''}`);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
if (r.expressions.length) {
|
|
279
|
+
out.push('', ` expressions (${r.expressions.length})`);
|
|
280
|
+
const shown = r.expressions.slice(0, 25);
|
|
281
|
+
for (const e of shown) {
|
|
282
|
+
const text = e.text.length > 70 ? `${e.text.slice(0, 67)}...` : e.text;
|
|
283
|
+
out.push(` ${String(e.moduleId).padStart(3)} {{${text}}}`);
|
|
284
|
+
}
|
|
285
|
+
if (r.expressions.length > shown.length)
|
|
286
|
+
out.push(` ... ${r.expressions.length - shown.length} more (use --json for all)`);
|
|
287
|
+
const bare = [...new Set(r.expressions.flatMap((e) => e.bareWords))];
|
|
288
|
+
if (bare.length)
|
|
289
|
+
out.push(` bare words (not strings in Make; check these): ${bare.join(', ')}`);
|
|
290
|
+
}
|
|
291
|
+
if (r.functions.length)
|
|
292
|
+
out.push('', ` functions ${r.functions.map((f) => `${f.supported ? '' : '!'}${f.name}×${f.count}`).join(' ')}`);
|
|
293
|
+
if (r.filterOperators.length)
|
|
294
|
+
out.push(` operators ${r.filterOperators.map((o) => `${o.supported ? '' : '!'}${o.operator}×${o.count}`).join(' ')}`);
|
|
295
|
+
if (r.findings.length) {
|
|
296
|
+
out.push('', ` findings (${r.findings.length})`);
|
|
297
|
+
for (const f of r.findings) {
|
|
298
|
+
const where = f.loc ? ` (line ${f.loc.line}:${f.loc.column})` : '';
|
|
299
|
+
out.push(` ${f.severity.padEnd(11)} ${f.code}${where}`);
|
|
300
|
+
out.push(` ${f.message}`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
const verdictText = {
|
|
304
|
+
eligible: r.fixtures.length
|
|
305
|
+
? `ELIGIBLE WITH FIXTURES: runs offline once ${r.fixtures.length} module${r.fixtures.length > 1 ? 's get fixtures' : ' gets a fixture'} (${r.fixtures.map((f) => `${f.moduleId} ${f.mode}`).join(', ')}); everything else has recorded Make behavior`
|
|
306
|
+
: 'ELIGIBLE: every module, operator and function here has recorded Make behavior',
|
|
307
|
+
unsupported: 'NOT YET SUPPORTED: uses things without recorded Make behavior (see findings)',
|
|
308
|
+
invalid: 'INVALID: the file has errors (see findings)',
|
|
309
|
+
}[r.verdict];
|
|
310
|
+
out.push('', ` ${verdictText}`);
|
|
311
|
+
return out.join('\n');
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/inspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
export class JsonParseError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
loc;
|
|
4
|
+
pointer;
|
|
5
|
+
constructor(code, message, loc, pointer) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'JsonParseError';
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.loc = loc;
|
|
10
|
+
this.pointer = pointer;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function escapePointerToken(token) {
|
|
14
|
+
return String(token).replaceAll('~', '~0').replaceAll('/', '~1');
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Strict RFC 8259 JSON parser. Unlike JSON.parse it rejects duplicate object keys
|
|
18
|
+
* (JSON.parse silently keeps the last one), enforces a nesting limit, and records
|
|
19
|
+
* where each value starts so findings can point at a line and column.
|
|
20
|
+
*
|
|
21
|
+
* Numbers become IEEE-754 doubles, which matches what Make's webhook parser was
|
|
22
|
+
* observed to do (corpus C-16: 9007199254740993 arrived as 9007199254740992).
|
|
23
|
+
*/
|
|
24
|
+
export function parseJson(text, maxDepth) {
|
|
25
|
+
const lineStarts = [0];
|
|
26
|
+
for (let i = 0; i < text.length; i++)
|
|
27
|
+
if (text.charCodeAt(i) === 10)
|
|
28
|
+
lineStarts.push(i + 1);
|
|
29
|
+
const locate = (offset) => {
|
|
30
|
+
let lo = 0;
|
|
31
|
+
let hi = lineStarts.length - 1;
|
|
32
|
+
while (lo < hi) {
|
|
33
|
+
const mid = (lo + hi + 1) >> 1;
|
|
34
|
+
if (lineStarts[mid] <= offset)
|
|
35
|
+
lo = mid;
|
|
36
|
+
else
|
|
37
|
+
hi = mid - 1;
|
|
38
|
+
}
|
|
39
|
+
return { line: lo + 1, column: offset - lineStarts[lo] + 1, offset };
|
|
40
|
+
};
|
|
41
|
+
const offsets = new Map();
|
|
42
|
+
let pos = text.charCodeAt(0) === 0xfeff ? 1 : 0;
|
|
43
|
+
const fail = (code, message, at = pos, pointer) => {
|
|
44
|
+
throw new JsonParseError(code, message, locate(at), pointer);
|
|
45
|
+
};
|
|
46
|
+
const skipWs = () => {
|
|
47
|
+
while (pos < text.length) {
|
|
48
|
+
const c = text.charCodeAt(pos);
|
|
49
|
+
if (c === 32 || c === 9 || c === 10 || c === 13)
|
|
50
|
+
pos++;
|
|
51
|
+
else
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
const describe = (at) => (at >= text.length ? 'end of input' : JSON.stringify(text[at]));
|
|
56
|
+
const parseString = () => {
|
|
57
|
+
const start = pos;
|
|
58
|
+
pos++; // opening quote
|
|
59
|
+
let out = '';
|
|
60
|
+
let chunk = pos;
|
|
61
|
+
while (true) {
|
|
62
|
+
if (pos >= text.length)
|
|
63
|
+
fail('JSON_UNTERMINATED_STRING', 'Unterminated string', start);
|
|
64
|
+
const c = text.charCodeAt(pos);
|
|
65
|
+
if (c === 34) {
|
|
66
|
+
out += text.slice(chunk, pos);
|
|
67
|
+
pos++;
|
|
68
|
+
return out;
|
|
69
|
+
}
|
|
70
|
+
if (c < 0x20)
|
|
71
|
+
fail('JSON_CONTROL_CHAR', 'Unescaped control character in string');
|
|
72
|
+
if (c === 92) {
|
|
73
|
+
out += text.slice(chunk, pos);
|
|
74
|
+
const e = text[pos + 1];
|
|
75
|
+
switch (e) {
|
|
76
|
+
case '"':
|
|
77
|
+
out += '"';
|
|
78
|
+
break;
|
|
79
|
+
case '\\':
|
|
80
|
+
out += '\\';
|
|
81
|
+
break;
|
|
82
|
+
case '/':
|
|
83
|
+
out += '/';
|
|
84
|
+
break;
|
|
85
|
+
case 'b':
|
|
86
|
+
out += '\b';
|
|
87
|
+
break;
|
|
88
|
+
case 'f':
|
|
89
|
+
out += '\f';
|
|
90
|
+
break;
|
|
91
|
+
case 'n':
|
|
92
|
+
out += '\n';
|
|
93
|
+
break;
|
|
94
|
+
case 'r':
|
|
95
|
+
out += '\r';
|
|
96
|
+
break;
|
|
97
|
+
case 't':
|
|
98
|
+
out += '\t';
|
|
99
|
+
break;
|
|
100
|
+
case 'u': {
|
|
101
|
+
const hex = text.slice(pos + 2, pos + 6);
|
|
102
|
+
if (!/^[0-9a-fA-F]{4}$/.test(hex))
|
|
103
|
+
fail('JSON_BAD_ESCAPE', 'Invalid \\u escape');
|
|
104
|
+
out += String.fromCharCode(parseInt(hex, 16));
|
|
105
|
+
pos += 4;
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
default:
|
|
109
|
+
fail('JSON_BAD_ESCAPE', `Invalid escape \\${e ?? ''}`);
|
|
110
|
+
}
|
|
111
|
+
pos += 2;
|
|
112
|
+
chunk = pos;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
pos++;
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
const NUMBER = /-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/y;
|
|
119
|
+
const parseValue = (pointer, depth) => {
|
|
120
|
+
skipWs();
|
|
121
|
+
offsets.set(pointer, pos);
|
|
122
|
+
const c = text[pos];
|
|
123
|
+
if (c === '{' || c === '[') {
|
|
124
|
+
if (depth >= maxDepth)
|
|
125
|
+
fail('JSON_TOO_DEEP', `Nesting deeper than ${maxDepth} levels`, pos, pointer);
|
|
126
|
+
}
|
|
127
|
+
if (c === '{') {
|
|
128
|
+
pos++;
|
|
129
|
+
const obj = Object.create(null);
|
|
130
|
+
const seen = new Set();
|
|
131
|
+
skipWs();
|
|
132
|
+
if (text[pos] === '}') {
|
|
133
|
+
pos++;
|
|
134
|
+
return obj;
|
|
135
|
+
}
|
|
136
|
+
while (true) {
|
|
137
|
+
skipWs();
|
|
138
|
+
if (text[pos] !== '"')
|
|
139
|
+
fail('JSON_SYNTAX', `Expected a property name, found ${describe(pos)}`);
|
|
140
|
+
const keyAt = pos;
|
|
141
|
+
const key = parseString();
|
|
142
|
+
const child = `${pointer}/${escapePointerToken(key)}`;
|
|
143
|
+
if (seen.has(key)) {
|
|
144
|
+
fail('JSON_DUPLICATE_KEY', `Duplicate key ${JSON.stringify(key)}; JSON.parse would silently keep the last one`, keyAt, child);
|
|
145
|
+
}
|
|
146
|
+
seen.add(key);
|
|
147
|
+
skipWs();
|
|
148
|
+
if (text[pos] !== ':')
|
|
149
|
+
fail('JSON_SYNTAX', `Expected ":" after property name, found ${describe(pos)}`);
|
|
150
|
+
pos++;
|
|
151
|
+
obj[key] = parseValue(child, depth + 1);
|
|
152
|
+
skipWs();
|
|
153
|
+
if (text[pos] === ',') {
|
|
154
|
+
pos++;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
if (text[pos] === '}') {
|
|
158
|
+
pos++;
|
|
159
|
+
return obj;
|
|
160
|
+
}
|
|
161
|
+
fail('JSON_SYNTAX', `Expected "," or "}", found ${describe(pos)}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (c === '[') {
|
|
165
|
+
pos++;
|
|
166
|
+
const arr = [];
|
|
167
|
+
skipWs();
|
|
168
|
+
if (text[pos] === ']') {
|
|
169
|
+
pos++;
|
|
170
|
+
return arr;
|
|
171
|
+
}
|
|
172
|
+
while (true) {
|
|
173
|
+
arr.push(parseValue(`${pointer}/${arr.length}`, depth + 1));
|
|
174
|
+
skipWs();
|
|
175
|
+
if (text[pos] === ',') {
|
|
176
|
+
pos++;
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
if (text[pos] === ']') {
|
|
180
|
+
pos++;
|
|
181
|
+
return arr;
|
|
182
|
+
}
|
|
183
|
+
fail('JSON_SYNTAX', `Expected "," or "]", found ${describe(pos)}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (c === '"')
|
|
187
|
+
return parseString();
|
|
188
|
+
if (text.startsWith('true', pos)) {
|
|
189
|
+
pos += 4;
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
if (text.startsWith('false', pos)) {
|
|
193
|
+
pos += 5;
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
if (text.startsWith('null', pos)) {
|
|
197
|
+
pos += 4;
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
NUMBER.lastIndex = pos;
|
|
201
|
+
const m = NUMBER.exec(text);
|
|
202
|
+
if (m) {
|
|
203
|
+
pos += m[0].length;
|
|
204
|
+
return Number(m[0]);
|
|
205
|
+
}
|
|
206
|
+
return fail('JSON_SYNTAX', `Unexpected ${describe(pos)}`);
|
|
207
|
+
};
|
|
208
|
+
const value = parseValue('', 0);
|
|
209
|
+
skipWs();
|
|
210
|
+
if (pos < text.length)
|
|
211
|
+
fail('JSON_SYNTAX', `Unexpected ${describe(pos)} after the document`);
|
|
212
|
+
return {
|
|
213
|
+
value,
|
|
214
|
+
offsets,
|
|
215
|
+
locate,
|
|
216
|
+
locatePointer(pointer) {
|
|
217
|
+
const at = offsets.get(pointer);
|
|
218
|
+
return at === undefined ? undefined : locate(at);
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
export function isObject(v) {
|
|
223
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../src/json/parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What this runtime has real Make evidence for. An entry exists only when the
|
|
3
|
+
* behavior was observed in a real Make run captured in corpus/ (see
|
|
4
|
+
* corpus/NOTES.md). Anything else is reported as unsupported; there is no
|
|
5
|
+
* best-effort fallback (spec BR-010).
|
|
6
|
+
*
|
|
7
|
+
* "evidence" names the corpus cases that exercised the item.
|
|
8
|
+
*/
|
|
9
|
+
import { FUNCTIONS as ENGINE_FUNCTIONS } from './expr/functions.js';
|
|
10
|
+
import { OPERATORS as ENGINE_OPERATORS } from './run/operators.js';
|
|
11
|
+
export const MODULES = {
|
|
12
|
+
'gateway:CustomWebHook': { versions: [1], role: 'trigger', evidence: 'A-001, B-*, C-*, D-*' },
|
|
13
|
+
'gateway:WebhookRespond': { versions: [1], role: 'responder', evidence: 'A-001, C-*, D-*' },
|
|
14
|
+
'util:SetVariable2': { versions: [1], role: 'action', evidence: 'A-001, B-*, C-*' },
|
|
15
|
+
'builtin:BasicRouter': { versions: [1], role: 'router', evidence: 'B-01..B-16' },
|
|
16
|
+
'builtin:BasicFeeder': { versions: [1], role: 'iterator', evidence: 'C-01..C-16' },
|
|
17
|
+
'util:TextAggregator': { versions: [1], role: 'aggregator', evidence: 'C-01..C-16, C2-*' },
|
|
18
|
+
'http:ActionSendData': { versions: [3], role: 'http', fixture: 'http', evidence: 'E-*' },
|
|
19
|
+
'util:BasicTrigger': { versions: [1], role: 'trigger', evidence: 'T-01..T-08' },
|
|
20
|
+
'util:FunctionSleep': { versions: [1], role: 'action', evidence: 'N-01' },
|
|
21
|
+
};
|
|
22
|
+
/** Filter operators the scheduler implements (src/run/operators.ts), each matched against recorded Make runs. */
|
|
23
|
+
export const FILTER_OPERATORS = Object.fromEntries(Object.keys(ENGINE_OPERATORS).map((o) => [o, 'corpus B, C, F']));
|
|
24
|
+
/**
|
|
25
|
+
* Functions the expression engine implements. Each one was replayed against real Make
|
|
26
|
+
* output by the scenario D conformance tests (test/conformance-d.test.ts).
|
|
27
|
+
*/
|
|
28
|
+
export const FUNCTIONS = Object.fromEntries(Object.keys(ENGINE_FUNCTIONS).map((f) => [f, 'D-01..D-06 replay']));
|
|
29
|
+
/** Bare keywords whose value was observed in a real Make run. */
|
|
30
|
+
export const KEYWORDS = {
|
|
31
|
+
true: 'D-01..D-06',
|
|
32
|
+
false: 'D-01..D-06',
|
|
33
|
+
emptystring: 'D-01..D-06',
|
|
34
|
+
space: 'D-01..D-06',
|
|
35
|
+
now: 'D3, N-01 (needs a clock: environment.now)',
|
|
36
|
+
};
|
|
37
|
+
/** Keys a module object may carry in an exported blueprint. Others are reported. */
|
|
38
|
+
export const KNOWN_MODULE_KEYS = new Set(['id', 'module', 'version', 'parameters', 'mapper', 'metadata', 'filter', 'routes', 'onerror']);
|
|
39
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAUnE,MAAM,CAAC,MAAM,OAAO,GAA4C;IAC9D,uBAAuB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,sBAAsB,EAAE;IAC7F,wBAAwB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,iBAAiB,EAAE;IAC3F,mBAAmB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE;IACnF,qBAAqB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE;IAChF,qBAAqB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE;IAClF,qBAAqB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE;IAC1F,qBAAqB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;IACxF,mBAAmB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE;IAC/E,oBAAoB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE;CAC1E,CAAC;AAEF,iHAAiH;AACjH,MAAM,CAAC,MAAM,gBAAgB,GAAqC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAEtJ;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAqC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;AAElJ,iEAAiE;AACjE,MAAM,CAAC,MAAM,QAAQ,GAAqC;IACxD,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE,YAAY;IACnB,WAAW,EAAE,YAAY;IACzB,KAAK,EAAE,YAAY;IACnB,GAAG,EAAE,2CAA2C;CACjD,CAAC;AAEF,oFAAoF;AACpF,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC"}
|