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

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 (259) 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/factories/ExpressionFactory.d.ts +9 -0
  48. package/lib/factories/ExpressionFactory.js +16 -0
  49. package/lib/factories/ExpressionFactory.js.map +1 -0
  50. package/lib/factories/IdentifierFactory.d.ts +22 -0
  51. package/lib/factories/IdentifierFactory.js +50 -0
  52. package/lib/factories/IdentifierFactory.js.map +1 -0
  53. package/lib/factories/LiteralFactory.d.ts +9 -0
  54. package/lib/factories/LiteralFactory.js +48 -0
  55. package/lib/factories/LiteralFactory.js.map +1 -0
  56. package/lib/factories/StatementFactory.d.ts +14 -0
  57. package/lib/factories/StatementFactory.js +20 -0
  58. package/lib/factories/StatementFactory.js.map +1 -0
  59. package/lib/factories/TypeFactory.d.ts +24 -0
  60. package/lib/factories/TypeFactory.js +27 -0
  61. package/lib/factories/TypeFactory.js.map +1 -0
  62. package/lib/generates/CloneGenerator.js +6 -4
  63. package/lib/generates/CloneGenerator.js.map +1 -1
  64. package/lib/generates/SdkGenerator.js +50 -1
  65. package/lib/generates/SdkGenerator.js.map +1 -1
  66. package/lib/generates/SwaggerGenerator.js +18 -2
  67. package/lib/generates/SwaggerGenerator.js.map +1 -1
  68. package/lib/generates/internal/E2eFileProgrammer.js +32 -29
  69. package/lib/generates/internal/E2eFileProgrammer.js.map +1 -1
  70. package/lib/generates/internal/FilePrinter.d.ts +2 -2
  71. package/lib/generates/internal/FilePrinter.js +14 -25
  72. package/lib/generates/internal/FilePrinter.js.map +1 -1
  73. package/lib/generates/internal/ImportDictionary.d.ts +2 -1
  74. package/lib/generates/internal/ImportDictionary.js +16 -10
  75. package/lib/generates/internal/ImportDictionary.js.map +1 -1
  76. package/lib/generates/internal/SdkAliasCollection.d.ts +12 -10
  77. package/lib/generates/internal/SdkAliasCollection.js +29 -22
  78. package/lib/generates/internal/SdkAliasCollection.js.map +1 -1
  79. package/lib/generates/internal/SdkDistributionComposer.d.ts +1 -0
  80. package/lib/generates/internal/SdkDistributionComposer.js +3 -0
  81. package/lib/generates/internal/SdkDistributionComposer.js.map +1 -1
  82. package/lib/generates/internal/SdkFileProgrammer.js +6 -3
  83. package/lib/generates/internal/SdkFileProgrammer.js.map +1 -1
  84. package/lib/generates/internal/SdkHttpCloneProgrammer.d.ts +1 -1
  85. package/lib/generates/internal/SdkHttpCloneProgrammer.js +3 -3
  86. package/lib/generates/internal/SdkHttpCloneProgrammer.js.map +1 -1
  87. package/lib/generates/internal/SdkHttpCloneReferencer.d.ts +1 -1
  88. package/lib/generates/internal/SdkHttpCloneReferencer.js +42 -9
  89. package/lib/generates/internal/SdkHttpCloneReferencer.js.map +1 -1
  90. package/lib/generates/internal/SdkHttpFunctionProgrammer.d.ts +1 -1
  91. package/lib/generates/internal/SdkHttpFunctionProgrammer.js +47 -51
  92. package/lib/generates/internal/SdkHttpFunctionProgrammer.js.map +1 -1
  93. package/lib/generates/internal/SdkHttpNamespaceProgrammer.d.ts +1 -1
  94. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js +63 -61
  95. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js.map +1 -1
  96. package/lib/generates/internal/SdkHttpParameterProgrammer.d.ts +2 -2
  97. package/lib/generates/internal/SdkHttpParameterProgrammer.js +11 -13
  98. package/lib/generates/internal/SdkHttpParameterProgrammer.js.map +1 -1
  99. package/lib/generates/internal/SdkHttpRouteProgrammer.d.ts +1 -1
  100. package/lib/generates/internal/SdkHttpSimulationProgrammer.d.ts +1 -1
  101. package/lib/generates/internal/SdkHttpSimulationProgrammer.js +52 -47
  102. package/lib/generates/internal/SdkHttpSimulationProgrammer.js.map +1 -1
  103. package/lib/generates/internal/SdkMcpRouteProgrammer.d.ts +15 -0
  104. package/lib/generates/internal/SdkMcpRouteProgrammer.js +149 -0
  105. package/lib/generates/internal/SdkMcpRouteProgrammer.js.map +1 -0
  106. package/lib/generates/internal/SdkRouteDirectory.d.ts +2 -1
  107. package/lib/generates/internal/SdkRouteDirectory.js.map +1 -1
  108. package/lib/generates/internal/SdkTypeProgrammer.d.ts +3 -3
  109. package/lib/generates/internal/SdkTypeProgrammer.js +42 -43
  110. package/lib/generates/internal/SdkTypeProgrammer.js.map +1 -1
  111. package/lib/generates/internal/SdkTypeTagProgrammer.d.ts +2 -1
  112. package/lib/generates/internal/SdkTypeTagProgrammer.js +7 -9
  113. package/lib/generates/internal/SdkTypeTagProgrammer.js.map +1 -1
  114. package/lib/generates/internal/SdkWebSocketCloneProgrammer.d.ts +6 -0
  115. package/lib/generates/internal/SdkWebSocketCloneProgrammer.js +283 -0
  116. package/lib/generates/internal/SdkWebSocketCloneProgrammer.js.map +1 -0
  117. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.d.ts +2 -2
  118. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js +45 -47
  119. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js.map +1 -1
  120. package/lib/generates/internal/SdkWebSocketParameterProgrammer.d.ts +3 -3
  121. package/lib/generates/internal/SdkWebSocketParameterProgrammer.js +9 -9
  122. package/lib/generates/internal/SdkWebSocketParameterProgrammer.js.map +1 -1
  123. package/lib/generates/internal/SdkWebSocketRouteProgrammer.d.ts +2 -2
  124. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js +37 -41
  125. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js.map +1 -1
  126. package/lib/generates/internal/SwaggerOperationParameterComposer.js +10 -2
  127. package/lib/generates/internal/SwaggerOperationParameterComposer.js.map +1 -1
  128. package/lib/generates/internal/SwaggerOperationResponseComposer.d.ts +1 -1
  129. package/lib/generates/internal/SwaggerOperationResponseComposer.js +6 -1
  130. package/lib/generates/internal/SwaggerOperationResponseComposer.js.map +1 -1
  131. package/lib/generates/internal/SwaggerReadonlyArrayEmender.d.ts +9 -0
  132. package/lib/generates/internal/SwaggerReadonlyArrayEmender.js +174 -0
  133. package/lib/generates/internal/SwaggerReadonlyArrayEmender.js.map +1 -0
  134. package/lib/structures/INestiaSdkInput.d.ts +9 -2
  135. package/lib/structures/IReflectController.d.ts +2 -1
  136. package/lib/structures/IReflectHttpOperationSuccess.d.ts +4 -2
  137. package/lib/structures/IReflectMcpOperation.d.ts +35 -0
  138. package/lib/structures/IReflectMcpOperation.js +3 -0
  139. package/lib/structures/IReflectMcpOperation.js.map +1 -0
  140. package/lib/structures/IReflectMcpOperationParameter.d.ts +19 -0
  141. package/lib/structures/IReflectMcpOperationParameter.js +3 -0
  142. package/lib/structures/IReflectMcpOperationParameter.js.map +1 -0
  143. package/lib/structures/ITypedApplication.d.ts +2 -1
  144. package/lib/structures/ITypedHttpRouteSuccess.d.ts +3 -1
  145. package/lib/structures/ITypedMcpRoute.d.ts +31 -0
  146. package/lib/structures/ITypedMcpRoute.js +3 -0
  147. package/lib/structures/ITypedMcpRoute.js.map +1 -0
  148. package/lib/transform.d.ts +5 -9
  149. package/lib/transform.js +8 -31
  150. package/lib/transform.js.map +1 -1
  151. package/lib/utils/HttpResponseContentTypeUtil.d.ts +5 -0
  152. package/lib/utils/HttpResponseContentTypeUtil.js +22 -0
  153. package/lib/utils/HttpResponseContentTypeUtil.js.map +1 -0
  154. package/native/go.mod +52 -52
  155. package/native/go.sum +84 -54
  156. package/native/sdk/register.go +322 -165
  157. package/native/sdk/sdk.go +17 -17
  158. package/native/sdk/sdk_metadata_json.go +327 -327
  159. package/native/sdk/sdk_transform.go +1879 -1549
  160. package/package.json +13 -11
  161. package/src/INestiaConfig.ts +267 -267
  162. package/src/NestiaSdkApplication.ts +39 -8
  163. package/src/NestiaSwaggerComposer.ts +153 -142
  164. package/src/analyses/AccessorAnalyzer.ts +64 -67
  165. package/src/analyses/ConfigAnalyzer.ts +330 -330
  166. package/src/analyses/ImportAnalyzer.ts +92 -92
  167. package/src/analyses/PathAnalyzer.ts +130 -69
  168. package/src/analyses/ReflectControllerAnalyzer.ts +112 -105
  169. package/src/analyses/ReflectHttpOperationAnalyzer.ts +183 -183
  170. package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +90 -90
  171. package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +350 -350
  172. package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +163 -130
  173. package/src/analyses/ReflectMcpOperationAnalyzer.ts +124 -0
  174. package/src/analyses/ReflectMetadataAnalyzer.ts +44 -44
  175. package/src/analyses/SecurityAnalyzer.ts +25 -25
  176. package/src/analyses/TypedMcpRouteAnalyzer.ts +34 -0
  177. package/src/decorators/OperationMetadata.ts +29 -29
  178. package/src/executable/internal/CommandParser.ts +15 -15
  179. package/src/executable/internal/NestiaConfigLoader.ts +451 -446
  180. package/src/executable/internal/NestiaSdkCommand.ts +124 -106
  181. package/src/executable/internal/NestiaSdkWatcher.ts +342 -0
  182. package/src/executable/sdk.ts +90 -88
  183. package/src/factories/ExpressionFactory.ts +23 -0
  184. package/src/factories/IdentifierFactory.ts +84 -0
  185. package/src/factories/LiteralFactory.ts +54 -0
  186. package/src/factories/StatementFactory.ts +56 -0
  187. package/src/factories/TypeFactory.ts +27 -0
  188. package/src/generates/CloneGenerator.ts +74 -66
  189. package/src/generates/E2eGenerator.ts +32 -32
  190. package/src/generates/SdkGenerator.ts +176 -118
  191. package/src/generates/SwaggerGenerator.ts +342 -310
  192. package/src/generates/internal/E2eFileProgrammer.ts +246 -233
  193. package/src/generates/internal/FilePrinter.ts +57 -65
  194. package/src/generates/internal/ImportDictionary.ts +207 -204
  195. package/src/generates/internal/SdkAliasCollection.ts +280 -261
  196. package/src/generates/internal/SdkDistributionComposer.ts +123 -116
  197. package/src/generates/internal/SdkFileProgrammer.ts +113 -112
  198. package/src/generates/internal/SdkHttpCloneProgrammer.ts +124 -126
  199. package/src/generates/internal/SdkHttpCloneReferencer.ts +131 -77
  200. package/src/generates/internal/SdkHttpFunctionProgrammer.ts +290 -301
  201. package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +507 -510
  202. package/src/generates/internal/SdkHttpParameterProgrammer.ts +163 -165
  203. package/src/generates/internal/SdkHttpRouteProgrammer.ts +109 -109
  204. package/src/generates/internal/SdkHttpSimulationProgrammer.ts +322 -314
  205. package/src/generates/internal/SdkImportWizard.ts +62 -62
  206. package/src/generates/internal/SdkMcpRouteProgrammer.ts +447 -0
  207. package/src/generates/internal/SdkRouteDirectory.ts +21 -18
  208. package/src/generates/internal/SdkTypeProgrammer.ts +389 -382
  209. package/src/generates/internal/SdkTypeTagProgrammer.ts +110 -114
  210. package/src/generates/internal/SdkWebSocketCloneProgrammer.ts +319 -0
  211. package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +383 -389
  212. package/src/generates/internal/SdkWebSocketParameterProgrammer.ts +91 -89
  213. package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +304 -323
  214. package/src/generates/internal/SwaggerDescriptionComposer.ts +64 -64
  215. package/src/generates/internal/SwaggerOperationComposer.ts +119 -119
  216. package/src/generates/internal/SwaggerOperationParameterComposer.ts +175 -162
  217. package/src/generates/internal/SwaggerOperationResponseComposer.ts +115 -110
  218. package/src/generates/internal/SwaggerReadonlyArrayEmender.ts +262 -0
  219. package/src/index.ts +4 -4
  220. package/src/internal/legacy.ts +492 -492
  221. package/src/module.ts +4 -4
  222. package/src/structures/INestiaProject.ts +10 -10
  223. package/src/structures/INestiaSdkInput.ts +27 -20
  224. package/src/structures/IOperationMetadata.ts +41 -41
  225. package/src/structures/IReflectController.ts +18 -15
  226. package/src/structures/IReflectHttpOperation.ts +26 -26
  227. package/src/structures/IReflectHttpOperationException.ts +18 -18
  228. package/src/structures/IReflectHttpOperationParameter.ts +79 -79
  229. package/src/structures/IReflectHttpOperationSuccess.ts +18 -21
  230. package/src/structures/IReflectImport.ts +6 -6
  231. package/src/structures/IReflectMcpOperation.ts +38 -0
  232. package/src/structures/IReflectMcpOperationParameter.ts +27 -0
  233. package/src/structures/IReflectOperationError.ts +26 -26
  234. package/src/structures/IReflectType.ts +4 -4
  235. package/src/structures/IReflectWebSocketOperation.ts +17 -17
  236. package/src/structures/ITypedApplication.ts +12 -11
  237. package/src/structures/ITypedHttpRoute.ts +41 -41
  238. package/src/structures/ITypedHttpRouteException.ts +15 -15
  239. package/src/structures/ITypedHttpRouteParameter.ts +41 -41
  240. package/src/structures/ITypedHttpRouteSuccess.ts +18 -22
  241. package/src/structures/ITypedMcpRoute.ts +33 -0
  242. package/src/structures/ITypedWebSocketRoute.ts +24 -24
  243. package/src/structures/ITypedWebSocketRouteParameter.ts +3 -3
  244. package/src/transform.ts +28 -59
  245. package/src/typings/get-function-location.d.ts +7 -7
  246. package/src/utils/ArrayUtil.ts +26 -26
  247. package/src/utils/EmittedJavaScriptPatcher.ts +88 -88
  248. package/src/utils/FileRetriever.ts +22 -22
  249. package/src/utils/HttpResponseContentTypeUtil.ts +30 -0
  250. package/src/utils/MapUtil.ts +14 -14
  251. package/src/utils/PathUtil.ts +10 -10
  252. package/src/utils/SourceFinder.ts +63 -63
  253. package/src/utils/StringUtil.ts +17 -17
  254. package/src/utils/TsConfigReader.ts +108 -108
  255. package/src/utils/TtscExecutor.ts +68 -68
  256. package/src/utils/VersioningStrategy.ts +28 -28
  257. package/src/validators/HttpHeadersValidator.ts +11 -11
  258. package/src/validators/HttpQueryValidator.ts +11 -11
  259. package/src/validators/TextPlainValidator.ts +17 -17
