jit-parser 1.0.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 (80) hide show
  1. package/README.md +632 -0
  2. package/lib/codegen/CodegenAstFactory.d.ts +14 -0
  3. package/lib/codegen/CodegenAstFactory.js +119 -0
  4. package/lib/codegen/CodegenAstFactory.js.map +1 -0
  5. package/lib/codegen/CodegenGrammar.d.ts +21 -0
  6. package/lib/codegen/CodegenGrammar.js +145 -0
  7. package/lib/codegen/CodegenGrammar.js.map +1 -0
  8. package/lib/codegen/CodegenList.d.ts +15 -0
  9. package/lib/codegen/CodegenList.js +63 -0
  10. package/lib/codegen/CodegenList.js.map +1 -0
  11. package/lib/codegen/CodegenProduction.d.ts +15 -0
  12. package/lib/codegen/CodegenProduction.js +72 -0
  13. package/lib/codegen/CodegenProduction.js.map +1 -0
  14. package/lib/codegen/CodegenTerminal.d.ts +14 -0
  15. package/lib/codegen/CodegenTerminal.js +133 -0
  16. package/lib/codegen/CodegenTerminal.js.map +1 -0
  17. package/lib/codegen/CodegenUnion.d.ts +15 -0
  18. package/lib/codegen/CodegenUnion.js +71 -0
  19. package/lib/codegen/CodegenUnion.js.map +1 -0
  20. package/lib/codegen/Pattern.d.ts +8 -0
  21. package/lib/codegen/Pattern.js +41 -0
  22. package/lib/codegen/Pattern.js.map +1 -0
  23. package/lib/context.d.ts +13 -0
  24. package/lib/context.js +20 -0
  25. package/lib/context.js.map +1 -0
  26. package/lib/generator.d.ts +20 -0
  27. package/lib/generator.js +100 -0
  28. package/lib/generator.js.map +1 -0
  29. package/lib/grammars/calculator.d.ts +2 -0
  30. package/lib/grammars/calculator.js +76 -0
  31. package/lib/grammars/calculator.js.map +1 -0
  32. package/lib/grammars/esql.d.ts +2 -0
  33. package/lib/grammars/esql.js +221 -0
  34. package/lib/grammars/esql.js.map +1 -0
  35. package/lib/grammars/javascript.d.ts +2 -0
  36. package/lib/grammars/javascript.js +251 -0
  37. package/lib/grammars/javascript.js.map +1 -0
  38. package/lib/grammars/json-expression.d.ts +2 -0
  39. package/lib/grammars/json-expression.js +101 -0
  40. package/lib/grammars/json-expression.js.map +1 -0
  41. package/lib/grammars/json.d.ts +2 -0
  42. package/lib/grammars/json.js +79 -0
  43. package/lib/grammars/json.js.map +1 -0
  44. package/lib/index.d.ts +0 -0
  45. package/lib/index.js +2 -0
  46. package/lib/index.js.map +1 -0
  47. package/lib/matches.d.ts +15 -0
  48. package/lib/matches.js +21 -0
  49. package/lib/matches.js.map +1 -0
  50. package/lib/print.d.ts +11 -0
  51. package/lib/print.js +97 -0
  52. package/lib/print.js.map +1 -0
  53. package/lib/testing/cli.d.ts +1 -0
  54. package/lib/testing/cli.js +84 -0
  55. package/lib/testing/cli.js.map +1 -0
  56. package/lib/testing/driver.d.ts +21 -0
  57. package/lib/testing/driver.js +73 -0
  58. package/lib/testing/driver.js.map +1 -0
  59. package/lib/testing/index.d.ts +5 -0
  60. package/lib/testing/index.js +9 -0
  61. package/lib/testing/index.js.map +1 -0
  62. package/lib/testing/jest.d.ts +4 -0
  63. package/lib/testing/jest.js +31 -0
  64. package/lib/testing/jest.js.map +1 -0
  65. package/lib/testing/report.d.ts +3 -0
  66. package/lib/testing/report.js +64 -0
  67. package/lib/testing/report.js.map +1 -0
  68. package/lib/testing/runner.d.ts +29 -0
  69. package/lib/testing/runner.js +93 -0
  70. package/lib/testing/runner.js.map +1 -0
  71. package/lib/testing/types.d.ts +34 -0
  72. package/lib/testing/types.js +3 -0
  73. package/lib/testing/types.js.map +1 -0
  74. package/lib/types.d.ts +70 -0
  75. package/lib/types.js +3 -0
  76. package/lib/types.js.map +1 -0
  77. package/lib/util.d.ts +10 -0
  78. package/lib/util.js +39 -0
  79. package/lib/util.js.map +1 -0
  80. package/package.json +103 -0
