@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,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,116 @@
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 { 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 { 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
+ TypeScriptFactory.createExportDeclaration(
64
+ undefined,
65
+ false,
66
+ TypeScriptFactory.createNamespaceExport(
67
+ TypeScriptFactory.createIdentifier(key),
68
+ ),
69
+ TypeScriptFactory.createStringLiteral(`./${key}/index`),
70
+ undefined,
71
+ ),
72
+ );
73
+ }
74
+ if (statements.length && directory.routes.length)
75
+ statements.push(FilePrinter.enter());
76
+
77
+ // ITERATE ROUTES
78
+ const importer: ImportDictionary = new ImportDictionary(
79
+ `${outDir}/index.ts`,
80
+ );
81
+ directory.routes.forEach((route, i) => {
82
+ if (!(project.config.clone === true && route.protocol === "http"))
83
+ importer.declarations(route.imports);
84
+ statements.push(
85
+ ...(route.protocol === "http"
86
+ ? SdkHttpRouteProgrammer.write(project)(importer)(route)
87
+ : route.protocol === "websocket"
88
+ ? SdkWebSocketRouteProgrammer.write(project)(importer)(route)
89
+ : SdkMcpRouteProgrammer.write(project)(importer)(route)),
90
+ );
91
+ if (i !== directory.routes.length - 1)
92
+ statements.push(FilePrinter.enter());
93
+ });
94
+
95
+ // FINALIZE THE CONTENT
96
+ if (directory.routes.length !== 0)
97
+ statements.push(
98
+ ...importer.toStatements(outDir),
99
+ ...(!importer.empty() && statements.length
100
+ ? [FilePrinter.enter()]
101
+ : []),
102
+ ...statements.splice(0, statements.length),
103
+ );
104
+ await FilePrinter.write({
105
+ location: importer.file,
106
+ statements,
107
+ top:
108
+ "/**\n" +
109
+ " * @packageDocumentation\n" +
110
+ ` * @module ${directory.module}\n` +
111
+ " * @nestia Generated by Nestia - https://github.com/samchon/nestia \n" +
112
+ " */\n" +
113
+ "//================================================================\n",
114
+ });
115
+ };
116
+ }