@nestia/sdk 7.1.1-dev.20250714 → 7.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 (162) 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/analyses/DtoAnalyzer.d.ts +21 -0
  15. package/lib/analyses/DtoAnalyzer.js +208 -0
  16. package/lib/analyses/DtoAnalyzer.js.map +1 -0
  17. package/lib/analyses/ImportAnalyzer.d.ts +3 -8
  18. package/lib/analyses/ImportAnalyzer.js +84 -102
  19. package/lib/analyses/ImportAnalyzer.js.map +1 -1
  20. package/lib/analyses/ReflectHttpOperationAnalyzer.js +1 -1
  21. package/lib/analyses/ReflectHttpOperationAnalyzer.js.map +1 -1
  22. package/lib/analyses/ReflectWebSocketOperationAnalyzer.js +1 -1
  23. package/lib/analyses/ReflectWebSocketOperationAnalyzer.js.map +1 -1
  24. package/lib/executable/internal/NestiaConfigLoader.js +4 -4
  25. package/lib/executable/sdk.js +12 -12
  26. package/lib/generates/internal/E2eFileProgrammer.js +3 -9
  27. package/lib/generates/internal/E2eFileProgrammer.js.map +1 -1
  28. package/lib/generates/internal/ImportDictionary.d.ts +9 -11
  29. package/lib/generates/internal/ImportDictionary.js +55 -48
  30. package/lib/generates/internal/ImportDictionary.js.map +1 -1
  31. package/lib/generates/internal/SdkAliasCollection.js +24 -18
  32. package/lib/generates/internal/SdkAliasCollection.js.map +1 -1
  33. package/lib/generates/internal/SdkFileProgrammer.js +1 -7
  34. package/lib/generates/internal/SdkFileProgrammer.js.map +1 -1
  35. package/lib/generates/internal/SdkHttpCloneReferencer.js +3 -1
  36. package/lib/generates/internal/SdkHttpCloneReferencer.js.map +1 -1
  37. package/lib/generates/internal/SdkHttpSimulationProgrammer.js +4 -3
  38. package/lib/generates/internal/SdkHttpSimulationProgrammer.js.map +1 -1
  39. package/lib/generates/internal/SdkImportWizard.js +28 -21
  40. package/lib/generates/internal/SdkImportWizard.js.map +1 -1
  41. package/lib/generates/internal/SdkTypeProgrammer.js +3 -2
  42. package/lib/generates/internal/SdkTypeProgrammer.js.map +1 -1
  43. package/lib/generates/internal/SdkTypeTagProgrammer.js +10 -8
  44. package/lib/generates/internal/SdkTypeTagProgrammer.js.map +1 -1
  45. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js +8 -6
  46. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js.map +1 -1
  47. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js +12 -9
  48. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js.map +1 -1
  49. package/lib/structures/IReflectHttpOperation.d.ts +2 -2
  50. package/lib/structures/IReflectImport.d.ts +6 -0
  51. package/lib/structures/{IReflectTypeImport.js → IReflectImport.js} +1 -1
  52. package/lib/structures/IReflectImport.js.map +1 -0
  53. package/lib/structures/IReflectWebSocketOperation.d.ts +2 -2
  54. package/lib/structures/IReflectWebSocketOperationParameter.d.ts +2 -2
  55. package/lib/structures/ITypedHttpRoute.d.ts +2 -2
  56. package/lib/structures/ITypedWebSocketRoute.d.ts +2 -2
  57. package/lib/transformers/IOperationMetadata.d.ts +3 -3
  58. package/lib/transformers/SdkOperationProgrammer.d.ts +3 -1
  59. package/lib/transformers/SdkOperationProgrammer.js +57 -26
  60. package/lib/transformers/SdkOperationProgrammer.js.map +1 -1
  61. package/lib/transformers/SdkOperationTransformer.js +3 -3
  62. package/lib/transformers/SdkOperationTransformer.js.map +1 -1
  63. package/package.json +4 -4
  64. package/src/INestiaConfig.ts +269 -269
  65. package/src/NestiaSdkApplication.ts +307 -307
  66. package/src/NestiaSwaggerComposer.ts +138 -138
  67. package/src/analyses/AccessorAnalyzer.ts +67 -67
  68. package/src/analyses/ConfigAnalyzer.ts +155 -155
  69. package/src/analyses/DtoAnalyzer.ts +250 -0
  70. package/src/analyses/ExceptionAnalyzer.ts +154 -154
  71. package/src/analyses/GenericAnalyzer.ts +49 -49
  72. package/src/analyses/ImportAnalyzer.ts +126 -171
  73. package/src/analyses/PathAnalyzer.ts +69 -69
  74. package/src/analyses/ReflectControllerAnalyzer.ts +105 -105
  75. package/src/analyses/ReflectHttpOperationAnalyzer.ts +183 -183
  76. package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +71 -71
  77. package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +348 -348
  78. package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +127 -127
  79. package/src/analyses/ReflectMetadataAnalyzer.ts +44 -44
  80. package/src/analyses/ReflectWebSocketOperationAnalyzer.ts +172 -172
  81. package/src/analyses/SecurityAnalyzer.ts +25 -25
  82. package/src/analyses/TypedHttpRouteAnalyzer.ts +204 -204
  83. package/src/analyses/TypedWebSocketRouteAnalyzer.ts +33 -33
  84. package/src/decorators/OperationMetadata.ts +15 -15
  85. package/src/executable/internal/CommandParser.ts +15 -15
  86. package/src/executable/internal/NestiaConfigLoader.ts +78 -78
  87. package/src/executable/internal/NestiaSdkCommand.ts +103 -103
  88. package/src/executable/sdk.ts +75 -75
  89. package/src/generates/CloneGenerator.ts +66 -66
  90. package/src/generates/E2eGenerator.ts +32 -32
  91. package/src/generates/SdkGenerator.ts +160 -160
  92. package/src/generates/SwaggerGenerator.ts +284 -284
  93. package/src/generates/internal/E2eFileProgrammer.ts +197 -205
  94. package/src/generates/internal/FilePrinter.ts +53 -53
  95. package/src/generates/internal/ImportDictionary.ts +190 -163
  96. package/src/generates/internal/SdkAliasCollection.ts +261 -255
  97. package/src/generates/internal/SdkDistributionComposer.ts +103 -103
  98. package/src/generates/internal/SdkFileProgrammer.ts +110 -116
  99. package/src/generates/internal/SdkHttpCloneProgrammer.ts +124 -124
  100. package/src/generates/internal/SdkHttpCloneReferencer.ts +77 -75
  101. package/src/generates/internal/SdkHttpFunctionProgrammer.ts +279 -279
  102. package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +500 -500
  103. package/src/generates/internal/SdkHttpParameterProgrammer.ts +178 -178
  104. package/src/generates/internal/SdkHttpRouteProgrammer.ts +107 -107
  105. package/src/generates/internal/SdkHttpSimulationProgrammer.ts +310 -309
  106. package/src/generates/internal/SdkImportWizard.ts +62 -55
  107. package/src/generates/internal/SdkRouteDirectory.ts +18 -18
  108. package/src/generates/internal/SdkTypeProgrammer.ts +385 -384
  109. package/src/generates/internal/SdkTypeTagProgrammer.ts +104 -102
  110. package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +368 -366
  111. package/src/generates/internal/SdkWebSocketParameterProgrammer.ts +87 -87
  112. package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +282 -279
  113. package/src/generates/internal/SwaggerDescriptionComposer.ts +64 -64
  114. package/src/generates/internal/SwaggerOperationComposer.ts +119 -119
  115. package/src/generates/internal/SwaggerOperationParameterComposer.ts +177 -177
  116. package/src/generates/internal/SwaggerOperationResponseComposer.ts +110 -110
  117. package/src/index.ts +4 -4
  118. package/src/module.ts +3 -3
  119. package/src/structures/INestiaProject.ts +13 -13
  120. package/src/structures/INestiaSdkInput.ts +20 -20
  121. package/src/structures/IReflectApplication.ts +8 -8
  122. package/src/structures/IReflectController.ts +15 -15
  123. package/src/structures/IReflectHttpOperation.ts +26 -26
  124. package/src/structures/IReflectHttpOperationException.ts +19 -19
  125. package/src/structures/IReflectHttpOperationParameter.ts +77 -81
  126. package/src/structures/IReflectHttpOperationSuccess.ts +22 -22
  127. package/src/structures/IReflectImport.ts +6 -0
  128. package/src/structures/IReflectOperationError.ts +26 -26
  129. package/src/structures/IReflectType.ts +4 -4
  130. package/src/structures/IReflectWebSocketOperation.ts +17 -17
  131. package/src/structures/IReflectWebSocketOperationParameter.ts +36 -38
  132. package/src/structures/ITypedApplication.ts +11 -11
  133. package/src/structures/ITypedHttpRoute.ts +41 -41
  134. package/src/structures/ITypedHttpRouteException.ts +15 -15
  135. package/src/structures/ITypedHttpRouteParameter.ts +41 -41
  136. package/src/structures/ITypedHttpRouteSuccess.ts +22 -22
  137. package/src/structures/ITypedWebSocketRoute.ts +24 -24
  138. package/src/structures/ITypedWebSocketRouteParameter.ts +3 -3
  139. package/src/structures/MethodType.ts +5 -5
  140. package/src/structures/ParamCategory.ts +1 -1
  141. package/src/structures/TypeEntry.ts +22 -22
  142. package/src/transform.ts +9 -9
  143. package/src/transformers/IOperationMetadata.ts +44 -44
  144. package/src/transformers/ISdkOperationTransformerContext.ts +8 -8
  145. package/src/transformers/SdkOperationProgrammer.ts +238 -209
  146. package/src/transformers/SdkOperationTransformer.ts +252 -253
  147. package/src/transformers/TextPlainValidator.ts +17 -17
  148. package/src/typings/get-function-location.d.ts +7 -7
  149. package/src/utils/ArrayUtil.ts +26 -26
  150. package/src/utils/FileRetriever.ts +22 -22
  151. package/src/utils/MapUtil.ts +14 -14
  152. package/src/utils/MetadataUtil.ts +26 -26
  153. package/src/utils/PathUtil.ts +10 -10
  154. package/src/utils/SourceFinder.ts +66 -66
  155. package/src/utils/StringUtil.ts +17 -17
  156. package/src/utils/StripEnums.ts +5 -5
  157. package/src/utils/VersioningStrategy.ts +28 -28
  158. package/src/validators/HttpHeadersValidator.ts +34 -34
  159. package/src/validators/HttpQueryValidator.ts +34 -34
  160. package/lib/structures/IReflectTypeImport.d.ts +0 -4
  161. package/lib/structures/IReflectTypeImport.js.map +0 -1
  162. package/src/structures/IReflectTypeImport.ts +0 -4
