ts-json-schema-generator 2.1.2-next.1 → 2.2.0-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/factory/parser.d.ts +5 -4
- package/dist/factory/parser.js +2 -0
- package/dist/factory/parser.js.map +1 -1
- package/dist/factory/program.d.ts +1 -0
- package/dist/factory/program.js +3 -1
- package/dist/factory/program.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/package.json +3 -3
- package/dist/src/AnnotationsReader/BasicAnnotationsReader.d.ts +1 -0
- package/dist/src/AnnotationsReader/ExtendedAnnotationsReader.d.ts +1 -0
- package/dist/src/AnnotationsReader.d.ts +1 -0
- package/dist/src/ChainNodeParser.d.ts +1 -0
- package/dist/src/CircularReferenceNodeParser.d.ts +1 -0
- package/dist/src/Error/DiagnosticError.d.ts +1 -0
- package/dist/src/Error/UnknownNodeError.d.ts +1 -0
- package/dist/src/ExposeNodeParser.d.ts +1 -0
- package/dist/src/Interfaces/AnnotationsReader.d.ts +1 -0
- package/dist/src/Interfaces/SubNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/AnnotatedNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/AnyTypeNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/ArrayLiteralExpressionNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/ArrayNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/AsExpressionNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/BooleanLiteralNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/BooleanTypeNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/CallExpressionParser.d.ts +1 -0
- package/dist/src/NodeParser/ConditionalTypeNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/ConstructorNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/EnumNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/ExpressionWithTypeArgumentsNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/FunctionNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/FunctionNodeParser.js.map +1 -1
- package/dist/src/NodeParser/HiddenTypeNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/IndexedAccessTypeNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/InferTypeNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/InterfaceAndClassNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/IntersectionNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/IntrinsicNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/LiteralNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/MappedTypeNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/NamedTupleMemberNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/NeverTypeNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/NullLiteralNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/NumberLiteralNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/NumberTypeNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/ObjectLiteralExpressionNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/ObjectTypeNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/OptionalTypeNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/ParameterParser.d.ts +1 -0
- package/dist/src/NodeParser/ParenthesizedNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/PrefixUnaryExpressionNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/PromiseNodeParser.d.ts +13 -0
- package/dist/src/NodeParser/PromiseNodeParser.js +55 -0
- package/dist/src/NodeParser/PromiseNodeParser.js.map +1 -0
- package/dist/src/NodeParser/PropertyAccessExpressionParser.d.ts +1 -0
- package/dist/src/NodeParser/RestTypeNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/SatisfiesNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/StringLiteralNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/StringTemplateLiteralNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/StringTypeNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/SymbolTypeNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/TupleNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/TypeAliasNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/TypeLiteralNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/TypeOperatorNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/TypeReferenceNodeParser.d.ts +2 -1
- package/dist/src/NodeParser/TypeReferenceNodeParser.js +6 -3
- package/dist/src/NodeParser/TypeReferenceNodeParser.js.map +1 -1
- package/dist/src/NodeParser/TypeofNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/UndefinedLiteralNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/UndefinedTypeNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/UnionNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/UnknownTypeNodeParser.d.ts +1 -0
- package/dist/src/NodeParser/VoidTypeNodeParser.d.ts +1 -0
- package/dist/src/NodeParser.d.ts +1 -0
- package/dist/src/SchemaGenerator.d.ts +1 -0
- package/dist/src/SubNodeParser.d.ts +1 -0
- package/dist/src/TopRefNodeParser.d.ts +1 -0
- package/dist/src/Type/ConstructorType.d.ts +1 -0
- package/dist/src/Type/FunctionType.d.ts +1 -0
- package/dist/src/Utils/hasJsDocTag.d.ts +1 -0
- package/dist/src/Utils/isHidden.d.ts +1 -0
- package/dist/src/Utils/modifiers.d.ts +1 -0
- package/dist/src/Utils/nodeKey.d.ts +1 -0
- package/dist/src/Utils/symbolAtNode.d.ts +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/factory/parser.ts +7 -5
- package/factory/program.ts +3 -1
- package/package.json +3 -3
- package/src/NodeParser/FunctionNodeParser.ts +3 -0
- package/src/NodeParser/PromiseNodeParser.ts +98 -0
- package/src/NodeParser/TypeReferenceNodeParser.ts +11 -7
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-json-schema-generator",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0-next.0",
|
|
4
4
|
"description": "Generate JSON schema from your Typescript sources",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -65,6 +65,7 @@
|
|
|
65
65
|
"@types/jest": "^29.5.12",
|
|
66
66
|
"@types/node": "^20.12.7",
|
|
67
67
|
"@types/normalize-path": "^3.0.2",
|
|
68
|
+
"@types/ts-expose-internals": "npm:ts-expose-internals@^5.4.5",
|
|
68
69
|
"ajv": "^8.12.0",
|
|
69
70
|
"ajv-formats": "^3.0.1",
|
|
70
71
|
"auto": "^11.1.6",
|
|
@@ -94,6 +95,5 @@
|
|
|
94
95
|
"debug": "tsx --inspect-brk ts-json-schema-generator.ts",
|
|
95
96
|
"run": "tsx ts-json-schema-generator.ts",
|
|
96
97
|
"release": "yarn build && auto shipit"
|
|
97
|
-
}
|
|
98
|
-
"packageManager": "yarn@1.22.19"
|
|
98
|
+
}
|
|
99
99
|
}
|
|
@@ -18,8 +18,11 @@ export class FunctionNodeParser implements SubNodeParser {
|
|
|
18
18
|
public supportsNode(node: ts.TypeNode): boolean {
|
|
19
19
|
return (
|
|
20
20
|
node.kind === ts.SyntaxKind.FunctionType ||
|
|
21
|
+
// @ts-expect-error internals type bug
|
|
21
22
|
node.kind === ts.SyntaxKind.FunctionExpression ||
|
|
23
|
+
// @ts-expect-error internals type bug
|
|
22
24
|
node.kind === ts.SyntaxKind.ArrowFunction ||
|
|
25
|
+
// @ts-expect-error internals type bug
|
|
23
26
|
node.kind === ts.SyntaxKind.FunctionDeclaration
|
|
24
27
|
);
|
|
25
28
|
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { Context, type NodeParser } from "../NodeParser.js";
|
|
3
|
+
import type { SubNodeParser } from "../SubNodeParser.js";
|
|
4
|
+
import { AliasType } from "../Type/AliasType.js";
|
|
5
|
+
import type { BaseType } from "../Type/BaseType.js";
|
|
6
|
+
import { DefinitionType } from "../Type/DefinitionType.js";
|
|
7
|
+
import { getKey } from "../Utils/nodeKey.js";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Needs to be registered before 261, 260, 230, 262 node kinds
|
|
11
|
+
*/
|
|
12
|
+
export class PromiseNodeParser implements SubNodeParser {
|
|
13
|
+
public constructor(
|
|
14
|
+
protected typeChecker: ts.TypeChecker,
|
|
15
|
+
protected childNodeParser: NodeParser,
|
|
16
|
+
) {}
|
|
17
|
+
|
|
18
|
+
public supportsNode(node: ts.Node): boolean {
|
|
19
|
+
if (
|
|
20
|
+
// 261 interface PromiseInterface extends Promise<T>
|
|
21
|
+
!ts.isInterfaceDeclaration(node) &&
|
|
22
|
+
// 260 class PromiseClass implements Promise<T>
|
|
23
|
+
!ts.isClassDeclaration(node) &&
|
|
24
|
+
// 230 Promise<T>
|
|
25
|
+
!ts.isExpressionWithTypeArguments(node) &&
|
|
26
|
+
// 262 type PromiseAlias = Promise<T>;
|
|
27
|
+
!ts.isTypeAliasDeclaration(node)
|
|
28
|
+
) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const type = this.typeChecker.getTypeAtLocation(node);
|
|
33
|
+
|
|
34
|
+
const awaitedType = this.typeChecker.getAwaitedType(type);
|
|
35
|
+
|
|
36
|
+
// ignores non awaitable types
|
|
37
|
+
if (!awaitedType) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// If the awaited type differs from the original type, the type extends promise
|
|
42
|
+
// Awaited<Promise<T>> -> T (Promise<T> !== T)
|
|
43
|
+
// Awaited<Y> -> Y (Y === Y)
|
|
44
|
+
if (awaitedType === type) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// In types like: A<T> = T, type C = A<1>, C has the same type as A<1> and 1,
|
|
49
|
+
// the awaitedType is NOT the same reference as the type, so a assignability
|
|
50
|
+
// check is needed
|
|
51
|
+
return (
|
|
52
|
+
!this.typeChecker.isTypeAssignableTo(type, awaitedType) &&
|
|
53
|
+
!this.typeChecker.isTypeAssignableTo(awaitedType, type)
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public createType(
|
|
58
|
+
node: ts.InterfaceDeclaration | ts.ClassDeclaration | ts.ExpressionWithTypeArguments | ts.TypeAliasDeclaration,
|
|
59
|
+
context: Context,
|
|
60
|
+
): BaseType {
|
|
61
|
+
const type = this.typeChecker.getTypeAtLocation(node);
|
|
62
|
+
const awaitedType = this.typeChecker.getAwaitedType(type)!; // supportsNode ensures this
|
|
63
|
+
const awaitedNode = this.typeChecker.typeToTypeNode(awaitedType, undefined, ts.NodeBuilderFlags.IgnoreErrors);
|
|
64
|
+
|
|
65
|
+
if (!awaitedNode) {
|
|
66
|
+
throw new Error(
|
|
67
|
+
`Could not find awaited node for type ${node.pos === -1 ? "<unresolved>" : node.getText()}`,
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const baseNode = this.childNodeParser.createType(awaitedNode, new Context(node));
|
|
72
|
+
|
|
73
|
+
const name = this.getNodeName(node);
|
|
74
|
+
|
|
75
|
+
// Nodes without name should just be their awaited type
|
|
76
|
+
// export class extends Promise<T> {} -> T
|
|
77
|
+
// export class A extends Promise<T> {} -> A (ref to T)
|
|
78
|
+
if (!name) {
|
|
79
|
+
return baseNode;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return new DefinitionType(name, new AliasType(`promise-${getKey(node, context)}`, baseNode));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
private getNodeName(
|
|
86
|
+
node: ts.InterfaceDeclaration | ts.ClassDeclaration | ts.ExpressionWithTypeArguments | ts.TypeAliasDeclaration,
|
|
87
|
+
) {
|
|
88
|
+
if (ts.isExpressionWithTypeArguments(node)) {
|
|
89
|
+
if (!ts.isHeritageClause(node.parent)) {
|
|
90
|
+
throw new Error("Expected ExpressionWithTypeArguments to have a HeritageClause parent");
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return node.parent.parent.name?.getText();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return node.name?.getText();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import ts from "typescript";
|
|
2
|
-
|
|
3
|
-
import { Context, NodeParser } from "../NodeParser.js";
|
|
2
|
+
import { Context, type NodeParser } from "../NodeParser.js";
|
|
4
3
|
import type { SubNodeParser } from "../SubNodeParser.js";
|
|
5
4
|
import { AnnotatedType } from "../Type/AnnotatedType.js";
|
|
6
5
|
import { AnyType } from "../Type/AnyType.js";
|
|
@@ -31,11 +30,6 @@ export class TypeReferenceNodeParser implements SubNodeParser {
|
|
|
31
30
|
// property on the node itself.
|
|
32
31
|
(node.typeName as unknown as ts.Type).symbol;
|
|
33
32
|
|
|
34
|
-
// Wraps promise type to avoid resolving to a empty Object type.
|
|
35
|
-
if (typeSymbol.name === "Promise") {
|
|
36
|
-
return this.childNodeParser.createType(node.typeArguments![0], this.createSubContext(node, context));
|
|
37
|
-
}
|
|
38
|
-
|
|
39
33
|
if (typeSymbol.flags & ts.SymbolFlags.Alias) {
|
|
40
34
|
const aliasedSymbol = this.typeChecker.getAliasedSymbol(typeSymbol);
|
|
41
35
|
|
|
@@ -53,6 +47,16 @@ export class TypeReferenceNodeParser implements SubNodeParser {
|
|
|
53
47
|
return context.getArgument(typeSymbol.name);
|
|
54
48
|
}
|
|
55
49
|
|
|
50
|
+
// Wraps promise type to avoid resolving to a empty Object type.
|
|
51
|
+
if (typeSymbol.name === "Promise" || typeSymbol.name === "PromiseLike") {
|
|
52
|
+
// Promise without type resolves to Promise<any>
|
|
53
|
+
if (!node.typeArguments || node.typeArguments.length === 0) {
|
|
54
|
+
return new AnyType();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return this.childNodeParser.createType(node.typeArguments[0], this.createSubContext(node, context));
|
|
58
|
+
}
|
|
59
|
+
|
|
56
60
|
if (typeSymbol.name === "Array" || typeSymbol.name === "ReadonlyArray") {
|
|
57
61
|
const type = this.createSubContext(node, context).getArguments()[0];
|
|
58
62
|
|