@xlr-lib/xlr-utils 0.1.1-next.2 → 0.1.1-next.3
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/index.cjs +76 -22
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/index.legacy-esm.js +75 -22
- package/dist/index.mjs +75 -22
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/ts-helpers.test.ts +706 -9
- package/src/__tests__/validation-helpers.test.ts +2 -2
- package/src/ts-helpers.ts +85 -17
- package/src/validation-helpers.ts +1 -7
- package/types/ts-helpers.d.ts +6 -2
|
@@ -135,7 +135,7 @@ describe("makePropertyMap tests", () => {
|
|
|
135
135
|
|
|
136
136
|
const propertyMap = makePropertyMap(treeObject);
|
|
137
137
|
|
|
138
|
-
expect(propertyMap.get("
|
|
139
|
-
expect(propertyMap.get("
|
|
138
|
+
expect(propertyMap.get("some-key")?.value).toStrictEqual("value");
|
|
139
|
+
expect(propertyMap.get("some-otherkey")?.value).toStrictEqual("value");
|
|
140
140
|
});
|
|
141
141
|
});
|
package/src/ts-helpers.ts
CHANGED
|
@@ -31,6 +31,15 @@ export function isExportedDeclaration(node: ts.Statement): boolean {
|
|
|
31
31
|
return false;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
+
/**
|
|
35
|
+
* Returns if the top level declaration is exported
|
|
36
|
+
*/
|
|
37
|
+
export function isExportedModuleDeclaration(
|
|
38
|
+
node: ts.Statement,
|
|
39
|
+
): node is ts.ModuleDeclaration {
|
|
40
|
+
return isExportedDeclaration(node) && ts.isModuleDeclaration(node);
|
|
41
|
+
}
|
|
42
|
+
|
|
34
43
|
/**
|
|
35
44
|
* Returns if the node is exported from the source file
|
|
36
45
|
*/
|
|
@@ -49,7 +58,12 @@ export function isNodeExported(node: ts.Node): boolean {
|
|
|
49
58
|
export function getReferencedType(
|
|
50
59
|
node: ts.TypeReferenceNode,
|
|
51
60
|
typeChecker: ts.TypeChecker,
|
|
52
|
-
)
|
|
61
|
+
):
|
|
62
|
+
| {
|
|
63
|
+
declaration: ts.InterfaceDeclaration | ts.TypeAliasDeclaration;
|
|
64
|
+
exported: boolean;
|
|
65
|
+
}
|
|
66
|
+
| undefined {
|
|
53
67
|
let symbol = typeChecker.getSymbolAtLocation(node.typeName);
|
|
54
68
|
|
|
55
69
|
if (
|
|
@@ -178,12 +192,22 @@ export function buildTemplateRegex(
|
|
|
178
192
|
export function fillInGenerics(
|
|
179
193
|
xlrNode: NodeType,
|
|
180
194
|
generics?: Map<string, NodeType>,
|
|
195
|
+
preferLocalGenerics = false,
|
|
181
196
|
): NodeType {
|
|
182
197
|
// Need to make sure not to set generics in passed in map to avoid using generics outside of tree
|
|
183
198
|
let localGenerics: Map<string, NodeType>;
|
|
184
199
|
|
|
185
200
|
if (generics) {
|
|
186
201
|
localGenerics = new Map(generics);
|
|
202
|
+
if (preferLocalGenerics && isGenericNodeType(xlrNode)) {
|
|
203
|
+
xlrNode.genericTokens?.forEach((token) => {
|
|
204
|
+
const genericValue = (token.default ?? token.constraints) as NodeType;
|
|
205
|
+
localGenerics.set(
|
|
206
|
+
token.symbol,
|
|
207
|
+
fillInGenerics(genericValue, localGenerics, preferLocalGenerics),
|
|
208
|
+
);
|
|
209
|
+
});
|
|
210
|
+
}
|
|
187
211
|
} else {
|
|
188
212
|
localGenerics = new Map();
|
|
189
213
|
if (isGenericNodeType(xlrNode)) {
|
|
@@ -191,7 +215,7 @@ export function fillInGenerics(
|
|
|
191
215
|
const genericValue = (token.default ?? token.constraints) as NodeType;
|
|
192
216
|
localGenerics.set(
|
|
193
217
|
token.symbol,
|
|
194
|
-
fillInGenerics(genericValue, localGenerics),
|
|
218
|
+
fillInGenerics(genericValue, localGenerics, preferLocalGenerics),
|
|
195
219
|
);
|
|
196
220
|
});
|
|
197
221
|
}
|
|
@@ -204,7 +228,7 @@ export function fillInGenerics(
|
|
|
204
228
|
...(xlrNode.genericArguments
|
|
205
229
|
? {
|
|
206
230
|
genericArguments: xlrNode.genericArguments.map((ga) =>
|
|
207
|
-
fillInGenerics(ga, localGenerics),
|
|
231
|
+
fillInGenerics(ga, localGenerics, preferLocalGenerics),
|
|
208
232
|
),
|
|
209
233
|
}
|
|
210
234
|
: {}),
|
|
@@ -220,7 +244,7 @@ export function fillInGenerics(
|
|
|
220
244
|
...(xlrNode.genericArguments
|
|
221
245
|
? {
|
|
222
246
|
genericArguments: xlrNode.genericArguments.map((ga) =>
|
|
223
|
-
fillInGenerics(ga, localGenerics),
|
|
247
|
+
fillInGenerics(ga, localGenerics, preferLocalGenerics),
|
|
224
248
|
),
|
|
225
249
|
}
|
|
226
250
|
: {}),
|
|
@@ -233,7 +257,7 @@ export function fillInGenerics(
|
|
|
233
257
|
const prop = xlrNode.properties[propName];
|
|
234
258
|
newProperties[propName] = {
|
|
235
259
|
required: prop.required,
|
|
236
|
-
node: fillInGenerics(prop.node, localGenerics),
|
|
260
|
+
node: fillInGenerics(prop.node, localGenerics, preferLocalGenerics),
|
|
237
261
|
};
|
|
238
262
|
});
|
|
239
263
|
|
|
@@ -246,20 +270,36 @@ export function fillInGenerics(
|
|
|
246
270
|
return {
|
|
247
271
|
...token,
|
|
248
272
|
constraints: token.constraints
|
|
249
|
-
? fillInGenerics(
|
|
273
|
+
? fillInGenerics(
|
|
274
|
+
token.constraints,
|
|
275
|
+
localGenerics,
|
|
276
|
+
preferLocalGenerics,
|
|
277
|
+
)
|
|
250
278
|
: undefined,
|
|
251
279
|
default: token.default
|
|
252
|
-
? fillInGenerics(
|
|
280
|
+
? fillInGenerics(
|
|
281
|
+
token.default,
|
|
282
|
+
localGenerics,
|
|
283
|
+
preferLocalGenerics,
|
|
284
|
+
)
|
|
253
285
|
: undefined,
|
|
254
286
|
};
|
|
255
287
|
}),
|
|
256
288
|
}
|
|
257
289
|
: {}),
|
|
258
290
|
extends: xlrNode.extends
|
|
259
|
-
? (fillInGenerics(
|
|
291
|
+
? (fillInGenerics(
|
|
292
|
+
xlrNode.extends,
|
|
293
|
+
localGenerics,
|
|
294
|
+
preferLocalGenerics,
|
|
295
|
+
) as RefNode)
|
|
260
296
|
: undefined,
|
|
261
297
|
additionalProperties: xlrNode.additionalProperties
|
|
262
|
-
? fillInGenerics(
|
|
298
|
+
? fillInGenerics(
|
|
299
|
+
xlrNode.additionalProperties,
|
|
300
|
+
localGenerics,
|
|
301
|
+
preferLocalGenerics,
|
|
302
|
+
)
|
|
263
303
|
: false,
|
|
264
304
|
};
|
|
265
305
|
}
|
|
@@ -267,7 +307,11 @@ export function fillInGenerics(
|
|
|
267
307
|
if (xlrNode.type === "array") {
|
|
268
308
|
return {
|
|
269
309
|
...xlrNode,
|
|
270
|
-
elementType: fillInGenerics(
|
|
310
|
+
elementType: fillInGenerics(
|
|
311
|
+
xlrNode.elementType,
|
|
312
|
+
localGenerics,
|
|
313
|
+
preferLocalGenerics,
|
|
314
|
+
),
|
|
271
315
|
};
|
|
272
316
|
} else if (xlrNode.type === "or" || xlrNode.type === "and") {
|
|
273
317
|
let pointer;
|
|
@@ -280,25 +324,49 @@ export function fillInGenerics(
|
|
|
280
324
|
return {
|
|
281
325
|
...xlrNode,
|
|
282
326
|
[xlrNode.type]: pointer.map((prop) => {
|
|
283
|
-
return fillInGenerics(prop, localGenerics);
|
|
327
|
+
return fillInGenerics(prop, localGenerics, preferLocalGenerics);
|
|
284
328
|
}),
|
|
285
329
|
};
|
|
286
330
|
} else if (xlrNode.type === "record") {
|
|
287
331
|
return {
|
|
288
332
|
...xlrNode,
|
|
289
|
-
keyType: fillInGenerics(
|
|
290
|
-
|
|
333
|
+
keyType: fillInGenerics(
|
|
334
|
+
xlrNode.keyType,
|
|
335
|
+
localGenerics,
|
|
336
|
+
preferLocalGenerics,
|
|
337
|
+
),
|
|
338
|
+
valueType: fillInGenerics(
|
|
339
|
+
xlrNode.valueType,
|
|
340
|
+
localGenerics,
|
|
341
|
+
preferLocalGenerics,
|
|
342
|
+
),
|
|
291
343
|
};
|
|
292
344
|
} else if (xlrNode.type === "conditional") {
|
|
293
345
|
const filledInConditional = {
|
|
294
346
|
...xlrNode,
|
|
295
347
|
check: {
|
|
296
|
-
left: fillInGenerics(
|
|
297
|
-
|
|
348
|
+
left: fillInGenerics(
|
|
349
|
+
xlrNode.check.left,
|
|
350
|
+
localGenerics,
|
|
351
|
+
preferLocalGenerics,
|
|
352
|
+
),
|
|
353
|
+
right: fillInGenerics(
|
|
354
|
+
xlrNode.check.right,
|
|
355
|
+
localGenerics,
|
|
356
|
+
preferLocalGenerics,
|
|
357
|
+
),
|
|
298
358
|
},
|
|
299
359
|
value: {
|
|
300
|
-
true: fillInGenerics(
|
|
301
|
-
|
|
360
|
+
true: fillInGenerics(
|
|
361
|
+
xlrNode.value.true,
|
|
362
|
+
localGenerics,
|
|
363
|
+
preferLocalGenerics,
|
|
364
|
+
),
|
|
365
|
+
false: fillInGenerics(
|
|
366
|
+
xlrNode.value.false,
|
|
367
|
+
localGenerics,
|
|
368
|
+
preferLocalGenerics,
|
|
369
|
+
),
|
|
302
370
|
},
|
|
303
371
|
};
|
|
304
372
|
|
|
@@ -20,14 +20,8 @@ export interface PropertyNode {
|
|
|
20
20
|
* Takes a property node and returns the underlying Key/Value Pairs
|
|
21
21
|
*/
|
|
22
22
|
export function propertyToTuple(node: Node): PropertyNode {
|
|
23
|
-
let key = node.children?.[0].value as string;
|
|
24
|
-
if (key.includes("-")) {
|
|
25
|
-
// XLR outputs all escaped properties with single quotes
|
|
26
|
-
key = `'${key}'`;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
23
|
return {
|
|
30
|
-
key,
|
|
24
|
+
key: node.children?.[0].value as string,
|
|
31
25
|
value: node.children?.[1] as Node,
|
|
32
26
|
};
|
|
33
27
|
}
|
package/types/ts-helpers.d.ts
CHANGED
|
@@ -8,6 +8,10 @@ export declare function tsStripOptionalType(node: ts.TypeNode): ts.TypeNode;
|
|
|
8
8
|
* Returns if the top level declaration is exported
|
|
9
9
|
*/
|
|
10
10
|
export declare function isExportedDeclaration(node: ts.Statement): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Returns if the top level declaration is exported
|
|
13
|
+
*/
|
|
14
|
+
export declare function isExportedModuleDeclaration(node: ts.Statement): node is ts.ModuleDeclaration;
|
|
11
15
|
/**
|
|
12
16
|
* Returns if the node is exported from the source file
|
|
13
17
|
*/
|
|
@@ -16,7 +20,7 @@ export declare function isNodeExported(node: ts.Node): boolean;
|
|
|
16
20
|
* Returns the actual type and will following import chains if needed
|
|
17
21
|
*/
|
|
18
22
|
export declare function getReferencedType(node: ts.TypeReferenceNode, typeChecker: ts.TypeChecker): {
|
|
19
|
-
declaration: ts.
|
|
23
|
+
declaration: ts.InterfaceDeclaration | ts.TypeAliasDeclaration;
|
|
20
24
|
exported: boolean;
|
|
21
25
|
} | undefined;
|
|
22
26
|
/**
|
|
@@ -40,7 +44,7 @@ export declare function buildTemplateRegex(node: ts.TemplateLiteralTypeNode, typ
|
|
|
40
44
|
* Walks generics to fill in values from a combination of the default, constraint, and passed in map values
|
|
41
45
|
* TODO convert this to use simpleTransformGenerator
|
|
42
46
|
*/
|
|
43
|
-
export declare function fillInGenerics(xlrNode: NodeType, generics?: Map<string, NodeType
|
|
47
|
+
export declare function fillInGenerics(xlrNode: NodeType, generics?: Map<string, NodeType>, preferLocalGenerics?: boolean): NodeType;
|
|
44
48
|
/** Applies the TS `Pick` or `Omit` type to an interface/union/intersection */
|
|
45
49
|
export declare function applyPickOrOmitToNodeType(baseObject: NodeType, operation: "Pick" | "Omit", properties: Set<string>): NodeType | undefined;
|
|
46
50
|
/** Applies the TS `Partial` or `Required` type to an interface/union/intersection */
|