@nestia/sdk 4.6.2 → 5.0.0-dev.20250301

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 (109) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +91 -92
  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 +9 -10
  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 +377 -377
  60. package/src/generates/internal/SdkTypeTagProgrammer.ts +102 -102
  61. package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +362 -362
  62. package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +265 -265
  63. package/src/generates/internal/SwaggerDescriptionComposer.ts +64 -64
  64. package/src/generates/internal/SwaggerOperationComposer.ts +119 -119
  65. package/src/generates/internal/SwaggerOperationParameterComposer.ts +177 -177
  66. package/src/generates/internal/SwaggerOperationResponseComposer.ts +110 -110
  67. package/src/index.ts +4 -4
  68. package/src/module.ts +3 -3
  69. package/src/structures/INestiaProject.ts +13 -13
  70. package/src/structures/INestiaSdkInput.ts +20 -20
  71. package/src/structures/IReflectApplication.ts +8 -8
  72. package/src/structures/IReflectController.ts +15 -15
  73. package/src/structures/IReflectHttpOperation.ts +26 -26
  74. package/src/structures/IReflectHttpOperationException.ts +19 -19
  75. package/src/structures/IReflectHttpOperationParameter.ts +81 -81
  76. package/src/structures/IReflectHttpOperationSuccess.ts +22 -22
  77. package/src/structures/IReflectOperationError.ts +26 -26
  78. package/src/structures/IReflectType.ts +4 -4
  79. package/src/structures/IReflectTypeImport.ts +4 -4
  80. package/src/structures/IReflectWebSocketOperation.ts +17 -17
  81. package/src/structures/IReflectWebSocketOperationParameter.ts +38 -38
  82. package/src/structures/ITypedApplication.ts +11 -11
  83. package/src/structures/ITypedHttpRoute.ts +30 -30
  84. package/src/structures/ITypedHttpRouteException.ts +15 -15
  85. package/src/structures/ITypedHttpRouteParameter.ts +41 -41
  86. package/src/structures/ITypedHttpRouteSuccess.ts +22 -22
  87. package/src/structures/ITypedWebSocketRoute.ts +20 -20
  88. package/src/structures/ITypedWebSocketRouteParameter.ts +3 -3
  89. package/src/structures/MethodType.ts +5 -5
  90. package/src/structures/ParamCategory.ts +1 -1
  91. package/src/structures/TypeEntry.ts +22 -22
  92. package/src/transform.ts +9 -9
  93. package/src/transformers/IOperationMetadata.ts +44 -44
  94. package/src/transformers/ISdkOperationTransformerContext.ts +8 -8
  95. package/src/transformers/SdkOperationProgrammer.ts +209 -209
  96. package/src/transformers/SdkOperationTransformer.ts +253 -253
  97. package/src/transformers/TextPlainValidator.ts +17 -17
  98. package/src/typings/get-function-location.d.ts +7 -7
  99. package/src/utils/ArrayUtil.ts +26 -26
  100. package/src/utils/FileRetriever.ts +22 -22
  101. package/src/utils/MapUtil.ts +14 -14
  102. package/src/utils/MetadataUtil.ts +26 -26
  103. package/src/utils/PathUtil.ts +10 -10
  104. package/src/utils/SourceFinder.ts +66 -66
  105. package/src/utils/StringUtil.ts +17 -17
  106. package/src/utils/StripEnums.ts +5 -5
  107. package/src/utils/VersioningStrategy.ts +28 -28
  108. package/src/validators/HttpHeadersValidator.ts +34 -34
  109. package/src/validators/HttpQueryValidator.ts +34 -34
