@nestia/sdk 12.0.0-dev.20260601.1 → 12.0.0-dev.20260612.2

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 (209) 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/NestiaSdkApplication.js +29 -7
  15. package/lib/NestiaSdkApplication.js.map +1 -1
  16. package/lib/NestiaSwaggerComposer.js +21 -13
  17. package/lib/NestiaSwaggerComposer.js.map +1 -1
  18. package/lib/analyses/AccessorAnalyzer.d.ts +4 -1
  19. package/lib/analyses/AccessorAnalyzer.js.map +1 -1
  20. package/lib/analyses/ConfigAnalyzer.js +1 -1
  21. package/lib/analyses/PathAnalyzer.d.ts +18 -3
  22. package/lib/analyses/PathAnalyzer.js +32 -0
  23. package/lib/analyses/PathAnalyzer.js.map +1 -1
  24. package/lib/analyses/ReflectControllerAnalyzer.js +3 -2
  25. package/lib/analyses/ReflectControllerAnalyzer.js.map +1 -1
  26. package/lib/analyses/ReflectHttpOperationAnalyzer.d.ts +1 -1
  27. package/lib/analyses/ReflectHttpOperationAnalyzer.js +1 -1
  28. package/lib/analyses/ReflectHttpOperationAnalyzer.js.map +1 -1
  29. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.d.ts +1 -1
  30. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js +53 -20
  31. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js.map +1 -1
  32. package/lib/analyses/ReflectMcpOperationAnalyzer.d.ts +14 -0
  33. package/lib/analyses/ReflectMcpOperationAnalyzer.js +79 -0
  34. package/lib/analyses/ReflectMcpOperationAnalyzer.js.map +1 -0
  35. package/lib/analyses/TypedMcpRouteAnalyzer.d.ts +9 -0
  36. package/lib/analyses/TypedMcpRouteAnalyzer.js +31 -0
  37. package/lib/analyses/TypedMcpRouteAnalyzer.js.map +1 -0
  38. package/lib/executable/internal/NestiaConfigLoader.js +5 -1
  39. package/lib/executable/internal/NestiaConfigLoader.js.map +1 -1
  40. package/lib/executable/internal/NestiaSdkCommand.js +30 -14
  41. package/lib/executable/internal/NestiaSdkCommand.js.map +1 -1
  42. package/lib/executable/internal/NestiaSdkWatcher.d.ts +10 -0
  43. package/lib/executable/internal/NestiaSdkWatcher.js +322 -0
  44. package/lib/executable/internal/NestiaSdkWatcher.js.map +1 -0
  45. package/lib/executable/sdk.js +12 -12
  46. package/lib/executable/sdk.js.map +1 -1
  47. package/lib/generates/CloneGenerator.js +4 -2
  48. package/lib/generates/CloneGenerator.js.map +1 -1
  49. package/lib/generates/SdkGenerator.js +50 -1
  50. package/lib/generates/SdkGenerator.js.map +1 -1
  51. package/lib/generates/SwaggerGenerator.js +18 -2
  52. package/lib/generates/SwaggerGenerator.js.map +1 -1
  53. package/lib/generates/internal/E2eFileProgrammer.js +3 -1
  54. package/lib/generates/internal/E2eFileProgrammer.js.map +1 -1
  55. package/lib/generates/internal/ImportDictionary.d.ts +1 -0
  56. package/lib/generates/internal/ImportDictionary.js +9 -4
  57. package/lib/generates/internal/ImportDictionary.js.map +1 -1
  58. package/lib/generates/internal/SdkAliasCollection.d.ts +2 -0
  59. package/lib/generates/internal/SdkAliasCollection.js +11 -2
  60. package/lib/generates/internal/SdkAliasCollection.js.map +1 -1
  61. package/lib/generates/internal/SdkDistributionComposer.d.ts +1 -0
  62. package/lib/generates/internal/SdkDistributionComposer.js +3 -0
  63. package/lib/generates/internal/SdkDistributionComposer.js.map +1 -1
  64. package/lib/generates/internal/SdkFileProgrammer.js +4 -1
  65. package/lib/generates/internal/SdkFileProgrammer.js.map +1 -1
  66. package/lib/generates/internal/SdkHttpCloneReferencer.d.ts +1 -1
  67. package/lib/generates/internal/SdkHttpCloneReferencer.js +42 -9
  68. package/lib/generates/internal/SdkHttpCloneReferencer.js.map +1 -1
  69. package/lib/generates/internal/SdkHttpFunctionProgrammer.js +3 -4
  70. package/lib/generates/internal/SdkHttpFunctionProgrammer.js.map +1 -1
  71. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js +2 -1
  72. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js.map +1 -1
  73. package/lib/generates/internal/SdkHttpSimulationProgrammer.js +6 -3
  74. package/lib/generates/internal/SdkHttpSimulationProgrammer.js.map +1 -1
  75. package/lib/generates/internal/SdkMcpRouteProgrammer.d.ts +15 -0
  76. package/lib/generates/internal/SdkMcpRouteProgrammer.js +148 -0
  77. package/lib/generates/internal/SdkMcpRouteProgrammer.js.map +1 -0
  78. package/lib/generates/internal/SdkRouteDirectory.d.ts +2 -1
  79. package/lib/generates/internal/SdkRouteDirectory.js.map +1 -1
  80. package/lib/generates/internal/SdkWebSocketCloneProgrammer.d.ts +6 -0
  81. package/lib/generates/internal/SdkWebSocketCloneProgrammer.js +283 -0
  82. package/lib/generates/internal/SdkWebSocketCloneProgrammer.js.map +1 -0
  83. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js +11 -9
  84. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js.map +1 -1
  85. package/lib/generates/internal/SwaggerOperationParameterComposer.js +10 -2
  86. package/lib/generates/internal/SwaggerOperationParameterComposer.js.map +1 -1
  87. package/lib/generates/internal/SwaggerOperationResponseComposer.d.ts +1 -1
  88. package/lib/generates/internal/SwaggerOperationResponseComposer.js +6 -1
  89. package/lib/generates/internal/SwaggerOperationResponseComposer.js.map +1 -1
  90. package/lib/generates/internal/SwaggerReadonlyArrayEmender.d.ts +9 -0
  91. package/lib/generates/internal/SwaggerReadonlyArrayEmender.js +174 -0
  92. package/lib/generates/internal/SwaggerReadonlyArrayEmender.js.map +1 -0
  93. package/lib/structures/INestiaSdkInput.d.ts +9 -2
  94. package/lib/structures/IReflectController.d.ts +2 -1
  95. package/lib/structures/IReflectHttpOperationSuccess.d.ts +4 -2
  96. package/lib/structures/IReflectMcpOperation.d.ts +35 -0
  97. package/lib/structures/IReflectMcpOperation.js +3 -0
  98. package/lib/structures/IReflectMcpOperation.js.map +1 -0
  99. package/lib/structures/IReflectMcpOperationParameter.d.ts +19 -0
  100. package/lib/structures/IReflectMcpOperationParameter.js +3 -0
  101. package/lib/structures/IReflectMcpOperationParameter.js.map +1 -0
  102. package/lib/structures/ITypedApplication.d.ts +2 -1
  103. package/lib/structures/ITypedHttpRouteSuccess.d.ts +3 -1
  104. package/lib/structures/ITypedMcpRoute.d.ts +31 -0
  105. package/lib/structures/ITypedMcpRoute.js +3 -0
  106. package/lib/structures/ITypedMcpRoute.js.map +1 -0
  107. package/lib/utils/HttpResponseContentTypeUtil.d.ts +5 -0
  108. package/lib/utils/HttpResponseContentTypeUtil.js +22 -0
  109. package/lib/utils/HttpResponseContentTypeUtil.js.map +1 -0
  110. package/native/go.mod +52 -52
  111. package/native/go.sum +84 -54
  112. package/native/sdk/register.go +322 -165
  113. package/native/sdk/sdk.go +17 -17
  114. package/native/sdk/sdk_metadata_json.go +327 -327
  115. package/native/sdk/sdk_transform.go +1879 -1549
  116. package/package.json +11 -9
  117. package/src/INestiaConfig.ts +267 -267
  118. package/src/NestiaSdkApplication.ts +39 -8
  119. package/src/NestiaSwaggerComposer.ts +153 -142
  120. package/src/analyses/AccessorAnalyzer.ts +64 -67
  121. package/src/analyses/ConfigAnalyzer.ts +330 -330
  122. package/src/analyses/ImportAnalyzer.ts +92 -92
  123. package/src/analyses/PathAnalyzer.ts +130 -69
  124. package/src/analyses/ReflectControllerAnalyzer.ts +112 -105
  125. package/src/analyses/ReflectHttpOperationAnalyzer.ts +183 -183
  126. package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +90 -90
  127. package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +350 -350
  128. package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +163 -130
  129. package/src/analyses/ReflectMcpOperationAnalyzer.ts +124 -0
  130. package/src/analyses/ReflectMetadataAnalyzer.ts +44 -44
  131. package/src/analyses/SecurityAnalyzer.ts +25 -25
  132. package/src/analyses/TypedMcpRouteAnalyzer.ts +34 -0
  133. package/src/decorators/OperationMetadata.ts +29 -29
  134. package/src/executable/internal/CommandParser.ts +15 -15
  135. package/src/executable/internal/NestiaConfigLoader.ts +451 -446
  136. package/src/executable/internal/NestiaSdkCommand.ts +124 -106
  137. package/src/executable/internal/NestiaSdkWatcher.ts +342 -0
  138. package/src/executable/sdk.ts +90 -88
  139. package/src/generates/CloneGenerator.ts +73 -66
  140. package/src/generates/E2eGenerator.ts +32 -32
  141. package/src/generates/SdkGenerator.ts +176 -118
  142. package/src/generates/SwaggerGenerator.ts +342 -310
  143. package/src/generates/internal/E2eFileProgrammer.ts +240 -233
  144. package/src/generates/internal/FilePrinter.ts +65 -65
  145. package/src/generates/internal/ImportDictionary.ts +209 -204
  146. package/src/generates/internal/SdkAliasCollection.ts +274 -261
  147. package/src/generates/internal/SdkDistributionComposer.ts +123 -116
  148. package/src/generates/internal/SdkFileProgrammer.ts +116 -112
  149. package/src/generates/internal/SdkHttpCloneProgrammer.ts +126 -126
  150. package/src/generates/internal/SdkHttpCloneReferencer.ts +131 -77
  151. package/src/generates/internal/SdkHttpFunctionProgrammer.ts +301 -301
  152. package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +520 -510
  153. package/src/generates/internal/SdkHttpParameterProgrammer.ts +165 -165
  154. package/src/generates/internal/SdkHttpRouteProgrammer.ts +109 -109
  155. package/src/generates/internal/SdkHttpSimulationProgrammer.ts +331 -314
  156. package/src/generates/internal/SdkImportWizard.ts +62 -62
  157. package/src/generates/internal/SdkMcpRouteProgrammer.ts +452 -0
  158. package/src/generates/internal/SdkRouteDirectory.ts +21 -18
  159. package/src/generates/internal/SdkTypeTagProgrammer.ts +114 -114
  160. package/src/generates/internal/SdkWebSocketCloneProgrammer.ts +319 -0
  161. package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +389 -389
  162. package/src/generates/internal/SdkWebSocketParameterProgrammer.ts +89 -89
  163. package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +331 -323
  164. package/src/generates/internal/SwaggerDescriptionComposer.ts +64 -64
  165. package/src/generates/internal/SwaggerOperationComposer.ts +119 -119
  166. package/src/generates/internal/SwaggerOperationParameterComposer.ts +175 -162
  167. package/src/generates/internal/SwaggerOperationResponseComposer.ts +115 -110
  168. package/src/generates/internal/SwaggerReadonlyArrayEmender.ts +262 -0
  169. package/src/index.ts +4 -4
  170. package/src/internal/legacy.ts +492 -492
  171. package/src/module.ts +4 -4
  172. package/src/structures/INestiaProject.ts +10 -10
  173. package/src/structures/INestiaSdkInput.ts +27 -20
  174. package/src/structures/IOperationMetadata.ts +41 -41
  175. package/src/structures/IReflectController.ts +18 -15
  176. package/src/structures/IReflectHttpOperation.ts +26 -26
  177. package/src/structures/IReflectHttpOperationException.ts +18 -18
  178. package/src/structures/IReflectHttpOperationParameter.ts +79 -79
  179. package/src/structures/IReflectHttpOperationSuccess.ts +18 -21
  180. package/src/structures/IReflectImport.ts +6 -6
  181. package/src/structures/IReflectMcpOperation.ts +38 -0
  182. package/src/structures/IReflectMcpOperationParameter.ts +27 -0
  183. package/src/structures/IReflectOperationError.ts +26 -26
  184. package/src/structures/IReflectType.ts +4 -4
  185. package/src/structures/IReflectWebSocketOperation.ts +17 -17
  186. package/src/structures/ITypedApplication.ts +12 -11
  187. package/src/structures/ITypedHttpRoute.ts +41 -41
  188. package/src/structures/ITypedHttpRouteException.ts +15 -15
  189. package/src/structures/ITypedHttpRouteParameter.ts +41 -41
  190. package/src/structures/ITypedHttpRouteSuccess.ts +18 -22
  191. package/src/structures/ITypedMcpRoute.ts +33 -0
  192. package/src/structures/ITypedWebSocketRoute.ts +24 -24
  193. package/src/structures/ITypedWebSocketRouteParameter.ts +3 -3
  194. package/src/transform.ts +59 -59
  195. package/src/typings/get-function-location.d.ts +7 -7
  196. package/src/utils/ArrayUtil.ts +26 -26
  197. package/src/utils/EmittedJavaScriptPatcher.ts +88 -88
  198. package/src/utils/FileRetriever.ts +22 -22
  199. package/src/utils/HttpResponseContentTypeUtil.ts +30 -0
  200. package/src/utils/MapUtil.ts +14 -14
  201. package/src/utils/PathUtil.ts +10 -10
  202. package/src/utils/SourceFinder.ts +63 -63
  203. package/src/utils/StringUtil.ts +17 -17
  204. package/src/utils/TsConfigReader.ts +108 -108
  205. package/src/utils/TtscExecutor.ts +68 -68
  206. package/src/utils/VersioningStrategy.ts +28 -28
  207. package/src/validators/HttpHeadersValidator.ts +11 -11
  208. package/src/validators/HttpQueryValidator.ts +11 -11
  209. package/src/validators/TextPlainValidator.ts +17 -17
