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