@nestia/sdk 12.0.0-dev.20260601.1 → 12.0.0-dev.20260612.2

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