@goast/typescript 0.0.5 → 0.2.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 (217) hide show
  1. package/assets/{service → client}/angular/request-builder.ts +6 -2
  2. package/assets/client/fetch/{url-builder.ts → fetch-client.utils.ts} +15 -0
  3. package/assets/stubs/easy-network-stub/easy-network-stub.utils.ts +235 -0
  4. package/cjs/lib/ast/_index.js +108 -0
  5. package/cjs/lib/ast/common.js +2 -0
  6. package/cjs/lib/ast/index.js +5 -0
  7. package/cjs/lib/ast/node.js +10 -0
  8. package/cjs/lib/ast/nodes/argument.js +20 -0
  9. package/cjs/lib/ast/nodes/array-type.js +27 -0
  10. package/cjs/lib/ast/nodes/arrow-function.js +51 -0
  11. package/cjs/lib/ast/nodes/call.js +26 -0
  12. package/cjs/lib/ast/nodes/class.js +70 -0
  13. package/cjs/lib/ast/nodes/constructor-parameter.js +46 -0
  14. package/cjs/lib/ast/nodes/constructor.js +42 -0
  15. package/cjs/lib/ast/nodes/decorator.js +38 -0
  16. package/cjs/lib/ast/nodes/doc-tag.js +64 -0
  17. package/cjs/lib/ast/nodes/doc.js +57 -0
  18. package/cjs/lib/ast/nodes/enum-value.js +35 -0
  19. package/cjs/lib/ast/nodes/enum.js +46 -0
  20. package/cjs/lib/ast/nodes/export.js +27 -0
  21. package/cjs/lib/ast/nodes/function-type.js +35 -0
  22. package/cjs/lib/ast/nodes/function.js +60 -0
  23. package/cjs/lib/ast/nodes/generic-parameter.js +40 -0
  24. package/cjs/lib/ast/nodes/indexer.js +32 -0
  25. package/cjs/lib/ast/nodes/interface.js +60 -0
  26. package/cjs/lib/ast/nodes/intersection-type.js +44 -0
  27. package/cjs/lib/ast/nodes/lookup-type.js +30 -0
  28. package/cjs/lib/ast/nodes/method.js +82 -0
  29. package/cjs/lib/ast/nodes/object-type.js +24 -0
  30. package/cjs/lib/ast/nodes/object.js +24 -0
  31. package/cjs/lib/ast/nodes/parameter.js +45 -0
  32. package/cjs/lib/ast/nodes/property-accessor.js +128 -0
  33. package/cjs/lib/ast/nodes/property.js +119 -0
  34. package/cjs/lib/ast/nodes/reference.js +63 -0
  35. package/cjs/lib/ast/nodes/string.js +30 -0
  36. package/cjs/lib/ast/nodes/tuple.js +28 -0
  37. package/cjs/lib/ast/nodes/type-alias.js +36 -0
  38. package/cjs/lib/ast/nodes/typeof.js +23 -0
  39. package/cjs/lib/ast/nodes/types.js +2 -0
  40. package/cjs/lib/ast/nodes/union-type.js +44 -0
  41. package/cjs/lib/ast/nodes/variable.js +38 -0
  42. package/cjs/lib/ast/references/angular.js +12 -0
  43. package/cjs/lib/ast/references/easy-network-stub.js +8 -0
  44. package/cjs/lib/ast/references/index.js +7 -0
  45. package/cjs/lib/ast/references/rxjs.js +9 -0
  46. package/cjs/lib/ast/references/typescript.js +33 -0
  47. package/cjs/lib/ast/utils/get-type-script-builder-options.js +19 -0
  48. package/cjs/lib/ast/utils/to-ts-node.js +24 -0
  49. package/cjs/lib/ast/utils/write-ts-generic-parameters.js +11 -0
  50. package/cjs/lib/ast/utils/write-ts-members.js +18 -0
  51. package/cjs/lib/ast/utils/write-ts-nodes.js +24 -0
  52. package/cjs/lib/ast/utils/write-ts-parameters.js +14 -0
  53. package/cjs/lib/config.js +5 -3
  54. package/cjs/lib/file-builder.js +45 -202
  55. package/cjs/lib/generators/file-generator.js +2 -18
  56. package/cjs/lib/generators/index.js +1 -0
  57. package/cjs/lib/generators/models/model-generator.js +144 -205
  58. package/cjs/lib/generators/models/models-generator.js +12 -26
  59. package/cjs/lib/generators/models/models.js +1 -1
  60. package/cjs/lib/generators/services/angular-services/angular-service-generator.js +183 -306
  61. package/cjs/lib/generators/services/angular-services/angular-services-generator.js +168 -76
  62. package/cjs/lib/generators/services/angular-services/models.js +10 -1
  63. package/cjs/lib/generators/services/angular-services/refs.js +24 -0
  64. package/cjs/lib/generators/services/easy-network-stub/easy-network-stub-generator.js +169 -0
  65. package/cjs/lib/generators/services/easy-network-stub/easy-network-stubs-generator.js +73 -0
  66. package/cjs/lib/generators/services/easy-network-stub/index.js +6 -0
  67. package/cjs/lib/generators/services/easy-network-stub/models.js +10 -0
  68. package/cjs/lib/generators/services/easy-network-stub/refs.js +21 -0
  69. package/cjs/lib/generators/services/fetch-clients/fetch-client-generator.js +121 -181
  70. package/cjs/lib/generators/services/fetch-clients/fetch-clients-generator.js +5 -1
  71. package/cjs/lib/generators/services/fetch-clients/refs.js +17 -0
  72. package/cjs/lib/import-collection.js +18 -19
  73. package/esm/lib/ast/_index.js +37 -0
  74. package/esm/lib/ast/common.js +1 -0
  75. package/esm/lib/ast/index.js +2 -0
  76. package/esm/lib/ast/node.js +6 -0
  77. package/esm/lib/ast/nodes/argument.js +16 -0
  78. package/esm/lib/ast/nodes/array-type.js +23 -0
  79. package/esm/lib/ast/nodes/arrow-function.js +47 -0
  80. package/esm/lib/ast/nodes/call.js +22 -0
  81. package/esm/lib/ast/nodes/class.js +66 -0
  82. package/esm/lib/ast/nodes/constructor-parameter.js +42 -0
  83. package/esm/lib/ast/nodes/constructor.js +38 -0
  84. package/esm/lib/ast/nodes/decorator.js +34 -0
  85. package/esm/lib/ast/nodes/doc-tag.js +60 -0
  86. package/esm/lib/ast/nodes/doc.js +53 -0
  87. package/esm/lib/ast/nodes/enum-value.js +31 -0
  88. package/esm/lib/ast/nodes/enum.js +42 -0
  89. package/esm/lib/ast/nodes/export.js +22 -0
  90. package/esm/lib/ast/nodes/function-type.js +31 -0
  91. package/esm/lib/ast/nodes/function.js +56 -0
  92. package/esm/lib/ast/nodes/generic-parameter.js +36 -0
  93. package/esm/lib/ast/nodes/indexer.js +28 -0
  94. package/esm/lib/ast/nodes/interface.js +56 -0
  95. package/esm/lib/ast/nodes/intersection-type.js +40 -0
  96. package/esm/lib/ast/nodes/lookup-type.js +26 -0
  97. package/esm/lib/ast/nodes/method.js +77 -0
  98. package/esm/lib/ast/nodes/object-type.js +20 -0
  99. package/esm/lib/ast/nodes/object.js +20 -0
  100. package/esm/lib/ast/nodes/parameter.js +41 -0
  101. package/esm/lib/ast/nodes/property-accessor.js +121 -0
  102. package/esm/lib/ast/nodes/property.js +113 -0
  103. package/esm/lib/ast/nodes/reference.js +59 -0
  104. package/esm/lib/ast/nodes/string.js +26 -0
  105. package/esm/lib/ast/nodes/tuple.js +24 -0
  106. package/esm/lib/ast/nodes/type-alias.js +32 -0
  107. package/esm/lib/ast/nodes/typeof.js +18 -0
  108. package/esm/lib/ast/nodes/types.js +1 -0
  109. package/esm/lib/ast/nodes/union-type.js +40 -0
  110. package/esm/lib/ast/nodes/variable.js +34 -0
  111. package/esm/lib/ast/references/angular.js +9 -0
  112. package/esm/lib/ast/references/easy-network-stub.js +5 -0
  113. package/esm/lib/ast/references/index.js +5 -0
  114. package/esm/lib/ast/references/rxjs.js +6 -0
  115. package/esm/lib/ast/references/typescript.js +30 -0
  116. package/esm/lib/ast/utils/get-type-script-builder-options.js +15 -0
  117. package/esm/lib/ast/utils/to-ts-node.js +20 -0
  118. package/esm/lib/ast/utils/write-ts-generic-parameters.js +7 -0
  119. package/esm/lib/ast/utils/write-ts-members.js +14 -0
  120. package/esm/lib/ast/utils/write-ts-nodes.js +19 -0
  121. package/esm/lib/ast/utils/write-ts-parameters.js +10 -0
  122. package/esm/lib/config.js +5 -3
  123. package/esm/lib/file-builder.js +44 -202
  124. package/esm/lib/generators/file-generator.js +2 -18
  125. package/esm/lib/generators/index.js +1 -0
  126. package/esm/lib/generators/models/model-generator.js +149 -210
  127. package/esm/lib/generators/models/models-generator.js +15 -29
  128. package/esm/lib/generators/models/models.js +1 -1
  129. package/esm/lib/generators/services/angular-services/angular-service-generator.js +186 -309
  130. package/esm/lib/generators/services/angular-services/angular-services-generator.js +170 -78
  131. package/esm/lib/generators/services/angular-services/models.js +10 -1
  132. package/esm/lib/generators/services/angular-services/refs.js +20 -0
  133. package/esm/lib/generators/services/easy-network-stub/easy-network-stub-generator.js +165 -0
  134. package/esm/lib/generators/services/easy-network-stub/easy-network-stubs-generator.js +69 -0
  135. package/esm/lib/generators/services/easy-network-stub/index.js +3 -0
  136. package/esm/lib/generators/services/easy-network-stub/models.js +7 -0
  137. package/esm/lib/generators/services/easy-network-stub/refs.js +17 -0
  138. package/esm/lib/generators/services/fetch-clients/fetch-client-generator.js +123 -183
  139. package/esm/lib/generators/services/fetch-clients/fetch-clients-generator.js +5 -1
  140. package/esm/lib/generators/services/fetch-clients/refs.js +13 -0
  141. package/esm/lib/import-collection.js +17 -18
  142. package/package.json +6 -6
  143. package/types/lib/ast/_index.d.ts +38 -0
  144. package/types/lib/ast/common.d.ts +1 -0
  145. package/types/lib/ast/index.d.ts +1 -0
  146. package/types/lib/ast/node.d.ts +4 -0
  147. package/types/lib/ast/nodes/argument.d.ts +17 -0
  148. package/types/lib/ast/nodes/array-type.d.ts +19 -0
  149. package/types/lib/ast/nodes/arrow-function.d.ts +29 -0
  150. package/types/lib/ast/nodes/call.d.ts +20 -0
  151. package/types/lib/ast/nodes/class.d.ts +41 -0
  152. package/types/lib/ast/nodes/constructor-parameter.d.ts +19 -0
  153. package/types/lib/ast/nodes/constructor.d.ts +25 -0
  154. package/types/lib/ast/nodes/decorator.d.ts +22 -0
  155. package/types/lib/ast/nodes/doc-tag.d.ts +73 -0
  156. package/types/lib/ast/nodes/doc.d.ts +28 -0
  157. package/types/lib/ast/nodes/enum-value.d.ts +21 -0
  158. package/types/lib/ast/nodes/enum.d.ts +26 -0
  159. package/types/lib/ast/nodes/export.d.ts +19 -0
  160. package/types/lib/ast/nodes/function-type.d.ts +23 -0
  161. package/types/lib/ast/nodes/function.d.ts +35 -0
  162. package/types/lib/ast/nodes/generic-parameter.d.ts +25 -0
  163. package/types/lib/ast/nodes/indexer.d.ts +23 -0
  164. package/types/lib/ast/nodes/interface.d.ts +36 -0
  165. package/types/lib/ast/nodes/intersection-type.d.ts +17 -0
  166. package/types/lib/ast/nodes/lookup-type.d.ts +19 -0
  167. package/types/lib/ast/nodes/method.d.ts +45 -0
  168. package/types/lib/ast/nodes/object-type.d.ts +20 -0
  169. package/types/lib/ast/nodes/object.d.ts +19 -0
  170. package/types/lib/ast/nodes/parameter.d.ts +28 -0
  171. package/types/lib/ast/nodes/property-accessor.d.ts +53 -0
  172. package/types/lib/ast/nodes/property.d.ts +84 -0
  173. package/types/lib/ast/nodes/reference.d.ts +46 -0
  174. package/types/lib/ast/nodes/string.d.ts +18 -0
  175. package/types/lib/ast/nodes/tuple.d.ts +17 -0
  176. package/types/lib/ast/nodes/type-alias.d.ts +27 -0
  177. package/types/lib/ast/nodes/typeof.d.ts +18 -0
  178. package/types/lib/ast/nodes/types.d.ts +18 -0
  179. package/types/lib/ast/nodes/union-type.d.ts +17 -0
  180. package/types/lib/ast/nodes/variable.d.ts +28 -0
  181. package/types/lib/ast/references/angular.d.ts +37 -0
  182. package/types/lib/ast/references/easy-network-stub.d.ts +26 -0
  183. package/types/lib/ast/references/index.d.ts +3 -0
  184. package/types/lib/ast/references/rxjs.d.ts +30 -0
  185. package/types/lib/ast/references/typescript.d.ts +133 -0
  186. package/types/lib/ast/utils/get-type-script-builder-options.d.ts +3 -0
  187. package/types/lib/ast/utils/to-ts-node.d.ts +8 -0
  188. package/types/lib/ast/utils/write-ts-generic-parameters.d.ts +3 -0
  189. package/types/lib/ast/utils/write-ts-members.d.ts +5 -0
  190. package/types/lib/ast/utils/write-ts-nodes.d.ts +6 -0
  191. package/types/lib/ast/utils/write-ts-parameters.d.ts +3 -0
  192. package/types/lib/common-results.d.ts +4 -0
  193. package/types/lib/config.d.ts +5 -2
  194. package/types/lib/file-builder.d.ts +21 -98
  195. package/types/lib/generators/file-generator.d.ts +3 -7
  196. package/types/lib/generators/index.d.ts +1 -0
  197. package/types/lib/generators/models/model-generator.d.ts +18 -23
  198. package/types/lib/generators/models/models-generator.d.ts +4 -5
  199. package/types/lib/generators/models/models.d.ts +4 -4
  200. package/types/lib/generators/services/angular-services/angular-service-generator.d.ts +15 -35
  201. package/types/lib/generators/services/angular-services/angular-services-generator.d.ts +12 -10
  202. package/types/lib/generators/services/angular-services/models.d.ts +67 -22
  203. package/types/lib/generators/services/angular-services/refs.d.ts +34 -0
  204. package/types/lib/generators/services/easy-network-stub/easy-network-stub-generator.d.ts +32 -0
  205. package/types/lib/generators/services/easy-network-stub/easy-network-stubs-generator.d.ts +25 -0
  206. package/types/lib/generators/services/easy-network-stub/index.d.ts +3 -0
  207. package/types/lib/generators/services/easy-network-stub/models.d.ts +51 -0
  208. package/types/lib/generators/services/easy-network-stub/refs.d.ts +49 -0
  209. package/types/lib/generators/services/fetch-clients/fetch-client-generator.d.ts +10 -22
  210. package/types/lib/generators/services/fetch-clients/models.d.ts +4 -1
  211. package/types/lib/generators/services/fetch-clients/refs.d.ts +23 -0
  212. package/types/lib/import-collection.d.ts +13 -5
  213. package/assets/client/fetch/types.ts +0 -14
  214. package/assets/service/angular/api-configuration.ts +0 -18
  215. package/assets/service/angular/base-service.ts +0 -29
  216. package/assets/service/angular/response-handlers.ts +0 -127
  217. package/assets/service/angular/strict-http-response.ts +0 -8
