@traqula/core 0.0.23 → 0.0.25

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 (75) hide show
  1. package/README.md +2 -0
  2. package/dist/cjs/lib/AstCoreFactory.js +181 -149
  3. package/dist/cjs/lib/AstCoreFactory.js.map +1 -0
  4. package/dist/cjs/lib/generator-builder/builderTypes.js +2 -15
  5. package/dist/cjs/lib/generator-builder/builderTypes.js.map +1 -0
  6. package/dist/cjs/lib/generator-builder/dynamicGenerator.js +209 -200
  7. package/dist/cjs/lib/generator-builder/dynamicGenerator.js.map +1 -0
  8. package/dist/cjs/lib/generator-builder/generatorBuilder.js +103 -117
  9. package/dist/cjs/lib/generator-builder/generatorBuilder.js.map +1 -0
  10. package/dist/cjs/lib/generator-builder/generatorTypes.js +2 -15
  11. package/dist/cjs/lib/generator-builder/generatorTypes.js.map +1 -0
  12. package/dist/cjs/lib/index.js +39 -57
  13. package/dist/cjs/lib/index.js.map +1 -0
  14. package/dist/cjs/lib/indirection-builder/IndirBuilder.js +63 -85
  15. package/dist/cjs/lib/indirection-builder/IndirBuilder.js.map +1 -0
  16. package/dist/cjs/lib/indirection-builder/dynamicIndirected.js +28 -50
  17. package/dist/cjs/lib/indirection-builder/dynamicIndirected.js.map +1 -0
  18. package/dist/cjs/lib/indirection-builder/helpers.js +11 -31
  19. package/dist/cjs/lib/indirection-builder/helpers.js.map +1 -0
  20. package/dist/cjs/lib/lexer-builder/LexerBuilder.js +92 -114
  21. package/dist/cjs/lib/lexer-builder/LexerBuilder.js.map +1 -0
  22. package/dist/cjs/lib/parser-builder/builderTypes.js +2 -15
  23. package/dist/cjs/lib/parser-builder/builderTypes.js.map +1 -0
  24. package/dist/cjs/lib/parser-builder/dynamicParser.js +116 -136
  25. package/dist/cjs/lib/parser-builder/dynamicParser.js.map +1 -0
  26. package/dist/cjs/lib/parser-builder/parserBuilder.js +167 -169
  27. package/dist/cjs/lib/parser-builder/parserBuilder.js.map +1 -0
  28. package/dist/cjs/lib/parser-builder/ruleDefTypes.js +2 -15
  29. package/dist/cjs/lib/parser-builder/ruleDefTypes.js.map +1 -0
  30. package/dist/cjs/lib/transformers/TransformerObject.js +196 -198
  31. package/dist/cjs/lib/transformers/TransformerObject.js.map +1 -0
  32. package/dist/cjs/lib/transformers/TransformerSubTyped.js +110 -141
  33. package/dist/cjs/lib/transformers/TransformerSubTyped.js.map +1 -0
  34. package/dist/cjs/lib/transformers/TransformerTyped.js +87 -120
  35. package/dist/cjs/lib/transformers/TransformerTyped.js.map +1 -0
  36. package/dist/cjs/lib/types.js +2 -15
  37. package/dist/cjs/lib/types.js.map +1 -0
  38. package/dist/cjs/lib/utils.js +20 -34
  39. package/dist/cjs/lib/utils.js.map +1 -0
  40. package/dist/esm/lib/AstCoreFactory.d.ts +19 -7
  41. package/dist/esm/lib/AstCoreFactory.js +50 -5
  42. package/dist/esm/lib/AstCoreFactory.js.map +1 -1
  43. package/dist/esm/lib/generator-builder/dynamicGenerator.d.ts +5 -0
  44. package/dist/esm/lib/generator-builder/dynamicGenerator.js +20 -0
  45. package/dist/esm/lib/generator-builder/dynamicGenerator.js.map +1 -1
  46. package/dist/esm/lib/parser-builder/dynamicParser.js +1 -0
  47. package/dist/esm/lib/parser-builder/dynamicParser.js.map +1 -1
  48. package/dist/esm/lib/parser-builder/parserBuilder.js +2 -2
  49. package/dist/esm/lib/parser-builder/parserBuilder.js.map +1 -1
  50. package/dist/esm/lib/transformers/TransformerObject.d.ts +1 -1
  51. package/dist/esm/lib/transformers/TransformerObject.js.map +1 -1
  52. package/dist/esm/lib/transformers/TransformerSubTyped.d.ts +31 -22
  53. package/dist/esm/lib/transformers/TransformerSubTyped.js +30 -40
  54. package/dist/esm/lib/transformers/TransformerSubTyped.js.map +1 -1
  55. package/dist/esm/lib/transformers/TransformerTyped.d.ts +24 -20
  56. package/dist/esm/lib/transformers/TransformerTyped.js +23 -35
  57. package/dist/esm/lib/transformers/TransformerTyped.js.map +1 -1
  58. package/dist/esm/lib/types.d.ts +67 -5
  59. package/dist/esm/lib/types.js.map +1 -1
  60. package/dist/esm/lib/utils.d.ts +10 -0
  61. package/dist/esm/lib/utils.js +7 -0
  62. package/dist/esm/lib/utils.js.map +1 -1
  63. package/package.json +9 -9
  64. package/dist/cjs/test/generatorBuilder/generatorBuilder.types.test.js +0 -30
  65. package/dist/cjs/test/grammar-builder/parserBuilder.types.test.js +0 -27
  66. package/dist/cjs/test/transformer.test.js +0 -82
  67. package/dist/esm/test/generatorBuilder/generatorBuilder.types.test.d.ts +0 -1
  68. package/dist/esm/test/generatorBuilder/generatorBuilder.types.test.js +0 -38
  69. package/dist/esm/test/generatorBuilder/generatorBuilder.types.test.js.map +0 -1
  70. package/dist/esm/test/grammar-builder/parserBuilder.types.test.d.ts +0 -1
  71. package/dist/esm/test/grammar-builder/parserBuilder.types.test.js +0 -38
  72. package/dist/esm/test/grammar-builder/parserBuilder.types.test.js.map +0 -1
  73. package/dist/esm/test/transformer.test.d.ts +0 -1
  74. package/dist/esm/test/transformer.test.js +0 -82
  75. package/dist/esm/test/transformer.test.js.map +0 -1
