@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.
@@ -135,7 +135,7 @@ describe("makePropertyMap tests", () => {
135
135
 
136
136
  const propertyMap = makePropertyMap(treeObject);
137
137
 
138
- expect(propertyMap.get("'some-key'")?.value).toStrictEqual("value");
139
- expect(propertyMap.get("'some-otherkey'")?.value).toStrictEqual("value");
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(token.constraints, localGenerics)
273
+ ? fillInGenerics(
274
+ token.constraints,
275
+ localGenerics,
276
+ preferLocalGenerics,
277
+ )
250
278
  : undefined,
251
279
  default: token.default
252
- ? fillInGenerics(token.default, localGenerics)
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(xlrNode.extends, localGenerics) as RefNode)
291
+ ? (fillInGenerics(
292
+ xlrNode.extends,
293
+ localGenerics,
294
+ preferLocalGenerics,
295
+ ) as RefNode)
260
296
  : undefined,
261
297
  additionalProperties: xlrNode.additionalProperties
262
- ? fillInGenerics(xlrNode.additionalProperties, localGenerics)
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(xlrNode.elementType, localGenerics),
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(xlrNode.keyType, localGenerics),
290
- valueType: fillInGenerics(xlrNode.valueType, localGenerics),
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(xlrNode.check.left, localGenerics),
297
- right: fillInGenerics(xlrNode.check.right, localGenerics),
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(xlrNode.value.true, localGenerics),
301
- false: fillInGenerics(xlrNode.value.false, localGenerics),
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
  }
@@ -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.TypeAliasDeclaration | ts.InterfaceDeclaration;
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>): 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 */