@@ -1,116 +1,123 @@
1
- import cp from "child_process";
2
- import fs from "fs";
3
- import path from "path";
4
-
5
- import { INestiaConfig } from "../../INestiaConfig";
6
-
7
- export namespace SdkDistributionComposer {
8
- export const compose = async (props: {
9
- config: INestiaConfig;
10
- websocket: boolean;
11
- }) => {
12
- if (!fs.existsSync(props.config.distribute!))
13
- await fs.promises.mkdir(props.config.distribute!);
14
-
15
- const root: string = process.cwd();
16
- const output: string = path.resolve(props.config.output!);
17
- process.chdir(props.config.distribute!);
18
-
19
- const exit = () => process.chdir(root);
20
- if (await configured()) return exit();
21
-
22
- // COPY FILES
23
- console.log("Composing SDK distribution environments...");
24
- for (const file of await fs.promises.readdir(BUNDLE))
25
- await fs.promises.copyFile(`${BUNDLE}/${file}`, file);
26
-
27
- // CONFIGURE PATHS
28
- for (const file of ["package.json", "tsconfig.json"])
29
- await replace({ root, output })(file);
30
-
31
- // INSTALL PACKAGES
32
- const v: IDependencies = await dependencies({ websocket: props.websocket });
33
- execute("npm install --save-dev rimraf");
34
- execute(`npm install --save @nestia/fetcher@${v.version}`);
35
- execute(`npm install --save typia@${v.typia}`);
36
- if (props.websocket && v.tgrid !== undefined)
37
- execute(`npm install --save tgrid@${v.tgrid}`);
38
- execute("npx typia setup --manager npm");
39
-
40
- exit();
41
- };
42
-
43
- const configured = async (): Promise<boolean> =>
44
- ["package.json", "tsconfig.json"].every(fs.existsSync) &&
45
- (await (async () => {
46
- const content = JSON.parse(
47
- await fs.promises.readFile("package.json", "utf8"),
48
- );
49
- return !!content.dependencies?.["@nestia/fetcher"];
50
- })());
51
-
52
- const execute = (command: string) => {
53
- console.log(` - ${command}`);
54
- cp.execSync(command, { stdio: "ignore" });
55
- };
56
-
57
- const replace =
58
- (props: { root: string; output: string }) =>
59
- async (file: string): Promise<void> => {
60
- const relative = (from: string) => (to: string) =>
61
- path.relative(from, to).split("\\").join("/");
62
- const root: string = relative(process.cwd())(props.root);
63
- const output: string = relative(process.cwd())(props.output);
64
- const current: string = relative(props.root)(process.cwd());
65
-
66
- const content: string = await fs.promises.readFile(file, "utf8");
67
- await fs.promises.writeFile(
68
- file,
69
- content
70
- .split("${root}")
71
- .join(root)
72
- .split("${output}")
73
- .join(output)
74
- .split("${current}")
75
- .join(current),
76
- "utf8",
77
- );
78
- };
79
-
80
- const dependencies = async (opts: {
81
- websocket: boolean;
82
- }): Promise<IDependencies> => {
83
- const content: string = await fs.promises.readFile(
84
- __dirname + "/../../../package.json",
85
- "utf8",
86
- );
87
- const json: {
88
- version: string;
89
- dependencies: Record<string, string>;
90
- devDependencies: Record<string, string>;
91
- } = JSON.parse(content);
92
- const dependencies: Record<string, string> = {
93
- ...json.devDependencies,
94
- ...json.dependencies,
95
- };
96
- const required = (key: "version" | "typia"): string => {
97
- const value: string | undefined =
98
- key === "version" ? json.version : dependencies[key];
99
- if (typeof value !== "string" || value.length === 0)
100
- throw new Error(`Unable to resolve ${key} version for SDK distribution.`);
101
- return value;
102
- };
103
- return {
104
- version: required("version"),
105
- typia: required("typia"),
106
- tgrid: opts.websocket ? dependencies.tgrid : undefined,
107
- };
108
- };
109
- }
110
-
111
- interface IDependencies {
112
- version: string;
113
- typia: string;
114
- tgrid: string | undefined;
115
- }
116
- const BUNDLE = __dirname + "/../../../assets/bundle/distribute";
1
+ import cp from "child_process";
2
+ import fs from "fs";
3
+ import path from "path";
4
+
5
+ import { INestiaConfig } from "../../INestiaConfig";
6
+
7
+ export namespace SdkDistributionComposer {
8
+ export const compose = async (props: {
9
+ config: INestiaConfig;
10
+ mcp: boolean;
11
+ websocket: boolean;
12
+ }) => {
13
+ if (!fs.existsSync(props.config.distribute!))
14
+ await fs.promises.mkdir(props.config.distribute!);
15
+
16
+ const root: string = process.cwd();
17
+ const output: string = path.resolve(props.config.output!);
18
+ process.chdir(props.config.distribute!);
19
+
20
+ const exit = () => process.chdir(root);
21
+ if (await configured()) return exit();
22
+
23
+ // COPY FILES
24
+ console.log("Composing SDK distribution environments...");
25
+ for (const file of await fs.promises.readdir(BUNDLE))
26
+ await fs.promises.copyFile(`${BUNDLE}/${file}`, file);
27
+
28
+ // CONFIGURE PATHS
29
+ for (const file of ["package.json", "tsconfig.json"])
30
+ await replace({ root, output })(file);
31
+
32
+ // INSTALL PACKAGES
33
+ const v: IDependencies = await dependencies({ websocket: props.websocket });
34
+ execute("npm install --save-dev rimraf");
35
+ execute(`npm install --save @nestia/fetcher@${v.version}`);
36
+ execute(`npm install --save typia@${v.typia}`);
37
+ if (props.mcp && v.mcp !== undefined)
38
+ execute(`npm install --save @modelcontextprotocol/sdk@${v.mcp}`);
39
+ if (props.websocket && v.tgrid !== undefined)
40
+ execute(`npm install --save tgrid@${v.tgrid}`);
41
+ execute("npx typia setup --manager npm");
42
+
43
+ exit();
44
+ };
45
+
46
+ const configured = async (): Promise<boolean> =>
47
+ ["package.json", "tsconfig.json"].every(fs.existsSync) &&
48
+ (await (async () => {
49
+ const content = JSON.parse(
50
+ await fs.promises.readFile("package.json", "utf8"),
51
+ );
52
+ return !!content.dependencies?.["@nestia/fetcher"];
53
+ })());
54
+
55
+ const execute = (command: string) => {
56
+ console.log(` - ${command}`);
57
+ cp.execSync(command, { stdio: "ignore" });
58
+ };
59
+
60
+ const replace =
61
+ (props: { root: string; output: string }) =>
62
+ async (file: string): Promise<void> => {
63
+ const relative = (from: string) => (to: string) =>
64
+ path.relative(from, to).split("\\").join("/");
65
+ const root: string = relative(process.cwd())(props.root);
66
+ const output: string = relative(process.cwd())(props.output);
67
+ const current: string = relative(props.root)(process.cwd());
68
+
69
+ const content: string = await fs.promises.readFile(file, "utf8");
70
+ await fs.promises.writeFile(
71
+ file,
72
+ content
73
+ .split("${root}")
74
+ .join(root)
75
+ .split("${output}")
76
+ .join(output)
77
+ .split("${current}")
78
+ .join(current),
79
+ "utf8",
80
+ );
81
+ };
82
+
83
+ const dependencies = async (opts: {
84
+ websocket: boolean;
85
+ }): Promise<IDependencies> => {
86
+ const content: string = await fs.promises.readFile(
87
+ __dirname + "/../../../package.json",
88
+ "utf8",
89
+ );
90
+ const json: {
91
+ version: string;
92
+ dependencies: Record<string, string>;
93
+ devDependencies: Record<string, string>;
94
+ } = JSON.parse(content);
95
+ const dependencies: Record<string, string> = {
96
+ ...json.devDependencies,
97
+ ...json.dependencies,
98
+ };
99
+ const required = (key: "version" | "typia"): string => {
100
+ const value: string | undefined =
101
+ key === "version" ? json.version : dependencies[key];
102
+ if (typeof value !== "string" || value.length === 0)
103
+ throw new Error(
104
+ `Unable to resolve ${key} version for SDK distribution.`,
105
+ );
106
+ return value;
107
+ };
108
+ return {
109
+ version: required("version"),
110
+ typia: required("typia"),
111
+ tgrid: opts.websocket ? dependencies.tgrid : undefined,
112
+ mcp: dependencies["@modelcontextprotocol/sdk"],
113
+ };
114
+ };
115
+ }
116
+
117
+ interface IDependencies {
118
+ version: string;
119
+ typia: string;
120
+ tgrid: string | undefined;
121
+ mcp: string | undefined;
122
+ }
123
+ const BUNDLE = __dirname + "/../../../assets/bundle/distribute";
@@ -1,112 +1,113 @@
1
- import { Node, TypeScriptFactory } from "@nestia/factory";
2
- import fs from "fs";
3
-
4
- import { INestiaProject } from "../../structures/INestiaProject";
5
- import { ITypedApplication } from "../../structures/ITypedApplication";
6
- import { ITypedHttpRoute } from "../../structures/ITypedHttpRoute";
7
- import { ITypedWebSocketRoute } from "../../structures/ITypedWebSocketRoute";
8
- import { MapUtil } from "../../utils/MapUtil";
9
- import { FilePrinter } from "./FilePrinter";
10
- import { ImportDictionary } from "./ImportDictionary";
11
- import { SdkHttpRouteProgrammer } from "./SdkHttpRouteProgrammer";
12
- import { SdkRouteDirectory } from "./SdkRouteDirectory";
13
- import { SdkWebSocketRouteProgrammer } from "./SdkWebSocketRouteProgrammer";
14
-
15
- export namespace SdkFileProgrammer {
16
- /* ---------------------------------------------------------
17
- CONSTRUCTOR
18
- --------------------------------------------------------- */
19
- export const generate = async (app: ITypedApplication): Promise<void> => {
20
- // CONSTRUCT FOLDER TREE
21
- const root: SdkRouteDirectory = new SdkRouteDirectory(null, "functional");
22
- for (const route of app.routes) emplace(root)(route);
23
-
24
- // ITERATE FILES
25
- await iterate(app.project)(root)(`${app.project.config.output}/functional`);
26
- };
27
-
28
- const emplace =
29
- (directory: SdkRouteDirectory) =>
30
- (route: ITypedHttpRoute | ITypedWebSocketRoute): void => {
31
- // OPEN DIRECTORIES
32
- for (const key of route.accessor.slice(0, -1)) {
33
- directory = MapUtil.take(
34
- directory.children,
35
- key,
36
- () => new SdkRouteDirectory(directory, key),
37
- );
38
- }
39
-
40
- // ADD ROUTE
41
- directory.routes.push(route);
42
- };
43
-
44
- /* ---------------------------------------------------------
45
- FILE ITERATOR
46
- --------------------------------------------------------- */
47
- const iterate =
48
- (project: INestiaProject) =>
49
- (directory: SdkRouteDirectory) =>
50
- async (outDir: string): Promise<void> => {
51
- // CREATE A NEW DIRECTORY
52
- try {
53
- await fs.promises.mkdir(outDir);
54
- } catch {}
55
-
56
- // ITERATE CHILDREN
57
- const statements: Node[] = [];
58
- for (const [key, value] of directory.children) {
59
- await iterate(project)(value)(`${outDir}/${key}`);
60
- statements.push(
61
- TypeScriptFactory.createExportDeclaration(
62
- undefined,
63
- false,
64
- TypeScriptFactory.createNamespaceExport(
65
- TypeScriptFactory.createIdentifier(key),
66
- ),
67
- TypeScriptFactory.createStringLiteral(`./${key}/index`),
68
- undefined,
69
- ),
70
- );
71
- }
72
- if (statements.length && directory.routes.length)
73
- statements.push(FilePrinter.enter());
74
-
75
- // ITERATE ROUTES
76
- const importer: ImportDictionary = new ImportDictionary(
77
- `${outDir}/index.ts`,
78
- );
79
- directory.routes.forEach((route, i) => {
80
- if (!(project.config.clone === true && route.protocol === "http"))
81
- importer.declarations(route.imports);
82
- statements.push(
83
- ...(route.protocol === "http"
84
- ? SdkHttpRouteProgrammer.write(project)(importer)(route)
85
- : SdkWebSocketRouteProgrammer.write(project)(importer)(route)),
86
- );
87
- if (i !== directory.routes.length - 1)
88
- statements.push(FilePrinter.enter());
89
- });
90
-
91
- // FINALIZE THE CONTENT
92
- if (directory.routes.length !== 0)
93
- statements.push(
94
- ...importer.toStatements(outDir),
95
- ...(!importer.empty() && statements.length
96
- ? [FilePrinter.enter()]
97
- : []),
98
- ...statements.splice(0, statements.length),
99
- );
100
- await FilePrinter.write({
101
- location: importer.file,
102
- statements,
103
- top:
104
- "/**\n" +
105
- " * @packageDocumentation\n" +
106
- ` * @module ${directory.module}\n` +
107
- " * @nestia Generated by Nestia - https://github.com/samchon/nestia \n" +
108
- " */\n" +
109
- "//================================================================\n",
110
- });
111
- };
112
- }
1
+ import { type Node, factory } from "@ttsc/factory";
2
+ import fs from "fs";
3
+
4
+ import { INestiaProject } from "../../structures/INestiaProject";
5
+ import { ITypedApplication } from "../../structures/ITypedApplication";
6
+ import { ITypedHttpRoute } from "../../structures/ITypedHttpRoute";
7
+ import { ITypedMcpRoute } from "../../structures/ITypedMcpRoute";
8
+ import { ITypedWebSocketRoute } from "../../structures/ITypedWebSocketRoute";
9
+ import { MapUtil } from "../../utils/MapUtil";
10
+ import { FilePrinter } from "./FilePrinter";
11
+ import { ImportDictionary } from "./ImportDictionary";
12
+ import { SdkHttpRouteProgrammer } from "./SdkHttpRouteProgrammer";
13
+ import { SdkMcpRouteProgrammer } from "./SdkMcpRouteProgrammer";
14
+ import { SdkRouteDirectory } from "./SdkRouteDirectory";
15
+ import { SdkWebSocketRouteProgrammer } from "./SdkWebSocketRouteProgrammer";
16
+
17
+ export namespace SdkFileProgrammer {
18
+ /* ---------------------------------------------------------
19
+ CONSTRUCTOR
20
+ --------------------------------------------------------- */
21
+ export const generate = async (app: ITypedApplication): Promise<void> => {
22
+ // CONSTRUCT FOLDER TREE
23
+ const root: SdkRouteDirectory = new SdkRouteDirectory(null, "functional");
24
+ for (const route of app.routes) emplace(root)(route);
25
+
26
+ // ITERATE FILES
27
+ await iterate(app.project)(root)(`${app.project.config.output}/functional`);
28
+ };
29
+
30
+ const emplace =
31
+ (directory: SdkRouteDirectory) =>
32
+ (route: ITypedHttpRoute | ITypedWebSocketRoute | ITypedMcpRoute): void => {
33
+ // OPEN DIRECTORIES
34
+ for (const key of route.accessor.slice(0, -1)) {
35
+ directory = MapUtil.take(
36
+ directory.children,
37
+ key,
38
+ () => new SdkRouteDirectory(directory, key),
39
+ );
40
+ }
41
+
42
+ // ADD ROUTE
43
+ directory.routes.push(route);
44
+ };
45
+
46
+ /* ---------------------------------------------------------
47
+ FILE ITERATOR
48
+ --------------------------------------------------------- */
49
+ const iterate =
50
+ (project: INestiaProject) =>
51
+ (directory: SdkRouteDirectory) =>
52
+ async (outDir: string): Promise<void> => {
53
+ // CREATE A NEW DIRECTORY
54
+ try {
55
+ await fs.promises.mkdir(outDir);
56
+ } catch {}
57
+
58
+ // ITERATE CHILDREN
59
+ const statements: Node[] = [];
60
+ for (const [key, value] of directory.children) {
61
+ await iterate(project)(value)(`${outDir}/${key}`);
62
+ statements.push(
63
+ factory.createExportDeclaration(
64
+ undefined,
65
+ false,
66
+ factory.createNamespaceExport(factory.createIdentifier(key)),
67
+ factory.createStringLiteral(`./${key}/index`),
68
+ ),
69
+ );
70
+ }
71
+ if (statements.length && directory.routes.length)
72
+ statements.push(FilePrinter.enter());
73
+
74
+ // ITERATE ROUTES
75
+ const importer: ImportDictionary = new ImportDictionary(
76
+ `${outDir}/index.ts`,
77
+ );
78
+ directory.routes.forEach((route, i) => {
79
+ if (!(project.config.clone === true && route.protocol === "http"))
80
+ importer.declarations(route.imports);
81
+ statements.push(
82
+ ...(route.protocol === "http"
83
+ ? SdkHttpRouteProgrammer.write(project)(importer)(route)
84
+ : route.protocol === "websocket"
85
+ ? SdkWebSocketRouteProgrammer.write(project)(importer)(route)
86
+ : SdkMcpRouteProgrammer.write(project)(importer)(route)),
87
+ );
88
+ if (i !== directory.routes.length - 1)
89
+ statements.push(FilePrinter.enter());
90
+ });
91
+
92
+ // FINALIZE THE CONTENT
93
+ if (directory.routes.length !== 0)
94
+ statements.push(
95
+ ...importer.toStatements(outDir),
96
+ ...(!importer.empty() && statements.length
97
+ ? [FilePrinter.enter()]
98
+ : []),
99
+ ...statements.splice(0, statements.length),
100
+ );
101
+ await FilePrinter.write({
102
+ location: importer.file,
103
+ statements,
104
+ top:
105
+ "/**\n" +
106
+ " * @packageDocumentation\n" +
107
+ ` * @module ${directory.module}\n` +
108
+ " * @nestia Generated by Nestia - https://github.com/samchon/nestia \n" +
109
+ " */\n" +
110
+ "//================================================================\n",
111
+ });
112
+ };
113
+ }