@nestia/sdk 10.0.2 → 11.0.0-dev.20260305

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 (198) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +93 -93
  3. package/assets/bundle/api/HttpError.ts +1 -1
  4. package/assets/bundle/api/IConnection.ts +1 -1
  5. package/assets/bundle/api/Primitive.ts +1 -1
  6. package/assets/bundle/api/Resolved.ts +1 -1
  7. package/assets/bundle/api/index.ts +4 -4
  8. package/assets/bundle/api/module.ts +6 -6
  9. package/assets/bundle/distribute/README.md +37 -37
  10. package/assets/bundle/distribute/package.json +28 -28
  11. package/assets/bundle/distribute/tsconfig.json +109 -109
  12. package/assets/bundle/e2e/index.ts +42 -42
  13. package/assets/config/nestia.config.ts +97 -97
  14. package/lib/INestiaConfig.d.ts +1 -1
  15. package/lib/NestiaSdkApplication.js.map +1 -1
  16. package/lib/NestiaSwaggerComposer.d.ts +2 -1
  17. package/lib/NestiaSwaggerComposer.js +3 -3
  18. package/lib/NestiaSwaggerComposer.js.map +1 -1
  19. package/lib/analyses/AccessorAnalyzer.js +2 -2
  20. package/lib/analyses/AccessorAnalyzer.js.map +1 -1
  21. package/lib/analyses/DtoAnalyzer.js.map +1 -1
  22. package/lib/analyses/ImportAnalyzer.js.map +1 -1
  23. package/lib/analyses/ReflectHttpOperationAnalyzer.js +3 -3
  24. package/lib/analyses/ReflectHttpOperationAnalyzer.js.map +1 -1
  25. package/lib/analyses/ReflectHttpOperationExceptionAnalyzer.js +2 -2
  26. package/lib/analyses/ReflectHttpOperationExceptionAnalyzer.js.map +1 -1
  27. package/lib/analyses/ReflectHttpOperationParameterAnalyzer.js +7 -11
  28. package/lib/analyses/ReflectHttpOperationParameterAnalyzer.js.map +1 -1
  29. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js +6 -6
  30. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js.map +1 -1
  31. package/lib/analyses/TypedHttpRouteAnalyzer.d.ts +1 -1
  32. package/lib/analyses/TypedHttpRouteAnalyzer.js +6 -8
  33. package/lib/analyses/TypedHttpRouteAnalyzer.js.map +1 -1
  34. package/lib/executable/internal/NestiaConfigLoader.js +47 -43
  35. package/lib/executable/internal/NestiaConfigLoader.js.map +1 -1
  36. package/lib/executable/internal/NestiaSdkCommand.js.map +1 -1
  37. package/lib/executable/sdk.js +12 -12
  38. package/lib/generates/SwaggerGenerator.d.ts +1 -1
  39. package/lib/generates/SwaggerGenerator.js +6 -6
  40. package/lib/generates/SwaggerGenerator.js.map +1 -1
  41. package/lib/generates/internal/E2eFileProgrammer.js +8 -9
  42. package/lib/generates/internal/E2eFileProgrammer.js.map +1 -1
  43. package/lib/generates/internal/SdkAliasCollection.d.ts +2 -2
  44. package/lib/generates/internal/SdkAliasCollection.js +2 -2
  45. package/lib/generates/internal/SdkAliasCollection.js.map +1 -1
  46. package/lib/generates/internal/SdkDistributionComposer.js +1 -1
  47. package/lib/generates/internal/SdkHttpCloneProgrammer.js.map +1 -1
  48. package/lib/generates/internal/SdkHttpCloneReferencer.js.map +1 -1
  49. package/lib/generates/internal/SdkHttpFunctionProgrammer.js +11 -12
  50. package/lib/generates/internal/SdkHttpFunctionProgrammer.js.map +1 -1
  51. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js +13 -16
  52. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js.map +1 -1
  53. package/lib/generates/internal/SdkHttpRouteProgrammer.js +4 -4
  54. package/lib/generates/internal/SdkHttpRouteProgrammer.js.map +1 -1
  55. package/lib/generates/internal/SdkHttpSimulationProgrammer.js +12 -16
  56. package/lib/generates/internal/SdkHttpSimulationProgrammer.js.map +1 -1
  57. package/lib/generates/internal/SdkImportWizard.js +2 -2
  58. package/lib/generates/internal/SdkImportWizard.js.map +1 -1
  59. package/lib/generates/internal/SdkTypeProgrammer.d.ts +2 -3
  60. package/lib/generates/internal/SdkTypeProgrammer.js +6 -7
  61. package/lib/generates/internal/SdkTypeProgrammer.js.map +1 -1
  62. package/lib/generates/internal/SdkTypeTagProgrammer.d.ts +1 -1
  63. package/lib/generates/internal/SdkTypeTagProgrammer.js +11 -11
  64. package/lib/generates/internal/SdkTypeTagProgrammer.js.map +1 -1
  65. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js +6 -8
  66. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js.map +1 -1
  67. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js +2 -2
  68. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js.map +1 -1
  69. package/lib/generates/internal/SwaggerOperationComposer.d.ts +3 -3
  70. package/lib/generates/internal/SwaggerOperationComposer.js.map +1 -1
  71. package/lib/generates/internal/SwaggerOperationParameterComposer.d.ts +1 -1
  72. package/lib/generates/internal/SwaggerOperationParameterComposer.js +10 -8
  73. package/lib/generates/internal/SwaggerOperationParameterComposer.js.map +1 -1
  74. package/lib/generates/internal/SwaggerOperationResponseComposer.d.ts +3 -3
  75. package/lib/generates/internal/SwaggerOperationResponseComposer.js.map +1 -1
  76. package/lib/module.d.ts +1 -0
  77. package/lib/module.js +1 -0
  78. package/lib/module.js.map +1 -1
  79. package/lib/structures/IReflectHttpOperationException.d.ts +3 -4
  80. package/lib/structures/IReflectHttpOperationParameter.d.ts +3 -5
  81. package/lib/structures/IReflectHttpOperationSuccess.d.ts +3 -4
  82. package/lib/structures/ITypedApplication.d.ts +1 -1
  83. package/lib/structures/ITypedHttpRouteException.d.ts +2 -2
  84. package/lib/structures/ITypedHttpRouteParameter.d.ts +2 -2
  85. package/lib/structures/ITypedHttpRouteSuccess.d.ts +2 -2
  86. package/lib/transformers/IOperationMetadata.d.ts +2 -4
  87. package/lib/transformers/ISdkOperationTransformerContext.d.ts +1 -1
  88. package/lib/transformers/SdkOperationProgrammer.js +8 -10
  89. package/lib/transformers/SdkOperationProgrammer.js.map +1 -1
  90. package/lib/transformers/SdkOperationTransformer.js +5 -7
  91. package/lib/transformers/SdkOperationTransformer.js.map +1 -1
  92. package/lib/transformers/TextPlainValidator.d.ts +2 -2
  93. package/lib/transformers/TextPlainValidator.js.map +1 -1
  94. package/lib/utils/MetadataUtil.d.ts +2 -2
  95. package/lib/utils/MetadataUtil.js.map +1 -1
  96. package/lib/validators/HttpHeadersValidator.d.ts +2 -3
  97. package/lib/validators/HttpHeadersValidator.js +2 -2
  98. package/lib/validators/HttpHeadersValidator.js.map +1 -1
  99. package/lib/validators/HttpQueryValidator.d.ts +2 -3
  100. package/lib/validators/HttpQueryValidator.js +2 -2
  101. package/lib/validators/HttpQueryValidator.js.map +1 -1
  102. package/package.json +44 -30
  103. package/src/INestiaConfig.ts +267 -267
  104. package/src/NestiaSdkApplication.ts +307 -307
  105. package/src/NestiaSwaggerComposer.ts +140 -138
  106. package/src/analyses/AccessorAnalyzer.ts +67 -67
  107. package/src/analyses/ConfigAnalyzer.ts +155 -155
  108. package/src/analyses/DtoAnalyzer.ts +260 -260
  109. package/src/analyses/ExceptionAnalyzer.ts +154 -154
  110. package/src/analyses/GenericAnalyzer.ts +49 -49
  111. package/src/analyses/ImportAnalyzer.ts +126 -126
  112. package/src/analyses/PathAnalyzer.ts +69 -69
  113. package/src/analyses/ReflectControllerAnalyzer.ts +105 -105
  114. package/src/analyses/ReflectHttpOperationAnalyzer.ts +183 -183
  115. package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +72 -71
  116. package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +350 -348
  117. package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +126 -127
  118. package/src/analyses/ReflectMetadataAnalyzer.ts +44 -44
  119. package/src/analyses/ReflectWebSocketOperationAnalyzer.ts +172 -172
  120. package/src/analyses/SecurityAnalyzer.ts +25 -25
  121. package/src/analyses/TypedHttpRouteAnalyzer.ts +208 -204
  122. package/src/analyses/TypedWebSocketRouteAnalyzer.ts +33 -33
  123. package/src/decorators/OperationMetadata.ts +15 -15
  124. package/src/executable/internal/CommandParser.ts +15 -15
  125. package/src/executable/internal/NestiaConfigLoader.ts +85 -78
  126. package/src/executable/internal/NestiaSdkCommand.ts +107 -103
  127. package/src/executable/sdk.ts +75 -75
  128. package/src/generates/CloneGenerator.ts +66 -66
  129. package/src/generates/E2eGenerator.ts +32 -32
  130. package/src/generates/SdkGenerator.ts +160 -160
  131. package/src/generates/SwaggerGenerator.ts +285 -284
  132. package/src/generates/internal/E2eFileProgrammer.ts +196 -197
  133. package/src/generates/internal/FilePrinter.ts +64 -64
  134. package/src/generates/internal/ImportDictionary.ts +192 -192
  135. package/src/generates/internal/SdkAliasCollection.ts +260 -261
  136. package/src/generates/internal/SdkDistributionComposer.ts +103 -103
  137. package/src/generates/internal/SdkFileProgrammer.ts +110 -110
  138. package/src/generates/internal/SdkHttpCloneProgrammer.ts +126 -124
  139. package/src/generates/internal/SdkHttpCloneReferencer.ts +77 -77
  140. package/src/generates/internal/SdkHttpFunctionProgrammer.ts +278 -279
  141. package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +502 -500
  142. package/src/generates/internal/SdkHttpParameterProgrammer.ts +178 -178
  143. package/src/generates/internal/SdkHttpRouteProgrammer.ts +109 -108
  144. package/src/generates/internal/SdkHttpSimulationProgrammer.ts +312 -310
  145. package/src/generates/internal/SdkImportWizard.ts +62 -62
  146. package/src/generates/internal/SdkRouteDirectory.ts +18 -18
  147. package/src/generates/internal/SdkTypeProgrammer.ts +388 -385
  148. package/src/generates/internal/SdkTypeTagProgrammer.ts +114 -104
  149. package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +379 -381
  150. package/src/generates/internal/SdkWebSocketParameterProgrammer.ts +87 -87
  151. package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +302 -302
  152. package/src/generates/internal/SwaggerDescriptionComposer.ts +64 -64
  153. package/src/generates/internal/SwaggerOperationComposer.ts +119 -119
  154. package/src/generates/internal/SwaggerOperationParameterComposer.ts +161 -162
  155. package/src/generates/internal/SwaggerOperationResponseComposer.ts +110 -110
  156. package/src/index.ts +4 -4
  157. package/src/module.ts +4 -3
  158. package/src/structures/INestiaProject.ts +13 -13
  159. package/src/structures/INestiaSdkInput.ts +20 -20
  160. package/src/structures/IReflectApplication.ts +8 -8
  161. package/src/structures/IReflectController.ts +15 -15
  162. package/src/structures/IReflectHttpOperation.ts +26 -26
  163. package/src/structures/IReflectHttpOperationException.ts +18 -19
  164. package/src/structures/IReflectHttpOperationParameter.ts +79 -77
  165. package/src/structures/IReflectHttpOperationSuccess.ts +21 -22
  166. package/src/structures/IReflectImport.ts +6 -6
  167. package/src/structures/IReflectOperationError.ts +26 -26
  168. package/src/structures/IReflectType.ts +4 -4
  169. package/src/structures/IReflectWebSocketOperation.ts +17 -17
  170. package/src/structures/IReflectWebSocketOperationParameter.ts +36 -36
  171. package/src/structures/ITypedApplication.ts +11 -11
  172. package/src/structures/ITypedHttpRoute.ts +41 -41
  173. package/src/structures/ITypedHttpRouteException.ts +15 -15
  174. package/src/structures/ITypedHttpRouteParameter.ts +41 -41
  175. package/src/structures/ITypedHttpRouteSuccess.ts +22 -22
  176. package/src/structures/ITypedWebSocketRoute.ts +24 -24
  177. package/src/structures/ITypedWebSocketRouteParameter.ts +3 -3
  178. package/src/structures/MethodType.ts +5 -5
  179. package/src/structures/ParamCategory.ts +1 -1
  180. package/src/structures/TypeEntry.ts +22 -22
  181. package/src/transform.ts +9 -9
  182. package/src/transformers/IOperationMetadata.ts +46 -44
  183. package/src/transformers/ISdkOperationTransformerContext.ts +8 -8
  184. package/src/transformers/SdkOperationProgrammer.ts +240 -238
  185. package/src/transformers/SdkOperationTransformer.ts +248 -252
  186. package/src/transformers/TextPlainValidator.ts +17 -17
  187. package/src/typings/get-function-location.d.ts +7 -7
  188. package/src/utils/ArrayUtil.ts +26 -26
  189. package/src/utils/FileRetriever.ts +22 -22
  190. package/src/utils/MapUtil.ts +14 -14
  191. package/src/utils/MetadataUtil.ts +26 -26
  192. package/src/utils/PathUtil.ts +10 -10
  193. package/src/utils/SourceFinder.ts +63 -63
  194. package/src/utils/StringUtil.ts +17 -17
  195. package/src/utils/StripEnums.ts +5 -5
  196. package/src/utils/VersioningStrategy.ts +28 -28
  197. package/src/validators/HttpHeadersValidator.ts +36 -34
  198. package/src/validators/HttpQueryValidator.ts +36 -34
