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