@goast/typescript 0.0.5 → 0.2.1

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 +258 -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 +8 -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 +133 -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 +23 -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 +9 -4
  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 +7 -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 +129 -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 +19 -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 +9 -4
  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 +4 -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 +28 -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 +55 -0
  208. package/types/lib/generators/services/easy-network-stub/refs.d.ts +63 -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 +7 -3
  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
@@ -0,0 +1,18 @@
1
+ import { TsNode } from '../node';
2
+ import { writeTsNode, writeTsNodes } from '../utils/write-ts-nodes';
3
+ export class TsTypeof extends TsNode {
4
+ constructor(options) {
5
+ super(options);
6
+ this.value = options.value;
7
+ }
8
+ onWrite(builder) {
9
+ builder.append('typeof ');
10
+ builder.append(this.inject.beforeValue);
11
+ writeTsNode(builder, this.value);
12
+ builder.append(this.inject.afterValue);
13
+ }
14
+ }
15
+ export const createTypeof = (value, options) => new TsTypeof(Object.assign(Object.assign({}, options), { value }));
16
+ export const tsTypeof = Object.assign(createTypeof, {
17
+ write: writeTsNodes,
18
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,40 @@
1
+ import { notNullish } from '@goast/core';
2
+ import { TsNode } from '../node';
3
+ import { writeTsNode, writeTsNodes } from '../utils/write-ts-nodes';
4
+ export class TsUnionType extends TsNode {
5
+ constructor(options) {
6
+ super(options);
7
+ this.types = options.types.filter(notNullish);
8
+ }
9
+ onWrite(builder) {
10
+ const types = this.types.length === 0 ? ['never'] : resolveNestedUnionTypes(this);
11
+ if (types.length === 1) {
12
+ writeTsNode(builder, types[0]);
13
+ }
14
+ else {
15
+ const multiline = types.length > 3;
16
+ if (multiline) {
17
+ builder.appendLine().append('| ');
18
+ }
19
+ builder.forEach(types, (b, t) => b.parenthesize('()', (b) => writeTsNode(b, t)), {
20
+ separator: multiline ? '\n| ' : ' | ',
21
+ });
22
+ }
23
+ }
24
+ }
25
+ const createUnionType = (types, options) => new TsUnionType(Object.assign(Object.assign({}, options), { types }));
26
+ export const tsUnionType = Object.assign(createUnionType, {
27
+ write: writeTsNodes,
28
+ });
29
+ function resolveNestedUnionTypes(node) {
30
+ const types = [];
31
+ for (const type of node.types) {
32
+ if (type instanceof TsUnionType) {
33
+ types.push(...resolveNestedUnionTypes(type));
34
+ }
35
+ else {
36
+ types.push(type);
37
+ }
38
+ }
39
+ return types;
40
+ }
@@ -0,0 +1,34 @@
1
+ import { TsNode } from '../node';
2
+ import { writeTsNode, writeTsNodes } from '../utils/write-ts-nodes';
3
+ export class TsVariable extends TsNode {
4
+ constructor(options) {
5
+ var _a, _b, _c, _d, _e;
6
+ super(options);
7
+ this.name = options.name;
8
+ this.doc = (_a = options.doc) !== null && _a !== void 0 ? _a : null;
9
+ this.type = (_b = options.type) !== null && _b !== void 0 ? _b : null;
10
+ this.value = (_c = options.value) !== null && _c !== void 0 ? _c : null;
11
+ this.export = (_d = options.export) !== null && _d !== void 0 ? _d : false;
12
+ this.readonly = (_e = options.readonly) !== null && _e !== void 0 ? _e : false;
13
+ }
14
+ onWrite(builder) {
15
+ if (this.export)
16
+ builder.append('export ');
17
+ builder.append(this.readonly ? 'const ' : 'let ');
18
+ builder.append(this.name);
19
+ if (this.type) {
20
+ builder.append(': ');
21
+ writeTsNode(builder, this.type);
22
+ }
23
+ if (this.value) {
24
+ builder.append(' = ');
25
+ writeTsNode(builder, this.value);
26
+ }
27
+ builder.append(';');
28
+ builder.appendLine();
29
+ }
30
+ }
31
+ const createVariable = (name, options) => new TsVariable(Object.assign(Object.assign({}, options), { name }));
32
+ export const tsVariable = Object.assign(createVariable, {
33
+ write: writeTsNodes,
34
+ });
@@ -0,0 +1,9 @@
1
+ import { tsReference } from '../nodes/reference';
2
+ // @angular/core
3
+ export const inject = tsReference.factory('inject', '@angular/core');
4
+ export const injectable = tsReference.factory('Injectable', '@angular/core');
5
+ export const provider = tsReference.factory('Provider', '@angular/core');
6
+ // @angular/common/http
7
+ export const httpClient = tsReference.factory('HttpClient', '@angular/common/http');
8
+ export const httpContext = tsReference.factory('HttpContext', '@angular/common/http');
9
+ export const httpResponse = tsReference.genericFactory('HttpResponse', '@angular/common/http');
@@ -0,0 +1,5 @@
1
+ import { tsReference } from '../nodes/reference';
2
+ export const easyNetworkStub = tsReference.factory('EasyNetworkStub', 'easy-network-stub');
3
+ export const httpMethod = tsReference.factory('HttpMethod', 'easy-network-stub');
4
+ export const routeResponseCallback = tsReference.genericFactory('RouteResponseCallback', 'easy-network-stub');
5
+ export const errorResponse = tsReference.genericFactory('ErrorResponse', 'easy-network-stub');
@@ -0,0 +1,7 @@
1
+ import * as easyNetworkStub_1 from './easy-network-stub';
2
+ export { easyNetworkStub_1 as easyNetworkStub };
3
+ import * as angular_1 from './angular';
4
+ export { angular_1 as angular };
5
+ import * as rxjs_1 from './rxjs';
6
+ export { rxjs_1 as rxjs };
7
+ export * from './typescript';
@@ -0,0 +1,6 @@
1
+ import { tsReference } from '../nodes/reference';
2
+ export const observable = tsReference.factory('Observable', 'rxjs');
3
+ export const firstValueFrom = tsReference.factory('firstValueFrom', 'rxjs');
4
+ export const filter = tsReference.factory('filter', 'rxjs');
5
+ export const map = tsReference.factory('map', 'rxjs');
6
+ export const take = tsReference.factory('take', 'rxjs');
@@ -0,0 +1,30 @@
1
+ import { tsReference } from '../nodes/reference';
2
+ export const any = tsReference.factory('any');
3
+ export const unknown = tsReference.factory('unknown');
4
+ export const void_ = tsReference.factory('void');
5
+ export const never = tsReference.factory('never');
6
+ export const number = tsReference.factory('number');
7
+ export const string = tsReference.factory('string');
8
+ export const boolean = tsReference.factory('boolean');
9
+ export const bigint = tsReference.factory('bigint');
10
+ export const symbol = tsReference.factory('symbol');
11
+ export const object = tsReference.factory('object');
12
+ export const undefined_ = tsReference.factory('undefined');
13
+ export const null_ = tsReference.factory('null');
14
+ export const array = tsReference.genericFactory('Array');
15
+ export const record = tsReference.genericFactory('Record');
16
+ export const map = tsReference.genericFactory('Map');
17
+ export const set = tsReference.genericFactory('Set');
18
+ export const promise = tsReference.genericFactory('Promise');
19
+ export const readonlyArray = tsReference.genericFactory('ReadonlyArray');
20
+ export const readonly = tsReference.genericFactory('Readonly');
21
+ export const partial = tsReference.genericFactory('Partial');
22
+ export const required = tsReference.genericFactory('Required');
23
+ export const pick = tsReference.genericFactory('Pick');
24
+ export const omit = tsReference.genericFactory('Omit');
25
+ export const exclude = tsReference.genericFactory('Exclude');
26
+ export const extract = tsReference.genericFactory('Extract');
27
+ export const nonNullable = tsReference.genericFactory('NonNullable');
28
+ export const parameters = tsReference.genericFactory('Parameters');
29
+ export const returnType = tsReference.genericFactory('ReturnType');
30
+ export const instanceType = tsReference.genericFactory('InstanceType');
@@ -0,0 +1,15 @@
1
+ import { defaultOpenApiGeneratorConfig } from '@goast/core';
2
+ import { defaultTypeScriptGeneratorConfig } from '../../config';
3
+ import { TypeScriptFileBuilder } from '../../file-builder';
4
+ const tsConfigSymbol = Symbol();
5
+ export function getTypeScriptBuilderOptions(builder) {
6
+ if (builder instanceof TypeScriptFileBuilder) {
7
+ return builder.options;
8
+ }
9
+ if (tsConfigSymbol in builder.options) {
10
+ return builder.options[tsConfigSymbol];
11
+ }
12
+ const options = Object.assign(Object.assign(Object.assign({}, defaultOpenApiGeneratorConfig), defaultTypeScriptGeneratorConfig), builder.options);
13
+ builder[tsConfigSymbol] = options;
14
+ return options;
15
+ }
@@ -0,0 +1,20 @@
1
+ import { tsObject } from '../nodes/object';
2
+ import { tsProperty } from '../nodes/property';
3
+ import { tsString } from '../nodes/string';
4
+ import { tsTuple } from '../nodes/tuple';
5
+ export function toTsNode(value) {
6
+ if (Array.isArray(value)) {
7
+ return tsTuple(value.map((x) => toTsNode(x)));
8
+ }
9
+ if (typeof value === 'object' && value !== null) {
10
+ const result = tsObject();
11
+ for (const [k, v] of Object.entries(value)) {
12
+ result.members.push(tsProperty(k, { value: toTsNode(v) }));
13
+ }
14
+ return result;
15
+ }
16
+ if (value === null || value === undefined || typeof value === 'boolean' || typeof value === 'number') {
17
+ return String(value);
18
+ }
19
+ return tsString(String(value));
20
+ }
@@ -0,0 +1,7 @@
1
+ import { toArray, notNullish } from '@goast/core';
2
+ import { writeTsNodes } from './write-ts-nodes';
3
+ export function writeTsGenericParameters(builder, nodes) {
4
+ const filteredNodes = toArray(nodes).filter(notNullish);
5
+ const multiline = filteredNodes.length > 2;
6
+ builder.parenthesizeIf(filteredNodes.length > 0, '<>', (b) => writeTsNodes(b, filteredNodes, { separator: multiline ? ',\n' : ', ' }), { multiline });
7
+ }
@@ -0,0 +1,14 @@
1
+ import { notNullish, isAppendValue } from '@goast/core';
2
+ import { writeTsNode } from './write-ts-nodes';
3
+ import { tsDoc } from '../nodes/doc';
4
+ import { TsMethod } from '../nodes/method';
5
+ import { TsProperty } from '../nodes/property';
6
+ export function writeTsMembers(builder, members, options) {
7
+ const filteredMembers = members.filter(notNullish);
8
+ builder.forEach(filteredMembers, (b, m, i) => b.if(() => !(m instanceof TsProperty && tsDoc.isEmpty(m.doc) && m.decorators.length === 0) &&
9
+ !(m instanceof TsMethod && !m.body && tsDoc.isEmpty(m.doc) && m.decorators.length === 0) &&
10
+ !isAppendValue(m), (b) => b
11
+ .if(i > 0 || !!(options === null || options === void 0 ? void 0 : options.alreadyHasMembers), (b) => b.ensurePreviousLineEmpty())
12
+ .append((b) => writeTsNode(b, m))
13
+ .if(i < filteredMembers.length - 1, (b) => b.ensurePreviousLineEmpty()), (b) => b.append((b) => writeTsNode(b, m)).ensureCurrentLineEmpty()));
14
+ }
@@ -0,0 +1,19 @@
1
+ import { toArray, notNullish } from '@goast/core';
2
+ import { TsNode } from '../node';
3
+ export function writeTsNode(builder, node) {
4
+ if (node instanceof TsNode) {
5
+ node.write(builder);
6
+ }
7
+ else {
8
+ builder.append(node);
9
+ }
10
+ }
11
+ export function writeTsNodes(builder, nodes, options) {
12
+ const filteredNodes = toArray(nodes).filter(notNullish);
13
+ if (filteredNodes.length === 1) {
14
+ writeTsNode(builder, filteredNodes[0]);
15
+ }
16
+ else if (filteredNodes.length > 1) {
17
+ builder.forEach(filteredNodes, writeTsNode, { separator: options === null || options === void 0 ? void 0 : options.separator });
18
+ }
19
+ }
@@ -0,0 +1,10 @@
1
+ import { toArray, notNullish } from '@goast/core';
2
+ import { writeTsNodes } from './write-ts-nodes';
3
+ export function writeTsParameters(builder, nodes) {
4
+ const filteredNodes = toArray(nodes).filter(notNullish);
5
+ const multiline = filteredNodes.length > 2 ||
6
+ filteredNodes.some((p) => typeof p === 'object' && 'decorators' in p && Array.isArray(p.decorators) && p.decorators.length > 0);
7
+ builder.parenthesize('()', (b) => writeTsNodes(b, filteredNodes, { separator: multiline ? ',\n' : ', ' }), {
8
+ multiline,
9
+ });
10
+ }
package/esm/lib/config.js CHANGED
@@ -1,12 +1,14 @@
1
1
  export const defaultTypeScriptGeneratorConfig = {
2
- charsTreatedAsEmptyLine: ['{'],
3
2
  indent: { type: 'spaces', count: 2 },
4
3
  importModuleTransformer: 'omit-extension',
4
+ fileNameCasing: 'kebab',
5
5
  typeNameCasing: 'pascal',
6
- methodNameCasing: 'camel',
6
+ functionNameCasing: 'camel',
7
7
  propertyNameCasing: 'camel',
8
8
  enumValueNameCasing: 'pascal',
9
- constantCasing: { casing: 'snake', wordCasing: 'all-upper' },
9
+ constantNameCasing: { casing: 'snake', wordCasing: 'all-upper' },
10
+ genericParamNameCasing: { casing: 'pascal', prefix: 'T' },
11
+ paramNameCasing: 'camel',
10
12
  preferUnknown: true,
11
13
  useSingleQuotes: true,
12
14
  };
@@ -1,13 +1,24 @@
1
- import { SourceBuilder, notNullish } from '@goast/core';
1
+ import { dirname } from 'path';
2
+ import { ensureDirSync, writeFileSync } from 'fs-extra';
3
+ import { SourceBuilder, isAppendValue } from '@goast/core';
4
+ import { TsNode } from './ast/node';
5
+ import { defaultTypeScriptGeneratorConfig } from './config';
2
6
  import { ImportExportCollection } from './import-collection';
7
+ export function isTypeScriptAppendValue(value) {
8
+ return isAppendValue(value) || value instanceof TsNode;
9
+ }
3
10
  export class TypeScriptFileBuilder extends SourceBuilder {
4
11
  get options() {
5
12
  return super.options;
6
13
  }
7
14
  constructor(filePath, options) {
8
- super(options);
9
- this.imports = new ImportExportCollection();
15
+ super(options !== null && options !== void 0 ? options : defaultTypeScriptGeneratorConfig);
10
16
  this.filePath = filePath;
17
+ this.imports = new ImportExportCollection({
18
+ filePath: filePath,
19
+ importModuleTransformer: this.options.importModuleTransformer,
20
+ useSingleQuotes: this.options.useSingleQuotes,
21
+ });
11
22
  }
12
23
  addImport(name, moduleNameOrfilePath) {
13
24
  this.imports.addImport(name, moduleNameOrfilePath);
@@ -22,93 +33,23 @@ export class TypeScriptFileBuilder extends SourceBuilder {
22
33
  this.imports.clear();
23
34
  }
24
35
  toString(addPadding = true) {
25
- return new SourceBuilder(this.options)
26
- .append((builder) => this.imports.writeTo(builder, this.filePath, this.options.importModuleTransformer))
27
- .appendIf(addPadding, (builder) => builder.ensurePreviousLineEmpty())
28
- .append(super.toString())
29
- .appendIf(addPadding, (builder) => builder.ensureCurrentLineEmpty())
30
- .toString();
31
- }
32
- appendGenericArguments(...genericArguments) {
33
- genericArguments = genericArguments.filter(notNullish);
34
- if (genericArguments.length === 0)
35
- return this;
36
- const multiline = genericArguments.length > 1;
37
- return this.parenthesize('<>', (builder) => builder.appendSeparated(genericArguments, multiline ? ',\n' : ', '), {
38
- multiline,
39
- indent: multiline,
40
- });
41
- }
42
- appendParameter(parameter) {
43
- var _a;
44
- if (!parameter)
45
- return;
46
- if (typeof parameter === 'object') {
47
- return this.append(parameter.name)
48
- .appendIf(parameter.isOptional === true, '?')
49
- .appendIf(parameter.type !== undefined, ': ', (builder) => {
50
- if (!parameter.type)
51
- throw new Error('Unreachable error');
52
- return typeof parameter.type === 'object'
53
- ? builder.appendExternalTypeUsage(parameter.type)
54
- : builder.append(parameter.type);
55
- })
56
- .appendGenericArguments(...((_a = parameter.genericArguments) !== null && _a !== void 0 ? _a : []))
57
- .appendIf(parameter.defaultValue !== undefined, ' = ', parameter.defaultValue);
36
+ const builder = new SourceBuilder(this.options);
37
+ this.imports.writeTo(builder);
38
+ const baseString = super.toString();
39
+ if (baseString && addPadding) {
40
+ builder.ensurePreviousLineEmpty();
58
41
  }
59
- else {
60
- return this.append(parameter);
42
+ builder.append(baseString);
43
+ if (addPadding) {
44
+ builder.ensureCurrentLineEmpty();
61
45
  }
46
+ return builder.toString();
62
47
  }
63
- appendParameters(...parameters) {
64
- parameters = parameters.filter(notNullish);
65
- if (parameters.length === 0)
66
- return this.append('()');
67
- const multiline = parameters.length > 1;
68
- return this.parenthesize('()', (builder) => builder.forEach(parameters, (builder, param) => builder.appendParameter(param), {
69
- separator: multiline ? ',\n' : ', ',
70
- }), { multiline, indent: multiline });
71
- }
72
- appendObjectLiteral(...properties) {
73
- properties = properties.filter(notNullish);
74
- if (properties.length === 0)
75
- return this.append('{}');
76
- const multiline = properties.length > 1;
77
- return this.parenthesize('{}', (builder) => builder
78
- .appendIf(!multiline, ' ')
79
- .appendSeparated(properties, multiline ? ',\n' : ', ')
80
- .appendIf(!multiline, ' '), { multiline, indent: multiline });
81
- }
82
- appendArrayLiteral(...items) {
83
- items = items.filter(notNullish);
84
- if (items.length === 0)
85
- return this.append('[]');
86
- const multiline = items.length > 1;
87
- return this.parenthesize('[]', (builder) => builder.appendSeparated(items, multiline ? ',\n' : ', '), {
88
- multiline,
89
- indent: multiline,
90
- });
91
- }
92
- appendCodeBlock(...content) {
93
- return this.parenthesize('{}', (builder) => builder.append(...content).ensureCurrentLineEmpty(), {
94
- multiline: true,
95
- });
96
- }
97
- appendComment(style, comment) {
98
- if (!comment)
99
- return this;
100
- if (typeof comment === 'string') {
101
- comment = comment.trim();
48
+ appendSingle(value) {
49
+ super.appendSingle(value);
50
+ if (value instanceof TsNode) {
51
+ value.write(this);
102
52
  }
103
- return style === '//'
104
- ? this.appendLineWithLinePrefix('// ', comment)
105
- : this.appendLine(style === '/**/' ? '/*' : '/**')
106
- .appendWithLinePrefix(' * ', comment)
107
- .ensureCurrentLineEmpty()
108
- .appendLine(' */');
109
- }
110
- appendDocumentation(documentation) {
111
- return this.appendComment('/***/', documentation);
112
53
  }
113
54
  appendModelUsage(type) {
114
55
  this.append(type.component);
@@ -117,124 +58,25 @@ export class TypeScriptFileBuilder extends SourceBuilder {
117
58
  }
118
59
  return this;
119
60
  }
120
- appendExternalTypeUsage(type) {
121
- return this.append(type.name).addImport(type.name, type.module);
122
- }
123
- appendTypeDeclaration(options) {
124
- return this.appendDocumentation(options.documentation)
125
- .appendIf(options.omitExport !== true, 'export ')
126
- .append('type ')
127
- .append(options.name)
128
- .append(' = ')
129
- .append(options.type)
130
- .appendLine(';');
131
- }
132
- appendAnnotation(options) {
133
- var _a;
134
- if (options.module)
135
- this.addImport(options.name, options.module);
136
- return this.append(`@${options.name}`).appendParameters(...((_a = options.args) !== null && _a !== void 0 ? _a : []));
61
+ writeToFile(filePath) {
62
+ if (!filePath)
63
+ filePath = this.filePath;
64
+ if (!filePath)
65
+ throw new Error('File path is required');
66
+ ensureDirSync(dirname(filePath));
67
+ writeFileSync(filePath, this.toString());
137
68
  }
138
- appendAnnotations(annotations, separator) {
139
- if (annotations.length === 0)
140
- return this;
141
- return this.forEach(annotations, (builder, annotation) => builder.appendAnnotation(annotation).append(separator));
69
+ static generate(options) {
70
+ TypeScriptFileBuilder.tryGenerate(options);
142
71
  }
143
- appendClass(options) {
144
- var _a;
145
- return this.appendComment('/***/', options.documentation)
146
- .appendAnnotations((_a = options.annotations) !== null && _a !== void 0 ? _a : [], '\n')
147
- .appendIf(options.omitExport !== true, 'export ')
148
- .appendIf(options.isAbstract === true, 'abstract ')
149
- .append('class ')
150
- .append(options.name)
151
- .indent((builder) => {
152
- var _a;
153
- return builder
154
- .appendGenericArguments(...((_a = options === null || options === void 0 ? void 0 : options.genericArguments) !== null && _a !== void 0 ? _a : []))
155
- .appendIf(options.extends !== undefined, '\nextends ', options.extends)
156
- .appendIf(options.implements !== undefined && options.implements.length > 0, ' implements ', (builder) => { var _a; return builder.appendSeparated((_a = options.implements) !== null && _a !== void 0 ? _a : [], ', '); });
157
- })
158
- .append(options.extends || (options.implements !== undefined && options.implements.length > 0) ? '\n' : ' ')
159
- .appendCodeBlock(options.body)
160
- .appendLine();
161
- }
162
- appendConstructor(options) {
163
- var _a, _b;
164
- return this.appendComment('/***/', options.documentation)
165
- .appendAnnotations((_a = options.annotations) !== null && _a !== void 0 ? _a : [], '\n')
166
- .append('constructor')
167
- .appendParameters(...((_b = options === null || options === void 0 ? void 0 : options.parameters) !== null && _b !== void 0 ? _b : []))
168
- .append(' ')
169
- .appendCodeBlock(options.body)
170
- .appendLine();
171
- }
172
- appendMethod(options) {
173
- var _a, _b, _c;
174
- return this.appendComment('/***/', options.documentation)
175
- .appendAnnotations((_a = options.annotations) !== null && _a !== void 0 ? _a : [], '\n')
176
- .appendIf(options.accessibility !== undefined, options.accessibility, ' ')
177
- .appendIf(options.isAbstract === true, 'abstract ')
178
- .appendIf(options.isStatic === true, 'static ')
179
- .appendIf(options.isAsync === true, 'async ')
180
- .append(options.name)
181
- .appendGenericArguments(...((_b = options === null || options === void 0 ? void 0 : options.genericArguments) !== null && _b !== void 0 ? _b : []))
182
- .appendParameters(...((_c = options === null || options === void 0 ? void 0 : options.parameters) !== null && _c !== void 0 ? _c : []))
183
- .appendIf(options.returnType !== undefined, ': ', options.returnType)
184
- .append(' ')
185
- .appendCodeBlock(options.body)
186
- .appendLine();
187
- }
188
- appendProperty(options) {
189
- var _a, _b, _c, _d, _e;
190
- if (options.kind === 'getter' || options.kind === 'setter' || options.kind === 'getter-setter') {
191
- if (options.kind === 'getter-setter' || options.kind === 'getter') {
192
- this.appendComment('/***/', options.documentation)
193
- .appendAnnotations([...((_a = options.annotations) !== null && _a !== void 0 ? _a : []), ...((_b = options.getterAnnotations) !== null && _b !== void 0 ? _b : [])], '\n')
194
- .appendIf(options.accessibility !== undefined, options.accessibility, ' ')
195
- .appendIf(options.isAbstract === true, 'abstract ')
196
- .appendIf(options.isStatic === true, 'static ')
197
- .append('get ', options.name, '()')
198
- .appendIf(options.type !== undefined, ': ', options.type)
199
- .if(options.isAbstract === true, (builder) => builder.append(';'), (builder) => builder.append(' ').appendCodeBlock(options.getter))
200
- .ensureCurrentLineEmpty();
201
- }
202
- if (options.kind === 'getter-setter' || options.kind === 'setter') {
203
- this.appendComment('/***/', options.documentation)
204
- .appendAnnotations([...((_c = options.annotations) !== null && _c !== void 0 ? _c : []), ...((_d = options.setterAnnotations) !== null && _d !== void 0 ? _d : [])], '\n')
205
- .appendIf(options.accessibility !== undefined, options.accessibility, ' ')
206
- .appendIf(options.isAbstract === true, 'abstract ')
207
- .appendIf(options.isStatic === true, 'static ')
208
- .append('set ', options.name)
209
- .parenthesize('()', (builder) => builder.append('value: ', options.type))
210
- .if(options.isAbstract === true, (builder) => builder.append(';'), (builder) => builder.append(' ').appendCodeBlock(options.setter))
211
- .ensureCurrentLineEmpty();
212
- }
213
- return this;
72
+ static tryGenerate({ filePath, generator, options, logName, }) {
73
+ if (!filePath)
74
+ return;
75
+ if (logName) {
76
+ console.log(`Generating ${logName} to ${filePath}...`);
214
77
  }
215
- return this.appendComment('/***/', options.documentation)
216
- .appendAnnotations((_e = options.annotations) !== null && _e !== void 0 ? _e : [], '\n')
217
- .appendIf(options.accessibility !== undefined, options.accessibility, ' ')
218
- .appendIf(options.isAbstract === true, 'abstract ')
219
- .appendIf(options.isStatic === true, 'static ')
220
- .appendIf(options.isReadonly === true, 'readonly ')
221
- .append(options.name)
222
- .appendIf(options.isOptional === true, '?')
223
- .appendIf(options.type !== undefined, ': ', options.type)
224
- .appendIf(options.initializer !== undefined, ' = ', options.initializer)
225
- .appendLine(';');
226
- }
227
- appendFunction(options) {
228
- var _a, _b;
229
- const kind = (_a = options.kind) !== null && _a !== void 0 ? _a : 'arrow-function';
230
- return this.appendIf(kind === 'arrow-function' && !!options.name, 'const ', options.name, ' = ')
231
- .appendIf(options.isAsync === true, 'async ')
232
- .appendIf(kind === 'function', 'function')
233
- .appendIf(kind === 'function' && !!options.name, ' ', options.name)
234
- .appendParameters(...((_b = options === null || options === void 0 ? void 0 : options.parameters) !== null && _b !== void 0 ? _b : []))
235
- .appendIf(options.returnType !== undefined, ': ', options.returnType)
236
- .append(' ')
237
- .appendIf(kind === 'arrow-function', '=> ')
238
- .parenthesizeIf(kind === 'function' || options.singleLine !== true, '{}', (builder) => builder.append(options.body), { multiline: true });
78
+ const builder = new TypeScriptFileBuilder(filePath, options);
79
+ generator(builder);
80
+ builder.writeToFile();
239
81
  }
240
82
  }
@@ -1,22 +1,6 @@
1
- import { toCasing } from '@goast/core';
2
- import { toTypeScriptPropertyName, toTypeScriptStringLiteral } from '../utils';
1
+ import { ts } from '../ast';
3
2
  export class TypeScriptFileGenerator {
4
3
  getAnyType(context) {
5
- return context.config.preferUnknown ? 'unknown' : 'any';
6
- }
7
- toTypeName(context, name) {
8
- return toCasing(name, context.config.typeNameCasing);
9
- }
10
- toMethodName(context, name) {
11
- return toTypeScriptPropertyName(toCasing(name, context.config.methodNameCasing), context.config.useSingleQuotes);
12
- }
13
- toPropertyName(context, name, keepCasing = false) {
14
- return toTypeScriptPropertyName(keepCasing ? name : toCasing(name, context.config.propertyNameCasing), context.config.useSingleQuotes);
15
- }
16
- toEnumValueName(context, name) {
17
- return toTypeScriptPropertyName(toCasing(name, context.config.enumValueNameCasing), context.config.useSingleQuotes);
18
- }
19
- toStringLiteral(context, text) {
20
- return toTypeScriptStringLiteral(text, context.config.useSingleQuotes);
4
+ return context.config.preferUnknown ? ts.refs.unknown() : ts.refs.any();
21
5
  }
22
6
  }
@@ -2,3 +2,4 @@ export * from './file-generator';
2
2
  export * from './models';
3
3
  export * from './services/angular-services';
4
4
  export * from './services/fetch-clients';
5
+ export * from './services/easy-network-stub';