@@ -2,283 +2,213 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DefaultTypeScriptModelGenerator = void 0;
4
4
  const path_1 = require("path");
5
- const fs_extra_1 = require("fs-extra");
6
5
  const core_1 = require("@goast/core");
6
+ const ast_1 = require("../../ast");
7
7
  const file_builder_1 = require("../../file-builder");
8
- const utils_1 = require("../../utils");
9
8
  const file_generator_1 = require("../file-generator");
10
9
  class DefaultTypeScriptModelGenerator extends file_generator_1.TypeScriptFileGenerator {
11
10
  generate(ctx) {
12
11
  if (this.shouldGenerateTypeDeclaration(ctx, ctx.schema)) {
13
12
  const name = this.getDeclarationTypeName(ctx, ctx.schema);
14
13
  const filePath = this.getFilePath(ctx, ctx.schema);
15
- console.log(`Generating model ${name} to ${filePath}...`);
16
- (0, fs_extra_1.ensureDirSync)((0, path_1.dirname)(filePath));
17
- const builder = new file_builder_1.TypeScriptFileBuilder(filePath, ctx.config);
18
- this.generateFileContent(ctx, builder);
19
- (0, fs_extra_1.writeFileSync)(filePath, builder.toString());
14
+ file_builder_1.TypeScriptFileBuilder.generate({
15
+ logName: `model ${name}`,
16
+ filePath,
17
+ options: ctx.config,
18
+ generator: (b) => b.append(this.getFileContent(ctx)),
19
+ });
20
20
  return { component: name, filePath, imports: [{ kind: 'file', name, modulePath: filePath }] };
21
21
  }
22
22
  else {
23
23
  const builder = new file_builder_1.TypeScriptFileBuilder(undefined, ctx.config);
24
- this.generateType(ctx, builder, ctx.schema);
24
+ builder.append(this.getType(ctx, ctx.schema));
25
25
  const imports = builder.imports.imports;
26
26
  builder.imports.clear();
27
27
  return { component: builder.toString(false), imports };
28
28
  }
29
29
  }
30
- generateFileContent(ctx, builder) {
30
+ getFileContent(ctx) {
31
+ const content = (0, core_1.appendValueGroup)([], '\n');
31
32
  const interfaceSchema = this.resolveInterfaceSchema(ctx);
32
33
  if (interfaceSchema) {
33
- this.generateInterface(ctx, builder, interfaceSchema);
34
+ content.values.push(this.getInterface(ctx, interfaceSchema));
34
35
  }
35
36
  else if (ctx.config.enumGeneration !== 'union' &&
36
37
  ctx.schema.kind === 'string' &&
37
38
  ctx.schema.enum !== undefined &&
38
39
  ctx.schema.enum.length > 0) {
39
- this.generateEnum(ctx, builder);
40
+ content.values.push(this.getEnum(ctx));
40
41
  }
41
42
  else {
42
- this.generateTypeAlias(ctx, builder);
43
+ content.values.push(this.getTypeAlias(ctx, ctx.schema));
43
44
  }
45
+ return content;
44
46
  }
45
- generateEnum(ctx, builder) {
46
- builder
47
- .append((builder) => this.generateTypeDocumentation(ctx, builder))
48
- .ensureCurrentLineEmpty()
49
- .append((builder) => this.generateEnumSignature(ctx, builder))
50
- .parenthesize('{}', (builder) => this.generateEnumValues(ctx, builder), { multiline: true })
51
- .ensureCurrentLineEmpty();
52
- }
53
- generateEnumSignature(ctx, builder) {
54
- builder.append('export enum ').append(this.getDeclarationTypeName(ctx, ctx.schema));
55
- }
56
- generateEnumValues(ctx, builder) {
47
+ getEnum(ctx) {
57
48
  var _a, _b;
58
- builder.forEach((_b = (_a = ctx.schema.enum) === null || _a === void 0 ? void 0 : _a.map((x) => String(x))) !== null && _b !== void 0 ? _b : [], (builder, enumValue) => builder.append(`${this.toEnumValueName(ctx, enumValue)} = ${this.toStringLiteral(ctx, enumValue)}`), { separator: ',\n' });
59
- }
60
- generateInterface(ctx, builder, schema) {
61
- builder
62
- .append((builder) => this.generateTypeDocumentation(ctx, builder))
63
- .ensureCurrentLineEmpty()
64
- .append((builder) => this.generateInterfaceSignature(ctx, builder))
65
- .parenthesize('{}', (builder) => builder.append((builder) => this.generateInterfaceContent(ctx, builder, schema)), { multiline: true })
66
- .ensureCurrentLineEmpty();
49
+ return ast_1.ts.enum(this.getDeclarationTypeName(ctx, ctx.schema), {
50
+ export: true,
51
+ members: ((_b = (_a = ctx.schema.enum) === null || _a === void 0 ? void 0 : _a.map((x) => String(x))) !== null && _b !== void 0 ? _b : []).map((x) => ast_1.ts.enumValue((0, core_1.toCasing)(x, ctx.config.enumValueNameCasing), { value: ast_1.ts.string(x) })),
52
+ });
67
53
  }
68
- generateInterfaceSignature(ctx, builder) {
69
- builder.append('export interface ').append(this.getDeclarationTypeName(ctx, ctx.schema));
54
+ getInterface(ctx, schema) {
55
+ return ast_1.ts.interface(this.getDeclarationTypeName(ctx, ctx.schema), {
56
+ export: true,
57
+ doc: ast_1.ts.doc({ description: schema.description }),
58
+ members: [...this.getProperties(ctx, schema), this.getIndexer(ctx, schema)],
59
+ });
70
60
  }
71
- generateInterfaceContent(ctx, builder, schema) {
72
- this.generateObjectTypeProperties(ctx, builder, schema);
73
- if (schema.additionalProperties) {
74
- builder.append('[key: string]: ');
75
- if (schema.additionalProperties === true) {
76
- builder.append(this.getAnyType(ctx));
77
- }
78
- else {
79
- this.generateTypeUsage(ctx, builder, schema.additionalProperties);
80
- }
81
- builder.appendLine(';');
61
+ getTypeAlias(ctx, schema) {
62
+ var _a;
63
+ const result = ast_1.ts.typeAlias(this.getDeclarationTypeName(ctx, schema), (_a = this.getType(ctx, schema, true)) !== null && _a !== void 0 ? _a : this.getAnyType(ctx), {
64
+ export: true,
65
+ doc: ast_1.ts.doc({ description: schema.description }),
66
+ });
67
+ if (schema.discriminator && Object.keys(schema.discriminator.mapping).length > 0) {
68
+ const propertyValue = ast_1.ts.unionType(Object.keys(schema.discriminator.mapping).map((x) => ast_1.ts.string(x)));
69
+ result.generics.push(ast_1.ts.genericParameter(this.getDiscriminatorGenericParamName(ctx, schema), {
70
+ constraint: propertyValue,
71
+ default: propertyValue,
72
+ }));
82
73
  }
74
+ return result;
83
75
  }
84
- generateTypeAlias(ctx, builder) {
85
- builder
86
- .append((builder) => this.generateTypeDocumentation(ctx, builder))
87
- .ensureCurrentLineEmpty()
88
- .append((builder) => this.generateTypeAliasSignature(ctx, builder))
89
- .append(' = ')
90
- .append((builder) => this.generateType(ctx, builder, ctx.schema))
91
- .appendLine(';');
76
+ getIndexer(ctx, schema) {
77
+ var _a;
78
+ return schema.additionalProperties
79
+ ? ast_1.ts.indexer('string', (_a = (schema.additionalProperties === true ? null : this.getType(ctx, schema.additionalProperties))) !== null && _a !== void 0 ? _a : this.getAnyType(ctx), { readonly: ctx.config.immutableTypes })
80
+ : null;
92
81
  }
93
- generateTypeAliasSignature(ctx, builder) {
94
- builder.append('export type ').append(this.getDeclarationTypeName(ctx, ctx.schema));
82
+ getProperties(ctx, schema) {
83
+ return Array.from(schema.properties.values()).map((property) => {
84
+ return ast_1.ts.property(property.name, {
85
+ doc: ast_1.ts.doc({ description: property.schema.description }),
86
+ readonly: ctx.config.immutableTypes,
87
+ optional: !schema.required.has(property.name),
88
+ type: ast_1.ts.unionType([this.getType(ctx, property.schema), property.schema.nullable ? 'null' : null]),
89
+ });
90
+ });
95
91
  }
96
- generateTypeUsage(ctx, builder, schema) {
92
+ getType(ctx, schema, skipSchemas = false) {
93
+ if (!schema)
94
+ return this.getAnyType(ctx);
97
95
  schema = (0, core_1.getSchemaReference)(schema, ['description']);
98
- if (this.shouldGenerateTypeDeclaration(ctx, schema)) {
99
- const name = this.getDeclarationTypeName(ctx, schema);
100
- const filePath = this.getFilePath(ctx, schema);
101
- if (filePath) {
102
- builder.addImport(name, filePath);
96
+ if (!skipSchemas && this.shouldGenerateTypeDeclaration(ctx, schema)) {
97
+ if (schema.id === ctx.schema.id) {
98
+ return null;
103
99
  }
104
- builder.append(name);
100
+ return ast_1.ts.reference(this.getDeclarationTypeName(ctx, schema), this.getFilePath(ctx, schema));
105
101
  }
106
- else {
107
- this.generateType(ctx, builder, schema);
102
+ if (schema.id === ctx.schema.id && schema.inheritedSchemas.length > 0) {
103
+ return ast_1.ts.intersectionType(this.getInheritedSchemas(ctx, schema).map((x) => {
104
+ var _a;
105
+ const mappingValue = (_a = Object.entries(x.discriminator.mapping).find(([_, value]) => value.id === schema.id)) === null || _a === void 0 ? void 0 : _a[0];
106
+ return ast_1.ts.reference(this.getDeclarationTypeName(ctx, x), this.getFilePath(ctx, x), {
107
+ generics: [mappingValue !== undefined ? ast_1.ts.string(mappingValue) : null],
108
+ });
109
+ }));
108
110
  }
109
- }
110
- generateType(ctx, builder, schema) {
111
- if (schema.enum !== undefined && schema.enum.length > 0) {
112
- this.generateEnumType(ctx, builder, schema);
113
- return;
111
+ if (schema.enum) {
112
+ return ast_1.ts.unionType(schema.enum.map((x) => ast_1.ts.toNode(x)));
114
113
  }
115
114
  switch (schema.kind) {
116
115
  case 'boolean':
117
- builder.append('boolean');
118
- break;
116
+ return 'boolean';
119
117
  case 'integer':
120
118
  case 'number':
121
- builder.append('number');
122
- break;
119
+ return 'number';
123
120
  case 'string':
124
- builder.append('string');
125
- break;
121
+ return 'string';
126
122
  case 'null':
127
- builder.append('null');
128
- break;
123
+ return 'null';
129
124
  case 'unknown':
130
- builder.append(this.getAnyType(ctx));
131
- break;
125
+ return this.getAnyType(ctx);
132
126
  case 'array':
133
- this.generateArrayType(ctx, builder, schema);
134
- break;
127
+ return this.getArrayType(ctx, schema);
135
128
  case 'object':
136
- this.generateObjectType(ctx, builder, schema);
137
- break;
129
+ return this.getObjectType(ctx, schema);
138
130
  case 'combined':
139
- this.generateCombinedType(ctx, builder, schema);
140
- break;
131
+ return this.getCombinedType(ctx, schema);
141
132
  case 'multi-type':
142
- this.generateMultiType(ctx, builder, schema);
143
- break;
133
+ return this.getMultiType(ctx, schema);
144
134
  case 'oneOf':
145
- this.generateOneOfType(ctx, builder, schema);
146
- break;
135
+ return this.getOneOfType(ctx, schema);
147
136
  default:
148
- builder.append(this.getAnyType(ctx));
149
- break;
137
+ return this.getAnyType(ctx);
150
138
  }
151
139
  }
152
- generateArrayType(ctx, builder, schema) {
153
- builder
154
- .appendIf(ctx.config.immutableTypes, 'readonly ')
155
- .parenthesize('()', (builder) => schema.items ? this.generateTypeUsage(ctx, builder, schema.items) : builder.append(this.getAnyType(ctx)))
156
- .append('[]');
140
+ getArrayType(ctx, schema) {
141
+ var _a;
142
+ return ast_1.ts.arrayType((_a = this.getType(ctx, schema.items)) !== null && _a !== void 0 ? _a : this.getAnyType(ctx), {
143
+ readonly: ctx.config.immutableTypes,
144
+ });
157
145
  }
158
- generateCombinedType(ctx, builder, schema) {
146
+ getObjectType(ctx, schema) {
147
+ const parts = [
148
+ schema.properties.size > 0 ? ast_1.ts.objectType({ members: this.getProperties(ctx, schema) }) : null,
149
+ schema.additionalProperties ? ast_1.ts.objectType({ members: [this.getIndexer(ctx, schema)] }) : null,
150
+ schema.allOf.length > 0 || schema.anyOf.length > 0 ? this.getCombinedType(ctx, schema) : null,
151
+ ].filter(core_1.notNullish);
152
+ if (parts.length === 0) {
153
+ parts.push(ast_1.ts.objectType());
154
+ }
155
+ const type = ast_1.ts.intersectionType(parts);
156
+ if (schema.discriminator && Object.keys(schema.discriminator.mapping).length > 0) {
157
+ const discriminator = schema.discriminator;
158
+ return ast_1.ts.intersectionType([
159
+ type,
160
+ ast_1.ts.lookupType(ast_1.ts.objectType({
161
+ members: Object.entries(discriminator.mapping).map(([key, value]) => ast_1.ts.property(key, {
162
+ type: ast_1.ts.intersectionType([
163
+ ast_1.ts.objectType({
164
+ members: [ast_1.ts.property(discriminator.propertyName, { type: ast_1.ts.string(key) })],
165
+ }),
166
+ this.getType(ctx, value, true),
167
+ ]),
168
+ })),
169
+ }), this.getDiscriminatorGenericParamName(ctx, schema)),
170
+ ]);
171
+ }
172
+ return type;
173
+ }
174
+ getCombinedType(ctx, schema) {
159
175
  if (schema.allOf.length === 0 && schema.anyOf.length === 0) {
160
- builder.append(this.getAnyType(ctx));
161
- return;
176
+ return this.getAnyType(ctx);
162
177
  }
163
- builder
164
- .forEach(schema.allOf, (builder, schema) => this.generateTypeUsage(ctx, builder, schema), { separator: ' & ' })
165
- .appendIf(schema.anyOf.length > 0, (builder) => builder
166
- .appendIf(schema.allOf.length > 0, ' & ')
167
- .forEach(schema.anyOf, (builder, schema) => builder
168
- .append('Partial')
169
- .parenthesize('<>', (builder) => this.generateTypeUsage(ctx, builder, schema), { indent: false }), { separator: ' & ' }));
178
+ return ast_1.ts.intersectionType([
179
+ ...schema.allOf.map((x) => this.getType(ctx, x)),
180
+ ...schema.anyOf.map((x) => ast_1.ts.reference('Partial', null, { generics: [this.getType(ctx, x)] })),
181
+ ]);
170
182
  }
171
- generateOneOfType(ctx, builder, schema) {
183
+ getOneOfType(ctx, schema) {
172
184
  if (schema.oneOf.length === 0) {
173
- builder.append(this.getAnyType(ctx));
174
- return;
185
+ return this.getAnyType(ctx);
175
186
  }
176
- builder.parenthesizeIf(schema.oneOf.length > 1, '()', (builder) => builder.forEach(schema.oneOf, (builder, schema) => this.generateTypeUsage(ctx, builder, schema), {
177
- separator: ' | ',
178
- }));
187
+ return ast_1.ts.unionType(schema.oneOf.map((x) => this.getType(ctx, x)));
179
188
  }
180
- generateMultiType(ctx, builder, schema) {
189
+ getMultiType(ctx, schema) {
181
190
  if (schema.type.length === 0) {
182
- builder.append(this.getAnyType(ctx));
183
- return;
191
+ return this.getAnyType(ctx);
184
192
  }
185
- const parenthesize = schema.type.length > 1;
186
- builder.parenthesizeIf(parenthesize, '()', (builder) => builder
187
- .appendIf(parenthesize, (builder) => builder.appendLine().append('| '))
188
- .forEach(schema.type, (builder, type) => {
189
- switch (type) {
193
+ return ast_1.ts.unionType(schema.type.map((x) => {
194
+ switch (x) {
190
195
  case 'string':
191
- builder.append('string');
192
- break;
196
+ return 'string';
193
197
  case 'number':
194
198
  case 'integer':
195
- builder.append('number');
196
- break;
199
+ return 'number';
197
200
  case 'boolean':
198
- builder.append('boolean');
199
- break;
201
+ return 'boolean';
200
202
  case 'null':
201
- builder.append('null');
202
- break;
203
+ return 'null';
203
204
  case 'array':
204
- this.generateArrayType(ctx, builder, schema);
205
- break;
205
+ return this.getArrayType(ctx, schema);
206
206
  case 'object':
207
- this.generateObjectType(ctx, builder, schema);
208
- break;
207
+ return this.getObjectType(ctx, schema);
209
208
  default:
210
- builder.append('never');
211
- break;
209
+ return 'never';
212
210
  }
213
- }, { separator: (builder) => builder.appendLine().append('| ') }));
214
- }
215
- generateObjectType(ctx, builder, schema) {
216
- if (schema.properties.size === 0 &&
217
- !schema.additionalProperties &&
218
- schema.allOf.length === 0 &&
219
- schema.anyOf.length === 0 &&
220
- schema.discriminator === undefined) {
221
- builder.append('{}');
222
- return;
223
- }
224
- // properties
225
- if (schema.properties.size > 0) {
226
- builder
227
- .parenthesize('{}', (builder) => builder.appendLine().append((builder) => this.generateObjectTypeProperties(ctx, builder, schema)))
228
- .appendIf(!!schema.additionalProperties || schema.allOf.length > 0 || schema.anyOf.length > 0, ' & ');
229
- }
230
- // additional properties
231
- if (schema.additionalProperties) {
232
- this.generateObjectTypeAdditionalProperties(ctx, builder, schema);
233
- if (schema.allOf.length > 0 || schema.anyOf.length > 0) {
234
- builder.append(' & ');
235
- }
236
- }
237
- // allOf & anyOf
238
- if (schema.allOf.length > 0 || schema.anyOf.length > 0) {
239
- this.generateCombinedType(ctx, builder, schema);
240
- }
241
- }
242
- generateObjectTypeProperties(ctx, builder, schema) {
243
- builder.forEach(schema.properties.values(), (builder, property) => {
244
- this.generatePropertyDocumentation(ctx, builder, property);
245
- builder
246
- .appendIf(ctx.config.immutableTypes, 'readonly ')
247
- .append((0, utils_1.toTypeScriptPropertyName)(property.name, ctx.config.useSingleQuotes))
248
- .appendIf(!schema.required.has(property.name), '?')
249
- .append(': ')
250
- .append((builder) => this.generateTypeUsage(ctx, builder, property.schema))
251
- .appendIf(property.schema.nullable === true, ' | null')
252
- .appendLine(';');
253
- });
254
- }
255
- generateObjectTypeAdditionalProperties(ctx, builder, schema) {
256
- if (!schema.additionalProperties)
257
- return;
258
- builder
259
- .appendIf(ctx.config.immutableTypes, 'Readonly')
260
- .parenthesizeIf(ctx.config.immutableTypes, '<>', (builder) => builder
261
- .append('Record')
262
- .appendGenericArguments('string', schema.additionalProperties === true
263
- ? this.getAnyType(ctx)
264
- : (builder) => this.generateTypeUsage(ctx, builder, schema.additionalProperties)));
265
- }
266
- generateEnumType(ctx, builder, schema) {
267
- builder.indent((builder) => {
268
- var _a;
269
- builder.forEach((_a = schema.enum) !== null && _a !== void 0 ? _a : [], (builder, item) => builder.append(this.toStringLiteral(ctx, String(item))), {
270
- separator: ' | ',
271
- });
272
- });
273
- }
274
- generateTypeDocumentation(ctx, builder) {
275
- this.generateDocumentation(ctx, builder, ctx.schema);
276
- }
277
- generatePropertyDocumentation(ctx, builder, property) {
278
- this.generateDocumentation(ctx, builder, property.schema);
279
- }
280
- generateDocumentation(ctx, builder, schema) {
281
- builder.appendComment('/***/', schema.description);
211
+ }));
282
212
  }
283
213
  shouldGenerateTypeDeclaration(ctx, schema) {
284
214
  // All named schemas should have its own type declaration
@@ -286,7 +216,7 @@ class DefaultTypeScriptModelGenerator extends file_generator_1.TypeScriptFileGen
286
216
  return true;
287
217
  }
288
218
  // All enum types should have its own type declaration
289
- if (schema.kind === 'string' && schema.enum !== undefined && schema.enum.length > 0) {
219
+ if (schema.enum !== undefined && schema.enum.length > 0) {
290
220
  return true;
291
221
  }
292
222
  // All primitive types already exist and do not need its own type declaration
@@ -310,6 +240,15 @@ class DefaultTypeScriptModelGenerator extends file_generator_1.TypeScriptFileGen
310
240
  getDeclarationTypeName(ctx, schema) {
311
241
  return (0, core_1.toCasing)(schema.name, ctx.config.typeNameCasing);
312
242
  }
243
+ getDiscriminatorGenericParamName(ctx, schema) {
244
+ var _a;
245
+ return (0, core_1.toCasing)((_a = schema.discriminator) === null || _a === void 0 ? void 0 : _a.propertyName, ctx.config.genericParamNameCasing);
246
+ }
247
+ getInheritedSchemas(ctx, schema) {
248
+ return schema.inheritedSchemas
249
+ .filter((schema) => this.shouldGenerateTypeDeclaration(ctx, schema) && !schema.isNameGenerated)
250
+ .filter((item, index, self) => self.indexOf(item) === index);
251
+ }
313
252
  getFilePath(ctx, schema) {
314
253
  return (0, path_1.resolve)(ctx.config.outputDir, ctx.config.modelsDirPath, `${(0, core_1.toCasing)(schema.name, ctx.config.fileNameCasing)}.ts`);
315
254
  }
@@ -2,12 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TypeScriptModelsGenerator = void 0;
4
4
  const path_1 = require("path");
5
- const fs_extra_1 = require("fs-extra");
6
5
  const core_1 = require("@goast/core");
7
6
  const model_generator_1 = require("./model-generator");
8
7
  const models_1 = require("./models");
8
+ const ast_1 = require("../../ast");
9
9
  const file_builder_1 = require("../../file-builder");
10
- const import_collection_1 = require("../../import-collection");
11
10
  class TypeScriptModelsGenerator extends core_1.OpenApiSchemasGenerationProviderBase {
12
11
  constructor(modelGeneratorFactory) {
13
12
  super();
@@ -16,7 +15,7 @@ class TypeScriptModelsGenerator extends core_1.OpenApiSchemasGenerationProviderB
16
15
  initResult() {
17
16
  return {
18
17
  models: {},
19
- modelIndexFilePath: undefined,
18
+ indexFiles: { models: undefined },
20
19
  };
21
20
  }
22
21
  buildContext(context, config) {
@@ -24,7 +23,7 @@ class TypeScriptModelsGenerator extends core_1.OpenApiSchemasGenerationProviderB
24
23
  }
25
24
  onGenerate(ctx) {
26
25
  const output = super.onGenerate(ctx);
27
- output.modelIndexFilePath = this.generateIndexFile(ctx);
26
+ output.indexFiles.models = this.generateIndexFile(ctx);
28
27
  return output;
29
28
  }
30
29
  generateSchema(ctx, schema) {
@@ -35,33 +34,20 @@ class TypeScriptModelsGenerator extends core_1.OpenApiSchemasGenerationProviderB
35
34
  ctx.output.models[schema.id] = result;
36
35
  }
37
36
  generateIndexFile(ctx) {
38
- if (!this.shouldGenerateIndexFile(ctx)) {
39
- return undefined;
40
- }
41
37
  const filePath = this.getIndexFilePath(ctx);
42
- console.log(`Generating model index file to ${filePath}...`);
43
- (0, fs_extra_1.ensureDirSync)((0, path_1.dirname)(filePath));
44
- const builder = new file_builder_1.TypeScriptFileBuilder(filePath, ctx.config);
45
- this.generateIndexFileContent(ctx, builder);
46
- (0, fs_extra_1.writeFileSync)(filePath, builder.toString());
38
+ file_builder_1.TypeScriptFileBuilder.tryGenerate({
39
+ logName: 'model index file',
40
+ filePath,
41
+ options: ctx.config,
42
+ generator: (b) => b.append(this.getIndexFileContent(ctx)),
43
+ });
47
44
  return filePath;
48
45
  }
49
46
  getIndexFilePath(ctx) {
50
- var _a;
51
- return (0, path_1.resolve)(ctx.config.outputDir, (_a = ctx.config.indexFilePath) !== null && _a !== void 0 ? _a : 'models.ts');
47
+ return ctx.config.indexFilePath ? (0, path_1.resolve)(ctx.config.outputDir, ctx.config.indexFilePath) : null;
52
48
  }
53
- shouldGenerateIndexFile(ctx) {
54
- return ctx.config.indexFilePath !== null;
55
- }
56
- generateIndexFileContent(ctx, builder) {
57
- const exports = new import_collection_1.ImportExportCollection();
58
- for (const modelId in ctx.output.models) {
59
- const model = ctx.output.models[modelId];
60
- if (model.filePath) {
61
- exports.addExport(model.component, model.filePath);
62
- }
63
- }
64
- exports.writeTo(builder);
49
+ getIndexFileContent(ctx) {
50
+ return (0, core_1.appendValueGroup)(Object.values(ctx.output.models).map((x) => (x.filePath ? ast_1.ts.export(x.component, x.filePath) : null)));
65
51
  }
66
52
  }
67
53
  exports.TypeScriptModelsGenerator = TypeScriptModelsGenerator;
@@ -2,5 +2,5 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.defaultTypeScriptModelsGeneratorConfig = exports.defaultTypeScriptModelGeneratorConfig = void 0;
4
4
  const config_1 = require("../../config");
5
- exports.defaultTypeScriptModelGeneratorConfig = Object.assign(Object.assign({}, config_1.defaultTypeScriptGeneratorConfig), { fileNameCasing: 'kebab', typeNameCasing: 'pascal', enumGeneration: 'union', immutableTypes: false, inlineUnnamedSchemas: true, modelsDirPath: 'models', typeDeclaration: 'type' });
5
+ exports.defaultTypeScriptModelGeneratorConfig = Object.assign(Object.assign({}, config_1.defaultTypeScriptGeneratorConfig), { enumGeneration: 'union', immutableTypes: false, inlineUnnamedSchemas: true, modelsDirPath: 'models', typeDeclaration: 'type' });
6
6
  exports.defaultTypeScriptModelsGeneratorConfig = Object.assign(Object.assign({}, exports.defaultTypeScriptModelGeneratorConfig), { indexFilePath: 'models.ts' });