@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
@@ -1,360 +1,237 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DefaultTypeScriptAngularServiceGenerator = void 0;
4
- const fs_1 = require("fs");
5
4
  const path_1 = require("path");
6
- const fs_extra_1 = require("fs-extra");
7
5
  const core_1 = require("@goast/core");
6
+ const ast_1 = require("../../../ast");
8
7
  const file_builder_1 = require("../../../file-builder");
9
8
  const file_generator_1 = require("../../file-generator");
10
9
  class DefaultTypeScriptAngularServiceGenerator extends file_generator_1.TypeScriptFileGenerator {
11
- constructor() {
12
- super(...arguments);
13
- this.httpClientType = {
14
- name: 'HttpClient',
15
- module: '@angular/common/http',
16
- };
17
- this.httpContextType = {
18
- name: 'HttpContext',
19
- module: '@angular/common/http',
20
- };
21
- this.httpResponseType = {
22
- name: 'HttpResponse',
23
- module: '@angular/common/http',
24
- };
25
- this.observableType = {
26
- name: 'Observable',
27
- module: 'rxjs',
28
- };
29
- this.rxjsFilterType = {
30
- name: 'filter',
31
- module: 'rxjs',
32
- };
33
- this.rxjsMapType = {
34
- name: 'map',
35
- module: 'rxjs',
36
- };
37
- }
38
- getApiConfigurationType(ctx) {
39
- return { name: 'ApiConfiguration', module: (0, path_1.resolve)(this.getUtilsDirPath(ctx), 'api-configuration.ts') };
40
- }
41
- getBaseServiceType(ctx) {
42
- return { name: 'BaseService', module: (0, path_1.resolve)(this.getUtilsDirPath(ctx), 'base-service.ts') };
43
- }
44
- getStrictHttpResponseType(ctx) {
45
- return { name: 'StrictHttpResponse', module: (0, path_1.resolve)(this.getUtilsDirPath(ctx), 'strict-http-response.ts') };
46
- }
47
- getRequestBuilderType(ctx) {
48
- return { name: 'RequestBuilder', module: (0, path_1.resolve)(this.getUtilsDirPath(ctx), 'request-builder.ts') };
49
- }
50
10
  generate(ctx) {
11
+ const responseModels = this.generateResponseModels(ctx);
51
12
  const filePath = this.getServiceFilePath(ctx);
52
13
  const name = this.getServiceClassName(ctx);
53
- console.log(`Generating service ${name} in ${filePath}...`);
54
- (0, fs_extra_1.ensureDirSync)((0, path_1.dirname)(filePath));
55
- const serviceBuilder = new file_builder_1.TypeScriptFileBuilder(filePath, ctx.config);
56
- this.generateServiceFileContent(ctx, serviceBuilder);
57
- (0, fs_1.writeFileSync)(filePath, serviceBuilder.toString());
14
+ file_builder_1.TypeScriptFileBuilder.generate({
15
+ logName: `service ${name}`,
16
+ filePath,
17
+ options: ctx.config,
18
+ generator: (b) => b.append(this.getServiceFileContent(ctx)),
19
+ });
58
20
  return {
59
21
  filePath,
60
22
  component: name,
61
- responseModels: {},
62
- imports: [{ kind: 'file', name, modulePath: filePath }],
23
+ responseModels,
63
24
  };
64
25
  }
65
- generateServiceFileContent(ctx, builder) {
66
- builder
67
- .append((builder) => builder.forEach(ctx.service.endpoints, (builder, endpoint) => this.generateEndpointParamsType(ctx, builder, endpoint), { separator: '\n' }))
68
- .ensurePreviousLineEmpty()
69
- .append((builder) => this.generateClass(ctx, builder));
70
- }
71
- // protected generateResponseModels(ctx: Context): Output['responseModels'] {
72
- // const filePath = this.get;
73
- // const builder = new TypeScriptFileBuilder();
74
- // }
75
- //protected generateResponseModelsFileContent(ctx: Context, builder: Builder) {}
76
- generateEndpointParamsType(ctx, builder, endpoint) {
77
- if (!this.hasEndpointParams(ctx, endpoint)) {
78
- return;
26
+ // #region Response Model
27
+ generateResponseModels(ctx) {
28
+ const result = {};
29
+ const filePath = this.getResponseModelFilePath(ctx);
30
+ const builder = new file_builder_1.TypeScriptFileBuilder(filePath, ctx.config);
31
+ for (const endpoint of ctx.service.endpoints) {
32
+ const name = this.getResponseModelName(ctx, endpoint);
33
+ builder.appendLine(this.getResponseModelFileContent(ctx, endpoint));
34
+ result[endpoint.id] = { component: name, filePath };
35
+ }
36
+ builder.writeToFile();
37
+ return result;
38
+ }
39
+ getResponseModelFileContent(ctx, endpoint) {
40
+ const result = (0, core_1.appendValueGroup)([]);
41
+ const statusCodes = this.getEndpointStatusCodes(ctx, endpoint);
42
+ let statusCodeType;
43
+ const statusCodesTypeName = (0, core_1.toCasing)(`${endpoint.name}_StatusCodes`, ctx.config.typeNameCasing);
44
+ result.values.push(ast_1.ts.typeAlias(statusCodesTypeName, ast_1.ts.unionType(Object.keys(statusCodes))));
45
+ if (ctx.config.strictResponseTypes) {
46
+ statusCodeType = ast_1.ts.reference(statusCodesTypeName);
47
+ }
48
+ else {
49
+ statusCodeType = ctx.refs.httpStatusCode();
79
50
  }
80
- const params = [];
51
+ result.values.push(ast_1.ts.typeAlias(this.getResponseModelName(ctx, endpoint), ast_1.ts.intersectionType([
52
+ ast_1.ts.unionType([
53
+ ...Object.entries(statusCodes).map(([key, value]) => ast_1.ts.intersectionType([
54
+ ast_1.ts.refs.angular.httpResponse([value]),
55
+ ast_1.ts.objectType({ members: [ast_1.ts.property('status', { type: key })] }),
56
+ ])),
57
+ !ctx.config.strictResponseTypes
58
+ ? ast_1.ts.intersectionType([
59
+ ast_1.ts.refs.angular.httpResponse([this.getAnyType(ctx)]),
60
+ ast_1.ts.objectType({
61
+ members: [
62
+ ast_1.ts.property('status', {
63
+ type: ast_1.ts.refs.exclude([ctx.refs.httpStatusCode(), ast_1.ts.reference(statusCodesTypeName)]),
64
+ }),
65
+ ],
66
+ }),
67
+ ])
68
+ : null,
69
+ ]),
70
+ ast_1.ts.objectType({ members: [ast_1.ts.property('status', { type: 'TStatus' })] }),
71
+ ]), {
72
+ export: true,
73
+ generics: [
74
+ ast_1.ts.genericParameter('TStatus', {
75
+ constraint: statusCodeType,
76
+ default: statusCodeType,
77
+ }),
78
+ ],
79
+ }));
80
+ return result;
81
+ }
82
+ getEndpointStatusCodes(ctx, endpoint) {
83
+ return Object.fromEntries([
84
+ ...Object.entries(ctx.config.defaultStatusCodeResponseTypes).map(([key, value]) => [
85
+ key,
86
+ typeof value === 'function' ? this.getSchemaType(ctx, value(ctx.data.schemas)) : value,
87
+ ]),
88
+ ...endpoint.responses
89
+ .filter((x) => x.statusCode)
90
+ .map((x) => { var _a; return [x.statusCode, this.getSchemaType(ctx, (_a = x.contentOptions[0]) === null || _a === void 0 ? void 0 : _a.schema, ast_1.ts.refs.never())]; }),
91
+ ]);
92
+ }
93
+ // #endregion
94
+ getServiceFileContent(ctx) {
95
+ const code = (0, core_1.appendValueGroup)([], '\n');
96
+ for (const endpoint of ctx.service.endpoints) {
97
+ if (endpoint.parameters.length > 0 || endpoint.requestBody !== undefined) {
98
+ code.values.push(this.getEndpointParamsType(ctx, endpoint));
99
+ }
100
+ }
101
+ code.values.push(this.getClass(ctx));
102
+ return code;
103
+ }
104
+ getEndpointParamsType(ctx, endpoint) {
105
+ const type = ast_1.ts.objectType();
81
106
  for (const parameter of endpoint.parameters) {
82
107
  const schema = parameter.schema;
83
- params.push((builder) => builder.appendProperty({
84
- name: this.toPropertyName(ctx, parameter.name),
85
- documentation: parameter.description,
86
- type: schema ? (builder) => builder.appendModelUsage(ctx.input.models[schema.id]) : this.getAnyType(ctx),
87
- isOptional: !parameter.required,
108
+ type.members.push(ast_1.ts.property((0, core_1.toCasing)(parameter.name, ctx.config.propertyNameCasing), {
109
+ doc: ast_1.ts.doc({ description: parameter.description }),
110
+ type: schema ? (b) => b.appendModelUsage(ctx.input.models[schema.id]) : this.getAnyType(ctx),
111
+ optional: !parameter.required,
88
112
  }));
89
113
  }
90
114
  if (endpoint.requestBody !== undefined) {
91
115
  const body = endpoint.requestBody;
92
116
  const schema = body.content[0].schema;
93
- params.push((builder) => builder.appendProperty({
94
- name: 'body',
95
- documentation: body.description,
96
- type: schema ? (builder) => builder.appendModelUsage(ctx.input.models[schema.id]) : this.getAnyType(ctx),
97
- isOptional: !body.required,
117
+ type.members.push(ast_1.ts.property('body', {
118
+ doc: ast_1.ts.doc({ description: body.description }),
119
+ type: schema ? (b) => b.appendModelUsage(ctx.input.models[schema.id]) : this.getAnyType(ctx),
120
+ optional: !body.required,
98
121
  }));
99
122
  }
100
- builder.appendTypeDeclaration({
101
- name: this.getEndpointParamsTypeName(ctx, endpoint),
102
- documentation: `Parameters for operation ${this.getEndpointMethodName(ctx, endpoint)}`,
103
- type: (builder) => builder.appendCodeBlock(...params),
123
+ return ast_1.ts.typeAlias(this.getEndpointParamsTypeName(ctx, endpoint), type, {
124
+ doc: ast_1.ts.doc({ description: `Parameters for operation ${this.getEndpointMethodName(ctx, endpoint)}` }),
104
125
  });
105
126
  }
106
- generateClass(ctx, builder) {
107
- builder.appendClass(this.getClassOptions(ctx));
108
- }
109
- generateClassContent(ctx, builder) {
110
- builder
111
- .append((builder) => this.generateConstructor(ctx, builder))
112
- .forEach(ctx.service.endpoints, (builder, endpoint) => builder.ensurePreviousLineEmpty().append((builder) => this.generateEndpoint(ctx, builder, endpoint)));
113
- }
114
- generateConstructor(ctx, builder) {
115
- builder.appendConstructor(this.getConstructorOptions(ctx));
116
- }
117
- generateConstructorContent(ctx, builder) {
118
- builder.appendLine('super(config, http);');
119
- }
120
- generateEndpoint(ctx, builder, endpoint) {
121
- builder
122
- .append((builder) => this.generateEndpointPathProperty(ctx, builder, endpoint))
123
- .ensurePreviousLineEmpty()
124
- .append((builder) => this.generateEndpointResponseMethod(ctx, builder, endpoint))
125
- .ensurePreviousLineEmpty()
126
- .append((builder) => this.generateEndpointMethod(ctx, builder, endpoint));
127
- }
128
- generateEndpointPathProperty(ctx, builder, endpoint) {
129
- builder.appendProperty(this.getEndpointPathPropertyOptions(ctx, endpoint));
130
- }
131
- generateEndpointResponseMethod(ctx, builder, endpoint) {
132
- builder.appendMethod(this.getEndpointResponseMethodOptions(ctx, endpoint));
133
- }
134
- generateEndpointResponseMethodContent(ctx, builder, endpoint) {
135
- var _a, _b;
136
- builder
137
- .append('const rb = new ')
138
- .appendExternalTypeUsage(this.getRequestBuilderType(ctx))
139
- .appendParameters('this.rootUrl', `${this.getServiceClassName(ctx)}.${this.getEndpointPathPropertyName(ctx, endpoint)}`, this.toStringLiteral(ctx, endpoint.method))
140
- .appendLine(';');
141
- if (this.hasEndpointParams(ctx, endpoint)) {
142
- builder.append('if (params) ').appendCodeBlock((builder) => builder
143
- .forEach(endpoint.parameters.filter((x) => x.target === 'path' || x.target === 'query' || x.target === 'header'), (builder, parameter) => builder
144
- .append('rb.', parameter.target)
145
- .appendParameters(this.toStringLiteral(ctx, parameter.name), `params.${(0, core_1.toCasing)(parameter.name, 'camel')}`, (builder) => builder.appendObjectLiteral(parameter.style !== undefined
146
- ? `style: ${this.toStringLiteral(ctx, parameter.style)}`
147
- : undefined, parameter.explode !== undefined ? `explode: ${parameter.explode ? 'true' : 'false'}` : undefined))
148
- .appendLine(';'))
149
- .if(endpoint.requestBody !== undefined, (builder) => {
150
- var _a, _b, _c;
151
- return builder
152
- .append('rb.body')
153
- .appendParameters('params.body', this.toStringLiteral(ctx, (_c = (_b = (_a = endpoint.requestBody) === null || _a === void 0 ? void 0 : _a.content[0]) === null || _b === void 0 ? void 0 : _b.type) !== null && _c !== void 0 ? _c : 'application/json'))
154
- .appendLine(';');
155
- }));
156
- }
157
- const response = this.getEndpointSuccessResponse(ctx, endpoint);
158
- const accept = (_b = (_a = response === null || response === void 0 ? void 0 : response.contentOptions[0]) === null || _a === void 0 ? void 0 : _a.type) !== null && _b !== void 0 ? _b : '*/*';
159
- const responseType = accept.includes('json') ? 'json' : 'text';
160
- builder
161
- .ensurePreviousLineEmpty()
162
- .append('this.http.request')
163
- .appendParameters((builder) => builder
164
- .append('rb.build')
165
- .appendParameters((builder) => builder.appendObjectLiteral(`responseType: ${this.toStringLiteral(ctx, responseType)}`, `accept: ${this.toStringLiteral(ctx, accept)}`, 'context: context')))
166
- .append('.pipe')
167
- .appendParameters((builder) => builder.appendExternalTypeUsage(this.rxjsFilterType).appendParameters((builder) => builder.appendFunction({
168
- parameters: ['r: any'],
169
- body: (builder) => builder.append('r instanceof ').appendExternalTypeUsage(this.httpResponseType),
170
- singleLine: true,
171
- })), (builder) => builder.appendExternalTypeUsage(this.rxjsMapType).appendParameters((builder) => {
172
- var _a;
173
- return builder.appendFunction({
174
- parameters: [{ name: 'r', type: this.httpResponseType, genericArguments: ['any'] }],
175
- body: ((_a = response === null || response === void 0 ? void 0 : response.contentOptions) === null || _a === void 0 ? void 0 : _a[0])
176
- ? (builder) => builder
177
- .append('r as ')
178
- .appendExternalTypeUsage(this.getStrictHttpResponseType(ctx))
179
- .appendGenericArguments((builder) => this.generateEndpointSuccessResponseSchema(ctx, builder, endpoint))
180
- : (builder) => builder
181
- .parenthesize('()', (builder) => builder
182
- .append('r as ')
183
- .appendExternalTypeUsage(this.httpResponseType)
184
- .appendGenericArguments('any'))
185
- .append('.clone')
186
- .appendParameters((builder) => builder.appendObjectLiteral('body: undefined'))
187
- .append(' as ')
188
- .appendExternalTypeUsage(this.getStrictHttpResponseType(ctx))
189
- .appendGenericArguments('void'),
190
- singleLine: true,
191
- });
192
- }))
193
- .appendLine(';');
194
- }
195
- generateEndpointMethod(ctx, builder, endpoint) {
196
- builder.appendMethod(this.getEndpointMethodOptions(ctx, endpoint));
197
- }
198
- generateEndpointMethodContent(ctx, builder, endpoint) {
199
- builder
200
- .append('return this.', this.getEndpointResponseMethodName(ctx, endpoint))
201
- .appendParameters(this.hasEndpointParams(ctx, endpoint) ? 'params' : undefined, 'context')
202
- .append('.pipe')
203
- .appendParameters((builder) => builder
204
- .appendExternalTypeUsage(this.rxjsMapType)
205
- .append('((r: ')
206
- .appendExternalTypeUsage(this.getStrictHttpResponseType(ctx))
207
- .appendGenericArguments((builder) => this.generateEndpointSuccessResponseSchema(ctx, builder, endpoint))
208
- .append(') => r.body as ')
209
- .append((builder) => this.generateEndpointSuccessResponseSchema(ctx, builder, endpoint))
210
- .append(')'))
211
- .appendLine(';');
212
- }
213
- getClassOptions(ctx) {
214
- return {
215
- name: this.getServiceClassName(ctx),
216
- documentation: ctx.service.description,
217
- annotations: [
218
- {
219
- name: 'Injectable',
220
- module: '@angular/core',
221
- args: [(builder) => builder.appendObjectLiteral(`providedIn: ${this.toStringLiteral(ctx, 'root')}`)],
222
- },
127
+ getClass(ctx) {
128
+ return ast_1.ts.class(this.getServiceClassName(ctx), {
129
+ doc: ast_1.ts.doc({ description: ctx.service.description }),
130
+ decorators: [ast_1.ts.decorator(ast_1.ts.refs.angular.injectable(), [ast_1.ts.toNode({ providedIn: 'root' })])],
131
+ export: true,
132
+ extends: ctx.refs.apiBaseService(),
133
+ members: [
134
+ ...ctx.service.endpoints.map((e) => ast_1.ts.property(this.getEndpointPathPropertyName(ctx, e), {
135
+ accessModifier: 'private',
136
+ static: true,
137
+ readonly: true,
138
+ value: ast_1.ts.string(e.path),
139
+ })),
140
+ ...ctx.service.endpoints.map((e) => this.getEndpointMethod(ctx, e)),
223
141
  ],
224
- extends: (builder) => builder.appendExternalTypeUsage(this.getBaseServiceType(ctx)),
225
- body: (builder) => this.generateClassContent(ctx, builder),
226
- };
142
+ });
227
143
  }
228
- getConstructorOptions(ctx) {
229
- return {
144
+ getEndpointMethod(ctx, endpoint) {
145
+ var _a, _b, _c, _d;
146
+ const hasParams = this.hasEndpointParams(ctx, endpoint);
147
+ const paramsOptional = !endpoint.parameters.some((p) => p.required) && !((_a = endpoint.requestBody) === null || _a === void 0 ? void 0 : _a.required);
148
+ const returnType = ast_1.ts.refs.promise([
149
+ ast_1.ts.reference(this.getResponseModelName(ctx, endpoint), this.getResponseModelFilePath(ctx)),
150
+ ]);
151
+ const accept = (_d = (_c = (_b = this.getEndpointSuccessResponse(ctx, endpoint)) === null || _b === void 0 ? void 0 : _b.contentOptions[0]) === null || _c === void 0 ? void 0 : _c.type) !== null && _d !== void 0 ? _d : '*/*';
152
+ const responseType = accept.includes('json') ? 'json' : 'text';
153
+ return ast_1.ts.method(this.getEndpointMethodName(ctx, endpoint), {
154
+ accessModifier: 'public',
230
155
  parameters: [
231
- { name: 'config', type: (builder) => builder.appendExternalTypeUsage(this.getApiConfigurationType(ctx)) },
232
- { name: 'http', type: (builder) => builder.appendExternalTypeUsage(this.httpClientType) },
156
+ hasParams
157
+ ? ast_1.ts.parameter('params', {
158
+ optional: paramsOptional,
159
+ type: ast_1.ts.reference(this.getEndpointParamsTypeName(ctx, endpoint)),
160
+ })
161
+ : null,
162
+ ast_1.ts.parameter('context', { optional: true, type: ast_1.ts.refs.angular.httpContext() }),
233
163
  ],
234
- body: (builder) => this.generateConstructorContent(ctx, builder),
235
- };
236
- }
237
- getEndpointPathPropertyOptions(ctx, endpoint) {
238
- return {
239
- name: this.getEndpointPathPropertyName(ctx, endpoint),
240
- documentation: ctx.config.exposePathProperties
241
- ? `Path part for operation ${this.getEndpointMethodName(ctx, endpoint)}`
242
- : undefined,
243
- isStatic: true,
244
- accessibility: ctx.config.exposePathProperties ? 'public' : 'protected',
245
- isReadonly: true,
246
- initializer: this.toStringLiteral(ctx, endpoint.path),
247
- };
248
- }
249
- getEndpointMethodParams(ctx, endpoint) {
250
- const params = [];
251
- if (this.hasEndpointParams(ctx, endpoint)) {
252
- params.push({
253
- name: 'params',
254
- type: this.getEndpointParamsTypeName(ctx, endpoint),
255
- });
256
- }
257
- params.push({
258
- name: 'context',
259
- isOptional: true,
260
- type: (builder) => builder.appendExternalTypeUsage(this.httpContextType),
164
+ returnType,
165
+ body: (0, core_1.appendValueGroup)([
166
+ (0, core_1.builderTemplate) `const rb = new ${ctx.refs.requestBuilder()}(this.rootUrl, ${this.getServiceClassName(ctx)}.${this.getEndpointPathPropertyName(ctx, endpoint)}, '${endpoint.method}');`,
167
+ hasParams
168
+ ? (b) => {
169
+ var _a;
170
+ return b.appendIf(paramsOptional, 'if (params) ').parenthesizeIf(paramsOptional, '{}', (0, core_1.appendValueGroup)([
171
+ ...endpoint.parameters
172
+ .filter((p) => p.target === 'path' || p.target === 'query' || p.target === 'header')
173
+ .map((p) => {
174
+ const options = ast_1.ts.object({
175
+ members: [
176
+ p.style !== undefined ? ast_1.ts.property('style', { value: ast_1.ts.string(p.style) }) : null,
177
+ p.explode !== undefined ? ast_1.ts.property('explode', { value: p.explode }) : null,
178
+ ],
179
+ });
180
+ return (0, core_1.builderTemplate) `rb.${p.target}(${ast_1.ts.string(p.name)}, params.${(0, core_1.toCasing)(p.name, ctx.config.propertyNameCasing)}, ${options});`;
181
+ }),
182
+ endpoint.requestBody
183
+ ? (0, core_1.builderTemplate) `rb.body(params.body, ${ast_1.ts.string((_a = endpoint.requestBody.content[0].type) !== null && _a !== void 0 ? _a : 'application/json')});`
184
+ : null,
185
+ ], '\n'), { multiline: true });
186
+ }
187
+ : null,
188
+ '',
189
+ (0, core_1.builderTemplate) `return ${ast_1.ts.refs.rxjs.firstValueFrom()}(${core_1.builderTemplate.indent `
190
+ this.http.request(rb.build({${core_1.builderTemplate.indent `
191
+ responseType: ${ast_1.ts.string(responseType)},
192
+ accept: ${ast_1.ts.string(accept)},
193
+ context,`}
194
+ })).pipe(${core_1.builderTemplate.indent `
195
+ ${ast_1.ts.refs.rxjs.filter()}((r: unknown) => r instanceof ${ast_1.ts.refs.angular.httpResponse.infer()}),
196
+ ${ast_1.ts.refs.rxjs.take()}(1),`}
197
+ )`}
198
+ ) as unknown as ${returnType};`,
199
+ ], '\n'),
261
200
  });
262
- return params;
263
- }
264
- generateEndpointSuccessResponseSchema(ctx, builder, endpoint) {
265
- var _a;
266
- const successResponse = this.getEndpointSuccessResponse(ctx, endpoint);
267
- const schema = (_a = successResponse === null || successResponse === void 0 ? void 0 : successResponse.contentOptions[0]) === null || _a === void 0 ? void 0 : _a.schema;
268
- if (schema) {
269
- const model = ctx.input.models[schema.id];
270
- if (model) {
271
- builder.appendModelUsage(model);
272
- }
273
- else {
274
- builder.append(this.getAnyType(ctx));
275
- }
276
- }
277
- else {
278
- builder.append('void');
279
- }
280
- }
281
- getEndpointResponseMethodOptions(ctx, endpoint) {
282
- return {
283
- name: this.getEndpointResponseMethodName(ctx, endpoint),
284
- accessibility: ctx.config.exposeResponseMethods ? 'public' : 'protected',
285
- documentation: ctx.config.exposeResponseMethods
286
- ? [
287
- endpoint.summary,
288
- endpoint.description,
289
- 'This method provides access to the full `HttpResponse`, allowing access to response headers.\n' +
290
- `To access only the response body, use \`${this.getEndpointMethodName(ctx, endpoint)}()\` instead.`,
291
- ]
292
- .filter((x) => x)
293
- .join('\n\n')
294
- : undefined,
295
- parameters: this.getEndpointMethodParams(ctx, endpoint),
296
- returnType: (builder) => builder
297
- .appendExternalTypeUsage(this.observableType)
298
- .appendGenericArguments((builder) => builder
299
- .appendExternalTypeUsage(this.getStrictHttpResponseType(ctx))
300
- .appendGenericArguments((builder) => this.generateEndpointSuccessResponseSchema(ctx, builder, endpoint))),
301
- body: (builder) => this.generateEndpointResponseMethodContent(ctx, builder, endpoint),
302
- };
303
- }
304
- getEndpointMethodOptions(ctx, endpoint) {
305
- return {
306
- name: this.getEndpointMethodName(ctx, endpoint),
307
- accessibility: 'public',
308
- documentation: [
309
- endpoint.summary,
310
- endpoint.description,
311
- ctx.config.exposeResponseMethods
312
- ? 'This method provides access only to the response body.\n' +
313
- `To access the full response (for headers, for example), \`${this.getEndpointResponseMethodName(ctx, endpoint)}()\` instead.`
314
- : undefined,
315
- ]
316
- .filter((x) => x)
317
- .join('\n\n'),
318
- parameters: this.getEndpointMethodParams(ctx, endpoint),
319
- returnType: ctx.config.clientMethodFlavor === 'response-handler'
320
- ? 'void'
321
- : (builder) => builder
322
- .appendExternalTypeUsage(this.observableType)
323
- .appendGenericArguments((builder) => this.generateEndpointSuccessResponseSchema(ctx, builder, endpoint)),
324
- body: (builder) => this.generateEndpointMethodContent(ctx, builder, endpoint),
325
- };
326
201
  }
327
202
  getEndpointSuccessResponse(ctx, endpoint) {
328
203
  var _a;
329
204
  return ((_a = endpoint.responses.find((x) => x.statusCode && x.statusCode >= 200 && x.statusCode < 300)) !== null && _a !== void 0 ? _a : endpoint.responses.find((x) => x.statusCode === undefined));
330
205
  }
331
206
  getServiceClassName(ctx) {
332
- return this.toTypeName(ctx, ctx.service.name);
207
+ return (0, core_1.toCasing)(ctx.service.name + '_Service', ctx.config.typeNameCasing);
333
208
  }
334
- hasEndpointParams(ctx, endpoint) {
335
- return endpoint.parameters.length > 0 || endpoint.requestBody !== undefined;
209
+ getResponseModelName(ctx, endpoint) {
210
+ return (0, core_1.toCasing)(`${this.getEndpointMethodName(ctx, endpoint)}ApiResponse`, ctx.config.typeNameCasing);
336
211
  }
337
212
  getEndpointParamsTypeName(ctx, endpoint) {
338
- return (0, core_1.toCasing)(this.getEndpointMethodName(ctx, endpoint), 'pascal') + 'Params';
213
+ return (0, core_1.toCasing)(this.getEndpointMethodName(ctx, endpoint) + '_Params', ctx.config.typeNameCasing);
339
214
  }
340
215
  getEndpointPathPropertyName(ctx, endpoint) {
341
- return this.getEndpointMethodName(ctx, endpoint) + 'Path';
216
+ return (0, core_1.toCasing)(this.getEndpointMethodName(ctx, endpoint) + '_Path', ctx.config.constantNameCasing);
342
217
  }
343
218
  getEndpointMethodName(ctx, endpoint) {
344
- return this.toMethodName(ctx, endpoint.name);
345
- }
346
- getEndpointResponseMethodName(ctx, endpoint) {
347
- return this.getEndpointMethodName(ctx, endpoint) + '$Response';
219
+ return (0, core_1.toCasing)(endpoint.name, ctx.config.functionNameCasing);
348
220
  }
349
221
  getServiceFilePath(ctx) {
350
222
  return (0, path_1.resolve)(ctx.config.outputDir, ctx.config.servicesDirPath, `${(0, core_1.toCasing)(ctx.service.name, ctx.config.fileNameCasing)}.ts`);
351
223
  }
352
- getResponseModelsFilePath(ctx) {
353
- var _a;
354
- return (0, path_1.resolve)(ctx.config.outputDir, (_a = ctx.config.responseModelsDirPath) !== null && _a !== void 0 ? _a : 'models/responses', `${(0, core_1.toCasing)(ctx.service.name, ctx.config.responseModelsFileNameCasing)}.ts`);
224
+ getResponseModelFilePath(ctx) {
225
+ return (0, path_1.resolve)(ctx.config.outputDir, ctx.config.responseModelsDirPath, `${(0, core_1.toCasing)(ctx.service.name, ctx.config.responseModelFileNameCasing)}.ts`);
226
+ }
227
+ hasEndpointParams(ctx, endpoint) {
228
+ return endpoint.parameters.length > 0 || endpoint.requestBody !== undefined;
355
229
  }
356
- getUtilsDirPath(ctx) {
357
- return (0, path_1.resolve)(ctx.config.outputDir, ctx.config.utilsDirPath);
230
+ getSchemaType(ctx, schema, fallback) {
231
+ const output = schema && ctx.input.models[schema.id];
232
+ if (!output)
233
+ return fallback !== null && fallback !== void 0 ? fallback : this.getAnyType(ctx);
234
+ return (b) => b.appendModelUsage(output);
358
235
  }
359
236
  }
360
237
  exports.DefaultTypeScriptAngularServiceGenerator = DefaultTypeScriptAngularServiceGenerator;