@nestia/sdk 12.0.0-dev.20260601.1 → 12.0.0-dev.20260612.2

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 (209) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +93 -93
  3. package/assets/bundle/api/HttpError.ts +1 -1
  4. package/assets/bundle/api/IConnection.ts +1 -1
  5. package/assets/bundle/api/Primitive.ts +1 -1
  6. package/assets/bundle/api/Resolved.ts +1 -1
  7. package/assets/bundle/api/index.ts +4 -4
  8. package/assets/bundle/api/module.ts +6 -6
  9. package/assets/bundle/distribute/README.md +37 -37
  10. package/assets/bundle/distribute/package.json +28 -28
  11. package/assets/bundle/distribute/tsconfig.json +109 -109
  12. package/assets/bundle/e2e/index.ts +42 -42
  13. package/assets/config/nestia.config.ts +97 -97
  14. package/lib/NestiaSdkApplication.js +29 -7
  15. package/lib/NestiaSdkApplication.js.map +1 -1
  16. package/lib/NestiaSwaggerComposer.js +21 -13
  17. package/lib/NestiaSwaggerComposer.js.map +1 -1
  18. package/lib/analyses/AccessorAnalyzer.d.ts +4 -1
  19. package/lib/analyses/AccessorAnalyzer.js.map +1 -1
  20. package/lib/analyses/ConfigAnalyzer.js +1 -1
  21. package/lib/analyses/PathAnalyzer.d.ts +18 -3
  22. package/lib/analyses/PathAnalyzer.js +32 -0
  23. package/lib/analyses/PathAnalyzer.js.map +1 -1
  24. package/lib/analyses/ReflectControllerAnalyzer.js +3 -2
  25. package/lib/analyses/ReflectControllerAnalyzer.js.map +1 -1
  26. package/lib/analyses/ReflectHttpOperationAnalyzer.d.ts +1 -1
  27. package/lib/analyses/ReflectHttpOperationAnalyzer.js +1 -1
  28. package/lib/analyses/ReflectHttpOperationAnalyzer.js.map +1 -1
  29. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.d.ts +1 -1
  30. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js +53 -20
  31. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js.map +1 -1
  32. package/lib/analyses/ReflectMcpOperationAnalyzer.d.ts +14 -0
  33. package/lib/analyses/ReflectMcpOperationAnalyzer.js +79 -0
  34. package/lib/analyses/ReflectMcpOperationAnalyzer.js.map +1 -0
  35. package/lib/analyses/TypedMcpRouteAnalyzer.d.ts +9 -0
  36. package/lib/analyses/TypedMcpRouteAnalyzer.js +31 -0
  37. package/lib/analyses/TypedMcpRouteAnalyzer.js.map +1 -0
  38. package/lib/executable/internal/NestiaConfigLoader.js +5 -1
  39. package/lib/executable/internal/NestiaConfigLoader.js.map +1 -1
  40. package/lib/executable/internal/NestiaSdkCommand.js +30 -14
  41. package/lib/executable/internal/NestiaSdkCommand.js.map +1 -1
  42. package/lib/executable/internal/NestiaSdkWatcher.d.ts +10 -0
  43. package/lib/executable/internal/NestiaSdkWatcher.js +322 -0
  44. package/lib/executable/internal/NestiaSdkWatcher.js.map +1 -0
  45. package/lib/executable/sdk.js +12 -12
  46. package/lib/executable/sdk.js.map +1 -1
  47. package/lib/generates/CloneGenerator.js +4 -2
  48. package/lib/generates/CloneGenerator.js.map +1 -1
  49. package/lib/generates/SdkGenerator.js +50 -1
  50. package/lib/generates/SdkGenerator.js.map +1 -1
  51. package/lib/generates/SwaggerGenerator.js +18 -2
  52. package/lib/generates/SwaggerGenerator.js.map +1 -1
  53. package/lib/generates/internal/E2eFileProgrammer.js +3 -1
  54. package/lib/generates/internal/E2eFileProgrammer.js.map +1 -1
  55. package/lib/generates/internal/ImportDictionary.d.ts +1 -0
  56. package/lib/generates/internal/ImportDictionary.js +9 -4
  57. package/lib/generates/internal/ImportDictionary.js.map +1 -1
  58. package/lib/generates/internal/SdkAliasCollection.d.ts +2 -0
  59. package/lib/generates/internal/SdkAliasCollection.js +11 -2
  60. package/lib/generates/internal/SdkAliasCollection.js.map +1 -1
  61. package/lib/generates/internal/SdkDistributionComposer.d.ts +1 -0
  62. package/lib/generates/internal/SdkDistributionComposer.js +3 -0
  63. package/lib/generates/internal/SdkDistributionComposer.js.map +1 -1
  64. package/lib/generates/internal/SdkFileProgrammer.js +4 -1
  65. package/lib/generates/internal/SdkFileProgrammer.js.map +1 -1
  66. package/lib/generates/internal/SdkHttpCloneReferencer.d.ts +1 -1
  67. package/lib/generates/internal/SdkHttpCloneReferencer.js +42 -9
  68. package/lib/generates/internal/SdkHttpCloneReferencer.js.map +1 -1
  69. package/lib/generates/internal/SdkHttpFunctionProgrammer.js +3 -4
  70. package/lib/generates/internal/SdkHttpFunctionProgrammer.js.map +1 -1
  71. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js +2 -1
  72. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js.map +1 -1
  73. package/lib/generates/internal/SdkHttpSimulationProgrammer.js +6 -3
  74. package/lib/generates/internal/SdkHttpSimulationProgrammer.js.map +1 -1
  75. package/lib/generates/internal/SdkMcpRouteProgrammer.d.ts +15 -0
  76. package/lib/generates/internal/SdkMcpRouteProgrammer.js +148 -0
  77. package/lib/generates/internal/SdkMcpRouteProgrammer.js.map +1 -0
  78. package/lib/generates/internal/SdkRouteDirectory.d.ts +2 -1
  79. package/lib/generates/internal/SdkRouteDirectory.js.map +1 -1
  80. package/lib/generates/internal/SdkWebSocketCloneProgrammer.d.ts +6 -0
  81. package/lib/generates/internal/SdkWebSocketCloneProgrammer.js +283 -0
  82. package/lib/generates/internal/SdkWebSocketCloneProgrammer.js.map +1 -0
  83. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js +11 -9
  84. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js.map +1 -1
  85. package/lib/generates/internal/SwaggerOperationParameterComposer.js +10 -2
  86. package/lib/generates/internal/SwaggerOperationParameterComposer.js.map +1 -1
  87. package/lib/generates/internal/SwaggerOperationResponseComposer.d.ts +1 -1
  88. package/lib/generates/internal/SwaggerOperationResponseComposer.js +6 -1
  89. package/lib/generates/internal/SwaggerOperationResponseComposer.js.map +1 -1
  90. package/lib/generates/internal/SwaggerReadonlyArrayEmender.d.ts +9 -0
  91. package/lib/generates/internal/SwaggerReadonlyArrayEmender.js +174 -0
  92. package/lib/generates/internal/SwaggerReadonlyArrayEmender.js.map +1 -0
  93. package/lib/structures/INestiaSdkInput.d.ts +9 -2
  94. package/lib/structures/IReflectController.d.ts +2 -1
  95. package/lib/structures/IReflectHttpOperationSuccess.d.ts +4 -2
  96. package/lib/structures/IReflectMcpOperation.d.ts +35 -0
  97. package/lib/structures/IReflectMcpOperation.js +3 -0
  98. package/lib/structures/IReflectMcpOperation.js.map +1 -0
  99. package/lib/structures/IReflectMcpOperationParameter.d.ts +19 -0
  100. package/lib/structures/IReflectMcpOperationParameter.js +3 -0
  101. package/lib/structures/IReflectMcpOperationParameter.js.map +1 -0
  102. package/lib/structures/ITypedApplication.d.ts +2 -1
  103. package/lib/structures/ITypedHttpRouteSuccess.d.ts +3 -1
  104. package/lib/structures/ITypedMcpRoute.d.ts +31 -0
  105. package/lib/structures/ITypedMcpRoute.js +3 -0
  106. package/lib/structures/ITypedMcpRoute.js.map +1 -0
  107. package/lib/utils/HttpResponseContentTypeUtil.d.ts +5 -0
  108. package/lib/utils/HttpResponseContentTypeUtil.js +22 -0
  109. package/lib/utils/HttpResponseContentTypeUtil.js.map +1 -0
  110. package/native/go.mod +52 -52
  111. package/native/go.sum +84 -54
  112. package/native/sdk/register.go +322 -165
  113. package/native/sdk/sdk.go +17 -17
  114. package/native/sdk/sdk_metadata_json.go +327 -327
  115. package/native/sdk/sdk_transform.go +1879 -1549
  116. package/package.json +11 -9
  117. package/src/INestiaConfig.ts +267 -267
  118. package/src/NestiaSdkApplication.ts +39 -8
  119. package/src/NestiaSwaggerComposer.ts +153 -142
  120. package/src/analyses/AccessorAnalyzer.ts +64 -67
  121. package/src/analyses/ConfigAnalyzer.ts +330 -330
  122. package/src/analyses/ImportAnalyzer.ts +92 -92
  123. package/src/analyses/PathAnalyzer.ts +130 -69
  124. package/src/analyses/ReflectControllerAnalyzer.ts +112 -105
  125. package/src/analyses/ReflectHttpOperationAnalyzer.ts +183 -183
  126. package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +90 -90
  127. package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +350 -350
  128. package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +163 -130
  129. package/src/analyses/ReflectMcpOperationAnalyzer.ts +124 -0
  130. package/src/analyses/ReflectMetadataAnalyzer.ts +44 -44
  131. package/src/analyses/SecurityAnalyzer.ts +25 -25
  132. package/src/analyses/TypedMcpRouteAnalyzer.ts +34 -0
  133. package/src/decorators/OperationMetadata.ts +29 -29
  134. package/src/executable/internal/CommandParser.ts +15 -15
  135. package/src/executable/internal/NestiaConfigLoader.ts +451 -446
  136. package/src/executable/internal/NestiaSdkCommand.ts +124 -106
  137. package/src/executable/internal/NestiaSdkWatcher.ts +342 -0
  138. package/src/executable/sdk.ts +90 -88
  139. package/src/generates/CloneGenerator.ts +73 -66
  140. package/src/generates/E2eGenerator.ts +32 -32
  141. package/src/generates/SdkGenerator.ts +176 -118
  142. package/src/generates/SwaggerGenerator.ts +342 -310
  143. package/src/generates/internal/E2eFileProgrammer.ts +240 -233
  144. package/src/generates/internal/FilePrinter.ts +65 -65
  145. package/src/generates/internal/ImportDictionary.ts +209 -204
  146. package/src/generates/internal/SdkAliasCollection.ts +274 -261
  147. package/src/generates/internal/SdkDistributionComposer.ts +123 -116
  148. package/src/generates/internal/SdkFileProgrammer.ts +116 -112
  149. package/src/generates/internal/SdkHttpCloneProgrammer.ts +126 -126
  150. package/src/generates/internal/SdkHttpCloneReferencer.ts +131 -77
  151. package/src/generates/internal/SdkHttpFunctionProgrammer.ts +301 -301
  152. package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +520 -510
  153. package/src/generates/internal/SdkHttpParameterProgrammer.ts +165 -165
  154. package/src/generates/internal/SdkHttpRouteProgrammer.ts +109 -109
  155. package/src/generates/internal/SdkHttpSimulationProgrammer.ts +331 -314
  156. package/src/generates/internal/SdkImportWizard.ts +62 -62
  157. package/src/generates/internal/SdkMcpRouteProgrammer.ts +452 -0
  158. package/src/generates/internal/SdkRouteDirectory.ts +21 -18
  159. package/src/generates/internal/SdkTypeTagProgrammer.ts +114 -114
  160. package/src/generates/internal/SdkWebSocketCloneProgrammer.ts +319 -0
  161. package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +389 -389
  162. package/src/generates/internal/SdkWebSocketParameterProgrammer.ts +89 -89
  163. package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +331 -323
  164. package/src/generates/internal/SwaggerDescriptionComposer.ts +64 -64
  165. package/src/generates/internal/SwaggerOperationComposer.ts +119 -119
  166. package/src/generates/internal/SwaggerOperationParameterComposer.ts +175 -162
  167. package/src/generates/internal/SwaggerOperationResponseComposer.ts +115 -110
  168. package/src/generates/internal/SwaggerReadonlyArrayEmender.ts +262 -0
  169. package/src/index.ts +4 -4
  170. package/src/internal/legacy.ts +492 -492
  171. package/src/module.ts +4 -4
  172. package/src/structures/INestiaProject.ts +10 -10
  173. package/src/structures/INestiaSdkInput.ts +27 -20
  174. package/src/structures/IOperationMetadata.ts +41 -41
  175. package/src/structures/IReflectController.ts +18 -15
  176. package/src/structures/IReflectHttpOperation.ts +26 -26
  177. package/src/structures/IReflectHttpOperationException.ts +18 -18
  178. package/src/structures/IReflectHttpOperationParameter.ts +79 -79
  179. package/src/structures/IReflectHttpOperationSuccess.ts +18 -21
  180. package/src/structures/IReflectImport.ts +6 -6
  181. package/src/structures/IReflectMcpOperation.ts +38 -0
  182. package/src/structures/IReflectMcpOperationParameter.ts +27 -0
  183. package/src/structures/IReflectOperationError.ts +26 -26
  184. package/src/structures/IReflectType.ts +4 -4
  185. package/src/structures/IReflectWebSocketOperation.ts +17 -17
  186. package/src/structures/ITypedApplication.ts +12 -11
  187. package/src/structures/ITypedHttpRoute.ts +41 -41
  188. package/src/structures/ITypedHttpRouteException.ts +15 -15
  189. package/src/structures/ITypedHttpRouteParameter.ts +41 -41
  190. package/src/structures/ITypedHttpRouteSuccess.ts +18 -22
  191. package/src/structures/ITypedMcpRoute.ts +33 -0
  192. package/src/structures/ITypedWebSocketRoute.ts +24 -24
  193. package/src/structures/ITypedWebSocketRouteParameter.ts +3 -3
  194. package/src/transform.ts +59 -59
  195. package/src/typings/get-function-location.d.ts +7 -7
  196. package/src/utils/ArrayUtil.ts +26 -26
  197. package/src/utils/EmittedJavaScriptPatcher.ts +88 -88
  198. package/src/utils/FileRetriever.ts +22 -22
  199. package/src/utils/HttpResponseContentTypeUtil.ts +30 -0
  200. package/src/utils/MapUtil.ts +14 -14
  201. package/src/utils/PathUtil.ts +10 -10
  202. package/src/utils/SourceFinder.ts +63 -63
  203. package/src/utils/StringUtil.ts +17 -17
  204. package/src/utils/TsConfigReader.ts +108 -108
  205. package/src/utils/TtscExecutor.ts +68 -68
  206. package/src/utils/VersioningStrategy.ts +28 -28
  207. package/src/validators/HttpHeadersValidator.ts +11 -11
  208. package/src/validators/HttpQueryValidator.ts +11 -11
  209. package/src/validators/TextPlainValidator.ts +17 -17
