@traqula/core 0.0.21 → 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.
- package/dist/cjs/lib/AstCoreFactory.js +152 -0
- package/dist/cjs/lib/generator-builder/builderTypes.js +16 -0
- package/dist/cjs/lib/generator-builder/dynamicGenerator.js +207 -0
- package/dist/cjs/lib/generator-builder/generatorBuilder.js +126 -0
- package/dist/cjs/lib/generator-builder/generatorTypes.js +16 -0
- package/dist/cjs/lib/index.js +59 -0
- package/dist/cjs/lib/indirection-builder/IndirBuilder.js +90 -0
- package/dist/cjs/lib/indirection-builder/dynamicIndirected.js +55 -0
- package/dist/cjs/lib/indirection-builder/helpers.js +34 -0
- package/dist/cjs/lib/lexer-builder/LexerBuilder.js +123 -0
- package/dist/cjs/lib/parser-builder/builderTypes.js +16 -0
- package/dist/cjs/lib/parser-builder/dynamicParser.js +139 -0
- package/dist/cjs/lib/parser-builder/parserBuilder.js +182 -0
- package/dist/cjs/lib/parser-builder/ruleDefTypes.js +16 -0
- package/dist/cjs/lib/transformers/TransformerObject.js +213 -0
- package/dist/cjs/lib/transformers/TransformerSubTyped.js +144 -0
- package/dist/cjs/lib/transformers/TransformerTyped.js +123 -0
- package/dist/cjs/lib/types.js +16 -0
- package/dist/cjs/lib/utils.js +39 -0
- package/dist/cjs/test/generatorBuilder/generatorBuilder.types.test.js +30 -0
- package/dist/cjs/test/grammar-builder/parserBuilder.types.test.js +27 -0
- package/dist/cjs/test/transformer.test.js +82 -0
- package/{lib → dist/esm/lib}/AstCoreFactory.d.ts +2 -9
- package/dist/esm/lib/AstCoreFactory.js.map +1 -0
- package/dist/esm/lib/generator-builder/builderTypes.js.map +1 -0
- package/dist/esm/lib/generator-builder/dynamicGenerator.js.map +1 -0
- package/dist/esm/lib/generator-builder/generatorBuilder.js.map +1 -0
- package/{lib → dist/esm/lib}/generator-builder/generatorTypes.d.ts +1 -1
- package/dist/esm/lib/generator-builder/generatorTypes.js.map +1 -0
- package/{lib → dist/esm/lib}/index.d.ts +4 -4
- package/{lib → dist/esm/lib}/index.js +4 -4
- package/dist/esm/lib/index.js.map +1 -0
- package/dist/esm/lib/indirection-builder/IndirBuilder.js.map +1 -0
- package/dist/esm/lib/indirection-builder/dynamicIndirected.js.map +1 -0
- package/dist/esm/lib/indirection-builder/helpers.js.map +1 -0
- package/{lib → dist/esm/lib}/lexer-builder/LexerBuilder.d.ts +2 -3
- package/{lib → dist/esm/lib}/lexer-builder/LexerBuilder.js +1 -1
- package/dist/esm/lib/lexer-builder/LexerBuilder.js.map +1 -0
- package/{lib → dist/esm/lib}/parser-builder/builderTypes.d.ts +1 -1
- package/dist/esm/lib/parser-builder/builderTypes.js.map +1 -0
- package/{lib → dist/esm/lib}/parser-builder/dynamicParser.d.ts +2 -2
- package/{lib → dist/esm/lib}/parser-builder/dynamicParser.js +1 -1
- package/dist/esm/lib/parser-builder/dynamicParser.js.map +1 -0
- package/{lib → dist/esm/lib}/parser-builder/parserBuilder.d.ts +1 -2
- package/dist/esm/lib/parser-builder/parserBuilder.js.map +1 -0
- package/{lib → dist/esm/lib}/parser-builder/ruleDefTypes.d.ts +1 -2
- package/dist/esm/lib/parser-builder/ruleDefTypes.js.map +1 -0
- package/dist/esm/lib/transformers/TransformerObject.js.map +1 -0
- package/{lib → dist/esm/lib/transformers}/TransformerSubTyped.d.ts +14 -50
- package/dist/esm/lib/transformers/TransformerSubTyped.js.map +1 -0
- package/{lib → dist/esm/lib/transformers}/TransformerTyped.d.ts +8 -20
- package/dist/esm/lib/transformers/TransformerTyped.js.map +1 -0
- package/{lib/nodeTypings.d.ts → dist/esm/lib/types.d.ts} +8 -3
- package/dist/esm/lib/types.js +2 -0
- package/dist/esm/lib/types.js.map +1 -0
- package/{lib → dist/esm/lib}/utils.d.ts +1 -1
- package/{lib → dist/esm/lib}/utils.js +1 -1
- package/dist/esm/lib/utils.js.map +1 -0
- package/dist/esm/test/generatorBuilder/generatorBuilder.types.test.d.ts +1 -0
- package/dist/esm/test/generatorBuilder/generatorBuilder.types.test.js +38 -0
- package/dist/esm/test/generatorBuilder/generatorBuilder.types.test.js.map +1 -0
- package/dist/esm/test/grammar-builder/parserBuilder.types.test.d.ts +1 -0
- package/dist/esm/test/grammar-builder/parserBuilder.types.test.js +38 -0
- package/dist/esm/test/grammar-builder/parserBuilder.types.test.js.map +1 -0
- package/dist/esm/test/transformer.test.d.ts +1 -0
- package/dist/esm/test/transformer.test.js +82 -0
- package/dist/esm/test/transformer.test.js.map +1 -0
- package/package.json +12 -17
- package/lib/AstCoreFactory.js.map +0 -1
- package/lib/TransformerObject.js.map +0 -1
- package/lib/TransformerSubTyped.js.map +0 -1
- package/lib/TransformerTyped.js.map +0 -1
- package/lib/generator-builder/builderTypes.js.map +0 -1
- package/lib/generator-builder/dynamicGenerator.js.map +0 -1
- package/lib/generator-builder/generatorBuilder.js.map +0 -1
- package/lib/generator-builder/generatorTypes.js.map +0 -1
- package/lib/index.cjs +0 -10553
- package/lib/index.js.map +0 -1
- package/lib/indirection-builder/IndirBuilder.js.map +0 -1
- package/lib/indirection-builder/dynamicIndirected.js.map +0 -1
- package/lib/indirection-builder/helpers.js.map +0 -1
- package/lib/lexer-builder/LexerBuilder.js.map +0 -1
- package/lib/nodeTypings.js +0 -2
- package/lib/nodeTypings.js.map +0 -1
- package/lib/parser-builder/builderTypes.js.map +0 -1
- package/lib/parser-builder/dynamicParser.js.map +0 -1
- package/lib/parser-builder/parserBuilder.js.map +0 -1
- package/lib/parser-builder/ruleDefTypes.js.map +0 -1
- package/lib/utils.js.map +0 -1
- /package/{lib → dist/esm/lib}/AstCoreFactory.js +0 -0
- /package/{lib → dist/esm/lib}/generator-builder/builderTypes.d.ts +0 -0
- /package/{lib → dist/esm/lib}/generator-builder/builderTypes.js +0 -0
- /package/{lib → dist/esm/lib}/generator-builder/dynamicGenerator.d.ts +0 -0
- /package/{lib → dist/esm/lib}/generator-builder/dynamicGenerator.js +0 -0
- /package/{lib → dist/esm/lib}/generator-builder/generatorBuilder.d.ts +0 -0
- /package/{lib → dist/esm/lib}/generator-builder/generatorBuilder.js +0 -0
- /package/{lib → dist/esm/lib}/generator-builder/generatorTypes.js +0 -0
- /package/{lib → dist/esm/lib}/indirection-builder/IndirBuilder.d.ts +0 -0
- /package/{lib → dist/esm/lib}/indirection-builder/IndirBuilder.js +0 -0
- /package/{lib → dist/esm/lib}/indirection-builder/dynamicIndirected.d.ts +0 -0
- /package/{lib → dist/esm/lib}/indirection-builder/dynamicIndirected.js +0 -0
- /package/{lib → dist/esm/lib}/indirection-builder/helpers.d.ts +0 -0
- /package/{lib → dist/esm/lib}/indirection-builder/helpers.js +0 -0
- /package/{lib → dist/esm/lib}/parser-builder/builderTypes.js +0 -0
- /package/{lib → dist/esm/lib}/parser-builder/parserBuilder.js +0 -0
- /package/{lib → dist/esm/lib}/parser-builder/ruleDefTypes.js +0 -0
- /package/{lib → dist/esm/lib/transformers}/TransformerObject.d.ts +0 -0
- /package/{lib → dist/esm/lib/transformers}/TransformerObject.js +0 -0
- /package/{lib → dist/esm/lib/transformers}/TransformerSubTyped.js +0 -0
- /package/{lib → dist/esm/lib/transformers}/TransformerTyped.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
|
+
});
|