@@ -1,362 +1,362 @@
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 split: string[] = route.path.split(":");
142
- if (split.length === 1) return ts.factory.createStringLiteral(route.path);
143
- return ts.factory.createTemplateExpression(
144
- ts.factory.createTemplateHead(split[0]),
145
- split.slice(1).map((s, i, arr) => {
146
- const name: string = s.split("/")[0];
147
- return ts.factory.createTemplateSpan(
148
- ts.factory.createCallExpression(
149
- ts.factory.createIdentifier("encodeURIComponent"),
150
- undefined,
151
- [
152
- ts.factory.createBinaryExpression(
153
- ts.factory.createCallChain(
154
- ts.factory.createPropertyAccessChain(
155
- ts.factory.createIdentifier(
156
- pathParams.find((p) => p.field === name)!.name,
157
- ),
158
- ts.factory.createToken(ts.SyntaxKind.QuestionDotToken),
159
- "toString",
160
- ),
161
- undefined,
162
- undefined,
163
- [],
164
- ),
165
- ts.factory.createToken(ts.SyntaxKind.QuestionQuestionToken),
166
- ts.factory.createStringLiteral("null"),
167
- ),
168
- ],
169
- ),
170
- (i !== arr.length - 1
171
- ? ts.factory.createTemplateMiddle
172
- : ts.factory.createTemplateTail)(s.substring(name.length)),
173
- );
174
- }),
175
- );
176
- };
177
- if (query === undefined) return out(template());
178
-
179
- const block = (expr: ts.Expression) => {
180
- const computeName = (str: string): string =>
181
- total.find((p) => p.name === str) !== undefined
182
- ? computeName("_" + str)
183
- : str;
184
- const variables: string = computeName("variables");
185
- return ts.factory.createBlock(
186
- [
187
- local(variables)("URLSearchParams")(
188
- ts.factory.createNewExpression(
189
- ts.factory.createIdentifier("URLSearchParams"),
190
- [],
191
- [],
192
- ),
193
- ),
194
- ts.factory.createForOfStatement(
195
- undefined,
196
- ts.factory.createVariableDeclarationList(
197
- [
198
- ts.factory.createVariableDeclaration(
199
- ts.factory.createArrayBindingPattern([
200
- ts.factory.createBindingElement(
201
- undefined,
202
- undefined,
203
- ts.factory.createIdentifier("key"),
204
- undefined,
205
- ),
206
- ts.factory.createBindingElement(
207
- undefined,
208
- undefined,
209
- ts.factory.createIdentifier("value"),
210
- undefined,
211
- ),
212
- ]),
213
- undefined,
214
- undefined,
215
- undefined,
216
- ),
217
- ],
218
- ts.NodeFlags.Const,
219
- ),
220
- ts.factory.createCallExpression(
221
- ts.factory.createIdentifier("Object.entries"),
222
- undefined,
223
- [ts.factory.createAsExpression(expr, TypeFactory.keyword("any"))],
224
- ),
225
- ts.factory.createIfStatement(
226
- ts.factory.createStrictEquality(
227
- ts.factory.createIdentifier("undefined"),
228
- ts.factory.createIdentifier("value"),
229
- ),
230
- ts.factory.createContinueStatement(),
231
- ts.factory.createIfStatement(
232
- ts.factory.createCallExpression(
233
- ts.factory.createIdentifier("Array.isArray"),
234
- undefined,
235
- [ts.factory.createIdentifier("value")],
236
- ),
237
- ts.factory.createExpressionStatement(
238
- ts.factory.createCallExpression(
239
- ts.factory.createPropertyAccessExpression(
240
- ts.factory.createIdentifier("value"),
241
- ts.factory.createIdentifier("forEach"),
242
- ),
243
- undefined,
244
- [
245
- ts.factory.createArrowFunction(
246
- undefined,
247
- undefined,
248
- [IdentifierFactory.parameter("elem")],
249
- undefined,
250
- undefined,
251
- ts.factory.createCallExpression(
252
- IdentifierFactory.access(
253
- ts.factory.createIdentifier(variables),
254
- "append",
255
- ),
256
- undefined,
257
- [
258
- ts.factory.createIdentifier("key"),
259
- ts.factory.createCallExpression(
260
- ts.factory.createIdentifier("String"),
261
- undefined,
262
- [ts.factory.createIdentifier("elem")],
263
- ),
264
- ],
265
- ),
266
- ),
267
- ],
268
- ),
269
- ),
270
- ts.factory.createExpressionStatement(
271
- ts.factory.createCallExpression(
272
- IdentifierFactory.access(
273
- ts.factory.createIdentifier(variables),
274
- "set",
275
- ),
276
- undefined,
277
- [
278
- ts.factory.createIdentifier("key"),
279
- ts.factory.createCallExpression(
280
- ts.factory.createIdentifier("String"),
281
- undefined,
282
- [ts.factory.createIdentifier("value")],
283
- ),
284
- ],
285
- ),
286
- ),
287
- ),
288
- ),
289
- ),
290
- local("location")("string")(template()),
291
- ts.factory.createReturnStatement(
292
- ts.factory.createConditionalExpression(
293
- ts.factory.createStrictEquality(
294
- ExpressionFactory.number(0),
295
- IdentifierFactory.access(
296
- ts.factory.createIdentifier(variables),
297
- "size",
298
- ),
299
- ),
300
- undefined,
301
- ts.factory.createIdentifier("location"),
302
- undefined,
303
- ts.factory.createTemplateExpression(
304
- ts.factory.createTemplateHead(""),
305
- [
306
- ts.factory.createTemplateSpan(
307
- ts.factory.createIdentifier("location"),
308
- ts.factory.createTemplateMiddle("?"),
309
- ),
310
- ts.factory.createTemplateSpan(
311
- ts.factory.createCallExpression(
312
- IdentifierFactory.access(
313
- ts.factory.createIdentifier(variables),
314
- "toString",
315
- ),
316
- undefined,
317
- undefined,
318
- ),
319
- ts.factory.createTemplateTail(""),
320
- ),
321
- ],
322
- ),
323
- ),
324
- ),
325
- ],
326
- true,
327
- );
328
- };
329
- return out(block(ts.factory.createIdentifier(query.name)));
330
- };
331
- }
332
-
333
- const local = (name: string) => (type: string) => (expression: ts.Expression) =>
334
- ts.factory.createVariableStatement(
335
- [],
336
- ts.factory.createVariableDeclarationList(
337
- [
338
- ts.factory.createVariableDeclaration(
339
- name,
340
- undefined,
341
- ts.factory.createTypeReferenceNode(type),
342
- expression,
343
- ),
344
- ],
345
- ts.NodeFlags.Const,
346
- ),
347
- );
348
- const constant = (name: string) => (expression: ts.Expression) =>
349
- ts.factory.createVariableStatement(
350
- [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
351
- ts.factory.createVariableDeclarationList(
352
- [
353
- ts.factory.createVariableDeclaration(
354
- name,
355
- undefined,
356
- undefined,
357
- expression,
358
- ),
359
- ],
360
- ts.NodeFlags.Const,
361
- ),
362
- );
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 split: string[] = route.path.split(":");
142
+ if (split.length === 1) return ts.factory.createStringLiteral(route.path);
143
+ return ts.factory.createTemplateExpression(
144
+ ts.factory.createTemplateHead(split[0]),
145
+ split.slice(1).map((s, i, arr) => {
146
+ const name: string = s.split("/")[0];
147
+ return ts.factory.createTemplateSpan(
148
+ ts.factory.createCallExpression(
149
+ ts.factory.createIdentifier("encodeURIComponent"),
150
+ undefined,
151
+ [
152
+ ts.factory.createBinaryExpression(
153
+ ts.factory.createCallChain(
154
+ ts.factory.createPropertyAccessChain(
155
+ ts.factory.createIdentifier(
156
+ pathParams.find((p) => p.field === name)!.name,
157
+ ),
158
+ ts.factory.createToken(ts.SyntaxKind.QuestionDotToken),
159
+ "toString",
160
+ ),
161
+ undefined,
162
+ undefined,
163
+ [],
164
+ ),
165
+ ts.factory.createToken(ts.SyntaxKind.QuestionQuestionToken),
166
+ ts.factory.createStringLiteral("null"),
167
+ ),
168
+ ],
169
+ ),
170
+ (i !== arr.length - 1
171
+ ? ts.factory.createTemplateMiddle
172
+ : ts.factory.createTemplateTail)(s.substring(name.length)),
173
+ );
174
+ }),
175
+ );
176
+ };
177
+ if (query === undefined) return out(template());
178
+
179
+ const block = (expr: ts.Expression) => {
180
+ const computeName = (str: string): string =>
181
+ total.find((p) => p.name === str) !== undefined
182
+ ? computeName("_" + str)
183
+ : str;
184
+ const variables: string = computeName("variables");
185
+ return ts.factory.createBlock(
186
+ [
187
+ local(variables)("URLSearchParams")(
188
+ ts.factory.createNewExpression(
189
+ ts.factory.createIdentifier("URLSearchParams"),
190
+ [],
191
+ [],
192
+ ),
193
+ ),
194
+ ts.factory.createForOfStatement(
195
+ undefined,
196
+ ts.factory.createVariableDeclarationList(
197
+ [
198
+ ts.factory.createVariableDeclaration(
199
+ ts.factory.createArrayBindingPattern([
200
+ ts.factory.createBindingElement(
201
+ undefined,
202
+ undefined,
203
+ ts.factory.createIdentifier("key"),
204
+ undefined,
205
+ ),
206
+ ts.factory.createBindingElement(
207
+ undefined,
208
+ undefined,
209
+ ts.factory.createIdentifier("value"),
210
+ undefined,
211
+ ),
212
+ ]),
213
+ undefined,
214
+ undefined,
215
+ undefined,
216
+ ),
217
+ ],
218
+ ts.NodeFlags.Const,
219
+ ),
220
+ ts.factory.createCallExpression(
221
+ ts.factory.createIdentifier("Object.entries"),
222
+ undefined,
223
+ [ts.factory.createAsExpression(expr, TypeFactory.keyword("any"))],
224
+ ),
225
+ ts.factory.createIfStatement(
226
+ ts.factory.createStrictEquality(
227
+ ts.factory.createIdentifier("undefined"),
228
+ ts.factory.createIdentifier("value"),
229
+ ),
230
+ ts.factory.createContinueStatement(),
231
+ ts.factory.createIfStatement(
232
+ ts.factory.createCallExpression(
233
+ ts.factory.createIdentifier("Array.isArray"),
234
+ undefined,
235
+ [ts.factory.createIdentifier("value")],
236
+ ),
237
+ ts.factory.createExpressionStatement(
238
+ ts.factory.createCallExpression(
239
+ ts.factory.createPropertyAccessExpression(
240
+ ts.factory.createIdentifier("value"),
241
+ ts.factory.createIdentifier("forEach"),
242
+ ),
243
+ undefined,
244
+ [
245
+ ts.factory.createArrowFunction(
246
+ undefined,
247
+ undefined,
248
+ [IdentifierFactory.parameter("elem")],
249
+ undefined,
250
+ undefined,
251
+ ts.factory.createCallExpression(
252
+ IdentifierFactory.access(
253
+ ts.factory.createIdentifier(variables),
254
+ "append",
255
+ ),
256
+ undefined,
257
+ [
258
+ ts.factory.createIdentifier("key"),
259
+ ts.factory.createCallExpression(
260
+ ts.factory.createIdentifier("String"),
261
+ undefined,
262
+ [ts.factory.createIdentifier("elem")],
263
+ ),
264
+ ],
265
+ ),
266
+ ),
267
+ ],
268
+ ),
269
+ ),
270
+ ts.factory.createExpressionStatement(
271
+ ts.factory.createCallExpression(
272
+ IdentifierFactory.access(
273
+ ts.factory.createIdentifier(variables),
274
+ "set",
275
+ ),
276
+ undefined,
277
+ [
278
+ ts.factory.createIdentifier("key"),
279
+ ts.factory.createCallExpression(
280
+ ts.factory.createIdentifier("String"),
281
+ undefined,
282
+ [ts.factory.createIdentifier("value")],
283
+ ),
284
+ ],
285
+ ),
286
+ ),
287
+ ),
288
+ ),
289
+ ),
290
+ local("location")("string")(template()),
291
+ ts.factory.createReturnStatement(
292
+ ts.factory.createConditionalExpression(
293
+ ts.factory.createStrictEquality(
294
+ ExpressionFactory.number(0),
295
+ IdentifierFactory.access(
296
+ ts.factory.createIdentifier(variables),
297
+ "size",
298
+ ),
299
+ ),
300
+ undefined,
301
+ ts.factory.createIdentifier("location"),
302
+ undefined,
303
+ ts.factory.createTemplateExpression(
304
+ ts.factory.createTemplateHead(""),
305
+ [
306
+ ts.factory.createTemplateSpan(
307
+ ts.factory.createIdentifier("location"),
308
+ ts.factory.createTemplateMiddle("?"),
309
+ ),
310
+ ts.factory.createTemplateSpan(
311
+ ts.factory.createCallExpression(
312
+ IdentifierFactory.access(
313
+ ts.factory.createIdentifier(variables),
314
+ "toString",
315
+ ),
316
+ undefined,
317
+ undefined,
318
+ ),
319
+ ts.factory.createTemplateTail(""),
320
+ ),
321
+ ],
322
+ ),
323
+ ),
324
+ ),
325
+ ],
326
+ true,
327
+ );
328
+ };
329
+ return out(block(ts.factory.createIdentifier(query.name)));
330
+ };
331
+ }
332
+
333
+ const local = (name: string) => (type: string) => (expression: ts.Expression) =>
334
+ ts.factory.createVariableStatement(
335
+ [],
336
+ ts.factory.createVariableDeclarationList(
337
+ [
338
+ ts.factory.createVariableDeclaration(
339
+ name,
340
+ undefined,
341
+ ts.factory.createTypeReferenceNode(type),
342
+ expression,
343
+ ),
344
+ ],
345
+ ts.NodeFlags.Const,
346
+ ),
347
+ );
348
+ const constant = (name: string) => (expression: ts.Expression) =>
349
+ ts.factory.createVariableStatement(
350
+ [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
351
+ ts.factory.createVariableDeclarationList(
352
+ [
353
+ ts.factory.createVariableDeclaration(
354
+ name,
355
+ undefined,
356
+ undefined,
357
+ expression,
358
+ ),
359
+ ],
360
+ ts.NodeFlags.Const,
361
+ ),
362
+ );