@@ -1,314 +1,331 @@
1
- import { Node, NodeFlags, SyntaxKind, TypeScriptFactory } from "@nestia/factory";
2
- import { ExpressionFactory, IdentifierFactory, LiteralFactory, StatementFactory, TypeFactory } from "@nestia/factory";
3
-
4
- import { INestiaProject } from "../../structures/INestiaProject";
5
- import { ITypedHttpRoute } from "../../structures/ITypedHttpRoute";
6
- import { ImportDictionary } from "./ImportDictionary";
7
- import { SdkAliasCollection } from "./SdkAliasCollection";
8
- import { SdkHttpParameterProgrammer } from "./SdkHttpParameterProgrammer";
9
- import { SdkImportWizard } from "./SdkImportWizard";
10
- import { sizeOf } from "../../internal/legacy";
11
-
12
- export namespace SdkHttpSimulationProgrammer {
13
- export const random =
14
- (project: INestiaProject) =>
15
- (importer: ImportDictionary) =>
16
- (route: ITypedHttpRoute): Node => {
17
- const output = SdkAliasCollection.responseBody(project)(importer)(route);
18
- return constant("random")(
19
- TypeScriptFactory.createArrowFunction(
20
- undefined,
21
- undefined,
22
- [],
23
- project.config.primitive === false
24
- ? output
25
- : TypeScriptFactory.createTypeReferenceNode(
26
- SdkImportWizard.Resolved(importer),
27
- [output],
28
- ),
29
- undefined,
30
- TypeScriptFactory.createCallExpression(
31
- IdentifierFactory.access(
32
- TypeScriptFactory.createIdentifier(
33
- SdkImportWizard.typia(importer),
34
- ),
35
- "random",
36
- ),
37
- [output],
38
- undefined,
39
- ),
40
- ),
41
- );
42
- };
43
-
44
- export const simulate =
45
- (project: INestiaProject) =>
46
- (importer: ImportDictionary) =>
47
- (route: ITypedHttpRoute): Node => {
48
- const output: boolean =
49
- project.config.propagate === true ||
50
- sizeOf(route.success.metadata) !== 0;
51
- const caller = () =>
52
- TypeScriptFactory.createCallExpression(
53
- TypeScriptFactory.createIdentifier("random"),
54
- undefined,
55
- undefined,
56
- );
57
- return constant("simulate")(
58
- TypeScriptFactory.createArrowFunction(
59
- undefined,
60
- undefined,
61
- [
62
- IdentifierFactory.parameter(
63
- SdkHttpParameterProgrammer.getSignificant(route, true).length !==
64
- 0
65
- ? "connection"
66
- : "_connection",
67
- TypeScriptFactory.createTypeReferenceNode(
68
- SdkImportWizard.IConnection(importer),
69
- route.headerObject
70
- ? [
71
- TypeScriptFactory.createTypeReferenceNode(
72
- `${route.name}.Headers`,
73
- ),
74
- ]
75
- : [],
76
- ),
77
- ),
78
- ...SdkHttpParameterProgrammer.getParameterDeclarations({
79
- project,
80
- importer,
81
- route,
82
- body: true,
83
- prefix: false,
84
- }),
85
- ],
86
- TypeScriptFactory.createTypeReferenceNode(output ? "Output" : "void"),
87
- undefined,
88
- TypeScriptFactory.createBlock(
89
- [
90
- ...assert(project)(importer)(route),
91
- TypeScriptFactory.createReturnStatement(
92
- project.config.propagate
93
- ? TypeScriptFactory.createAsExpression(
94
- TypeScriptFactory.createObjectLiteralExpression(
95
- [
96
- TypeScriptFactory.createPropertyAssignment(
97
- "success",
98
- TypeScriptFactory.createTrue(),
99
- ),
100
- TypeScriptFactory.createPropertyAssignment(
101
- "status",
102
- ExpressionFactory.number(
103
- route.success.status ??
104
- (route.method === "POST" ? 201 : 200),
105
- ),
106
- ),
107
- TypeScriptFactory.createPropertyAssignment(
108
- "headers",
109
- LiteralFactory.write({
110
- "Content-Type": route.success.contentType,
111
- }),
112
- ),
113
- TypeScriptFactory.createPropertyAssignment(
114
- "data",
115
- caller(),
116
- ),
117
- ],
118
- true,
119
- ),
120
- TypeScriptFactory.createTypeReferenceNode("Output"),
121
- )
122
- : caller(),
123
- ),
124
- ],
125
- true,
126
- ),
127
- ),
128
- );
129
- };
130
-
131
- const assert =
132
- (project: INestiaProject) =>
133
- (importer: ImportDictionary) =>
134
- (route: ITypedHttpRoute): Node[] => {
135
- const parameters = SdkHttpParameterProgrammer.getSignificant(route, true);
136
- if (parameters.length === 0) return [];
137
-
138
- const typia = SdkImportWizard.typia(importer);
139
- const validator = StatementFactory.constant({
140
- name: "assert",
141
- value: TypeScriptFactory.createCallExpression(
142
- IdentifierFactory.access(
143
- TypeScriptFactory.createIdentifier(
144
- importer.external({
145
- file: `@nestia/fetcher`,
146
- declaration: false,
147
- type: "element",
148
- name: "NestiaSimulator",
149
- }),
150
- ),
151
- "assert",
152
- ),
153
- undefined,
154
- [
155
- TypeScriptFactory.createObjectLiteralExpression(
156
- [
157
- TypeScriptFactory.createPropertyAssignment(
158
- "method",
159
- TypeScriptFactory.createIdentifier("METADATA.method"),
160
- ),
161
- TypeScriptFactory.createPropertyAssignment(
162
- "host",
163
- TypeScriptFactory.createIdentifier("connection.host"),
164
- ),
165
- TypeScriptFactory.createPropertyAssignment(
166
- "path",
167
- TypeScriptFactory.createCallExpression(
168
- TypeScriptFactory.createIdentifier("path"),
169
- undefined,
170
- SdkHttpParameterProgrammer.getArguments({
171
- project,
172
- route,
173
- body: false,
174
- }),
175
- ),
176
- ),
177
- TypeScriptFactory.createPropertyAssignment(
178
- "contentType",
179
- TypeScriptFactory.createIdentifier(
180
- JSON.stringify(route.success.contentType),
181
- ),
182
- ),
183
- ],
184
- true,
185
- ),
186
- ],
187
- ),
188
- });
189
- const individual: Node[] = parameters
190
- .map((p) =>
191
- TypeScriptFactory.createCallExpression(
192
- (() => {
193
- const base = IdentifierFactory.access(
194
- TypeScriptFactory.createIdentifier("assert"),
195
- p.category,
196
- );
197
- if (p.category !== "param") return base;
198
- return TypeScriptFactory.createCallExpression(base, undefined, [
199
- TypeScriptFactory.createStringLiteral(p.name),
200
- ]);
201
- })(),
202
- undefined,
203
- [
204
- TypeScriptFactory.createArrowFunction(
205
- undefined,
206
- undefined,
207
- [],
208
- undefined,
209
- undefined,
210
- TypeScriptFactory.createCallExpression(
211
- IdentifierFactory.access(
212
- TypeScriptFactory.createIdentifier(typia),
213
- "assert",
214
- ),
215
- undefined,
216
- [
217
- project.config.keyword === true
218
- ? TypeScriptFactory.createIdentifier(`props.${p.name}`)
219
- : TypeScriptFactory.createIdentifier(p.name),
220
- ],
221
- ),
222
- ),
223
- ],
224
- ),
225
- )
226
- .map(TypeScriptFactory.createExpressionStatement) as Node[];
227
- return [
228
- validator,
229
- ...(project.config.propagate !== true
230
- ? individual
231
- : [tryAndCatch(importer)(individual)]),
232
- ];
233
- };
234
-
235
- const tryAndCatch =
236
- (importer: ImportDictionary) => (individual: Node[]) =>
237
- TypeScriptFactory.createTryStatement(
238
- TypeScriptFactory.createBlock(individual, true),
239
- TypeScriptFactory.createCatchClause(
240
- "exp",
241
- TypeScriptFactory.createBlock(
242
- [
243
- TypeScriptFactory.createIfStatement(
244
- TypeScriptFactory.createLogicalNot(
245
- TypeScriptFactory.createCallExpression(
246
- IdentifierFactory.access(
247
- TypeScriptFactory.createIdentifier(
248
- SdkImportWizard.typia(importer),
249
- ),
250
- "is",
251
- ),
252
- [
253
- TypeScriptFactory.createTypeReferenceNode(
254
- SdkImportWizard.HttpError(importer),
255
- ),
256
- ],
257
- [TypeScriptFactory.createIdentifier("exp")],
258
- ),
259
- ),
260
- TypeScriptFactory.createThrowStatement(
261
- TypeScriptFactory.createIdentifier("exp"),
262
- ),
263
- ),
264
- TypeScriptFactory.createReturnStatement(
265
- TypeScriptFactory.createAsExpression(
266
- TypeScriptFactory.createObjectLiteralExpression(
267
- [
268
- TypeScriptFactory.createPropertyAssignment(
269
- "success",
270
- TypeScriptFactory.createFalse(),
271
- ),
272
- TypeScriptFactory.createPropertyAssignment(
273
- "status",
274
- TypeScriptFactory.createIdentifier("exp.status"),
275
- ),
276
- TypeScriptFactory.createPropertyAssignment(
277
- "headers",
278
- TypeScriptFactory.createIdentifier("exp.headers"),
279
- ),
280
- TypeScriptFactory.createPropertyAssignment(
281
- "data",
282
- TypeScriptFactory.createIdentifier(
283
- "exp.toJSON().message",
284
- ),
285
- ),
286
- ],
287
- true,
288
- ),
289
- TypeFactory.keyword("any"),
290
- ),
291
- ),
292
- ],
293
- true,
294
- ),
295
- ),
296
- undefined,
297
- );
298
- }
299
-
300
- const constant = (name: string) => (expression: Node) =>
301
- TypeScriptFactory.createVariableStatement(
302
- [TypeScriptFactory.createModifier(SyntaxKind.ExportKeyword)],
303
- TypeScriptFactory.createVariableDeclarationList(
304
- [
305
- TypeScriptFactory.createVariableDeclaration(
306
- TypeScriptFactory.createIdentifier(name),
307
- undefined,
308
- undefined,
309
- expression,
310
- ),
311
- ],
312
- NodeFlags.Const,
313
- ),
314
- );
1
+ import {
2
+ Node,
3
+ NodeFlags,
4
+ SyntaxKind,
5
+ TypeScriptFactory,
6
+ } from "@nestia/factory";
7
+ import {
8
+ ExpressionFactory,
9
+ IdentifierFactory,
10
+ LiteralFactory,
11
+ StatementFactory,
12
+ TypeFactory,
13
+ } from "@nestia/factory";
14
+
15
+ import { sizeOf } from "../../internal/legacy";
16
+ import { INestiaProject } from "../../structures/INestiaProject";
17
+ import { ITypedHttpRoute } from "../../structures/ITypedHttpRoute";
18
+ import { ImportDictionary } from "./ImportDictionary";
19
+ import { SdkAliasCollection } from "./SdkAliasCollection";
20
+ import { SdkHttpParameterProgrammer } from "./SdkHttpParameterProgrammer";
21
+ import { SdkImportWizard } from "./SdkImportWizard";
22
+
23
+ export namespace SdkHttpSimulationProgrammer {
24
+ export const random =
25
+ (project: INestiaProject) =>
26
+ (importer: ImportDictionary) =>
27
+ (route: ITypedHttpRoute): Node => {
28
+ const output = SdkAliasCollection.responseBody(project)(importer)(route);
29
+ return constant("random")(
30
+ TypeScriptFactory.createArrowFunction(
31
+ undefined,
32
+ undefined,
33
+ [],
34
+ project.config.primitive === false || route.success.binary === true
35
+ ? output
36
+ : TypeScriptFactory.createTypeReferenceNode(
37
+ SdkImportWizard.Resolved(importer),
38
+ [output],
39
+ ),
40
+ undefined,
41
+ route.success.binary === true
42
+ ? TypeScriptFactory.createNewExpression(
43
+ TypeScriptFactory.createIdentifier("ReadableStream"),
44
+ [SdkAliasCollection.binaryChunk()],
45
+ [],
46
+ )
47
+ : TypeScriptFactory.createCallExpression(
48
+ IdentifierFactory.access(
49
+ TypeScriptFactory.createIdentifier(
50
+ SdkImportWizard.typia(importer),
51
+ ),
52
+ "random",
53
+ ),
54
+ [output],
55
+ undefined,
56
+ ),
57
+ ),
58
+ );
59
+ };
60
+
61
+ export const simulate =
62
+ (project: INestiaProject) =>
63
+ (importer: ImportDictionary) =>
64
+ (route: ITypedHttpRoute): Node => {
65
+ const output: boolean =
66
+ project.config.propagate === true ||
67
+ route.success.binary === true ||
68
+ sizeOf(route.success.metadata) !== 0;
69
+ const caller = () =>
70
+ TypeScriptFactory.createCallExpression(
71
+ TypeScriptFactory.createIdentifier("random"),
72
+ undefined,
73
+ undefined,
74
+ );
75
+ return constant("simulate")(
76
+ TypeScriptFactory.createArrowFunction(
77
+ undefined,
78
+ undefined,
79
+ [
80
+ IdentifierFactory.parameter(
81
+ SdkHttpParameterProgrammer.getSignificant(route, true).length !==
82
+ 0
83
+ ? "connection"
84
+ : "_connection",
85
+ TypeScriptFactory.createTypeReferenceNode(
86
+ SdkImportWizard.IConnection(importer),
87
+ route.headerObject
88
+ ? [
89
+ TypeScriptFactory.createTypeReferenceNode(
90
+ `${route.name}.Headers`,
91
+ ),
92
+ ]
93
+ : [],
94
+ ),
95
+ ),
96
+ ...SdkHttpParameterProgrammer.getParameterDeclarations({
97
+ project,
98
+ importer,
99
+ route,
100
+ body: true,
101
+ prefix: false,
102
+ }),
103
+ ],
104
+ TypeScriptFactory.createTypeReferenceNode(output ? "Output" : "void"),
105
+ undefined,
106
+ TypeScriptFactory.createBlock(
107
+ [
108
+ ...assert(project)(importer)(route),
109
+ TypeScriptFactory.createReturnStatement(
110
+ project.config.propagate
111
+ ? TypeScriptFactory.createAsExpression(
112
+ TypeScriptFactory.createObjectLiteralExpression(
113
+ [
114
+ TypeScriptFactory.createPropertyAssignment(
115
+ "success",
116
+ TypeScriptFactory.createTrue(),
117
+ ),
118
+ TypeScriptFactory.createPropertyAssignment(
119
+ "status",
120
+ ExpressionFactory.number(
121
+ route.success.status ??
122
+ (route.method === "POST" ? 201 : 200),
123
+ ),
124
+ ),
125
+ TypeScriptFactory.createPropertyAssignment(
126
+ "headers",
127
+ LiteralFactory.write({
128
+ "Content-Type": route.success.contentType,
129
+ }),
130
+ ),
131
+ TypeScriptFactory.createPropertyAssignment(
132
+ "data",
133
+ caller(),
134
+ ),
135
+ ],
136
+ true,
137
+ ),
138
+ TypeScriptFactory.createTypeReferenceNode("Output"),
139
+ )
140
+ : caller(),
141
+ ),
142
+ ],
143
+ true,
144
+ ),
145
+ ),
146
+ );
147
+ };
148
+
149
+ const assert =
150
+ (project: INestiaProject) =>
151
+ (importer: ImportDictionary) =>
152
+ (route: ITypedHttpRoute): Node[] => {
153
+ const parameters = SdkHttpParameterProgrammer.getSignificant(route, true);
154
+ if (parameters.length === 0) return [];
155
+
156
+ const typia = SdkImportWizard.typia(importer);
157
+ const validator = StatementFactory.constant({
158
+ name: "assert",
159
+ value: TypeScriptFactory.createCallExpression(
160
+ IdentifierFactory.access(
161
+ TypeScriptFactory.createIdentifier(
162
+ importer.external({
163
+ file: `@nestia/fetcher`,
164
+ declaration: false,
165
+ type: "element",
166
+ name: "NestiaSimulator",
167
+ }),
168
+ ),
169
+ "assert",
170
+ ),
171
+ undefined,
172
+ [
173
+ TypeScriptFactory.createObjectLiteralExpression(
174
+ [
175
+ TypeScriptFactory.createPropertyAssignment(
176
+ "method",
177
+ TypeScriptFactory.createIdentifier("METADATA.method"),
178
+ ),
179
+ TypeScriptFactory.createPropertyAssignment(
180
+ "host",
181
+ TypeScriptFactory.createIdentifier("connection.host"),
182
+ ),
183
+ TypeScriptFactory.createPropertyAssignment(
184
+ "path",
185
+ TypeScriptFactory.createCallExpression(
186
+ TypeScriptFactory.createIdentifier("path"),
187
+ undefined,
188
+ SdkHttpParameterProgrammer.getArguments({
189
+ project,
190
+ route,
191
+ body: false,
192
+ }),
193
+ ),
194
+ ),
195
+ TypeScriptFactory.createPropertyAssignment(
196
+ "contentType",
197
+ TypeScriptFactory.createIdentifier(
198
+ JSON.stringify(route.success.contentType),
199
+ ),
200
+ ),
201
+ ],
202
+ true,
203
+ ),
204
+ ],
205
+ ),
206
+ });
207
+ const individual: Node[] = parameters
208
+ .map((p) =>
209
+ TypeScriptFactory.createCallExpression(
210
+ (() => {
211
+ const base = IdentifierFactory.access(
212
+ TypeScriptFactory.createIdentifier("assert"),
213
+ p.category,
214
+ );
215
+ if (p.category !== "param") return base;
216
+ return TypeScriptFactory.createCallExpression(base, undefined, [
217
+ TypeScriptFactory.createStringLiteral(p.name),
218
+ ]);
219
+ })(),
220
+ undefined,
221
+ [
222
+ TypeScriptFactory.createArrowFunction(
223
+ undefined,
224
+ undefined,
225
+ [],
226
+ undefined,
227
+ undefined,
228
+ TypeScriptFactory.createCallExpression(
229
+ IdentifierFactory.access(
230
+ TypeScriptFactory.createIdentifier(typia),
231
+ "assert",
232
+ ),
233
+ undefined,
234
+ [
235
+ project.config.keyword === true
236
+ ? TypeScriptFactory.createIdentifier(`props.${p.name}`)
237
+ : TypeScriptFactory.createIdentifier(p.name),
238
+ ],
239
+ ),
240
+ ),
241
+ ],
242
+ ),
243
+ )
244
+ .map(TypeScriptFactory.createExpressionStatement) as Node[];
245
+ return [
246
+ validator,
247
+ ...(project.config.propagate !== true
248
+ ? individual
249
+ : [tryAndCatch(importer)(individual)]),
250
+ ];
251
+ };
252
+
253
+ const tryAndCatch = (importer: ImportDictionary) => (individual: Node[]) =>
254
+ TypeScriptFactory.createTryStatement(
255
+ TypeScriptFactory.createBlock(individual, true),
256
+ TypeScriptFactory.createCatchClause(
257
+ "exp",
258
+ TypeScriptFactory.createBlock(
259
+ [
260
+ TypeScriptFactory.createIfStatement(
261
+ TypeScriptFactory.createLogicalNot(
262
+ TypeScriptFactory.createCallExpression(
263
+ IdentifierFactory.access(
264
+ TypeScriptFactory.createIdentifier(
265
+ SdkImportWizard.typia(importer),
266
+ ),
267
+ "is",
268
+ ),
269
+ [
270
+ TypeScriptFactory.createTypeReferenceNode(
271
+ SdkImportWizard.HttpError(importer),
272
+ ),
273
+ ],
274
+ [TypeScriptFactory.createIdentifier("exp")],
275
+ ),
276
+ ),
277
+ TypeScriptFactory.createThrowStatement(
278
+ TypeScriptFactory.createIdentifier("exp"),
279
+ ),
280
+ ),
281
+ TypeScriptFactory.createReturnStatement(
282
+ TypeScriptFactory.createAsExpression(
283
+ TypeScriptFactory.createObjectLiteralExpression(
284
+ [
285
+ TypeScriptFactory.createPropertyAssignment(
286
+ "success",
287
+ TypeScriptFactory.createFalse(),
288
+ ),
289
+ TypeScriptFactory.createPropertyAssignment(
290
+ "status",
291
+ TypeScriptFactory.createIdentifier("exp.status"),
292
+ ),
293
+ TypeScriptFactory.createPropertyAssignment(
294
+ "headers",
295
+ TypeScriptFactory.createIdentifier("exp.headers"),
296
+ ),
297
+ TypeScriptFactory.createPropertyAssignment(
298
+ "data",
299
+ TypeScriptFactory.createIdentifier(
300
+ "exp.toJSON().message",
301
+ ),
302
+ ),
303
+ ],
304
+ true,
305
+ ),
306
+ TypeFactory.keyword("any"),
307
+ ),
308
+ ),
309
+ ],
310
+ true,
311
+ ),
312
+ ),
313
+ undefined,
314
+ );
315
+ }
316
+
317
+ const constant = (name: string) => (expression: Node) =>
318
+ TypeScriptFactory.createVariableStatement(
319
+ [TypeScriptFactory.createModifier(SyntaxKind.ExportKeyword)],
320
+ TypeScriptFactory.createVariableDeclarationList(
321
+ [
322
+ TypeScriptFactory.createVariableDeclaration(
323
+ TypeScriptFactory.createIdentifier(name),
324
+ undefined,
325
+ undefined,
326
+ expression,
327
+ ),
328
+ ],
329
+ NodeFlags.Const,
330
+ ),
331
+ );