@sdk-it/core 0.37.1 → 0.39.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.
- package/dist/lib/deriver.d.ts.map +1 -1
- package/dist/lib/deriver.js +31 -12
- package/dist/lib/deriver.js.map +2 -2
- package/dist/lib/paths.d.ts.map +1 -1
- package/dist/lib/paths.js +11 -5
- package/dist/lib/paths.js.map +2 -2
- package/dist/lib/utils.d.ts +17 -2
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +13 -0
- package/dist/lib/utils.js.map +2 -2
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deriver.d.ts","sourceRoot":"","sources":["../../src/lib/deriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,MAAM,YAAY,CAAC;
|
|
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;AACF,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;gBAE/C,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,YAAY,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAmB;IAMxD,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG;IAiSjC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG;CA8QlC"}
|
package/dist/lib/deriver.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import ts, { TypeFlags, symbolName } from "typescript";
|
|
2
2
|
import { isInterfaceType } from "./program.js";
|
|
3
|
+
import { sortObjectKeys } from "./utils.js";
|
|
3
4
|
const deriveSymbol = Symbol.for("serialize");
|
|
4
5
|
const $types = Symbol.for("types");
|
|
5
6
|
const defaultTypesMap = {
|
|
@@ -108,7 +109,7 @@ class TypeDeriver {
|
|
|
108
109
|
if (type.flags & TypeFlags.Null) {
|
|
109
110
|
return {
|
|
110
111
|
[deriveSymbol]: true,
|
|
111
|
-
optional:
|
|
112
|
+
optional: false,
|
|
112
113
|
[$types]: ["null"]
|
|
113
114
|
};
|
|
114
115
|
}
|
|
@@ -183,11 +184,13 @@ class TypeDeriver {
|
|
|
183
184
|
const maybeDeclaration = typeSymbol.declarations?.[0];
|
|
184
185
|
if (maybeDeclaration) {
|
|
185
186
|
if (ts.isMappedTypeNode(maybeDeclaration)) {
|
|
186
|
-
const resolvedType =
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
187
|
+
const resolvedType = sortObjectKeys(
|
|
188
|
+
this.checker.getPropertiesOfType(argType).reduce((acc, prop) => {
|
|
189
|
+
const propType = this.checker.getTypeOfSymbol(prop);
|
|
190
|
+
acc[prop.name] = this.serializeType(propType);
|
|
191
|
+
return acc;
|
|
192
|
+
}, {})
|
|
193
|
+
);
|
|
191
194
|
return {
|
|
192
195
|
kind: "array",
|
|
193
196
|
optional: false,
|
|
@@ -264,7 +267,7 @@ class TypeDeriver {
|
|
|
264
267
|
[deriveSymbol]: true,
|
|
265
268
|
kind: "object",
|
|
266
269
|
optional: false,
|
|
267
|
-
[$types]: [serializedProps]
|
|
270
|
+
[$types]: [sortObjectKeys(serializedProps)]
|
|
268
271
|
};
|
|
269
272
|
}
|
|
270
273
|
const declaration = type.symbol.valueDeclaration ?? type.symbol.declarations?.[0];
|
|
@@ -304,7 +307,7 @@ class TypeDeriver {
|
|
|
304
307
|
props[prop.name.getText()] = this.serializeType(type);
|
|
305
308
|
}
|
|
306
309
|
}
|
|
307
|
-
return props;
|
|
310
|
+
return sortObjectKeys(props);
|
|
308
311
|
}
|
|
309
312
|
if (ts.isPropertyAccessExpression(node)) {
|
|
310
313
|
const symbol = this.checker.getSymbolAtLocation(node.name);
|
|
@@ -350,7 +353,7 @@ class TypeDeriver {
|
|
|
350
353
|
for (const member of node.members.filter(ts.isPropertySignature)) {
|
|
351
354
|
members[member.name.getText()] = this.serializeNode(member);
|
|
352
355
|
}
|
|
353
|
-
this.collector[node.name.text] = members;
|
|
356
|
+
this.collector[node.name.text] = sortObjectKeys(members);
|
|
354
357
|
}
|
|
355
358
|
return {
|
|
356
359
|
[deriveSymbol]: true,
|
|
@@ -375,7 +378,7 @@ class TypeDeriver {
|
|
|
375
378
|
for (const member of node.members.filter(ts.isPropertyDeclaration)) {
|
|
376
379
|
members[member.name.getText()] = this.serializeNode(member);
|
|
377
380
|
}
|
|
378
|
-
this.collector[node.name.text] = members;
|
|
381
|
+
this.collector[node.name.text] = sortObjectKeys(members);
|
|
379
382
|
}
|
|
380
383
|
return {
|
|
381
384
|
[deriveSymbol]: true,
|
|
@@ -428,13 +431,13 @@ class TypeDeriver {
|
|
|
428
431
|
return {
|
|
429
432
|
[deriveSymbol]: true,
|
|
430
433
|
optional: false,
|
|
431
|
-
[$types]: [props]
|
|
434
|
+
[$types]: [sortObjectKeys(props)]
|
|
432
435
|
};
|
|
433
436
|
}
|
|
434
437
|
if (node.kind === ts.SyntaxKind.NullKeyword) {
|
|
435
438
|
return {
|
|
436
439
|
[deriveSymbol]: true,
|
|
437
|
-
optional:
|
|
440
|
+
optional: false,
|
|
438
441
|
[$types]: ["null"]
|
|
439
442
|
};
|
|
440
443
|
}
|
|
@@ -506,6 +509,22 @@ class TypeDeriver {
|
|
|
506
509
|
const type = this.checker.getTypeAtLocation(node);
|
|
507
510
|
return this.serializeType(type);
|
|
508
511
|
}
|
|
512
|
+
if (ts.isBinaryExpression(node)) {
|
|
513
|
+
const type = this.checker.getTypeAtLocation(node);
|
|
514
|
+
return this.serializeType(type);
|
|
515
|
+
}
|
|
516
|
+
if (ts.isConditionalExpression(node)) {
|
|
517
|
+
const type = this.checker.getTypeAtLocation(node);
|
|
518
|
+
return this.serializeType(type);
|
|
519
|
+
}
|
|
520
|
+
if (ts.isParenthesizedExpression(node)) {
|
|
521
|
+
const type = this.checker.getTypeAtLocation(node);
|
|
522
|
+
return this.serializeType(type);
|
|
523
|
+
}
|
|
524
|
+
if (ts.isNonNullExpression(node)) {
|
|
525
|
+
const type = this.checker.getTypeAtLocation(node);
|
|
526
|
+
return this.serializeType(type);
|
|
527
|
+
}
|
|
509
528
|
console.warn(
|
|
510
529
|
"Unhandled node details:",
|
|
511
530
|
`Node kind: ${ts.SyntaxKind[node.kind]}`,
|
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';\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};\nexport class TypeDeriver {\n public readonly collector: Collector = {};\n public readonly checker: ts.TypeChecker;\n public readonly typesMap: Record<string, string>;\n constructor(\n checker: ts.TypeChecker,\n typeMappings: Record<string, string> = defaultTypesMap,\n ) {\n this.checker = checker;\n this.typesMap = typeMappings;\n }\n\n serializeType(type: ts.Type): any {\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.serializeType(indexType)],\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.isStringLiteral()) {\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'literal',\n value: type.value,\n [$types]: ['string'],\n };\n }\n if (type.isNumberLiteral()) {\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'literal',\n value: type.value,\n [$types]: ['number'],\n };\n }\n if (type.flags & TypeFlags.BooleanLiteral) {\n return {\n [deriveSymbol]: true,\n optional: false,\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: true,\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.serializeType(intersectionType));\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.serializeType(unionType));\n }\n return {\n [deriveSymbol]: true,\n kind: 'union',\n optional,\n [$types]: types,\n };\n }\n if (this.checker.isArrayLikeType(type)) {\n const [argType] = this.checker.getTypeArguments(type as ts.TypeReference);\n if (!argType) {\n const typeName = type.symbol?.getName() || '<unknown>';\n console.warn(\n `Could not find generic type argument for array type ${typeName}`,\n );\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'array',\n [$types]: ['any'],\n };\n }\n const typeSymbol = argType.getSymbol();\n if (!typeSymbol) {\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'array',\n [$types]: [this.serializeType(argType)],\n };\n }\n\n if (typeSymbol.valueDeclaration) {\n return {\n kind: 'array',\n [deriveSymbol]: true,\n [$types]: [this.serializeNode(typeSymbol.valueDeclaration)],\n };\n }\n const maybeDeclaration = typeSymbol.declarations?.[0];\n if (maybeDeclaration) {\n if (ts.isMappedTypeNode(maybeDeclaration)) {\n const resolvedType = this.checker\n .getPropertiesOfType(argType)\n .reduce<Record<string, unknown>>((acc, prop) => {\n const propType = this.checker.getTypeOfSymbol(prop);\n acc[prop.name] = this.serializeType(propType);\n return acc;\n }, {});\n return {\n kind: 'array',\n optional: false,\n [deriveSymbol]: true,\n [$types]: [resolvedType],\n };\n } else {\n return {\n kind: 'array',\n ...this.serializeNode(maybeDeclaration),\n };\n }\n }\n\n return {\n kind: 'array',\n optional: false,\n [deriveSymbol]: true,\n [$types]: ['any'],\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 propAssingment = (prop.getDeclarations() ?? []).find((it) =>\n ts.isPropertyAssignment(it),\n );\n // get literal properties values if any\n if (propAssingment) {\n const type = this.checker.getTypeAtLocation(\n propAssingment.initializer,\n );\n serializedProps[prop.name] = this.serializeType(type);\n } else if (\n (prop.getDeclarations() ?? []).find((it) =>\n ts.isPropertySignature(it),\n )\n ) {\n const propType = this.checker.getTypeOfSymbol(prop);\n serializedProps[prop.name] = this.serializeType(propType);\n } else {\n // SymbolObject props\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]: [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 console.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 serializeNode(node: ts.Node): any {\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 const type = this.checker.getTypeAtLocation(prop.initializer);\n props[prop.name.getText()] = this.serializeType(type);\n }\n }\n\n return props;\n }\n if (ts.isPropertyAccessExpression(node)) {\n const symbol = this.checker.getSymbolAtLocation(node.name);\n if (!symbol) {\n console.warn(`No symbol found for ${node.name.getText()}`);\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 console.warn(`No symbol found for ${node.name.getText()}`);\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 console.warn(`No symbol found for ${node.name.getText()}`);\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] = 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] = 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 console.warn(`No symbol found for ${node.name.getText()}`);\n return null;\n }\n if (!node.type) {\n console.warn(`No type found for ${node.name.getText()}`);\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 console.warn(`Identifer: No symbol found for ${node.getText()}`);\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.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]: [props],\n };\n }\n if (node.kind === ts.SyntaxKind.NullKeyword) {\n return {\n [deriveSymbol]: true,\n optional: true,\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 console.warn('Function declaration has no name');\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 console.warn(\n 'Unhandled node details:',\n `Node kind: ${ts.SyntaxKind[node.kind]}`,\n `Node flags: ${node.flags}`,\n `Node text: ${node.getText()}`,\n `Node type: ${this.checker.typeToString(\n this.checker.getTypeAtLocation(node),\n undefined,\n ts.TypeFormatFlags.NoTruncation,\n )}`,\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};\nexport class TypeDeriver {\n public readonly collector: Collector = {};\n public readonly checker: ts.TypeChecker;\n public readonly typesMap: Record<string, string>;\n constructor(\n checker: ts.TypeChecker,\n typeMappings: Record<string, string> = defaultTypesMap,\n ) {\n this.checker = checker;\n this.typesMap = typeMappings;\n }\n\n serializeType(type: ts.Type): any {\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.serializeType(indexType)],\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.isStringLiteral()) {\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'literal',\n value: type.value,\n [$types]: ['string'],\n };\n }\n if (type.isNumberLiteral()) {\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'literal',\n value: type.value,\n [$types]: ['number'],\n };\n }\n if (type.flags & TypeFlags.BooleanLiteral) {\n return {\n [deriveSymbol]: true,\n optional: false,\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.serializeType(intersectionType));\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.serializeType(unionType));\n }\n return {\n [deriveSymbol]: true,\n kind: 'union',\n optional,\n [$types]: types,\n };\n }\n if (this.checker.isArrayLikeType(type)) {\n const [argType] = this.checker.getTypeArguments(type as ts.TypeReference);\n if (!argType) {\n const typeName = type.symbol?.getName() || '<unknown>';\n console.warn(\n `Could not find generic type argument for array type ${typeName}`,\n );\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'array',\n [$types]: ['any'],\n };\n }\n const typeSymbol = argType.getSymbol();\n if (!typeSymbol) {\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'array',\n [$types]: [this.serializeType(argType)],\n };\n }\n\n if (typeSymbol.valueDeclaration) {\n return {\n kind: 'array',\n [deriveSymbol]: true,\n [$types]: [this.serializeNode(typeSymbol.valueDeclaration)],\n };\n }\n const maybeDeclaration = typeSymbol.declarations?.[0];\n if (maybeDeclaration) {\n if (ts.isMappedTypeNode(maybeDeclaration)) {\n const resolvedType = sortObjectKeys(\n this.checker\n .getPropertiesOfType(argType)\n .reduce<Record<string, unknown>>((acc, prop) => {\n const propType = this.checker.getTypeOfSymbol(prop);\n acc[prop.name] = this.serializeType(propType);\n return acc;\n }, {}),\n );\n return {\n kind: 'array',\n optional: false,\n [deriveSymbol]: true,\n [$types]: [resolvedType],\n };\n } else {\n return {\n kind: 'array',\n ...this.serializeNode(maybeDeclaration),\n };\n }\n }\n\n return {\n kind: 'array',\n optional: false,\n [deriveSymbol]: true,\n [$types]: ['any'],\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 propAssingment = (prop.getDeclarations() ?? []).find((it) =>\n ts.isPropertyAssignment(it),\n );\n // get literal properties values if any\n if (propAssingment) {\n const type = this.checker.getTypeAtLocation(\n propAssingment.initializer,\n );\n serializedProps[prop.name] = this.serializeType(type);\n } else if (\n (prop.getDeclarations() ?? []).find((it) =>\n ts.isPropertySignature(it),\n )\n ) {\n const propType = this.checker.getTypeOfSymbol(prop);\n serializedProps[prop.name] = this.serializeType(propType);\n } else {\n // SymbolObject props\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 console.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 serializeNode(node: ts.Node): any {\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 const type = this.checker.getTypeAtLocation(prop.initializer);\n props[prop.name.getText()] = 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 console.warn(`No symbol found for ${node.name.getText()}`);\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 console.warn(`No symbol found for ${node.name.getText()}`);\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 console.warn(`No symbol found for ${node.name.getText()}`);\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 console.warn(`No symbol found for ${node.name.getText()}`);\n return null;\n }\n if (!node.type) {\n console.warn(`No type found for ${node.name.getText()}`);\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 console.warn(`Identifer: No symbol found for ${node.getText()}`);\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.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 console.warn('Function declaration has no name');\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 const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\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 console.warn(\n 'Unhandled node details:',\n `Node kind: ${ts.SyntaxKind[node.kind]}`,\n `Node flags: ${node.flags}`,\n `Node text: ${node.getText()}`,\n `Node type: ${this.checker.typeToString(\n this.checker.getTypeAtLocation(node),\n undefined,\n ts.TypeFormatFlags.NoTruncation,\n )}`,\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": ["type"]
|
|
7
7
|
}
|
package/dist/lib/paths.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,eAAe,EAEf,WAAW,EAIZ,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,eAAe,EAEf,WAAW,EAIZ,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,KAAK,YAAY,EAAW,MAAM,qBAAqB,CAAC;AAEjE,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AACF,MAAM,MAAM,MAAM,GACd,KAAK,GACL,MAAM,GACN,KAAK,GACL,OAAO,GACP,QAAQ,GACR,OAAO,GACP,MAAM,CAAC;AAEX,eAAO,MAAM,OAAO,qEAQV,CAAC;AACX,MAAM,MAAM,cAAc,GACtB,OAAO,GACP,SAAS,GACT,MAAM,GACN,QAAQ,GACR,SAAS,CAAC;AAQd,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC;CAChD;AAED,MAAM,MAAM,WAAW,GAAG,CACxB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,eAAe,KACvB,WAAW,CAAC;AACjB,qBAAa,KAAK;;gBAcJ,MAAM,EAAE;QAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QAAC,WAAW,CAAC,EAAE,WAAW,CAAA;KAAE;IAK1E,OAAO,CACL,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,SAAS,EAAE,QAAQ,EAAE,EACrB,SAAS,EAAE,YAAY,EAAE,EACzB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,aAAa;IA8GrB,OAAO,IAAI,MAAM,EAAE;IAcb,QAAQ;CA0Ef;AAED,UAAU,QAAQ;IAChB,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,GAAG,CA0CxE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,MAAM,CAEzD"}
|
package/dist/lib/paths.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { $types } from "./deriver.js";
|
|
2
|
+
import { sortArray, sortObjectKeys } from "./utils.js";
|
|
2
3
|
import { evalZod } from "./zod-jsonschema.js";
|
|
3
4
|
const methods = [
|
|
4
5
|
"get",
|
|
@@ -50,7 +51,8 @@ class Paths {
|
|
|
50
51
|
} : void 0,
|
|
51
52
|
headers: item.headers.length ? item.headers.reduce((acc, current) => {
|
|
52
53
|
const headers = typeof current === "string" ? { [current]: [] } : current;
|
|
53
|
-
|
|
54
|
+
const sortedHeaders = Object.entries(sortObjectKeys(headers));
|
|
55
|
+
return sortedHeaders.reduce(
|
|
54
56
|
(subAcc, [key, value]) => {
|
|
55
57
|
const header = {
|
|
56
58
|
[key]: {
|
|
@@ -130,7 +132,10 @@ class Paths {
|
|
|
130
132
|
const { parameters, bodySchemaProps } = await this.#selectosToParameters(selectors);
|
|
131
133
|
const bodySchema = {};
|
|
132
134
|
const required = [];
|
|
133
|
-
|
|
135
|
+
const sortedBodySchemaProps = Object.entries(
|
|
136
|
+
sortObjectKeys(bodySchemaProps)
|
|
137
|
+
);
|
|
138
|
+
for (const [key, value] of sortedBodySchemaProps) {
|
|
134
139
|
if (value.required) {
|
|
135
140
|
required.push(key);
|
|
136
141
|
}
|
|
@@ -152,7 +157,7 @@ class Paths {
|
|
|
152
157
|
content: {
|
|
153
158
|
[operation.contentType || "application/json"]: {
|
|
154
159
|
schema: {
|
|
155
|
-
required: required.length ? required : void 0,
|
|
160
|
+
required: required.length ? sortArray(required) : void 0,
|
|
156
161
|
type: "object",
|
|
157
162
|
properties: bodySchema
|
|
158
163
|
}
|
|
@@ -212,7 +217,8 @@ function toSchema(data) {
|
|
|
212
217
|
} else {
|
|
213
218
|
const props = {};
|
|
214
219
|
const required = [];
|
|
215
|
-
|
|
220
|
+
const sortedEntries = Object.entries(sortObjectKeys(data));
|
|
221
|
+
for (const [key, value] of sortedEntries) {
|
|
216
222
|
props[key] = toSchema(value);
|
|
217
223
|
if (!value.optional) {
|
|
218
224
|
required.push(key);
|
|
@@ -221,7 +227,7 @@ function toSchema(data) {
|
|
|
221
227
|
return {
|
|
222
228
|
type: "object",
|
|
223
229
|
properties: props,
|
|
224
|
-
required,
|
|
230
|
+
required: sortArray(required),
|
|
225
231
|
additionalProperties: false
|
|
226
232
|
};
|
|
227
233
|
}
|
package/dist/lib/paths.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/lib/paths.ts"],
|
|
4
|
-
"sourcesContent": ["import type {\n HeadersObject,\n OperationObject,\n ParameterObject,\n PathsObject,\n ResponseObject,\n ResponsesObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\n\nimport { $types } from './deriver.js';\nimport { type InjectImport, evalZod } from './zod-jsonschema.js';\n\nexport type OperationInfo = {\n tool?: string;\n toolDescription?: string;\n summary?: string;\n description?: string;\n tags?: string[];\n};\nexport type Method =\n | 'get'\n | 'post'\n | 'put'\n | 'patch'\n | 'delete'\n | 'trace'\n | 'head';\n\nexport const methods = [\n 'get',\n 'post',\n 'put',\n 'patch',\n 'delete',\n 'trace',\n 'head',\n] as const;\nexport type SemanticSource =\n | 'query'\n | 'queries'\n | 'body'\n | 'params'\n | 'headers';\n\nconst semanticSourceToOpenAPI = {\n queries: 'query',\n query: 'query',\n headers: 'header',\n params: 'path',\n} as const;\nexport interface Selector {\n name: string;\n against: string;\n source: SemanticSource;\n}\n\nexport interface ResponseItem {\n statusCode: string;\n response?: DateType;\n contentType: string;\n headers: (string | Record<string, string[]>)[];\n}\n\nexport type OnOperation = (\n sourceFile: string,\n method: Method,\n path: string,\n operation: OperationObject,\n) => PathsObject;\nexport class Paths {\n #imports: InjectImport[] = [];\n #onOperation?: OnOperation;\n #operations: Array<{\n sourceFile: string;\n name: string;\n path: string;\n method: Method;\n selectors: Selector[];\n responses: ResponsesObject;\n contentType?: string;\n info: OperationInfo;\n }> = [];\n\n constructor(config: { imports: InjectImport[]; onOperation?: OnOperation }) {\n this.#imports = config.imports;\n this.#onOperation = config.onOperation;\n }\n\n addPath(\n name: string,\n path: string,\n method: Method,\n contentType: string | undefined,\n selectors: Selector[],\n responses: ResponseItem[],\n sourceFile: string,\n info: OperationInfo,\n ) {\n const responsesObject = this.#responseItemToResponses(responses);\n\n this.#operations.push({\n name,\n path: this.#tunePath(path),\n sourceFile,\n contentType: contentType,\n method,\n selectors,\n responses: responsesObject,\n info,\n });\n return this;\n }\n\n #responseItemToResponses(responses: ResponseItem[]): ResponsesObject {\n const responsesObject: ResponsesObject = {};\n for (const item of responses) {\n const ct = item.contentType;\n const schema = item.response ? toSchema(item.response) : {};\n if (!responsesObject[item.statusCode]) {\n responsesObject[item.statusCode] = {\n description: `Response for ${item.statusCode}`,\n content:\n ct !== 'empty'\n ? {\n [ct]:\n ct === 'application/octet-stream'\n ? { schema: { type: 'string', format: 'binary' } }\n : { schema },\n }\n : undefined,\n headers: item.headers.length\n ? item.headers.reduce<HeadersObject>((acc, current) => {\n const headers =\n typeof current === 'string' ? { [current]: [] } : current;\n return Object.entries(headers).reduce<HeadersObject>(\n (subAcc, [key, value]) => {\n const header: HeadersObject = {\n [key]: {\n schema: {\n type: 'string',\n enum: value.length ? value : undefined,\n },\n },\n };\n return { ...subAcc, ...header };\n },\n acc,\n );\n }, {})\n : undefined,\n } satisfies ResponseObject;\n } else {\n if (!responsesObject[item.statusCode].content[ct]) {\n responsesObject[item.statusCode].content[ct] = { schema };\n } else {\n const existing = responsesObject[item.statusCode].content[ct]\n .schema as SchemaObject;\n if (existing.oneOf) {\n if (\n !existing.oneOf.find(\n (it) => JSON.stringify(it) === JSON.stringify(schema),\n )\n ) {\n existing.oneOf.push(schema);\n }\n } else if (JSON.stringify(existing) !== JSON.stringify(schema)) {\n responsesObject[item.statusCode].content[ct].schema = {\n oneOf: [existing, schema],\n };\n }\n }\n }\n }\n return responsesObject;\n }\n\n async #selectosToParameters(selectors: Selector[]) {\n const parameters: ParameterObject[] = [];\n const bodySchemaProps: Record<\n string,\n { required: boolean; schema: SchemaObject }\n > = {};\n for (const selector of selectors) {\n const { optional, schema } = await evalZod(\n selector.against,\n this.#imports,\n );\n if (selector.source === 'body') {\n bodySchemaProps[selector.name] = {\n required: !optional,\n schema,\n };\n continue;\n }\n const parameter: ParameterObject = {\n in: semanticSourceToOpenAPI[selector.source],\n name: selector.name,\n required: !optional,\n schema,\n };\n parameters.push(parameter);\n }\n return { parameters, bodySchemaProps };\n }\n\n getTags(): string[] {\n const tags = new Set<string>();\n\n for (const operation of this.#operations) {\n if (operation.info.tags) {\n for (const tag of operation.info.tags) {\n tags.add(tag);\n }\n }\n }\n\n return Array.from(tags);\n }\n\n async getPaths() {\n const operations: PathsObject = {};\n\n for (const operation of this.#operations) {\n const { path, method, selectors } = operation;\n const { parameters, bodySchemaProps } =\n await this.#selectosToParameters(selectors);\n const bodySchema: Record<string, SchemaObject> = {};\n const required: string[] = [];\n for (const [key, value] of Object.entries(bodySchemaProps)) {\n if (value.required) {\n required.push(key);\n }\n bodySchema[key] = value.schema;\n }\n\n const operationObject: OperationObject = {\n operationId: operation.name,\n parameters,\n tags: operation.info.tags,\n // || undefined would omit the value from final openapi spec\n description: operation.info.description || undefined,\n summary: operation.info.summary || undefined,\n 'x-tool': operation.info.tool\n ? {\n name: operation.info.tool || undefined,\n description: operation.info.toolDescription || undefined,\n }\n : undefined,\n requestBody: Object.keys(bodySchema).length\n ? {\n required: required.length ? true : false,\n content: {\n [operation.contentType || 'application/json']: {\n schema: {\n required: required.length ? required : undefined,\n type: 'object',\n properties: bodySchema,\n },\n },\n },\n }\n : undefined,\n responses:\n Object.keys(operation.responses).length === 0\n ? undefined\n : operation.responses,\n };\n if (!operations[path]) {\n operations[path] = {};\n }\n operations[path][method] = operationObject;\n if (this.#onOperation) {\n const paths = this.#onOperation?.(\n operation.sourceFile,\n method,\n path,\n operationObject,\n );\n Object.assign(operations, paths ?? {});\n }\n }\n return operations;\n }\n\n /**\n * Converts Express/Node.js style path parameters (/path/:param) to OpenAPI style (/path/{param})\n */\n #tunePath(path: string): string {\n return path.replace(/:([^/]+)/g, '{$1}');\n }\n}\n\ninterface DateType {\n [$types]: any[];\n kind: string;\n optional: boolean;\n value?: string;\n}\n\nexport function toSchema(data: DateType | string | null | undefined): any {\n if (data === null || data === undefined) {\n return { type: 'any' };\n } else if (typeof data === 'string') {\n const isRef = data.startsWith('#');\n if (isRef) {\n return { $ref: data };\n }\n return { type: data };\n } else if (data.kind === 'literal') {\n return { enum: [data.value], type: data[$types][0] };\n } else if (data.kind === 'record') {\n return {\n type: 'object',\n additionalProperties: toSchema(data[$types][0]),\n };\n } else if (data.kind === 'array') {\n const items = data[$types].map(toSchema);\n return { type: 'array', items: data[$types].length ? items[0] : {} };\n } else if (data.kind === 'union') {\n return { anyOf: data[$types].map(toSchema) };\n } else if (data.kind === 'intersection') {\n return { allOf: data[$types].map(toSchema) };\n } else if ($types in data) {\n return data[$types].map(toSchema)[0] ?? {};\n } else {\n const props: Record<string, unknown> = {};\n const required: string[] = [];\n for (const [key, value] of Object.entries(data)) {\n props[key] = toSchema(value as any);\n if (!(value as any).optional) {\n required.push(key);\n }\n }\n return {\n type: 'object',\n properties: props,\n required,\n additionalProperties: false,\n };\n }\n}\n\nexport function isHttpMethod(name: string): name is Method {\n return ['get', 'post', 'put', 'delete', 'patch'].includes(name);\n}\n"],
|
|
5
|
-
"mappings": "AAUA,SAAS,cAAc;AACvB,SAA4B,eAAe;AAkBpC,MAAM,UAAU;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAQA,MAAM,0BAA0B;AAAA,EAC9B,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AACV;AAoBO,MAAM,MAAM;AAAA,EACjB,WAA2B,CAAC;AAAA,EAC5B;AAAA,EACA,cASK,CAAC;AAAA,EAEN,YAAY,QAAgE;AAC1E,SAAK,WAAW,OAAO;AACvB,SAAK,eAAe,OAAO;AAAA,EAC7B;AAAA,EAEA,QACE,MACA,MACA,QACA,aACA,WACA,WACA,YACA,MACA;AACA,UAAM,kBAAkB,KAAK,yBAAyB,SAAS;AAE/D,SAAK,YAAY,KAAK;AAAA,MACpB;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,yBAAyB,WAA4C;AACnE,UAAM,kBAAmC,CAAC;AAC1C,eAAW,QAAQ,WAAW;AAC5B,YAAM,KAAK,KAAK;AAChB,YAAM,SAAS,KAAK,WAAW,SAAS,KAAK,QAAQ,IAAI,CAAC;AAC1D,UAAI,CAAC,gBAAgB,KAAK,UAAU,GAAG;AACrC,wBAAgB,KAAK,UAAU,IAAI;AAAA,UACjC,aAAa,gBAAgB,KAAK,UAAU;AAAA,UAC5C,SACE,OAAO,UACH;AAAA,YACE,CAAC,EAAE,GACD,OAAO,6BACH,EAAE,QAAQ,EAAE,MAAM,UAAU,QAAQ,SAAS,EAAE,IAC/C,EAAE,OAAO;AAAA,UACjB,IACA;AAAA,UACN,SAAS,KAAK,QAAQ,SAClB,KAAK,QAAQ,OAAsB,CAAC,KAAK,YAAY;AACnD,kBAAM,UACJ,OAAO,YAAY,WAAW,EAAE,CAAC,OAAO,GAAG,CAAC,EAAE,IAAI;AACpD,
|
|
4
|
+
"sourcesContent": ["import type {\n HeadersObject,\n OperationObject,\n ParameterObject,\n PathsObject,\n ResponseObject,\n ResponsesObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\n\nimport { $types } from './deriver.js';\nimport { sortArray, sortObjectKeys } from './utils.js';\nimport { type InjectImport, evalZod } from './zod-jsonschema.js';\n\nexport type OperationInfo = {\n tool?: string;\n toolDescription?: string;\n summary?: string;\n description?: string;\n tags?: string[];\n};\nexport type Method =\n | 'get'\n | 'post'\n | 'put'\n | 'patch'\n | 'delete'\n | 'trace'\n | 'head';\n\nexport const methods = [\n 'get',\n 'post',\n 'put',\n 'patch',\n 'delete',\n 'trace',\n 'head',\n] as const;\nexport type SemanticSource =\n | 'query'\n | 'queries'\n | 'body'\n | 'params'\n | 'headers';\n\nconst semanticSourceToOpenAPI = {\n queries: 'query',\n query: 'query',\n headers: 'header',\n params: 'path',\n} as const;\nexport interface Selector {\n name: string;\n against: string;\n source: SemanticSource;\n}\n\nexport interface ResponseItem {\n statusCode: string;\n response?: DateType;\n contentType: string;\n headers: (string | Record<string, string[]>)[];\n}\n\nexport type OnOperation = (\n sourceFile: string,\n method: Method,\n path: string,\n operation: OperationObject,\n) => PathsObject;\nexport class Paths {\n #imports: InjectImport[] = [];\n #onOperation?: OnOperation;\n #operations: Array<{\n sourceFile: string;\n name: string;\n path: string;\n method: Method;\n selectors: Selector[];\n responses: ResponsesObject;\n contentType?: string;\n info: OperationInfo;\n }> = [];\n\n constructor(config: { imports: InjectImport[]; onOperation?: OnOperation }) {\n this.#imports = config.imports;\n this.#onOperation = config.onOperation;\n }\n\n addPath(\n name: string,\n path: string,\n method: Method,\n contentType: string | undefined,\n selectors: Selector[],\n responses: ResponseItem[],\n sourceFile: string,\n info: OperationInfo,\n ) {\n const responsesObject = this.#responseItemToResponses(responses);\n\n this.#operations.push({\n name,\n path: this.#tunePath(path),\n sourceFile,\n contentType: contentType,\n method,\n selectors,\n responses: responsesObject,\n info,\n });\n return this;\n }\n\n #responseItemToResponses(responses: ResponseItem[]): ResponsesObject {\n const responsesObject: ResponsesObject = {};\n for (const item of responses) {\n const ct = item.contentType;\n const schema = item.response ? toSchema(item.response) : {};\n if (!responsesObject[item.statusCode]) {\n responsesObject[item.statusCode] = {\n description: `Response for ${item.statusCode}`,\n content:\n ct !== 'empty'\n ? {\n [ct]:\n ct === 'application/octet-stream'\n ? { schema: { type: 'string', format: 'binary' } }\n : { schema },\n }\n : undefined,\n headers: item.headers.length\n ? item.headers.reduce<HeadersObject>((acc, current) => {\n const headers =\n typeof current === 'string' ? { [current]: [] } : current;\n const sortedHeaders = Object.entries(sortObjectKeys(headers));\n return sortedHeaders.reduce<HeadersObject>(\n (subAcc, [key, value]) => {\n const header: HeadersObject = {\n [key]: {\n schema: {\n type: 'string',\n enum: value.length ? value : undefined,\n },\n },\n };\n return { ...subAcc, ...header };\n },\n acc,\n );\n }, {})\n : undefined,\n } satisfies ResponseObject;\n } else {\n if (!responsesObject[item.statusCode].content[ct]) {\n responsesObject[item.statusCode].content[ct] = { schema };\n } else {\n const existing = responsesObject[item.statusCode].content[ct]\n .schema as SchemaObject;\n if (existing.oneOf) {\n if (\n !existing.oneOf.find(\n (it) => JSON.stringify(it) === JSON.stringify(schema),\n )\n ) {\n existing.oneOf.push(schema);\n }\n } else if (JSON.stringify(existing) !== JSON.stringify(schema)) {\n responsesObject[item.statusCode].content[ct].schema = {\n oneOf: [existing, schema],\n };\n }\n }\n }\n }\n return responsesObject;\n }\n\n async #selectosToParameters(selectors: Selector[]) {\n const parameters: ParameterObject[] = [];\n const bodySchemaProps: Record<\n string,\n { required: boolean; schema: SchemaObject }\n > = {};\n for (const selector of selectors) {\n const { optional, schema } = await evalZod(\n selector.against,\n this.#imports,\n );\n if (selector.source === 'body') {\n bodySchemaProps[selector.name] = {\n required: !optional,\n schema,\n };\n continue;\n }\n const parameter: ParameterObject = {\n in: semanticSourceToOpenAPI[selector.source],\n name: selector.name,\n required: !optional,\n schema,\n };\n parameters.push(parameter);\n }\n return { parameters, bodySchemaProps };\n }\n\n getTags(): string[] {\n const tags = new Set<string>();\n\n for (const operation of this.#operations) {\n if (operation.info.tags) {\n for (const tag of operation.info.tags) {\n tags.add(tag);\n }\n }\n }\n\n return Array.from(tags);\n }\n\n async getPaths() {\n const operations: PathsObject = {};\n\n for (const operation of this.#operations) {\n const { path, method, selectors } = operation;\n const { parameters, bodySchemaProps } =\n await this.#selectosToParameters(selectors);\n const bodySchema: Record<string, SchemaObject> = {};\n const required: string[] = [];\n const sortedBodySchemaProps = Object.entries(\n sortObjectKeys(bodySchemaProps),\n );\n for (const [key, value] of sortedBodySchemaProps) {\n if (value.required) {\n required.push(key);\n }\n bodySchema[key] = value.schema;\n }\n\n const operationObject: OperationObject = {\n operationId: operation.name,\n parameters,\n tags: operation.info.tags,\n // || undefined would omit the value from final openapi spec\n description: operation.info.description || undefined,\n summary: operation.info.summary || undefined,\n 'x-tool': operation.info.tool\n ? {\n name: operation.info.tool || undefined,\n description: operation.info.toolDescription || undefined,\n }\n : undefined,\n requestBody: Object.keys(bodySchema).length\n ? {\n required: required.length ? true : false,\n content: {\n [operation.contentType || 'application/json']: {\n schema: {\n required: required.length ? sortArray(required) : undefined,\n type: 'object',\n properties: bodySchema,\n },\n },\n },\n }\n : undefined,\n responses:\n Object.keys(operation.responses).length === 0\n ? undefined\n : operation.responses,\n };\n if (!operations[path]) {\n operations[path] = {};\n }\n operations[path][method] = operationObject;\n if (this.#onOperation) {\n const paths = this.#onOperation?.(\n operation.sourceFile,\n method,\n path,\n operationObject,\n );\n Object.assign(operations, paths ?? {});\n }\n }\n return operations;\n }\n\n /**\n * Converts Express/Node.js style path parameters (/path/:param) to OpenAPI style (/path/{param})\n */\n #tunePath(path: string): string {\n return path.replace(/:([^/]+)/g, '{$1}');\n }\n}\n\ninterface DateType {\n [$types]: any[];\n kind: string;\n optional: boolean;\n value?: string;\n}\n\nexport function toSchema(data: DateType | string | null | undefined): any {\n if (data === null || data === undefined) {\n return { type: 'any' };\n } else if (typeof data === 'string') {\n const isRef = data.startsWith('#');\n if (isRef) {\n return { $ref: data };\n }\n return { type: data };\n } else if (data.kind === 'literal') {\n return { enum: [data.value], type: data[$types][0] };\n } else if (data.kind === 'record') {\n return {\n type: 'object',\n additionalProperties: toSchema(data[$types][0]),\n };\n } else if (data.kind === 'array') {\n const items = data[$types].map(toSchema);\n return { type: 'array', items: data[$types].length ? items[0] : {} };\n } else if (data.kind === 'union') {\n return { anyOf: data[$types].map(toSchema) };\n } else if (data.kind === 'intersection') {\n return { allOf: data[$types].map(toSchema) };\n } else if ($types in data) {\n return data[$types].map(toSchema)[0] ?? {};\n } else {\n const props: Record<string, unknown> = {};\n const required: string[] = [];\n const sortedEntries = Object.entries(sortObjectKeys(data));\n for (const [key, value] of sortedEntries) {\n props[key] = toSchema(value as any);\n if (!(value as any).optional) {\n required.push(key);\n }\n }\n return {\n type: 'object',\n properties: props,\n required: sortArray(required),\n additionalProperties: false,\n };\n }\n}\n\nexport function isHttpMethod(name: string): name is Method {\n return ['get', 'post', 'put', 'delete', 'patch'].includes(name);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/lib/utils.d.ts
CHANGED
|
@@ -4,9 +4,9 @@ import type { ResponseItem } from './paths';
|
|
|
4
4
|
export declare function removeDuplicates<T>(data: T[], accessor?: (item: T) => T[keyof T] | T): T[];
|
|
5
5
|
export type InferRecordValue<T> = T extends Record<string, infer U> ? U : any;
|
|
6
6
|
export declare function toLitObject<T extends Record<string, any>>(obj: T, accessor?: (value: InferRecordValue<T>) => string): string;
|
|
7
|
-
export type NaunceResponseAnalyzerFn = (handler: ts.ArrowFunction, deriver: TypeDeriver, node: ts.Node) => ResponseItem[];
|
|
7
|
+
export type NaunceResponseAnalyzerFn = (handler: ts.ArrowFunction | ts.FunctionExpression, deriver: TypeDeriver, node: ts.Node) => ResponseItem[];
|
|
8
8
|
export type NaunceResponseAnalyzer = Record<string, NaunceResponseAnalyzerFn>;
|
|
9
|
-
export type ResponseAnalyzerFn = (handler: ts.ArrowFunction, deriver: TypeDeriver) => ResponseItem[];
|
|
9
|
+
export type ResponseAnalyzerFn = (handler: ts.ArrowFunction | ts.FunctionExpression, deriver: TypeDeriver) => ResponseItem[];
|
|
10
10
|
export declare function isEmpty(value: unknown): value is null | undefined | '';
|
|
11
11
|
export declare function pascalcase(value: string): string;
|
|
12
12
|
export declare function spinalcase(value: string): string;
|
|
@@ -22,4 +22,19 @@ export declare function camelcase(value: string): string;
|
|
|
22
22
|
*/
|
|
23
23
|
export declare function joinSkipDigits(arr: string[], separator: string): string;
|
|
24
24
|
export declare function exclude<T>(list: T[], exclude: T[]): T[];
|
|
25
|
+
/**
|
|
26
|
+
* Sorts an object's keys alphabetically to ensure deterministic output.
|
|
27
|
+
* Creates a new object with keys in alphabetical order.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* sortObjectKeys({ z: 1, a: 2, m: 3 }) // { a: 2, m: 3, z: 1 }
|
|
31
|
+
*/
|
|
32
|
+
export declare function sortObjectKeys<T extends Record<string, unknown>>(obj: T): T;
|
|
33
|
+
/**
|
|
34
|
+
* Sorts a string array alphabetically to ensure deterministic output.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* sortArray(['z', 'a', 'm']) // ['a', 'm', 'z']
|
|
38
|
+
*/
|
|
39
|
+
export declare function sortArray(arr: string[]): string[];
|
|
25
40
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/lib/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,IAAI,EAAE,CAAC,EAAE,EACT,QAAQ,GAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAkB,GACrD,CAAC,EAAE,CAEL;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAE9E,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACvD,GAAG,EAAE,CAAC,EACN,QAAQ,GAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAAK,MAAyB,UAKpE;AAED,MAAM,MAAM,wBAAwB,GAAG,CACrC,OAAO,EAAE,EAAE,CAAC,aAAa,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,IAAI,EAAE,CAAC,EAAE,EACT,QAAQ,GAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAkB,GACrD,CAAC,EAAE,CAEL;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAE9E,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACvD,GAAG,EAAE,CAAC,EACN,QAAQ,GAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAAK,MAAyB,UAKpE;AAED,MAAM,MAAM,wBAAwB,GAAG,CACrC,OAAO,EAAE,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,kBAAkB,EACjD,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,EAAE,CAAC,IAAI,KACV,YAAY,EAAE,CAAC;AACpB,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;AAE9E,MAAM,MAAM,kBAAkB,GAAG,CAC/B,OAAO,EAAE,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,kBAAkB,EACjD,OAAO,EAAE,WAAW,KACjB,YAAY,EAAE,CAAC;AAEpB,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,SAAS,GAAG,EAAE,CAWtE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,UAIvC;AACD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,UAEvC;AACD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,UAEtC;AACD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAKD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAgBvE;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAEvD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAO3E;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAEjD"}
|
package/dist/lib/utils.js
CHANGED
|
@@ -55,6 +55,17 @@ function joinSkipDigits(arr, separator) {
|
|
|
55
55
|
function exclude(list, exclude2) {
|
|
56
56
|
return list.filter((it) => !exclude2.includes(it));
|
|
57
57
|
}
|
|
58
|
+
function sortObjectKeys(obj) {
|
|
59
|
+
const sorted = {};
|
|
60
|
+
const keys = Object.keys(obj).sort((a, b) => a.localeCompare(b));
|
|
61
|
+
for (const key of keys) {
|
|
62
|
+
sorted[key] = obj[key];
|
|
63
|
+
}
|
|
64
|
+
return sorted;
|
|
65
|
+
}
|
|
66
|
+
function sortArray(arr) {
|
|
67
|
+
return [...arr].sort((a, b) => a.localeCompare(b));
|
|
68
|
+
}
|
|
58
69
|
export {
|
|
59
70
|
camelcase,
|
|
60
71
|
exclude,
|
|
@@ -63,6 +74,8 @@ export {
|
|
|
63
74
|
pascalcase,
|
|
64
75
|
removeDuplicates,
|
|
65
76
|
snakecase,
|
|
77
|
+
sortArray,
|
|
78
|
+
sortObjectKeys,
|
|
66
79
|
spinalcase,
|
|
67
80
|
toLitObject
|
|
68
81
|
};
|
package/dist/lib/utils.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/lib/utils.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n camelcase as _camelcase,\n pascalcase as _pascalcase,\n snakecase as _snakecase,\n spinalcase as _spinalcase,\n} from 'stringcase';\nimport type ts from 'typescript';\n\nimport type { TypeDeriver } from './deriver';\nimport type { ResponseItem } from './paths';\n\nexport function removeDuplicates<T>(\n data: T[],\n accessor: (item: T) => T[keyof T] | T = (item) => item,\n): T[] {\n return [...new Map(data.map((x) => [accessor(x), x])).values()];\n}\n\nexport type InferRecordValue<T> = T extends Record<string, infer U> ? U : any;\n\nexport function toLitObject<T extends Record<string, any>>(\n obj: T,\n accessor: (value: InferRecordValue<T>) => string = (value) => value,\n) {\n return `{${Object.keys(obj)\n .map((key) => `${key}: ${accessor(obj[key])}`)\n .join(', ')}}`;\n}\n\nexport type NaunceResponseAnalyzerFn = (\n handler: ts.ArrowFunction,\n deriver: TypeDeriver,\n node: ts.Node,\n) => ResponseItem[];\nexport type NaunceResponseAnalyzer = Record<string, NaunceResponseAnalyzerFn>;\n\nexport type ResponseAnalyzerFn = (\n handler: ts.ArrowFunction,\n deriver: TypeDeriver,\n) => ResponseItem[];\n\nexport function isEmpty(value: unknown): value is null | undefined | '' {\n if (value === null || value === undefined || value === '') {\n return true;\n }\n if (Array.isArray(value) && value.length === 0) {\n return true;\n }\n if (typeof value === 'object' && Object.keys(value).length === 0) {\n return true;\n }\n return false;\n}\n\nexport function pascalcase(value: string) {\n return _pascalcase(\n removeSpecialCharsBeforeDigits(value).split('/').join(' '),\n );\n}\nexport function spinalcase(value: string) {\n return _spinalcase(value.split('/').join(' '));\n}\nexport function snakecase(value: string) {\n return _snakecase(value.split('/').join(' '));\n}\nexport function camelcase(value: string): string {\n return _camelcase(removeSpecialCharsBeforeDigits(value));\n}\nfunction removeSpecialCharsBeforeDigits(value: string): string {\n return value.replace(/[^A-Za-z0-9]+(?=\\d)/g, '');\n}\n\n/**\n * Joins an array of strings so that elements containing only digits\n * are concatenated without a separator, while all other elements\n * are prefixed by the separator (unless they're the very first element).\n *\n * @example\n * joinSkipDigits(['foo', '123', 'bar'], '-') // 'foo-123bar'\n */\nexport function joinSkipDigits(arr: string[], separator: string): string {\n if (arr.length === 0) return '';\n\n let result = arr[0];\n for (let i = 1; i < arr.length; i++) {\n const el = arr[i];\n // If this element is digits-only, append it directly\n if (/^\\d+$/.test(el)) {\n result += el;\n } else {\n // Otherwise, prepend the separator and append the element\n result += separator + el;\n }\n }\n\n return result;\n}\n\nexport function exclude<T>(list: T[], exclude: T[]): T[] {\n return list.filter((it) => !exclude.includes(it));\n}\n"],
|
|
5
|
-
"mappings": "AAAA;AAAA,EACE,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,cAAc;AAAA,OACT;AAMA,SAAS,iBACd,MACA,WAAwC,CAAC,SAAS,MAC7C;AACL,SAAO,CAAC,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;AAChE;AAIO,SAAS,YACd,KACA,WAAmD,CAAC,UAAU,OAC9D;AACA,SAAO,IAAI,OAAO,KAAK,GAAG,EACvB,IAAI,CAAC,QAAQ,GAAG,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,CAAC,EAAE,EAC5C,KAAK,IAAI,CAAC;AACf;AAcO,SAAS,QAAQ,OAAgD;AACtE,MAAI,UAAU,QAAQ,UAAU,UAAa,UAAU,IAAI;AACzD,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG;AAC9C,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,YAAY,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;AAChE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,WAAW,OAAe;AACxC,SAAO;AAAA,IACL,+BAA+B,KAAK,EAAE,MAAM,GAAG,EAAE,KAAK,GAAG;AAAA,EAC3D;AACF;AACO,SAAS,WAAW,OAAe;AACxC,SAAO,YAAY,MAAM,MAAM,GAAG,EAAE,KAAK,GAAG,CAAC;AAC/C;AACO,SAAS,UAAU,OAAe;AACvC,SAAO,WAAW,MAAM,MAAM,GAAG,EAAE,KAAK,GAAG,CAAC;AAC9C;AACO,SAAS,UAAU,OAAuB;AAC/C,SAAO,WAAW,+BAA+B,KAAK,CAAC;AACzD;AACA,SAAS,+BAA+B,OAAuB;AAC7D,SAAO,MAAM,QAAQ,wBAAwB,EAAE;AACjD;AAUO,SAAS,eAAe,KAAe,WAA2B;AACvE,MAAI,IAAI,WAAW,EAAG,QAAO;AAE7B,MAAI,SAAS,IAAI,CAAC;AAClB,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,UAAM,KAAK,IAAI,CAAC;AAEhB,QAAI,QAAQ,KAAK,EAAE,GAAG;AACpB,gBAAU;AAAA,IACZ,OAAO;AAEL,gBAAU,YAAY;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,QAAW,MAAWA,UAAmB;AACvD,SAAO,KAAK,OAAO,CAAC,OAAO,CAACA,SAAQ,SAAS,EAAE,CAAC;AAClD;",
|
|
4
|
+
"sourcesContent": ["import {\n camelcase as _camelcase,\n pascalcase as _pascalcase,\n snakecase as _snakecase,\n spinalcase as _spinalcase,\n} from 'stringcase';\nimport type ts from 'typescript';\n\nimport type { TypeDeriver } from './deriver';\nimport type { ResponseItem } from './paths';\n\nexport function removeDuplicates<T>(\n data: T[],\n accessor: (item: T) => T[keyof T] | T = (item) => item,\n): T[] {\n return [...new Map(data.map((x) => [accessor(x), x])).values()];\n}\n\nexport type InferRecordValue<T> = T extends Record<string, infer U> ? U : any;\n\nexport function toLitObject<T extends Record<string, any>>(\n obj: T,\n accessor: (value: InferRecordValue<T>) => string = (value) => value,\n) {\n return `{${Object.keys(obj)\n .map((key) => `${key}: ${accessor(obj[key])}`)\n .join(', ')}}`;\n}\n\nexport type NaunceResponseAnalyzerFn = (\n handler: ts.ArrowFunction | ts.FunctionExpression,\n deriver: TypeDeriver,\n node: ts.Node,\n) => ResponseItem[];\nexport type NaunceResponseAnalyzer = Record<string, NaunceResponseAnalyzerFn>;\n\nexport type ResponseAnalyzerFn = (\n handler: ts.ArrowFunction | ts.FunctionExpression,\n deriver: TypeDeriver,\n) => ResponseItem[];\n\nexport function isEmpty(value: unknown): value is null | undefined | '' {\n if (value === null || value === undefined || value === '') {\n return true;\n }\n if (Array.isArray(value) && value.length === 0) {\n return true;\n }\n if (typeof value === 'object' && Object.keys(value).length === 0) {\n return true;\n }\n return false;\n}\n\nexport function pascalcase(value: string) {\n return _pascalcase(\n removeSpecialCharsBeforeDigits(value).split('/').join(' '),\n );\n}\nexport function spinalcase(value: string) {\n return _spinalcase(value.split('/').join(' '));\n}\nexport function snakecase(value: string) {\n return _snakecase(value.split('/').join(' '));\n}\nexport function camelcase(value: string): string {\n return _camelcase(removeSpecialCharsBeforeDigits(value));\n}\nfunction removeSpecialCharsBeforeDigits(value: string): string {\n return value.replace(/[^A-Za-z0-9]+(?=\\d)/g, '');\n}\n\n/**\n * Joins an array of strings so that elements containing only digits\n * are concatenated without a separator, while all other elements\n * are prefixed by the separator (unless they're the very first element).\n *\n * @example\n * joinSkipDigits(['foo', '123', 'bar'], '-') // 'foo-123bar'\n */\nexport function joinSkipDigits(arr: string[], separator: string): string {\n if (arr.length === 0) return '';\n\n let result = arr[0];\n for (let i = 1; i < arr.length; i++) {\n const el = arr[i];\n // If this element is digits-only, append it directly\n if (/^\\d+$/.test(el)) {\n result += el;\n } else {\n // Otherwise, prepend the separator and append the element\n result += separator + el;\n }\n }\n\n return result;\n}\n\nexport function exclude<T>(list: T[], exclude: T[]): T[] {\n return list.filter((it) => !exclude.includes(it));\n}\n\n/**\n * Sorts an object's keys alphabetically to ensure deterministic output.\n * Creates a new object with keys in alphabetical order.\n *\n * @example\n * sortObjectKeys({ z: 1, a: 2, m: 3 }) // { a: 2, m: 3, z: 1 }\n */\nexport function sortObjectKeys<T extends Record<string, unknown>>(obj: T): T {\n const sorted: Record<string, unknown> = {};\n const keys = Object.keys(obj).sort((a, b) => a.localeCompare(b));\n for (const key of keys) {\n sorted[key] = obj[key];\n }\n return sorted as T;\n}\n\n/**\n * Sorts a string array alphabetically to ensure deterministic output.\n *\n * @example\n * sortArray(['z', 'a', 'm']) // ['a', 'm', 'z']\n */\nexport function sortArray(arr: string[]): string[] {\n return [...arr].sort((a, b) => a.localeCompare(b));\n}\n"],
|
|
5
|
+
"mappings": "AAAA;AAAA,EACE,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,cAAc;AAAA,OACT;AAMA,SAAS,iBACd,MACA,WAAwC,CAAC,SAAS,MAC7C;AACL,SAAO,CAAC,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;AAChE;AAIO,SAAS,YACd,KACA,WAAmD,CAAC,UAAU,OAC9D;AACA,SAAO,IAAI,OAAO,KAAK,GAAG,EACvB,IAAI,CAAC,QAAQ,GAAG,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,CAAC,EAAE,EAC5C,KAAK,IAAI,CAAC;AACf;AAcO,SAAS,QAAQ,OAAgD;AACtE,MAAI,UAAU,QAAQ,UAAU,UAAa,UAAU,IAAI;AACzD,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG;AAC9C,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,YAAY,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;AAChE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,WAAW,OAAe;AACxC,SAAO;AAAA,IACL,+BAA+B,KAAK,EAAE,MAAM,GAAG,EAAE,KAAK,GAAG;AAAA,EAC3D;AACF;AACO,SAAS,WAAW,OAAe;AACxC,SAAO,YAAY,MAAM,MAAM,GAAG,EAAE,KAAK,GAAG,CAAC;AAC/C;AACO,SAAS,UAAU,OAAe;AACvC,SAAO,WAAW,MAAM,MAAM,GAAG,EAAE,KAAK,GAAG,CAAC;AAC9C;AACO,SAAS,UAAU,OAAuB;AAC/C,SAAO,WAAW,+BAA+B,KAAK,CAAC;AACzD;AACA,SAAS,+BAA+B,OAAuB;AAC7D,SAAO,MAAM,QAAQ,wBAAwB,EAAE;AACjD;AAUO,SAAS,eAAe,KAAe,WAA2B;AACvE,MAAI,IAAI,WAAW,EAAG,QAAO;AAE7B,MAAI,SAAS,IAAI,CAAC;AAClB,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,UAAM,KAAK,IAAI,CAAC;AAEhB,QAAI,QAAQ,KAAK,EAAE,GAAG;AACpB,gBAAU;AAAA,IACZ,OAAO;AAEL,gBAAU,YAAY;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,QAAW,MAAWA,UAAmB;AACvD,SAAO,KAAK,OAAO,CAAC,OAAO,CAACA,SAAQ,SAAS,EAAE,CAAC;AAClD;AASO,SAAS,eAAkD,KAAW;AAC3E,QAAM,SAAkC,CAAC;AACzC,QAAM,OAAO,OAAO,KAAK,GAAG,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAC/D,aAAW,OAAO,MAAM;AACtB,WAAO,GAAG,IAAI,IAAI,GAAG;AAAA,EACvB;AACA,SAAO;AACT;AAQO,SAAS,UAAU,KAAyB;AACjD,SAAO,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AACnD;",
|
|
6
6
|
"names": ["exclude"]
|
|
7
7
|
}
|