@@ -1,126 +1,112 @@
1
1
  "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var generatorBuilder_exports = {};
20
- __export(generatorBuilder_exports, {
21
- GeneratorBuilder: () => GeneratorBuilder
22
- });
23
- module.exports = __toCommonJS(generatorBuilder_exports);
24
- var import_dynamicGenerator = require("./dynamicGenerator.js");
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GeneratorBuilder = void 0;
4
+ const dynamicGenerator_js_1 = require("./dynamicGenerator.js");
5
+ /**
6
+ * Converts a list of ruledefs to a record mapping a name to the corresponding ruledef.
7
+ */
25
8
  function listToRuleDefMap(rules) {
26
- const newRules = {};
27
- for (const rule of rules) {
28
- newRules[rule.name] = rule;
29
- }
30
- return newRules;
9
+ const newRules = {};
10
+ for (const rule of rules) {
11
+ newRules[rule.name] = rule;
12
+ }
13
+ return newRules;
31
14
  }
32
15
  class GeneratorBuilder {
33
- static create(start) {
34
- if (Array.isArray(start)) {
35
- return new GeneratorBuilder(listToRuleDefMap(start));
16
+ static create(start) {
17
+ if (Array.isArray(start)) {
18
+ return new GeneratorBuilder(listToRuleDefMap(start));
19
+ }
20
+ return new GeneratorBuilder({ ...start.rules });
21
+ }
22
+ rules;
23
+ constructor(startRules) {
24
+ this.rules = startRules;
25
+ }
26
+ widenContext() {
27
+ return this;
28
+ }
29
+ typePatch() {
30
+ return this;
31
+ }
32
+ /**
33
+ * Change the implementation of an existing generator rule.
34
+ */
35
+ patchRule(patch) {
36
+ const self = this;
37
+ self.rules[patch.name] = patch;
38
+ return self;
36
39
  }
37
- return new GeneratorBuilder({ ...start.rules });
38
- }
39
- rules;
40
- constructor(startRules) {
41
- this.rules = startRules;
42
- }
43
- widenContext() {
44
- return this;
45
- }
46
- typePatch() {
47
- return this;
48
- }
49
- /**
50
- * Change the implementation of an existing generator rule.
51
- */
52
- patchRule(patch) {
53
- const self = this;
54
- self.rules[patch.name] = patch;
55
- return self;
56
- }
57
- /**
58
- * Add a rule to the grammar. If the rule already exists, but the implementation differs, an error will be thrown.
59
- */
60
- addRuleRedundant(rule) {
61
- const self = this;
62
- const rules = self.rules;
63
- if (rules[rule.name] !== void 0 && rules[rule.name] !== rule) {
64
- throw new Error(`Rule ${rule.name} already exists in the GeneratorBuilder`);
40
+ /**
41
+ * Add a rule to the grammar. If the rule already exists, but the implementation differs, an error will be thrown.
42
+ */
43
+ addRuleRedundant(rule) {
44
+ const self = this;
45
+ const rules = self.rules;
46
+ if (rules[rule.name] !== undefined && rules[rule.name] !== rule) {
47
+ throw new Error(`Rule ${rule.name} already exists in the GeneratorBuilder`);
48
+ }
49
+ rules[rule.name] = rule;
50
+ return self;
51
+ }
52
+ /**
53
+ * Add a rule to the grammar. Will raise a typescript error if the rule already exists in the grammar.
54
+ */
55
+ addRule(rule) {
56
+ return this.addRuleRedundant(rule);
57
+ }
58
+ addMany(...rules) {
59
+ this.rules = { ...this.rules, ...listToRuleDefMap(rules) };
60
+ return this;
65
61
  }
66
- rules[rule.name] = rule;
67
- return self;
68
- }
69
- /**
70
- * Add a rule to the grammar. Will raise a typescript error if the rule already exists in the grammar.
71
- */
72
- addRule(rule) {
73
- return this.addRuleRedundant(rule);
74
- }
75
- addMany(...rules) {
76
- this.rules = { ...this.rules, ...listToRuleDefMap(rules) };
77
- return this;
78
- }
79
- /**
80
- * Delete a grammar rule by its name.
81
- */
82
- deleteRule(ruleName) {
83
- delete this.rules[ruleName];
84
- return this;
85
- }
86
- getRule(ruleName) {
87
- return this.rules[ruleName];
88
- }
89
- /**
90
- * Merge this grammar GeneratorBuilder with another.
91
- * It is best to merge the bigger grammar with the smaller one.
92
- * If the two builders both have a grammar rule with the same name,
93
- * no error will be thrown case they map to the same ruledef object.
94
- * If they map to a different object, an error will be thrown.
95
- * To fix this problem, the overridingRules array should contain a rule with the same conflicting name,
96
- * this rule implementation will be used.
97
- */
98
- merge(GeneratorBuilder2, overridingRules) {
99
- const otherRules = { ...GeneratorBuilder2.rules };
100
- const myRules = this.rules;
101
- for (const rule of Object.values(myRules)) {
102
- if (otherRules[rule.name] === void 0) {
103
- otherRules[rule.name] = rule;
104
- } else {
105
- const existingRule = otherRules[rule.name];
106
- if (existingRule !== rule) {
107
- const override = overridingRules.find((x) => x.name === rule.name);
108
- if (override) {
109
- otherRules[rule.name] = override;
110
- } else {
111
- throw new Error(`Rule with name "${rule.name}" already exists in the GeneratorBuilder, specify an override to resolve conflict`);
112
- }
62
+ /**
63
+ * Delete a grammar rule by its name.
64
+ */
65
+ deleteRule(ruleName) {
66
+ delete this.rules[ruleName];
67
+ return this;
68
+ }
69
+ getRule(ruleName) {
70
+ return this.rules[ruleName];
71
+ }
72
+ /**
73
+ * Merge this grammar GeneratorBuilder with another.
74
+ * It is best to merge the bigger grammar with the smaller one.
75
+ * If the two builders both have a grammar rule with the same name,
76
+ * no error will be thrown case they map to the same ruledef object.
77
+ * If they map to a different object, an error will be thrown.
78
+ * To fix this problem, the overridingRules array should contain a rule with the same conflicting name,
79
+ * this rule implementation will be used.
80
+ */
81
+ merge(GeneratorBuilder, overridingRules) {
82
+ // Assume the other grammar is bigger than yours. So start from that one and add this one
83
+ const otherRules = { ...GeneratorBuilder.rules };
84
+ const myRules = this.rules;
85
+ for (const rule of Object.values(myRules)) {
86
+ if (otherRules[rule.name] === undefined) {
87
+ otherRules[rule.name] = rule;
88
+ }
89
+ else {
90
+ const existingRule = otherRules[rule.name];
91
+ // If same rule, no issue, move on. Else
92
+ if (existingRule !== rule) {
93
+ const override = overridingRules.find(x => x.name === rule.name);
94
+ // If override specified, take override, else, inform user that there is a conflict
95
+ if (override) {
96
+ otherRules[rule.name] = override;
97
+ }
98
+ else {
99
+ throw new Error(`Rule with name "${rule.name}" already exists in the GeneratorBuilder, specify an override to resolve conflict`);
100
+ }
101
+ }
102
+ }
113
103
  }
114
- }
104
+ this.rules = otherRules;
105
+ return this;
106
+ }
107
+ build() {
108
+ return new dynamicGenerator_js_1.DynamicGenerator(this.rules);
115
109
  }
116
- this.rules = otherRules;
117
- return this;
118
- }
119
- build() {
120
- return new import_dynamicGenerator.DynamicGenerator(this.rules);
121
- }
122
110
  }
123
- // Annotate the CommonJS export names for ESM import in node:
124
- 0 && (module.exports = {
125
- GeneratorBuilder
126
- });
111
+ exports.GeneratorBuilder = GeneratorBuilder;
112
+ //# sourceMappingURL=generatorBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generatorBuilder.js","sourceRoot":"","sources":["../../../../lib/generator-builder/generatorBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ParseNamesFromList } from '../parser-builder/builderTypes.js';\nimport type { CheckOverlap } from '../utils.js';\nimport type { GeneratorFromRules, GenRuleMap, GenRulesToObject } from './builderTypes.js';\nimport { DynamicGenerator } from './dynamicGenerator.js';\nimport type { GeneratorRule } from './generatorTypes.js';\n\n/**\n * Converts a list of ruledefs to a record mapping a name to the corresponding ruledef.\n */\nfunction listToRuleDefMap<T extends readonly GeneratorRule[]>(rules: T): GenRulesToObject<T> {\n const newRules: Record<string, GeneratorRule> = {};\n for (const rule of rules) {\n newRules[rule.name] = rule;\n }\n return <GenRulesToObject<T>>newRules;\n}\n\nexport class GeneratorBuilder<Context, Names extends string, RuleDefs extends GenRuleMap<Names>> {\n /**\n * Create a GeneratorBuilder from some initial grammar rules or an existing GeneratorBuilder.\n * If a GeneratorBuilder is provided, a new copy will be created.\n */\n public static create<Context, Names extends string, RuleDefs extends GenRuleMap<Names>>(\n args: GeneratorBuilder<Context, Names, RuleDefs>\n ): GeneratorBuilder<Context, Names, RuleDefs>;\n public static create<\n Rules extends readonly GeneratorRule[] = readonly GeneratorRule[],\n Context = Rules[0] extends GeneratorRule<infer context> ? context : never,\n Names extends string = ParseNamesFromList<Rules>,\n RuleDefs extends GenRuleMap<Names> = GenRulesToObject<Rules>,\n >(rules: Rules): GeneratorBuilder<Context, Names, RuleDefs>;\n public static create<\n Rules extends readonly GeneratorRule[] = readonly GeneratorRule[],\n Context = Rules[0] extends GeneratorRule<infer context> ? context : never,\n Names extends string = ParseNamesFromList<Rules>,\n RuleDefs extends GenRuleMap<Names> = GenRulesToObject<Rules>,\n >(\n start: Rules | GeneratorBuilder<Context, Names, RuleDefs>,\n ): GeneratorBuilder<Context, Names, RuleDefs> {\n if (Array.isArray(start)) {\n return <GeneratorBuilder<Context, Names, RuleDefs>> <unknown> new GeneratorBuilder(listToRuleDefMap(start));\n }\n return new GeneratorBuilder({ ...(<GeneratorBuilder<any, any, any>>start).rules });\n }\n\n private rules: RuleDefs;\n\n private constructor(startRules: RuleDefs) {\n this.rules = startRules;\n }\n\n public widenContext<NewContext extends Context>(): GeneratorBuilder<\n NewContext,\n Names,\n {[Key in keyof RuleDefs]: Key extends Names ?\n (RuleDefs[Key] extends GeneratorRule<any, any, infer RT, infer PT> ?\n GeneratorRule<NewContext, Key, RT, PT> : never)\n : never }\n > {\n return <any> this;\n }\n\n public typePatch<Patch extends {[Key in Names]?: [any] | [any, any[]]}>():\n GeneratorBuilder<Context, Names, {[Key in Names]: Key extends keyof Patch ? (\n Patch[Key] extends [any, any[]] ? GeneratorRule<Context, Key, Patch[Key][0], Patch[Key][1]> : (\n // Only one - infer arg yourself\n Patch[Key] extends [ any ] ?\n RuleDefs[Key] extends GeneratorRule<any, any, any, infer Par> ?\n GeneratorRule<Context, Key, Patch[Key][0], Par> : never\n : never\n )) : RuleDefs[Key] extends GeneratorRule<any, Key> ? RuleDefs[Key] : never\n }> {\n return <any> this;\n }\n\n /**\n * Change the implementation of an existing generator rule.\n */\n public patchRule<U extends Names, RET, ARGS extends any[]>(patch: GeneratorRule<Context, U, RET, ARGS>):\n GeneratorBuilder<Context, Names, {[Key in Names]: Key extends U ?\n GeneratorRule<Context, Key, RET, ARGS> :\n (RuleDefs[Key] extends GeneratorRule<Context, Key> ? RuleDefs[Key] : never)\n } > {\n const self = <GeneratorBuilder<Context, Names, {[Key in Names]: Key extends U ?\n GeneratorRule<Context, Key, RET, ARGS> :\n (RuleDefs[Key] extends GeneratorRule<Context, Key> ? RuleDefs[Key] : never) }>>\n <unknown> this;\n self.rules[patch.name] = <any> patch;\n return self;\n }\n\n /**\n * Add a rule to the grammar. If the rule already exists, but the implementation differs, an error will be thrown.\n */\n public addRuleRedundant<U extends string, RET, ARGS extends any[]>(rule: GeneratorRule<Context, U, RET, ARGS>):\n GeneratorBuilder<Context, Names | U, {[K in Names | U]: K extends Names ?\n (RuleDefs[K] extends GeneratorRule<Context, K> ? RuleDefs[K] : never)\n : (K extends U ? GeneratorRule<Context, K, RET, ARGS> : never)\n }> {\n const self = <GeneratorBuilder<Context, Names | U, {[K in Names | U]: K extends Names ?\n (RuleDefs[K] extends GeneratorRule<Context, K> ? RuleDefs[K] : never)\n : (K extends U ? GeneratorRule<Context, K, RET, ARGS> : never) }>>\n <unknown> this;\n const rules = <Record<string, GeneratorRule<Context>>> self.rules;\n if (rules[rule.name] !== undefined && rules[rule.name] !== rule) {\n throw new Error(`Rule ${rule.name} already exists in the GeneratorBuilder`);\n }\n rules[rule.name] = rule;\n return self;\n }\n\n /**\n * Add a rule to the grammar. Will raise a typescript error if the rule already exists in the grammar.\n */\n public addRule<U extends string, RET, ARGS extends any[]>(\n rule: CheckOverlap<U, Names, GeneratorRule<Context, U, RET, ARGS>>,\n ): GeneratorBuilder<Context, Names | U, {[K in Names | U]: K extends Names ?\n (RuleDefs[K] extends GeneratorRule<Context, K> ? RuleDefs[K] : never)\n : (K extends U ? GeneratorRule<Context, K, RET, ARGS> : never)\n }> {\n return this.addRuleRedundant(rule);\n }\n\n public addMany<U extends readonly GeneratorRule<Context>[]>(\n ...rules: CheckOverlap<ParseNamesFromList<U>, Names, U>\n ): GeneratorBuilder<\n Context,\n Names | ParseNamesFromList<U>,\n {[K in Names | ParseNamesFromList<U>]:\n K extends keyof GenRulesToObject<typeof rules> ? (\n GenRulesToObject<typeof rules>[K] extends GeneratorRule<Context, K> ? GenRulesToObject<typeof rules>[K] : never\n ) : (\n K extends Names ? (RuleDefs[K] extends GeneratorRule<Context, K> ? RuleDefs[K] : never) : never\n )\n }\n > {\n this.rules = { ...this.rules, ...listToRuleDefMap(rules) };\n return <any> <unknown> this;\n }\n\n /**\n * Delete a grammar rule by its name.\n */\n public deleteRule<U extends Names>(ruleName: U):\n GeneratorBuilder<Context, Exclude<Names, U>, {[K in Exclude<Names, U>]:\n RuleDefs[K] extends GeneratorRule<Context, K> ? RuleDefs[K] : never }> {\n delete this.rules[ruleName];\n return <GeneratorBuilder<Context, Exclude<Names, U>, {[K in Exclude<Names, U>]:\n RuleDefs[K] extends GeneratorRule<Context, K> ? RuleDefs[K] : never }>>\n <unknown> this;\n }\n\n public getRule<U extends Names>(ruleName: U): RuleDefs[U] extends GeneratorRule<any, U, infer RT, infer PT> ?\n GeneratorRule<Context, U, RT, PT> : never {\n return <any> this.rules[ruleName];\n }\n\n /**\n * Merge this grammar GeneratorBuilder with another.\n * It is best to merge the bigger grammar with the smaller one.\n * If the two builders both have a grammar rule with the same name,\n * no error will be thrown case they map to the same ruledef object.\n * If they map to a different object, an error will be thrown.\n * To fix this problem, the overridingRules array should contain a rule with the same conflicting name,\n * this rule implementation will be used.\n */\n public merge<\n OtherNames extends string,\n OtherRules extends GenRuleMap<OtherNames>,\n OW extends readonly GeneratorRule<Context>[],\n >(\n GeneratorBuilder: GeneratorBuilder<Context, OtherNames, OtherRules>,\n overridingRules: OW,\n ):\n GeneratorBuilder<\n Context,\n Names | OtherNames | ParseNamesFromList<OW>,\n {[K in Names | OtherNames | ParseNamesFromList<OW>]:\n K extends keyof GenRulesToObject<OW> ? (\n GenRulesToObject<OW>[K] extends GeneratorRule<Context, K> ? GenRulesToObject<OW>[K] : never\n )\n : (\n K extends Names ? (RuleDefs[K] extends GeneratorRule<Context, K> ? RuleDefs[K] : never)\n : K extends OtherNames ? (OtherRules[K] extends GeneratorRule<Context, K> ? OtherRules[K] : never)\n : never\n ) }\n > {\n // Assume the other grammar is bigger than yours. So start from that one and add this one\n const otherRules: Record<string, GeneratorRule<Context>> = { ...GeneratorBuilder.rules };\n const myRules: Record<string, GeneratorRule<Context>> = this.rules;\n\n for (const rule of Object.values(myRules)) {\n if (otherRules[rule.name] === undefined) {\n otherRules[rule.name] = rule;\n } else {\n const existingRule = otherRules[rule.name];\n // If same rule, no issue, move on. Else\n if (existingRule !== rule) {\n const override = overridingRules.find(x => x.name === rule.name);\n // If override specified, take override, else, inform user that there is a conflict\n if (override) {\n otherRules[rule.name] = override;\n } else {\n throw new Error(`Rule with name \"${rule.name}\" already exists in the GeneratorBuilder, specify an override to resolve conflict`);\n }\n }\n }\n }\n\n this.rules = <any> <unknown> otherRules;\n return <any> <unknown> this;\n }\n\n public build(): GeneratorFromRules<Context, Names, RuleDefs> {\n return <GeneratorFromRules<Context, Names, RuleDefs>> new DynamicGenerator(this.rules);\n }\n}\n"]}
@@ -1,16 +1,3 @@
1
1
  "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __copyProps = (to, from, except, desc) => {
7
- if (from && typeof from === "object" || typeof from === "function") {
8
- for (let key of __getOwnPropNames(from))
9
- if (!__hasOwnProp.call(to, key) && key !== except)
10
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
- }
12
- return to;
13
- };
14
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
- var generatorTypes_exports = {};
16
- module.exports = __toCommonJS(generatorTypes_exports);
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=generatorTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generatorTypes.js","sourceRoot":"","sources":["../../../../lib/generator-builder/generatorTypes.ts"],"names":[],"mappings":"","sourcesContent":["import type { Localized } from '../types.js';\n\n/**\n * Type used to declare generator rules.\n */\nexport type GeneratorRule<\n /**\n * Context object available in rule implementation.\n */\n Context = any,\n /**\n * Name of grammar rule, should be a strict subtype of string like 'myGrammarRule'.\n */\n NameType extends string = string,\n /**\n * Type that of the AST that we will generate the string for.\n * This type will be the provided when calling SUBRULE with this generator rule.\n * Generation happens on a per AST node basis.\n * The core will implement the generation as such. If this ever changes, we will cross that bridge when we get there.\n */\n AstType = any,\n /**\n * Function arguments that can be given to convey the state of the current parse operation.\n */\n ParamType extends any[] = any[],\n> = {\n name: NameType;\n gImpl: (def: RuleDefArg) =>\n (ast: AstType, context: Context, ...params: ParamType) => void;\n};\n\nexport interface RuleDefArg {\n /**\n * Call another generator rule so it can generate its string representation.\n * @param rule the rule to be called\n * @param input the ast input to work on\n * @param arg the remaining parameters required by this rule.\n */\n SUBRULE: <T, U extends any[]>(rule: GeneratorRule<any, any, T, U>, input: T, ...arg: U) => void;\n /**\n * Print the characters to the output string\n * @param args arguments to be printed\n */\n PRINT: (...args: string[]) => void;\n /**\n * Ensures the requested characters are printed at the current location.\n * Will not change the constructed string in case either:\n * 1. The string builder ends in the to ensure string.\n * 2: The next printed string starts with the ensure string.\n * Otherwise, prints the sting.\n */\n ENSURE: (...args: string[]) => void;\n /**\n * Ensures either one of the provided strings. If no string can be ensured, it will print the first argument.\n */\n ENSURE_EITHER: (...args: string[]) => void;\n /**\n * Create a new line, will ensure the previous line does not end in blank characters.\n * Will only print a newline if the pointer is not currently on a new line.\n * When the traqulaIndentation is changed in the meanwhile, this will ensure the indentation of teh pointer updated.\n */\n NEW_LINE: (arg?: {\n /**\n * Whether the newline should be printed regardless of the pointer is already on an empty newline.\n */\n force?: boolean;\n }) => void;\n /**\n * Handles the location of a node as if it was generated using a SUBRULE.\n * Can be used to generate many nodes within a single subrule call while still having correct localization handling.\n * @param loc\n * @param nodeHandle\n * @constructor\n */\n HANDLE_LOC: <T>(loc: Localized, nodeHandle: () => T) => T | undefined;\n /**\n * Catchup the string until a given length,\n * printing everything from the current catchup location until the index you provide.\n * @param until\n * @constructor\n */\n CATCHUP: (until: number) => void;\n\n // Derivations from the above fundamental functions\n /**\n * Prints all arguments as one word, ensuring it has a space before and behind each word\n * @param args\n */\n PRINT_WORD: (...args: string[]) => void;\n /**\n * Prints all arguments as words, ensuring they all have a space before and behind them.\n * @param args\n */\n PRINT_WORDS: (...args: string[]) => void;\n /**\n * Start a newline to print arguments on\n */\n PRINT_ON_EMPTY: (...args: string[]) => void;\n /**\n * Prints arguments on its own (shared) line\n */\n PRINT_ON_OWN_LINE: (...args: string[]) => void;\n}\n"]}
@@ -1,59 +1,41 @@
1
1
  "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
9
15
  };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
19
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
- var lib_exports = {};
21
- __export(lib_exports, {
22
- TransformerObject: () => import_TransformerObject.TransformerObject,
23
- TransformerSubTyped: () => import_TransformerSubTyped.TransformerSubTyped,
24
- TransformerTyped: () => import_TransformerTyped.TransformerTyped
25
- });
26
- module.exports = __toCommonJS(lib_exports);
27
- __reExport(lib_exports, require("./generator-builder/builderTypes.js"), module.exports);
28
- __reExport(lib_exports, require("./generator-builder/generatorBuilder.js"), module.exports);
29
- __reExport(lib_exports, require("./generator-builder/generatorTypes.js"), module.exports);
30
- __reExport(lib_exports, require("./indirection-builder/helpers.js"), module.exports);
31
- __reExport(lib_exports, require("./indirection-builder/IndirBuilder.js"), module.exports);
32
- __reExport(lib_exports, require("./lexer-builder/LexerBuilder.js"), module.exports);
33
- __reExport(lib_exports, require("./parser-builder/builderTypes.js"), module.exports);
34
- __reExport(lib_exports, require("./parser-builder/parserBuilder.js"), module.exports);
35
- __reExport(lib_exports, require("./parser-builder/ruleDefTypes.js"), module.exports);
36
- __reExport(lib_exports, require("./utils.js"), module.exports);
37
- __reExport(lib_exports, require("./AstCoreFactory.js"), module.exports);
38
- __reExport(lib_exports, require("./types.js"), module.exports);
39
- var import_TransformerObject = require("./transformers/TransformerObject.js");
40
- var import_TransformerTyped = require("./transformers/TransformerTyped.js");
41
- var import_TransformerSubTyped = require("./transformers/TransformerSubTyped.js");
42
- // Annotate the CommonJS export names for ESM import in node:
43
- 0 && (module.exports = {
44
- TransformerObject,
45
- TransformerSubTyped,
46
- TransformerTyped,
47
- ...require("./generator-builder/builderTypes.js"),
48
- ...require("./generator-builder/generatorBuilder.js"),
49
- ...require("./generator-builder/generatorTypes.js"),
50
- ...require("./indirection-builder/helpers.js"),
51
- ...require("./indirection-builder/IndirBuilder.js"),
52
- ...require("./lexer-builder/LexerBuilder.js"),
53
- ...require("./parser-builder/builderTypes.js"),
54
- ...require("./parser-builder/parserBuilder.js"),
55
- ...require("./parser-builder/ruleDefTypes.js"),
56
- ...require("./utils.js"),
57
- ...require("./AstCoreFactory.js"),
58
- ...require("./types.js")
59
- });
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.TransformerSubTyped = exports.TransformerTyped = exports.TransformerObject = void 0;
18
+ // Export generator builder
19
+ __exportStar(require("./generator-builder/builderTypes.js"), exports);
20
+ __exportStar(require("./generator-builder/generatorBuilder.js"), exports);
21
+ __exportStar(require("./generator-builder/generatorTypes.js"), exports);
22
+ // Export Indirection Builder
23
+ __exportStar(require("./indirection-builder/helpers.js"), exports);
24
+ __exportStar(require("./indirection-builder/IndirBuilder.js"), exports);
25
+ // Export lexer builder
26
+ __exportStar(require("./lexer-builder/LexerBuilder.js"), exports);
27
+ // Export parser builder
28
+ __exportStar(require("./parser-builder/builderTypes.js"), exports);
29
+ __exportStar(require("./parser-builder/parserBuilder.js"), exports);
30
+ __exportStar(require("./parser-builder/ruleDefTypes.js"), exports);
31
+ // Export general types
32
+ __exportStar(require("./utils.js"), exports);
33
+ __exportStar(require("./AstCoreFactory.js"), exports);
34
+ __exportStar(require("./types.js"), exports);
35
+ var TransformerObject_js_1 = require("./transformers/TransformerObject.js");
36
+ Object.defineProperty(exports, "TransformerObject", { enumerable: true, get: function () { return TransformerObject_js_1.TransformerObject; } });
37
+ var TransformerTyped_js_1 = require("./transformers/TransformerTyped.js");
38
+ Object.defineProperty(exports, "TransformerTyped", { enumerable: true, get: function () { return TransformerTyped_js_1.TransformerTyped; } });
39
+ var TransformerSubTyped_js_1 = require("./transformers/TransformerSubTyped.js");
40
+ Object.defineProperty(exports, "TransformerSubTyped", { enumerable: true, get: function () { return TransformerSubTyped_js_1.TransformerSubTyped; } });
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,2BAA2B;AAC3B,sEAAoD;AACpD,0EAAwD;AACxD,wEAAsD;AACtD,6BAA6B;AAC7B,mEAAiD;AACjD,wEAAsD;AACtD,uBAAuB;AACvB,kEAAgD;AAChD,wBAAwB;AACxB,mEAAiD;AACjD,oEAAkD;AAClD,mEAAiD;AACjD,uBAAuB;AACvB,6CAA2B;AAC3B,sDAAoC;AACpC,6CAA2B;AAC3B,4EAK6C;AAF3C,yHAAA,iBAAiB,OAAA;AAGnB,0EAA0F;AAAjF,uHAAA,gBAAgB,OAAA;AACzB,gFAA4E;AAAnE,6HAAA,mBAAmB,OAAA","sourcesContent":["// Export generator builder\nexport * from './generator-builder/builderTypes.js';\nexport * from './generator-builder/generatorBuilder.js';\nexport * from './generator-builder/generatorTypes.js';\n// Export Indirection Builder\nexport * from './indirection-builder/helpers.js';\nexport * from './indirection-builder/IndirBuilder.js';\n// Export lexer builder\nexport * from './lexer-builder/LexerBuilder.js';\n// Export parser builder\nexport * from './parser-builder/builderTypes.js';\nexport * from './parser-builder/parserBuilder.js';\nexport * from './parser-builder/ruleDefTypes.js';\n// Export general types\nexport * from './utils.js';\nexport * from './AstCoreFactory.js';\nexport * from './types.js';\nexport {\n VisitContext,\n TransformContext,\n TransformerObject,\n SelectiveTraversalContext,\n} from './transformers/TransformerObject.js';\nexport { TransformerTyped, Safeness, SafeWrap } from './transformers/TransformerTyped.js';\nexport { TransformerSubTyped } from './transformers/TransformerSubTyped.js';\n"]}
@@ -1,90 +1,68 @@
1
1
  "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var IndirBuilder_exports = {};
20
- __export(IndirBuilder_exports, {
21
- IndirBuilder: () => IndirBuilder
22
- });
23
- module.exports = __toCommonJS(IndirBuilder_exports);
24
- var import_dynamicIndirected = require("./dynamicIndirected.js");
25
- var import_helpers = require("./helpers.js");
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IndirBuilder = void 0;
4
+ const dynamicIndirected_js_1 = require("./dynamicIndirected.js");
5
+ const helpers_js_1 = require("./helpers.js");
26
6
  class IndirBuilder {
27
- static create(start) {
28
- if (Array.isArray(start)) {
29
- return new IndirBuilder((0, import_helpers.listToIndirectionMap)(start));
7
+ static create(start) {
8
+ if (Array.isArray(start)) {
9
+ return new IndirBuilder((0, helpers_js_1.listToIndirectionMap)(start));
10
+ }
11
+ return new IndirBuilder({ ...start.rules });
30
12
  }
31
- return new IndirBuilder({ ...start.rules });
32
- }
33
- rules;
34
- constructor(startRules) {
35
- this.rules = startRules;
36
- }
37
- widenContext() {
38
- return this;
39
- }
40
- typePatch() {
41
- return this;
42
- }
43
- /**
44
- * Change the implementation of an existing indirection.
45
- */
46
- patchRule(patch) {
47
- const self = this;
48
- self.rules[patch.name] = patch;
49
- return self;
50
- }
51
- /**
52
- * Add an indirection function. If the rule already exists, but the implementation differs, an error will be thrown.
53
- */
54
- addRuleRedundant(rule) {
55
- const self = this;
56
- const rules = self.rules;
57
- if (rules[rule.name] !== void 0 && rules[rule.name] !== rule) {
58
- throw new Error(`Function ${rule.name} already exists in the builder`);
13
+ rules;
14
+ constructor(startRules) {
15
+ this.rules = startRules;
16
+ }
17
+ widenContext() {
18
+ return this;
19
+ }
20
+ typePatch() {
21
+ return this;
22
+ }
23
+ /**
24
+ * Change the implementation of an existing indirection.
25
+ */
26
+ patchRule(patch) {
27
+ const self = this;
28
+ self.rules[patch.name] = patch;
29
+ return self;
30
+ }
31
+ /**
32
+ * Add an indirection function. If the rule already exists, but the implementation differs, an error will be thrown.
33
+ */
34
+ addRuleRedundant(rule) {
35
+ const self = this;
36
+ const rules = self.rules;
37
+ if (rules[rule.name] !== undefined && rules[rule.name] !== rule) {
38
+ throw new Error(`Function ${rule.name} already exists in the builder`);
39
+ }
40
+ rules[rule.name] = rule;
41
+ return self;
42
+ }
43
+ /**
44
+ * Add a rule to the grammar. Will raise a typescript error if the rule already exists in the grammar.
45
+ */
46
+ addRule(rule) {
47
+ return this.addRuleRedundant(rule);
48
+ }
49
+ addMany(...rules) {
50
+ this.rules = { ...this.rules, ...(0, helpers_js_1.listToIndirectionMap)(rules) };
51
+ return this;
52
+ }
53
+ /**
54
+ * Delete a grammar rule by its name.
55
+ */
56
+ deleteRule(ruleName) {
57
+ delete this.rules[ruleName];
58
+ return this;
59
+ }
60
+ getRule(ruleName) {
61
+ return this.rules[ruleName];
62
+ }
63
+ build() {
64
+ return new dynamicIndirected_js_1.DynamicIndirect(this.rules);
59
65
  }
60
- rules[rule.name] = rule;
61
- return self;
62
- }
63
- /**
64
- * Add a rule to the grammar. Will raise a typescript error if the rule already exists in the grammar.
65
- */
66
- addRule(rule) {
67
- return this.addRuleRedundant(rule);
68
- }
69
- addMany(...rules) {
70
- this.rules = { ...this.rules, ...(0, import_helpers.listToIndirectionMap)(rules) };
71
- return this;
72
- }
73
- /**
74
- * Delete a grammar rule by its name.
75
- */
76
- deleteRule(ruleName) {
77
- delete this.rules[ruleName];
78
- return this;
79
- }
80
- getRule(ruleName) {
81
- return this.rules[ruleName];
82
- }
83
- build() {
84
- return new import_dynamicIndirected.DynamicIndirect(this.rules);
85
- }
86
66
  }
87
- // Annotate the CommonJS export names for ESM import in node:
88
- 0 && (module.exports = {
89
- IndirBuilder
90
- });
67
+ exports.IndirBuilder = IndirBuilder;
68
+ //# sourceMappingURL=IndirBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndirBuilder.js","sourceRoot":"","sources":["../../../../lib/indirection-builder/IndirBuilder.ts"],"names":[],"mappings":";;;AAEA,iEAAyD;AAEzD,6CAAoD;AAEpD,MAAa,YAAY;IAUhB,MAAM,CAAC,MAAM,CAMlB,KAAqD;QAErD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAA0D,IAAI,YAAY,CAAC,IAAA,iCAAoB,EAAC,KAAK,CAAC,CAAC,CAAC;QAC1G,CAAC;QACD,OAAO,IAAI,YAAY,CAAC,EAAE,GAAiC,KAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7E,CAAC;IAEO,KAAK,CAAW;IAExB,YAAoB,UAAoB;QACtC,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;IAC1B,CAAC;IAEM,YAAY;QAOjB,OAAa,IAAI,CAAC;IACpB,CAAC;IAEM,SAAS;QASd,OAAa,IAAI,CAAC;IACpB,CAAC;IAED;;OAEG;IACI,SAAS,CAA2C,KAAsC;QAK/F,MAAM,IAAI,GAEE,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAS,KAAK,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACI,gBAAgB,CAA4C,IAAqC;QAKtG,MAAM,IAAI,GAGE,IAAI,CAAC;QACjB,MAAM,KAAK,GAAuC,IAAI,CAAC,KAAK,CAAC;QAC7D,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,CAAC,IAAI,gCAAgC,CAAC,CAAC;QACzE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACI,OAAO,CACZ,IAA6D;QAI7D,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAEM,OAAO,CACZ,GAAG,KAAoD;QAYvD,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,IAAA,iCAAoB,EAAC,KAAK,CAAC,EAAE,CAAC;QAC/D,OAAuB,IAAI,CAAC;IAC9B,CAAC;IAED;;OAEG;IACI,UAAU,CAAkB,QAAW;QAG5C,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5B,OAEY,IAAI,CAAC;IACnB,CAAC;IAEM,OAAO,CAAkB,QAAW;QAEzC,OAAa,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAEM,KAAK;QACV,OAA4D,IAAI,sCAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9F,CAAC;CACF;AAvID,oCAuIC","sourcesContent":["import type { ParseNamesFromList } from '../parser-builder/builderTypes.js';\nimport type { CheckOverlap } from '../utils.js';\nimport { DynamicIndirect } from './dynamicIndirected.js';\nimport type { IndirDef, IndirectionMap, IndirectObjFromIndirDefs, ParseIndirsToObject } from './helpers.js';\nimport { listToIndirectionMap } from './helpers.js';\n\nexport class IndirBuilder<Context, Names extends string, RuleDefs extends IndirectionMap<Names>> {\n public static create<Context, Names extends string, RuleDefs extends IndirectionMap<Names>>(\n args: IndirBuilder<Context, Names, RuleDefs>\n ): IndirBuilder<Context, Names, RuleDefs>;\n public static create<\n Rules extends readonly IndirDef[] = readonly IndirDef[],\n Context = Rules[0] extends IndirDef<infer context> ? context : never,\n Names extends string = ParseNamesFromList<Rules>,\n RuleDefs extends IndirectionMap<Names> = ParseIndirsToObject<Rules>,\n >(rules: Rules): IndirBuilder<Context, Names, RuleDefs>;\n public static create<\n Rules extends readonly IndirDef[] = readonly IndirDef[],\n Context = Rules[0] extends IndirDef<infer context> ? context : never,\n Names extends string = ParseNamesFromList<Rules>,\n RuleDefs extends IndirectionMap<Names> = ParseIndirsToObject<Rules>,\n >(\n start: Rules | IndirBuilder<Context, Names, RuleDefs>,\n ): IndirBuilder<Context, Names, RuleDefs> {\n if (Array.isArray(start)) {\n return <IndirBuilder<Context, Names, RuleDefs>> <unknown> new IndirBuilder(listToIndirectionMap(start));\n }\n return new IndirBuilder({ ...(<IndirBuilder<any, any, any>>start).rules });\n }\n\n private rules: RuleDefs;\n\n private constructor(startRules: RuleDefs) {\n this.rules = startRules;\n }\n\n public widenContext<NewContext extends Context>(): IndirBuilder<\n NewContext,\n Names,\n {[Key in keyof RuleDefs]: Key extends Names ?\n (RuleDefs[Key] extends IndirDef<any, any, infer RT, infer PT> ? IndirDef<NewContext, Key, RT, PT> : never)\n : never }\n > {\n return <any> this;\n }\n\n public typePatch<Patch extends {[Key in Names]?: [any] | [any, any[]]}>():\n IndirBuilder<Context, Names, {[Key in Names]: Key extends keyof Patch ? (\n Patch[Key] extends [any, any[]] ? IndirDef<Context, Key, Patch[Key][0], Patch[Key][1]> : (\n // Only one - infer arg yourself\n Patch[Key] extends [ any ] ? (\n RuleDefs[Key] extends IndirDef<any, any, any, infer Par> ? IndirDef<Context, Key, Patch[Key][0], Par> : never\n ) : never\n )\n ) : (RuleDefs[Key] extends IndirDef<Context, Key> ? RuleDefs[Key] : never) }> {\n return <any> this;\n }\n\n /**\n * Change the implementation of an existing indirection.\n */\n public patchRule<U extends Names, RET, ARGS extends any[]>(patch: IndirDef<Context, U, RET, ARGS>):\n IndirBuilder<Context, Names, {[Key in Names]: Key extends U ?\n IndirDef<Context, Key, RET, ARGS> :\n (RuleDefs[Key] extends IndirDef<Context, Key> ? RuleDefs[Key] : never)\n } > {\n const self = <IndirBuilder<Context, Names, {[Key in Names]: Key extends U ?\n IndirDef<Context, Key, RET, ARGS> : (RuleDefs[Key] extends IndirDef<Context, Key> ? RuleDefs[Key] : never) }>>\n <unknown> this;\n self.rules[patch.name] = <any> patch;\n return self;\n }\n\n /**\n * Add an indirection function. If the rule already exists, but the implementation differs, an error will be thrown.\n */\n public addRuleRedundant<U extends string, RET, ARGS extends any[]>(rule: IndirDef<Context, U, RET, ARGS>):\n IndirBuilder<Context, Names | U, {[K in Names | U]: K extends U ?\n IndirDef<Context, K, RET, ARGS> :\n (K extends Names ? (RuleDefs[K] extends IndirDef<Context, K> ? RuleDefs[K] : never) : never)\n }> {\n const self = <IndirBuilder<Context, Names | U, {[K in Names | U]: K extends U ?\n IndirDef<Context, K, RET, ARGS> :\n (K extends Names ? (RuleDefs[K] extends IndirDef<Context, K> ? RuleDefs[K] : never) : never) }>>\n <unknown> this;\n const rules = <Record<string, IndirDef<Context>>> self.rules;\n if (rules[rule.name] !== undefined && rules[rule.name] !== rule) {\n throw new Error(`Function ${rule.name} already exists in the builder`);\n }\n rules[rule.name] = rule;\n return self;\n }\n\n /**\n * Add a rule to the grammar. Will raise a typescript error if the rule already exists in the grammar.\n */\n public addRule<U extends string, RET, ARGS extends any[]>(\n rule: CheckOverlap<U, Names, IndirDef<Context, U, RET, ARGS>>,\n ): IndirBuilder<Context, Names | U, {[K in Names | U]: K extends U ?\n IndirDef<Context, K, RET, ARGS> :\n (K extends Names ? (RuleDefs[K] extends IndirDef<Context, K> ? RuleDefs[K] : never) : never) }> {\n return this.addRuleRedundant(rule);\n }\n\n public addMany<U extends readonly IndirDef<Context>[]>(\n ...rules: CheckOverlap<ParseNamesFromList<U>, Names, U>\n ): IndirBuilder<\n Context,\n Names | ParseNamesFromList<U>,\n {[K in Names | ParseNamesFromList<U>]:\n K extends keyof ParseIndirsToObject<typeof rules> ? (\n ParseIndirsToObject<typeof rules>[K] extends IndirDef<Context, K> ? ParseIndirsToObject<typeof rules>[K] : never\n ) : (\n K extends Names ? (RuleDefs[K] extends IndirDef<Context, K> ? RuleDefs[K] : never) : never\n )\n }\n > {\n this.rules = { ...this.rules, ...listToIndirectionMap(rules) };\n return <any> <unknown> this;\n }\n\n /**\n * Delete a grammar rule by its name.\n */\n public deleteRule<U extends Names>(ruleName: U):\n IndirBuilder<Context, Exclude<Names, U>, {[K in Exclude<Names, U>]:\n RuleDefs[K] extends IndirDef<Context, K> ? RuleDefs[K] : never }> {\n delete this.rules[ruleName];\n return <IndirBuilder<Context, Exclude<Names, U>, {[K in Exclude<Names, U>]:\n RuleDefs[K] extends IndirDef<Context, K> ? RuleDefs[K] : never }>>\n <unknown> this;\n }\n\n public getRule<U extends Names>(ruleName: U): RuleDefs[U] extends IndirDef<any, U, infer RT, infer PT> ?\n IndirDef<Context, U, RT, PT> : never {\n return <any> this.rules[ruleName];\n }\n\n public build(): IndirectObjFromIndirDefs<Context, Names, RuleDefs> {\n return <IndirectObjFromIndirDefs<Context, Names, RuleDefs>> new DynamicIndirect(this.rules);\n }\n}\n"]}