@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,510 +1,520 @@
1
- import { Node, NodeFlags, SyntaxKind, TypeScriptFactory } from "@nestia/factory";
2
- import { ExpressionFactory, IdentifierFactory, LiteralFactory, TypeFactory } from "@nestia/factory";
3
- import { NamingConvention } from "@typia/utils";
4
-
5
- import { INestiaProject } from "../../structures/INestiaProject";
6
- import { ITypedHttpRoute } from "../../structures/ITypedHttpRoute";
7
- import { FilePrinter } from "./FilePrinter";
8
- import { ImportDictionary } from "./ImportDictionary";
9
- import { SdkAliasCollection } from "./SdkAliasCollection";
10
- import { SdkHttpParameterProgrammer } from "./SdkHttpParameterProgrammer";
11
- import { SdkHttpSimulationProgrammer } from "./SdkHttpSimulationProgrammer";
12
- import { SdkImportWizard } from "./SdkImportWizard";
13
- import { sizeOf } from "../../internal/legacy";
14
-
15
- export namespace SdkHttpNamespaceProgrammer {
16
- export const write =
17
- (project: INestiaProject) =>
18
- (importer: ImportDictionary) =>
19
- (route: ITypedHttpRoute): Node => {
20
- const types: Node[] =
21
- writeTypes(project)(importer)(route);
22
- return TypeScriptFactory.createModuleDeclaration(
23
- [TypeScriptFactory.createToken(SyntaxKind.ExportKeyword)],
24
- TypeScriptFactory.createIdentifier(route.name),
25
- TypeScriptFactory.createModuleBlock([
26
- ...types,
27
- ...(types.length ? [FilePrinter.enter()] : []),
28
- writeMetadata(project)(importer)(route),
29
- FilePrinter.enter(),
30
- writePath(project)(importer)(route),
31
- ...(project.config.simulate
32
- ? [
33
- SdkHttpSimulationProgrammer.random(project)(importer)(route),
34
- SdkHttpSimulationProgrammer.simulate(project)(importer)(route),
35
- ]
36
- : []),
37
- ...(project.config.json &&
38
- route.body &&
39
- (route.body.contentType === "application/json" ||
40
- route.body.encrypted === true)
41
- ? [writeStringify(project)(importer)]
42
- : []),
43
- ]),
44
- NodeFlags.Namespace,
45
- );
46
- };
47
-
48
- const writeTypes =
49
- (project: INestiaProject) =>
50
- (importer: ImportDictionary) =>
51
- (route: ITypedHttpRoute): Node[] => {
52
- const array: Node[] = [];
53
- const declare = (name: string, type: Node) =>
54
- array.push(
55
- TypeScriptFactory.createTypeAliasDeclaration(
56
- [TypeScriptFactory.createModifier(SyntaxKind.ExportKeyword)],
57
- name,
58
- undefined,
59
- type,
60
- ),
61
- );
62
- if (
63
- project.config.keyword === true &&
64
- SdkHttpParameterProgrammer.getSignificant(route, true).length !== 0
65
- )
66
- declare(
67
- "Props",
68
- SdkAliasCollection.httpProps(project)(importer)(route),
69
- );
70
- if (route.headerObject)
71
- declare(
72
- "Headers",
73
- SdkAliasCollection.headers(project)(importer)(route.headerObject),
74
- );
75
- if (route.queryObject)
76
- declare(
77
- "Query",
78
- SdkAliasCollection.query(project)(importer)(route.queryObject),
79
- );
80
- if (route.body)
81
- declare("Body", SdkAliasCollection.body(project)(importer)(route.body));
82
- if (
83
- project.config.propagate === true ||
84
- sizeOf(route.success.metadata) !== 0
85
- )
86
- declare(
87
- "Output",
88
- SdkAliasCollection.response(project)(importer)(route),
89
- );
90
- return array;
91
- };
92
-
93
- const writeMetadata =
94
- (project: INestiaProject) =>
95
- (importer: ImportDictionary) =>
96
- (route: ITypedHttpRoute): Node =>
97
- constant("METADATA")(
98
- TypeScriptFactory.createAsExpression(
99
- TypeScriptFactory.createObjectLiteralExpression(
100
- [
101
- TypeScriptFactory.createPropertyAssignment(
102
- "method",
103
- TypeScriptFactory.createStringLiteral(route.method),
104
- ),
105
- TypeScriptFactory.createPropertyAssignment(
106
- "path",
107
- TypeScriptFactory.createStringLiteral(route.path),
108
- ),
109
- TypeScriptFactory.createPropertyAssignment(
110
- "request",
111
- route.body
112
- ? LiteralFactory.write(
113
- route.body !== undefined
114
- ? {
115
- type: route.body.contentType,
116
- encrypted: !!route.body.encrypted,
117
- }
118
- : {
119
- type: "application/json",
120
- encrypted: false,
121
- },
122
- )
123
- : TypeScriptFactory.createNull(),
124
- ),
125
- TypeScriptFactory.createPropertyAssignment(
126
- "response",
127
- route.method !== "HEAD"
128
- ? LiteralFactory.write({
129
- type: route.success.contentType,
130
- encrypted: !!route.success.encrypted,
131
- })
132
- : TypeScriptFactory.createNull(),
133
- ),
134
- TypeScriptFactory.createPropertyAssignment(
135
- "status",
136
- route.success.status !== null
137
- ? ExpressionFactory.number(route.success.status)
138
- : TypeScriptFactory.createNull(),
139
- ),
140
- ...(route.success.contentType ===
141
- "application/x-www-form-urlencoded"
142
- ? [
143
- TypeScriptFactory.createPropertyAssignment(
144
- "parseQuery",
145
- TypeScriptFactory.createCallExpression(
146
- TypeScriptFactory.createIdentifier(
147
- `${SdkImportWizard.typia(importer)}.http.createAssertQuery`,
148
- ),
149
- [
150
- project.config.clone === true
151
- ? SdkAliasCollection.from(project)(importer)(
152
- route.success.metadata,
153
- )
154
- : SdkAliasCollection.name(route.success),
155
- ],
156
- undefined,
157
- ),
158
- ),
159
- ]
160
- : []),
161
- ],
162
- true,
163
- ),
164
- TypeScriptFactory.createTypeReferenceNode(
165
- TypeScriptFactory.createIdentifier("const"),
166
- ),
167
- ),
168
- );
169
-
170
- const writePath =
171
- (project: INestiaProject) =>
172
- (importer: ImportDictionary) =>
173
- (route: ITypedHttpRoute): Node => {
174
- const out = (body: Node) =>
175
- constant("path")(
176
- TypeScriptFactory.createArrowFunction(
177
- [],
178
- [],
179
- SdkHttpParameterProgrammer.getParameterDeclarations({
180
- project,
181
- importer,
182
- route,
183
- body: false,
184
- prefix: false,
185
- }),
186
- undefined,
187
- undefined,
188
- body,
189
- ),
190
- );
191
- const parameters = SdkHttpParameterProgrammer.getSignificant(
192
- route,
193
- false,
194
- );
195
- if (parameters.length === 0)
196
- return out(TypeScriptFactory.createStringLiteral(route.path));
197
-
198
- const access = (name: string) =>
199
- project.config.keyword === true ? `props.${name}` : name;
200
- const template = () => {
201
- const split: string[] = route.path.split(":");
202
- if (split.length === 1)
203
- return TypeScriptFactory.createStringLiteral(route.path);
204
- return TypeScriptFactory.createTemplateExpression(
205
- TypeScriptFactory.createTemplateHead(split[0]!),
206
- split.slice(1).map((s, i, arr) => {
207
- const name: string = s.split("/")[0]!;
208
- return TypeScriptFactory.createTemplateSpan(
209
- TypeScriptFactory.createCallExpression(
210
- TypeScriptFactory.createIdentifier("encodeURIComponent"),
211
- undefined,
212
- [
213
- TypeScriptFactory.createBinaryExpression(
214
- TypeScriptFactory.createCallChain(
215
- TypeScriptFactory.createPropertyAccessChain(
216
- TypeScriptFactory.createIdentifier(
217
- access(
218
- route.pathParameters.find((p) => p.field === name)!
219
- .name,
220
- ),
221
- ),
222
- TypeScriptFactory.createToken(
223
- SyntaxKind.QuestionDotToken,
224
- ),
225
- "toString",
226
- ),
227
- undefined,
228
- undefined,
229
- [],
230
- ),
231
- TypeScriptFactory.createToken(
232
- SyntaxKind.QuestionQuestionToken,
233
- ),
234
- TypeScriptFactory.createStringLiteral("null"),
235
- ),
236
- ],
237
- ),
238
- (i !== arr.length - 1
239
- ? TypeScriptFactory.createTemplateMiddle
240
- : TypeScriptFactory.createTemplateTail)(
241
- s.substring(name.length),
242
- ),
243
- );
244
- }),
245
- );
246
- };
247
- if (route.queryObject === null && route.queryParameters.length === 0)
248
- return out(template());
249
-
250
- const block = (expr: Node) => {
251
- const computeName = (str: string): string =>
252
- parameters.find((p) => p.name === str) !== undefined
253
- ? computeName("_" + str)
254
- : str;
255
- const variables: string = computeName("variables");
256
- return TypeScriptFactory.createBlock(
257
- [
258
- local(variables)("URLSearchParams")(
259
- TypeScriptFactory.createNewExpression(
260
- TypeScriptFactory.createIdentifier("URLSearchParams"),
261
- [],
262
- [],
263
- ),
264
- ),
265
- TypeScriptFactory.createForOfStatement(
266
- undefined,
267
- TypeScriptFactory.createVariableDeclarationList(
268
- [
269
- TypeScriptFactory.createVariableDeclaration(
270
- TypeScriptFactory.createArrayBindingPattern([
271
- TypeScriptFactory.createBindingElement(
272
- undefined,
273
- undefined,
274
- TypeScriptFactory.createIdentifier("key"),
275
- undefined,
276
- ),
277
- TypeScriptFactory.createBindingElement(
278
- undefined,
279
- undefined,
280
- TypeScriptFactory.createIdentifier("value"),
281
- undefined,
282
- ),
283
- ]),
284
- undefined,
285
- undefined,
286
- undefined,
287
- ),
288
- ],
289
- NodeFlags.Const,
290
- ),
291
- TypeScriptFactory.createCallExpression(
292
- TypeScriptFactory.createIdentifier("Object.entries"),
293
- undefined,
294
- [
295
- TypeScriptFactory.createAsExpression(
296
- expr,
297
- TypeFactory.keyword("any"),
298
- ),
299
- ],
300
- ),
301
- TypeScriptFactory.createIfStatement(
302
- TypeScriptFactory.createStrictEquality(
303
- TypeScriptFactory.createIdentifier("undefined"),
304
- TypeScriptFactory.createIdentifier("value"),
305
- ),
306
- TypeScriptFactory.createContinueStatement(),
307
- TypeScriptFactory.createIfStatement(
308
- TypeScriptFactory.createCallExpression(
309
- TypeScriptFactory.createIdentifier("Array.isArray"),
310
- undefined,
311
- [TypeScriptFactory.createIdentifier("value")],
312
- ),
313
- TypeScriptFactory.createExpressionStatement(
314
- TypeScriptFactory.createCallExpression(
315
- TypeScriptFactory.createPropertyAccessExpression(
316
- TypeScriptFactory.createIdentifier("value"),
317
- TypeScriptFactory.createIdentifier("forEach"),
318
- ),
319
- undefined,
320
- [
321
- TypeScriptFactory.createArrowFunction(
322
- undefined,
323
- undefined,
324
- [IdentifierFactory.parameter("elem")],
325
- undefined,
326
- undefined,
327
- TypeScriptFactory.createCallExpression(
328
- IdentifierFactory.access(
329
- TypeScriptFactory.createIdentifier(variables),
330
- "append",
331
- ),
332
- undefined,
333
- [
334
- TypeScriptFactory.createIdentifier("key"),
335
- TypeScriptFactory.createCallExpression(
336
- TypeScriptFactory.createIdentifier("String"),
337
- undefined,
338
- [TypeScriptFactory.createIdentifier("elem")],
339
- ),
340
- ],
341
- ),
342
- ),
343
- ],
344
- ),
345
- ),
346
- TypeScriptFactory.createExpressionStatement(
347
- TypeScriptFactory.createCallExpression(
348
- IdentifierFactory.access(
349
- TypeScriptFactory.createIdentifier(variables),
350
- "set",
351
- ),
352
- undefined,
353
- [
354
- TypeScriptFactory.createIdentifier("key"),
355
- TypeScriptFactory.createCallExpression(
356
- TypeScriptFactory.createIdentifier("String"),
357
- undefined,
358
- [TypeScriptFactory.createIdentifier("value")],
359
- ),
360
- ],
361
- ),
362
- ),
363
- ),
364
- ),
365
- ),
366
- local("location")("string")(template()),
367
- TypeScriptFactory.createReturnStatement(
368
- TypeScriptFactory.createConditionalExpression(
369
- TypeScriptFactory.createStrictEquality(
370
- ExpressionFactory.number(0),
371
- IdentifierFactory.access(
372
- TypeScriptFactory.createIdentifier(variables),
373
- "size",
374
- ),
375
- ),
376
- undefined,
377
- TypeScriptFactory.createIdentifier("location"),
378
- undefined,
379
- TypeScriptFactory.createTemplateExpression(
380
- TypeScriptFactory.createTemplateHead(""),
381
- [
382
- TypeScriptFactory.createTemplateSpan(
383
- TypeScriptFactory.createIdentifier("location"),
384
- TypeScriptFactory.createTemplateMiddle("?"),
385
- ),
386
- TypeScriptFactory.createTemplateSpan(
387
- TypeScriptFactory.createCallExpression(
388
- IdentifierFactory.access(
389
- TypeScriptFactory.createIdentifier(variables),
390
- "toString",
391
- ),
392
- undefined,
393
- undefined,
394
- ),
395
- TypeScriptFactory.createTemplateTail(""),
396
- ),
397
- ],
398
- ),
399
- ),
400
- ),
401
- ],
402
- true,
403
- );
404
- };
405
- if (route.queryObject !== null && route.queryParameters.length === 0)
406
- return out(
407
- block(
408
- route.queryObject.metadata.required === false
409
- ? TypeScriptFactory.createBinaryExpression(
410
- TypeScriptFactory.createIdentifier(route.queryObject.name),
411
- TypeScriptFactory.createToken(
412
- SyntaxKind.QuestionQuestionToken,
413
- ),
414
- TypeScriptFactory.createObjectLiteralExpression([], false),
415
- )
416
- : TypeScriptFactory.createIdentifier(
417
- access(route.queryObject.name),
418
- ),
419
- ),
420
- );
421
- return out(
422
- block(
423
- TypeScriptFactory.createObjectLiteralExpression(
424
- [
425
- ...(route.queryObject
426
- ? [
427
- TypeScriptFactory.createSpreadAssignment(
428
- TypeScriptFactory.createIdentifier(
429
- access(route.queryObject.name),
430
- ),
431
- ),
432
- ]
433
- : []),
434
- ...route.queryParameters.map((q) =>
435
- TypeScriptFactory.createPropertyAssignment(
436
- NamingConvention.variable(q.field!)
437
- ? q.field!
438
- : TypeScriptFactory.createStringLiteral(q.field!),
439
- TypeScriptFactory.createIdentifier(access(q.name)),
440
- ),
441
- ),
442
- ],
443
- true,
444
- ),
445
- ),
446
- );
447
- };
448
-
449
- const writeStringify =
450
- (project: INestiaProject) =>
451
- (importer: ImportDictionary): Node =>
452
- constant("stringify")(
453
- TypeScriptFactory.createArrowFunction(
454
- [],
455
- undefined,
456
- [
457
- IdentifierFactory.parameter(
458
- "input",
459
- TypeScriptFactory.createTypeReferenceNode("Body"),
460
- ),
461
- ],
462
- undefined,
463
- undefined,
464
- TypeScriptFactory.createCallExpression(
465
- IdentifierFactory.access(
466
- IdentifierFactory.access(
467
- TypeScriptFactory.createIdentifier(
468
- SdkImportWizard.typia(importer),
469
- ),
470
- "json",
471
- ),
472
- project.config.assert ? "stringify" : "assertStringify",
473
- ),
474
- undefined,
475
- [TypeScriptFactory.createIdentifier("input")],
476
- ),
477
- ),
478
- );
479
- }
480
-
481
- const local = (name: string) => (type: string) => (expression: Node) =>
482
- TypeScriptFactory.createVariableStatement(
483
- [],
484
- TypeScriptFactory.createVariableDeclarationList(
485
- [
486
- TypeScriptFactory.createVariableDeclaration(
487
- name,
488
- undefined,
489
- TypeScriptFactory.createTypeReferenceNode(type),
490
- expression,
491
- ),
492
- ],
493
- NodeFlags.Const,
494
- ),
495
- );
496
- const constant = (name: string) => (expression: Node) =>
497
- TypeScriptFactory.createVariableStatement(
498
- [TypeScriptFactory.createModifier(SyntaxKind.ExportKeyword)],
499
- TypeScriptFactory.createVariableDeclarationList(
500
- [
501
- TypeScriptFactory.createVariableDeclaration(
502
- name,
503
- undefined,
504
- undefined,
505
- expression,
506
- ),
507
- ],
508
- NodeFlags.Const,
509
- ),
510
- );
1
+ import {
2
+ Node,
3
+ NodeFlags,
4
+ SyntaxKind,
5
+ TypeScriptFactory,
6
+ } from "@nestia/factory";
7
+ import {
8
+ ExpressionFactory,
9
+ IdentifierFactory,
10
+ LiteralFactory,
11
+ TypeFactory,
12
+ } from "@nestia/factory";
13
+ import { NamingConvention } from "@typia/utils";
14
+
15
+ import { sizeOf } from "../../internal/legacy";
16
+ import { INestiaProject } from "../../structures/INestiaProject";
17
+ import { ITypedHttpRoute } from "../../structures/ITypedHttpRoute";
18
+ import { FilePrinter } from "./FilePrinter";
19
+ import { ImportDictionary } from "./ImportDictionary";
20
+ import { SdkAliasCollection } from "./SdkAliasCollection";
21
+ import { SdkHttpParameterProgrammer } from "./SdkHttpParameterProgrammer";
22
+ import { SdkHttpSimulationProgrammer } from "./SdkHttpSimulationProgrammer";
23
+ import { SdkImportWizard } from "./SdkImportWizard";
24
+
25
+ export namespace SdkHttpNamespaceProgrammer {
26
+ export const write =
27
+ (project: INestiaProject) =>
28
+ (importer: ImportDictionary) =>
29
+ (route: ITypedHttpRoute): Node => {
30
+ const types: Node[] = writeTypes(project)(importer)(route);
31
+ return TypeScriptFactory.createModuleDeclaration(
32
+ [TypeScriptFactory.createToken(SyntaxKind.ExportKeyword)],
33
+ TypeScriptFactory.createIdentifier(route.name),
34
+ TypeScriptFactory.createModuleBlock([
35
+ ...types,
36
+ ...(types.length ? [FilePrinter.enter()] : []),
37
+ writeMetadata(project)(importer)(route),
38
+ FilePrinter.enter(),
39
+ writePath(project)(importer)(route),
40
+ ...(project.config.simulate
41
+ ? [
42
+ SdkHttpSimulationProgrammer.random(project)(importer)(route),
43
+ SdkHttpSimulationProgrammer.simulate(project)(importer)(route),
44
+ ]
45
+ : []),
46
+ ...(project.config.json &&
47
+ route.body &&
48
+ (route.body.contentType === "application/json" ||
49
+ route.body.encrypted === true)
50
+ ? [writeStringify(project)(importer)]
51
+ : []),
52
+ ]),
53
+ NodeFlags.Namespace,
54
+ );
55
+ };
56
+
57
+ const writeTypes =
58
+ (project: INestiaProject) =>
59
+ (importer: ImportDictionary) =>
60
+ (route: ITypedHttpRoute): Node[] => {
61
+ const array: Node[] = [];
62
+ const declare = (name: string, type: Node) =>
63
+ array.push(
64
+ TypeScriptFactory.createTypeAliasDeclaration(
65
+ [TypeScriptFactory.createModifier(SyntaxKind.ExportKeyword)],
66
+ name,
67
+ undefined,
68
+ type,
69
+ ),
70
+ );
71
+ if (
72
+ project.config.keyword === true &&
73
+ SdkHttpParameterProgrammer.getSignificant(route, true).length !== 0
74
+ )
75
+ declare(
76
+ "Props",
77
+ SdkAliasCollection.httpProps(project)(importer)(route),
78
+ );
79
+ if (route.headerObject)
80
+ declare(
81
+ "Headers",
82
+ SdkAliasCollection.headers(project)(importer)(route.headerObject),
83
+ );
84
+ if (route.queryObject)
85
+ declare(
86
+ "Query",
87
+ SdkAliasCollection.query(project)(importer)(route.queryObject),
88
+ );
89
+ if (route.body)
90
+ declare("Body", SdkAliasCollection.body(project)(importer)(route.body));
91
+ if (
92
+ project.config.propagate === true ||
93
+ route.success.binary === true ||
94
+ sizeOf(route.success.metadata) !== 0
95
+ )
96
+ declare(
97
+ "Output",
98
+ SdkAliasCollection.response(project)(importer)(route),
99
+ );
100
+ return array;
101
+ };
102
+
103
+ const writeMetadata =
104
+ (project: INestiaProject) =>
105
+ (importer: ImportDictionary) =>
106
+ (route: ITypedHttpRoute): Node =>
107
+ constant("METADATA")(
108
+ TypeScriptFactory.createAsExpression(
109
+ TypeScriptFactory.createObjectLiteralExpression(
110
+ [
111
+ TypeScriptFactory.createPropertyAssignment(
112
+ "method",
113
+ TypeScriptFactory.createStringLiteral(route.method),
114
+ ),
115
+ TypeScriptFactory.createPropertyAssignment(
116
+ "path",
117
+ TypeScriptFactory.createStringLiteral(route.path),
118
+ ),
119
+ TypeScriptFactory.createPropertyAssignment(
120
+ "request",
121
+ route.body
122
+ ? LiteralFactory.write(
123
+ route.body !== undefined
124
+ ? {
125
+ type: route.body.contentType,
126
+ encrypted: !!route.body.encrypted,
127
+ }
128
+ : {
129
+ type: "application/json",
130
+ encrypted: false,
131
+ },
132
+ )
133
+ : TypeScriptFactory.createNull(),
134
+ ),
135
+ TypeScriptFactory.createPropertyAssignment(
136
+ "response",
137
+ route.method !== "HEAD"
138
+ ? LiteralFactory.write({
139
+ type: route.success.contentType,
140
+ encrypted: !!route.success.encrypted,
141
+ })
142
+ : TypeScriptFactory.createNull(),
143
+ ),
144
+ TypeScriptFactory.createPropertyAssignment(
145
+ "status",
146
+ route.success.status !== null
147
+ ? ExpressionFactory.number(route.success.status)
148
+ : TypeScriptFactory.createNull(),
149
+ ),
150
+ ...(route.success.contentType ===
151
+ "application/x-www-form-urlencoded"
152
+ ? [
153
+ TypeScriptFactory.createPropertyAssignment(
154
+ "parseQuery",
155
+ TypeScriptFactory.createCallExpression(
156
+ TypeScriptFactory.createIdentifier(
157
+ `${SdkImportWizard.typia(importer)}.http.createAssertQuery`,
158
+ ),
159
+ [
160
+ project.config.clone === true
161
+ ? SdkAliasCollection.from(project)(importer)(
162
+ route.success.metadata,
163
+ )
164
+ : SdkAliasCollection.name(route.success),
165
+ ],
166
+ undefined,
167
+ ),
168
+ ),
169
+ ]
170
+ : []),
171
+ ],
172
+ true,
173
+ ),
174
+ TypeScriptFactory.createTypeReferenceNode(
175
+ TypeScriptFactory.createIdentifier("const"),
176
+ ),
177
+ ),
178
+ );
179
+
180
+ const writePath =
181
+ (project: INestiaProject) =>
182
+ (importer: ImportDictionary) =>
183
+ (route: ITypedHttpRoute): Node => {
184
+ const out = (body: Node) =>
185
+ constant("path")(
186
+ TypeScriptFactory.createArrowFunction(
187
+ [],
188
+ [],
189
+ SdkHttpParameterProgrammer.getParameterDeclarations({
190
+ project,
191
+ importer,
192
+ route,
193
+ body: false,
194
+ prefix: false,
195
+ }),
196
+ undefined,
197
+ undefined,
198
+ body,
199
+ ),
200
+ );
201
+ const parameters = SdkHttpParameterProgrammer.getSignificant(
202
+ route,
203
+ false,
204
+ );
205
+ if (parameters.length === 0)
206
+ return out(TypeScriptFactory.createStringLiteral(route.path));
207
+
208
+ const access = (name: string) =>
209
+ project.config.keyword === true ? `props.${name}` : name;
210
+ const template = () => {
211
+ const split: string[] = route.path.split(":");
212
+ if (split.length === 1)
213
+ return TypeScriptFactory.createStringLiteral(route.path);
214
+ return TypeScriptFactory.createTemplateExpression(
215
+ TypeScriptFactory.createTemplateHead(split[0]!),
216
+ split.slice(1).map((s, i, arr) => {
217
+ const name: string = s.split("/")[0]!;
218
+ return TypeScriptFactory.createTemplateSpan(
219
+ TypeScriptFactory.createCallExpression(
220
+ TypeScriptFactory.createIdentifier("encodeURIComponent"),
221
+ undefined,
222
+ [
223
+ TypeScriptFactory.createBinaryExpression(
224
+ TypeScriptFactory.createCallChain(
225
+ TypeScriptFactory.createPropertyAccessChain(
226
+ TypeScriptFactory.createIdentifier(
227
+ access(
228
+ route.pathParameters.find((p) => p.field === name)!
229
+ .name,
230
+ ),
231
+ ),
232
+ TypeScriptFactory.createToken(
233
+ SyntaxKind.QuestionDotToken,
234
+ ),
235
+ "toString",
236
+ ),
237
+ undefined,
238
+ undefined,
239
+ [],
240
+ ),
241
+ TypeScriptFactory.createToken(
242
+ SyntaxKind.QuestionQuestionToken,
243
+ ),
244
+ TypeScriptFactory.createStringLiteral("null"),
245
+ ),
246
+ ],
247
+ ),
248
+ (i !== arr.length - 1
249
+ ? TypeScriptFactory.createTemplateMiddle
250
+ : TypeScriptFactory.createTemplateTail)(
251
+ s.substring(name.length),
252
+ ),
253
+ );
254
+ }),
255
+ );
256
+ };
257
+ if (route.queryObject === null && route.queryParameters.length === 0)
258
+ return out(template());
259
+
260
+ const block = (expr: Node) => {
261
+ const computeName = (str: string): string =>
262
+ parameters.find((p) => p.name === str) !== undefined
263
+ ? computeName("_" + str)
264
+ : str;
265
+ const variables: string = computeName("variables");
266
+ return TypeScriptFactory.createBlock(
267
+ [
268
+ local(variables)("URLSearchParams")(
269
+ TypeScriptFactory.createNewExpression(
270
+ TypeScriptFactory.createIdentifier("URLSearchParams"),
271
+ [],
272
+ [],
273
+ ),
274
+ ),
275
+ TypeScriptFactory.createForOfStatement(
276
+ undefined,
277
+ TypeScriptFactory.createVariableDeclarationList(
278
+ [
279
+ TypeScriptFactory.createVariableDeclaration(
280
+ TypeScriptFactory.createArrayBindingPattern([
281
+ TypeScriptFactory.createBindingElement(
282
+ undefined,
283
+ undefined,
284
+ TypeScriptFactory.createIdentifier("key"),
285
+ undefined,
286
+ ),
287
+ TypeScriptFactory.createBindingElement(
288
+ undefined,
289
+ undefined,
290
+ TypeScriptFactory.createIdentifier("value"),
291
+ undefined,
292
+ ),
293
+ ]),
294
+ undefined,
295
+ undefined,
296
+ undefined,
297
+ ),
298
+ ],
299
+ NodeFlags.Const,
300
+ ),
301
+ TypeScriptFactory.createCallExpression(
302
+ TypeScriptFactory.createIdentifier("Object.entries"),
303
+ undefined,
304
+ [
305
+ TypeScriptFactory.createAsExpression(
306
+ expr,
307
+ TypeFactory.keyword("any"),
308
+ ),
309
+ ],
310
+ ),
311
+ TypeScriptFactory.createIfStatement(
312
+ TypeScriptFactory.createStrictEquality(
313
+ TypeScriptFactory.createIdentifier("undefined"),
314
+ TypeScriptFactory.createIdentifier("value"),
315
+ ),
316
+ TypeScriptFactory.createContinueStatement(),
317
+ TypeScriptFactory.createIfStatement(
318
+ TypeScriptFactory.createCallExpression(
319
+ TypeScriptFactory.createIdentifier("Array.isArray"),
320
+ undefined,
321
+ [TypeScriptFactory.createIdentifier("value")],
322
+ ),
323
+ TypeScriptFactory.createExpressionStatement(
324
+ TypeScriptFactory.createCallExpression(
325
+ TypeScriptFactory.createPropertyAccessExpression(
326
+ TypeScriptFactory.createIdentifier("value"),
327
+ TypeScriptFactory.createIdentifier("forEach"),
328
+ ),
329
+ undefined,
330
+ [
331
+ TypeScriptFactory.createArrowFunction(
332
+ undefined,
333
+ undefined,
334
+ [IdentifierFactory.parameter("elem")],
335
+ undefined,
336
+ undefined,
337
+ TypeScriptFactory.createCallExpression(
338
+ IdentifierFactory.access(
339
+ TypeScriptFactory.createIdentifier(variables),
340
+ "append",
341
+ ),
342
+ undefined,
343
+ [
344
+ TypeScriptFactory.createIdentifier("key"),
345
+ TypeScriptFactory.createCallExpression(
346
+ TypeScriptFactory.createIdentifier("String"),
347
+ undefined,
348
+ [TypeScriptFactory.createIdentifier("elem")],
349
+ ),
350
+ ],
351
+ ),
352
+ ),
353
+ ],
354
+ ),
355
+ ),
356
+ TypeScriptFactory.createExpressionStatement(
357
+ TypeScriptFactory.createCallExpression(
358
+ IdentifierFactory.access(
359
+ TypeScriptFactory.createIdentifier(variables),
360
+ "set",
361
+ ),
362
+ undefined,
363
+ [
364
+ TypeScriptFactory.createIdentifier("key"),
365
+ TypeScriptFactory.createCallExpression(
366
+ TypeScriptFactory.createIdentifier("String"),
367
+ undefined,
368
+ [TypeScriptFactory.createIdentifier("value")],
369
+ ),
370
+ ],
371
+ ),
372
+ ),
373
+ ),
374
+ ),
375
+ ),
376
+ local("location")("string")(template()),
377
+ TypeScriptFactory.createReturnStatement(
378
+ TypeScriptFactory.createConditionalExpression(
379
+ TypeScriptFactory.createStrictEquality(
380
+ ExpressionFactory.number(0),
381
+ IdentifierFactory.access(
382
+ TypeScriptFactory.createIdentifier(variables),
383
+ "size",
384
+ ),
385
+ ),
386
+ undefined,
387
+ TypeScriptFactory.createIdentifier("location"),
388
+ undefined,
389
+ TypeScriptFactory.createTemplateExpression(
390
+ TypeScriptFactory.createTemplateHead(""),
391
+ [
392
+ TypeScriptFactory.createTemplateSpan(
393
+ TypeScriptFactory.createIdentifier("location"),
394
+ TypeScriptFactory.createTemplateMiddle("?"),
395
+ ),
396
+ TypeScriptFactory.createTemplateSpan(
397
+ TypeScriptFactory.createCallExpression(
398
+ IdentifierFactory.access(
399
+ TypeScriptFactory.createIdentifier(variables),
400
+ "toString",
401
+ ),
402
+ undefined,
403
+ undefined,
404
+ ),
405
+ TypeScriptFactory.createTemplateTail(""),
406
+ ),
407
+ ],
408
+ ),
409
+ ),
410
+ ),
411
+ ],
412
+ true,
413
+ );
414
+ };
415
+ if (route.queryObject !== null && route.queryParameters.length === 0)
416
+ return out(
417
+ block(
418
+ route.queryObject.metadata.required === false
419
+ ? TypeScriptFactory.createBinaryExpression(
420
+ TypeScriptFactory.createIdentifier(route.queryObject.name),
421
+ TypeScriptFactory.createToken(
422
+ SyntaxKind.QuestionQuestionToken,
423
+ ),
424
+ TypeScriptFactory.createObjectLiteralExpression([], false),
425
+ )
426
+ : TypeScriptFactory.createIdentifier(
427
+ access(route.queryObject.name),
428
+ ),
429
+ ),
430
+ );
431
+ return out(
432
+ block(
433
+ TypeScriptFactory.createObjectLiteralExpression(
434
+ [
435
+ ...(route.queryObject
436
+ ? [
437
+ TypeScriptFactory.createSpreadAssignment(
438
+ TypeScriptFactory.createIdentifier(
439
+ access(route.queryObject.name),
440
+ ),
441
+ ),
442
+ ]
443
+ : []),
444
+ ...route.queryParameters.map((q) =>
445
+ TypeScriptFactory.createPropertyAssignment(
446
+ NamingConvention.variable(q.field!)
447
+ ? q.field!
448
+ : TypeScriptFactory.createStringLiteral(q.field!),
449
+ TypeScriptFactory.createIdentifier(access(q.name)),
450
+ ),
451
+ ),
452
+ ],
453
+ true,
454
+ ),
455
+ ),
456
+ );
457
+ };
458
+
459
+ const writeStringify =
460
+ (project: INestiaProject) =>
461
+ (importer: ImportDictionary): Node =>
462
+ constant("stringify")(
463
+ TypeScriptFactory.createArrowFunction(
464
+ [],
465
+ undefined,
466
+ [
467
+ IdentifierFactory.parameter(
468
+ "input",
469
+ TypeScriptFactory.createTypeReferenceNode("Body"),
470
+ ),
471
+ ],
472
+ undefined,
473
+ undefined,
474
+ TypeScriptFactory.createCallExpression(
475
+ IdentifierFactory.access(
476
+ IdentifierFactory.access(
477
+ TypeScriptFactory.createIdentifier(
478
+ SdkImportWizard.typia(importer),
479
+ ),
480
+ "json",
481
+ ),
482
+ project.config.assert ? "stringify" : "assertStringify",
483
+ ),
484
+ undefined,
485
+ [TypeScriptFactory.createIdentifier("input")],
486
+ ),
487
+ ),
488
+ );
489
+ }
490
+
491
+ const local = (name: string) => (type: string) => (expression: Node) =>
492
+ TypeScriptFactory.createVariableStatement(
493
+ [],
494
+ TypeScriptFactory.createVariableDeclarationList(
495
+ [
496
+ TypeScriptFactory.createVariableDeclaration(
497
+ name,
498
+ undefined,
499
+ TypeScriptFactory.createTypeReferenceNode(type),
500
+ expression,
501
+ ),
502
+ ],
503
+ NodeFlags.Const,
504
+ ),
505
+ );
506
+ const constant = (name: string) => (expression: Node) =>
507
+ TypeScriptFactory.createVariableStatement(
508
+ [TypeScriptFactory.createModifier(SyntaxKind.ExportKeyword)],
509
+ TypeScriptFactory.createVariableDeclarationList(
510
+ [
511
+ TypeScriptFactory.createVariableDeclaration(
512
+ name,
513
+ undefined,
514
+ undefined,
515
+ expression,
516
+ ),
517
+ ],
518
+ NodeFlags.Const,
519
+ ),
520
+ );