@sdk-it/core 0.46.1 → 0.46.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/deriver.d.ts +2 -0
- package/dist/lib/deriver.d.ts.map +1 -1
- package/dist/lib/deriver.js +50 -7
- package/dist/lib/deriver.js.map +2 -2
- package/package.json +1 -1
package/dist/lib/deriver.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export declare class TypeDeriver {
|
|
|
10
10
|
readonly typesMap: Record<string, string>;
|
|
11
11
|
private trace;
|
|
12
12
|
private currentNode?;
|
|
13
|
+
private readonly activeAliases;
|
|
13
14
|
constructor(checker: ts.TypeChecker, typeMappings?: Record<string, string>);
|
|
14
15
|
setTrace(ctx: {
|
|
15
16
|
file?: string;
|
|
@@ -18,6 +19,7 @@ export declare class TypeDeriver {
|
|
|
18
19
|
private warn;
|
|
19
20
|
serializeType(type: ts.Type): any;
|
|
20
21
|
private serialize;
|
|
22
|
+
private serializeResolved;
|
|
21
23
|
/**
|
|
22
24
|
* Preserve the inferred type of `satisfies` expressions unless the operand is
|
|
23
25
|
* an empty array; only then recover its declared element type.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deriver.d.ts","sourceRoot":"","sources":["../../src/lib/deriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,MAAM,YAAY,CAAC;AAKvD,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAErC,eAAO,MAAM,YAAY,eAA0B,CAAC;AACpD,eAAO,MAAM,MAAM,eAAsB,CAAC;AAC1C,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQlD,CAAC;AAOF,wBAAgB,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,MAAM,GAAG,SAAS,CAW9D;AAED,qBAAa,WAAW;IACtB,SAAgB,SAAS,EAAE,SAAS,CAAM;IAC1C,SAAgB,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC;IACxC,SAAgB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,WAAW,CAAC,CAAU;
|
|
1
|
+
{"version":3,"file":"deriver.d.ts","sourceRoot":"","sources":["../../src/lib/deriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,MAAM,YAAY,CAAC;AAKvD,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAErC,eAAO,MAAM,YAAY,eAA0B,CAAC;AACpD,eAAO,MAAM,MAAM,eAAsB,CAAC;AAC1C,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQlD,CAAC;AAOF,wBAAgB,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,MAAM,GAAG,SAAS,CAW9D;AAED,qBAAa,WAAW;IACtB,SAAgB,SAAS,EAAE,SAAS,CAAM;IAC1C,SAAgB,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC;IACxC,SAAgB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,WAAW,CAAC,CAAU;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA+B;gBAE3D,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,YAAY,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAmB;IAMxD,QAAQ,CAAC,GAAG,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;IAInD,OAAO,CAAC,IAAI;IAeZ,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG;IAIjC,OAAO,CAAC,SAAS;IA0BjB,OAAO,CAAC,iBAAiB;IAqRzB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA6CxB,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,eAAe;IAiBvB,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG;CAsRlC"}
|
package/dist/lib/deriver.js
CHANGED
|
@@ -30,6 +30,7 @@ class TypeDeriver {
|
|
|
30
30
|
typesMap;
|
|
31
31
|
trace = {};
|
|
32
32
|
currentNode;
|
|
33
|
+
activeAliases = /* @__PURE__ */ new Map();
|
|
33
34
|
constructor(checker, typeMappings = defaultTypesMap) {
|
|
34
35
|
this.checker = checker;
|
|
35
36
|
this.typesMap = typeMappings;
|
|
@@ -55,6 +56,30 @@ class TypeDeriver {
|
|
|
55
56
|
return this.serialize(type, false);
|
|
56
57
|
}
|
|
57
58
|
serialize(type, widenLiteralValues) {
|
|
59
|
+
const alias = type.aliasSymbol?.getName();
|
|
60
|
+
if (!alias) {
|
|
61
|
+
return this.serializeResolved(type, widenLiteralValues);
|
|
62
|
+
}
|
|
63
|
+
if (this.activeAliases.has(type)) {
|
|
64
|
+
this.activeAliases.set(type, true);
|
|
65
|
+
return {
|
|
66
|
+
[deriveSymbol]: true,
|
|
67
|
+
optional: false,
|
|
68
|
+
[$types]: [`#/components/schemas/${alias}`]
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
this.activeAliases.set(type, false);
|
|
72
|
+
try {
|
|
73
|
+
const result = this.serializeResolved(type, widenLiteralValues);
|
|
74
|
+
if (this.activeAliases.get(type)) {
|
|
75
|
+
this.collector[alias] = result;
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
} finally {
|
|
79
|
+
this.activeAliases.delete(type);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
serializeResolved(type, widenLiteralValues) {
|
|
58
83
|
if (this.typesMap[type.aliasSymbol?.getName() || type.symbol?.getName()]) {
|
|
59
84
|
return {
|
|
60
85
|
[deriveSymbol]: true,
|
|
@@ -314,7 +339,7 @@ class TypeDeriver {
|
|
|
314
339
|
* Preserve the inferred type of `satisfies` expressions unless the operand is
|
|
315
340
|
* an empty array; only then recover its declared element type.
|
|
316
341
|
*/
|
|
317
|
-
typeOfExpression(node) {
|
|
342
|
+
typeOfExpression(node, seen = /* @__PURE__ */ new Set()) {
|
|
318
343
|
const satisfies = this.emptyArraySatisfies(node);
|
|
319
344
|
if (satisfies) {
|
|
320
345
|
return this.checker.getTypeFromTypeNode(satisfies.type);
|
|
@@ -323,6 +348,22 @@ class TypeDeriver {
|
|
|
323
348
|
while (ts.isParenthesizedExpression(expression)) {
|
|
324
349
|
expression = expression.expression;
|
|
325
350
|
}
|
|
351
|
+
if (ts.isIdentifier(expression)) {
|
|
352
|
+
const symbol = this.checker.getSymbolAtLocation(expression);
|
|
353
|
+
const declaration = symbol?.valueDeclaration ?? symbol?.declarations?.[0];
|
|
354
|
+
if (symbol && !seen.has(symbol) && declaration && ts.isVariableDeclaration(declaration) && ts.isVariableDeclarationList(declaration.parent) && declaration.parent.flags & ts.NodeFlags.Const) {
|
|
355
|
+
seen.add(symbol);
|
|
356
|
+
if (declaration.type) {
|
|
357
|
+
return this.checker.getTypeFromTypeNode(declaration.type);
|
|
358
|
+
}
|
|
359
|
+
if (declaration.initializer) {
|
|
360
|
+
return this.typeOfExpression(declaration.initializer, seen);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
if (ts.isArrayLiteralExpression(expression) && expression.elements.length === 1 && ts.isSpreadElement(expression.elements[0])) {
|
|
365
|
+
return this.typeOfExpression(expression.elements[0].expression, seen);
|
|
366
|
+
}
|
|
326
367
|
return this.checker.getTypeAtLocation(expression);
|
|
327
368
|
}
|
|
328
369
|
emptyArraySatisfies(node) {
|
|
@@ -356,10 +397,6 @@ class TypeDeriver {
|
|
|
356
397
|
if (ts.isObjectLiteralExpression(node)) {
|
|
357
398
|
const symbolType = this.checker.getTypeAtLocation(node);
|
|
358
399
|
const props = {};
|
|
359
|
-
for (const symbol of symbolType.getProperties()) {
|
|
360
|
-
const type = this.checker.getTypeOfSymbol(symbol);
|
|
361
|
-
props[symbol.name] = this.serializeType(type);
|
|
362
|
-
}
|
|
363
400
|
for (const prop of node.properties) {
|
|
364
401
|
if (ts.isPropertyAssignment(prop)) {
|
|
365
402
|
props[prop.name.getText()] = this.serializeType(
|
|
@@ -372,6 +409,12 @@ class TypeDeriver {
|
|
|
372
409
|
}
|
|
373
410
|
}
|
|
374
411
|
}
|
|
412
|
+
for (const symbol of symbolType.getProperties()) {
|
|
413
|
+
if (!Object.hasOwn(props, symbol.name)) {
|
|
414
|
+
const type = this.checker.getTypeOfSymbol(symbol);
|
|
415
|
+
props[symbol.name] = this.serializeType(type);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
375
418
|
return sortObjectKeys(props);
|
|
376
419
|
}
|
|
377
420
|
if (ts.isPropertyAccessExpression(node)) {
|
|
@@ -471,7 +514,7 @@ class TypeDeriver {
|
|
|
471
514
|
this.warn(`No symbol found for identifier ${node.getText()}`, node);
|
|
472
515
|
return null;
|
|
473
516
|
}
|
|
474
|
-
const type = this.
|
|
517
|
+
const type = this.typeOfExpression(node);
|
|
475
518
|
return this.serializeType(type);
|
|
476
519
|
}
|
|
477
520
|
if (ts.isAwaitExpression(node)) {
|
|
@@ -562,7 +605,7 @@ class TypeDeriver {
|
|
|
562
605
|
};
|
|
563
606
|
}
|
|
564
607
|
if (ts.isArrayLiteralExpression(node)) {
|
|
565
|
-
const type = this.
|
|
608
|
+
const type = this.typeOfExpression(node);
|
|
566
609
|
return this.serializeType(type);
|
|
567
610
|
}
|
|
568
611
|
if (ts.isStringLiteral(node) || ts.isNumericLiteral(node)) {
|
package/dist/lib/deriver.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/lib/deriver.ts"],
|
|
4
|
-
"sourcesContent": ["import ts, { TypeFlags, symbolName } from 'typescript';\n\nimport { isInterfaceType } from './program.js';\nimport { sortObjectKeys } from './utils.js';\n\ntype Collector = Record<string, any>;\n\nexport const deriveSymbol = Symbol.for('serialize');\nexport const $types = Symbol.for('types');\nexport const defaultTypesMap: Record<string, string> = {\n Readable: 'any',\n ReadableStream: 'any',\n DateConstructor: 'string',\n ArrayBufferConstructor: 'any',\n SharedArrayBufferConstructor: 'any',\n Int8ArrayConstructor: 'any',\n Uint8Array: 'any',\n};\n\ninterface TraceContext {\n file?: string;\n operation?: string;\n}\n\nexport function nodeLocation(node: ts.Node): string | undefined {\n try {\n const sourceFile = node.getSourceFile();\n if (!sourceFile) return undefined;\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(\n node.getStart(),\n );\n return `${sourceFile.fileName}:${line + 1}:${character + 1}`;\n } catch {\n return undefined;\n }\n}\n\nexport class TypeDeriver {\n public readonly collector: Collector = {};\n public readonly checker: ts.TypeChecker;\n public readonly typesMap: Record<string, string>;\n private trace: TraceContext = {};\n private currentNode?: ts.Node;\n constructor(\n checker: ts.TypeChecker,\n typeMappings: Record<string, string> = defaultTypesMap,\n ) {\n this.checker = checker;\n this.typesMap = typeMappings;\n }\n\n setTrace(ctx: { file?: string; operation?: string }) {\n this.trace = { ...ctx };\n }\n\n private warn(message: string, node?: ts.Node) {\n const parts = [`\\x1b[33m\\u26a0 ${message}\\x1b[0m`];\n const resolvedNode = node ?? this.currentNode;\n const location = resolvedNode ? nodeLocation(resolvedNode) : undefined;\n if (location) {\n parts.push(` at \\x1b[36m${location}\\x1b[0m`);\n } else if (this.trace.file) {\n parts.push(` at \\x1b[36m${this.trace.file}\\x1b[0m`);\n }\n if (this.trace.operation) {\n parts.push(` in \\x1b[2m${this.trace.operation}\\x1b[0m`);\n }\n console.warn(parts.join('\\n'));\n }\n\n serializeType(type: ts.Type): any {\n return this.serialize(type, false);\n }\n\n private serialize(type: ts.Type, widenLiteralValues: boolean): unknown {\n if (this.typesMap[type.aliasSymbol?.getName() || type.symbol?.getName()]) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [\n this.typesMap[type.aliasSymbol?.getName() || type.symbol?.getName()],\n ],\n };\n }\n const indexType = type.getStringIndexType();\n if (indexType) {\n return {\n [deriveSymbol]: true,\n kind: 'record',\n optional: false,\n [$types]: [this.serialize(indexType, widenLiteralValues)],\n };\n }\n if (type.flags & TypeFlags.Any) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [],\n };\n }\n if (type.flags & TypeFlags.Unknown) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [],\n };\n }\n if (type.flags & TypeFlags.Never) {\n return {\n [deriveSymbol]: true,\n kind: 'never',\n optional: false,\n [$types]: [],\n };\n }\n if (type.isStringLiteral()) {\n return {\n [deriveSymbol]: true,\n optional: false,\n ...(widenLiteralValues ? {} : { kind: 'literal', value: type.value }),\n [$types]: ['string'],\n };\n }\n if (type.isNumberLiteral()) {\n return {\n [deriveSymbol]: true,\n optional: false,\n ...(widenLiteralValues ? {} : { kind: 'literal', value: type.value }),\n [$types]: ['number'],\n };\n }\n if (type.flags & TypeFlags.BooleanLiteral) {\n return {\n [deriveSymbol]: true,\n optional: false,\n ...(widenLiteralValues\n ? {}\n : {\n kind: 'literal',\n value: this.checker.typeToString(type) === 'true',\n }),\n [$types]: ['boolean'],\n };\n }\n if (type.flags & TypeFlags.TemplateLiteral) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['string'],\n };\n }\n if (type.flags & TypeFlags.String) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['string'],\n };\n }\n if (type.flags & TypeFlags.Number) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['number'],\n };\n }\n if (type.flags & ts.TypeFlags.Boolean) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['boolean'],\n };\n }\n if (type.flags & TypeFlags.Null) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['null'],\n };\n }\n if (type.isIntersection()) {\n let optional: boolean | undefined;\n const types: any[] = [];\n for (const intersectionType of type.types) {\n if (optional === undefined) {\n optional = (intersectionType.flags & ts.TypeFlags.Undefined) !== 0;\n if (optional) {\n continue;\n }\n }\n\n types.push(this.serialize(intersectionType, widenLiteralValues));\n }\n return {\n [deriveSymbol]: true,\n kind: 'intersection',\n optional,\n [$types]: types,\n };\n }\n if (type.isUnion()) {\n let optional: boolean | undefined;\n const types: any[] = [];\n for (const unionType of type.types) {\n if (optional === undefined) {\n // ignore undefined\n optional = (unionType.flags & ts.TypeFlags.Undefined) !== 0;\n if (optional) {\n continue;\n }\n }\n\n types.push(this.serialize(unionType, widenLiteralValues));\n }\n return {\n [deriveSymbol]: true,\n kind: 'union',\n optional,\n [$types]: types,\n };\n }\n if (this.checker.isArrayLikeType(type)) {\n const elementType = this.checker.getIndexTypeOfType(\n type,\n ts.IndexKind.Number,\n );\n if (!elementType) {\n const typeName = type.symbol?.getName() || '<unknown>';\n this.warn(`Could not find element type for array type ${typeName}`);\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'array',\n [$types]: ['any'],\n };\n }\n const mappedElementType =\n this.typesMap[\n elementType.aliasSymbol?.getName() || elementType.symbol?.getName()\n ];\n return {\n kind: 'array',\n optional: false,\n [deriveSymbol]: true,\n [$types]: mappedElementType\n ? [mappedElementType]\n : [\n this.serialize(\n elementType,\n widenLiteralValues || this.checker.isTupleType(type),\n ),\n ],\n };\n }\n if (type.isClass()) {\n const declaration = type.symbol?.valueDeclaration;\n if (!declaration) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [type.symbol.getName()],\n };\n }\n return this.serializeNode(declaration);\n }\n if (isInterfaceType(type)) {\n const valueDeclaration =\n type.symbol.valueDeclaration ?? type.symbol.declarations?.[0];\n if (!valueDeclaration) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [type.symbol.getName()],\n };\n }\n return this.serializeNode(valueDeclaration);\n }\n if (type.flags & TypeFlags.Object) {\n if (this.typesMap[symbolName(type.symbol)]) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [this.typesMap[symbolName(type.symbol)]],\n };\n }\n const properties = this.checker.getPropertiesOfType(type);\n if (properties.length > 0) {\n const serializedProps: Record<string, any> = {};\n for (const prop of properties) {\n const declarations = prop.getDeclarations() ?? [];\n const propAssingment = declarations.find((it) =>\n ts.isPropertyAssignment(it),\n );\n const shorthand = declarations.find((it) =>\n ts.isShorthandPropertyAssignment(it),\n );\n const shorthandType = shorthand\n ? this.typeOfShorthand(shorthand)\n : undefined;\n // get literal properties values if any\n if (propAssingment) {\n serializedProps[prop.name] = this.serialize(\n this.typeOfExpression(propAssingment.initializer),\n widenLiteralValues,\n );\n } else if (shorthandType) {\n serializedProps[prop.name] = this.serialize(\n shorthandType,\n widenLiteralValues,\n );\n } else {\n const propType = this.checker.getTypeOfSymbol(prop);\n serializedProps[prop.name] = this.serializeType(propType);\n }\n }\n return {\n [deriveSymbol]: true,\n kind: 'object',\n optional: false,\n [$types]: [sortObjectKeys(serializedProps)],\n };\n }\n const declaration =\n type.symbol.valueDeclaration ?? type.symbol.declarations?.[0];\n if (!declaration) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [type.symbol.getName()],\n };\n }\n return this.serializeNode(declaration);\n }\n\n this.warn(`Unhandled type: ${type.flags} ${ts.TypeFlags[type.flags]}`);\n\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [\n this.checker.typeToString(\n type,\n undefined,\n ts.TypeFormatFlags.NoTruncation,\n ),\n ],\n };\n }\n\n /**\n * Preserve the inferred type of `satisfies` expressions unless the operand is\n * an empty array; only then recover its declared element type.\n */\n private typeOfExpression(node: ts.Expression): ts.Type {\n const satisfies = this.emptyArraySatisfies(node);\n if (satisfies) {\n return this.checker.getTypeFromTypeNode(satisfies.type);\n }\n let expression = node;\n while (ts.isParenthesizedExpression(expression)) {\n expression = expression.expression;\n }\n return this.checker.getTypeAtLocation(expression);\n }\n\n private emptyArraySatisfies(\n node: ts.Expression,\n ): ts.SatisfiesExpression | undefined {\n let expression = node;\n while (ts.isParenthesizedExpression(expression)) {\n expression = expression.expression;\n }\n if (!ts.isSatisfiesExpression(expression)) {\n return undefined;\n }\n let operand = expression.expression;\n while (ts.isParenthesizedExpression(operand)) {\n operand = operand.expression;\n }\n if (!ts.isArrayLiteralExpression(operand) || operand.elements.length > 0) {\n return undefined;\n }\n const annotation = this.checker.getTypeFromTypeNode(expression.type);\n return this.checker.isArrayLikeType(annotation) ? expression : undefined;\n }\n\n private typeOfShorthand(\n node: ts.ShorthandPropertyAssignment,\n ): ts.Type | undefined {\n const symbol = this.checker.getShorthandAssignmentValueSymbol(node);\n const declaration = symbol?.valueDeclaration ?? symbol?.declarations?.[0];\n if (\n !declaration ||\n !ts.isVariableDeclaration(declaration) ||\n !declaration.initializer\n ) {\n return undefined;\n }\n return this.emptyArraySatisfies(declaration.initializer)\n ? this.typeOfExpression(declaration.initializer)\n : this.checker.getTypeAtLocation(node.name);\n }\n\n serializeNode(node: ts.Node): any {\n this.currentNode = node;\n if (ts.isObjectLiteralExpression(node)) {\n const symbolType = this.checker.getTypeAtLocation(node);\n const props: Record<string, any> = {};\n for (const symbol of symbolType.getProperties()) {\n const type = this.checker.getTypeOfSymbol(symbol);\n props[symbol.name] = this.serializeType(type);\n }\n\n // get literal properties values if any\n for (const prop of node.properties) {\n if (ts.isPropertyAssignment(prop)) {\n props[prop.name.getText()] = this.serializeType(\n this.typeOfExpression(prop.initializer),\n );\n } else if (ts.isShorthandPropertyAssignment(prop)) {\n const type = this.typeOfShorthand(prop);\n if (type) {\n props[prop.name.text] = this.serializeType(type);\n }\n }\n }\n\n return sortObjectKeys(props);\n }\n if (ts.isPropertyAccessExpression(node)) {\n const symbol = this.checker.getSymbolAtLocation(node.name);\n if (!symbol) {\n this.warn(`No symbol found for ${node.name.getText()}`, node);\n return null;\n }\n const type = this.checker.getTypeOfSymbol(symbol);\n return this.serializeType(type);\n }\n if (ts.isPropertySignature(node)) {\n const symbol = this.checker.getSymbolAtLocation(node.name);\n if (!symbol) {\n this.warn(`No symbol found for ${node.name.getText()}`, node);\n return null;\n }\n const type = this.checker.getTypeOfSymbol(symbol);\n return this.serializeType(type);\n }\n if (ts.isPropertyDeclaration(node)) {\n const symbol = this.checker.getSymbolAtLocation(node.name);\n if (!symbol) {\n this.warn(`No symbol found for ${node.name.getText()}`, node);\n return null;\n }\n const type = this.checker.getTypeOfSymbol(symbol);\n return this.serializeType(type);\n }\n if (ts.isInterfaceDeclaration(node)) {\n if (!node.name?.text) {\n throw new Error('Interface has no name');\n }\n if (this.typesMap[node.name.text]) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [this.typesMap[node.name.text]],\n };\n }\n if (!this.collector[node.name.text]) {\n this.collector[node.name.text] = {};\n const members: Record<string, any> = {};\n for (const member of node.members.filter(ts.isPropertySignature)) {\n members[member.name.getText()] = this.serializeNode(member);\n }\n this.collector[node.name.text] = sortObjectKeys(members);\n }\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [`#/components/schemas/${node.name.text}`],\n };\n }\n if (ts.isClassDeclaration(node)) {\n if (!node.name?.text) {\n throw new Error('Class has no name');\n }\n if (this.typesMap[node.name.text]) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [this.typesMap[node.name.text]],\n };\n }\n\n if (!this.collector[node.name.text]) {\n this.collector[node.name.text] = {};\n const members: Record<string, unknown> = {};\n for (const member of node.members.filter(ts.isPropertyDeclaration)) {\n members[member.name!.getText()] = this.serializeNode(member);\n }\n this.collector[node.name.text] = sortObjectKeys(members);\n }\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [`#/components/schemas/${node.name.text}`],\n $ref: `#/components/schemas/${node.name.text}`,\n };\n }\n if (ts.isVariableDeclaration(node)) {\n const symbol = this.checker.getSymbolAtLocation(node.name);\n if (!symbol) {\n this.warn(`No symbol found for ${node.name.getText()}`, node);\n return null;\n }\n if (!node.type) {\n this.warn(`No type found for ${node.name.getText()}`, node);\n return 'any';\n }\n const type = this.checker.getTypeFromTypeNode(node.type);\n return this.serializeType(type);\n }\n if (ts.isIdentifier(node)) {\n const symbol = this.checker.getSymbolAtLocation(node);\n if (!symbol) {\n this.warn(`No symbol found for identifier ${node.getText()}`, node);\n return null;\n }\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n if (ts.isAwaitExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n if (ts.isCallExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n if (ts.isAsExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n if (ts.isSatisfiesExpression(node)) {\n return this.serializeType(this.typeOfExpression(node));\n }\n if (ts.isTypeLiteralNode(node)) {\n const symbolType = this.checker.getTypeAtLocation(node);\n const props: Record<string, unknown> = {};\n for (const symbol of symbolType.getProperties()) {\n const type = this.checker.getTypeOfSymbol(symbol);\n props[symbol.name] = this.serializeType(type);\n }\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [sortObjectKeys(props)],\n };\n }\n if (node.kind === ts.SyntaxKind.NullKeyword) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['null'],\n };\n }\n if (node.kind === ts.SyntaxKind.BooleanKeyword) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['boolean'],\n };\n }\n if (node.kind === ts.SyntaxKind.TrueKeyword) {\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'literal',\n value: true,\n [$types]: ['boolean'],\n };\n }\n if (node.kind === ts.SyntaxKind.FalseKeyword) {\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'literal',\n value: false,\n [$types]: ['boolean'],\n };\n }\n if (ts.isFunctionDeclaration(node)) {\n if (!node.name) {\n this.warn('Function declaration has no name', node);\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['any'],\n };\n }\n\n const functionName = node.name.text;\n if (this.typesMap[functionName]) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [this.typesMap[functionName]],\n };\n }\n\n if (node.type) {\n const returnType = this.checker.getTypeFromTypeNode(node.type);\n return this.serializeType(returnType);\n }\n\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['any'],\n };\n }\n if (ts.isArrayLiteralExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n if (ts.isStringLiteral(node) || ts.isNumericLiteral(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n // Handle template literals in expression position\n if (\n ts.isTemplateExpression(node) ||\n ts.isNoSubstitutionTemplateLiteral(node)\n ) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n if (ts.isTaggedTemplateExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n\n // Handle binary expressions (||, &&, +, -, etc.)\n if (ts.isBinaryExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n\n // Handle conditional/ternary expressions (x ? y : z)\n if (ts.isConditionalExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n\n // Handle parenthesized expressions ((value))\n if (ts.isParenthesizedExpression(node)) {\n return this.serializeType(this.typeOfExpression(node));\n }\n\n // Handle non-null assertions (value!)\n if (ts.isNonNullExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n\n this.warn(\n `Unhandled node: ${ts.SyntaxKind[node.kind]} \"${node.getText()}\" (type: ${this.checker.typeToString(\n this.checker.getTypeAtLocation(node),\n undefined,\n ts.TypeFormatFlags.NoTruncation,\n )})`,\n node,\n );\n\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['any'],\n };\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import ts, { TypeFlags, symbolName } from 'typescript';\n\nimport { isInterfaceType } from './program.js';\nimport { sortObjectKeys } from './utils.js';\n\ntype Collector = Record<string, any>;\n\nexport const deriveSymbol = Symbol.for('serialize');\nexport const $types = Symbol.for('types');\nexport const defaultTypesMap: Record<string, string> = {\n Readable: 'any',\n ReadableStream: 'any',\n DateConstructor: 'string',\n ArrayBufferConstructor: 'any',\n SharedArrayBufferConstructor: 'any',\n Int8ArrayConstructor: 'any',\n Uint8Array: 'any',\n};\n\ninterface TraceContext {\n file?: string;\n operation?: string;\n}\n\nexport function nodeLocation(node: ts.Node): string | undefined {\n try {\n const sourceFile = node.getSourceFile();\n if (!sourceFile) return undefined;\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(\n node.getStart(),\n );\n return `${sourceFile.fileName}:${line + 1}:${character + 1}`;\n } catch {\n return undefined;\n }\n}\n\nexport class TypeDeriver {\n public readonly collector: Collector = {};\n public readonly checker: ts.TypeChecker;\n public readonly typesMap: Record<string, string>;\n private trace: TraceContext = {};\n private currentNode?: ts.Node;\n private readonly activeAliases = new Map<ts.Type, boolean>();\n constructor(\n checker: ts.TypeChecker,\n typeMappings: Record<string, string> = defaultTypesMap,\n ) {\n this.checker = checker;\n this.typesMap = typeMappings;\n }\n\n setTrace(ctx: { file?: string; operation?: string }) {\n this.trace = { ...ctx };\n }\n\n private warn(message: string, node?: ts.Node) {\n const parts = [`\\x1b[33m\\u26a0 ${message}\\x1b[0m`];\n const resolvedNode = node ?? this.currentNode;\n const location = resolvedNode ? nodeLocation(resolvedNode) : undefined;\n if (location) {\n parts.push(` at \\x1b[36m${location}\\x1b[0m`);\n } else if (this.trace.file) {\n parts.push(` at \\x1b[36m${this.trace.file}\\x1b[0m`);\n }\n if (this.trace.operation) {\n parts.push(` in \\x1b[2m${this.trace.operation}\\x1b[0m`);\n }\n console.warn(parts.join('\\n'));\n }\n\n serializeType(type: ts.Type): any {\n return this.serialize(type, false);\n }\n\n private serialize(type: ts.Type, widenLiteralValues: boolean): unknown {\n const alias = type.aliasSymbol?.getName();\n if (!alias) {\n return this.serializeResolved(type, widenLiteralValues);\n }\n if (this.activeAliases.has(type)) {\n this.activeAliases.set(type, true);\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [`#/components/schemas/${alias}`],\n };\n }\n\n this.activeAliases.set(type, false);\n try {\n const result = this.serializeResolved(type, widenLiteralValues);\n if (this.activeAliases.get(type)) {\n this.collector[alias] = result;\n }\n return result;\n } finally {\n this.activeAliases.delete(type);\n }\n }\n\n private serializeResolved(\n type: ts.Type,\n widenLiteralValues: boolean,\n ): unknown {\n if (this.typesMap[type.aliasSymbol?.getName() || type.symbol?.getName()]) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [\n this.typesMap[type.aliasSymbol?.getName() || type.symbol?.getName()],\n ],\n };\n }\n const indexType = type.getStringIndexType();\n if (indexType) {\n return {\n [deriveSymbol]: true,\n kind: 'record',\n optional: false,\n [$types]: [this.serialize(indexType, widenLiteralValues)],\n };\n }\n if (type.flags & TypeFlags.Any) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [],\n };\n }\n if (type.flags & TypeFlags.Unknown) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [],\n };\n }\n if (type.flags & TypeFlags.Never) {\n return {\n [deriveSymbol]: true,\n kind: 'never',\n optional: false,\n [$types]: [],\n };\n }\n if (type.isStringLiteral()) {\n return {\n [deriveSymbol]: true,\n optional: false,\n ...(widenLiteralValues ? {} : { kind: 'literal', value: type.value }),\n [$types]: ['string'],\n };\n }\n if (type.isNumberLiteral()) {\n return {\n [deriveSymbol]: true,\n optional: false,\n ...(widenLiteralValues ? {} : { kind: 'literal', value: type.value }),\n [$types]: ['number'],\n };\n }\n if (type.flags & TypeFlags.BooleanLiteral) {\n return {\n [deriveSymbol]: true,\n optional: false,\n ...(widenLiteralValues\n ? {}\n : {\n kind: 'literal',\n value: this.checker.typeToString(type) === 'true',\n }),\n [$types]: ['boolean'],\n };\n }\n if (type.flags & TypeFlags.TemplateLiteral) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['string'],\n };\n }\n if (type.flags & TypeFlags.String) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['string'],\n };\n }\n if (type.flags & TypeFlags.Number) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['number'],\n };\n }\n if (type.flags & ts.TypeFlags.Boolean) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['boolean'],\n };\n }\n if (type.flags & TypeFlags.Null) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['null'],\n };\n }\n if (type.isIntersection()) {\n let optional: boolean | undefined;\n const types: any[] = [];\n for (const intersectionType of type.types) {\n if (optional === undefined) {\n optional = (intersectionType.flags & ts.TypeFlags.Undefined) !== 0;\n if (optional) {\n continue;\n }\n }\n\n types.push(this.serialize(intersectionType, widenLiteralValues));\n }\n return {\n [deriveSymbol]: true,\n kind: 'intersection',\n optional,\n [$types]: types,\n };\n }\n if (type.isUnion()) {\n let optional: boolean | undefined;\n const types: any[] = [];\n for (const unionType of type.types) {\n if (optional === undefined) {\n // ignore undefined\n optional = (unionType.flags & ts.TypeFlags.Undefined) !== 0;\n if (optional) {\n continue;\n }\n }\n\n types.push(this.serialize(unionType, widenLiteralValues));\n }\n return {\n [deriveSymbol]: true,\n kind: 'union',\n optional,\n [$types]: types,\n };\n }\n if (this.checker.isArrayLikeType(type)) {\n const elementType = this.checker.getIndexTypeOfType(\n type,\n ts.IndexKind.Number,\n );\n if (!elementType) {\n const typeName = type.symbol?.getName() || '<unknown>';\n this.warn(`Could not find element type for array type ${typeName}`);\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'array',\n [$types]: ['any'],\n };\n }\n const mappedElementType =\n this.typesMap[\n elementType.aliasSymbol?.getName() || elementType.symbol?.getName()\n ];\n return {\n kind: 'array',\n optional: false,\n [deriveSymbol]: true,\n [$types]: mappedElementType\n ? [mappedElementType]\n : [\n this.serialize(\n elementType,\n widenLiteralValues || this.checker.isTupleType(type),\n ),\n ],\n };\n }\n if (type.isClass()) {\n const declaration = type.symbol?.valueDeclaration;\n if (!declaration) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [type.symbol.getName()],\n };\n }\n return this.serializeNode(declaration);\n }\n if (isInterfaceType(type)) {\n const valueDeclaration =\n type.symbol.valueDeclaration ?? type.symbol.declarations?.[0];\n if (!valueDeclaration) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [type.symbol.getName()],\n };\n }\n return this.serializeNode(valueDeclaration);\n }\n if (type.flags & TypeFlags.Object) {\n if (this.typesMap[symbolName(type.symbol)]) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [this.typesMap[symbolName(type.symbol)]],\n };\n }\n const properties = this.checker.getPropertiesOfType(type);\n if (properties.length > 0) {\n const serializedProps: Record<string, any> = {};\n for (const prop of properties) {\n const declarations = prop.getDeclarations() ?? [];\n const propAssingment = declarations.find((it) =>\n ts.isPropertyAssignment(it),\n );\n const shorthand = declarations.find((it) =>\n ts.isShorthandPropertyAssignment(it),\n );\n const shorthandType = shorthand\n ? this.typeOfShorthand(shorthand)\n : undefined;\n // get literal properties values if any\n if (propAssingment) {\n serializedProps[prop.name] = this.serialize(\n this.typeOfExpression(propAssingment.initializer),\n widenLiteralValues,\n );\n } else if (shorthandType) {\n serializedProps[prop.name] = this.serialize(\n shorthandType,\n widenLiteralValues,\n );\n } else {\n const propType = this.checker.getTypeOfSymbol(prop);\n serializedProps[prop.name] = this.serializeType(propType);\n }\n }\n return {\n [deriveSymbol]: true,\n kind: 'object',\n optional: false,\n [$types]: [sortObjectKeys(serializedProps)],\n };\n }\n const declaration =\n type.symbol.valueDeclaration ?? type.symbol.declarations?.[0];\n if (!declaration) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [type.symbol.getName()],\n };\n }\n return this.serializeNode(declaration);\n }\n\n this.warn(`Unhandled type: ${type.flags} ${ts.TypeFlags[type.flags]}`);\n\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [\n this.checker.typeToString(\n type,\n undefined,\n ts.TypeFormatFlags.NoTruncation,\n ),\n ],\n };\n }\n\n /**\n * Preserve the inferred type of `satisfies` expressions unless the operand is\n * an empty array; only then recover its declared element type.\n */\n private typeOfExpression(\n node: ts.Expression,\n seen = new Set<ts.Symbol>(),\n ): ts.Type {\n const satisfies = this.emptyArraySatisfies(node);\n if (satisfies) {\n return this.checker.getTypeFromTypeNode(satisfies.type);\n }\n let expression = node;\n while (ts.isParenthesizedExpression(expression)) {\n expression = expression.expression;\n }\n\n if (ts.isIdentifier(expression)) {\n const symbol = this.checker.getSymbolAtLocation(expression);\n const declaration = symbol?.valueDeclaration ?? symbol?.declarations?.[0];\n if (\n symbol &&\n !seen.has(symbol) &&\n declaration &&\n ts.isVariableDeclaration(declaration) &&\n ts.isVariableDeclarationList(declaration.parent) &&\n declaration.parent.flags & ts.NodeFlags.Const\n ) {\n seen.add(symbol);\n if (declaration.type) {\n return this.checker.getTypeFromTypeNode(declaration.type);\n }\n if (declaration.initializer) {\n return this.typeOfExpression(declaration.initializer, seen);\n }\n }\n }\n\n if (\n ts.isArrayLiteralExpression(expression) &&\n expression.elements.length === 1 &&\n ts.isSpreadElement(expression.elements[0])\n ) {\n return this.typeOfExpression(expression.elements[0].expression, seen);\n }\n\n return this.checker.getTypeAtLocation(expression);\n }\n\n private emptyArraySatisfies(\n node: ts.Expression,\n ): ts.SatisfiesExpression | undefined {\n let expression = node;\n while (ts.isParenthesizedExpression(expression)) {\n expression = expression.expression;\n }\n if (!ts.isSatisfiesExpression(expression)) {\n return undefined;\n }\n let operand = expression.expression;\n while (ts.isParenthesizedExpression(operand)) {\n operand = operand.expression;\n }\n if (!ts.isArrayLiteralExpression(operand) || operand.elements.length > 0) {\n return undefined;\n }\n const annotation = this.checker.getTypeFromTypeNode(expression.type);\n return this.checker.isArrayLikeType(annotation) ? expression : undefined;\n }\n\n private typeOfShorthand(\n node: ts.ShorthandPropertyAssignment,\n ): ts.Type | undefined {\n const symbol = this.checker.getShorthandAssignmentValueSymbol(node);\n const declaration = symbol?.valueDeclaration ?? symbol?.declarations?.[0];\n if (\n !declaration ||\n !ts.isVariableDeclaration(declaration) ||\n !declaration.initializer\n ) {\n return undefined;\n }\n return this.emptyArraySatisfies(declaration.initializer)\n ? this.typeOfExpression(declaration.initializer)\n : this.checker.getTypeAtLocation(node.name);\n }\n\n serializeNode(node: ts.Node): any {\n this.currentNode = node;\n if (ts.isObjectLiteralExpression(node)) {\n const symbolType = this.checker.getTypeAtLocation(node);\n const props: Record<string, any> = {};\n\n for (const prop of node.properties) {\n if (ts.isPropertyAssignment(prop)) {\n props[prop.name.getText()] = this.serializeType(\n this.typeOfExpression(prop.initializer),\n );\n } else if (ts.isShorthandPropertyAssignment(prop)) {\n const type = this.typeOfShorthand(prop);\n if (type) {\n props[prop.name.text] = this.serializeType(type);\n }\n }\n }\n\n for (const symbol of symbolType.getProperties()) {\n if (!Object.hasOwn(props, symbol.name)) {\n const type = this.checker.getTypeOfSymbol(symbol);\n props[symbol.name] = this.serializeType(type);\n }\n }\n\n return sortObjectKeys(props);\n }\n if (ts.isPropertyAccessExpression(node)) {\n const symbol = this.checker.getSymbolAtLocation(node.name);\n if (!symbol) {\n this.warn(`No symbol found for ${node.name.getText()}`, node);\n return null;\n }\n const type = this.checker.getTypeOfSymbol(symbol);\n return this.serializeType(type);\n }\n if (ts.isPropertySignature(node)) {\n const symbol = this.checker.getSymbolAtLocation(node.name);\n if (!symbol) {\n this.warn(`No symbol found for ${node.name.getText()}`, node);\n return null;\n }\n const type = this.checker.getTypeOfSymbol(symbol);\n return this.serializeType(type);\n }\n if (ts.isPropertyDeclaration(node)) {\n const symbol = this.checker.getSymbolAtLocation(node.name);\n if (!symbol) {\n this.warn(`No symbol found for ${node.name.getText()}`, node);\n return null;\n }\n const type = this.checker.getTypeOfSymbol(symbol);\n return this.serializeType(type);\n }\n if (ts.isInterfaceDeclaration(node)) {\n if (!node.name?.text) {\n throw new Error('Interface has no name');\n }\n if (this.typesMap[node.name.text]) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [this.typesMap[node.name.text]],\n };\n }\n if (!this.collector[node.name.text]) {\n this.collector[node.name.text] = {};\n const members: Record<string, any> = {};\n for (const member of node.members.filter(ts.isPropertySignature)) {\n members[member.name.getText()] = this.serializeNode(member);\n }\n this.collector[node.name.text] = sortObjectKeys(members);\n }\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [`#/components/schemas/${node.name.text}`],\n };\n }\n if (ts.isClassDeclaration(node)) {\n if (!node.name?.text) {\n throw new Error('Class has no name');\n }\n if (this.typesMap[node.name.text]) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [this.typesMap[node.name.text]],\n };\n }\n\n if (!this.collector[node.name.text]) {\n this.collector[node.name.text] = {};\n const members: Record<string, unknown> = {};\n for (const member of node.members.filter(ts.isPropertyDeclaration)) {\n members[member.name!.getText()] = this.serializeNode(member);\n }\n this.collector[node.name.text] = sortObjectKeys(members);\n }\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [`#/components/schemas/${node.name.text}`],\n $ref: `#/components/schemas/${node.name.text}`,\n };\n }\n if (ts.isVariableDeclaration(node)) {\n const symbol = this.checker.getSymbolAtLocation(node.name);\n if (!symbol) {\n this.warn(`No symbol found for ${node.name.getText()}`, node);\n return null;\n }\n if (!node.type) {\n this.warn(`No type found for ${node.name.getText()}`, node);\n return 'any';\n }\n const type = this.checker.getTypeFromTypeNode(node.type);\n return this.serializeType(type);\n }\n if (ts.isIdentifier(node)) {\n const symbol = this.checker.getSymbolAtLocation(node);\n if (!symbol) {\n this.warn(`No symbol found for identifier ${node.getText()}`, node);\n return null;\n }\n const type = this.typeOfExpression(node);\n return this.serializeType(type);\n }\n if (ts.isAwaitExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n if (ts.isCallExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n if (ts.isAsExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n if (ts.isSatisfiesExpression(node)) {\n return this.serializeType(this.typeOfExpression(node));\n }\n if (ts.isTypeLiteralNode(node)) {\n const symbolType = this.checker.getTypeAtLocation(node);\n const props: Record<string, unknown> = {};\n for (const symbol of symbolType.getProperties()) {\n const type = this.checker.getTypeOfSymbol(symbol);\n props[symbol.name] = this.serializeType(type);\n }\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [sortObjectKeys(props)],\n };\n }\n if (node.kind === ts.SyntaxKind.NullKeyword) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['null'],\n };\n }\n if (node.kind === ts.SyntaxKind.BooleanKeyword) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['boolean'],\n };\n }\n if (node.kind === ts.SyntaxKind.TrueKeyword) {\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'literal',\n value: true,\n [$types]: ['boolean'],\n };\n }\n if (node.kind === ts.SyntaxKind.FalseKeyword) {\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'literal',\n value: false,\n [$types]: ['boolean'],\n };\n }\n if (ts.isFunctionDeclaration(node)) {\n if (!node.name) {\n this.warn('Function declaration has no name', node);\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['any'],\n };\n }\n\n const functionName = node.name.text;\n if (this.typesMap[functionName]) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [this.typesMap[functionName]],\n };\n }\n\n if (node.type) {\n const returnType = this.checker.getTypeFromTypeNode(node.type);\n return this.serializeType(returnType);\n }\n\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['any'],\n };\n }\n if (ts.isArrayLiteralExpression(node)) {\n const type = this.typeOfExpression(node);\n return this.serializeType(type);\n }\n if (ts.isStringLiteral(node) || ts.isNumericLiteral(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n // Handle template literals in expression position\n if (\n ts.isTemplateExpression(node) ||\n ts.isNoSubstitutionTemplateLiteral(node)\n ) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n if (ts.isTaggedTemplateExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n\n // Handle binary expressions (||, &&, +, -, etc.)\n if (ts.isBinaryExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n\n // Handle conditional/ternary expressions (x ? y : z)\n if (ts.isConditionalExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n\n // Handle parenthesized expressions ((value))\n if (ts.isParenthesizedExpression(node)) {\n return this.serializeType(this.typeOfExpression(node));\n }\n\n // Handle non-null assertions (value!)\n if (ts.isNonNullExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n\n this.warn(\n `Unhandled node: ${ts.SyntaxKind[node.kind]} \"${node.getText()}\" (type: ${this.checker.typeToString(\n this.checker.getTypeAtLocation(node),\n undefined,\n ts.TypeFormatFlags.NoTruncation,\n )})`,\n node,\n );\n\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['any'],\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|