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.
Files changed (93) hide show
  1. package/README.md +1 -0
  2. package/dist/factory/parser.d.ts +5 -4
  3. package/dist/factory/parser.js +2 -0
  4. package/dist/factory/parser.js.map +1 -1
  5. package/dist/factory/program.d.ts +1 -0
  6. package/dist/factory/program.js +3 -1
  7. package/dist/factory/program.js.map +1 -1
  8. package/dist/index.d.ts +1 -0
  9. package/dist/package.json +3 -3
  10. package/dist/src/AnnotationsReader/BasicAnnotationsReader.d.ts +1 -0
  11. package/dist/src/AnnotationsReader/ExtendedAnnotationsReader.d.ts +1 -0
  12. package/dist/src/AnnotationsReader.d.ts +1 -0
  13. package/dist/src/ChainNodeParser.d.ts +1 -0
  14. package/dist/src/CircularReferenceNodeParser.d.ts +1 -0
  15. package/dist/src/Error/DiagnosticError.d.ts +1 -0
  16. package/dist/src/Error/UnknownNodeError.d.ts +1 -0
  17. package/dist/src/ExposeNodeParser.d.ts +1 -0
  18. package/dist/src/Interfaces/AnnotationsReader.d.ts +1 -0
  19. package/dist/src/Interfaces/SubNodeParser.d.ts +1 -0
  20. package/dist/src/NodeParser/AnnotatedNodeParser.d.ts +1 -0
  21. package/dist/src/NodeParser/AnyTypeNodeParser.d.ts +1 -0
  22. package/dist/src/NodeParser/ArrayLiteralExpressionNodeParser.d.ts +1 -0
  23. package/dist/src/NodeParser/ArrayNodeParser.d.ts +1 -0
  24. package/dist/src/NodeParser/AsExpressionNodeParser.d.ts +1 -0
  25. package/dist/src/NodeParser/BooleanLiteralNodeParser.d.ts +1 -0
  26. package/dist/src/NodeParser/BooleanTypeNodeParser.d.ts +1 -0
  27. package/dist/src/NodeParser/CallExpressionParser.d.ts +1 -0
  28. package/dist/src/NodeParser/ConditionalTypeNodeParser.d.ts +1 -0
  29. package/dist/src/NodeParser/ConstructorNodeParser.d.ts +1 -0
  30. package/dist/src/NodeParser/EnumNodeParser.d.ts +1 -0
  31. package/dist/src/NodeParser/ExpressionWithTypeArgumentsNodeParser.d.ts +1 -0
  32. package/dist/src/NodeParser/FunctionNodeParser.d.ts +1 -0
  33. package/dist/src/NodeParser/FunctionNodeParser.js.map +1 -1
  34. package/dist/src/NodeParser/HiddenTypeNodeParser.d.ts +1 -0
  35. package/dist/src/NodeParser/IndexedAccessTypeNodeParser.d.ts +1 -0
  36. package/dist/src/NodeParser/InferTypeNodeParser.d.ts +1 -0
  37. package/dist/src/NodeParser/InterfaceAndClassNodeParser.d.ts +1 -0
  38. package/dist/src/NodeParser/IntersectionNodeParser.d.ts +1 -0
  39. package/dist/src/NodeParser/IntrinsicNodeParser.d.ts +1 -0
  40. package/dist/src/NodeParser/LiteralNodeParser.d.ts +1 -0
  41. package/dist/src/NodeParser/MappedTypeNodeParser.d.ts +1 -0
  42. package/dist/src/NodeParser/NamedTupleMemberNodeParser.d.ts +1 -0
  43. package/dist/src/NodeParser/NeverTypeNodeParser.d.ts +1 -0
  44. package/dist/src/NodeParser/NullLiteralNodeParser.d.ts +1 -0
  45. package/dist/src/NodeParser/NumberLiteralNodeParser.d.ts +1 -0
  46. package/dist/src/NodeParser/NumberTypeNodeParser.d.ts +1 -0
  47. package/dist/src/NodeParser/ObjectLiteralExpressionNodeParser.d.ts +1 -0
  48. package/dist/src/NodeParser/ObjectTypeNodeParser.d.ts +1 -0
  49. package/dist/src/NodeParser/OptionalTypeNodeParser.d.ts +1 -0
  50. package/dist/src/NodeParser/ParameterParser.d.ts +1 -0
  51. package/dist/src/NodeParser/ParenthesizedNodeParser.d.ts +1 -0
  52. package/dist/src/NodeParser/PrefixUnaryExpressionNodeParser.d.ts +1 -0
  53. package/dist/src/NodeParser/PromiseNodeParser.d.ts +13 -0
  54. package/dist/src/NodeParser/PromiseNodeParser.js +55 -0
  55. package/dist/src/NodeParser/PromiseNodeParser.js.map +1 -0
  56. package/dist/src/NodeParser/PropertyAccessExpressionParser.d.ts +1 -0
  57. package/dist/src/NodeParser/RestTypeNodeParser.d.ts +1 -0
  58. package/dist/src/NodeParser/SatisfiesNodeParser.d.ts +1 -0
  59. package/dist/src/NodeParser/StringLiteralNodeParser.d.ts +1 -0
  60. package/dist/src/NodeParser/StringTemplateLiteralNodeParser.d.ts +1 -0
  61. package/dist/src/NodeParser/StringTypeNodeParser.d.ts +1 -0
  62. package/dist/src/NodeParser/SymbolTypeNodeParser.d.ts +1 -0
  63. package/dist/src/NodeParser/TupleNodeParser.d.ts +1 -0
  64. package/dist/src/NodeParser/TypeAliasNodeParser.d.ts +1 -0
  65. package/dist/src/NodeParser/TypeLiteralNodeParser.d.ts +1 -0
  66. package/dist/src/NodeParser/TypeOperatorNodeParser.d.ts +1 -0
  67. package/dist/src/NodeParser/TypeReferenceNodeParser.d.ts +2 -1
  68. package/dist/src/NodeParser/TypeReferenceNodeParser.js +6 -3
  69. package/dist/src/NodeParser/TypeReferenceNodeParser.js.map +1 -1
  70. package/dist/src/NodeParser/TypeofNodeParser.d.ts +1 -0
  71. package/dist/src/NodeParser/UndefinedLiteralNodeParser.d.ts +1 -0
  72. package/dist/src/NodeParser/UndefinedTypeNodeParser.d.ts +1 -0
  73. package/dist/src/NodeParser/UnionNodeParser.d.ts +1 -0
  74. package/dist/src/NodeParser/UnknownTypeNodeParser.d.ts +1 -0
  75. package/dist/src/NodeParser/VoidTypeNodeParser.d.ts +1 -0
  76. package/dist/src/NodeParser.d.ts +1 -0
  77. package/dist/src/SchemaGenerator.d.ts +1 -0
  78. package/dist/src/SubNodeParser.d.ts +1 -0
  79. package/dist/src/TopRefNodeParser.d.ts +1 -0
  80. package/dist/src/Type/ConstructorType.d.ts +1 -0
  81. package/dist/src/Type/FunctionType.d.ts +1 -0
  82. package/dist/src/Utils/hasJsDocTag.d.ts +1 -0
  83. package/dist/src/Utils/isHidden.d.ts +1 -0
  84. package/dist/src/Utils/modifiers.d.ts +1 -0
  85. package/dist/src/Utils/nodeKey.d.ts +1 -0
  86. package/dist/src/Utils/symbolAtNode.d.ts +1 -0
  87. package/dist/tsconfig.tsbuildinfo +1 -1
  88. package/factory/parser.ts +7 -5
  89. package/factory/program.ts +3 -1
  90. package/package.json +3 -3
  91. package/src/NodeParser/FunctionNodeParser.ts +3 -0
  92. package/src/NodeParser/PromiseNodeParser.ts +98 -0
  93. 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.1.2-next.1",
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