package/lib/print.js ADDED
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.printCst = exports.printTraceNode = exports.GrammarPrinter = void 0;
4
+ const printTree_1 = require("tree-dump/lib/printTree");
5
+ const util_1 = require("./util");
6
+ class GrammarPrinter {
7
+ constructor(grammar) {
8
+ this.grammar = grammar;
9
+ this.visited = new Set();
10
+ }
11
+ print(tab, type = this.grammar.start) {
12
+ this.visited.add(type);
13
+ return this.printNode(this.grammar.cst[type], type, tab);
14
+ }
15
+ printNode(node, type, tab) {
16
+ if (type)
17
+ this.visited.add(type);
18
+ if ((0, util_1.isTerminalNode)(node)) {
19
+ const pattern = typeof node.t === 'string'
20
+ ? JSON.stringify(node.t)
21
+ : Array.isArray(node.t)
22
+ ? '(' + node.t.map((c) => JSON.stringify(c)).join(' | ') + ')' + (node.repeat ?? '')
23
+ : node.t;
24
+ return `${node.type ?? type ?? 'Text'} (terminal): ${pattern}`;
25
+ }
26
+ else if ((0, util_1.isTerminalShorthandNode)(node)) {
27
+ return this.printNode({ t: node }, type, tab);
28
+ }
29
+ else if ((0, util_1.isRefNode)(node)) {
30
+ const reference = node.r;
31
+ const visited = this.visited.has(reference);
32
+ if (!type) {
33
+ if (visited)
34
+ return `→ ${reference}`;
35
+ else
36
+ return this.printNode(this.grammar.cst[reference], reference, tab);
37
+ }
38
+ this.visited.add(reference);
39
+ return (`${type ?? 'Reference'} (reference)` +
40
+ (visited ? ' →' : (0, printTree_1.printTree)(tab, [(tab) => this.printNode(this.grammar.cst[reference], reference, tab)])));
41
+ }
42
+ else if ((0, util_1.isProductionNode)(node)) {
43
+ return (`${node.type ?? type ?? 'Production'} (production)` +
44
+ (0, printTree_1.printTree)(tab, node.p.map((n) => (tab) => this.printNode(n, undefined, tab))));
45
+ }
46
+ else if ((0, util_1.isProductionShorthandNode)(node)) {
47
+ return this.printNode({ p: node }, type, tab);
48
+ }
49
+ else if ((0, util_1.isUnionNode)(node)) {
50
+ return (`${node.type ?? type ?? 'Union'} (union)` +
51
+ (0, printTree_1.printTree)(tab, node.u.map((n) => (tab) => this.printNode(n, undefined, tab))));
52
+ }
53
+ else if ((0, util_1.isListNode)(node)) {
54
+ return (`${node.type ?? type ?? 'List'} (list)` + (0, printTree_1.printTree)(tab, [(tab) => this.printNode(node.l, undefined, tab)]));
55
+ }
56
+ return 'unknown';
57
+ }
58
+ }
59
+ exports.GrammarPrinter = GrammarPrinter;
60
+ GrammarPrinter.print = (grammar, tab) => {
61
+ const printer = new GrammarPrinter(grammar);
62
+ return printer.print(tab);
63
+ };
64
+ const formatMatch = (cst, text) => {
65
+ let formatted = ' ' + cst.pos + ':' + cst.end;
66
+ if (text) {
67
+ const end = cst.pos + Math.min(32, cst.end - cst.pos);
68
+ const slice = text.slice(cst.pos, end) + (end !== cst.end ? '...' : '');
69
+ const sliceFormatted = slice.indexOf('"') >= 0 && slice.indexOf("'") === -1
70
+ ? "'" + JSON.stringify(slice).slice(1, -1).replaceAll('\\"', '"') + "'"
71
+ : JSON.stringify(slice);
72
+ formatted += ' → ' + sliceFormatted;
73
+ }
74
+ return formatted;
75
+ };
76
+ const printTraceNode = (trace, tab, text) => {
77
+ const pattern = trace.ptr;
78
+ const type = pattern?.type ?? (trace.ptr ? 'Anonymous' : 'Root');
79
+ const match = trace.match;
80
+ return (`${type}` +
81
+ (match ? formatMatch(match, text) : '') +
82
+ (trace.children && trace.children.length
83
+ ? (0, printTree_1.printTree)(tab, trace.children.map((n) => (tab) => (0, exports.printTraceNode)(n, tab, text)))
84
+ : ''));
85
+ };
86
+ exports.printTraceNode = printTraceNode;
87
+ const printCst = (cst, tab, text) => {
88
+ const pattern = cst.ptr;
89
+ const type = pattern.type;
90
+ return (`${type}` +
91
+ formatMatch(cst, text) +
92
+ (cst.children && cst.children.length
93
+ ? (0, printTree_1.printTree)(tab, cst.children.map((n) => (tab) => (0, exports.printCst)(n, tab, text)))
94
+ : ''));
95
+ };
96
+ exports.printCst = printCst;
97
+ //# sourceMappingURL=print.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"print.js","sourceRoot":"","sources":["../src/print.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const main: (argv: string[]) => number;
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.main = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const fs = tslib_1.__importStar(require("fs"));
6
+ const path = tslib_1.__importStar(require("path"));
7
+ const report_1 = require("./report");
8
+ const runner_1 = require("./runner");
9
+ const HELP = `grammar-test — run JSON Grammar test suites
10
+
11
+ Usage:
12
+ grammar-test <suite.json...> [options]
13
+
14
+ Options:
15
+ -u, --update Regenerate and write snapshot channels back into the suites
16
+ --no-color Disable ANSI colors
17
+ -h, --help Show this help
18
+
19
+ The grammar under test is taken from each suite's "grammar" field, resolved
20
+ relative to the suite file (.json grammar object, or a module exporting
21
+ \`grammar\`).`;
22
+ const resolveGrammar = (suitePath, suite) => {
23
+ const ref = suite.grammar;
24
+ if (!ref)
25
+ throw new Error(`suite "${suitePath}" has no "grammar" reference`);
26
+ const abs = path.resolve(path.dirname(suitePath), ref);
27
+ if (abs.endsWith('.json'))
28
+ return JSON.parse(fs.readFileSync(abs, 'utf8'));
29
+ const mod = require(abs);
30
+ return (mod.grammar ?? mod.default ?? mod);
31
+ };
32
+ const main = (argv) => {
33
+ const files = [];
34
+ let update = false;
35
+ let useColor = true;
36
+ for (const arg of argv) {
37
+ switch (arg) {
38
+ case '-u':
39
+ case '--update':
40
+ update = true;
41
+ break;
42
+ case '--no-color':
43
+ useColor = false;
44
+ break;
45
+ case '-h':
46
+ case '--help':
47
+ console.log(HELP);
48
+ return 0;
49
+ default:
50
+ files.push(arg);
51
+ }
52
+ }
53
+ if (!files.length) {
54
+ console.error(HELP);
55
+ return 1;
56
+ }
57
+ let totalFail = 0;
58
+ for (const file of files) {
59
+ const suitePath = path.resolve(file);
60
+ const suite = JSON.parse(fs.readFileSync(suitePath, 'utf8'));
61
+ let grammar;
62
+ try {
63
+ grammar = resolveGrammar(suitePath, suite);
64
+ }
65
+ catch (err) {
66
+ console.error(`✗ ${file}: ${err.message}`);
67
+ totalFail++;
68
+ continue;
69
+ }
70
+ const result = (0, runner_1.runSuite)(grammar, suite, { update });
71
+ console.log((0, report_1.formatSuite)(result, useColor));
72
+ console.log('');
73
+ if (update && result.updated) {
74
+ fs.writeFileSync(suitePath, JSON.stringify(suite, null, 2) + '\n');
75
+ }
76
+ totalFail += result.fail;
77
+ }
78
+ return totalFail ? 1 : 0;
79
+ };
80
+ exports.main = main;
81
+ if (require.main === module) {
82
+ process.exit((0, exports.main)(process.argv.slice(2)));
83
+ }
84
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/testing/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { CodegenGrammar } from '../codegen/CodegenGrammar';
2
+ import type { CstNode, Grammar, RootTraceNode } from '../types';
3
+ import type { StructuralCst, TestCase } from './types';
4
+ export interface DriveNeeds {
5
+ ast: boolean;
6
+ trace: boolean;
7
+ }
8
+ export interface DriveResult {
9
+ src: string;
10
+ matched: boolean;
11
+ end: number;
12
+ cst?: CstNode;
13
+ ast?: unknown;
14
+ trace?: RootTraceNode;
15
+ }
16
+ export type GrammarCache = Map<string, CodegenGrammar>;
17
+ export declare const createCache: () => GrammarCache;
18
+ export declare const mulberry32: (seed: number) => (() => number);
19
+ export declare const resolveInput: (grammar: Grammar, tc: TestCase) => string;
20
+ export declare const drive: (grammar: Grammar, tc: TestCase, needs: DriveNeeds, cache?: GrammarCache) => DriveResult;
21
+ export declare const toStructuralCst: (cst: CstNode) => StructuralCst;
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toStructuralCst = exports.drive = exports.resolveInput = exports.mulberry32 = exports.createCache = void 0;
4
+ const CodegenGrammar_1 = require("../codegen/CodegenGrammar");
5
+ const context_1 = require("../context");
6
+ const generator_1 = require("../generator");
7
+ const createCache = () => new Map();
8
+ exports.createCache = createCache;
9
+ const getCodegen = (grammar, debug, cache) => {
10
+ const key = debug ? '1' : '0';
11
+ if (cache) {
12
+ const existing = cache.get(key);
13
+ if (existing)
14
+ return existing;
15
+ }
16
+ const codegen = new CodegenGrammar_1.CodegenGrammar(grammar, new context_1.CodegenContext(true, true, debug));
17
+ if (cache)
18
+ cache.set(key, codegen);
19
+ return codegen;
20
+ };
21
+ const mulberry32 = (seed) => {
22
+ let a = seed >>> 0;
23
+ return () => {
24
+ a = (a + 0x6d2b79f5) | 0;
25
+ let t = Math.imul(a ^ (a >>> 15), 1 | a);
26
+ t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
27
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
28
+ };
29
+ };
30
+ exports.mulberry32 = mulberry32;
31
+ const resolveInput = (grammar, tc) => {
32
+ if (tc.src !== undefined && tc.generate !== undefined) {
33
+ throw new Error('a test case must set either "src" or "generate", not both');
34
+ }
35
+ if (tc.src !== undefined)
36
+ return tc.src;
37
+ if (tc.generate !== undefined) {
38
+ const spec = tc.generate === 'sample' ? { sample: true } : tc.generate;
39
+ const rnd = spec.seed !== undefined ? (0, exports.mulberry32)(spec.seed) : undefined;
40
+ const generator = new generator_1.Generator({ grammar, useSamples: spec.sample !== false, rnd });
41
+ return generator.gen(tc.rule ?? grammar.start);
42
+ }
43
+ return '';
44
+ };
45
+ exports.resolveInput = resolveInput;
46
+ const drive = (grammar, tc, needs, cache) => {
47
+ const codegen = getCodegen(grammar, needs.trace, cache);
48
+ const rule = tc.rule ?? grammar.start;
49
+ const pattern = codegen.compileRule(rule);
50
+ const src = (0, exports.resolveInput)(grammar, tc);
51
+ const root = { pos: 0, children: [] };
52
+ const ctx = new context_1.ParseContext(src, needs.ast, needs.trace ? [root] : undefined);
53
+ const cst = pattern.parser(ctx, 0);
54
+ const matched = !!cst;
55
+ const ast = matched && needs.ast ? cst.ptr.toAst(cst, src) : undefined;
56
+ return {
57
+ src,
58
+ matched,
59
+ end: matched ? cst.end : -1,
60
+ cst: cst ?? undefined,
61
+ ast,
62
+ trace: needs.trace ? root : undefined,
63
+ };
64
+ };
65
+ exports.drive = drive;
66
+ const toStructuralCst = (cst) => {
67
+ const out = { type: cst.ptr.type, pos: cst.pos, end: cst.end };
68
+ if (cst.children)
69
+ out.children = cst.children.map(exports.toStructuralCst);
70
+ return out;
71
+ };
72
+ exports.toStructuralCst = toStructuralCst;
73
+ //# sourceMappingURL=driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.js","sourceRoot":"","sources":["../../src/testing/driver.ts"],"names":[],"mappings":";;;AAAA,8DAAyD;AACzD,wCAAwD;AACxD,4CAAuC;AAyChC,MAAM,WAAW,GAAG,GAAiB,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;AAA5C,QAAA,WAAW,eAAiC;AAEzD,MAAM,UAAU,GAAG,CAAC,OAAgB,EAAE,KAAc,EAAE,KAAoB,EAAkB,EAAE;IAC5F,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9B,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;IAChC,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,+BAAc,CAAC,OAAO,EAAE,IAAI,wBAAc,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACnF,IAAI,KAAK;QAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACnC,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAGK,MAAM,UAAU,GAAG,CAAC,IAAY,EAAkB,EAAE;IACzD,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC;IACnB,OAAO,GAAG,EAAE;QACV,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC;IAC/C,CAAC,CAAC;AACJ,CAAC,CAAC;AARW,QAAA,UAAU,cAQrB;AAGK,MAAM,YAAY,GAAG,CAAC,OAAgB,EAAE,EAAY,EAAU,EAAE;IACrE,IAAI,EAAE,CAAC,GAAG,KAAK,SAAS,IAAI,EAAE,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,EAAE,CAAC,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC,GAAG,CAAC;IACxC,IAAI,EAAE,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAC,MAAM,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC;QACrE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxE,MAAM,SAAS,GAAG,IAAI,qBAAS,CAAC,EAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,GAAG,EAAC,CAAC,CAAC;QACnF,OAAO,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAZW,QAAA,YAAY,gBAYvB;AAGK,MAAM,KAAK,GAAG,CAAC,OAAgB,EAAE,EAAY,EAAE,KAAiB,EAAE,KAAoB,EAAe,EAAE;IAC5G,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,IAAA,oBAAY,EAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,IAAI,GAAkB,EAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAC,CAAC;IACnD,MAAM,GAAG,GAAG,IAAI,sBAAY,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/E,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC;IACtB,MAAM,GAAG,GAAG,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,OAAO;QACL,GAAG;QACH,OAAO;QACP,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,GAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,GAAG,EAAE,GAAG,IAAI,SAAS;QACrB,GAAG;QACH,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;KACtC,CAAC;AACJ,CAAC,CAAC;AAlBW,QAAA,KAAK,SAkBhB;AAGK,MAAM,eAAe,GAAG,CAAC,GAAY,EAAiB,EAAE;IAC7D,MAAM,GAAG,GAAkB,EAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAC,CAAC;IAC5E,IAAI,GAAG,CAAC,QAAQ;QAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,uBAAe,CAAC,CAAC;IACnE,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAJW,QAAA,eAAe,mBAI1B"}
@@ -0,0 +1,5 @@
1
+ export * from './types';
2
+ export * from './driver';
3
+ export * from './runner';
4
+ export * from './report';
5
+ export * from './jest';
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./types"), exports);
5
+ tslib_1.__exportStar(require("./driver"), exports);
6
+ tslib_1.__exportStar(require("./runner"), exports);
7
+ tslib_1.__exportStar(require("./report"), exports);
8
+ tslib_1.__exportStar(require("./jest"), exports);
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":";;;AAAA,kDAAwB;AACxB,mDAAyB;AACzB,mDAAyB;AACzB,mDAAyB;AACzB,iDAAuB"}
@@ -0,0 +1,4 @@
1
+ import type { Grammar } from '../types';
2
+ import type { TestSuite } from './types';
3
+ export declare const jestSuite: (grammar: Grammar, suite: TestSuite) => void;
4
+ export declare const jestSuiteFile: (grammar: Grammar, suitePath: string) => void;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.jestSuiteFile = exports.jestSuite = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const fs = tslib_1.__importStar(require("fs"));
6
+ const report_1 = require("./report");
7
+ const runner_1 = require("./runner");
8
+ const jestSuite = (grammar, suite) => {
9
+ const label = suite.describe ?? suite.grammar ?? 'grammar';
10
+ const hasOnly = suite.tests.some((t) => t.only);
11
+ describe(label, () => {
12
+ for (const tc of suite.tests) {
13
+ const run = () => {
14
+ const res = (0, runner_1.runCase)(grammar, suite, tc);
15
+ if (res.status === 'fail')
16
+ throw new Error('\n' + (0, report_1.formatCase)(res, false));
17
+ };
18
+ if (tc.skip || (hasOnly && !tc.only))
19
+ test.skip(tc.name, run);
20
+ else
21
+ test(tc.name, run);
22
+ }
23
+ });
24
+ };
25
+ exports.jestSuite = jestSuite;
26
+ const jestSuiteFile = (grammar, suitePath) => {
27
+ const suite = JSON.parse(fs.readFileSync(suitePath, 'utf8'));
28
+ (0, exports.jestSuite)(grammar, suite);
29
+ };
30
+ exports.jestSuiteFile = jestSuiteFile;
31
+ //# sourceMappingURL=jest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jest.js","sourceRoot":"","sources":["../../src/testing/jest.ts"],"names":[],"mappings":";;;;AAAA,+CAAyB;AAEzB,qCAAoC;AACpC,qCAAiC;AAU1B,MAAM,SAAS,GAAG,CAAC,OAAgB,EAAE,KAAgB,EAAQ,EAAE;IACpE,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,IAAI,SAAS,CAAC;IAC3D,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;QACnB,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,GAAG,EAAE;gBACf,MAAM,GAAG,GAAG,IAAA,gBAAO,EAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;gBACxC,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,IAAI,GAAG,IAAA,mBAAU,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;YAC5E,CAAC,CAAC;YACF,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;;gBACzD,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAbW,QAAA,SAAS,aAapB;AAGK,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAE,SAAiB,EAAQ,EAAE;IACzE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAc,CAAC;IAC1E,IAAA,iBAAS,EAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC5B,CAAC,CAAC;AAHW,QAAA,aAAa,iBAGxB"}
@@ -0,0 +1,3 @@
1
+ import type { CaseResult, SuiteResult } from './runner';
2
+ export declare const formatCase: (res: CaseResult, useColor?: boolean) => string;
3
+ export declare const formatSuite: (res: SuiteResult, useColor?: boolean) => string;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatSuite = exports.formatCase = void 0;
4
+ const GREEN = '\x1b[32m';
5
+ const RED = '\x1b[31m';
6
+ const YELLOW = '\x1b[33m';
7
+ const DIM = '\x1b[90m';
8
+ const RESET = '\x1b[0m';
9
+ const color = (on, c, s) => (on ? c + s + RESET : s);
10
+ const show = (value) => {
11
+ if (Array.isArray(value) && value.every((v) => typeof v === 'string')) {
12
+ return '\n' + value.map((l) => ' ' + l).join('\n');
13
+ }
14
+ try {
15
+ const json = JSON.stringify(value);
16
+ return json === undefined ? String(value) : json;
17
+ }
18
+ catch {
19
+ return String(value);
20
+ }
21
+ };
22
+ const channelLine = (ch, c) => {
23
+ if (ch.status === 'fail') {
24
+ return (color(c, RED, ` ${ch.channel}: mismatch`) +
25
+ color(c, DIM, `\n expected `) +
26
+ show(ch.expected) +
27
+ color(c, DIM, `\n actual `) +
28
+ show(ch.actual));
29
+ }
30
+ if (ch.status === 'missing') {
31
+ return color(c, YELLOW, ` ${ch.channel}: no snapshot stored — run with --update`);
32
+ }
33
+ return '';
34
+ };
35
+ const formatCase = (res, useColor = true) => {
36
+ if (res.status === 'skip')
37
+ return color(useColor, DIM, ` - ${res.name} (skipped)`);
38
+ if (res.status === 'pass')
39
+ return color(useColor, GREEN, ` ✓ ${res.name}`);
40
+ const head = color(useColor, RED, ` ✗ ${res.name}`);
41
+ if (res.error)
42
+ return head + color(useColor, RED, `\n threw: ${res.error}`);
43
+ const details = res.channels
44
+ .map((ch) => channelLine(ch, useColor))
45
+ .filter(Boolean)
46
+ .join('\n');
47
+ return head + (details ? '\n' + details : '');
48
+ };
49
+ exports.formatCase = formatCase;
50
+ const formatSuite = (res, useColor = true) => {
51
+ const lines = [];
52
+ if (res.describe)
53
+ lines.push(res.describe);
54
+ for (const c of res.cases)
55
+ lines.push((0, exports.formatCase)(c, useColor));
56
+ const summary = ` ${res.pass} passed` +
57
+ (res.fail ? `, ${res.fail} failed` : '') +
58
+ (res.skip ? `, ${res.skip} skipped` : '') +
59
+ (res.updated ? ` (snapshots updated)` : '');
60
+ lines.push(color(useColor, res.fail ? RED : GREEN, summary));
61
+ return lines.join('\n');
62
+ };
63
+ exports.formatSuite = formatSuite;
64
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/testing/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { Grammar } from '../types';
2
+ import { type GrammarCache } from './driver';
3
+ import type { ChannelName, TestCase, TestSuite } from './types';
4
+ export interface ChannelResult {
5
+ channel: ChannelName;
6
+ status: 'pass' | 'fail' | 'missing' | 'wrote';
7
+ expected?: unknown;
8
+ actual?: unknown;
9
+ }
10
+ export interface CaseResult {
11
+ name: string;
12
+ status: 'pass' | 'fail' | 'skip';
13
+ channels: ChannelResult[];
14
+ error?: string;
15
+ }
16
+ export interface SuiteResult {
17
+ describe?: string;
18
+ cases: CaseResult[];
19
+ pass: number;
20
+ fail: number;
21
+ skip: number;
22
+ updated: boolean;
23
+ }
24
+ export interface RunOptions {
25
+ update?: boolean;
26
+ cache?: GrammarCache;
27
+ }
28
+ export declare const runCase: (grammar: Grammar, suite: TestSuite, tc: TestCase, opts?: RunOptions) => CaseResult;
29
+ export declare const runSuite: (grammar: Grammar, suite: TestSuite, opts?: RunOptions) => SuiteResult;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runSuite = exports.runCase = void 0;
4
+ const deepEqual_1 = require("@jsonjoy.com/util/lib/json-equal/deepEqual");
5
+ const print_1 = require("../print");
6
+ const driver_1 = require("./driver");
7
+ const SNAPSHOT_CHANNELS = ['ast', 'cst', 'cstPrint', 'trace', 'end'];
8
+ const snapshotSetOf = (suite, tc) => new Set(tc.snapshot ?? suite.snapshot ?? []);
9
+ const actualOf = (channel, d) => {
10
+ switch (channel) {
11
+ case 'ast':
12
+ return d.ast;
13
+ case 'cst':
14
+ return d.cst ? (0, driver_1.toStructuralCst)(d.cst) : null;
15
+ case 'cstPrint':
16
+ return d.cst ? (0, print_1.printCst)(d.cst, '', d.src).split('\n') : [];
17
+ case 'trace':
18
+ return d.trace ? (0, print_1.printTraceNode)(d.trace, '', d.src).split('\n') : [];
19
+ case 'end':
20
+ return d.end;
21
+ }
22
+ };
23
+ const runCase = (grammar, suite, tc, opts = {}) => {
24
+ const hasOnly = suite.tests.some((t) => t.only);
25
+ if (tc.skip || (hasOnly && !tc.only))
26
+ return { name: tc.name, status: 'skip', channels: [] };
27
+ const snapshot = snapshotSetOf(suite, tc);
28
+ const needAst = 'ast' in tc || snapshot.has('ast');
29
+ const needTrace = 'trace' in tc || snapshot.has('trace');
30
+ let d;
31
+ try {
32
+ d = (0, driver_1.drive)(grammar, tc, { ast: needAst, trace: needTrace }, opts.cache);
33
+ }
34
+ catch (err) {
35
+ return { name: tc.name, status: 'fail', channels: [], error: String(err?.message ?? err) };
36
+ }
37
+ const channels = [];
38
+ const considered = new Set([...snapshot, ...SNAPSHOT_CHANNELS.filter((c) => c in tc)]);
39
+ for (const channel of considered) {
40
+ const actual = actualOf(channel, d);
41
+ const bag = tc;
42
+ if (opts.update && snapshot.has(channel)) {
43
+ if (actual === undefined) {
44
+ channels.push({ channel, status: 'fail', actual });
45
+ }
46
+ else {
47
+ bag[channel] = actual;
48
+ channels.push({ channel, status: 'wrote', actual });
49
+ }
50
+ }
51
+ else if (channel in tc) {
52
+ const expected = bag[channel];
53
+ channels.push({ channel, status: (0, deepEqual_1.deepEqual)(actual, expected) ? 'pass' : 'fail', expected, actual });
54
+ }
55
+ else {
56
+ channels.push({ channel, status: 'missing', actual });
57
+ }
58
+ }
59
+ if ('parses' in tc) {
60
+ channels.push({
61
+ channel: 'parses',
62
+ status: d.matched === tc.parses ? 'pass' : 'fail',
63
+ expected: tc.parses,
64
+ actual: d.matched,
65
+ });
66
+ }
67
+ if ('consumes' in tc) {
68
+ const actual = d.matched && d.end === d.src.length;
69
+ channels.push({ channel: 'consumes', status: actual ? 'pass' : 'fail', expected: true, actual });
70
+ }
71
+ const failed = channels.some((c) => c.status === 'fail' || c.status === 'missing');
72
+ return { name: tc.name, status: failed ? 'fail' : 'pass', channels };
73
+ };
74
+ exports.runCase = runCase;
75
+ const runSuite = (grammar, suite, opts = {}) => {
76
+ const cache = opts.cache ?? (0, driver_1.createCache)();
77
+ const cases = suite.tests.map((tc) => (0, exports.runCase)(grammar, suite, tc, { ...opts, cache }));
78
+ let pass = 0;
79
+ let fail = 0;
80
+ let skip = 0;
81
+ for (const c of cases) {
82
+ if (c.status === 'pass')
83
+ pass++;
84
+ else if (c.status === 'fail')
85
+ fail++;
86
+ else
87
+ skip++;
88
+ }
89
+ const updated = cases.some((c) => c.channels.some((ch) => ch.status === 'wrote'));
90
+ return { describe: suite.describe ?? suite.grammar, cases, pass, fail, skip, updated };
91
+ };
92
+ exports.runSuite = runSuite;
93
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/testing/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export interface TestSuite {
2
+ grammar?: string;
3
+ describe?: string;
4
+ snapshot?: SnapshotChannel[];
5
+ tests: TestCase[];
6
+ }
7
+ export interface TestCase {
8
+ name: string;
9
+ rule?: string;
10
+ src?: string;
11
+ generate?: GenerateSpec;
12
+ skip?: boolean;
13
+ only?: boolean;
14
+ snapshot?: SnapshotChannel[];
15
+ ast?: unknown;
16
+ cst?: StructuralCst;
17
+ cstPrint?: string[];
18
+ trace?: string[];
19
+ end?: number;
20
+ parses?: boolean;
21
+ consumes?: 'all';
22
+ }
23
+ export type GenerateSpec = 'sample' | {
24
+ sample?: boolean;
25
+ seed?: number;
26
+ };
27
+ export interface StructuralCst {
28
+ type: string;
29
+ pos: number;
30
+ end: number;
31
+ children?: StructuralCst[];
32
+ }
33
+ export type SnapshotChannel = 'ast' | 'cst' | 'cstPrint' | 'trace' | 'end';
34
+ export type ChannelName = SnapshotChannel | 'parses' | 'consumes';
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/testing/types.ts"],"names":[],"mappings":""}