@nestia/sdk 4.2.0-dev.20241211 → 4.2.0

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 (108) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +87 -87
  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/package.json +5 -5
  17. package/src/INestiaConfig.ts +271 -271
  18. package/src/NestiaSdkApplication.ts +307 -307
  19. package/src/NestiaSwaggerComposer.ts +138 -138
  20. package/src/analyses/AccessorAnalyzer.ts +67 -67
  21. package/src/analyses/ConfigAnalyzer.ts +155 -155
  22. package/src/analyses/ExceptionAnalyzer.ts +154 -154
  23. package/src/analyses/GenericAnalyzer.ts +49 -49
  24. package/src/analyses/ImportAnalyzer.ts +171 -171
  25. package/src/analyses/PathAnalyzer.ts +69 -69
  26. package/src/analyses/ReflectControllerAnalyzer.ts +105 -105
  27. package/src/analyses/ReflectHttpOperationAnalyzer.ts +183 -183
  28. package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +71 -71
  29. package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +348 -348
  30. package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +127 -127
  31. package/src/analyses/ReflectMetadataAnalyzer.ts +44 -44
  32. package/src/analyses/ReflectWebSocketOperationAnalyzer.ts +172 -172
  33. package/src/analyses/SecurityAnalyzer.ts +25 -25
  34. package/src/analyses/TypedHttpRouteAnalyzer.ts +186 -186
  35. package/src/analyses/TypedWebSocketRouteAnalyzer.ts +18 -18
  36. package/src/decorators/OperationMetadata.ts +15 -15
  37. package/src/executable/internal/CommandParser.ts +15 -15
  38. package/src/executable/internal/NestiaConfigLoader.ts +78 -78
  39. package/src/executable/internal/NestiaSdkCommand.ts +103 -103
  40. package/src/executable/sdk.ts +75 -75
  41. package/src/generates/CloneGenerator.ts +66 -66
  42. package/src/generates/E2eGenerator.ts +32 -32
  43. package/src/generates/SdkGenerator.ts +159 -159
  44. package/src/generates/SwaggerGenerator.ts +292 -292
  45. package/src/generates/internal/E2eFileProgrammer.ts +183 -183
  46. package/src/generates/internal/FilePrinter.ts +53 -53
  47. package/src/generates/internal/ImportDictionary.ts +147 -147
  48. package/src/generates/internal/SdkAliasCollection.ts +185 -185
  49. package/src/generates/internal/SdkDistributionComposer.ts +103 -103
  50. package/src/generates/internal/SdkFileProgrammer.ts +116 -116
  51. package/src/generates/internal/SdkHttpCloneProgrammer.ts +124 -124
  52. package/src/generates/internal/SdkHttpCloneReferencer.ts +71 -71
  53. package/src/generates/internal/SdkHttpFunctionProgrammer.ts +301 -301
  54. package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +529 -529
  55. package/src/generates/internal/SdkHttpRouteProgrammer.ts +117 -117
  56. package/src/generates/internal/SdkHttpSimulationProgrammer.ts +362 -362
  57. package/src/generates/internal/SdkImportWizard.ts +55 -55
  58. package/src/generates/internal/SdkRouteDirectory.ts +18 -18
  59. package/src/generates/internal/SdkTypeProgrammer.ts +394 -394
  60. package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +363 -363
  61. package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +265 -265
  62. package/src/generates/internal/SwaggerDescriptionComposer.ts +64 -64
  63. package/src/generates/internal/SwaggerOperationComposer.ts +117 -117
  64. package/src/generates/internal/SwaggerOperationParameterComposer.ts +177 -177
  65. package/src/generates/internal/SwaggerOperationResponseComposer.ts +110 -110
  66. package/src/index.ts +4 -4
  67. package/src/module.ts +3 -3
  68. package/src/structures/INestiaProject.ts +13 -13
  69. package/src/structures/INestiaSdkInput.ts +20 -20
  70. package/src/structures/IReflectApplication.ts +8 -8
  71. package/src/structures/IReflectController.ts +15 -15
  72. package/src/structures/IReflectHttpOperation.ts +26 -26
  73. package/src/structures/IReflectHttpOperationException.ts +19 -19
  74. package/src/structures/IReflectHttpOperationParameter.ts +81 -81
  75. package/src/structures/IReflectHttpOperationSuccess.ts +22 -22
  76. package/src/structures/IReflectOperationError.ts +26 -26
  77. package/src/structures/IReflectType.ts +4 -4
  78. package/src/structures/IReflectTypeImport.ts +4 -4
  79. package/src/structures/IReflectWebSocketOperation.ts +17 -17
  80. package/src/structures/IReflectWebSocketOperationParameter.ts +38 -38
  81. package/src/structures/ITypedApplication.ts +11 -11
  82. package/src/structures/ITypedHttpRoute.ts +30 -30
  83. package/src/structures/ITypedHttpRouteException.ts +15 -15
  84. package/src/structures/ITypedHttpRouteParameter.ts +41 -41
  85. package/src/structures/ITypedHttpRouteSuccess.ts +22 -22
  86. package/src/structures/ITypedWebSocketRoute.ts +20 -20
  87. package/src/structures/ITypedWebSocketRouteParameter.ts +3 -3
  88. package/src/structures/MethodType.ts +5 -5
  89. package/src/structures/ParamCategory.ts +1 -1
  90. package/src/structures/TypeEntry.ts +22 -22
  91. package/src/transform.ts +9 -9
  92. package/src/transformers/IOperationMetadata.ts +44 -44
  93. package/src/transformers/ISdkOperationTransformerContext.ts +8 -8
  94. package/src/transformers/SdkOperationProgrammer.ts +209 -209
  95. package/src/transformers/SdkOperationTransformer.ts +253 -253
  96. package/src/transformers/TextPlainValidator.ts +17 -17
  97. package/src/typings/get-function-location.d.ts +7 -7
  98. package/src/utils/ArrayUtil.ts +26 -26
  99. package/src/utils/FileRetriever.ts +22 -22
  100. package/src/utils/MapUtil.ts +14 -14
  101. package/src/utils/MetadataUtil.ts +26 -26
  102. package/src/utils/PathUtil.ts +10 -10
  103. package/src/utils/SourceFinder.ts +66 -66
  104. package/src/utils/StringUtil.ts +17 -17
  105. package/src/utils/StripEnums.ts +5 -5
  106. package/src/utils/VersioningStrategy.ts +28 -28
  107. package/src/validators/HttpHeadersValidator.ts +34 -34
  108. package/src/validators/HttpQueryValidator.ts +34 -34