@@ -1,366 +1,368 @@
1
- import ts from "typescript";
2
- import { ExpressionFactory } from "typia/lib/factories/ExpressionFactory";
3
- import { IdentifierFactory } from "typia/lib/factories/IdentifierFactory";
4
- import { TypeFactory } from "typia/lib/factories/TypeFactory";
5
-
6
- import { INestiaProject } from "../../structures/INestiaProject";
7
- import { ITypedWebSocketRoute } from "../../structures/ITypedWebSocketRoute";
8
- import { FilePrinter } from "./FilePrinter";
9
- import { ImportDictionary } from "./ImportDictionary";
10
- import { SdkAliasCollection } from "./SdkAliasCollection";
11
- import { SdkWebSocketParameterProgrammer } from "./SdkWebSocketParameterProgrammer";
12
-
13
- export namespace SdkWebSocketNamespaceProgrammer {
14
- export const write =
15
- (project: INestiaProject) =>
16
- (importer: ImportDictionary) =>
17
- (route: ITypedWebSocketRoute): ts.ModuleDeclaration =>
18
- ts.factory.createModuleDeclaration(
19
- [ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
20
- ts.factory.createIdentifier(route.name),
21
- ts.factory.createModuleBlock([
22
- ...writeTypes(project)(importer)(route),
23
- FilePrinter.enter(),
24
- writePath(project)(route),
25
- ]),
26
- ts.NodeFlags.Namespace,
27
- );
28
-
29
- const writeTypes =
30
- (project: INestiaProject) =>
31
- (importer: ImportDictionary) =>
32
- (route: ITypedWebSocketRoute): ts.TypeAliasDeclaration[] => {
33
- const output: ts.TypeAliasDeclaration[] = [];
34
- const declare = (name: string, type: ts.TypeNode) =>
35
- output.push(
36
- ts.factory.createTypeAliasDeclaration(
37
- [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
38
- name,
39
- undefined,
40
- type,
41
- ),
42
- );
43
-
44
- if (project.config.keyword === true)
45
- declare("Props", SdkAliasCollection.websocketProps(route));
46
- declare(
47
- "Output",
48
- ts.factory.createTypeLiteralNode([
49
- ts.factory.createPropertySignature(
50
- undefined,
51
- "connector",
52
- undefined,
53
- ts.factory.createTypeReferenceNode(
54
- importer.external({
55
- type: false,
56
- library: "tgrid",
57
- instance: "WebSocketConnector",
58
- }),
59
- [
60
- ts.factory.createTypeReferenceNode("Header"),
61
- ts.factory.createTypeReferenceNode("Provider"),
62
- ts.factory.createTypeReferenceNode("Listener"),
63
- ],
64
- ),
65
- ),
66
- ts.factory.createPropertySignature(
67
- undefined,
68
- "driver",
69
- undefined,
70
- ts.factory.createTypeReferenceNode(
71
- importer.external({
72
- type: true,
73
- library: "tgrid",
74
- instance: "Driver",
75
- }),
76
- [ts.factory.createTypeReferenceNode("Listener")],
77
- ),
78
- ),
79
- ]),
80
- );
81
-
82
- declare(
83
- "Header",
84
- SdkAliasCollection.name({
85
- type: (route.header?.type ?? route.acceptor.type.typeArguments?.[0])!,
86
- }),
87
- );
88
- declare(
89
- "Provider",
90
- SdkAliasCollection.name({
91
- type:
92
- route.driver?.type.typeArguments?.[0] ??
93
- route.acceptor.type.typeArguments?.[2]!,
94
- }),
95
- );
96
- declare(
97
- "Listener",
98
- SdkAliasCollection.name({
99
- type: route.acceptor.type.typeArguments?.[1]!,
100
- }),
101
- );
102
- if (route.query) declare("Query", SdkAliasCollection.name(route.query));
103
- return output;
104
- };
105
-
106
- const writePath =
107
- (project: INestiaProject) =>
108
- (route: ITypedWebSocketRoute): ts.VariableStatement => {
109
- const out = (body: ts.ConciseBody) =>
110
- constant("path")(
111
- ts.factory.createArrowFunction(
112
- [],
113
- [],
114
- SdkWebSocketParameterProgrammer.getParameterDeclarations({
115
- project,
116
- route,
117
- provider: false,
118
- prefix: false,
119
- }),
120
- undefined,
121
- undefined,
122
- body,
123
- ),
124
- );
125
- if (route.pathParameters.length === 0 && route.query === null)
126
- return out(ts.factory.createStringLiteral(route.path));
127
-
128
- const access = (key: string) =>
129
- project.config.keyword === true
130
- ? ts.factory.createPropertyAccessExpression(
131
- ts.factory.createIdentifier("props"),
132
- key,
133
- )
134
- : ts.factory.createIdentifier(key);
135
- const template = () => {
136
- const split: string[] = route.path.split(":");
137
- if (split.length === 1)
138
- return ts.factory.createStringLiteral(route.path);
139
- return ts.factory.createTemplateExpression(
140
- ts.factory.createTemplateHead(split[0]),
141
- split.slice(1).map((s, i, arr) => {
142
- const name: string = s.split("/")[0];
143
- return ts.factory.createTemplateSpan(
144
- ts.factory.createCallExpression(
145
- ts.factory.createIdentifier("encodeURIComponent"),
146
- undefined,
147
- [
148
- ts.factory.createBinaryExpression(
149
- ts.factory.createCallChain(
150
- ts.factory.createPropertyAccessChain(
151
- access(
152
- route.pathParameters.find((p) => p.field === name)!
153
- .name,
154
- ),
155
- ts.factory.createToken(ts.SyntaxKind.QuestionDotToken),
156
- "toString",
157
- ),
158
- undefined,
159
- undefined,
160
- [],
161
- ),
162
- ts.factory.createToken(ts.SyntaxKind.QuestionQuestionToken),
163
- ts.factory.createStringLiteral("null"),
164
- ),
165
- ],
166
- ),
167
- (i !== arr.length - 1
168
- ? ts.factory.createTemplateMiddle
169
- : ts.factory.createTemplateTail)(s.substring(name.length)),
170
- );
171
- }),
172
- );
173
- };
174
- if (route.query === null) return out(template());
175
-
176
- const block = (expr: ts.Expression) => {
177
- const computeName = (str: string): string =>
178
- [...route.pathParameters, ...(route.query ? [route.query] : [])].find(
179
- (p) => p.name === str,
180
- ) !== undefined
181
- ? computeName("_" + str)
182
- : str;
183
- const variables: string = computeName("variables");
184
- return ts.factory.createBlock(
185
- [
186
- local(variables)("URLSearchParams")(
187
- ts.factory.createNewExpression(
188
- ts.factory.createIdentifier("URLSearchParams"),
189
- [],
190
- [],
191
- ),
192
- ),
193
- ts.factory.createForOfStatement(
194
- undefined,
195
- ts.factory.createVariableDeclarationList(
196
- [
197
- ts.factory.createVariableDeclaration(
198
- ts.factory.createArrayBindingPattern([
199
- ts.factory.createBindingElement(
200
- undefined,
201
- undefined,
202
- ts.factory.createIdentifier("key"),
203
- undefined,
204
- ),
205
- ts.factory.createBindingElement(
206
- undefined,
207
- undefined,
208
- ts.factory.createIdentifier("value"),
209
- undefined,
210
- ),
211
- ]),
212
- undefined,
213
- undefined,
214
- undefined,
215
- ),
216
- ],
217
- ts.NodeFlags.Const,
218
- ),
219
- ts.factory.createCallExpression(
220
- ts.factory.createIdentifier("Object.entries"),
221
- undefined,
222
- [
223
- ts.factory.createAsExpression(
224
- expr,
225
- TypeFactory.keyword("any"),
226
- ),
227
- ],
228
- ),
229
- ts.factory.createIfStatement(
230
- ts.factory.createStrictEquality(
231
- ts.factory.createIdentifier("undefined"),
232
- ts.factory.createIdentifier("value"),
233
- ),
234
- ts.factory.createContinueStatement(),
235
- ts.factory.createIfStatement(
236
- ts.factory.createCallExpression(
237
- ts.factory.createIdentifier("Array.isArray"),
238
- undefined,
239
- [ts.factory.createIdentifier("value")],
240
- ),
241
- ts.factory.createExpressionStatement(
242
- ts.factory.createCallExpression(
243
- ts.factory.createPropertyAccessExpression(
244
- ts.factory.createIdentifier("value"),
245
- ts.factory.createIdentifier("forEach"),
246
- ),
247
- undefined,
248
- [
249
- ts.factory.createArrowFunction(
250
- undefined,
251
- undefined,
252
- [IdentifierFactory.parameter("elem")],
253
- undefined,
254
- undefined,
255
- ts.factory.createCallExpression(
256
- IdentifierFactory.access(
257
- ts.factory.createIdentifier(variables),
258
- "append",
259
- ),
260
- undefined,
261
- [
262
- ts.factory.createIdentifier("key"),
263
- ts.factory.createCallExpression(
264
- ts.factory.createIdentifier("String"),
265
- undefined,
266
- [ts.factory.createIdentifier("elem")],
267
- ),
268
- ],
269
- ),
270
- ),
271
- ],
272
- ),
273
- ),
274
- ts.factory.createExpressionStatement(
275
- ts.factory.createCallExpression(
276
- IdentifierFactory.access(
277
- ts.factory.createIdentifier(variables),
278
- "set",
279
- ),
280
- undefined,
281
- [
282
- ts.factory.createIdentifier("key"),
283
- ts.factory.createCallExpression(
284
- ts.factory.createIdentifier("String"),
285
- undefined,
286
- [ts.factory.createIdentifier("value")],
287
- ),
288
- ],
289
- ),
290
- ),
291
- ),
292
- ),
293
- ),
294
- local("location")("string")(template()),
295
- ts.factory.createReturnStatement(
296
- ts.factory.createConditionalExpression(
297
- ts.factory.createStrictEquality(
298
- ExpressionFactory.number(0),
299
- IdentifierFactory.access(
300
- ts.factory.createIdentifier(variables),
301
- "size",
302
- ),
303
- ),
304
- undefined,
305
- ts.factory.createIdentifier("location"),
306
- undefined,
307
- ts.factory.createTemplateExpression(
308
- ts.factory.createTemplateHead(""),
309
- [
310
- ts.factory.createTemplateSpan(
311
- ts.factory.createIdentifier("location"),
312
- ts.factory.createTemplateMiddle("?"),
313
- ),
314
- ts.factory.createTemplateSpan(
315
- ts.factory.createCallExpression(
316
- IdentifierFactory.access(
317
- ts.factory.createIdentifier(variables),
318
- "toString",
319
- ),
320
- undefined,
321
- undefined,
322
- ),
323
- ts.factory.createTemplateTail(""),
324
- ),
325
- ],
326
- ),
327
- ),
328
- ),
329
- ],
330
- true,
331
- );
332
- };
333
- return out(block(access(route.query.name)));
334
- };
335
- }
336
-
337
- const local = (name: string) => (type: string) => (expression: ts.Expression) =>
338
- ts.factory.createVariableStatement(
339
- [],
340
- ts.factory.createVariableDeclarationList(
341
- [
342
- ts.factory.createVariableDeclaration(
343
- name,
344
- undefined,
345
- ts.factory.createTypeReferenceNode(type),
346
- expression,
347
- ),
348
- ],
349
- ts.NodeFlags.Const,
350
- ),
351
- );
352
- const constant = (name: string) => (expression: ts.Expression) =>
353
- ts.factory.createVariableStatement(
354
- [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
355
- ts.factory.createVariableDeclarationList(
356
- [
357
- ts.factory.createVariableDeclaration(
358
- name,
359
- undefined,
360
- undefined,
361
- expression,
362
- ),
363
- ],
364
- ts.NodeFlags.Const,
365
- ),
366
- );
1
+ import ts from "typescript";
2
+ import { ExpressionFactory } from "typia/lib/factories/ExpressionFactory";
3
+ import { IdentifierFactory } from "typia/lib/factories/IdentifierFactory";
4
+ import { TypeFactory } from "typia/lib/factories/TypeFactory";
5
+
6
+ import { INestiaProject } from "../../structures/INestiaProject";
7
+ import { ITypedWebSocketRoute } from "../../structures/ITypedWebSocketRoute";
8
+ import { FilePrinter } from "./FilePrinter";
9
+ import { ImportDictionary } from "./ImportDictionary";
10
+ import { SdkAliasCollection } from "./SdkAliasCollection";
11
+ import { SdkWebSocketParameterProgrammer } from "./SdkWebSocketParameterProgrammer";
12
+
13
+ export namespace SdkWebSocketNamespaceProgrammer {
14
+ export const write =
15
+ (project: INestiaProject) =>
16
+ (importer: ImportDictionary) =>
17
+ (route: ITypedWebSocketRoute): ts.ModuleDeclaration =>
18
+ ts.factory.createModuleDeclaration(
19
+ [ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
20
+ ts.factory.createIdentifier(route.name),
21
+ ts.factory.createModuleBlock([
22
+ ...writeTypes(project)(importer)(route),
23
+ FilePrinter.enter(),
24
+ writePath(project)(route),
25
+ ]),
26
+ ts.NodeFlags.Namespace,
27
+ );
28
+
29
+ const writeTypes =
30
+ (project: INestiaProject) =>
31
+ (importer: ImportDictionary) =>
32
+ (route: ITypedWebSocketRoute): ts.TypeAliasDeclaration[] => {
33
+ const output: ts.TypeAliasDeclaration[] = [];
34
+ const declare = (name: string, type: ts.TypeNode) =>
35
+ output.push(
36
+ ts.factory.createTypeAliasDeclaration(
37
+ [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
38
+ name,
39
+ undefined,
40
+ type,
41
+ ),
42
+ );
43
+
44
+ if (project.config.keyword === true)
45
+ declare("Props", SdkAliasCollection.websocketProps(route));
46
+ declare(
47
+ "Output",
48
+ ts.factory.createTypeLiteralNode([
49
+ ts.factory.createPropertySignature(
50
+ undefined,
51
+ "connector",
52
+ undefined,
53
+ ts.factory.createTypeReferenceNode(
54
+ importer.external({
55
+ declaration: false,
56
+ file: "tgrid",
57
+ type: "element",
58
+ name: "WebSocketConnector",
59
+ }),
60
+ [
61
+ ts.factory.createTypeReferenceNode("Header"),
62
+ ts.factory.createTypeReferenceNode("Provider"),
63
+ ts.factory.createTypeReferenceNode("Listener"),
64
+ ],
65
+ ),
66
+ ),
67
+ ts.factory.createPropertySignature(
68
+ undefined,
69
+ "driver",
70
+ undefined,
71
+ ts.factory.createTypeReferenceNode(
72
+ importer.external({
73
+ declaration: true,
74
+ file: "tgrid",
75
+ type: "element",
76
+ name: "Driver",
77
+ }),
78
+ [ts.factory.createTypeReferenceNode("Listener")],
79
+ ),
80
+ ),
81
+ ]),
82
+ );
83
+
84
+ declare(
85
+ "Header",
86
+ SdkAliasCollection.name({
87
+ type: (route.header?.type ?? route.acceptor.type.typeArguments?.[0])!,
88
+ }),
89
+ );
90
+ declare(
91
+ "Provider",
92
+ SdkAliasCollection.name({
93
+ type:
94
+ route.driver?.type.typeArguments?.[0] ??
95
+ route.acceptor.type.typeArguments?.[2]!,
96
+ }),
97
+ );
98
+ declare(
99
+ "Listener",
100
+ SdkAliasCollection.name({
101
+ type: route.acceptor.type.typeArguments?.[1]!,
102
+ }),
103
+ );
104
+ if (route.query) declare("Query", SdkAliasCollection.name(route.query));
105
+ return output;
106
+ };
107
+
108
+ const writePath =
109
+ (project: INestiaProject) =>
110
+ (route: ITypedWebSocketRoute): ts.VariableStatement => {
111
+ const out = (body: ts.ConciseBody) =>
112
+ constant("path")(
113
+ ts.factory.createArrowFunction(
114
+ [],
115
+ [],
116
+ SdkWebSocketParameterProgrammer.getParameterDeclarations({
117
+ project,
118
+ route,
119
+ provider: false,
120
+ prefix: false,
121
+ }),
122
+ undefined,
123
+ undefined,
124
+ body,
125
+ ),
126
+ );
127
+ if (route.pathParameters.length === 0 && route.query === null)
128
+ return out(ts.factory.createStringLiteral(route.path));
129
+
130
+ const access = (key: string) =>
131
+ project.config.keyword === true
132
+ ? ts.factory.createPropertyAccessExpression(
133
+ ts.factory.createIdentifier("props"),
134
+ key,
135
+ )
136
+ : ts.factory.createIdentifier(key);
137
+ const template = () => {
138
+ const split: string[] = route.path.split(":");
139
+ if (split.length === 1)
140
+ return ts.factory.createStringLiteral(route.path);
141
+ return ts.factory.createTemplateExpression(
142
+ ts.factory.createTemplateHead(split[0]),
143
+ split.slice(1).map((s, i, arr) => {
144
+ const name: string = s.split("/")[0];
145
+ return ts.factory.createTemplateSpan(
146
+ ts.factory.createCallExpression(
147
+ ts.factory.createIdentifier("encodeURIComponent"),
148
+ undefined,
149
+ [
150
+ ts.factory.createBinaryExpression(
151
+ ts.factory.createCallChain(
152
+ ts.factory.createPropertyAccessChain(
153
+ access(
154
+ route.pathParameters.find((p) => p.field === name)!
155
+ .name,
156
+ ),
157
+ ts.factory.createToken(ts.SyntaxKind.QuestionDotToken),
158
+ "toString",
159
+ ),
160
+ undefined,
161
+ undefined,
162
+ [],
163
+ ),
164
+ ts.factory.createToken(ts.SyntaxKind.QuestionQuestionToken),
165
+ ts.factory.createStringLiteral("null"),
166
+ ),
167
+ ],
168
+ ),
169
+ (i !== arr.length - 1
170
+ ? ts.factory.createTemplateMiddle
171
+ : ts.factory.createTemplateTail)(s.substring(name.length)),
172
+ );
173
+ }),
174
+ );
175
+ };
176
+ if (route.query === null) return out(template());
177
+
178
+ const block = (expr: ts.Expression) => {
179
+ const computeName = (str: string): string =>
180
+ [...route.pathParameters, ...(route.query ? [route.query] : [])].find(
181
+ (p) => p.name === str,
182
+ ) !== undefined
183
+ ? computeName("_" + str)
184
+ : str;
185
+ const variables: string = computeName("variables");
186
+ return ts.factory.createBlock(
187
+ [
188
+ local(variables)("URLSearchParams")(
189
+ ts.factory.createNewExpression(
190
+ ts.factory.createIdentifier("URLSearchParams"),
191
+ [],
192
+ [],
193
+ ),
194
+ ),
195
+ ts.factory.createForOfStatement(
196
+ undefined,
197
+ ts.factory.createVariableDeclarationList(
198
+ [
199
+ ts.factory.createVariableDeclaration(
200
+ ts.factory.createArrayBindingPattern([
201
+ ts.factory.createBindingElement(
202
+ undefined,
203
+ undefined,
204
+ ts.factory.createIdentifier("key"),
205
+ undefined,
206
+ ),
207
+ ts.factory.createBindingElement(
208
+ undefined,
209
+ undefined,
210
+ ts.factory.createIdentifier("value"),
211
+ undefined,
212
+ ),
213
+ ]),
214
+ undefined,
215
+ undefined,
216
+ undefined,
217
+ ),
218
+ ],
219
+ ts.NodeFlags.Const,
220
+ ),
221
+ ts.factory.createCallExpression(
222
+ ts.factory.createIdentifier("Object.entries"),
223
+ undefined,
224
+ [
225
+ ts.factory.createAsExpression(
226
+ expr,
227
+ TypeFactory.keyword("any"),
228
+ ),
229
+ ],
230
+ ),
231
+ ts.factory.createIfStatement(
232
+ ts.factory.createStrictEquality(
233
+ ts.factory.createIdentifier("undefined"),
234
+ ts.factory.createIdentifier("value"),
235
+ ),
236
+ ts.factory.createContinueStatement(),
237
+ ts.factory.createIfStatement(
238
+ ts.factory.createCallExpression(
239
+ ts.factory.createIdentifier("Array.isArray"),
240
+ undefined,
241
+ [ts.factory.createIdentifier("value")],
242
+ ),
243
+ ts.factory.createExpressionStatement(
244
+ ts.factory.createCallExpression(
245
+ ts.factory.createPropertyAccessExpression(
246
+ ts.factory.createIdentifier("value"),
247
+ ts.factory.createIdentifier("forEach"),
248
+ ),
249
+ undefined,
250
+ [
251
+ ts.factory.createArrowFunction(
252
+ undefined,
253
+ undefined,
254
+ [IdentifierFactory.parameter("elem")],
255
+ undefined,
256
+ undefined,
257
+ ts.factory.createCallExpression(
258
+ IdentifierFactory.access(
259
+ ts.factory.createIdentifier(variables),
260
+ "append",
261
+ ),
262
+ undefined,
263
+ [
264
+ ts.factory.createIdentifier("key"),
265
+ ts.factory.createCallExpression(
266
+ ts.factory.createIdentifier("String"),
267
+ undefined,
268
+ [ts.factory.createIdentifier("elem")],
269
+ ),
270
+ ],
271
+ ),
272
+ ),
273
+ ],
274
+ ),
275
+ ),
276
+ ts.factory.createExpressionStatement(
277
+ ts.factory.createCallExpression(
278
+ IdentifierFactory.access(
279
+ ts.factory.createIdentifier(variables),
280
+ "set",
281
+ ),
282
+ undefined,
283
+ [
284
+ ts.factory.createIdentifier("key"),
285
+ ts.factory.createCallExpression(
286
+ ts.factory.createIdentifier("String"),
287
+ undefined,
288
+ [ts.factory.createIdentifier("value")],
289
+ ),
290
+ ],
291
+ ),
292
+ ),
293
+ ),
294
+ ),
295
+ ),
296
+ local("location")("string")(template()),
297
+ ts.factory.createReturnStatement(
298
+ ts.factory.createConditionalExpression(
299
+ ts.factory.createStrictEquality(
300
+ ExpressionFactory.number(0),
301
+ IdentifierFactory.access(
302
+ ts.factory.createIdentifier(variables),
303
+ "size",
304
+ ),
305
+ ),
306
+ undefined,
307
+ ts.factory.createIdentifier("location"),
308
+ undefined,
309
+ ts.factory.createTemplateExpression(
310
+ ts.factory.createTemplateHead(""),
311
+ [
312
+ ts.factory.createTemplateSpan(
313
+ ts.factory.createIdentifier("location"),
314
+ ts.factory.createTemplateMiddle("?"),
315
+ ),
316
+ ts.factory.createTemplateSpan(
317
+ ts.factory.createCallExpression(
318
+ IdentifierFactory.access(
319
+ ts.factory.createIdentifier(variables),
320
+ "toString",
321
+ ),
322
+ undefined,
323
+ undefined,
324
+ ),
325
+ ts.factory.createTemplateTail(""),
326
+ ),
327
+ ],
328
+ ),
329
+ ),
330
+ ),
331
+ ],
332
+ true,
333
+ );
334
+ };
335
+ return out(block(access(route.query.name)));
336
+ };
337
+ }
338
+
339
+ const local = (name: string) => (type: string) => (expression: ts.Expression) =>
340
+ ts.factory.createVariableStatement(
341
+ [],
342
+ ts.factory.createVariableDeclarationList(
343
+ [
344
+ ts.factory.createVariableDeclaration(
345
+ name,
346
+ undefined,
347
+ ts.factory.createTypeReferenceNode(type),
348
+ expression,
349
+ ),
350
+ ],
351
+ ts.NodeFlags.Const,
352
+ ),
353
+ );
354
+ const constant = (name: string) => (expression: ts.Expression) =>
355
+ ts.factory.createVariableStatement(
356
+ [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
357
+ ts.factory.createVariableDeclarationList(
358
+ [
359
+ ts.factory.createVariableDeclaration(
360
+ name,
361
+ undefined,
362
+ undefined,
363
+ expression,
364
+ ),
365
+ ],
366
+ ts.NodeFlags.Const,
367
+ ),
368
+ );