@nestia/sdk 10.0.2 → 11.0.0-dev.20260312

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