@traqula/core 0.0.20 → 0.0.22

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 (111) hide show
  1. package/dist/cjs/lib/AstCoreFactory.js +152 -0
  2. package/dist/cjs/lib/generator-builder/builderTypes.js +16 -0
  3. package/dist/cjs/lib/generator-builder/dynamicGenerator.js +207 -0
  4. package/dist/cjs/lib/generator-builder/generatorBuilder.js +126 -0
  5. package/dist/cjs/lib/generator-builder/generatorTypes.js +16 -0
  6. package/dist/cjs/lib/index.js +59 -0
  7. package/dist/cjs/lib/indirection-builder/IndirBuilder.js +90 -0
  8. package/dist/cjs/lib/indirection-builder/dynamicIndirected.js +55 -0
  9. package/dist/cjs/lib/indirection-builder/helpers.js +34 -0
  10. package/dist/cjs/lib/lexer-builder/LexerBuilder.js +123 -0
  11. package/dist/cjs/lib/parser-builder/builderTypes.js +16 -0
  12. package/dist/cjs/lib/parser-builder/dynamicParser.js +139 -0
  13. package/dist/cjs/lib/parser-builder/parserBuilder.js +182 -0
  14. package/dist/cjs/lib/parser-builder/ruleDefTypes.js +16 -0
  15. package/dist/cjs/lib/transformers/TransformerObject.js +213 -0
  16. package/dist/cjs/lib/transformers/TransformerSubTyped.js +144 -0
  17. package/dist/cjs/lib/transformers/TransformerTyped.js +123 -0
  18. package/dist/cjs/lib/types.js +16 -0
  19. package/dist/cjs/lib/utils.js +39 -0
  20. package/dist/cjs/test/generatorBuilder/generatorBuilder.types.test.js +30 -0
  21. package/dist/cjs/test/grammar-builder/parserBuilder.types.test.js +27 -0
  22. package/dist/cjs/test/transformer.test.js +82 -0
  23. package/{lib → dist/esm/lib}/AstCoreFactory.d.ts +2 -9
  24. package/dist/esm/lib/AstCoreFactory.js.map +1 -0
  25. package/dist/esm/lib/generator-builder/builderTypes.js.map +1 -0
  26. package/dist/esm/lib/generator-builder/dynamicGenerator.js.map +1 -0
  27. package/dist/esm/lib/generator-builder/generatorBuilder.js.map +1 -0
  28. package/{lib → dist/esm/lib}/generator-builder/generatorTypes.d.ts +1 -1
  29. package/dist/esm/lib/generator-builder/generatorTypes.js.map +1 -0
  30. package/{lib → dist/esm/lib}/index.d.ts +4 -4
  31. package/{lib → dist/esm/lib}/index.js +4 -4
  32. package/dist/esm/lib/index.js.map +1 -0
  33. package/dist/esm/lib/indirection-builder/IndirBuilder.js.map +1 -0
  34. package/dist/esm/lib/indirection-builder/dynamicIndirected.js.map +1 -0
  35. package/dist/esm/lib/indirection-builder/helpers.js.map +1 -0
  36. package/{lib → dist/esm/lib}/lexer-builder/LexerBuilder.d.ts +2 -3
  37. package/{lib → dist/esm/lib}/lexer-builder/LexerBuilder.js +1 -1
  38. package/dist/esm/lib/lexer-builder/LexerBuilder.js.map +1 -0
  39. package/{lib → dist/esm/lib}/parser-builder/builderTypes.d.ts +1 -1
  40. package/dist/esm/lib/parser-builder/builderTypes.js.map +1 -0
  41. package/{lib → dist/esm/lib}/parser-builder/dynamicParser.d.ts +2 -2
  42. package/{lib → dist/esm/lib}/parser-builder/dynamicParser.js +1 -1
  43. package/dist/esm/lib/parser-builder/dynamicParser.js.map +1 -0
  44. package/{lib → dist/esm/lib}/parser-builder/parserBuilder.d.ts +1 -2
  45. package/dist/esm/lib/parser-builder/parserBuilder.js.map +1 -0
  46. package/{lib → dist/esm/lib}/parser-builder/ruleDefTypes.d.ts +1 -2
  47. package/dist/esm/lib/parser-builder/ruleDefTypes.js.map +1 -0
  48. package/{lib → dist/esm/lib/transformers}/TransformerObject.d.ts +2 -1
  49. package/{lib → dist/esm/lib/transformers}/TransformerObject.js +6 -3
  50. package/dist/esm/lib/transformers/TransformerObject.js.map +1 -0
  51. package/dist/esm/lib/transformers/TransformerSubTyped.d.ts +59 -0
  52. package/{lib → dist/esm/lib/transformers}/TransformerSubTyped.js +3 -0
  53. package/dist/esm/lib/transformers/TransformerSubTyped.js.map +1 -0
  54. package/{lib → dist/esm/lib/transformers}/TransformerTyped.d.ts +9 -20
  55. package/{lib → dist/esm/lib/transformers}/TransformerTyped.js +3 -0
  56. package/dist/esm/lib/transformers/TransformerTyped.js.map +1 -0
  57. package/{lib/nodeTypings.d.ts → dist/esm/lib/types.d.ts} +8 -3
  58. package/dist/esm/lib/types.js +2 -0
  59. package/dist/esm/lib/types.js.map +1 -0
  60. package/{lib → dist/esm/lib}/utils.d.ts +1 -1
  61. package/{lib → dist/esm/lib}/utils.js +1 -1
  62. package/dist/esm/lib/utils.js.map +1 -0
  63. package/dist/esm/test/generatorBuilder/generatorBuilder.types.test.d.ts +1 -0
  64. package/dist/esm/test/generatorBuilder/generatorBuilder.types.test.js +38 -0
  65. package/dist/esm/test/generatorBuilder/generatorBuilder.types.test.js.map +1 -0
  66. package/dist/esm/test/grammar-builder/parserBuilder.types.test.d.ts +1 -0
  67. package/dist/esm/test/grammar-builder/parserBuilder.types.test.js +38 -0
  68. package/dist/esm/test/grammar-builder/parserBuilder.types.test.js.map +1 -0
  69. package/dist/esm/test/transformer.test.d.ts +1 -0
  70. package/dist/esm/test/transformer.test.js +82 -0
  71. package/dist/esm/test/transformer.test.js.map +1 -0
  72. package/package.json +12 -17
  73. package/lib/AstCoreFactory.js.map +0 -1
  74. package/lib/TransformerObject.js.map +0 -1
  75. package/lib/TransformerSubTyped.d.ts +0 -94
  76. package/lib/TransformerSubTyped.js.map +0 -1
  77. package/lib/TransformerTyped.js.map +0 -1
  78. package/lib/generator-builder/builderTypes.js.map +0 -1
  79. package/lib/generator-builder/dynamicGenerator.js.map +0 -1
  80. package/lib/generator-builder/generatorBuilder.js.map +0 -1
  81. package/lib/generator-builder/generatorTypes.js.map +0 -1
  82. package/lib/index.cjs +0 -10544
  83. package/lib/index.js.map +0 -1
  84. package/lib/indirection-builder/IndirBuilder.js.map +0 -1
  85. package/lib/indirection-builder/dynamicIndirected.js.map +0 -1
  86. package/lib/indirection-builder/helpers.js.map +0 -1
  87. package/lib/lexer-builder/LexerBuilder.js.map +0 -1
  88. package/lib/nodeTypings.js +0 -2
  89. package/lib/nodeTypings.js.map +0 -1
  90. package/lib/parser-builder/builderTypes.js.map +0 -1
  91. package/lib/parser-builder/dynamicParser.js.map +0 -1
  92. package/lib/parser-builder/parserBuilder.js.map +0 -1
  93. package/lib/parser-builder/ruleDefTypes.js.map +0 -1
  94. package/lib/utils.js.map +0 -1
  95. /package/{lib → dist/esm/lib}/AstCoreFactory.js +0 -0
  96. /package/{lib → dist/esm/lib}/generator-builder/builderTypes.d.ts +0 -0
  97. /package/{lib → dist/esm/lib}/generator-builder/builderTypes.js +0 -0
  98. /package/{lib → dist/esm/lib}/generator-builder/dynamicGenerator.d.ts +0 -0
  99. /package/{lib → dist/esm/lib}/generator-builder/dynamicGenerator.js +0 -0
  100. /package/{lib → dist/esm/lib}/generator-builder/generatorBuilder.d.ts +0 -0
  101. /package/{lib → dist/esm/lib}/generator-builder/generatorBuilder.js +0 -0
  102. /package/{lib → dist/esm/lib}/generator-builder/generatorTypes.js +0 -0
  103. /package/{lib → dist/esm/lib}/indirection-builder/IndirBuilder.d.ts +0 -0
  104. /package/{lib → dist/esm/lib}/indirection-builder/IndirBuilder.js +0 -0
  105. /package/{lib → dist/esm/lib}/indirection-builder/dynamicIndirected.d.ts +0 -0
  106. /package/{lib → dist/esm/lib}/indirection-builder/dynamicIndirected.js +0 -0
  107. /package/{lib → dist/esm/lib}/indirection-builder/helpers.d.ts +0 -0
  108. /package/{lib → dist/esm/lib}/indirection-builder/helpers.js +0 -0
  109. /package/{lib → dist/esm/lib}/parser-builder/builderTypes.js +0 -0
  110. /package/{lib → dist/esm/lib}/parser-builder/parserBuilder.js +0 -0
  111. /package/{lib → dist/esm/lib}/parser-builder/ruleDefTypes.js +0 -0