@@ -1,92 +1,92 @@
1
- import { IReflectImport } from "../structures/IReflectImport";
2
- import { MapUtil } from "../utils/MapUtil";
3
-
4
- export namespace ImportAnalyzer {
5
- /**
6
- * @deprecated Removed in the Go-migration cycle. Import metadata is now
7
- * attached by the native transformer in `packages/core/native/cmd/ttsc-nestia`
8
- * and consumed via `IOperationMetadata.imports`. Call sites that previously
9
- * walked a `ts.SourceFile` to derive imports should read the metadata
10
- * delivered through `Reflect.getMetadata("nestia/OperationMetadata", …)`
11
- * instead. See `packages/core/MIGRATION.md`.
12
- */
13
- export const analyze = (): never => {
14
- throw new Error(
15
- "ImportAnalyzer.analyze was removed in @nestia/sdk@next. " +
16
- "Imports are now attached by the native transformer; read them from " +
17
- "IOperationMetadata.imports (see packages/core/MIGRATION.md).",
18
- );
19
- };
20
-
21
- export const merge = (imports: IReflectImport[]): IReflectImport[] => {
22
- // group by files
23
- const fileGroups: Map<string, IReflectImport[]> = new Map();
24
- for (const imp of imports) {
25
- const array: IReflectImport[] = MapUtil.take(
26
- fileGroups,
27
- imp.file,
28
- () => [],
29
- );
30
- array.push(imp);
31
- }
32
- return Array.from(fileGroups.entries())
33
- .map(([key, value]) => mergeGroup(key, value))
34
- .flat();
35
- };
36
-
37
- function mergeGroup(
38
- file: string,
39
- imports: IReflectImport[],
40
- ): IReflectImport[] {
41
- const allStarImports: IReflectImport[] = Array.from(
42
- new Set(
43
- imports
44
- .filter((imp) => imp.asterisk !== null)
45
- .map((imp) => imp.asterisk!),
46
- ),
47
- )
48
- .sort()
49
- .map(
50
- (allStarImport) =>
51
- ({
52
- file,
53
- elements: [],
54
- default: null,
55
- asterisk: allStarImport,
56
- }) satisfies IReflectImport,
57
- );
58
- const defaultImports: IReflectImport[] = Array.from(
59
- new Set(
60
- imports
61
- .filter((imp) => imp.default !== null)
62
- .map((imp) => imp.default!),
63
- ),
64
- )
65
- .sort()
66
- .map(
67
- (defaultImport) =>
68
- ({
69
- file,
70
- elements: [],
71
- default: defaultImport,
72
- asterisk: null,
73
- }) satisfies IReflectImport,
74
- );
75
- const instances: Set<string> = new Set(
76
- imports.map((imp) => imp.elements).flat(),
77
- );
78
- if (instances.size !== 0) {
79
- if (defaultImports.length !== 0)
80
- defaultImports[0]!.elements = Array.from(instances).sort();
81
- else
82
- defaultImports.push({
83
- file,
84
- elements: Array.from(instances).sort(),
85
- default: null,
86
- asterisk: null,
87
- });
88
- }
89
- return [...allStarImports, ...defaultImports];
90
- }
91
-
92
- }
1
+ import { IReflectImport } from "../structures/IReflectImport";
2
+ import { MapUtil } from "../utils/MapUtil";
3
+
4
+ export namespace ImportAnalyzer {
5
+ /**
6
+ * @deprecated Removed in the Go-migration cycle. Import metadata is now
7
+ * attached by the native transformer in `packages/core/native/cmd/ttsc-nestia`
8
+ * and consumed via `IOperationMetadata.imports`. Call sites that previously
9
+ * walked a `ts.SourceFile` to derive imports should read the metadata
10
+ * delivered through `Reflect.getMetadata("nestia/OperationMetadata", …)`
11
+ * instead. See `packages/core/MIGRATION.md`.
12
+ */
13
+ export const analyze = (): never => {
14
+ throw new Error(
15
+ "ImportAnalyzer.analyze was removed in @nestia/sdk@next. " +
16
+ "Imports are now attached by the native transformer; read them from " +
17
+ "IOperationMetadata.imports (see packages/core/MIGRATION.md).",
18
+ );
19
+ };
20
+
21
+ export const merge = (imports: IReflectImport[]): IReflectImport[] => {
22
+ // group by files
23
+ const fileGroups: Map<string, IReflectImport[]> = new Map();
24
+ for (const imp of imports) {
25
+ const array: IReflectImport[] = MapUtil.take(
26
+ fileGroups,
27
+ imp.file,
28
+ () => [],
29
+ );
30
+ array.push(imp);
31
+ }
32
+ return Array.from(fileGroups.entries())
33
+ .map(([key, value]) => mergeGroup(key, value))
34
+ .flat();
35
+ };
36
+
37
+ function mergeGroup(
38
+ file: string,
39
+ imports: IReflectImport[],
40
+ ): IReflectImport[] {
41
+ const allStarImports: IReflectImport[] = Array.from(
42
+ new Set(
43
+ imports
44
+ .filter((imp) => imp.asterisk !== null)
45
+ .map((imp) => imp.asterisk!),
46
+ ),
47
+ )
48
+ .sort()
49
+ .map(
50
+ (allStarImport) =>
51
+ ({
52
+ file,
53
+ elements: [],
54
+ default: null,
55
+ asterisk: allStarImport,
56
+ }) satisfies IReflectImport,
57
+ );
58
+ const defaultImports: IReflectImport[] = Array.from(
59
+ new Set(
60
+ imports
61
+ .filter((imp) => imp.default !== null)
62
+ .map((imp) => imp.default!),
63
+ ),
64
+ )
65
+ .sort()
66
+ .map(
67
+ (defaultImport) =>
68
+ ({
69
+ file,
70
+ elements: [],
71
+ default: defaultImport,
72
+ asterisk: null,
73
+ }) satisfies IReflectImport,
74
+ );
75
+ const instances: Set<string> = new Set(
76
+ imports.map((imp) => imp.elements).flat(),
77
+ );
78
+ if (instances.size !== 0) {
79
+ if (defaultImports.length !== 0)
80
+ defaultImports[0]!.elements = Array.from(instances).sort();
81
+ else
82
+ defaultImports.push({
83
+ file,
84
+ elements: Array.from(instances).sort(),
85
+ default: null,
86
+ asterisk: null,
87
+ });
88
+ }
89
+ return [...allStarImports, ...defaultImports];
90
+ }
91
+
92
+ }
@@ -1,69 +1,130 @@
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 { RequestMethod } from "@nestjs/common";
2
+ import path from "path";
3
+ import { Token, parse } from "path-to-regexp";
4
+
5
+ export namespace PathAnalyzer {
6
+ export const join = (...args: string[]) =>
7
+ "/" +
8
+ _Trim(
9
+ path
10
+ .join(...args.filter((s) => !!s.length))
11
+ .split("\\")
12
+ .join("/"),
13
+ );
14
+
15
+ export const joinWithGlobalPrefix = (props: {
16
+ globalPrefix: string;
17
+ exclude: IGlobalPrefixExclude[] | undefined;
18
+ excludePath?: string;
19
+ method: string;
20
+ path: string;
21
+ }): string =>
22
+ join(
23
+ isGlobalPrefixExcluded(
24
+ props.exclude,
25
+ props.excludePath ?? props.path,
26
+ props.method,
27
+ )
28
+ ? ""
29
+ : props.globalPrefix,
30
+ props.path,
31
+ );
32
+
33
+ export const escape = (str: string): string | null => {
34
+ const args = _Parse(str);
35
+ if (args === null) return null;
36
+ return (
37
+ "/" +
38
+ args
39
+ .map((arg) => (arg.type === "param" ? `:${arg.value}` : arg.value))
40
+ .join("/")
41
+ );
42
+ };
43
+
44
+ export const parameters = (str: string): string[] | null => {
45
+ const args = _Parse(str);
46
+ if (args === null) return null;
47
+ return args.filter((arg) => arg.type === "param").map((arg) => arg.value);
48
+ };
49
+
50
+ function _Parse(str: string): IArgument[] | null {
51
+ const tokens: Token[] | null = (() => {
52
+ try {
53
+ return parse(path.join(str).split("\\").join("/"));
54
+ } catch {
55
+ return null;
56
+ }
57
+ })();
58
+ if (tokens === null) return null;
59
+
60
+ const output: IArgument[] = [];
61
+ for (const key of tokens) {
62
+ if (typeof key === "string")
63
+ output.push({
64
+ type: "path",
65
+ value: _Trim(key),
66
+ });
67
+ else if (typeof key.name === "number" || _Trim(key.name) === "")
68
+ return null;
69
+ else
70
+ output.push({
71
+ type: "param",
72
+ value: _Trim(key.name),
73
+ });
74
+ }
75
+ return output;
76
+ }
77
+
78
+ function _Trim(str: string): string {
79
+ if (str[0] === "/") str = str.substring(1);
80
+ if (str[str.length - 1] === "/") str = str.substring(0, str.length - 1);
81
+ return str;
82
+ }
83
+
84
+ function isGlobalPrefixExcluded(
85
+ exclude: IGlobalPrefixExclude[] | undefined,
86
+ path: string,
87
+ method: string,
88
+ ): boolean {
89
+ if (exclude === undefined) return false;
90
+ const requestMethod: RequestMethod | undefined = REQUEST_METHODS[method];
91
+ if (requestMethod === undefined) return false;
92
+
93
+ const location: string = join(path);
94
+ return exclude.some((route) => {
95
+ const routeMethod: RequestMethod | undefined =
96
+ route.requestMethod ?? route.method;
97
+ if (
98
+ routeMethod !== undefined &&
99
+ routeMethod !== RequestMethod.ALL &&
100
+ routeMethod !== requestMethod
101
+ )
102
+ return false;
103
+ if (route.pathRegex instanceof RegExp)
104
+ return route.pathRegex.test(join(location));
105
+ return join(route.path) === location;
106
+ });
107
+ }
108
+
109
+ interface IArgument {
110
+ type: "param" | "path";
111
+ value: string;
112
+ }
113
+
114
+ interface IGlobalPrefixExclude {
115
+ path: string;
116
+ method?: RequestMethod;
117
+ requestMethod?: RequestMethod;
118
+ pathRegex?: RegExp;
119
+ }
120
+ }
121
+
122
+ const REQUEST_METHODS: Record<string, RequestMethod> = {
123
+ DELETE: RequestMethod.DELETE,
124
+ GET: RequestMethod.GET,
125
+ HEAD: RequestMethod.HEAD,
126
+ OPTIONS: RequestMethod.OPTIONS,
127
+ PATCH: RequestMethod.PATCH,
128
+ POST: RequestMethod.POST,
129
+ PUT: RequestMethod.PUT,
130
+ };
@@ -1,105 +1,112 @@
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 "../structures/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 { IReflectMcpOperation } from "../structures/IReflectMcpOperation";
12
+ import { IReflectWebSocketOperation } from "../structures/IReflectWebSocketOperation";
13
+ import { IOperationMetadata } from "../structures/IOperationMetadata";
14
+ import { ArrayUtil } from "../utils/ArrayUtil";
15
+ import { ReflectHttpOperationAnalyzer } from "./ReflectHttpOperationAnalyzer";
16
+ import { ReflectMcpOperationAnalyzer } from "./ReflectMcpOperationAnalyzer";
17
+ import { ReflectMetadataAnalyzer } from "./ReflectMetadataAnalyzer";
18
+ import { ReflectWebSocketOperationAnalyzer } from "./ReflectWebSocketOperationAnalyzer";
19
+
20
+ export namespace ReflectControllerAnalyzer {
21
+ export interface IProps {
22
+ project: Omit<INestiaProject, "config">;
23
+ controller: INestiaSdkInput.IController;
24
+ unique: WeakSet<Function>;
25
+ }
26
+ /* ---------------------------------------------------------
27
+ CONTROLLER
28
+ --------------------------------------------------------- */
29
+ export const analyze = (props: IProps): IReflectController | null => {
30
+ // MUST BE TYPE OF A CREATOR WHO HAS THE CONSTRUCTOR
31
+ if (
32
+ ArrayUtil.has(
33
+ Reflect.getMetadataKeys(props.controller.class),
34
+ PATH_METADATA,
35
+ HOST_METADATA,
36
+ SCOPE_OPTIONS_METADATA,
37
+ ) === false
38
+ )
39
+ return null;
40
+
41
+ // BASIC INFO
42
+ const controller: IReflectController = {
43
+ class: props.controller.class,
44
+ file: props.controller.location,
45
+ operations: [],
46
+ prefixes: props.controller.prefixes,
47
+ paths: ReflectMetadataAnalyzer.paths(props.controller.class).filter(
48
+ (str) => {
49
+ if (str.includes("*") === true) {
50
+ props.project.warnings.push({
51
+ file: props.controller.location,
52
+ class: props.controller.class.name,
53
+ function: null,
54
+ from: null,
55
+ contents: ["@nestia/sdk does not compose wildcard controller."],
56
+ });
57
+ return false;
58
+ }
59
+ return true;
60
+ },
61
+ ),
62
+ versions: ReflectMetadataAnalyzer.versions(props.controller.class),
63
+ security: ReflectMetadataAnalyzer.securities(props.controller.class),
64
+ tags:
65
+ Reflect.getMetadata("swagger/apiUseTags", props.controller.class) ?? [],
66
+ };
67
+
68
+ // OPERATORS
69
+ for (const [key, value] of _Get_prototype_entries(props.controller.class)) {
70
+ if (typeof value !== "function") continue;
71
+ const metadata: IOperationMetadata | undefined = Reflect.getMetadata(
72
+ "nestia/OperationMetadata",
73
+ props.controller.class.prototype,
74
+ key,
75
+ );
76
+ if (metadata === undefined) continue;
77
+ else if (metadata.jsDocTags.some((tag) => tag.name === "ignore"))
78
+ continue;
79
+ const next: ReflectHttpOperationAnalyzer.IProps = {
80
+ project: props.project,
81
+ controller: controller,
82
+ name: key,
83
+ function: value,
84
+ metadata,
85
+ };
86
+ const child:
87
+ | IReflectHttpOperation
88
+ | IReflectWebSocketOperation
89
+ | IReflectMcpOperation
90
+ | null =
91
+ ReflectMcpOperationAnalyzer.analyze(next) ??
92
+ ReflectWebSocketOperationAnalyzer.analyze(next) ??
93
+ ReflectHttpOperationAnalyzer.analyze(next);
94
+ if (child !== null) controller.operations.push(child);
95
+ }
96
+ return controller;
97
+ };
98
+
99
+ function _Get_prototype_entries(creator: any): Array<[string, unknown]> {
100
+ const keyList = Object.getOwnPropertyNames(creator.prototype);
101
+ const entries: Array<[string, unknown]> = keyList.map((key) => [
102
+ key,
103
+ creator.prototype[key],
104
+ ]);
105
+
106
+ const parent = Object.getPrototypeOf(creator);
107
+ if (parent.prototype !== undefined)
108
+ entries.push(..._Get_prototype_entries(parent));
109
+
110
+ return entries;
111
+ }
112
+ }