@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,183 +1,183 @@
1
- import { METHOD_METADATA, PATH_METADATA } from "@nestjs/common/constants";
2
- import { ranges } from "tstl";
3
-
4
- import { INestiaProject } from "../structures/INestiaProject";
5
- import { IReflectController } from "../structures/IReflectController";
6
- import { IReflectHttpOperation } from "../structures/IReflectHttpOperation";
7
- import { IReflectHttpOperationParameter } from "../structures/IReflectHttpOperationParameter";
8
- import { IReflectHttpOperationSuccess } from "../structures/IReflectHttpOperationSuccess";
9
- import { IReflectOperationError } from "../structures/IReflectOperationError";
10
- import { IOperationMetadata } from "../transformers/IOperationMetadata";
11
- import { ArrayUtil } from "../utils/ArrayUtil";
12
- import { ImportAnalyzer } from "./ImportAnalyzer";
13
- import { PathAnalyzer } from "./PathAnalyzer";
14
- import { ReflectHttpOperationExceptionAnalyzer } from "./ReflectHttpOperationExceptionAnalyzer";
15
- import { ReflectHttpOperationParameterAnalyzer } from "./ReflectHttpOperationParameterAnalyzer";
16
- import { ReflectHttpOperationResponseAnalyzer } from "./ReflectHttpOperationResponseAnalyzer";
17
- import { ReflectMetadataAnalyzer } from "./ReflectMetadataAnalyzer";
18
-
19
- export namespace ReflectHttpOperationAnalyzer {
20
- export interface IProps {
21
- project: Omit<INestiaProject, "config">;
22
- controller: IReflectController;
23
- function: Function;
24
- name: string;
25
- metadata: IOperationMetadata;
26
- }
27
- export const analyze = (props: IProps): IReflectHttpOperation | null => {
28
- if (
29
- ArrayUtil.has(
30
- Reflect.getMetadataKeys(props.function),
31
- PATH_METADATA,
32
- METHOD_METADATA,
33
- ) === false
34
- )
35
- return null;
36
-
37
- const errors: IReflectOperationError[] = [];
38
- const method: string =
39
- METHODS[Reflect.getMetadata(METHOD_METADATA, props.function)];
40
- if (method === undefined || method === "OPTIONS") return null;
41
-
42
- const parameters: IReflectHttpOperationParameter[] =
43
- ReflectHttpOperationParameterAnalyzer.analyze({
44
- controller: props.controller,
45
- metadata: props.metadata,
46
- httpMethod: method,
47
- function: props.function,
48
- functionName: props.name,
49
- errors,
50
- });
51
- const success: IReflectHttpOperationSuccess | null = (() => {
52
- const localErrors: IReflectOperationError[] = [];
53
- const success = ReflectHttpOperationResponseAnalyzer.analyze({
54
- controller: props.controller,
55
- function: props.function,
56
- functionName: props.name,
57
- httpMethod: method,
58
- metadata: props.metadata,
59
- errors,
60
- });
61
- if (localErrors.length) {
62
- errors.push(...localErrors);
63
- return null;
64
- }
65
- return success;
66
- })();
67
- if (errors.length) {
68
- props.project.errors.push(...errors);
69
- return null;
70
- } else if (success === null) return null;
71
-
72
- // DO CONSTRUCT
73
- const operation: IReflectHttpOperation = {
74
- protocol: "http",
75
- function: props.function,
76
- name: props.name,
77
- method: method === "ALL" ? "POST" : method,
78
- paths: ReflectMetadataAnalyzer.paths(props.function).filter((str) => {
79
- if (str.includes("*") === true) {
80
- props.project.warnings.push({
81
- file: props.controller.file,
82
- class: props.controller.class.name,
83
- function: props.name,
84
- from: "",
85
- contents: ["@nestia/sdk does not compose wildcard method."],
86
- });
87
- return false;
88
- }
89
- return true;
90
- }),
91
- versions: ReflectMetadataAnalyzer.versions(props.function),
92
- parameters,
93
- success,
94
- security: ReflectMetadataAnalyzer.securities(props.function),
95
- exceptions: ReflectHttpOperationExceptionAnalyzer.analyze({
96
- controller: props.controller,
97
- function: props.function,
98
- functionName: props.name,
99
- httpMethod: method,
100
- metadata: props.metadata,
101
- errors,
102
- }),
103
- tags: Reflect.getMetadata("swagger/apiUseTags", props.function) ?? [],
104
- imports: ImportAnalyzer.merge(
105
- [
106
- ...props.metadata.parameters
107
- .filter((x) => parameters.some((y) => x.index === y.index))
108
- .map((x) => x.imports),
109
- ...props.metadata.success.imports,
110
- ...Object.values(props.metadata.exceptions).map((e) => e.imports),
111
- ].flat(),
112
- ),
113
- description: props.metadata.description,
114
- jsDocTags: props.metadata.jsDocTags,
115
- operationId: props.metadata.jsDocTags
116
- .find(({ name }) => name === "operationId")
117
- ?.text?.[0].text.split(" ")[0]
118
- .trim(),
119
- extensions: ReflectMetadataAnalyzer.extensions(props.function),
120
- };
121
-
122
- // VALIDATE PATH ARGUMENTS
123
- for (const controllerLocation of props.controller.paths)
124
- for (const metaLocation of operation.paths) {
125
- // NORMALIZE LOCATION
126
- const location: string = PathAnalyzer.join(
127
- controllerLocation,
128
- metaLocation,
129
- );
130
- if (location.includes("*")) continue;
131
-
132
- // LIST UP PARAMETERS
133
- const binded: string[] | null = PathAnalyzer.parameters(location);
134
- if (binded === null) {
135
- props.project.errors.push({
136
- file: props.controller.file,
137
- class: props.controller.class.name,
138
- function: props.name,
139
- from: "{parameters}",
140
- contents: [`invalid path (${JSON.stringify(location)})`],
141
- });
142
- continue;
143
- }
144
- const parameters: string[] = operation.parameters
145
- .filter((param) => param.category === "param")
146
- .map((param) => param.field!)
147
- .sort();
148
-
149
- // DO VALIDATE
150
- if (ranges.equal(binded.sort(), parameters) === false)
151
- errors.push({
152
- file: props.controller.file,
153
- class: props.controller.class.name,
154
- function: props.name,
155
- from: "{parameters}",
156
- contents: [
157
- `binded arguments in the "path" between function's decorator and parameters' decorators are different (function: [${binded.join(
158
- ", ",
159
- )}], parameters: [${parameters.join(", ")}]).`,
160
- ],
161
- });
162
- }
163
-
164
- // RETURNS
165
- if (errors.length) {
166
- props.project.errors.push(...errors);
167
- return null;
168
- }
169
- return operation;
170
- };
171
- }
172
-
173
- // node_modules/@nestjs/common/lib/enums/request-method.enum.ts
174
- const METHODS = [
175
- "GET",
176
- "POST",
177
- "PUT",
178
- "DELETE",
179
- "PATCH",
180
- "ALL",
181
- "OPTIONS",
182
- "HEAD",
183
- ];
1
+ import { METHOD_METADATA, PATH_METADATA } from "@nestjs/common/constants";
2
+ import { ranges } from "tstl";
3
+
4
+ import { INestiaProject } from "../structures/INestiaProject";
5
+ import { IReflectController } from "../structures/IReflectController";
6
+ import { IReflectHttpOperation } from "../structures/IReflectHttpOperation";
7
+ import { IReflectHttpOperationParameter } from "../structures/IReflectHttpOperationParameter";
8
+ import { IReflectHttpOperationSuccess } from "../structures/IReflectHttpOperationSuccess";
9
+ import { IReflectOperationError } from "../structures/IReflectOperationError";
10
+ import { IOperationMetadata } from "../transformers/IOperationMetadata";
11
+ import { ArrayUtil } from "../utils/ArrayUtil";
12
+ import { ImportAnalyzer } from "./ImportAnalyzer";
13
+ import { PathAnalyzer } from "./PathAnalyzer";
14
+ import { ReflectHttpOperationExceptionAnalyzer } from "./ReflectHttpOperationExceptionAnalyzer";
15
+ import { ReflectHttpOperationParameterAnalyzer } from "./ReflectHttpOperationParameterAnalyzer";
16
+ import { ReflectHttpOperationResponseAnalyzer } from "./ReflectHttpOperationResponseAnalyzer";
17
+ import { ReflectMetadataAnalyzer } from "./ReflectMetadataAnalyzer";
18
+
19
+ export namespace ReflectHttpOperationAnalyzer {
20
+ export interface IProps {
21
+ project: Omit<INestiaProject, "config">;
22
+ controller: IReflectController;
23
+ function: Function;
24
+ name: string;
25
+ metadata: IOperationMetadata;
26
+ }
27
+ export const analyze = (props: IProps): IReflectHttpOperation | null => {
28
+ if (
29
+ ArrayUtil.has(
30
+ Reflect.getMetadataKeys(props.function),
31
+ PATH_METADATA,
32
+ METHOD_METADATA,
33
+ ) === false
34
+ )
35
+ return null;
36
+
37
+ const errors: IReflectOperationError[] = [];
38
+ const method: string =
39
+ METHODS[Reflect.getMetadata(METHOD_METADATA, props.function)]!;
40
+ if (method === undefined || method === "OPTIONS") return null;
41
+
42
+ const parameters: IReflectHttpOperationParameter[] =
43
+ ReflectHttpOperationParameterAnalyzer.analyze({
44
+ controller: props.controller,
45
+ metadata: props.metadata,
46
+ httpMethod: method,
47
+ function: props.function,
48
+ functionName: props.name,
49
+ errors,
50
+ });
51
+ const success: IReflectHttpOperationSuccess | null = (() => {
52
+ const localErrors: IReflectOperationError[] = [];
53
+ const success = ReflectHttpOperationResponseAnalyzer.analyze({
54
+ controller: props.controller,
55
+ function: props.function,
56
+ functionName: props.name,
57
+ httpMethod: method,
58
+ metadata: props.metadata,
59
+ errors,
60
+ });
61
+ if (localErrors.length) {
62
+ errors.push(...localErrors);
63
+ return null;
64
+ }
65
+ return success;
66
+ })();
67
+ if (errors.length) {
68
+ props.project.errors.push(...errors);
69
+ return null;
70
+ } else if (success === null) return null;
71
+
72
+ // DO CONSTRUCT
73
+ const operation: IReflectHttpOperation = {
74
+ protocol: "http",
75
+ function: props.function,
76
+ name: props.name,
77
+ method: method === "ALL" ? "POST" : method,
78
+ paths: ReflectMetadataAnalyzer.paths(props.function).filter((str) => {
79
+ if (str.includes("*") === true) {
80
+ props.project.warnings.push({
81
+ file: props.controller.file,
82
+ class: props.controller.class.name,
83
+ function: props.name,
84
+ from: "",
85
+ contents: ["@nestia/sdk does not compose wildcard method."],
86
+ });
87
+ return false;
88
+ }
89
+ return true;
90
+ }),
91
+ versions: ReflectMetadataAnalyzer.versions(props.function),
92
+ parameters,
93
+ success,
94
+ security: ReflectMetadataAnalyzer.securities(props.function),
95
+ exceptions: ReflectHttpOperationExceptionAnalyzer.analyze({
96
+ controller: props.controller,
97
+ function: props.function,
98
+ functionName: props.name,
99
+ httpMethod: method,
100
+ metadata: props.metadata,
101
+ errors,
102
+ }),
103
+ tags: Reflect.getMetadata("swagger/apiUseTags", props.function) ?? [],
104
+ imports: ImportAnalyzer.merge(
105
+ [
106
+ ...props.metadata.parameters
107
+ .filter((x) => parameters.some((y) => x.index === y.index))
108
+ .map((x) => x.imports),
109
+ ...props.metadata.success.imports,
110
+ ...Object.values(props.metadata.exceptions).map((e) => e.imports),
111
+ ].flat(),
112
+ ),
113
+ description: props.metadata.description,
114
+ jsDocTags: props.metadata.jsDocTags,
115
+ operationId: props.metadata.jsDocTags
116
+ .find(({ name }) => name === "operationId")
117
+ ?.text?.[0]?.text.split(" ")[0]
118
+ ?.trim(),
119
+ extensions: ReflectMetadataAnalyzer.extensions(props.function),
120
+ };
121
+
122
+ // VALIDATE PATH ARGUMENTS
123
+ for (const controllerLocation of props.controller.paths)
124
+ for (const metaLocation of operation.paths) {
125
+ // NORMALIZE LOCATION
126
+ const location: string = PathAnalyzer.join(
127
+ controllerLocation,
128
+ metaLocation,
129
+ );
130
+ if (location.includes("*")) continue;
131
+
132
+ // LIST UP PARAMETERS
133
+ const binded: string[] | null = PathAnalyzer.parameters(location);
134
+ if (binded === null) {
135
+ props.project.errors.push({
136
+ file: props.controller.file,
137
+ class: props.controller.class.name,
138
+ function: props.name,
139
+ from: "{parameters}",
140
+ contents: [`invalid path (${JSON.stringify(location)})`],
141
+ });
142
+ continue;
143
+ }
144
+ const parameters: string[] = operation.parameters
145
+ .filter((param) => param.category === "param")
146
+ .map((param) => param.field!)
147
+ .sort();
148
+
149
+ // DO VALIDATE
150
+ if (ranges.equal(binded.sort(), parameters) === false)
151
+ errors.push({
152
+ file: props.controller.file,
153
+ class: props.controller.class.name,
154
+ function: props.name,
155
+ from: "{parameters}",
156
+ contents: [
157
+ `binded arguments in the "path" between function's decorator and parameters' decorators are different (function: [${binded.join(
158
+ ", ",
159
+ )}], parameters: [${parameters.join(", ")}]).`,
160
+ ],
161
+ });
162
+ }
163
+
164
+ // RETURNS
165
+ if (errors.length) {
166
+ props.project.errors.push(...errors);
167
+ return null;
168
+ }
169
+ return operation;
170
+ };
171
+ }
172
+
173
+ // node_modules/@nestjs/common/lib/enums/request-method.enum.ts
174
+ const METHODS = [
175
+ "GET",
176
+ "POST",
177
+ "PUT",
178
+ "DELETE",
179
+ "PATCH",
180
+ "ALL",
181
+ "OPTIONS",
182
+ "HEAD",
183
+ ];
@@ -1,71 +1,72 @@
1
- import { TypedException } from "@nestia/core";
2
- import { JsonMetadataFactory } from "typia/lib/factories/JsonMetadataFactory";
3
-
4
- import { IReflectController } from "../structures/IReflectController";
5
- import { IReflectHttpOperationException } from "../structures/IReflectHttpOperationException";
6
- import { IReflectOperationError } from "../structures/IReflectOperationError";
7
- import { IOperationMetadata } from "../transformers/IOperationMetadata";
8
-
9
- export namespace ReflectHttpOperationExceptionAnalyzer {
10
- export interface IContext {
11
- controller: IReflectController;
12
- function: Function;
13
- functionName: string;
14
- httpMethod: string;
15
- metadata: IOperationMetadata;
16
- errors: IReflectOperationError[];
17
- }
18
- export const analyze = (
19
- ctx: IContext,
20
- ): Record<string, IReflectHttpOperationException> => {
21
- const preconfigured: TypedException.IProps<any>[] = analyzePreconfigured(
22
- ctx.function,
23
- )
24
- .slice()
25
- .reverse();
26
- const errors: IReflectOperationError[] = [];
27
- const exceptions: IReflectHttpOperationException[] = preconfigured
28
- .map((pre, i) => {
29
- const matched: IOperationMetadata.IException | null =
30
- ctx.metadata.exceptions[i];
31
- if (matched === undefined) {
32
- errors.push({
33
- file: ctx.controller.file,
34
- class: ctx.controller.class.name,
35
- function: ctx.functionName,
36
- from: `exception (status: ${pre.status})`,
37
- contents: ["Unable to find exception type."],
38
- });
39
- return null;
40
- } else if (matched.type === null) {
41
- errors.push({
42
- file: ctx.controller.file,
43
- class: ctx.controller.class.name,
44
- function: ctx.functionName,
45
- from: `exception (status: ${pre.status})`,
46
- contents: ["Failed to get the type info."],
47
- });
48
- }
49
- const schema: IOperationMetadata.ISchema | null = matched.primitive
50
- .success
51
- ? matched.primitive.data
52
- : null;
53
- if (schema === null || matched.type === null) return null; // unreachable
54
- return {
55
- status: pre.status,
56
- description: pre.description ?? null,
57
- example: pre.example,
58
- examples: pre.examples,
59
- type: matched.type,
60
- ...schema,
61
- validate: JsonMetadataFactory.validate,
62
- } satisfies IReflectHttpOperationException;
63
- })
64
- .filter((e) => e !== null);
65
- if (errors.length) ctx.errors.push(...errors);
66
- return Object.fromEntries(exceptions.map((e) => [e.status, e]));
67
- };
68
-
69
- const analyzePreconfigured = (func: Function): TypedException.IProps<any>[] =>
70
- Reflect.getMetadata("nestia/TypedException", func) ?? [];
71
- }
1
+ import { TypedException } from "@nestia/core";
2
+ import { JsonMetadataFactory } from "@typia/core";
3
+
4
+ import { IReflectController } from "../structures/IReflectController";
5
+ import { IReflectHttpOperationException } from "../structures/IReflectHttpOperationException";
6
+ import { IReflectOperationError } from "../structures/IReflectOperationError";
7
+ import { IOperationMetadata } from "../transformers/IOperationMetadata";
8
+
9
+ export namespace ReflectHttpOperationExceptionAnalyzer {
10
+ export interface IContext {
11
+ controller: IReflectController;
12
+ function: Function;
13
+ functionName: string;
14
+ httpMethod: string;
15
+ metadata: IOperationMetadata;
16
+ errors: IReflectOperationError[];
17
+ }
18
+ export const analyze = (
19
+ ctx: IContext,
20
+ ): Record<string, IReflectHttpOperationException> => {
21
+ const preconfigured: TypedException.IProps<any>[] = analyzePreconfigured(
22
+ ctx.function,
23
+ )
24
+ .slice()
25
+ .reverse();
26
+ const errors: IReflectOperationError[] = [];
27
+ const exceptions: IReflectHttpOperationException[] = preconfigured
28
+ .map((pre, i) => {
29
+ const matched: IOperationMetadata.IException | null =
30
+ ctx.metadata.exceptions[i]!;
31
+ if (matched === undefined) {
32
+ if (ctx.functionName === "getOauthProfile") console.log(ctx.metadata);
33
+ errors.push({
34
+ file: ctx.controller.file,
35
+ class: ctx.controller.class.name,
36
+ function: ctx.functionName,
37
+ from: `exception (status: ${pre.status})`,
38
+ contents: ["Unable to find exception type."],
39
+ });
40
+ return null;
41
+ } else if (matched.type === null) {
42
+ errors.push({
43
+ file: ctx.controller.file,
44
+ class: ctx.controller.class.name,
45
+ function: ctx.functionName,
46
+ from: `exception (status: ${pre.status})`,
47
+ contents: ["Failed to get the type info."],
48
+ });
49
+ }
50
+ const schema: IOperationMetadata.ISchema | null = matched.primitive
51
+ .success
52
+ ? matched.primitive.data
53
+ : null;
54
+ if (schema === null || matched.type === null) return null; // unreachable
55
+ return {
56
+ status: pre.status,
57
+ description: pre.description ?? null,
58
+ example: pre.example,
59
+ examples: pre.examples,
60
+ type: matched.type,
61
+ ...schema,
62
+ validate: JsonMetadataFactory.validate,
63
+ } satisfies IReflectHttpOperationException;
64
+ })
65
+ .filter((e) => e !== null);
66
+ if (errors.length) ctx.errors.push(...errors);
67
+ return Object.fromEntries(exceptions.map((e) => [e.status, e]));
68
+ };
69
+
70
+ const analyzePreconfigured = (func: Function): TypedException.IProps<any>[] =>
71
+ Reflect.getMetadata("nestia/TypedException", func) ?? [];
72
+ }