@@ -0,0 +1,213 @@
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 TransformerObject_exports = {};
20
+ __export(TransformerObject_exports, {
21
+ TransformerObject: () => TransformerObject
22
+ });
23
+ module.exports = __toCommonJS(TransformerObject_exports);
24
+ class TransformerObject {
25
+ defaultContext;
26
+ maxStackSize = 1e6;
27
+ /**
28
+ * Creates stateless transformer.
29
+ * @param defaultContext
30
+ */
31
+ constructor(defaultContext = {}) {
32
+ this.defaultContext = defaultContext;
33
+ }
34
+ clone(newDefaultContext = {}) {
35
+ return new TransformerObject({ ...this.defaultContext, ...newDefaultContext });
36
+ }
37
+ /**
38
+ * Function to shallow clone any type.
39
+ * @param obj
40
+ * @protected
41
+ */
42
+ cloneObj(obj) {
43
+ if (obj === null || typeof obj !== "object") {
44
+ return obj;
45
+ }
46
+ const proto = Object.getPrototypeOf(obj);
47
+ if (proto === Object.prototype || proto === null) {
48
+ return { ...obj };
49
+ }
50
+ return Object.assign(Object.create(proto), obj);
51
+ }
52
+ /**
53
+ * Recursively transforms all objects that are not arrays. Mapper is called on deeper objects first.
54
+ * @param startObject object to start iterating from
55
+ * @param mapper mapper to transform the various objects - argument is a copy of the original
56
+ * @param preVisitor callback that is evaluated before iterating deeper.
57
+ * If continues is false, we do not iterate deeper, current object is still mapped. - default: true
58
+ * If shortcut is true, we do not iterate deeper, nor do we branch out, this mapper will be the last one called.
59
+ * - Default false
60
+ */
61
+ transformObject(startObject, mapper, preVisitor = () => ({})) {
62
+ const defaults = this.defaultContext;
63
+ const defaultCopyFlag = defaults.copy ?? true;
64
+ const defaultContinues = defaults.continue ?? true;
65
+ const defaultIgnoreKeys = defaults.ignoreKeys;
66
+ const defaultShallowKeys = defaults.shallowKeys;
67
+ const defaultDidShortCut = defaults.shortcut ?? false;
68
+ let didShortCut = false;
69
+ const resultWrap = { res: startObject };
70
+ const stack = [startObject];
71
+ const stackParent = [resultWrap];
72
+ const stackParentKey = ["res"];
73
+ const handleMapperOnLen = [];
74
+ const mapperCopyStack = [];
75
+ const mapperOrigStack = [];
76
+ const mapperParent = [];
77
+ const mapperParentKey = [];
78
+ function handleMapper() {
79
+ while (stack.length === handleMapperOnLen.at(-1)) {
80
+ handleMapperOnLen.pop();
81
+ const copyToMap = mapperCopyStack.pop();
82
+ const origToMap = mapperOrigStack.pop();
83
+ const parent = mapperParent.pop();
84
+ const parentKey = mapperParentKey.pop();
85
+ parent[parentKey] = mapper(copyToMap, origToMap);
86
+ }
87
+ }
88
+ while (stack.length > 0 && stack.length < this.maxStackSize) {
89
+ const curObject = stack.pop();
90
+ const curParent = stackParent.pop();
91
+ const curKey = stackParentKey.pop();
92
+ if (!didShortCut) {
93
+ if (Array.isArray(curObject)) {
94
+ const newArr = [...curObject];
95
+ handleMapperOnLen.push(stack.length);
96
+ mapperCopyStack.push(newArr);
97
+ mapperOrigStack.push(curObject);
98
+ mapperParent.push(curParent);
99
+ mapperParentKey.push(curKey);
100
+ for (let index = curObject.length - 1; index >= 0; index--) {
101
+ const val = curObject[index];
102
+ if (val !== null && typeof val === "object") {
103
+ stack.push(val);
104
+ stackParent.push(newArr);
105
+ stackParentKey.push(index.toString());
106
+ }
107
+ }
108
+ handleMapper();
109
+ continue;
110
+ }
111
+ const context = preVisitor(curObject);
112
+ const copyFlag = context.copy ?? defaultCopyFlag;
113
+ const continues = context.continue ?? defaultContinues;
114
+ const ignoreKeys = context.ignoreKeys ?? defaultIgnoreKeys;
115
+ const shallowKeys = context.shallowKeys ?? defaultShallowKeys;
116
+ didShortCut = context.shortcut ?? defaultDidShortCut;
117
+ const copy = copyFlag ? this.cloneObj(curObject) : curObject;
118
+ handleMapperOnLen.push(stack.length);
119
+ mapperCopyStack.push(copy);
120
+ mapperOrigStack.push(curObject);
121
+ mapperParent.push(curParent);
122
+ mapperParentKey.push(curKey);
123
+ if (continues && !didShortCut) {
124
+ for (const key in copy) {
125
+ if (!Object.hasOwn(copy, key)) {
126
+ continue;
127
+ }
128
+ const val = copy[key];
129
+ const onlyShallow = shallowKeys && shallowKeys?.has(key);
130
+ if (onlyShallow) {
131
+ copy[key] = this.cloneObj(val);
132
+ }
133
+ if (ignoreKeys && ignoreKeys.has(key)) {
134
+ continue;
135
+ }
136
+ if (!onlyShallow && val !== null && typeof val === "object") {
137
+ stack.push(val);
138
+ stackParentKey.push(key);
139
+ stackParent.push(copy);
140
+ }
141
+ }
142
+ }
143
+ }
144
+ handleMapper();
145
+ }
146
+ if (stack.length >= this.maxStackSize) {
147
+ throw new Error("Transform object stack overflowed");
148
+ }
149
+ handleMapper();
150
+ return resultWrap.res;
151
+ }
152
+ /**
153
+ * Visitor that visits all objects. Visits deeper objects first.
154
+ */
155
+ visitObject(startObject, visitor, preVisitor = () => ({})) {
156
+ const defaults = this.defaultContext;
157
+ const defaultContinues = defaults.continue ?? true;
158
+ const defaultIgnoreKeys = defaults.ignoreKeys;
159
+ const defaultShortcut = defaults.shortcut ?? false;
160
+ let didShortCut = false;
161
+ const stack = [startObject];
162
+ const handleVisitorOnLen = [];
163
+ const visitorStack = [];
164
+ function handleVisitor() {
165
+ while (stack.length === handleVisitorOnLen.at(-1)) {
166
+ handleVisitorOnLen.pop();
167
+ const toVisit = visitorStack.pop();
168
+ visitor(toVisit);
169
+ }
170
+ }
171
+ while (stack.length > 0 && stack.length < this.maxStackSize) {
172
+ const curObject = stack.pop();
173
+ if (!didShortCut) {
174
+ if (Array.isArray(curObject)) {
175
+ for (let i = curObject.length - 1; i >= 0; i--) {
176
+ stack.push(curObject[i]);
177
+ }
178
+ handleVisitor();
179
+ continue;
180
+ }
181
+ const context = preVisitor(curObject);
182
+ didShortCut = context.shortcut ?? defaultShortcut;
183
+ const continues = context.continue ?? defaultContinues;
184
+ const ignoreKeys = context.ignoreKeys ?? defaultIgnoreKeys;
185
+ handleVisitorOnLen.push(stack.length);
186
+ visitorStack.push(curObject);
187
+ if (continues && !didShortCut) {
188
+ for (const key in curObject) {
189
+ if (!Object.hasOwn(curObject, key)) {
190
+ continue;
191
+ }
192
+ if (ignoreKeys && ignoreKeys.has(key)) {
193
+ continue;
194
+ }
195
+ const val = curObject[key];
196
+ if (val && typeof val === "object") {
197
+ stack.push(val);
198
+ }
199
+ }
200
+ }
201
+ }
202
+ handleVisitor();
203
+ }
204
+ if (stack.length >= this.maxStackSize) {
205
+ throw new Error("Transform object stack overflowed");
206
+ }
207
+ handleVisitor();
208
+ }
209
+ }
210
+ // Annotate the CommonJS export names for ESM import in node:
211
+ 0 && (module.exports = {
212
+ TransformerObject
213
+ });
@@ -0,0 +1,144 @@
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 TransformerSubTyped_exports = {};
20
+ __export(TransformerSubTyped_exports, {
21
+ TransformerSubTyped: () => TransformerSubTyped
22
+ });
23
+ module.exports = __toCommonJS(TransformerSubTyped_exports);
24
+ var import_TransformerTyped = require("./TransformerTyped.js");
25
+ class TransformerSubTyped extends import_TransformerTyped.TransformerTyped {
26
+ constructor(defaultContext = {}, defaultNodePreVisitor = {}) {
27
+ super(defaultContext, defaultNodePreVisitor);
28
+ }
29
+ clone(newDefaultContext = {}, newDefaultNodePreVisitor = {}) {
30
+ return new TransformerSubTyped({ ...this.defaultContext, ...newDefaultContext }, { ...this.defaultNodePreVisitor, ...newDefaultNodePreVisitor });
31
+ }
32
+ /**
33
+ * Shares the functionality and first two arguments with {@link this.transformNode}.
34
+ * The third argument allows you to also transform based on the subType of objects.
35
+ * Note that when a callback for the subtype is provided, the callback for the general type is **NOT** executed.
36
+ * @param startObject
37
+ * @param nodeCallBacks
38
+ * @param nodeSpecificCallBacks
39
+ */
40
+ transformNodeSpecific(startObject, nodeCallBacks, nodeSpecificCallBacks) {
41
+ const transformWrapper = (copy, orig) => {
42
+ let ogTransform;
43
+ const casted = copy;
44
+ if (casted.type && casted.subType) {
45
+ const specific = nodeSpecificCallBacks[casted.type];
46
+ if (specific) {
47
+ ogTransform = specific[casted.subType]?.transform;
48
+ }
49
+ if (!ogTransform) {
50
+ ogTransform = nodeCallBacks[casted.type]?.transform;
51
+ }
52
+ }
53
+ return ogTransform ? ogTransform(casted, orig) : copy;
54
+ };
55
+ const preVisitWrapper = (curObject) => {
56
+ let ogPreVisit;
57
+ const casted = curObject;
58
+ if (casted.type && casted.subType) {
59
+ const specific = nodeSpecificCallBacks[casted.type];
60
+ if (specific) {
61
+ ogPreVisit = specific[casted.subType]?.preVisitor;
62
+ }
63
+ if (!ogPreVisit) {
64
+ ogPreVisit = nodeCallBacks[casted.type]?.preVisitor;
65
+ }
66
+ }
67
+ return ogPreVisit ? ogPreVisit(casted) : {};
68
+ };
69
+ return this.transformObject(startObject, transformWrapper, preVisitWrapper);
70
+ }
71
+ /**
72
+ * Similar to {@link this.visitNode} but also allows you to match based on the subtype of objects.
73
+ * When both nodeCallBack and NodeSpecific callBack are matched, will only visit nodeSpecifCallback
74
+ */
75
+ visitNodeSpecific(startObject, nodeCallBacks, nodeSpecificCallBacks) {
76
+ const visitWrapper = (curObject) => {
77
+ let ogTransform;
78
+ const casted = curObject;
79
+ if (casted.type && casted.subType) {
80
+ const specific = nodeSpecificCallBacks[casted.type];
81
+ if (specific) {
82
+ ogTransform = specific[casted.subType]?.visitor;
83
+ }
84
+ if (!ogTransform) {
85
+ ogTransform = nodeCallBacks[casted.type]?.visitor;
86
+ }
87
+ }
88
+ if (ogTransform) {
89
+ ogTransform(casted);
90
+ }
91
+ };
92
+ const preVisitWrapper = (curObject) => {
93
+ let ogPreVisit;
94
+ const casted = curObject;
95
+ if (casted.type && casted.subType) {
96
+ const specific = nodeSpecificCallBacks[casted.type];
97
+ if (specific) {
98
+ ogPreVisit = specific[casted.subType]?.preVisitor;
99
+ }
100
+ if (!ogPreVisit) {
101
+ ogPreVisit = nodeCallBacks[casted.type]?.preVisitor;
102
+ }
103
+ }
104
+ return ogPreVisit ? ogPreVisit(casted) : {};
105
+ };
106
+ this.visitObject(startObject, visitWrapper, preVisitWrapper);
107
+ }
108
+ /**
109
+ * Similar to {@link this.traverseNodes} but also allows you to match based on the subtype of objects.
110
+ * @param currentNode
111
+ * @param traverseNode
112
+ * @param traverseSubNode
113
+ */
114
+ traverseSubNodes(currentNode, traverseNode, traverseSubNode) {
115
+ let didShortCut = false;
116
+ const recurse = (curNode) => {
117
+ let traverser;
118
+ const subObj = traverseSubNode[curNode.type];
119
+ if (subObj) {
120
+ traverser = subObj[curNode.subType];
121
+ }
122
+ if (!traverser) {
123
+ traverser = traverseNode[curNode.type];
124
+ }
125
+ if (traverser) {
126
+ const { next, shortcut } = traverser(curNode);
127
+ didShortCut = shortcut ?? false;
128
+ if (!didShortCut) {
129
+ for (const node of next ?? []) {
130
+ if (didShortCut) {
131
+ return;
132
+ }
133
+ recurse(node);
134
+ }
135
+ }
136
+ }
137
+ };
138
+ recurse(currentNode);
139
+ }
140
+ }
141
+ // Annotate the CommonJS export names for ESM import in node:
142
+ 0 && (module.exports = {
143
+ TransformerSubTyped
144
+ });
@@ -0,0 +1,123 @@
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 TransformerTyped_exports = {};
20
+ __export(TransformerTyped_exports, {
21
+ TransformerTyped: () => TransformerTyped
22
+ });
23
+ module.exports = __toCommonJS(TransformerTyped_exports);
24
+ var import_TransformerObject = require("./TransformerObject.js");
25
+ class TransformerTyped extends import_TransformerObject.TransformerObject {
26
+ defaultNodePreVisitor;
27
+ constructor(defaultContext = {}, defaultNodePreVisitor = {}) {
28
+ super(defaultContext);
29
+ this.defaultNodePreVisitor = defaultNodePreVisitor;
30
+ }
31
+ clone(newDefaultContext = {}, newDefaultNodePreVisitor = {}) {
32
+ return new TransformerTyped({ ...this.defaultContext, ...newDefaultContext }, { ...this.defaultNodePreVisitor, ...newDefaultNodePreVisitor });
33
+ }
34
+ /**
35
+ * Transform a single node.
36
+ * The transformation calls the preVisitor from starting from the startObject.
37
+ * The preVisitor can dictate whether transformation should be stopped.
38
+ * Note that stopping the transformation also prevets further copying.
39
+ * The transformer itself transforms object starting with the deepest one that can be visited.
40
+ * The transformer callback is performed on a copy of the original.
41
+ * @param startObject
42
+ * @param nodeCallBacks
43
+ */
44
+ transformNode(startObject, nodeCallBacks) {
45
+ const transformWrapper = (copy, orig) => {
46
+ let ogTransform;
47
+ const casted = copy;
48
+ if (casted.type) {
49
+ ogTransform = nodeCallBacks[casted.type]?.transform;
50
+ }
51
+ return ogTransform ? ogTransform(casted, orig) : copy;
52
+ };
53
+ const nodeDefaults = this.defaultNodePreVisitor;
54
+ const preVisitWrapper = (curObject) => {
55
+ let ogPreVisit;
56
+ let nodeContext = {};
57
+ const casted = curObject;
58
+ if (casted.type) {
59
+ ogPreVisit = nodeCallBacks[casted.type]?.preVisitor;
60
+ nodeContext = nodeDefaults[casted.type] ?? nodeContext;
61
+ }
62
+ return ogPreVisit ? { ...nodeContext, ...ogPreVisit(casted) } : nodeContext;
63
+ };
64
+ return this.transformObject(startObject, transformWrapper, preVisitWrapper);
65
+ }
66
+ /**
67
+ * Similar to {@link this.transformNode}, but without copying the startObject.
68
+ * The pre-visitor visits starting from the root, going deeper, while the actual visitor goes in reverse.
69
+ * @param startObject
70
+ * @param nodeCallBacks
71
+ */
72
+ visitNode(startObject, nodeCallBacks) {
73
+ const visitorWrapper = (curObject) => {
74
+ const casted = curObject;
75
+ if (casted.type) {
76
+ const ogTransform = nodeCallBacks[casted.type]?.visitor;
77
+ if (ogTransform) {
78
+ ogTransform(casted);
79
+ }
80
+ }
81
+ };
82
+ const nodeDefaults = this.defaultNodePreVisitor;
83
+ const preVisitWrapper = (curObject) => {
84
+ let ogPreVisit;
85
+ let nodeContext = {};
86
+ const casted = curObject;
87
+ if (casted.type) {
88
+ ogPreVisit = nodeCallBacks[casted.type]?.preVisitor;
89
+ nodeContext = nodeDefaults[casted.type] ?? nodeContext;
90
+ }
91
+ return ogPreVisit ? { ...nodeContext, ...ogPreVisit(casted) } : nodeContext;
92
+ };
93
+ return this.visitObject(startObject, visitorWrapper, preVisitWrapper);
94
+ }
95
+ /**
96
+ * Traverses only selected nodes as returned by the function.
97
+ * @param currentNode
98
+ * @param traverse
99
+ */
100
+ traverseNodes(currentNode, traverse) {
101
+ let didShortCut = false;
102
+ const recurse = (curNode) => {
103
+ const traverser = traverse[curNode.type];
104
+ if (traverser) {
105
+ const { next, shortcut } = traverser(curNode);
106
+ didShortCut = shortcut ?? false;
107
+ if (!didShortCut) {
108
+ for (const node of next ?? []) {
109
+ if (didShortCut) {
110
+ return;
111
+ }
112
+ recurse(node);
113
+ }
114
+ }
115
+ }
116
+ };
117
+ recurse(currentNode);
118
+ }
119
+ }
120
+ // Annotate the CommonJS export names for ESM import in node:
121
+ 0 && (module.exports = {
122
+ TransformerTyped
123
+ });
@@ -0,0 +1,16 @@
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 types_exports = {};
16
+ module.exports = __toCommonJS(types_exports);
@@ -0,0 +1,39 @@
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 utils_exports = {};
20
+ __export(utils_exports, {
21
+ createToken: () => createToken,
22
+ traqulaIndentation: () => traqulaIndentation,
23
+ unCapitalize: () => unCapitalize
24
+ });
25
+ module.exports = __toCommonJS(utils_exports);
26
+ var import_chevrotain = require("@traqula/chevrotain");
27
+ function unCapitalize(str) {
28
+ return str.charAt(0).toLowerCase() + str.slice(1);
29
+ }
30
+ function createToken(config) {
31
+ return (0, import_chevrotain.createToken)(config);
32
+ }
33
+ const traqulaIndentation = "When you use this string, you expect traqula to handle indentation after every newline";
34
+ // Annotate the CommonJS export names for ESM import in node:
35
+ 0 && (module.exports = {
36
+ createToken,
37
+ traqulaIndentation,
38
+ unCapitalize
39
+ });
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var import_vitest = require("vitest");
3
+ var import_lib = require("../../lib/index.js");
4
+ const RuleA = {
5
+ name: "apple",
6
+ gImpl: () => () => {
7
+ }
8
+ };
9
+ const RuleB = {
10
+ name: "banana",
11
+ gImpl: () => () => {
12
+ }
13
+ };
14
+ const RuleC = {
15
+ name: "coconut",
16
+ gImpl: () => () => {
17
+ }
18
+ };
19
+ (0, import_vitest.describe)("parserBuilder", () => {
20
+ (0, import_vitest.describe)("types", () => {
21
+ (0, import_vitest.it)("builder constructor", () => {
22
+ (0, import_vitest.expectTypeOf)(import_lib.GeneratorBuilder.create([RuleA])).branded.toEqualTypeOf();
23
+ (0, import_vitest.expectTypeOf)(import_lib.GeneratorBuilder.create([RuleB])).branded.toEqualTypeOf();
24
+ (0, import_vitest.expectTypeOf)(import_lib.GeneratorBuilder.create([RuleA, RuleB])).branded.toEqualTypeOf();
25
+ (0, import_vitest.expectTypeOf)(import_lib.GeneratorBuilder.create([RuleA, RuleB]).addRule(RuleC)).branded.toEqualTypeOf();
26
+ (0, import_vitest.expectTypeOf)(import_lib.GeneratorBuilder.create([RuleA]).merge(import_lib.GeneratorBuilder.create([RuleB]), [])).branded.toEqualTypeOf();
27
+ (0, import_vitest.expectTypeOf)(import_lib.GeneratorBuilder.create([RuleA, RuleB]).merge(import_lib.GeneratorBuilder.create([RuleB, RuleC]), [])).branded.toEqualTypeOf();
28
+ });
29
+ });
30
+ });
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var import_vitest = require("vitest");
3
+ var import_lib = require("../../lib/index.js");
4
+ const RuleA = {
5
+ name: "apple",
6
+ impl: () => () => "apple"
7
+ };
8
+ const RuleB = {
9
+ name: "banana",
10
+ impl: () => () => "banana"
11
+ };
12
+ const RuleC = {
13
+ name: "coconut",
14
+ impl: () => () => "coconut"
15
+ };
16
+ (0, import_vitest.describe)("parserBuilder", () => {
17
+ (0, import_vitest.describe)("types", () => {
18
+ (0, import_vitest.it)("builder constructor", () => {
19
+ (0, import_vitest.expectTypeOf)(import_lib.ParserBuilder.create([RuleA])).branded.toEqualTypeOf();
20
+ (0, import_vitest.expectTypeOf)(import_lib.ParserBuilder.create([RuleB])).branded.toEqualTypeOf();
21
+ (0, import_vitest.expectTypeOf)(import_lib.ParserBuilder.create([RuleA, RuleB])).branded.toEqualTypeOf();
22
+ (0, import_vitest.expectTypeOf)(import_lib.ParserBuilder.create([RuleA, RuleB]).addRule(RuleC)).branded.toEqualTypeOf();
23
+ (0, import_vitest.expectTypeOf)(import_lib.ParserBuilder.create([RuleA]).merge(import_lib.ParserBuilder.create([RuleB]), [])).branded.toEqualTypeOf();
24
+ (0, import_vitest.expectTypeOf)(import_lib.ParserBuilder.create([RuleA, RuleB]).merge(import_lib.ParserBuilder.create([RuleB, RuleC]), [])).branded.toEqualTypeOf();
25
+ });
26
+ });
27
+ });
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ var import_vitest = require("vitest");
3
+ var import_lib = require("../lib/index.js");
4
+ (0, import_vitest.describe)("transformer", () => {
5
+ const transformer = new import_lib.TransformerTyped();
6
+ (0, import_vitest.it)("makes copies when needed", ({ expect }) => {
7
+ const fruit = {
8
+ type: "fruit",
9
+ clone1: { type: "vegetable", random: { type: "fruit", val: "blep" } }
10
+ };
11
+ const fullCopy = transformer.transformNode(fruit, {});
12
+ expect(fullCopy).not.toBe(fruit);
13
+ expect(fullCopy.clone1).not.toBe(fruit.clone1);
14
+ expect(fullCopy.clone1.random).not.toBe(fruit.clone1.random);
15
+ const sameVegetable = transformer.transformNode(fruit, {
16
+ vegetable: { preVisitor: () => ({ copy: false }) },
17
+ fruit: { transform: (fruit2) => {
18
+ fruit2.test = "yes";
19
+ return fruit2;
20
+ } }
21
+ });
22
+ expect(sameVegetable).not.toBe(fruit);
23
+ expect(sameVegetable.clone1).toBe(fruit.clone1);
24
+ expect(sameVegetable.clone1.random).toMatchObject({ test: "yes" });
25
+ });
26
+ (0, import_vitest.it)("knows shortcut and continue", ({ expect }) => {
27
+ const in2 = { type: "fruit", val: "depth3" };
28
+ const in1 = { type: "vegetable", in: in2, val: "depth2" };
29
+ const side1 = { type: "fruit", val: "side1" };
30
+ const side2 = { type: "vegetable" };
31
+ const fruit = { type: "fruit", in: in1, val: "depth1", side: side1, side2 };
32
+ const onlyCopyDepth1 = transformer.transformNode(fruit, {
33
+ fruit: { preVisitor: () => ({ continue: false }) }
34
+ });
35
+ expect(onlyCopyDepth1).not.toBe(fruit);
36
+ expect(onlyCopyDepth1.in).toBe(in1);
37
+ expect(onlyCopyDepth1.in.in).toBe(in2);
38
+ expect(onlyCopyDepth1.side).toBe(side1);
39
+ const doNotCopy = transformer.transformNode(fruit, {
40
+ fruit: { preVisitor: () => ({ continue: false, copy: false }) }
41
+ });
42
+ expect(doNotCopy).toBe(fruit);
43
+ expect(doNotCopy.in).toBe(in1);
44
+ expect(doNotCopy.in.in).toBe(in2);
45
+ expect(doNotCopy.side).toBe(side1);
46
+ const doNotCopyByShortcut = transformer.transformNode(fruit, {
47
+ fruit: { preVisitor: () => ({ shortcut: true }) }
48
+ });
49
+ expect(doNotCopyByShortcut).not.toBe(fruit);
50
+ expect(doNotCopyByShortcut.in).toBe(in1);
51
+ expect(doNotCopyByShortcut.in.in).toBe(in2);
52
+ expect(doNotCopyByShortcut.side).toBe(side1);
53
+ const doNotCopySideWhenShortcut = transformer.transformNode(fruit, {
54
+ vegetable: { preVisitor: () => ({ shortcut: true }) }
55
+ });
56
+ expect(doNotCopySideWhenShortcut).not.toBe(fruit);
57
+ expect(doNotCopySideWhenShortcut.in).toBe(in1);
58
+ expect(doNotCopySideWhenShortcut.in.in).toBe(in2);
59
+ expect(doNotCopySideWhenShortcut.side).toBe(side1);
60
+ expect(doNotCopySideWhenShortcut.side2).not.toBe(side2);
61
+ });
62
+ (0, import_vitest.it)("knows shallowKeys and ignoreKeys", ({ expect }) => {
63
+ const in2 = { type: "fruit", val: "depth3" };
64
+ const in1 = { type: "vegetable", in: in2, val: "depth2" };
65
+ const side1 = { type: "fruit", val: "side1" };
66
+ const fruit = { type: "fruit", in: in1, val: "depth1", side: side1 };
67
+ const noDeepOnShallowKeys = transformer.transformNode(fruit, {
68
+ fruit: { preVisitor: () => ({ shallowKeys: /* @__PURE__ */ new Set(["in"]) }) }
69
+ });
70
+ expect(noDeepOnShallowKeys).not.toBe(fruit);
71
+ expect(noDeepOnShallowKeys.in).not.toBe(in1);
72
+ expect(noDeepOnShallowKeys.in.in).toBe(in2);
73
+ expect(noDeepOnShallowKeys.side).not.toBe(side1);
74
+ const ignoreKeysAreIgnored = transformer.transformNode(fruit, {
75
+ fruit: { preVisitor: () => ({ ignoreKeys: /* @__PURE__ */ new Set(["in"]) }) }
76
+ });
77
+ expect(ignoreKeysAreIgnored).not.toBe(fruit);
78
+ expect(ignoreKeysAreIgnored.in).toBe(in1);
79
+ expect(ignoreKeysAreIgnored.in.in).toBe(in2);
80
+ expect(ignoreKeysAreIgnored.side).not.toBe(side1);
81
+ });
82
+ });