@@ -1,183 +1,183 @@
1
- import ts from "typescript";
2
- import { IdentifierFactory } from "typia/lib/factories/IdentifierFactory";
3
-
4
- import { INestiaProject } from "../../structures/INestiaProject";
5
- import { ITypedHttpRoute } from "../../structures/ITypedHttpRoute";
6
- import { FilePrinter } from "./FilePrinter";
7
- import { ImportDictionary } from "./ImportDictionary";
8
- import { SdkAliasCollection } from "./SdkAliasCollection";
9
- import { SdkImportWizard } from "./SdkImportWizard";
10
-
11
- export namespace E2eFileProgrammer {
12
- export const generate =
13
- (project: INestiaProject) =>
14
- (props: { api: string; current: string }) =>
15
- async (route: ITypedHttpRoute): Promise<void> => {
16
- const importer: ImportDictionary = new ImportDictionary(
17
- `${props.current}/${getFunctionName(route)}.ts`,
18
- );
19
- if (project.config.clone !== true)
20
- for (const tuple of route.imports)
21
- for (const instance of tuple.instances)
22
- importer.internal({
23
- file: tuple.file,
24
- type: true,
25
- instance,
26
- });
27
- importer.internal({
28
- type: false,
29
- file: props.api,
30
- instance: null,
31
- name: "api",
32
- });
33
-
34
- const functor = generate_function(project)(importer)(route);
35
- await FilePrinter.write({
36
- location: importer.file,
37
- statements: [
38
- ...importer.toStatements(props.current),
39
- FilePrinter.enter(),
40
- functor,
41
- ],
42
- });
43
- };
44
-
45
- const generate_function =
46
- (project: INestiaProject) =>
47
- (importer: ImportDictionary) =>
48
- (route: ITypedHttpRoute): ts.Statement =>
49
- ts.factory.createVariableStatement(
50
- [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
51
- ts.factory.createVariableDeclarationList(
52
- [
53
- ts.factory.createVariableDeclaration(
54
- ts.factory.createIdentifier(getFunctionName(route)),
55
- undefined,
56
- undefined,
57
- generate_arrow(project)(importer)(route),
58
- ),
59
- ],
60
- ts.NodeFlags.Const,
61
- ),
62
- );
63
-
64
- const generate_arrow =
65
- (project: INestiaProject) =>
66
- (importer: ImportDictionary) =>
67
- (route: ITypedHttpRoute) => {
68
- const headers = route.parameters.find(
69
- (p) => p.category === "headers" && p.field === null,
70
- );
71
- const connection = headers
72
- ? ts.factory.createObjectLiteralExpression(
73
- [
74
- ts.factory.createSpreadAssignment(
75
- ts.factory.createIdentifier("connection"),
76
- ),
77
- ts.factory.createPropertyAssignment(
78
- "headers",
79
- ts.factory.createObjectLiteralExpression(
80
- [
81
- ts.factory.createSpreadAssignment(
82
- IdentifierFactory.access(
83
- ts.factory.createIdentifier("connection"),
84
- "headers",
85
- ),
86
- ),
87
- ts.factory.createSpreadAssignment(
88
- ts.factory.createCallExpression(
89
- IdentifierFactory.access(
90
- ts.factory.createIdentifier(
91
- SdkImportWizard.typia(importer),
92
- ),
93
- "random",
94
- ),
95
- [
96
- project.config.clone === true
97
- ? SdkAliasCollection.from(project)(importer)(
98
- headers.metadata,
99
- )
100
- : SdkAliasCollection.name(headers),
101
- ],
102
- undefined,
103
- ),
104
- ),
105
- ],
106
- true,
107
- ),
108
- ),
109
- ],
110
- true,
111
- )
112
- : ts.factory.createIdentifier("connection");
113
- const caller = ts.factory.createCallExpression(
114
- ts.factory.createIdentifier(
115
- ["api", "functional", ...route.accessors].join("."),
116
- ),
117
- undefined,
118
- [
119
- connection,
120
- ...route.parameters
121
- .filter((p) => p.category !== "headers")
122
- .map((p) =>
123
- ts.factory.createCallExpression(
124
- IdentifierFactory.access(
125
- ts.factory.createIdentifier(SdkImportWizard.typia(importer)),
126
- "random",
127
- ),
128
- [
129
- project.config.clone === true
130
- ? SdkAliasCollection.from(project)(importer)(p.metadata)
131
- : SdkAliasCollection.name(p),
132
- ],
133
- undefined,
134
- ),
135
- ),
136
- ],
137
- );
138
- const assert = ts.factory.createCallExpression(
139
- IdentifierFactory.access(
140
- ts.factory.createIdentifier(SdkImportWizard.typia(importer)),
141
- "assert",
142
- ),
143
- undefined,
144
- [ts.factory.createIdentifier("output")],
145
- );
146
-
147
- return ts.factory.createArrowFunction(
148
- [ts.factory.createModifier(ts.SyntaxKind.AsyncKeyword)],
149
- undefined,
150
- [
151
- IdentifierFactory.parameter(
152
- "connection",
153
- ts.factory.createTypeReferenceNode("api.IConnection"),
154
- ),
155
- ],
156
- undefined,
157
- undefined,
158
- ts.factory.createBlock([
159
- ts.factory.createVariableStatement(
160
- [],
161
- ts.factory.createVariableDeclarationList(
162
- [
163
- ts.factory.createVariableDeclaration(
164
- "output",
165
- undefined,
166
- project.config.propagate !== true &&
167
- route.success.type.name === "void"
168
- ? undefined
169
- : SdkAliasCollection.output(project)(importer)(route),
170
- ts.factory.createAwaitExpression(caller),
171
- ),
172
- ],
173
- ts.NodeFlags.Const,
174
- ),
175
- ),
176
- ts.factory.createExpressionStatement(assert),
177
- ]),
178
- );
179
- };
180
- }
181
-
182
- const getFunctionName = (route: ITypedHttpRoute): string =>
183
- ["test", "api", ...route.accessors].join("_");
1
+ import ts from "typescript";
2
+ import { IdentifierFactory } from "typia/lib/factories/IdentifierFactory";
3
+
4
+ import { INestiaProject } from "../../structures/INestiaProject";
5
+ import { ITypedHttpRoute } from "../../structures/ITypedHttpRoute";
6
+ import { FilePrinter } from "./FilePrinter";
7
+ import { ImportDictionary } from "./ImportDictionary";
8
+ import { SdkAliasCollection } from "./SdkAliasCollection";
9
+ import { SdkImportWizard } from "./SdkImportWizard";
10
+
11
+ export namespace E2eFileProgrammer {
12
+ export const generate =
13
+ (project: INestiaProject) =>
14
+ (props: { api: string; current: string }) =>
15
+ async (route: ITypedHttpRoute): Promise<void> => {
16
+ const importer: ImportDictionary = new ImportDictionary(
17
+ `${props.current}/${getFunctionName(route)}.ts`,
18
+ );
19
+ if (project.config.clone !== true)
20
+ for (const tuple of route.imports)
21
+ for (const instance of tuple.instances)
22
+ importer.internal({
23
+ file: tuple.file,
24
+ type: true,
25
+ instance,
26
+ });
27
+ importer.internal({
28
+ type: false,
29
+ file: props.api,
30
+ instance: null,
31
+ name: "api",
32
+ });
33
+
34
+ const functor = generate_function(project)(importer)(route);
35
+ await FilePrinter.write({
36
+ location: importer.file,
37
+ statements: [
38
+ ...importer.toStatements(props.current),
39
+ FilePrinter.enter(),
40
+ functor,
41
+ ],
42
+ });
43
+ };
44
+
45
+ const generate_function =
46
+ (project: INestiaProject) =>
47
+ (importer: ImportDictionary) =>
48
+ (route: ITypedHttpRoute): ts.Statement =>
49
+ ts.factory.createVariableStatement(
50
+ [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
51
+ ts.factory.createVariableDeclarationList(
52
+ [
53
+ ts.factory.createVariableDeclaration(
54
+ ts.factory.createIdentifier(getFunctionName(route)),
55
+ undefined,
56
+ undefined,
57
+ generate_arrow(project)(importer)(route),
58
+ ),
59
+ ],
60
+ ts.NodeFlags.Const,
61
+ ),
62
+ );
63
+
64
+ const generate_arrow =
65
+ (project: INestiaProject) =>
66
+ (importer: ImportDictionary) =>
67
+ (route: ITypedHttpRoute) => {
68
+ const headers = route.parameters.find(
69
+ (p) => p.category === "headers" && p.field === null,
70
+ );
71
+ const connection = headers
72
+ ? ts.factory.createObjectLiteralExpression(
73
+ [
74
+ ts.factory.createSpreadAssignment(
75
+ ts.factory.createIdentifier("connection"),
76
+ ),
77
+ ts.factory.createPropertyAssignment(
78
+ "headers",
79
+ ts.factory.createObjectLiteralExpression(
80
+ [
81
+ ts.factory.createSpreadAssignment(
82
+ IdentifierFactory.access(
83
+ ts.factory.createIdentifier("connection"),
84
+ "headers",
85
+ ),
86
+ ),
87
+ ts.factory.createSpreadAssignment(
88
+ ts.factory.createCallExpression(
89
+ IdentifierFactory.access(
90
+ ts.factory.createIdentifier(
91
+ SdkImportWizard.typia(importer),
92
+ ),
93
+ "random",
94
+ ),
95
+ [
96
+ project.config.clone === true
97
+ ? SdkAliasCollection.from(project)(importer)(
98
+ headers.metadata,
99
+ )
100
+ : SdkAliasCollection.name(headers),
101
+ ],
102
+ undefined,
103
+ ),
104
+ ),
105
+ ],
106
+ true,
107
+ ),
108
+ ),
109
+ ],
110
+ true,
111
+ )
112
+ : ts.factory.createIdentifier("connection");
113
+ const caller = ts.factory.createCallExpression(
114
+ ts.factory.createIdentifier(
115
+ ["api", "functional", ...route.accessors].join("."),
116
+ ),
117
+ undefined,
118
+ [
119
+ connection,
120
+ ...route.parameters
121
+ .filter((p) => p.category !== "headers")
122
+ .map((p) =>
123
+ ts.factory.createCallExpression(
124
+ IdentifierFactory.access(
125
+ ts.factory.createIdentifier(SdkImportWizard.typia(importer)),
126
+ "random",
127
+ ),
128
+ [
129
+ project.config.clone === true
130
+ ? SdkAliasCollection.from(project)(importer)(p.metadata)
131
+ : SdkAliasCollection.name(p),
132
+ ],
133
+ undefined,
134
+ ),
135
+ ),
136
+ ],
137
+ );
138
+ const assert = ts.factory.createCallExpression(
139
+ IdentifierFactory.access(
140
+ ts.factory.createIdentifier(SdkImportWizard.typia(importer)),
141
+ "assert",
142
+ ),
143
+ undefined,
144
+ [ts.factory.createIdentifier("output")],
145
+ );
146
+
147
+ return ts.factory.createArrowFunction(
148
+ [ts.factory.createModifier(ts.SyntaxKind.AsyncKeyword)],
149
+ undefined,
150
+ [
151
+ IdentifierFactory.parameter(
152
+ "connection",
153
+ ts.factory.createTypeReferenceNode("api.IConnection"),
154
+ ),
155
+ ],
156
+ undefined,
157
+ undefined,
158
+ ts.factory.createBlock([
159
+ ts.factory.createVariableStatement(
160
+ [],
161
+ ts.factory.createVariableDeclarationList(
162
+ [
163
+ ts.factory.createVariableDeclaration(
164
+ "output",
165
+ undefined,
166
+ project.config.propagate !== true &&
167
+ route.success.type.name === "void"
168
+ ? undefined
169
+ : SdkAliasCollection.output(project)(importer)(route),
170
+ ts.factory.createAwaitExpression(caller),
171
+ ),
172
+ ],
173
+ ts.NodeFlags.Const,
174
+ ),
175
+ ),
176
+ ts.factory.createExpressionStatement(assert),
177
+ ]),
178
+ );
179
+ };
180
+ }
181
+
182
+ const getFunctionName = (route: ITypedHttpRoute): string =>
183
+ ["test", "api", ...route.accessors].join("_");
@@ -1,53 +1,53 @@
1
- import fs from "fs";
2
- import { format } from "prettier";
3
- import ts from "typescript";
4
-
5
- export namespace FilePrinter {
6
- export const description = <Node extends ts.Node>(
7
- node: Node,
8
- comment: string,
9
- ): Node => {
10
- if (comment.length === 0) return node;
11
- ts.addSyntheticLeadingComment(
12
- node,
13
- ts.SyntaxKind.MultiLineCommentTrivia,
14
- ["*", ...comment.split("\n").map((str) => ` * ${str}`), ""].join("\n"),
15
- true,
16
- );
17
- return node;
18
- };
19
-
20
- export const enter = () =>
21
- ts.factory.createExpressionStatement(ts.factory.createIdentifier("\n"));
22
-
23
- export const write = async (props: {
24
- location: string;
25
- statements: ts.Statement[];
26
- top?: string;
27
- }): Promise<void> => {
28
- const script: string = ts
29
- .createPrinter()
30
- .printFile(
31
- ts.factory.createSourceFile(
32
- props.statements,
33
- ts.factory.createToken(ts.SyntaxKind.EndOfFileToken),
34
- ts.NodeFlags.None,
35
- ),
36
- );
37
- await fs.promises.writeFile(
38
- props.location,
39
- await beautify((props.top ?? "") + script),
40
- "utf8",
41
- );
42
- };
43
-
44
- const beautify = async (script: string): Promise<string> => {
45
- try {
46
- return await format(script, {
47
- parser: "typescript",
48
- });
49
- } catch {
50
- return script;
51
- }
52
- };
53
- }
1
+ import fs from "fs";
2
+ import { format } from "prettier";
3
+ import ts from "typescript";
4
+
5
+ export namespace FilePrinter {
6
+ export const description = <Node extends ts.Node>(
7
+ node: Node,
8
+ comment: string,
9
+ ): Node => {
10
+ if (comment.length === 0) return node;
11
+ ts.addSyntheticLeadingComment(
12
+ node,
13
+ ts.SyntaxKind.MultiLineCommentTrivia,
14
+ ["*", ...comment.split("\n").map((str) => ` * ${str}`), ""].join("\n"),
15
+ true,
16
+ );
17
+ return node;
18
+ };
19
+
20
+ export const enter = () =>
21
+ ts.factory.createExpressionStatement(ts.factory.createIdentifier("\n"));
22
+
23
+ export const write = async (props: {
24
+ location: string;
25
+ statements: ts.Statement[];
26
+ top?: string;
27
+ }): Promise<void> => {
28
+ const script: string = ts
29
+ .createPrinter()
30
+ .printFile(
31
+ ts.factory.createSourceFile(
32
+ props.statements,
33
+ ts.factory.createToken(ts.SyntaxKind.EndOfFileToken),
34
+ ts.NodeFlags.None,
35
+ ),
36
+ );
37
+ await fs.promises.writeFile(
38
+ props.location,
39
+ await beautify((props.top ?? "") + script),
40
+ "utf8",
41
+ );
42
+ };
43
+
44
+ const beautify = async (script: string): Promise<string> => {
45
+ try {
46
+ return await format(script, {
47
+ parser: "typescript",
48
+ });
49
+ } catch {
50
+ return script;
51
+ }
52
+ };
53
+ }