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,228 @@
|
|
|
1
|
+
import { ExprSyntaxError, UnsupportedError } from './errors.js';
|
|
2
|
+
import { scanTemplate } from './scan.js';
|
|
3
|
+
const OPS = ['!=', '<=', '>=', '=', '<', '>', '+', '-', '*', '/', '%', '&', '|', '!', '(', ')', ';', '[', ']', '.'];
|
|
4
|
+
function lex(src, base) {
|
|
5
|
+
const toks = [];
|
|
6
|
+
let i = 0;
|
|
7
|
+
while (i < src.length) {
|
|
8
|
+
const ch = src[i];
|
|
9
|
+
if (/\s/.test(ch)) {
|
|
10
|
+
i++;
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
const s = base + i;
|
|
14
|
+
if (/\d/.test(ch)) {
|
|
15
|
+
const digits = /^\d+/.exec(src.slice(i))[0];
|
|
16
|
+
const after = src[i + digits.length];
|
|
17
|
+
const next = src[i + digits.length + 1];
|
|
18
|
+
if (after === '.' && next !== undefined && /[A-Za-z_$`]/.test(next)) {
|
|
19
|
+
toks.push({ t: 'ref', v: Number(digits), s, e: s + digits.length });
|
|
20
|
+
i += digits.length;
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
const m = /^\d+(?:\.\d+)?(?:[eE][+-]?\d+)?/.exec(src.slice(i))[0];
|
|
24
|
+
toks.push({ t: 'num', v: Number(m), s, e: s + m.length });
|
|
25
|
+
i += m.length;
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (ch === '"') {
|
|
29
|
+
const close = src.indexOf('"', i + 1);
|
|
30
|
+
if (close === -1)
|
|
31
|
+
throw new ExprSyntaxError('Unterminated string', s);
|
|
32
|
+
// A backslash is not an escape: a string ends at the next quote. Make rejected
|
|
33
|
+
// the expression "a\"b" as invalid (corpus D2), which is what this reading gives.
|
|
34
|
+
toks.push({ t: 'str', v: src.slice(i + 1, close), s, e: base + close + 1 });
|
|
35
|
+
i = close + 1;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (ch === '`') {
|
|
39
|
+
const close = src.indexOf('`', i + 1);
|
|
40
|
+
if (close === -1)
|
|
41
|
+
throw new ExprSyntaxError('Unterminated `name`', s);
|
|
42
|
+
toks.push({ t: 'tick', v: src.slice(i + 1, close), s, e: base + close + 1 });
|
|
43
|
+
i = close + 1;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (/[A-Za-z_]/.test(ch)) {
|
|
47
|
+
const m = /^[A-Za-z_]\w*/.exec(src.slice(i))[0];
|
|
48
|
+
toks.push({ t: 'ident', v: m, s, e: s + m.length });
|
|
49
|
+
i += m.length;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const op = OPS.find((o) => src.startsWith(o, i));
|
|
53
|
+
if (op) {
|
|
54
|
+
toks.push({ t: 'op', v: op, s, e: s + op.length });
|
|
55
|
+
i += op.length;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
throw new ExprSyntaxError(`Unexpected character ${JSON.stringify(ch)}`, s);
|
|
59
|
+
}
|
|
60
|
+
toks.push({ t: 'eof', s: base + src.length, e: base + src.length });
|
|
61
|
+
return toks;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Lowest to highest precedence, all left-associative. Matches every Make result in
|
|
65
|
+
* corpus D2: 1 + 2 * 3 = 7, 10 - 4 - 3 = 3, 2 * 3 % 4 = 2, true | false & false = true,
|
|
66
|
+
* 1 + 2 = 3 is true.
|
|
67
|
+
*/
|
|
68
|
+
const LEVELS = [['|'], ['&'], ['=', '!='], ['<', '>', '<=', '>='], ['+', '-'], ['*', '/', '%']];
|
|
69
|
+
/**
|
|
70
|
+
* Parse one expression (the text inside {{ }}). `base` is the offset of that text
|
|
71
|
+
* in the whole field, so errors point at the right place.
|
|
72
|
+
*/
|
|
73
|
+
export function parseExpression(src, base = 0) {
|
|
74
|
+
const toks = lex(src, base);
|
|
75
|
+
let p = 0;
|
|
76
|
+
const peek = () => toks[p];
|
|
77
|
+
const isOp = (v) => {
|
|
78
|
+
const t = peek();
|
|
79
|
+
return t.t === 'op' && t.v === v;
|
|
80
|
+
};
|
|
81
|
+
const expectOp = (v) => {
|
|
82
|
+
if (!isOp(v))
|
|
83
|
+
throw new ExprSyntaxError(`Expected "${v}"`, peek().s);
|
|
84
|
+
return toks[p++];
|
|
85
|
+
};
|
|
86
|
+
const parseLevel = (level) => {
|
|
87
|
+
if (level === LEVELS.length)
|
|
88
|
+
return parseUnary();
|
|
89
|
+
let left = parseLevel(level + 1);
|
|
90
|
+
while (true) {
|
|
91
|
+
const t = peek();
|
|
92
|
+
if (t.t !== 'op' || !LEVELS[level].includes(t.v))
|
|
93
|
+
return left;
|
|
94
|
+
p++;
|
|
95
|
+
const right = parseLevel(level + 1);
|
|
96
|
+
left = { type: 'binary', op: t.v, left, right, start: left.start, end: right.end };
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const parseUnary = () => {
|
|
100
|
+
const t = peek();
|
|
101
|
+
if (t.t === 'op' && t.v === '-') {
|
|
102
|
+
const next = toks[p + 1];
|
|
103
|
+
if (next.t === 'num') {
|
|
104
|
+
p += 2;
|
|
105
|
+
return { type: 'number', value: -next.v, start: t.s, end: next.e };
|
|
106
|
+
}
|
|
107
|
+
throw new UnsupportedError('unary minus on anything but a number literal has not been observed in Make');
|
|
108
|
+
}
|
|
109
|
+
if (t.t === 'op' && t.v === '!')
|
|
110
|
+
throw new UnsupportedError('the "!" operator has not been observed in Make');
|
|
111
|
+
if (t.t === 'op' && t.v === '/')
|
|
112
|
+
throw new UnsupportedError('regex literals like /o/g: Make ignored replace(s; /o/g; "0") in a real run, so their meaning is unknown');
|
|
113
|
+
return parsePrimary();
|
|
114
|
+
};
|
|
115
|
+
const parsePath = () => {
|
|
116
|
+
const path = [];
|
|
117
|
+
while (true) {
|
|
118
|
+
if (isOp('.')) {
|
|
119
|
+
p++;
|
|
120
|
+
const t = peek();
|
|
121
|
+
if (t.t === 'ident' || t.t === 'tick') {
|
|
122
|
+
p++;
|
|
123
|
+
path.push({ key: t.v });
|
|
124
|
+
}
|
|
125
|
+
else
|
|
126
|
+
throw new ExprSyntaxError('Expected a field name after "."', t.s);
|
|
127
|
+
}
|
|
128
|
+
else if (isOp('[')) {
|
|
129
|
+
p++;
|
|
130
|
+
const t = peek();
|
|
131
|
+
if (t.t === 'num' && Number.isInteger(t.v)) {
|
|
132
|
+
p++;
|
|
133
|
+
path.push({ index: t.v });
|
|
134
|
+
}
|
|
135
|
+
else if (t.t === 'op' && t.v === ']') {
|
|
136
|
+
path.push({ all: true });
|
|
137
|
+
}
|
|
138
|
+
else
|
|
139
|
+
throw new ExprSyntaxError('Expected a whole number or nothing inside [ ]', t.s);
|
|
140
|
+
expectOp(']');
|
|
141
|
+
}
|
|
142
|
+
else
|
|
143
|
+
return path;
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
const parsePrimary = () => {
|
|
147
|
+
const t = peek();
|
|
148
|
+
switch (t.t) {
|
|
149
|
+
case 'num':
|
|
150
|
+
p++;
|
|
151
|
+
return { type: 'number', value: t.v, start: t.s, end: t.e };
|
|
152
|
+
case 'str':
|
|
153
|
+
p++;
|
|
154
|
+
return { type: 'string', value: t.v, start: t.s, end: t.e };
|
|
155
|
+
case 'ref': {
|
|
156
|
+
p++;
|
|
157
|
+
const path = parsePath();
|
|
158
|
+
return { type: 'ref', moduleId: t.v, path, start: t.s, end: toks[p - 1].e };
|
|
159
|
+
}
|
|
160
|
+
case 'tick': {
|
|
161
|
+
p++;
|
|
162
|
+
if (/^\d+$/.test(t.v))
|
|
163
|
+
return { type: 'ref', moduleId: Number(t.v), path: parsePath(), start: t.s, end: toks[p - 1].e };
|
|
164
|
+
throw new ExprSyntaxError(`\`${t.v}\` on its own is not a reference`, t.s);
|
|
165
|
+
}
|
|
166
|
+
case 'ident': {
|
|
167
|
+
p++;
|
|
168
|
+
// var.organization.X, var.scenario.X, var.input.X are Make's custom variables and
|
|
169
|
+
// scenario inputs; other word.path forms (connection.x, parameters.x) appear in
|
|
170
|
+
// public blueprints too. None has been recorded.
|
|
171
|
+
if (isOp('.')) {
|
|
172
|
+
if (t.v === 'var')
|
|
173
|
+
throw new UnsupportedError('{{var.…}} reads a Make custom variable or scenario input; those are not supported yet');
|
|
174
|
+
throw new UnsupportedError(`"${t.v}.…" is not a module reference; how Make reads it has not been recorded`);
|
|
175
|
+
}
|
|
176
|
+
if (!isOp('('))
|
|
177
|
+
return { type: 'word', name: t.v, start: t.s, end: t.e };
|
|
178
|
+
p++;
|
|
179
|
+
const args = [];
|
|
180
|
+
if (isOp(')')) {
|
|
181
|
+
p++;
|
|
182
|
+
return { type: 'call', name: t.v, args, start: t.s, end: toks[p - 1].e };
|
|
183
|
+
}
|
|
184
|
+
while (true) {
|
|
185
|
+
args.push(parseLevel(0));
|
|
186
|
+
if (isOp(';')) {
|
|
187
|
+
p++;
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
const close = expectOp(')');
|
|
191
|
+
return { type: 'call', name: t.v, args, start: t.s, end: close.e };
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
case 'op':
|
|
195
|
+
if (t.v === '(') {
|
|
196
|
+
p++;
|
|
197
|
+
const inner = parseLevel(0);
|
|
198
|
+
const close = expectOp(')');
|
|
199
|
+
return { ...inner, paren: true, start: t.s, end: close.e };
|
|
200
|
+
}
|
|
201
|
+
throw new ExprSyntaxError(`Unexpected "${t.v}"`, t.s);
|
|
202
|
+
case 'eof':
|
|
203
|
+
throw new ExprSyntaxError('Unexpected end of expression', t.s);
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
const node = parseLevel(0);
|
|
207
|
+
if (peek().t !== 'eof')
|
|
208
|
+
throw new ExprSyntaxError('Unexpected text after the expression', peek().s);
|
|
209
|
+
return node;
|
|
210
|
+
}
|
|
211
|
+
/** Split a mapped field into literal text and parsed expressions. */
|
|
212
|
+
export function parseTemplate(field) {
|
|
213
|
+
const scanned = scanTemplate(field);
|
|
214
|
+
if (scanned.errors.length)
|
|
215
|
+
throw new ExprSyntaxError(scanned.errors[0].message, scanned.errors[0].offset);
|
|
216
|
+
const parts = [];
|
|
217
|
+
let at = 0;
|
|
218
|
+
for (const e of scanned.exprs) {
|
|
219
|
+
if (e.start > at)
|
|
220
|
+
parts.push({ text: field.slice(at, e.start) });
|
|
221
|
+
parts.push({ expr: parseExpression(e.text, e.start + 2), source: e.text });
|
|
222
|
+
at = e.end;
|
|
223
|
+
}
|
|
224
|
+
if (at < field.length)
|
|
225
|
+
parts.push({ text: field.slice(at) });
|
|
226
|
+
return parts;
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/expr/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Locates {{ ... }} expressions inside a mapped string and lists what they touch.
|
|
3
|
+
* This is a scanner, not the Day 4 parser: it never evaluates anything, it only
|
|
4
|
+
* finds expression boundaries, module references and function names so `inspect`
|
|
5
|
+
* can report them.
|
|
6
|
+
*/
|
|
7
|
+
/** Bare identifiers Make treats as values, seen in real Make runs (corpus D) or documented. */
|
|
8
|
+
const KEYWORDS = new Set(['true', 'false', 'null', 'emptystring', 'space', 'nbsp', 'tab', 'newline', 'carriagereturn', 'now', 'timestamp', 'random', 'uuid', 'pi', 'emptyarray']);
|
|
9
|
+
// 1.name, 1.`Field name`, 1.items[2].name, 22.array[].name (empty [] maps over the array; seen in public blueprints)
|
|
10
|
+
const REF = /(?<![\w.$`])(\d+)\.((?:`[^`]*`|[A-Za-z_$][\w$]*)(?:\.(?:`[^`]*`|[A-Za-z_$][\w$]*)|\[\d*\])*)/g;
|
|
11
|
+
// `22` on its own: the whole output bundle of module 22 (seen as an iterator source in public blueprints)
|
|
12
|
+
const WHOLE_REF = /(?<![\w.$])`(\d+)`(?![.\w])/g;
|
|
13
|
+
const CALL = /(?<![\w.$])([A-Za-z_][\w]*)\s*\(/g;
|
|
14
|
+
const IDENT = /(?<![\w.$`])([A-Za-z_][\w]*)(?![\w(.`])/g;
|
|
15
|
+
/**
|
|
16
|
+
* Replace double-quoted string contents with spaces so regexes don't match inside
|
|
17
|
+
* literals. A backslash is not an escape in Make: a string ends at the next quote.
|
|
18
|
+
*/
|
|
19
|
+
function blankStrings(s) {
|
|
20
|
+
let out = '';
|
|
21
|
+
let inStr = false;
|
|
22
|
+
for (let i = 0; i < s.length; i++) {
|
|
23
|
+
const ch = s[i];
|
|
24
|
+
if (inStr) {
|
|
25
|
+
if (ch === '"') {
|
|
26
|
+
inStr = false;
|
|
27
|
+
out += ch;
|
|
28
|
+
}
|
|
29
|
+
else
|
|
30
|
+
out += ' ';
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
if (ch === '"')
|
|
34
|
+
inStr = true;
|
|
35
|
+
out += ch;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
/** Also blank out regex literals like /o/g that appear as function arguments. */
|
|
41
|
+
function blankRegexLiterals(s) {
|
|
42
|
+
return s.replace(/(^|[;(]\s*)\/((?:\\.|[^/\\])+)\/([a-z]*)/g, (_m, pre, body, flags) => `${pre}/${' '.repeat(body.length)}/${' '.repeat(flags.length)}`);
|
|
43
|
+
}
|
|
44
|
+
export function scanTemplate(s) {
|
|
45
|
+
const exprs = [];
|
|
46
|
+
const errors = [];
|
|
47
|
+
let i = 0;
|
|
48
|
+
while (true) {
|
|
49
|
+
const open = s.indexOf('{{', i);
|
|
50
|
+
if (open === -1)
|
|
51
|
+
break;
|
|
52
|
+
let j = open + 2;
|
|
53
|
+
let depth = 0;
|
|
54
|
+
let inStr = false;
|
|
55
|
+
let close = -1;
|
|
56
|
+
for (; j < s.length; j++) {
|
|
57
|
+
const ch = s[j];
|
|
58
|
+
if (inStr) {
|
|
59
|
+
if (ch === '"')
|
|
60
|
+
inStr = false;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (ch === '"')
|
|
64
|
+
inStr = true;
|
|
65
|
+
else if (ch === '(')
|
|
66
|
+
depth++;
|
|
67
|
+
else if (ch === ')')
|
|
68
|
+
depth--;
|
|
69
|
+
else if (ch === '}' && s[j + 1] === '}' && depth <= 0) {
|
|
70
|
+
close = j;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (close === -1) {
|
|
75
|
+
errors.push({ message: inStr ? 'Unterminated string inside {{ }}' : depth > 0 ? 'Unclosed "(" inside {{ }}' : 'Missing closing "}}"', offset: open });
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
const text = s.slice(open + 2, close);
|
|
79
|
+
const code = blankRegexLiterals(blankStrings(text));
|
|
80
|
+
const refs = [];
|
|
81
|
+
const refSpans = [];
|
|
82
|
+
for (const m of code.matchAll(REF)) {
|
|
83
|
+
refs.push({ moduleId: Number(m[1]), path: text.slice(m.index + m[1].length + 1, m.index + m[0].length) });
|
|
84
|
+
refSpans.push([m.index, m.index + m[0].length]);
|
|
85
|
+
}
|
|
86
|
+
for (const m of code.matchAll(WHOLE_REF)) {
|
|
87
|
+
refs.push({ moduleId: Number(m[1]), path: '' });
|
|
88
|
+
refSpans.push([m.index, m.index + m[0].length]);
|
|
89
|
+
}
|
|
90
|
+
const functions = [...code.matchAll(CALL)].map((m) => m[1]);
|
|
91
|
+
const idents = [...code.matchAll(IDENT)]
|
|
92
|
+
.filter((m) => !refSpans.some(([a, b]) => m.index >= a && m.index < b))
|
|
93
|
+
.map((m) => m[1]);
|
|
94
|
+
const keywords = idents.filter((w) => KEYWORDS.has(w));
|
|
95
|
+
const bareWords = idents.filter((w) => !KEYWORDS.has(w));
|
|
96
|
+
exprs.push({ text, start: open, end: close + 2, refs, functions, keywords, bareWords });
|
|
97
|
+
i = close + 2;
|
|
98
|
+
}
|
|
99
|
+
return { exprs, errors };
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/expr/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { isObject } from '../json/parse.js';
|
|
2
|
+
import { UnsupportedError } from './errors.js';
|
|
3
|
+
export const MISSING = Object.freeze({ kind: 'missing' });
|
|
4
|
+
export const NULL = Object.freeze({ kind: 'null' });
|
|
5
|
+
export const str = (value) => ({ kind: 'string', value });
|
|
6
|
+
export const num = (value) => ({ kind: 'number', value });
|
|
7
|
+
export const bool = (value) => ({ kind: 'boolean', value });
|
|
8
|
+
export const arr = (value) => ({ kind: 'array', value });
|
|
9
|
+
export const obj = (value) => ({ kind: 'object', value });
|
|
10
|
+
export const date = (value) => ({ kind: 'date', value });
|
|
11
|
+
export function fromJson(v) {
|
|
12
|
+
if (v === undefined)
|
|
13
|
+
return MISSING;
|
|
14
|
+
if (v === null)
|
|
15
|
+
return NULL;
|
|
16
|
+
if (typeof v === 'boolean')
|
|
17
|
+
return bool(v);
|
|
18
|
+
if (typeof v === 'number')
|
|
19
|
+
return num(v);
|
|
20
|
+
if (typeof v === 'string')
|
|
21
|
+
return str(v);
|
|
22
|
+
if (Array.isArray(v))
|
|
23
|
+
return arr(v.map(fromJson));
|
|
24
|
+
if (isObject(v))
|
|
25
|
+
return obj(new Map(Object.keys(v).map((k) => [k, fromJson(v[k])])));
|
|
26
|
+
throw new TypeError('not a JSON value');
|
|
27
|
+
}
|
|
28
|
+
/** Plain JSON for a value. Dates become ISO strings; missing object members are dropped. */
|
|
29
|
+
export function toJson(v) {
|
|
30
|
+
switch (v.kind) {
|
|
31
|
+
case 'missing':
|
|
32
|
+
case 'null':
|
|
33
|
+
return null;
|
|
34
|
+
case 'boolean':
|
|
35
|
+
case 'number':
|
|
36
|
+
case 'string':
|
|
37
|
+
return v.value;
|
|
38
|
+
case 'date':
|
|
39
|
+
return new Date(v.value).toISOString();
|
|
40
|
+
case 'binary':
|
|
41
|
+
throw new UnsupportedError('converting binary data to JSON has not been observed in Make');
|
|
42
|
+
case 'array':
|
|
43
|
+
return v.value.map(toJson);
|
|
44
|
+
case 'object': {
|
|
45
|
+
const out = Object.create(null);
|
|
46
|
+
for (const [k, x] of v.value)
|
|
47
|
+
if (x.kind !== 'missing')
|
|
48
|
+
out[k] = toJson(x);
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** Make joins array elements with a comma and a NO-BREAK SPACE (U+00A0), not a normal space (corpus D). */
|
|
54
|
+
const ARRAY_SEPARATOR = ',' + String.fromCharCode(0xa0);
|
|
55
|
+
/** JavaScript number formatting, which matches every Make output seen: -2.3333333333333335, 1e+21, Infinity, NaN. */
|
|
56
|
+
export function numberText(n) {
|
|
57
|
+
return String(n);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* How Make writes a value into text (a field with text around an expression,
|
|
61
|
+
* or join). Observed in corpus D:
|
|
62
|
+
* missing, null → ""
|
|
63
|
+
* true / false → "true" / "false"
|
|
64
|
+
* array → elements joined with "," + NO-BREAK SPACE (U+00A0), not a normal space
|
|
65
|
+
* object → compact JSON ({"k1":"v1","k2":2})
|
|
66
|
+
* date → ISO 8601 with milliseconds, UTC
|
|
67
|
+
*/
|
|
68
|
+
export function toText(v) {
|
|
69
|
+
switch (v.kind) {
|
|
70
|
+
case 'missing':
|
|
71
|
+
case 'null':
|
|
72
|
+
return '';
|
|
73
|
+
case 'boolean':
|
|
74
|
+
return v.value ? 'true' : 'false';
|
|
75
|
+
case 'number':
|
|
76
|
+
return numberText(v.value);
|
|
77
|
+
case 'string':
|
|
78
|
+
return v.value;
|
|
79
|
+
case 'date':
|
|
80
|
+
return new Date(v.value).toISOString();
|
|
81
|
+
case 'binary':
|
|
82
|
+
throw new UnsupportedError('writing binary data as text has not been observed in Make');
|
|
83
|
+
case 'array':
|
|
84
|
+
return arrayText(v.value);
|
|
85
|
+
case 'object':
|
|
86
|
+
return JSON.stringify(toJson(v));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Arrays have two observed separators (corpus D, D2):
|
|
91
|
+
* [c, a, b] → "c,␣a,␣b" comma + NO-BREAK SPACE
|
|
92
|
+
* [{…}, {…}] → "{…}, {…}" each as JSON, comma + normal space
|
|
93
|
+
* [[1, 2], [3, [4]]] → "1,␣2, 3,␣4" each inner array flattened and joined
|
|
94
|
+
* like a plain array, comma + normal space
|
|
95
|
+
* Arrays mixing plain values and collections have not been observed.
|
|
96
|
+
*/
|
|
97
|
+
function arrayText(xs) {
|
|
98
|
+
const isCollection = (x) => x.kind === 'array' || x.kind === 'object';
|
|
99
|
+
if (!xs.some(isCollection))
|
|
100
|
+
return xs.map(toText).join(ARRAY_SEPARATOR);
|
|
101
|
+
if (xs.every((x) => x.kind === 'object'))
|
|
102
|
+
return xs.map(toText).join(', ');
|
|
103
|
+
if (xs.every((x) => x.kind === 'array'))
|
|
104
|
+
return xs.map((x) => flatText(x)).join(', ');
|
|
105
|
+
throw new UnsupportedError('writing an array that mixes plain values and collections as text has not been observed in Make');
|
|
106
|
+
}
|
|
107
|
+
function flatText(v) {
|
|
108
|
+
const flat = [];
|
|
109
|
+
const walk = (x) => (x.kind === 'array' ? x.value.forEach(walk) : flat.push(x));
|
|
110
|
+
walk(v);
|
|
111
|
+
if (flat.some((x) => x.kind === 'object'))
|
|
112
|
+
throw new UnsupportedError('writing nested arrays that contain collections as text has not been observed in Make');
|
|
113
|
+
return flat.map(toText).join(ARRAY_SEPARATOR);
|
|
114
|
+
}
|
|
115
|
+
export function describe(v) {
|
|
116
|
+
return v.kind === 'string' ? `text ${JSON.stringify(v.value.length > 40 ? `${v.value.slice(0, 37)}...` : v.value)}` : v.kind;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=values.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"values.js","sourceRoot":"","sources":["../../../src/expr/values.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findings.js","sourceRoot":"","sources":["../../src/findings.ts"],"names":[],"mappings":"AAuBA,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,EAAE,EAAE,CAAC;IACL,eAAe,EAAE,CAAC;IAClB,YAAY,EAAE,CAAC;IACf,WAAW,EAAE,CAAC;IACd,cAAc,EAAE,CAAC;IACjB,eAAe,EAAE,CAAC;IAClB,aAAa,EAAE,CAAC;CACR,CAAC"}
|