@@ -1,103 +1,103 @@
1
- import cp from "child_process";
2
- import fs from "fs";
3
- import path from "path";
4
- import typia from "typia";
5
-
6
- import { INestiaConfig } from "../../INestiaConfig";
7
-
8
- export namespace SdkDistributionComposer {
9
- export const compose = async (props: {
10
- config: INestiaConfig;
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();
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.websocket) 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 (): Promise<IDependencies> => {
81
- const content: string = await fs.promises.readFile(
82
- __dirname + "/../../../package.json",
83
- "utf8",
84
- );
85
- const json: {
86
- version: string;
87
- dependencies: Record<string, string>;
88
- devDependencies: Record<string, string>;
89
- } = JSON.parse(content);
90
- return typia.assert<IDependencies>({
91
- ...json.devDependencies,
92
- ...json.dependencies,
93
- version: json.version,
94
- });
95
- };
96
- }
97
-
98
- interface IDependencies {
99
- version: string;
100
- typia: string;
101
- tgrid: string;
102
- }
103
- const BUNDLE = __dirname + "/../../../assets/bundle/distribute";
1
+ import cp from "child_process";
2
+ import fs from "fs";
3
+ import path from "path";
4
+ import typia from "typia";
5
+
6
+ import { INestiaConfig } from "../../INestiaConfig";
7
+
8
+ export namespace SdkDistributionComposer {
9
+ export const compose = async (props: {
10
+ config: INestiaConfig;
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();
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.websocket) 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 (): Promise<IDependencies> => {
81
+ const content: string = await fs.promises.readFile(
82
+ __dirname + "/../../../package.json",
83
+ "utf8",
84
+ );
85
+ const json: {
86
+ version: string;
87
+ dependencies: Record<string, string>;
88
+ devDependencies: Record<string, string>;
89
+ } = JSON.parse(content);
90
+ return typia.assert<IDependencies>({
91
+ ...json.devDependencies,
92
+ ...json.dependencies,
93
+ version: json.version,
94
+ });
95
+ };
96
+ }
97
+
98
+ interface IDependencies {
99
+ version: string;
100
+ typia: string;
101
+ tgrid: string;
102
+ }
103
+ const BUNDLE = __dirname + "/../../../assets/bundle/distribute";
@@ -1,110 +1,110 @@
1
- import fs from "fs";
2
- import ts from "typescript";
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: ts.Statement[] = [];
58
- for (const [key, value] of directory.children) {
59
- await iterate(project)(value)(`${outDir}/${key}`);
60
- statements.push(
61
- ts.factory.createExportDeclaration(
62
- undefined,
63
- false,
64
- ts.factory.createNamespaceExport(ts.factory.createIdentifier(key)),
65
- ts.factory.createStringLiteral(`./${key}/index`),
66
- undefined,
67
- ),
68
- );
69
- }
70
- if (statements.length && directory.routes.length)
71
- statements.push(FilePrinter.enter());
72
-
73
- // ITERATE ROUTES
74
- const importer: ImportDictionary = new ImportDictionary(
75
- `${outDir}/index.ts`,
76
- );
77
- directory.routes.forEach((route, i) => {
78
- if (!(project.config.clone === true && route.protocol === "http"))
79
- importer.declarations(route.imports);
80
- statements.push(
81
- ...(route.protocol === "http"
82
- ? SdkHttpRouteProgrammer.write(project)(importer)(route)
83
- : SdkWebSocketRouteProgrammer.write(project)(importer)(route)),
84
- );
85
- if (i !== directory.routes.length - 1)
86
- statements.push(FilePrinter.enter());
87
- });
88
-
89
- // FINALIZE THE CONTENT
90
- if (directory.routes.length !== 0)
91
- statements.push(
92
- ...importer.toStatements(outDir),
93
- ...(!importer.empty() && statements.length
94
- ? [FilePrinter.enter()]
95
- : []),
96
- ...statements.splice(0, statements.length),
97
- );
98
- await FilePrinter.write({
99
- location: importer.file,
100
- statements,
101
- top:
102
- "/**\n" +
103
- " * @packageDocumentation\n" +
104
- ` * @module ${directory.module}\n` +
105
- " * @nestia Generated by Nestia - https://github.com/samchon/nestia \n" +
106
- " */\n" +
107
- "//================================================================\n",
108
- });
109
- };
110
- }
1
+ import fs from "fs";
2
+ import ts from "typescript";
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: ts.Statement[] = [];
58
+ for (const [key, value] of directory.children) {
59
+ await iterate(project)(value)(`${outDir}/${key}`);
60
+ statements.push(
61
+ ts.factory.createExportDeclaration(
62
+ undefined,
63
+ false,
64
+ ts.factory.createNamespaceExport(ts.factory.createIdentifier(key)),
65
+ ts.factory.createStringLiteral(`./${key}/index`),
66
+ undefined,
67
+ ),
68
+ );
69
+ }
70
+ if (statements.length && directory.routes.length)
71
+ statements.push(FilePrinter.enter());
72
+
73
+ // ITERATE ROUTES
74
+ const importer: ImportDictionary = new ImportDictionary(
75
+ `${outDir}/index.ts`,
76
+ );
77
+ directory.routes.forEach((route, i) => {
78
+ if (!(project.config.clone === true && route.protocol === "http"))
79
+ importer.declarations(route.imports);
80
+ statements.push(
81
+ ...(route.protocol === "http"
82
+ ? SdkHttpRouteProgrammer.write(project)(importer)(route)
83
+ : SdkWebSocketRouteProgrammer.write(project)(importer)(route)),
84
+ );
85
+ if (i !== directory.routes.length - 1)
86
+ statements.push(FilePrinter.enter());
87
+ });
88
+
89
+ // FINALIZE THE CONTENT
90
+ if (directory.routes.length !== 0)
91
+ statements.push(
92
+ ...importer.toStatements(outDir),
93
+ ...(!importer.empty() && statements.length
94
+ ? [FilePrinter.enter()]
95
+ : []),
96
+ ...statements.splice(0, statements.length),
97
+ );
98
+ await FilePrinter.write({
99
+ location: importer.file,
100
+ statements,
101
+ top:
102
+ "/**\n" +
103
+ " * @packageDocumentation\n" +
104
+ ` * @module ${directory.module}\n` +
105
+ " * @nestia Generated by Nestia - https://github.com/samchon/nestia \n" +
106
+ " */\n" +
107
+ "//================================================================\n",
108
+ });
109
+ };
110
+ }