@goast/typescript 0.0.4 → 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 +126 -180
  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 +128 -182
  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 +11 -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 -9
  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,6 +1,6 @@
1
- import { dirname, resolve } from 'path';
2
- import { ensureDirSync, writeFileSync } from 'fs-extra';
3
- import { getEndpointUrlPreview, notNullish, toCasing } from '@goast/core';
1
+ import { resolve } from 'path';
2
+ import { toCasing, appendValueGroup, builderTemplate as s, } from '@goast/core';
3
+ import { ts } from '../../../ast';
4
4
  import { TypeScriptFileBuilder } from '../../../file-builder';
5
5
  import { TypeScriptFileGenerator } from '../../file-generator';
6
6
  export class DefaultTypeScriptFetchClientGenerator extends TypeScriptFileGenerator {
@@ -10,204 +10,145 @@ export class DefaultTypeScriptFetchClientGenerator extends TypeScriptFileGenerat
10
10
  if (this.shouldGenerateInterface(ctx)) {
11
11
  const filePath = this.getInterfaceFilePath(ctx);
12
12
  const name = this.getInterfaceName(ctx);
13
- console.log(`Generating interface ${name} in ${filePath}...`);
14
- ensureDirSync(dirname(filePath));
15
- builder = new TypeScriptFileBuilder(filePath, ctx.config);
16
- this.generateInterface(ctx, builder);
17
- writeFileSync(filePath, builder.toString());
13
+ TypeScriptFileBuilder.generate({
14
+ logName: `interface ${name}`,
15
+ filePath,
16
+ options: ctx.config,
17
+ generator: (b) => b.append(this.getInterfaceFileContent(ctx)),
18
+ });
18
19
  result.interface = { filePath, component: name, imports: [{ kind: 'file', name, modulePath: filePath }] };
19
20
  }
20
21
  if (this.shouldGenerateClass(ctx)) {
21
22
  const filePath = this.getClassFilePath(ctx);
22
23
  const name = this.getClassName(ctx);
23
- console.log(`Generating class ${name} in ${filePath}...`);
24
- ensureDirSync(dirname(filePath));
25
- if (!builder || builder.filePath !== filePath) {
26
- builder = new TypeScriptFileBuilder(filePath, ctx.config);
27
- }
28
- this.generateDefaultOptions(ctx, builder);
29
- this.generateClass(ctx, builder);
30
- writeFileSync(filePath, builder.toString());
24
+ TypeScriptFileBuilder.generate({
25
+ logName: `class ${name}`,
26
+ filePath,
27
+ options: ctx.config,
28
+ generator: (b) => b.append(this.getClassFileContent(ctx)),
29
+ });
31
30
  result.class = { filePath, component: name, imports: [{ kind: 'file', name, modulePath: filePath }] };
32
31
  }
33
32
  return result;
34
33
  }
