@nestia/sdk 10.0.1 → 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,69 +1,69 @@
1
- import path from "path";
2
- import { Token, parse } from "path-to-regexp";
3
-
4
- export namespace PathAnalyzer {
5
- export const join = (...args: string[]) =>
6
- "/" +
7
- _Trim(
8
- path
9
- .join(...args.filter((s) => !!s.length))
10
- .split("\\")
11
- .join("/"),
12
- );
13
-
14
- export const escape = (str: string): string | null => {
15
- const args = _Parse(str);
16
- if (args === null) return null;
17
- return (
18
- "/" +
19
- args
20
- .map((arg) => (arg.type === "param" ? `:${arg.value}` : arg.value))
21
- .join("/")
22
- );
23
- };
24
-
25
- export const parameters = (str: string): string[] | null => {
26
- const args = _Parse(str);
27
- if (args === null) return null;
28
- return args.filter((arg) => arg.type === "param").map((arg) => arg.value);
29
- };
30
-
31
- function _Parse(str: string): IArgument[] | null {
32
- const tokens: Token[] | null = (() => {
33
- try {
34
- return parse(path.join(str).split("\\").join("/"));
35
- } catch {
36
- return null;
37
- }
38
- })();
39
- if (tokens === null) return null;
40
-
41
- const output: IArgument[] = [];
42
- for (const key of tokens) {
43
- if (typeof key === "string")
44
- output.push({
45
- type: "path",
46
- value: _Trim(key),
47
- });
48
- else if (typeof key.name === "number" || _Trim(key.name) === "")
49
- return null;
50
- else
51
- output.push({
52
- type: "param",
53
- value: _Trim(key.name),
54
- });
55
- }
56
- return output;
57
- }
58
-
59
- function _Trim(str: string): string {
60
- if (str[0] === "/") str = str.substring(1);
61
- if (str[str.length - 1] === "/") str = str.substring(0, str.length - 1);
62
- return str;
63
- }
64
-
65
- interface IArgument {
66
- type: "param" | "path";
67
- value: string;
68
- }
69
- }
1
+ import path from "path";
2
+ import { Token, parse } from "path-to-regexp";
3
+
4
+ export namespace PathAnalyzer {
5
+ export const join = (...args: string[]) =>
6
+ "/" +
7
+ _Trim(
8
+ path
9
+ .join(...args.filter((s) => !!s.length))
10
+ .split("\\")
11
+ .join("/"),
12
+ );
13
+
14
+ export const escape = (str: string): string | null => {
15
+ const args = _Parse(str);
16
+ if (args === null) return null;
17
+ return (
18
+ "/" +
19
+ args
20
+ .map((arg) => (arg.type === "param" ? `:${arg.value}` : arg.value))
21
+ .join("/")
22
+ );
23
+ };
24
+
25
+ export const parameters = (str: string): string[] | null => {
26
+ const args = _Parse(str);
27
+ if (args === null) return null;
28
+ return args.filter((arg) => arg.type === "param").map((arg) => arg.value);
29
+ };
30
+
31
+ function _Parse(str: string): IArgument[] | null {
32
+ const tokens: Token[] | null = (() => {
33
+ try {
34
+ return parse(path.join(str).split("\\").join("/"));
35
+ } catch {
36
+ return null;
37
+ }
38
+ })();
39
+ if (tokens === null) return null;
40
+
41
+ const output: IArgument[] = [];
42
+ for (const key of tokens) {
43
+ if (typeof key === "string")
44
+ output.push({
45
+ type: "path",
46
+ value: _Trim(key),
47
+ });
48
+ else if (typeof key.name === "number" || _Trim(key.name) === "")
49
+ return null;
50
+ else
51
+ output.push({
52
+ type: "param",
53
+ value: _Trim(key.name),
54
+ });
55
+ }
56
+ return output;
57
+ }
58
+
59
+ function _Trim(str: string): string {
60
+ if (str[0] === "/") str = str.substring(1);
61
+ if (str[str.length - 1] === "/") str = str.substring(0, str.length - 1);
62
+ return str;
63
+ }
64
+
65
+ interface IArgument {
66
+ type: "param" | "path";
67
+ value: string;
68
+ }
69
+ }
@@ -1,105 +1,105 @@
1
- import {
2
- HOST_METADATA,
3
- PATH_METADATA,
4
- SCOPE_OPTIONS_METADATA,
5
- } from "@nestjs/common/constants";
6
-
7
- import { INestiaProject } from "../structures/INestiaProject";
8
- import { INestiaSdkInput } from "../structures/INestiaSdkInput";
9
- import { IReflectController } from "../structures/IReflectController";
10
- import { IReflectHttpOperation } from "../structures/IReflectHttpOperation";
11
- import { IReflectWebSocketOperation } from "../structures/IReflectWebSocketOperation";
12
- import { IOperationMetadata } from "../transformers/IOperationMetadata";
13
- import { ArrayUtil } from "../utils/ArrayUtil";
14
- import { ReflectHttpOperationAnalyzer } from "./ReflectHttpOperationAnalyzer";
15
- import { ReflectMetadataAnalyzer } from "./ReflectMetadataAnalyzer";
16
- import { ReflectWebSocketOperationAnalyzer } from "./ReflectWebSocketOperationAnalyzer";
17
-
18
- export namespace ReflectControllerAnalyzer {
19
- export interface IProps {
20
- project: Omit<INestiaProject, "config">;
21
- controller: INestiaSdkInput.IController;
22
- unique: WeakSet<Function>;
23
- }
24
- /* ---------------------------------------------------------
25
- CONTROLLER
26
- --------------------------------------------------------- */
27
- export const analyze = (props: IProps): IReflectController | null => {
28
- // MUST BE TYPE OF A CREATOR WHO HAS THE CONSTRUCTOR
29
- if (
30
- ArrayUtil.has(
31
- Reflect.getMetadataKeys(props.controller.class),
32
- PATH_METADATA,
33
- HOST_METADATA,
34
- SCOPE_OPTIONS_METADATA,
35
- ) === false
36
- )
37
- return null;
38
-
39
- // BASIC INFO
40
- const controller: IReflectController = {
41
- class: props.controller.class,
42
- file: props.controller.location,
43
- operations: [],
44
- prefixes: props.controller.prefixes,
45
- paths: ReflectMetadataAnalyzer.paths(props.controller.class).filter(
46
- (str) => {
47
- if (str.includes("*") === true) {
48
- props.project.warnings.push({
49
- file: props.controller.location,
50
- class: props.controller.class.name,
51
- function: null,
52
- from: null,
53
- contents: ["@nestia/sdk does not compose wildcard controller."],
54
- });
55
- return false;
56
- }
57
- return true;
58
- },
59
- ),
60
- versions: ReflectMetadataAnalyzer.versions(props.controller.class),
61
- security: ReflectMetadataAnalyzer.securities(props.controller.class),
62
- tags:
63
- Reflect.getMetadata("swagger/apiUseTags", props.controller.class) ?? [],
64
- };
65
-
66
- // OPERATORS
67
- for (const [key, value] of _Get_prototype_entries(props.controller.class)) {
68
- if (typeof value !== "function") continue;
69
- const metadata: IOperationMetadata | undefined = Reflect.getMetadata(
70
- "nestia/OperationMetadata",
71
- props.controller.class.prototype,
72
- key,
73
- );
74
- if (metadata === undefined) continue;
75
- else if (metadata.jsDocTags.some((tag) => tag.name === "ignore"))
76
- continue;
77
- const next: ReflectHttpOperationAnalyzer.IProps = {
78
- project: props.project,
79
- controller: controller,
80
- name: key,
81
- function: value,
82
- metadata,
83
- };
84
- const child: IReflectHttpOperation | IReflectWebSocketOperation | null =
85
- ReflectWebSocketOperationAnalyzer.analyze(next) ??
86
- ReflectHttpOperationAnalyzer.analyze(next);
87
- if (child !== null) controller.operations.push(child);
88
- }
89
- return controller;
90
- };
91
-
92
- function _Get_prototype_entries(creator: any): Array<[string, unknown]> {
93
- const keyList = Object.getOwnPropertyNames(creator.prototype);
94
- const entries: Array<[string, unknown]> = keyList.map((key) => [
95
- key,
96
- creator.prototype[key],
97
- ]);
98
-
99
- const parent = Object.getPrototypeOf(creator);
100
- if (parent.prototype !== undefined)
101
- entries.push(..._Get_prototype_entries(parent));
102
-
103
- return entries;
104
- }
105
- }
1
+ import {
2
+ HOST_METADATA,
3
+ PATH_METADATA,
4
+ SCOPE_OPTIONS_METADATA,
5
+ } from "@nestjs/common/constants";
6
+
7
+ import { INestiaProject } from "../structures/INestiaProject";
8
+ import { INestiaSdkInput } from "../structures/INestiaSdkInput";
9
+ import { IReflectController } from "../structures/IReflectController";
10
+ import { IReflectHttpOperation } from "../structures/IReflectHttpOperation";
11
+ import { IReflectWebSocketOperation } from "../structures/IReflectWebSocketOperation";
12
+ import { IOperationMetadata } from "../transformers/IOperationMetadata";
13
+ import { ArrayUtil } from "../utils/ArrayUtil";
14
+ import { ReflectHttpOperationAnalyzer } from "./ReflectHttpOperationAnalyzer";
15
+ import { ReflectMetadataAnalyzer } from "./ReflectMetadataAnalyzer";
16
+ import { ReflectWebSocketOperationAnalyzer } from "./ReflectWebSocketOperationAnalyzer";
17
+
18
+ export namespace ReflectControllerAnalyzer {
19
+ export interface IProps {
20
+ project: Omit<INestiaProject, "config">;
21
+ controller: INestiaSdkInput.IController;
22
+ unique: WeakSet<Function>;
23
+ }
24
+ /* ---------------------------------------------------------
25
+ CONTROLLER
26
+ --------------------------------------------------------- */
27
+ export const analyze = (props: IProps): IReflectController | null => {
28
+ // MUST BE TYPE OF A CREATOR WHO HAS THE CONSTRUCTOR
29
+ if (
30
+ ArrayUtil.has(
31
+ Reflect.getMetadataKeys(props.controller.class),
32
+ PATH_METADATA,
33
+ HOST_METADATA,
34
+ SCOPE_OPTIONS_METADATA,
35
+ ) === false
36
+ )
37
+ return null;
38
+
39
+ // BASIC INFO
40
+ const controller: IReflectController = {
41
+ class: props.controller.class,
42
+ file: props.controller.location,
43
+ operations: [],
44
+ prefixes: props.controller.prefixes,
45
+ paths: ReflectMetadataAnalyzer.paths(props.controller.class).filter(
46
+ (str) => {
47
+ if (str.includes("*") === true) {
48
+ props.project.warnings.push({
49
+ file: props.controller.location,
50
+ class: props.controller.class.name,
51
+ function: null,
52
+ from: null,
53
+ contents: ["@nestia/sdk does not compose wildcard controller."],
54
+ });
55
+ return false;
56
+ }
57
+ return true;
58
+ },
59
+ ),
60
+ versions: ReflectMetadataAnalyzer.versions(props.controller.class),
61
+ security: ReflectMetadataAnalyzer.securities(props.controller.class),
62
+ tags:
63
+ Reflect.getMetadata("swagger/apiUseTags", props.controller.class) ?? [],
64
+ };
65
+
66
+ // OPERATORS
67
+ for (const [key, value] of _Get_prototype_entries(props.controller.class)) {
68
+ if (typeof value !== "function") continue;
69
+ const metadata: IOperationMetadata | undefined = Reflect.getMetadata(
70
+ "nestia/OperationMetadata",
71
+ props.controller.class.prototype,
72
+ key,
73
+ );
74
+ if (metadata === undefined) continue;
75
+ else if (metadata.jsDocTags.some((tag) => tag.name === "ignore"))
76
+ continue;
77
+ const next: ReflectHttpOperationAnalyzer.IProps = {
78
+ project: props.project,
79
+ controller: controller,
80
+ name: key,
81
+ function: value,
82
+ metadata,
83
+ };
84
+ const child: IReflectHttpOperation | IReflectWebSocketOperation | null =
85
+ ReflectWebSocketOperationAnalyzer.analyze(next) ??
86
+ ReflectHttpOperationAnalyzer.analyze(next);
87
+ if (child !== null) controller.operations.push(child);
88
+ }
89
+ return controller;
90
+ };
91
+
92
+ function _Get_prototype_entries(creator: any): Array<[string, unknown]> {
93
+ const keyList = Object.getOwnPropertyNames(creator.prototype);
94
+ const entries: Array<[string, unknown]> = keyList.map((key) => [
95
+ key,
96
+ creator.prototype[key],
97
+ ]);
98
+
99
+ const parent = Object.getPrototypeOf(creator);
100
+ if (parent.prototype !== undefined)
101
+ entries.push(..._Get_prototype_entries(parent));
102
+
103
+ return entries;
104
+ }
105
+ }