@player-tools/xlr-converters 0.4.2-next.1 → 0.5.0-next.0

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.
@@ -0,0 +1,1276 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/converters/src/index.ts
31
+ var src_exports = {};
32
+ __export(src_exports, {
33
+ ConversionError: () => ConversionError,
34
+ TSWriter: () => TSWriter,
35
+ TsConverter: () => TsConverter
36
+ });
37
+ module.exports = __toCommonJS(src_exports);
38
+
39
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/converters/src/ts-to-xlr.ts
40
+ var import_typescript = __toESM(require("typescript"));
41
+ var import_xlr_utils = require("@player-tools/xlr-utils");
42
+
43
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/converters/src/types.ts
44
+ var ConversionError = class _ConversionError extends Error {
45
+ constructor(msg) {
46
+ super(msg);
47
+ Object.setPrototypeOf(this, _ConversionError.prototype);
48
+ }
49
+ toString() {
50
+ return `Conversion Error: ${this.message}`;
51
+ }
52
+ };
53
+
54
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/converters/src/ts-to-xlr.ts
55
+ function isMappedTypeNode(x) {
56
+ return ["Pick", "Omit", "Required", "Partial", "Exclude"].includes(x);
57
+ }
58
+ var AnyTypeNode = {
59
+ type: "any"
60
+ };
61
+ var TsConverter = class {
62
+ constructor(typeChecker, customPrimitives) {
63
+ this.context = {
64
+ customPrimitives: customPrimitives ?? [],
65
+ typeChecker,
66
+ throwError: (message) => {
67
+ throw new ConversionError(message);
68
+ },
69
+ cache: {
70
+ convertedNodes: /* @__PURE__ */ new Map(),
71
+ convertedTemplates: /* @__PURE__ */ new Map()
72
+ }
73
+ };
74
+ }
75
+ /** Converts all exported objects to a XLR representation */
76
+ convertSourceFile(sourceFile) {
77
+ const declarations = sourceFile.statements.filter(import_xlr_utils.isTopLevelNode);
78
+ const types = declarations.filter((declaration) => (0, import_xlr_utils.isExportedDeclaration)(declaration)).map((statement) => this.convertTopLevelNode(statement)).filter((v) => !!v);
79
+ return {
80
+ data: { version: 1, types },
81
+ convertedTypes: types.map(({ name }) => name)
82
+ };
83
+ }
84
+ convertTopLevelNode(node) {
85
+ const sourceFile = node.parent;
86
+ const { fileName } = sourceFile;
87
+ if (import_typescript.default.isVariableStatement(node)) {
88
+ return {
89
+ source: fileName,
90
+ ...this.convertVariable(node)
91
+ };
92
+ }
93
+ return {
94
+ source: fileName,
95
+ ...this.convertDeclaration(node)
96
+ };
97
+ }
98
+ /** Converts a single type/interface declaration to XLRs */
99
+ convertDeclaration(node) {
100
+ if (import_typescript.default.isTypeAliasDeclaration(node)) {
101
+ let genericTokens;
102
+ if ((0, import_xlr_utils.isGenericTypeDeclaration)(node)) {
103
+ genericTokens = this.generateGenerics(node.typeParameters);
104
+ }
105
+ return {
106
+ name: node.name.getText(),
107
+ ...this.convertTsTypeNode(node.type) ?? AnyTypeNode,
108
+ ...(0, import_xlr_utils.decorateNode)(node),
109
+ genericTokens
110
+ };
111
+ }
112
+ if (import_typescript.default.isInterfaceDeclaration(node)) {
113
+ let genericTokens;
114
+ if ((0, import_xlr_utils.isGenericInterfaceDeclaration)(node)) {
115
+ genericTokens = this.generateGenerics(node.typeParameters);
116
+ }
117
+ const baseObject = {
118
+ name: node.name.getText(),
119
+ type: "object",
120
+ ...this.tsObjectMembersToProperties(node),
121
+ ...(0, import_xlr_utils.decorateNode)(node),
122
+ genericTokens
123
+ };
124
+ if (node.heritageClauses) {
125
+ return this.handleHeritageClauses(
126
+ node.heritageClauses,
127
+ baseObject,
128
+ this.context.typeChecker
129
+ );
130
+ }
131
+ return baseObject;
132
+ }
133
+ this.context.throwError(
134
+ `Error: type node is not an Interface or a Type, can't convert as Declaration`
135
+ );
136
+ }
137
+ convertVariable(node) {
138
+ const variableDeclarations = node.declarationList.declarations;
139
+ if (variableDeclarations.length === 1) {
140
+ const variable = variableDeclarations[0];
141
+ if (variable.initializer) {
142
+ let resultingNode;
143
+ if (import_typescript.default.isCallExpression(variable.initializer) || import_typescript.default.isArrowFunction(variable.initializer)) {
144
+ resultingNode = this.resolveFunctionCall(
145
+ variable.initializer,
146
+ node.parent
147
+ );
148
+ } else {
149
+ resultingNode = this.tsLiteralToType(variable.initializer);
150
+ }
151
+ if (resultingNode.type === "function" || resultingNode.type === "ref") {
152
+ resultingNode = { ...resultingNode, name: variable.name.getText() };
153
+ }
154
+ return {
155
+ name: variable.name.getText(),
156
+ ...resultingNode
157
+ };
158
+ }
159
+ }
160
+ this.context.throwError(
161
+ `Error: Multi-variable declaration on line ${node.pos} is not supported for conversion`
162
+ );
163
+ }
164
+ /** Converts an arbitrary ts.TypeNode to XLRs */
165
+ convertTsTypeNode(node) {
166
+ if (this.context.cache.convertedNodes.has(node)) {
167
+ const cachedType = this.context.cache.convertedNodes.get(
168
+ node
169
+ );
170
+ return JSON.parse(JSON.stringify(cachedType));
171
+ }
172
+ const convertedNode = this.tsNodeToType(node);
173
+ this.context.cache.convertedNodes.set(node, convertedNode);
174
+ return convertedNode;
175
+ }
176
+ /** Should not be called directly unless you want to bypass the cache, use `convertTsTypeNode` */
177
+ tsNodeToType(node) {
178
+ if (import_typescript.default.isUnionTypeNode(node)) {
179
+ return {
180
+ type: "or",
181
+ or: node.types.map((child) => this.convertTsTypeNode(child)).filter(import_xlr_utils.isNonNullable),
182
+ ...(0, import_xlr_utils.decorateNode)(node)
183
+ };
184
+ }
185
+ if (import_typescript.default.isIntersectionTypeNode(node)) {
186
+ return {
187
+ type: "and",
188
+ and: node.types.map((child) => this.convertTsTypeNode(child)).filter(import_xlr_utils.isNonNullable),
189
+ ...(0, import_xlr_utils.decorateNode)(node)
190
+ };
191
+ }
192
+ if (import_typescript.default.isParenthesizedTypeNode(node)) {
193
+ const children = [];
194
+ node.forEachChild((child) => {
195
+ children.push(child);
196
+ });
197
+ if (children[0]?.kind === import_typescript.default.SyntaxKind.OpenParenToken) {
198
+ children.shift();
199
+ }
200
+ if (children[children.length - 1]?.kind === import_typescript.default.SyntaxKind.CloseParenToken) {
201
+ children.pop();
202
+ }
203
+ const element = children[0];
204
+ if (children.length !== 1 || !import_typescript.default.isTypeNode(element)) {
205
+ this.context.throwError(
206
+ `Parenthesis type not understood. Length ${children.length}, Is Type Node: ${import_typescript.default.SyntaxKind[element.kind]}`
207
+ );
208
+ }
209
+ return this.convertTsTypeNode(element);
210
+ }
211
+ if (node.kind === import_typescript.default.SyntaxKind.AnyKeyword) {
212
+ return { type: "any", ...(0, import_xlr_utils.decorateNode)(node) };
213
+ }
214
+ if (node.kind === import_typescript.default.SyntaxKind.UnknownKeyword) {
215
+ return { type: "unknown", ...(0, import_xlr_utils.decorateNode)(node) };
216
+ }
217
+ if (node.kind === import_typescript.default.SyntaxKind.StringKeyword) {
218
+ return { type: "string", ...(0, import_xlr_utils.decorateNode)(node) };
219
+ }
220
+ if (node.kind === import_typescript.default.SyntaxKind.NumberKeyword) {
221
+ return { type: "number", ...(0, import_xlr_utils.decorateNode)(node) };
222
+ }
223
+ if (node.kind === import_typescript.default.SyntaxKind.BooleanKeyword) {
224
+ return { type: "boolean", ...(0, import_xlr_utils.decorateNode)(node) };
225
+ }
226
+ if (node.kind === import_typescript.default.SyntaxKind.UndefinedKeyword) {
227
+ return { type: "undefined", ...(0, import_xlr_utils.decorateNode)(node) };
228
+ }
229
+ if (node.kind === import_typescript.default.SyntaxKind.NeverKeyword) {
230
+ return { type: "never", ...(0, import_xlr_utils.decorateNode)(node) };
231
+ }
232
+ if (node.kind === import_typescript.default.SyntaxKind.ObjectKeyword) {
233
+ return {
234
+ type: "object",
235
+ properties: {},
236
+ additionalProperties: AnyTypeNode,
237
+ ...(0, import_xlr_utils.decorateNode)(node)
238
+ };
239
+ }
240
+ if (node.kind === import_typescript.default.SyntaxKind.VoidKeyword) {
241
+ return {
242
+ type: "void",
243
+ ...(0, import_xlr_utils.decorateNode)(node)
244
+ };
245
+ }
246
+ if (import_typescript.default.isTemplateLiteralTypeNode(node)) {
247
+ let format;
248
+ if (this.context.cache.convertedTemplates.has(node)) {
249
+ format = this.context.cache.convertedTemplates.get(node);
250
+ } else {
251
+ format = (0, import_xlr_utils.buildTemplateRegex)(node, this.context.typeChecker);
252
+ this.context.cache.convertedTemplates.set(node, format);
253
+ }
254
+ return {
255
+ type: "template",
256
+ format
257
+ };
258
+ }
259
+ if (import_typescript.default.isArrayTypeNode(node)) {
260
+ return {
261
+ type: "array",
262
+ elementType: this.convertTsTypeNode(node.elementType) ?? AnyTypeNode,
263
+ ...(0, import_xlr_utils.decorateNode)(node)
264
+ };
265
+ }
266
+ if (import_typescript.default.isConditionalTypeNode(node)) {
267
+ const xlrNode = {
268
+ type: "conditional",
269
+ check: {
270
+ left: this.convertTsTypeNode(node.checkType),
271
+ right: this.convertTsTypeNode(node.extendsType)
272
+ },
273
+ value: {
274
+ true: this.convertTsTypeNode(node.trueType),
275
+ false: this.convertTsTypeNode(node.falseType)
276
+ }
277
+ };
278
+ return (0, import_xlr_utils.resolveConditional)(xlrNode);
279
+ }
280
+ if (import_typescript.default.isTypeReferenceNode(node)) {
281
+ return this.resolveRefNode(node);
282
+ }
283
+ if (import_typescript.default.isTupleTypeNode(node)) {
284
+ return {
285
+ type: "tuple",
286
+ ...this.tsTupleToType(node),
287
+ ...(0, import_xlr_utils.decorateNode)(node)
288
+ };
289
+ }
290
+ if (import_typescript.default.isLiteralTypeNode(node)) {
291
+ return this.tsLiteralToType(node.literal);
292
+ }
293
+ if (import_typescript.default.isTypeLiteralNode(node)) {
294
+ return {
295
+ type: "object",
296
+ ...this.tsObjectMembersToProperties(node),
297
+ ...(0, import_xlr_utils.decorateNode)(node)
298
+ };
299
+ }
300
+ if (import_typescript.default.isFunctionTypeNode(node) || import_typescript.default.isFunctionDeclaration(node) || import_typescript.default.isArrowFunction(node)) {
301
+ const parameters = node.parameters.map(
302
+ (param) => {
303
+ let typeNode;
304
+ if (param.type) {
305
+ typeNode = this.convertTsTypeNode(param.type);
306
+ }
307
+ return {
308
+ name: param.name.getText(),
309
+ type: typeNode ?? AnyTypeNode,
310
+ optional: param.questionToken ? true : void 0,
311
+ default: param.initializer ? this.convertTsTypeNode(
312
+ param.initializer
313
+ ) : void 0
314
+ };
315
+ }
316
+ );
317
+ let returnType;
318
+ if (node.type !== void 0) {
319
+ returnType = this.convertTsTypeNode(node.type);
320
+ }
321
+ return {
322
+ type: "function",
323
+ parameters,
324
+ returnType,
325
+ ...(0, import_xlr_utils.decorateNode)(node)
326
+ };
327
+ }
328
+ if (import_typescript.default.isIndexedAccessTypeNode(node)) {
329
+ if (import_typescript.default.isTypeReferenceNode(node.objectType) && import_typescript.default.isLiteralTypeNode(node.indexType)) {
330
+ const baseObject = this.convertTsTypeNode(node.objectType);
331
+ const accessor = node.indexType.literal.getText().replace(/[""]/g, "");
332
+ if (!baseObject) {
333
+ this.context.throwError(
334
+ `Error: Couldn't resolve index access on property ${accessor} on type ${node.objectType.typeName.getText()}`
335
+ );
336
+ } else if (baseObject.type === "object") {
337
+ if (Object.keys(baseObject.properties ?? {}).includes(accessor)) {
338
+ return baseObject.properties[accessor].node;
339
+ }
340
+ if (baseObject.additionalProperties) {
341
+ return baseObject.additionalProperties;
342
+ }
343
+ } else if (baseObject.type === "ref") {
344
+ return { ...baseObject, property: accessor };
345
+ } else {
346
+ this.context.throwError(
347
+ `Error: Index access on non object/ref type ${baseObject.type}`
348
+ );
349
+ }
350
+ }
351
+ if (import_typescript.default.isTypeQueryNode(node.objectType)) {
352
+ const elements = this.tsNodeToType(node.objectType);
353
+ return {
354
+ type: "or",
355
+ or: [...elements.elementTypes.map((element) => element.type)]
356
+ };
357
+ }
358
+ this.context.throwError(
359
+ `Error: could not solve IndexedAccessType ${node.getFullText()}`
360
+ );
361
+ }
362
+ if (import_typescript.default.isTypeQueryNode(node)) {
363
+ const effectiveType = this.context.typeChecker.getTypeAtLocation(node);
364
+ const syntheticType = this.context.typeChecker.typeToTypeNode(
365
+ effectiveType,
366
+ node,
367
+ import_typescript.default.NodeBuilderFlags.NoTruncation
368
+ );
369
+ if (syntheticType) {
370
+ return this.tsNodeToType(syntheticType);
371
+ }
372
+ this.context.throwError(
373
+ `Error: could not synthesize type for ${node.getText()}`
374
+ );
375
+ }
376
+ if (import_typescript.default.isTypeOperatorNode(node)) {
377
+ return this.tsNodeToType(node.type);
378
+ }
379
+ this.context.throwError(
380
+ `Unimplemented type ${import_typescript.default.SyntaxKind[node.kind]} at ${node.getText()}`
381
+ );
382
+ }
383
+ tsLiteralToType(node) {
384
+ if (import_typescript.default.isNumericLiteral(node)) {
385
+ return {
386
+ type: "number",
387
+ const: Number(node.text),
388
+ ...(0, import_xlr_utils.decorateNode)(node)
389
+ };
390
+ }
391
+ if (import_typescript.default.isStringLiteral(node)) {
392
+ return {
393
+ type: "string",
394
+ const: node.text,
395
+ ...(0, import_xlr_utils.decorateNode)(node)
396
+ };
397
+ }
398
+ if (node.kind === import_typescript.default.SyntaxKind.TrueKeyword) {
399
+ return {
400
+ type: "boolean",
401
+ const: true,
402
+ ...(0, import_xlr_utils.decorateNode)(node)
403
+ };
404
+ }
405
+ if (node.kind === import_typescript.default.SyntaxKind.FalseKeyword) {
406
+ return {
407
+ type: "boolean",
408
+ const: false,
409
+ ...(0, import_xlr_utils.decorateNode)(node)
410
+ };
411
+ }
412
+ if (node.kind === import_typescript.default.SyntaxKind.NullKeyword) {
413
+ return { type: "null", ...(0, import_xlr_utils.decorateNode)(node) };
414
+ }
415
+ if (import_typescript.default.isPrefixUnaryExpression(node)) {
416
+ this.context.throwError("Prefix unary expressions not supported");
417
+ }
418
+ if (import_typescript.default.isArrayLiteralExpression(node)) {
419
+ const arrayElements = [];
420
+ node.elements.forEach((element) => {
421
+ if (import_typescript.default.isSpreadElement(element)) {
422
+ const arrayReference = this.resolveLiteralReference(
423
+ element.expression
424
+ );
425
+ arrayElements.push(...arrayReference.const ?? []);
426
+ } else {
427
+ arrayElements.push(this.tsLiteralToType(element));
428
+ }
429
+ });
430
+ return {
431
+ type: "array",
432
+ elementType: { type: "any" },
433
+ const: arrayElements
434
+ };
435
+ }
436
+ if (import_typescript.default.isObjectLiteralExpression(node)) {
437
+ const ret = {
438
+ type: "object",
439
+ properties: {},
440
+ additionalProperties: false
441
+ };
442
+ node.properties.forEach((property) => {
443
+ if (import_typescript.default.isPropertyAssignment(property)) {
444
+ const propertyName = property.name?.getText();
445
+ ret.properties[propertyName] = {
446
+ required: true,
447
+ node: this.tsLiteralToType(property.initializer)
448
+ };
449
+ } else if (import_typescript.default.isSpreadAssignment(property)) {
450
+ const spreadValue = this.resolveLiteralReference(
451
+ property.expression
452
+ );
453
+ ret.properties = {
454
+ ...ret.properties,
455
+ ...spreadValue.properties
456
+ };
457
+ }
458
+ });
459
+ return ret;
460
+ }
461
+ if (import_typescript.default.isIdentifier(node)) {
462
+ return this.resolveLiteralReference(node);
463
+ }
464
+ this.context.throwError(
465
+ `Literal type not understood ${import_typescript.default.SyntaxKind[node.kind]} at ${node.getText()}`
466
+ );
467
+ }
468
+ resolveLiteralReference(expression) {
469
+ if (import_typescript.default.isIdentifier(expression)) {
470
+ const symbol = this.context.typeChecker.getSymbolAtLocation(expression);
471
+ let expressionReference = symbol?.declarations?.[0];
472
+ if (symbol && expressionReference && import_typescript.default.isImportSpecifier(expressionReference)) {
473
+ const referencedDeclaration = this.context.typeChecker.getAliasedSymbol(symbol);
474
+ expressionReference = referencedDeclaration.declarations?.[0];
475
+ }
476
+ if (expressionReference && import_typescript.default.isVariableDeclaration(expressionReference) && expressionReference.initializer) {
477
+ return this.convertVariable(
478
+ expressionReference.parent.parent
479
+ );
480
+ }
481
+ this.context.throwError(
482
+ `Error: Can't resolve non-variable declaration ${expressionReference?.getText()}`
483
+ );
484
+ }
485
+ this.context.throwError(
486
+ `Error: Can't resolve non-identifier reference in literal ${expression.getText()}`
487
+ );
488
+ }
489
+ resolveFunctionCall(functionCall, document) {
490
+ if (import_typescript.default.isArrowFunction(functionCall)) {
491
+ const declaredReturnType = functionCall.parent.type;
492
+ if (declaredReturnType) {
493
+ return this.tsNodeToType(declaredReturnType);
494
+ }
495
+ }
496
+ const functionReturnType = this.context.typeChecker.getTypeAtLocation(functionCall);
497
+ let syntheticNode = this.context.typeChecker.typeToTypeNode(
498
+ functionReturnType,
499
+ document,
500
+ void 0
501
+ );
502
+ if (import_typescript.default.isArrowFunction(functionCall)) {
503
+ const syntheticWithParameters = {
504
+ ...syntheticNode,
505
+ parameters: functionCall.parameters
506
+ };
507
+ syntheticNode = syntheticWithParameters;
508
+ }
509
+ if (syntheticNode) {
510
+ if (import_typescript.default.isTypeReferenceNode(syntheticNode) && import_typescript.default.isIdentifier(syntheticNode.typeName)) {
511
+ const { typeName } = syntheticNode;
512
+ if (this.context.customPrimitives.includes(typeName.text)) {
513
+ return this.makeBasicRefNode(syntheticNode);
514
+ }
515
+ const declarationSymbol = typeName.symbol;
516
+ if (declarationSymbol && declarationSymbol.declarations?.[0]) {
517
+ const declaration = declarationSymbol.declarations[0];
518
+ if (import_typescript.default.isTypeAliasDeclaration(declaration) || import_typescript.default.isInterfaceDeclaration(declaration)) {
519
+ return this.convertDeclaration(declaration);
520
+ }
521
+ }
522
+ this.context.throwError(
523
+ `Error: could not get referenced type ${syntheticNode.getText()}`
524
+ );
525
+ }
526
+ return this.tsNodeToType(syntheticNode);
527
+ }
528
+ this.context.throwError(
529
+ `Error: could not determine effective return type of ${functionCall.getText()}`
530
+ );
531
+ }
532
+ tsObjectMembersToProperties(node) {
533
+ const ret = {
534
+ properties: {},
535
+ additionalProperties: false
536
+ };
537
+ node.members.forEach((member) => {
538
+ if (import_typescript.default.isPropertySignature(member) && member.type) {
539
+ const name = member.name.getText();
540
+ ret.properties[name] = {
541
+ required: !(0, import_xlr_utils.isOptionalProperty)(member),
542
+ node: {
543
+ ...this.convertTsTypeNode(member.type) ?? AnyTypeNode,
544
+ ...(0, import_xlr_utils.decorateNode)(member)
545
+ }
546
+ };
547
+ } else if (import_typescript.default.isIndexSignatureDeclaration(member)) {
548
+ const param = member.parameters[0];
549
+ if (param.type?.kind !== import_typescript.default.SyntaxKind.StringKeyword) {
550
+ this.context.throwError(
551
+ "Will not convert non-string index signature"
552
+ );
553
+ }
554
+ ret.additionalProperties = this.convertTsTypeNode(member.type) ?? AnyTypeNode;
555
+ }
556
+ });
557
+ return ret;
558
+ }
559
+ tsTupleToType(node) {
560
+ if (node.elements.length === 0) {
561
+ return { elementTypes: [], additionalItems: false, minItems: 0 };
562
+ }
563
+ const hasRest = import_typescript.default.isRestTypeNode(node.elements[node.elements.length - 1]);
564
+ const [elements, rest] = hasRest ? [
565
+ node.elements.slice(0, node.elements.length - 1),
566
+ node.elements[node.elements.length - 1]
567
+ ] : [[...node.elements], void 0];
568
+ const elementTypes = elements.map((element) => {
569
+ if (import_typescript.default.isNamedTupleMember(element)) {
570
+ let typeNode;
571
+ if (element.type) {
572
+ typeNode = this.convertTsTypeNode(element.type);
573
+ }
574
+ return {
575
+ name: element.name.text,
576
+ type: typeNode ?? AnyTypeNode,
577
+ optional: element.questionToken ? true : void 0
578
+ };
579
+ }
580
+ return {
581
+ type: this.convertTsTypeNode((0, import_xlr_utils.tsStripOptionalType)(element)),
582
+ optional: import_typescript.default.isOptionalTypeNode(element)
583
+ };
584
+ });
585
+ const additionalItems = rest ? this.convertTsTypeNode(rest.type.elementType) ?? AnyTypeNode : false;
586
+ const firstOptional = elementTypes.findIndex(
587
+ (element) => element.optional === true
588
+ );
589
+ const minItems = firstOptional === -1 ? elements.length : firstOptional;
590
+ return {
591
+ elementTypes,
592
+ ...additionalItems && additionalItems.type === "any" ? { additionalItems: AnyTypeNode } : { additionalItems },
593
+ minItems
594
+ };
595
+ }
596
+ handleHeritageClauses(clauses, baseObject, typeChecker) {
597
+ let newProperties = {};
598
+ const additionalPropertiesCollector = [];
599
+ let extendsType;
600
+ clauses.forEach((heritageClause) => {
601
+ heritageClause.types.forEach((parent) => {
602
+ let typeToApply;
603
+ const typeName = parent.expression.getText();
604
+ if (isMappedTypeNode(typeName)) {
605
+ typeToApply = this.makeMappedType(typeName, parent);
606
+ } else {
607
+ const parentType = typeChecker.getTypeAtLocation(parent);
608
+ const parentSymbol = parentType.symbol;
609
+ const parentDeclarations = parentSymbol?.declarations;
610
+ if (!parentDeclarations?.[0]) {
611
+ this.context.throwError(
612
+ `Error: Unable to get underlying interface for extending class ${parent.getFullText()}`
613
+ );
614
+ }
615
+ let parentInterface;
616
+ if (import_typescript.default.isTypeLiteralNode(parentDeclarations?.[0]) && import_typescript.default.isTypeAliasDeclaration(parentDeclarations?.[0].parent)) {
617
+ parentInterface = parentDeclarations?.[0].parent;
618
+ } else {
619
+ parentInterface = parentDeclarations?.[0];
620
+ }
621
+ if (this.context.customPrimitives.includes(parentInterface.name.text)) {
622
+ extendsType = this.makeBasicRefNode(parent);
623
+ return;
624
+ }
625
+ typeToApply = this.convertDeclaration(parentInterface);
626
+ if (typeToApply.extends) {
627
+ extendsType = typeToApply.extends;
628
+ }
629
+ if (parentInterface.typeParameters && parent.typeArguments) {
630
+ typeToApply = this.resolveGenerics(
631
+ typeToApply,
632
+ parentInterface.typeParameters,
633
+ parent.typeArguments
634
+ );
635
+ } else if ((0, import_xlr_utils.isGenericNodeType)(baseObject)) {
636
+ baseObject.genericTokens.push(
637
+ ...typeToApply.genericTokens ?? []
638
+ );
639
+ }
640
+ }
641
+ newProperties = {
642
+ ...newProperties,
643
+ ...typeToApply.properties
644
+ };
645
+ if (typeToApply.additionalProperties) {
646
+ additionalPropertiesCollector.push(typeToApply.additionalProperties);
647
+ }
648
+ });
649
+ });
650
+ let additionalProperties = false;
651
+ if (baseObject.additionalProperties === false) {
652
+ if (additionalPropertiesCollector.length === 1) {
653
+ additionalProperties = additionalPropertiesCollector[0];
654
+ } else if (additionalPropertiesCollector.length >= 1) {
655
+ additionalProperties = {
656
+ type: "or",
657
+ or: additionalPropertiesCollector
658
+ };
659
+ }
660
+ }
661
+ return {
662
+ ...baseObject,
663
+ ...extendsType ? { extends: extendsType } : {},
664
+ properties: { ...newProperties, ...baseObject.properties },
665
+ additionalProperties
666
+ };
667
+ }
668
+ resolveGenerics(baseInterface, typeParameters, typeArguments) {
669
+ if (typeArguments && typeArguments.length === 0)
670
+ return baseInterface;
671
+ const genericMap = /* @__PURE__ */ new Map();
672
+ typeParameters.forEach((tp, i) => {
673
+ let typeToProcess;
674
+ if (typeArguments && i < typeArguments.length) {
675
+ typeToProcess = typeArguments[i];
676
+ } else if (tp.default) {
677
+ typeToProcess = tp.default;
678
+ } else {
679
+ typeToProcess = import_typescript.default.factory.createKeywordTypeNode(
680
+ import_typescript.default.SyntaxKind.AnyKeyword
681
+ );
682
+ }
683
+ const processedNodeType = this.convertTsTypeNode(typeToProcess);
684
+ if (processedNodeType) {
685
+ genericMap.set(tp.name.getText(), processedNodeType);
686
+ }
687
+ });
688
+ return (0, import_xlr_utils.fillInGenerics)(baseInterface, genericMap);
689
+ }
690
+ generateGenerics(params) {
691
+ const genericArray = [];
692
+ params?.forEach((param) => {
693
+ const serializedObject = {
694
+ symbol: param.name.text
695
+ };
696
+ if (param.constraint) {
697
+ serializedObject.constraints = this.convertTsTypeNode(param.constraint);
698
+ } else {
699
+ serializedObject.constraints = AnyTypeNode;
700
+ }
701
+ if (param.default) {
702
+ serializedObject.default = this.convertTsTypeNode(param.default);
703
+ } else {
704
+ serializedObject.default = AnyTypeNode;
705
+ }
706
+ genericArray.push(serializedObject);
707
+ });
708
+ return genericArray;
709
+ }
710
+ resolveRefNode(node) {
711
+ let refName;
712
+ if (node.typeName.kind === import_typescript.default.SyntaxKind.QualifiedName) {
713
+ refName = `${node.typeName.left.getText()}.${node.typeName.right.getText()}`;
714
+ } else {
715
+ refName = node.typeName.text;
716
+ }
717
+ if ((0, import_xlr_utils.isTypeReferenceGeneric)(node, this.context.typeChecker)) {
718
+ if (import_typescript.default.isIndexedAccessTypeNode(node.parent)) {
719
+ const genericSymbol = this.context.typeChecker.getSymbolAtLocation(
720
+ node.typeName
721
+ );
722
+ const typeParameters = this.generateGenerics(
723
+ genericSymbol?.declarations
724
+ );
725
+ const typeParameter = typeParameters[0];
726
+ if (typeParameter) {
727
+ if (typeParameter.constraints) {
728
+ return typeParameter.constraints;
729
+ }
730
+ if (typeParameter.default) {
731
+ return typeParameter.default;
732
+ }
733
+ }
734
+ return AnyTypeNode;
735
+ }
736
+ return { type: "ref", ref: node.getText(), ...(0, import_xlr_utils.decorateNode)(node) };
737
+ }
738
+ if (refName === "Array") {
739
+ const typeArgs = node.typeArguments;
740
+ return {
741
+ type: "array",
742
+ elementType: typeArgs ? this.convertTsTypeNode(typeArgs[0]) ?? AnyTypeNode : AnyTypeNode,
743
+ ...(0, import_xlr_utils.decorateNode)(node)
744
+ };
745
+ }
746
+ if (refName === "Record") {
747
+ const indexType = node.typeArguments?.[0];
748
+ const valueType = node.typeArguments?.[1];
749
+ return {
750
+ type: "record",
751
+ keyType: this.convertTsTypeNode(indexType) ?? AnyTypeNode,
752
+ valueType: this.convertTsTypeNode(valueType) ?? AnyTypeNode,
753
+ ...(0, import_xlr_utils.decorateNode)(node)
754
+ };
755
+ }
756
+ if (isMappedTypeNode(refName)) {
757
+ return this.makeMappedType(refName, node);
758
+ }
759
+ if (!this.context.customPrimitives.includes(refName)) {
760
+ const typeInfo = (0, import_xlr_utils.getReferencedType)(node, this.context.typeChecker);
761
+ if (typeInfo) {
762
+ const genericType = this.convertTopLevelNode(typeInfo.declaration);
763
+ const genericParams = typeInfo.declaration.typeParameters;
764
+ const genericArgs = node.typeArguments;
765
+ if (genericType && genericParams && genericArgs) {
766
+ return this.resolveGenerics(
767
+ genericType,
768
+ genericParams,
769
+ genericArgs
770
+ );
771
+ }
772
+ if (genericType) {
773
+ return genericType;
774
+ }
775
+ }
776
+ this.context.throwError(
777
+ `Can't find referenced type ${refName}, is it available in the current package or node_modules?`
778
+ );
779
+ }
780
+ return this.makeBasicRefNode(node);
781
+ }
782
+ makeMappedType(refName, node) {
783
+ if (refName === "Pick" || refName === "Omit" || refName === "Exclude") {
784
+ const baseType = node.typeArguments?.[0];
785
+ const modifiers = node.typeArguments?.[1];
786
+ const baseObj = this.convertTsTypeNode(baseType);
787
+ if (refName === "Exclude") {
788
+ if (baseObj.type === "or") {
789
+ return (0, import_xlr_utils.applyExcludeToNodeType)(
790
+ baseObj,
791
+ this.convertTsTypeNode(modifiers)
792
+ );
793
+ }
794
+ throw new ConversionError(
795
+ "Error: Can't solve Exclude type on non-union node"
796
+ );
797
+ } else {
798
+ return (0, import_xlr_utils.applyPickOrOmitToNodeType)(
799
+ baseObj,
800
+ refName,
801
+ (0, import_xlr_utils.getStringLiteralsFromUnion)(modifiers)
802
+ );
803
+ }
804
+ }
805
+ if (refName === "Partial" || refName === "Required") {
806
+ const baseType = node.typeArguments?.[0];
807
+ const baseObj = this.convertTsTypeNode(baseType);
808
+ const modifier = refName !== "Partial";
809
+ return (0, import_xlr_utils.applyPartialOrRequiredToNodeType)(baseObj, modifier);
810
+ }
811
+ this.context.throwError(`Can't convert non-MappedType ${refName}`);
812
+ }
813
+ makeBasicRefNode(node) {
814
+ const genericArgs = [];
815
+ if (node.typeArguments) {
816
+ node.typeArguments.forEach((typeArg) => {
817
+ let convertedNode;
818
+ if ((0, import_xlr_utils.isTopLevelDeclaration)(typeArg)) {
819
+ convertedNode = this.convertDeclaration(typeArg);
820
+ } else {
821
+ convertedNode = this.convertTsTypeNode(typeArg);
822
+ }
823
+ if (convertedNode) {
824
+ genericArgs.push(convertedNode);
825
+ } else {
826
+ this.context.throwError(
827
+ `Conversion Error: Couldn't convert type argument in type ${node.getText()}`
828
+ );
829
+ }
830
+ });
831
+ }
832
+ let ref;
833
+ if (node.pos === -1 && import_typescript.default.isTypeReferenceNode(node) && import_typescript.default.isIdentifier(node.typeName)) {
834
+ ref = node.typeName.text;
835
+ } else {
836
+ ref = node.getText();
837
+ }
838
+ return {
839
+ type: "ref",
840
+ ref,
841
+ ...(0, import_xlr_utils.decorateNode)(node),
842
+ genericArguments: genericArgs.length > 0 ? genericArgs : void 0
843
+ };
844
+ }
845
+ };
846
+
847
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/converters/src/xlr-to-ts.ts
848
+ var import_xlr_utils2 = require("@player-tools/xlr-utils");
849
+ var import_typescript2 = __toESM(require("typescript"));
850
+ var templateTokenize = /(?=true\|false|\.\*|\[0-9]\*)/gm;
851
+ var tokenSplit = /(?<=true\|false|\.\*|\[0-9]\*)/gm;
852
+ var TSWriter = class {
853
+ constructor(factory) {
854
+ this.context = {
855
+ factory: factory ?? import_typescript2.default.factory,
856
+ throwError: (message) => {
857
+ throw new ConversionError(message);
858
+ }
859
+ };
860
+ this.importSet = /* @__PURE__ */ new Set();
861
+ this.additionalTypes = /* @__PURE__ */ new Map();
862
+ }
863
+ convertNamedType(type) {
864
+ this.importSet.clear();
865
+ this.additionalTypes.clear();
866
+ const finalNode = this.convertNamedTypeNode(type);
867
+ const referencedTypes = this.importSet.size > 0 ? this.importSet : void 0;
868
+ const additionalTypes = this.additionalTypes.size > 0 ? this.additionalTypes : void 0;
869
+ return {
870
+ type: this.makeAnnotations(finalNode, type),
871
+ referencedTypes,
872
+ additionalTypes
873
+ };
874
+ }
875
+ convertNamedTypeNode(type) {
876
+ const typeName = type.name;
877
+ const tsNode = this.convertTypeNode(type);
878
+ let customPrimitiveHeritageClass;
879
+ if (type.type === "object" && type.extends) {
880
+ const refName = type.extends.ref.split("<")[0];
881
+ customPrimitiveHeritageClass = [
882
+ this.context.factory.createHeritageClause(
883
+ import_typescript2.default.SyntaxKind.ExtendsKeyword,
884
+ [
885
+ this.context.factory.createExpressionWithTypeArguments(
886
+ this.context.factory.createIdentifier(refName),
887
+ type.extends.genericArguments ? type.extends.genericArguments.map(
888
+ (node) => this.convertTypeNode(node)
889
+ ) : void 0
890
+ )
891
+ ]
892
+ )
893
+ ];
894
+ }
895
+ let generics;
896
+ if ((0, import_xlr_utils2.isGenericNamedType)(type)) {
897
+ generics = this.createTypeParameters(type);
898
+ type.genericTokens.forEach((token) => {
899
+ if (this.importSet.has(token.symbol)) {
900
+ this.importSet.delete(token.symbol);
901
+ }
902
+ });
903
+ }
904
+ let finalNode;
905
+ if (import_typescript2.default.isTypeLiteralNode(tsNode)) {
906
+ finalNode = this.makeInterfaceDeclaration(
907
+ typeName,
908
+ tsNode.members,
909
+ generics,
910
+ customPrimitiveHeritageClass
911
+ );
912
+ } else {
913
+ finalNode = this.makeTypeDeclaration(typeName, tsNode, generics);
914
+ }
915
+ return finalNode;
916
+ }
917
+ convertTypeNode(type) {
918
+ if (type.type === "object") {
919
+ return this.createObjectNode(type);
920
+ }
921
+ if (type.type === "and") {
922
+ return this.context.factory.createIntersectionTypeNode(
923
+ type.and.map((element) => {
924
+ return this.convertTypeNode(element);
925
+ })
926
+ );
927
+ }
928
+ if (type.type === "or") {
929
+ return this.context.factory.createUnionTypeNode(
930
+ type.or.map((element) => {
931
+ return this.convertTypeNode(element);
932
+ })
933
+ );
934
+ }
935
+ if (type.type === "array") {
936
+ if (type.const) {
937
+ return this.context.factory.createTupleTypeNode(
938
+ type.const.map((element) => this.convertTypeNode(element))
939
+ );
940
+ }
941
+ return this.context.factory.createTypeReferenceNode(
942
+ this.context.factory.createIdentifier("Array"),
943
+ [this.convertTypeNode(type.elementType)]
944
+ );
945
+ }
946
+ if ((0, import_xlr_utils2.isPrimitiveTypeNode)(type)) {
947
+ return this.createPrimitiveNode(type);
948
+ }
949
+ if (type.type === "conditional") {
950
+ return this.createConditionalTypeNode(type);
951
+ }
952
+ if (type.type === "function") {
953
+ return this.createFunctionDeclarationNode(type);
954
+ }
955
+ if (type.type === "record") {
956
+ return this.createRecordNode(type);
957
+ }
958
+ if (type.type === "ref") {
959
+ return this.createRefNode(type);
960
+ }
961
+ if (type.type === "template") {
962
+ return this.createTemplateLiteral(type);
963
+ }
964
+ if (type.type === "tuple") {
965
+ return this.createTupleNode(type);
966
+ }
967
+ this.context.throwError(
968
+ `Unable to convert node type: ${type.type}`
969
+ );
970
+ }
971
+ createRefNode(xlrNode) {
972
+ const typeArgs = [];
973
+ if (xlrNode.genericArguments) {
974
+ xlrNode.genericArguments.forEach((genericArg) => {
975
+ if (genericArg.name) {
976
+ const additionalType = this.convertNamedTypeNode(
977
+ genericArg
978
+ );
979
+ this.additionalTypes.set(genericArg.name, additionalType);
980
+ } else if (genericArg.type === "and") {
981
+ genericArg.and.forEach((type) => {
982
+ if (type.name) {
983
+ const additionalType = this.convertNamedTypeNode(
984
+ type
985
+ );
986
+ this.additionalTypes.set(type.name, additionalType);
987
+ }
988
+ });
989
+ } else if (genericArg.type === "or") {
990
+ genericArg.or.forEach((type) => {
991
+ if (type.name) {
992
+ const additionalType = this.convertNamedTypeNode(
993
+ type
994
+ );
995
+ this.additionalTypes.set(type.name, additionalType);
996
+ }
997
+ });
998
+ } else {
999
+ typeArgs.push(this.convertTypeNode(genericArg));
1000
+ }
1001
+ });
1002
+ }
1003
+ const importName = xlrNode.ref.split("<")[0];
1004
+ this.importSet.add(importName);
1005
+ return this.context.factory.createTypeReferenceNode(importName, typeArgs);
1006
+ }
1007
+ createPrimitiveNode(xlrNode) {
1008
+ if ((xlrNode.type === "string" || xlrNode.type === "boolean" || xlrNode.type === "number") && xlrNode.const || xlrNode.type === "null") {
1009
+ return this.context.factory.createLiteralTypeNode(
1010
+ this.createLiteralTypeNode(xlrNode)
1011
+ );
1012
+ }
1013
+ switch (xlrNode.type) {
1014
+ case "string":
1015
+ return this.context.factory.createKeywordTypeNode(
1016
+ import_typescript2.default.SyntaxKind.StringKeyword
1017
+ );
1018
+ case "number":
1019
+ return this.context.factory.createKeywordTypeNode(
1020
+ import_typescript2.default.SyntaxKind.NumberKeyword
1021
+ );
1022
+ case "boolean":
1023
+ return this.context.factory.createKeywordTypeNode(
1024
+ import_typescript2.default.SyntaxKind.BooleanKeyword
1025
+ );
1026
+ case "any":
1027
+ return this.context.factory.createKeywordTypeNode(
1028
+ import_typescript2.default.SyntaxKind.AnyKeyword
1029
+ );
1030
+ case "unknown":
1031
+ return this.context.factory.createKeywordTypeNode(
1032
+ import_typescript2.default.SyntaxKind.UnknownKeyword
1033
+ );
1034
+ case "never":
1035
+ return this.context.factory.createKeywordTypeNode(
1036
+ import_typescript2.default.SyntaxKind.NeverKeyword
1037
+ );
1038
+ case "undefined":
1039
+ return this.context.factory.createKeywordTypeNode(
1040
+ import_typescript2.default.SyntaxKind.UndefinedKeyword
1041
+ );
1042
+ case "void":
1043
+ return this.context.factory.createKeywordTypeNode(
1044
+ import_typescript2.default.SyntaxKind.VoidKeyword
1045
+ );
1046
+ default:
1047
+ this.context.throwError(
1048
+ `Unknown primitive type ${xlrNode.type}`
1049
+ );
1050
+ }
1051
+ }
1052
+ createLiteralTypeNode(xlrNode) {
1053
+ if (xlrNode.type === "boolean") {
1054
+ return xlrNode.const ? this.context.factory.createTrue() : this.context.factory.createFalse();
1055
+ }
1056
+ if (xlrNode.type === "number") {
1057
+ return xlrNode.const ? this.context.factory.createNumericLiteral(xlrNode.const) : this.context.throwError(
1058
+ "Can't make literal type out of non constant number"
1059
+ );
1060
+ }
1061
+ if (xlrNode.type === "string") {
1062
+ return xlrNode.const ? this.context.factory.createStringLiteral(xlrNode.const, true) : this.context.throwError(
1063
+ "Can't make literal type out of non constant string"
1064
+ );
1065
+ }
1066
+ if (xlrNode.type === "null") {
1067
+ return this.context.factory.createNull();
1068
+ }
1069
+ this.context.throwError(`Can't make literal out of type ${xlrNode.type}`);
1070
+ }
1071
+ createTupleNode(xlrNode) {
1072
+ return this.context.factory.createTupleTypeNode(
1073
+ xlrNode.elementTypes.map((e) => {
1074
+ if (e.name) {
1075
+ return this.context.factory.createNamedTupleMember(
1076
+ void 0,
1077
+ this.context.factory.createIdentifier(e.name),
1078
+ e.optional ? this.context.factory.createToken(import_typescript2.default.SyntaxKind.QuestionToken) : void 0,
1079
+ this.convertTypeNode(e.type)
1080
+ );
1081
+ }
1082
+ return this.convertTypeNode(e.type);
1083
+ })
1084
+ );
1085
+ }
1086
+ createFunctionDeclarationNode(xlrNode) {
1087
+ return this.context.factory.createFunctionTypeNode(
1088
+ void 0,
1089
+ xlrNode.parameters.map((e) => {
1090
+ return this.context.factory.createParameterDeclaration(
1091
+ void 0,
1092
+ void 0,
1093
+ e.name,
1094
+ e.optional ? this.context.factory.createToken(import_typescript2.default.SyntaxKind.QuestionToken) : void 0,
1095
+ this.convertTypeNode(e.type),
1096
+ e.default ? this.createLiteralTypeNode(e.default) : void 0
1097
+ );
1098
+ }),
1099
+ xlrNode.returnType ? this.convertTypeNode(xlrNode.returnType) : this.context.factory.createToken(import_typescript2.default.SyntaxKind.VoidKeyword)
1100
+ );
1101
+ }
1102
+ createRecordNode(xlrNode) {
1103
+ const keyType = this.convertTypeNode(xlrNode.keyType);
1104
+ const valueType = this.convertTypeNode(xlrNode.valueType);
1105
+ return this.context.factory.createTypeReferenceNode(
1106
+ this.context.factory.createIdentifier("Record"),
1107
+ [keyType, valueType]
1108
+ );
1109
+ }
1110
+ createConditionalTypeNode(xlrNode) {
1111
+ const leftCheck = this.convertTypeNode(xlrNode.check.left);
1112
+ const rightCheck = this.convertTypeNode(xlrNode.check.right);
1113
+ const trueValue = this.convertTypeNode(xlrNode.value.true);
1114
+ const falseValue = this.convertTypeNode(xlrNode.value.false);
1115
+ return this.context.factory.createConditionalTypeNode(
1116
+ leftCheck,
1117
+ rightCheck,
1118
+ trueValue,
1119
+ falseValue
1120
+ );
1121
+ }
1122
+ createObjectNode(xlrNode) {
1123
+ const { properties, additionalProperties = false } = xlrNode;
1124
+ const propertyNodes = [
1125
+ ...Object.keys(properties).map((name) => ({ name, ...properties[name] })).map(
1126
+ ({ name, node, required }) => this.makeAnnotations(
1127
+ this.context.factory.createPropertySignature(
1128
+ void 0,
1129
+ // modifiers
1130
+ name,
1131
+ required ? void 0 : this.context.factory.createToken(import_typescript2.default.SyntaxKind.QuestionToken),
1132
+ this.convertTypeNode(node)
1133
+ ),
1134
+ node
1135
+ )
1136
+ )
1137
+ ];
1138
+ if (additionalProperties) {
1139
+ propertyNodes.push(
1140
+ this.context.factory.createIndexSignature(
1141
+ void 0,
1142
+ // modifiers
1143
+ [
1144
+ this.context.factory.createParameterDeclaration(
1145
+ void 0,
1146
+ // modifiers
1147
+ void 0,
1148
+ // dotdotdot token
1149
+ "key",
1150
+ void 0,
1151
+ // question token
1152
+ this.context.factory.createKeywordTypeNode(
1153
+ import_typescript2.default.SyntaxKind.StringKeyword
1154
+ )
1155
+ )
1156
+ ],
1157
+ this.convertTypeNode(additionalProperties)
1158
+ )
1159
+ );
1160
+ }
1161
+ return this.context.factory.createTypeLiteralNode(propertyNodes);
1162
+ }
1163
+ createTemplateLiteral(xlrNode) {
1164
+ const templateSegments = xlrNode.format.split(templateTokenize);
1165
+ let templateHead;
1166
+ if (templateSegments.length % 2 === 0) {
1167
+ templateHead = this.context.factory.createTemplateHead(
1168
+ templateSegments[0]
1169
+ );
1170
+ templateSegments.splice(0, 1);
1171
+ } else {
1172
+ templateHead = this.context.factory.createTemplateHead("");
1173
+ }
1174
+ return this.context.factory.createTemplateLiteralType(
1175
+ templateHead,
1176
+ templateSegments.map((segments, i) => {
1177
+ const [regexSegment, stringSegment = ""] = segments.split(tokenSplit);
1178
+ let regexTemplateType;
1179
+ if (regexSegment === ".*") {
1180
+ regexTemplateType = import_typescript2.default.SyntaxKind.StringKeyword;
1181
+ } else if (regexSegment === "[0-9]*") {
1182
+ regexTemplateType = import_typescript2.default.SyntaxKind.NumberKeyword;
1183
+ } else if (regexSegment === "true|false") {
1184
+ regexTemplateType = import_typescript2.default.SyntaxKind.BooleanKeyword;
1185
+ } else {
1186
+ this.context.throwError(
1187
+ `Can't make template literal type from regex ${regexSegment}`
1188
+ );
1189
+ }
1190
+ let stringTemplateType;
1191
+ if (i === templateSegments.length - 1) {
1192
+ stringTemplateType = this.context.factory.createTemplateTail(stringSegment);
1193
+ } else {
1194
+ stringTemplateType = this.context.factory.createTemplateMiddle(stringSegment);
1195
+ }
1196
+ return this.context.factory.createTemplateLiteralTypeSpan(
1197
+ this.context.factory.createKeywordTypeNode(regexTemplateType),
1198
+ stringTemplateType
1199
+ );
1200
+ })
1201
+ );
1202
+ }
1203
+ createGenericArgumentNode(node) {
1204
+ if (node) {
1205
+ if (node.type === "object" && node.name) {
1206
+ const additionalType = this.convertNamedTypeNode(
1207
+ node
1208
+ );
1209
+ this.additionalTypes.set(node.name, additionalType);
1210
+ return this.context.factory.createTypeReferenceNode(node.name);
1211
+ }
1212
+ return this.convertTypeNode(node);
1213
+ }
1214
+ return void 0;
1215
+ }
1216
+ makeAnnotations(tsNode, xlrAnnotations) {
1217
+ let comment = xlrAnnotations.description;
1218
+ if (!comment) {
1219
+ return tsNode;
1220
+ }
1221
+ if (comment.includes("\n")) {
1222
+ comment = `*
1223
+ ${comment.split("\n").map((s) => ` * ${s}`).join("\n")}
1224
+ `;
1225
+ } else {
1226
+ comment = `* ${comment} `;
1227
+ }
1228
+ return import_typescript2.default.addSyntheticLeadingComment(
1229
+ tsNode,
1230
+ import_typescript2.default.SyntaxKind.MultiLineCommentTrivia,
1231
+ comment,
1232
+ true
1233
+ );
1234
+ }
1235
+ createTypeParameters(genericXLRNode) {
1236
+ return genericXLRNode.genericTokens.map((generic) => {
1237
+ return this.context.factory.createTypeParameterDeclaration(
1238
+ void 0,
1239
+ generic.symbol,
1240
+ this.createGenericArgumentNode(generic.constraints),
1241
+ this.createGenericArgumentNode(generic.default)
1242
+ );
1243
+ });
1244
+ }
1245
+ makeInterfaceDeclaration(name, node, generics, heritageClass) {
1246
+ return this.context.factory.createInterfaceDeclaration(
1247
+ this.context.factory.createModifiersFromModifierFlags(
1248
+ import_typescript2.default.ModifierFlags.Export
1249
+ ),
1250
+ this.context.factory.createIdentifier(name),
1251
+ generics,
1252
+ // type parameters
1253
+ heritageClass,
1254
+ // heritage
1255
+ node
1256
+ );
1257
+ }
1258
+ makeTypeDeclaration(name, node, generics) {
1259
+ return this.context.factory.createTypeAliasDeclaration(
1260
+ this.context.factory.createModifiersFromModifierFlags(
1261
+ import_typescript2.default.ModifierFlags.Export
1262
+ ),
1263
+ this.context.factory.createIdentifier(name),
1264
+ generics,
1265
+ // type parameters
1266
+ node
1267
+ );
1268
+ }
1269
+ };
1270
+ // Annotate the CommonJS export names for ESM import in node:
1271
+ 0 && (module.exports = {
1272
+ ConversionError,
1273
+ TSWriter,
1274
+ TsConverter
1275
+ });
1276
+ //# sourceMappingURL=index.cjs.map