@nestia/sdk 7.1.0 → 7.1.1-dev.20250714

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 (113) 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/executable/internal/NestiaConfigLoader.js +4 -4
  15. package/lib/executable/sdk.js +12 -12
  16. package/lib/generates/internal/SdkHttpSimulationProgrammer.js +5 -4
  17. package/lib/generates/internal/SdkHttpSimulationProgrammer.js.map +1 -1
  18. package/package.json +4 -4
  19. package/src/INestiaConfig.ts +269 -269
  20. package/src/NestiaSdkApplication.ts +307 -307
  21. package/src/NestiaSwaggerComposer.ts +138 -138
  22. package/src/analyses/AccessorAnalyzer.ts +67 -67
  23. package/src/analyses/ConfigAnalyzer.ts +155 -155
  24. package/src/analyses/ExceptionAnalyzer.ts +154 -154
  25. package/src/analyses/GenericAnalyzer.ts +49 -49
  26. package/src/analyses/ImportAnalyzer.ts +171 -171
  27. package/src/analyses/PathAnalyzer.ts +69 -69
  28. package/src/analyses/ReflectControllerAnalyzer.ts +105 -105
  29. package/src/analyses/ReflectHttpOperationAnalyzer.ts +183 -183
  30. package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +71 -71
  31. package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +348 -348
  32. package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +127 -127
  33. package/src/analyses/ReflectMetadataAnalyzer.ts +44 -44
  34. package/src/analyses/ReflectWebSocketOperationAnalyzer.ts +172 -172
  35. package/src/analyses/SecurityAnalyzer.ts +25 -25
  36. package/src/analyses/TypedHttpRouteAnalyzer.ts +204 -204
  37. package/src/analyses/TypedWebSocketRouteAnalyzer.ts +33 -33
  38. package/src/decorators/OperationMetadata.ts +15 -15
  39. package/src/executable/internal/CommandParser.ts +15 -15
  40. package/src/executable/internal/NestiaConfigLoader.ts +78 -78
  41. package/src/executable/internal/NestiaSdkCommand.ts +103 -103
  42. package/src/executable/sdk.ts +75 -75
  43. package/src/generates/CloneGenerator.ts +66 -66
  44. package/src/generates/E2eGenerator.ts +32 -32
  45. package/src/generates/SdkGenerator.ts +160 -160
  46. package/src/generates/SwaggerGenerator.ts +284 -284
  47. package/src/generates/internal/E2eFileProgrammer.ts +205 -205
  48. package/src/generates/internal/FilePrinter.ts +53 -53
  49. package/src/generates/internal/ImportDictionary.ts +163 -163
  50. package/src/generates/internal/SdkAliasCollection.ts +255 -255
  51. package/src/generates/internal/SdkDistributionComposer.ts +103 -103
  52. package/src/generates/internal/SdkFileProgrammer.ts +116 -116
  53. package/src/generates/internal/SdkHttpCloneProgrammer.ts +124 -124
  54. package/src/generates/internal/SdkHttpCloneReferencer.ts +75 -75
  55. package/src/generates/internal/SdkHttpFunctionProgrammer.ts +279 -279
  56. package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +500 -500
  57. package/src/generates/internal/SdkHttpParameterProgrammer.ts +178 -178
  58. package/src/generates/internal/SdkHttpRouteProgrammer.ts +107 -107
  59. package/src/generates/internal/SdkHttpSimulationProgrammer.ts +309 -311
  60. package/src/generates/internal/SdkImportWizard.ts +55 -55
  61. package/src/generates/internal/SdkRouteDirectory.ts +18 -18
  62. package/src/generates/internal/SdkTypeProgrammer.ts +384 -384
  63. package/src/generates/internal/SdkTypeTagProgrammer.ts +102 -102
  64. package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +366 -366
  65. package/src/generates/internal/SdkWebSocketParameterProgrammer.ts +87 -87
  66. package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +279 -279
  67. package/src/generates/internal/SwaggerDescriptionComposer.ts +64 -64
  68. package/src/generates/internal/SwaggerOperationComposer.ts +119 -119
  69. package/src/generates/internal/SwaggerOperationParameterComposer.ts +177 -177
  70. package/src/generates/internal/SwaggerOperationResponseComposer.ts +110 -110
  71. package/src/index.ts +4 -4
  72. package/src/module.ts +3 -3
  73. package/src/structures/INestiaProject.ts +13 -13
  74. package/src/structures/INestiaSdkInput.ts +20 -20
  75. package/src/structures/IReflectApplication.ts +8 -8
  76. package/src/structures/IReflectController.ts +15 -15
  77. package/src/structures/IReflectHttpOperation.ts +26 -26
  78. package/src/structures/IReflectHttpOperationException.ts +19 -19
  79. package/src/structures/IReflectHttpOperationParameter.ts +81 -81
  80. package/src/structures/IReflectHttpOperationSuccess.ts +22 -22
  81. package/src/structures/IReflectOperationError.ts +26 -26
  82. package/src/structures/IReflectType.ts +4 -4
  83. package/src/structures/IReflectTypeImport.ts +4 -4
  84. package/src/structures/IReflectWebSocketOperation.ts +17 -17
  85. package/src/structures/IReflectWebSocketOperationParameter.ts +38 -38
  86. package/src/structures/ITypedApplication.ts +11 -11
  87. package/src/structures/ITypedHttpRoute.ts +41 -41
  88. package/src/structures/ITypedHttpRouteException.ts +15 -15
  89. package/src/structures/ITypedHttpRouteParameter.ts +41 -41
  90. package/src/structures/ITypedHttpRouteSuccess.ts +22 -22
  91. package/src/structures/ITypedWebSocketRoute.ts +24 -24
  92. package/src/structures/ITypedWebSocketRouteParameter.ts +3 -3
  93. package/src/structures/MethodType.ts +5 -5
  94. package/src/structures/ParamCategory.ts +1 -1
  95. package/src/structures/TypeEntry.ts +22 -22
  96. package/src/transform.ts +9 -9
  97. package/src/transformers/IOperationMetadata.ts +44 -44
  98. package/src/transformers/ISdkOperationTransformerContext.ts +8 -8
  99. package/src/transformers/SdkOperationProgrammer.ts +209 -209
  100. package/src/transformers/SdkOperationTransformer.ts +253 -253
  101. package/src/transformers/TextPlainValidator.ts +17 -17
  102. package/src/typings/get-function-location.d.ts +7 -7
  103. package/src/utils/ArrayUtil.ts +26 -26
  104. package/src/utils/FileRetriever.ts +22 -22
  105. package/src/utils/MapUtil.ts +14 -14
  106. package/src/utils/MetadataUtil.ts +26 -26
  107. package/src/utils/PathUtil.ts +10 -10
  108. package/src/utils/SourceFinder.ts +66 -66
  109. package/src/utils/StringUtil.ts +17 -17
  110. package/src/utils/StripEnums.ts +5 -5
  111. package/src/utils/VersioningStrategy.ts +28 -28
  112. package/src/validators/HttpHeadersValidator.ts +34 -34
  113. package/src/validators/HttpQueryValidator.ts +34 -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,116 +1,116 @@
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}`),
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
- for (const tuple of route.imports)
80
- for (const instance of tuple.instances)
81
- importer.internal({
82
- file: tuple.file,
83
- instance,
84
- type: true,
85
- });
86
- statements.push(
87
- ...(route.protocol === "http"
88
- ? SdkHttpRouteProgrammer.write(project)(importer)(route)
89
- : SdkWebSocketRouteProgrammer.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
- }
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}`),
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
+ for (const tuple of route.imports)
80
+ for (const instance of tuple.instances)
81
+ importer.internal({
82
+ file: tuple.file,
83
+ instance,
84
+ type: true,
85
+ });
86
+ statements.push(
87
+ ...(route.protocol === "http"
88
+ ? SdkHttpRouteProgrammer.write(project)(importer)(route)
89
+ : SdkWebSocketRouteProgrammer.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
+ }