35
- generateInterface(ctx, builder) {
36
- builder
37
- .ensurePreviousLineEmpty()
38
- .append((builder) => this.generateInterfaceDocumentation(ctx, builder))
39
- .ensureCurrentLineEmpty()
40
- .append((builder) => this.generateInterfaceSignature(ctx, builder))
41
- .append(' ')
42
- .parenthesize('{}', (builder) => this.generateInterfaceContent(ctx, builder))
43
- .appendLine();
44
- }
45
- generateInterfaceDocumentation(ctx, builder) {
46
- if (ctx.service.description) {
47
- builder.appendLine('/**').appendLineWithLinePrefix(' *', ctx.service.description).appendLine(' */');
48
- }
34
+ // #region Interface
35
+ getInterfaceFileContent(ctx) {
36
+ return appendValueGroup([this.getInterface(ctx)], '\n');
49
37
  }
50
- generateInterfaceSignature(ctx, builder) {
51
- builder.append('export interface ').append(this.getInterfaceName(ctx));
38
+ getInterface(ctx) {
39
+ return ts.interface(this.getInterfaceName(ctx), {
40
+ doc: ts.doc({ description: ctx.service.description }),
41
+ export: true,
42
+ members: ctx.service.endpoints.map((endpoint) => this.getInterfaceEndpointMethod(ctx, endpoint)),
43
+ });
52
44
  }
53
- generateInterfaceContent(ctx, builder) {
54
- builder.forEach(ctx.service.endpoints, (builder, endpoint) => this.generateInterfaceServiceMethod(ctx, builder, endpoint));
45
+ getInterfaceEndpointMethod(ctx, endpoint) {
46
+ var _a, _b;
47
+ const params = endpoint.parameters.filter((x) => x.target === 'path' || x.target === 'query');
48
+ const bodySchema = (_b = (_a = endpoint.requestBody) === null || _a === void 0 ? void 0 : _a.content[0]) === null || _b === void 0 ? void 0 : _b.schema;
49
+ const responseSchema = this.getResponseSchema(ctx, endpoint);
50
+ return ts.method(toCasing(endpoint.name, ctx.config.methodCasing), {
51
+ doc: ts.doc({ description: endpoint.description }),
52
+ parameters: [
53
+ params.length > 0
54
+ ? ts.parameter('params', {
55
+ description: 'Parameters for the endpoint.',
56
+ type: ts.objectType({
57
+ members: params.map((x) => ts.property(toCasing(x.name, ctx.config.propertyNameCasing), {
58
+ type: this.getSchemaType(ctx, x.schema),
59
+ optional: !x.required,
60
+ })),
61
+ }),
62
+ })
63
+ : null,
64
+ bodySchema &&
65
+ ts.parameter('body', {
66
+ description: 'Body for the endpoint.',
67
+ type: this.getSchemaType(ctx, bodySchema),
68
+ }),
69
+ ],
70
+ returnType: ts.refs.promise([ctx.refs.typedResponse([this.getSchemaType(ctx, responseSchema, ts.refs.void_())])]),
71
+ });
55
72
  }
56
- generateInterfaceServiceMethod(ctx, builder, endpoint) {
57
- builder
58
- .ensurePreviousLineEmpty()
59
- .append((builder) => this.generateServiceMethodDocumentation(ctx, builder, endpoint))
60
- .ensureCurrentLineEmpty()
61
- .append((builder) => this.generateServiceMethodSignature(ctx, builder, endpoint))
62
- .appendLine(';');
73
+ // #endregion
74
+ // #region Class
75
+ getClassFileContent(ctx) {
76
+ return appendValueGroup([this.getDefaultOptionsConstant(ctx), this.getClass(ctx)], '\n');
63
77
  }
64
- generateDefaultOptions(ctx, builder) {
78
+ getDefaultOptionsConstant(ctx) {
65
79
  const baseUrl = ctx.service.endpoints
66
80
  .map((x) => { var _a, _b, _c; return (_c = (_b = (_a = x.$src) === null || _a === void 0 ? void 0 : _a.document.servers) === null || _b === void 0 ? void 0 : _b.find((x) => x.url)) === null || _c === void 0 ? void 0 : _c.url; })
67
81
  .find((x) => !!x);
68
- builder
69
- .ensurePreviousLineEmpty()
70
- .addImport('FetchClientOptions', this.getUtilPath(ctx, 'types.ts'))
71
- .append('export const ', this.getDefaultOptionsConstantName(ctx), ': FetchClientOptions = ')
72
- .parenthesize('{}', (builder) => builder.appendLineIf(notNullish(baseUrl), 'baseUrl: ', this.toStringLiteral(ctx, baseUrl !== null && baseUrl !== void 0 ? baseUrl : ''), ','), { indent: true, multiline: true });
73
- }
74
- generateClass(ctx, builder) {
75
- builder
76
- .ensurePreviousLineEmpty()
77
- .append((builder) => this.generateClassDocumentation(ctx, builder))
78
- .ensureCurrentLineEmpty()
79
- .append((builder) => this.generateClassSignature(ctx, builder))
80
- .append(' ')
81
- .parenthesize('{}', (builder) => this.generateClassContent(ctx, builder))
82
- .appendLine();
83
- }
84
- generateClassDocumentation(ctx, builder) {
85
- if (ctx.service.description) {
86
- builder.appendLine('/**').appendLineWithLinePrefix(' *', ctx.service.description).appendLine(' */');
87
- }
88
- }
89
- generateClassSignature(ctx, builder) {
90
- builder
91
- .append('export class ')
92
- .append(this.getClassName(ctx))
93
- .appendIf(this.shouldGenerateInterface(ctx), (builder) => builder
94
- .addImport(this.getInterfaceName(ctx), this.getInterfaceFilePath(ctx))
95
- .append(' implements ', this.getInterfaceName(ctx)));
96
- }
97
- generateClassContent(ctx, builder) {
98
- builder
99
- .append((builder) => this.generateClassFields(ctx, builder))
100
- .append((builder) => this.generateClassConstructor(ctx, builder))
101
- .forEach(ctx.service.endpoints, (builder, endpoint) => this.generateClassServiceMethod(ctx, builder, endpoint));
102
- }
103
- generateClassFields(ctx, builder) {
104
- builder.ensureCurrentLineEmpty().appendLine('public options: FetchClientOptions;');
105
- }
106
- generateClassConstructor(ctx, builder) {
107
- builder
108
- .ensurePreviousLineEmpty()
109
- .append('constructor(options?: Partial<FetchClientOptions>)')
110
- .parenthesize('{}', (builder) => this.generateClassConstructorContent(ctx, builder), {
111
- indent: true,
112
- multiline: true,
82
+ return ts.variable(this.getDefaultOptionsConstantName(ctx), {
83
+ export: true,
84
+ readonly: true,
85
+ type: ctx.refs.fetchClientOptions(),
86
+ value: ts.object({
87
+ members: [baseUrl && ts.property('baseUrl', { value: ts.string(baseUrl) })],
88
+ }),
113
89
  });
114
90
  }
115
- generateClassConstructorContent(ctx, builder) {
116
- builder.appendLine('this.options = { ...', this.getDefaultOptionsConstantName(ctx), ', ...options };');
117
- }
118
- generateClassServiceMethod(ctx, builder, endpoint) {
119
- builder
120
- .ensurePreviousLineEmpty()
121
- .append((builder) => this.generateServiceMethodDocumentation(ctx, builder, endpoint))
122
- .ensureCurrentLineEmpty()
123
- .append((builder) => this.generateServiceMethodSignature(ctx, builder, endpoint))
124
- .append(' ')
125
- .parenthesize('{}', (builder) => this.generateServiceMethodContent(ctx, builder, endpoint), {
126
- indent: true,
127
- multiline: true,
128
- })
129
- .appendLine();
130
- }
131
- generateServiceMethodDocumentation(ctx, builder, endpoint) {
132
- var _a;
133
- const hasParams = endpoint.parameters.some((p) => p.target === 'path' || p.target === 'query') ||
134
- (!!endpoint.requestBody && ((_a = endpoint.requestBody) === null || _a === void 0 ? void 0 : _a.content.length) > 0);
135
- builder.appendComment('/***/', (builder) => {
136
- var _a;
137
- return builder
138
- .appendLine((_a = endpoint.description) !== null && _a !== void 0 ? _a : '[No description was provided by the API]')
139
- .appendLine(`@see ${getEndpointUrlPreview(endpoint)}`)
140
- .appendLineIf(hasParams, `@param params Parameters for the endpoint.`)
141
- .append(`@returns The response of the call to the endpoint.`);
91
+ getClass(ctx) {
92
+ return ts.class(this.getClassName(ctx), {
93
+ doc: ts.doc({ description: ctx.service.description }),
94
+ export: true,
95
+ implements: this.shouldGenerateInterface(ctx)
96
+ ? [ts.reference(this.getInterfaceName(ctx), this.getInterfaceFilePath(ctx))]
97
+ : undefined,
98
+ members: [
99
+ ts.property('options', {
100
+ doc: ts.doc({ description: 'Options for the fetch client.' }),
101
+ accessModifier: 'public',
102
+ type: ctx.refs.fetchClientOptions(),
103
+ }),
104
+ ts.constructor({
105
+ parameters: [
106
+ ts.constructorParameter('options', {
107
+ type: ts.refs.partial([ctx.refs.fetchClientOptions()]),
108
+ optional: true,
109
+ }),
110
+ ],
111
+ body: appendValueGroup([s `this.options = { ...${this.getDefaultOptionsConstantName(ctx)}, ...options };`], '\n'),
112
+ }),
113
+ ...ctx.service.endpoints.map((endpoint) => this.getServiceMethod(ctx, endpoint)),
114
+ ],
142
115
  });
143
116
  }
144
- generateServiceMethodSignature(ctx, builder, endpoint) {
145
- builder
146
- .append(toCasing(endpoint.name, ctx.config.methodCasing))
147
- .parenthesize('()', (builder) => this.generateServiceMethodParameters(ctx, builder, endpoint))
148
- .append(': ')
149
- .append((builder) => this.generateServiceMethodReturnValue(ctx, builder, endpoint));
150
- }
151
- generateServiceMethodParameters(ctx, builder, endpoint) {
152
- var _a, _b, _c;
153
- const params = endpoint.parameters.filter((x) => x.target === 'path' || x.target === 'query');
154
- const bodySchemaId = (_c = (_b = (_a = endpoint.requestBody) === null || _a === void 0 ? void 0 : _a.content[0]) === null || _b === void 0 ? void 0 : _b.schema) === null || _c === void 0 ? void 0 : _c.id;
155
- builder
156
- .appendLineIf(params.length > 0 && !!bodySchemaId)
157
- .if(params.length > 0, (builder) => builder
158
- .append('params: ')
159
- .parenthesize('{}', (builder) => builder.forEach(params, (builder, parameter) => {
160
- var _a;
161
- return builder.appendLine(this.toPropertyName(ctx, parameter.name), parameter.required ? ': ' : '?: ', this.getTypeName(ctx, builder, (_a = parameter.schema) === null || _a === void 0 ? void 0 : _a.id), ';');
162
- }), { indent: true, multiline: true }))
163
- .appendLineIf(params.length > 0 && !!bodySchemaId, ',')
164
- .appendIf(!!bodySchemaId, (builder) => builder.append(`body: ${this.getTypeName(ctx, builder, bodySchemaId)}`))
165
- .appendLineIf(params.length > 0 && !!bodySchemaId);
166
- }
167
- generateServiceMethodReturnValue(ctx, builder, endpoint) {
168
- var _a, _b, _c;
169
- const successResponse = (_a = endpoint.responses.find((x) => x.statusCode === 200)) !== null && _a !== void 0 ? _a : endpoint.responses.find((x) => x.statusCode && x.statusCode > 200 && x.statusCode < 300);
170
- const schema = (_c = (_b = successResponse === null || successResponse === void 0 ? void 0 : successResponse.contentOptions) === null || _b === void 0 ? void 0 : _b.find((x) => x.schema !== undefined)) === null || _c === void 0 ? void 0 : _c.schema;
171
- builder.append('Promise').parenthesize('<>', (builder) => this.generateTypedResponse(ctx, builder, schema));
172
- }
173
- generateTypedResponse(ctx, builder, schema) {
174
- builder
175
- .addImport('TypedResponse', this.getUtilPath(ctx, 'types.ts'))
176
- .append('TypedResponse')
177
- .parenthesize('<>', (builder) => builder.append(this.getTypeName(ctx, builder, schema === null || schema === void 0 ? void 0 : schema.id)));
178
- }
179
- generateServiceMethodContent(ctx, builder, endpoint) {
180
- builder
181
- .addImport('UrlBuilder', this.getUtilPath(ctx, 'url-builder.ts'))
182
- .appendLine('const url = new UrlBuilder(this.options.baseUrl)')
183
- .indent((builder) => builder
184
- .appendLine(`.withPath(${this.toStringLiteral(ctx, endpoint.path)})`)
185
- .forEach(endpoint.parameters.filter((x) => x.target === 'path' || x.target === 'query'), (builder, parameter) => builder
186
- .appendIf(parameter.target === 'path', `.withPathParam`)
187
- .appendIf(parameter.target === 'query', `.withQueryParam`)
188
- .parenthesize('()', `${this.toStringLiteral(ctx, parameter.name)}, params.${this.toPropertyName(ctx, parameter.name)}`)
189
- .appendLine())
190
- .appendLine('.build();'))
191
- .append('return (this.options.fetch ?? fetch)')
192
- .parenthesize('()', (builder) => builder.append('url, ').parenthesize('{}', (builder) => {
193
- var _a, _b;
194
- return builder
195
- .appendLine('method: ', this.toStringLiteral(ctx, toCasing(endpoint.method, 'all-upper')), ',')
196
- .appendLine('headers: this.options.headers,')
197
- .appendLineIf(!!((_b = (_a = endpoint.requestBody) === null || _a === void 0 ? void 0 : _a.content[0]) === null || _b === void 0 ? void 0 : _b.schema), 'body: JSON.stringify(body),');
198
- }, { indent: true, multiline: true }), { indent: false })
199
- .appendLine(' as ', (builder) => this.generateServiceMethodReturnValue(ctx, builder, endpoint), ';');
200
- }
201
- getTypeName(ctx, builder, schemaId) {
202
- if (!schemaId) {
203
- return this.getAnyType(ctx);
204
- }
205
- const modelInfo = ctx.input.models[schemaId];
206
- if (!modelInfo) {
207
- return this.getAnyType(ctx);
208
- }
209
- modelInfo.imports.forEach((x) => builder.addImport(x.name, x.modulePath));
210
- return modelInfo.component;
117
+ getServiceMethod(ctx, endpoint) {
118
+ var _a, _b;
119
+ const method = this.getInterfaceEndpointMethod(ctx, endpoint);
120
+ method.accessModifier = 'public';
121
+ method.body = appendValueGroup([
122
+ s `const url = new ${ctx.refs.urlBuilder()}(this.options.baseUrl)${s.indent `
123
+ .withPath(${ts.string(endpoint.path)})${(b) => b.forEach(endpoint.parameters, (b, p) => {
124
+ switch (p.target) {
125
+ case 'path':
126
+ b.append(s `\n.withPathParam(${ts.string(p.name)}, params.${toCasing(p.name, ctx.config.paramNameCasing)})`);
127
+ break;
128
+ case 'query':
129
+ b.append(s `\n.withQueryParam(${ts.string(p.name)}, params.${toCasing(p.name, ctx.config.paramNameCasing)})`);
130
+ break;
131
+ }
132
+ })}
133
+ .build();`}`,
134
+ s `const response = (this.options.fetch ?? fetch)(url, ${ts.object({
135
+ members: [
136
+ ts.property('method', { value: ts.string(toCasing(endpoint.method, 'all-upper')) }),
137
+ ts.property('headers', { value: 'this.options.headers' }),
138
+ ((_b = (_a = endpoint.requestBody) === null || _a === void 0 ? void 0 : _a.content[0]) === null || _b === void 0 ? void 0 : _b.schema) ? ts.property('body', { value: 'JSON.stringify(body)' }) : null,
139
+ ],
140
+ })});`,
141
+ s `Object.defineProperty(response, 'isVoidResponse', { value: ${this.getResponseSchema(ctx, endpoint) ? 'false' : 'true'} });`,
142
+ s `return response as unknown as ${method.returnType};`,
143
+ ], '\n');
144
+ return method;
145
+ }
146
+ // #endregion
147
+ getSchemaType(ctx, schema, fallback) {
148
+ const output = schema && ctx.input.models[schema.id];
149
+ if (!output)
150
+ return fallback !== null && fallback !== void 0 ? fallback : this.getAnyType(ctx);
151
+ return (b) => b.appendModelUsage(output);
211
152
  }
212
153
  shouldGenerateInterface(ctx) {
213
154
  return ctx.config.clientFileKind === 'interface' || ctx.config.clientFileKind === 'class-and-interface';
@@ -222,7 +163,7 @@ export class DefaultTypeScriptFetchClientGenerator extends TypeScriptFileGenerat
222
163
  return toCasing(ctx.service.name, ctx.config.classNameCasing);
223
164
  }
224
165
  getDefaultOptionsConstantName(ctx) {
225
- return toCasing(this.getClassName(ctx) + '-default-options', ctx.config.constantCasing);
166
+ return toCasing(this.getClassName(ctx) + '-default-options', ctx.config.constantNameCasing);
226
167
  }
227
168
  getInterfaceFilePath(ctx) {
228
169
  var _a, _b;
@@ -234,4 +175,9 @@ export class DefaultTypeScriptFetchClientGenerator extends TypeScriptFileGenerat
234
175
  getUtilPath(ctx, fileName) {
235
176
  return resolve(ctx.config.outputDir, ctx.config.utilsDirPath, fileName);
236
177
  }
178
+ getResponseSchema(ctx, endpoint) {
179
+ var _a, _b, _c;
180
+ const successResponse = (_a = endpoint.responses.find((x) => x.statusCode === 200)) !== null && _a !== void 0 ? _a : endpoint.responses.find((x) => x.statusCode && x.statusCode > 200 && x.statusCode < 300);
181
+ return (_c = (_b = successResponse === null || successResponse === void 0 ? void 0 : successResponse.contentOptions) === null || _b === void 0 ? void 0 : _b.find((x) => x.schema !== undefined)) === null || _c === void 0 ? void 0 : _c.schema;
182
+ }
237
183
  }
@@ -3,6 +3,7 @@ import { ensureDirSync, writeFileSync, copyFileSync, readdirSync } from 'fs-extr
3
3
  import { OpenApiServicesGenerationProviderBase, Factory } from '@goast/core';
4
4
  import { DefaultTypeScriptFetchClientGenerator } from './fetch-client-generator';
5
5
  import { defaultTypeScriptFetchClientsGeneratorConfig, } from './models';
6
+ import { getReferenceFactories } from './refs';
6
7
  import { TypeScriptFileBuilder } from '../../../file-builder';
7
8
  import { ImportExportCollection } from '../../../import-collection';
8
9
  export class TypeScriptClientsGenerator extends OpenApiServicesGenerationProviderBase {
@@ -19,7 +20,10 @@ export class TypeScriptClientsGenerator extends OpenApiServicesGenerationProvide
19
20
  };
20
21
  }
21
22
  buildContext(context, config) {
22
- return this.getProviderContext(context, config, defaultTypeScriptFetchClientsGeneratorConfig);
23
+ const providerContext = this.getProviderContext(context, config, defaultTypeScriptFetchClientsGeneratorConfig);
24
+ return Object.assign(providerContext, {
25
+ refs: getReferenceFactories(providerContext.config),
26
+ });
23
27
  }
24
28
  onGenerate(ctx) {
25
29
  this.copyUtilsFiles(ctx);
@@ -0,0 +1,13 @@
1
+ import { resolve } from 'path';
2
+ import { ts } from '../../../ast';
3
+ // See packages/typescript/assets/client/fetch for reference
4
+ export function getReferenceFactories(options) {
5
+ const utilsDirPath = resolve(options.outputDir, options.utilsDirPath);
6
+ const fetchClientUtilsPath = resolve(utilsDirPath, 'fetch-client.utils.ts');
7
+ return {
8
+ // fetch-client.utils.ts
9
+ typedResponse: ts.reference.genericFactory('TypedResponse', fetchClientUtilsPath),
10
+ fetchClientOptions: ts.reference.factory('FetchClientOptions', fetchClientUtilsPath),
11
+ urlBuilder: ts.reference.factory('UrlBuilder', fetchClientUtilsPath),
12
+ };
13
+ }
@@ -1,10 +1,16 @@
1
1
  import { extname } from 'path';
2
2
  import { StringBuilder } from '@goast/core';
3
+ import { defaultTypeScriptGeneratorConfig } from './config';
3
4
  import { getModulePathRelativeToFile } from './utils';
5
+ export const defaultImportExportCollectionOptions = {
6
+ importModuleTransformer: defaultTypeScriptGeneratorConfig.importModuleTransformer,
7
+ useSingleQuotes: defaultTypeScriptGeneratorConfig.useSingleQuotes,
8
+ };
4
9
  export class ImportExportCollection {
5
- constructor() {
10
+ constructor(options) {
6
11
  this._imports = new Map();
7
12
  this._exports = new Map();
13
+ this._options = Object.assign(Object.assign({}, defaultImportExportCollectionOptions), options);
8
14
  }
9
15
  get hasImports() {
10
16
  return this._imports.size > 0;
@@ -43,34 +49,26 @@ export class ImportExportCollection {
43
49
  this._imports.clear();
44
50
  this._exports.clear();
45
51
  }
46
- toString(options, filePath, importModuleTransformer) {
52
+ toString(options) {
47
53
  const builder = new StringBuilder(options);
48
- this.writeTo(builder, filePath, importModuleTransformer);
54
+ this.writeTo(builder);
49
55
  return builder.toString();
50
56
  }
51
- writeTo(builder, filePath, importModuleTransformer) {
52
- if (!filePath) {
53
- filePath = builder.filePath;
54
- }
55
- if (!importModuleTransformer) {
56
- importModuleTransformer = builder.options.importModuleTransformer;
57
- if (!importModuleTransformer) {
58
- throw new Error('importModuleTransformer is required');
59
- }
60
- }
57
+ writeTo(builder) {
58
+ const { filePath, importModuleTransformer, useSingleQuotes } = this._options;
61
59
  if (this._imports.size > 0) {
62
60
  const sortedImports = this.sortAndResolve(this._imports, filePath, importModuleTransformer);
63
- this.writeImportsExports(builder, 'import', sortedImports);
61
+ this.writeImportsExports(builder, 'import', sortedImports, { useSingleQuotes });
64
62
  }
65
63
  if (this._imports.size > 0 && this._exports.size > 0) {
66
64
  builder.appendLine();
67
65
  }
68
66
  if (this._exports.size > 0) {
69
67
  const sortedExports = this.sortAndResolve(this._exports, filePath, importModuleTransformer);
70
- this.writeImportsExports(builder, 'export', sortedExports);
68
+ this.writeImportsExports(builder, 'export', sortedExports, { useSingleQuotes });
71
69
  }
72
70
  }
73
- writeImportsExports(builder, keyword, data) {
71
+ writeImportsExports(builder, keyword, data, options) {
74
72
  const moduleData = [];
75
73
  const fileData = [];
76
74
  for (const x of data) {
@@ -81,14 +79,15 @@ export class ImportExportCollection {
81
79
  fileData.push(x);
82
80
  }
83
81
  }
82
+ const quote = options.useSingleQuotes ? "'" : '"';
84
83
  for (const [fromModule, _, names] of moduleData) {
85
- builder.appendLine(`${keyword} { ${names.join(', ')} } from '${fromModule}';`);
84
+ builder.appendLine(`${keyword} { ${names.join(', ')} } from ${quote}${fromModule}${quote};`);
86
85
  }
87
86
  if (moduleData.length > 0 && fileData.length > 0) {
88
87
  builder.appendLine();
89
88
  }
90
89
  for (const [fromModule, _, names] of fileData) {
91
- builder.appendLine(`${keyword} { ${names.join(', ')} } from '${fromModule}';`);
90
+ builder.appendLine(`${keyword} { ${names.join(', ')} } from ${quote}${fromModule}${quote};`);
92
91
  }
93
92
  }
94
93
  sortAndResolve(data, filePath, importModuleTransformer) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goast/typescript",
3
- "version": "0.0.4",
3
+ "version": "0.2.0",
4
4
  "repository": "https://github.com/MaSch0212/goast.git",
5
5
  "author": {
6
6
  "name": "Marc Schmidt (MaSch0212)",
@@ -9,11 +9,11 @@
9
9
  "license": "MIT",
10
10
  "type": "module",
11
11
  "dependencies": {
12
- "fs-extra": "^11.1.1",
13
- "node-fetch": "^2.6.11",
14
- "yaml": "^2.3.1",
15
- "@goast/core": "0.1.1",
16
- "tslib": "^2.3.0"
12
+ "fs-extra": "^11.2.0",
13
+ "node-fetch": "^2.7.0",
14
+ "yaml": "^2.4.1",
15
+ "@goast/core": "0.2.0",
16
+ "tslib": "2.6.2"
17
17
  },
18
18
  "module": "./esm/index.js",
19
19
  "main": "./cjs/index.js",
@@ -0,0 +1,38 @@
1
+ export { TsAccessModifier as AccessModifier } from './common';
2
+ export { TsNode as Node } from './node';
3
+ export { TsArgument as Argument, tsArgument as argument } from './nodes/argument';
4
+ export { TsArrayType as ArrayType, tsArrayType as arrayType } from './nodes/array-type';
5
+ export { TsArrowFunction as ArrowFunction, tsArrowFunction as arrowFunction } from './nodes/arrow-function';
6
+ export { TsCall as Call, tsCall as call } from './nodes/call';
7
+ export { TsClass as Class, tsClass as class } from './nodes/class';
8
+ export { TsConstructor as Constructor, tsConstructor as constructor } from './nodes/constructor';
9
+ export { TsConstructorParameter as ConstructorParameter, tsConstructorParameter as constructorParameter, } from './nodes/constructor-parameter';
10
+ export { TsDecorator as Decorator, tsDecorator as decorator } from './nodes/decorator';
11
+ export { TsDoc as Doc, tsDoc as doc } from './nodes/doc';
12
+ export { TsDocTag as DocTag, tsDocTag as docTag } from './nodes/doc-tag';
13
+ export { TsEnum as Enum, tsEnum as enum } from './nodes/enum';
14
+ export { TsEnumValue as EnumValue, tsEnumValue as enumValue } from './nodes/enum-value';
15
+ export { TsExport as Export, tsExport as export } from './nodes/export';
16
+ export { TsFunction as Function, tsFunction as function } from './nodes/function';
17
+ export { TsFunctionType as FunctionType, tsFunctionType as functionType } from './nodes/function-type';
18
+ export { TsGenericParameter as GenericParameter, tsGenericParameter as genericParameter, } from './nodes/generic-parameter';
19
+ export { TsIndexer as Indexer, tsIndexer as indexer } from './nodes/indexer';
20
+ export { TsInterface as Interface, tsInterface as interface } from './nodes/interface';
21
+ export { TsIntersectionType as IntersectionType, tsIntersectionType as intersectionType, } from './nodes/intersection-type';
22
+ export { TsLookupType as LookupType, tsLookupType as lookupType } from './nodes/lookup-type';
23
+ export { TsMethod as Method, tsMethod as method } from './nodes/method';
24
+ export { TsObject as Object, tsObject as object } from './nodes/object';
25
+ export { TsObjectType as ObjectType, tsObjectType as objectType } from './nodes/object-type';
26
+ export { TsParameter as Parameter, tsParameter as parameter } from './nodes/parameter';
27
+ export { TsProperty as Property, tsProperty as property } from './nodes/property';
28
+ export { TsReference as Reference, tsReference as reference } from './nodes/reference';
29
+ export { TsString as String, tsString as string } from './nodes/string';
30
+ export { TsTuple as Tuple, tsTuple as tuple } from './nodes/tuple';
31
+ export { TsTypeAlias as TypeAlias, tsTypeAlias as typeAlias } from './nodes/type-alias';
32
+ export { TsType as Type, TsValue as Value } from './nodes/types';
33
+ export { TsUnionType as UnionType, tsUnionType as unionType } from './nodes/union-type';
34
+ export { TsVariable as Variable, tsVariable as variable } from './nodes/variable';
35
+ export { TsTypeof as Typeof, tsTypeof as typeof } from './nodes/typeof';
36
+ export * as refs from './references';
37
+ export { getTypeScriptBuilderOptions as getBuilderOptions } from './utils/get-type-script-builder-options';
38
+ export { toTsNode as toNode } from './utils/to-ts-node';
@@ -0,0 +1 @@
1
+ export type TsAccessModifier = 'public' | 'protected' | 'private';
@@ -0,0 +1 @@
1
+ export * as ts from './_index';
@@ -0,0 +1,4 @@
1
+ import { AstNode, AstNodeOptions, SourceBuilder } from '@goast/core';
2
+ export declare abstract class TsNode<TBuilder extends SourceBuilder, TInjects extends string = never> extends AstNode<TBuilder, TInjects> {
3
+ constructor(options: AstNodeOptions<typeof AstNode<TBuilder, TInjects>>);
4
+ }
@@ -0,0 +1,17 @@
1
+ import { AstNodeOptions, Prettify, SourceBuilder } from '@goast/core';
2
+ import { TsValue } from './types';
3
+ import { TsNode } from '../node';
4
+ import { writeTsParameters } from '../utils/write-ts-parameters';
5
+ type Injects = never;
6
+ type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<typeof TsNode<TBuilder, TInjects | Injects>, {
7
+ value: TsValue<TBuilder>;
8
+ }>;
9
+ export declare class TsArgument<TBuilder extends SourceBuilder, TInjects extends string = never> extends TsNode<TBuilder, TInjects | Injects> {
10
+ value: TsValue<TBuilder>;
11
+ constructor(options: Options<TBuilder, TInjects>);
12
+ protected onWrite(builder: TBuilder): void;
13
+ }
14
+ export declare const tsArgument: (<TBuilder extends SourceBuilder<never>>(value: Options<TBuilder>['value'], options?: Prettify<Omit<Options<TBuilder>, 'value'>>) => TsArgument<TBuilder, never>) & {
15
+ write: typeof writeTsParameters;
16
+ };
17
+ export {};
@@ -0,0 +1,19 @@
1
+ import { AstNodeOptions, Nullable, Prettify, SourceBuilder } from '@goast/core';
2
+ import { TsType } from './types';
3
+ import { TsNode } from '../node';
4
+ import { writeTsNodes } from '../utils/write-ts-nodes';
5
+ type Injects = 'type';
6
+ type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<typeof TsNode<TBuilder, TInjects | Injects>, {
7
+ readonly?: Nullable<boolean>;
8
+ type: TsType<TBuilder>;
9
+ }>;
10
+ export declare class TsArrayType<TBuilder extends SourceBuilder, TInjects extends string = never> extends TsNode<TBuilder, TInjects | Injects> {
11
+ readonly: boolean;
12
+ type: TsType<TBuilder>;
13
+ constructor(options: Options<TBuilder, TInjects>);
14
+ protected onWrite(builder: TBuilder): void;
15
+ }
16
+ export declare const tsArrayType: (<TBuilder extends SourceBuilder<never>>(type: Options<TBuilder>['type'], options?: Prettify<Omit<Options<TBuilder>, 'type'>>) => TsArrayType<TBuilder, never>) & {
17
+ write: typeof writeTsNodes;
18
+ };
19
+ export {};
@@ -0,0 +1,29 @@
1
+ import { AppendValue, AstNodeOptions, BasicAppendValue, Nullable, SourceBuilder } from '@goast/core';
2
+ import { TsGenericParameter } from './generic-parameter';
3
+ import { TsParameter } from './parameter';
4
+ import { TsType } from './types';
5
+ import { TsNode } from '../node';
6
+ import { writeTsNodes } from '../utils/write-ts-nodes';
7
+ type Injects = 'generics' | 'params' | 'returnType' | 'body';
8
+ type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<typeof TsNode<TBuilder, TInjects | Injects>, {
9
+ async?: Nullable<boolean>;
10
+ generics?: Nullable<Nullable<TsGenericParameter<TBuilder> | BasicAppendValue<TBuilder>>[]>;
11
+ parameters?: Nullable<Nullable<TsParameter<TBuilder> | BasicAppendValue<TBuilder>>[]>;
12
+ returnType?: Nullable<TsType<TBuilder>>;
13
+ singleExpression?: Nullable<boolean>;
14
+ body?: Nullable<AppendValue<TBuilder>>;
15
+ }>;
16
+ export declare class TsArrowFunction<TBuilder extends SourceBuilder, TInjects extends string = never> extends TsNode<TBuilder, TInjects | Injects> {
17
+ async: boolean;
18
+ generics: (TsGenericParameter<TBuilder> | BasicAppendValue<TBuilder>)[];
19
+ parameters: (TsParameter<TBuilder> | BasicAppendValue<TBuilder>)[];
20
+ returnType: TsType<TBuilder> | null;
21
+ singleExpression: boolean;
22
+ body: AppendValue<TBuilder> | null;
23
+ constructor(options: Options<TBuilder, TInjects>);
24
+ protected onWrite(builder: TBuilder): void;
25
+ }
26
+ export declare const tsArrowFunction: (<TBuilder extends SourceBuilder<never>>(options?: Options<TBuilder>) => TsArrowFunction<TBuilder, never>) & {
27
+ write: typeof writeTsNodes;
28
+ };
29
+ export {};