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

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 (259) 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/factories/ExpressionFactory.d.ts +9 -0
  48. package/lib/factories/ExpressionFactory.js +16 -0
  49. package/lib/factories/ExpressionFactory.js.map +1 -0
  50. package/lib/factories/IdentifierFactory.d.ts +22 -0
  51. package/lib/factories/IdentifierFactory.js +50 -0
  52. package/lib/factories/IdentifierFactory.js.map +1 -0
  53. package/lib/factories/LiteralFactory.d.ts +9 -0
  54. package/lib/factories/LiteralFactory.js +48 -0
  55. package/lib/factories/LiteralFactory.js.map +1 -0
  56. package/lib/factories/StatementFactory.d.ts +14 -0
  57. package/lib/factories/StatementFactory.js +20 -0
  58. package/lib/factories/StatementFactory.js.map +1 -0
  59. package/lib/factories/TypeFactory.d.ts +24 -0
  60. package/lib/factories/TypeFactory.js +27 -0
  61. package/lib/factories/TypeFactory.js.map +1 -0
  62. package/lib/generates/CloneGenerator.js +6 -4
  63. package/lib/generates/CloneGenerator.js.map +1 -1
  64. package/lib/generates/SdkGenerator.js +50 -1
  65. package/lib/generates/SdkGenerator.js.map +1 -1
  66. package/lib/generates/SwaggerGenerator.js +18 -2
  67. package/lib/generates/SwaggerGenerator.js.map +1 -1
  68. package/lib/generates/internal/E2eFileProgrammer.js +32 -29
  69. package/lib/generates/internal/E2eFileProgrammer.js.map +1 -1
  70. package/lib/generates/internal/FilePrinter.d.ts +2 -2
  71. package/lib/generates/internal/FilePrinter.js +14 -25
  72. package/lib/generates/internal/FilePrinter.js.map +1 -1
  73. package/lib/generates/internal/ImportDictionary.d.ts +2 -1
  74. package/lib/generates/internal/ImportDictionary.js +16 -10
  75. package/lib/generates/internal/ImportDictionary.js.map +1 -1
  76. package/lib/generates/internal/SdkAliasCollection.d.ts +12 -10
  77. package/lib/generates/internal/SdkAliasCollection.js +29 -22
  78. package/lib/generates/internal/SdkAliasCollection.js.map +1 -1
  79. package/lib/generates/internal/SdkDistributionComposer.d.ts +1 -0
  80. package/lib/generates/internal/SdkDistributionComposer.js +3 -0
  81. package/lib/generates/internal/SdkDistributionComposer.js.map +1 -1
  82. package/lib/generates/internal/SdkFileProgrammer.js +6 -3
  83. package/lib/generates/internal/SdkFileProgrammer.js.map +1 -1
  84. package/lib/generates/internal/SdkHttpCloneProgrammer.d.ts +1 -1
  85. package/lib/generates/internal/SdkHttpCloneProgrammer.js +3 -3
  86. package/lib/generates/internal/SdkHttpCloneProgrammer.js.map +1 -1
  87. package/lib/generates/internal/SdkHttpCloneReferencer.d.ts +1 -1
  88. package/lib/generates/internal/SdkHttpCloneReferencer.js +42 -9
  89. package/lib/generates/internal/SdkHttpCloneReferencer.js.map +1 -1
  90. package/lib/generates/internal/SdkHttpFunctionProgrammer.d.ts +1 -1
  91. package/lib/generates/internal/SdkHttpFunctionProgrammer.js +47 -51
  92. package/lib/generates/internal/SdkHttpFunctionProgrammer.js.map +1 -1
  93. package/lib/generates/internal/SdkHttpNamespaceProgrammer.d.ts +1 -1
  94. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js +63 -61
  95. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js.map +1 -1
  96. package/lib/generates/internal/SdkHttpParameterProgrammer.d.ts +2 -2
  97. package/lib/generates/internal/SdkHttpParameterProgrammer.js +11 -13
  98. package/lib/generates/internal/SdkHttpParameterProgrammer.js.map +1 -1
  99. package/lib/generates/internal/SdkHttpRouteProgrammer.d.ts +1 -1
  100. package/lib/generates/internal/SdkHttpSimulationProgrammer.d.ts +1 -1
  101. package/lib/generates/internal/SdkHttpSimulationProgrammer.js +52 -47
  102. package/lib/generates/internal/SdkHttpSimulationProgrammer.js.map +1 -1
  103. package/lib/generates/internal/SdkMcpRouteProgrammer.d.ts +15 -0
  104. package/lib/generates/internal/SdkMcpRouteProgrammer.js +149 -0
  105. package/lib/generates/internal/SdkMcpRouteProgrammer.js.map +1 -0
  106. package/lib/generates/internal/SdkRouteDirectory.d.ts +2 -1
  107. package/lib/generates/internal/SdkRouteDirectory.js.map +1 -1
  108. package/lib/generates/internal/SdkTypeProgrammer.d.ts +3 -3
  109. package/lib/generates/internal/SdkTypeProgrammer.js +42 -43
  110. package/lib/generates/internal/SdkTypeProgrammer.js.map +1 -1
  111. package/lib/generates/internal/SdkTypeTagProgrammer.d.ts +2 -1
  112. package/lib/generates/internal/SdkTypeTagProgrammer.js +7 -9
  113. package/lib/generates/internal/SdkTypeTagProgrammer.js.map +1 -1
  114. package/lib/generates/internal/SdkWebSocketCloneProgrammer.d.ts +6 -0
  115. package/lib/generates/internal/SdkWebSocketCloneProgrammer.js +283 -0
  116. package/lib/generates/internal/SdkWebSocketCloneProgrammer.js.map +1 -0
  117. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.d.ts +2 -2
  118. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js +45 -47
  119. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js.map +1 -1
  120. package/lib/generates/internal/SdkWebSocketParameterProgrammer.d.ts +3 -3
  121. package/lib/generates/internal/SdkWebSocketParameterProgrammer.js +9 -9
  122. package/lib/generates/internal/SdkWebSocketParameterProgrammer.js.map +1 -1
  123. package/lib/generates/internal/SdkWebSocketRouteProgrammer.d.ts +2 -2
  124. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js +37 -41
  125. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js.map +1 -1
  126. package/lib/generates/internal/SwaggerOperationParameterComposer.js +10 -2
  127. package/lib/generates/internal/SwaggerOperationParameterComposer.js.map +1 -1
  128. package/lib/generates/internal/SwaggerOperationResponseComposer.d.ts +1 -1
  129. package/lib/generates/internal/SwaggerOperationResponseComposer.js +6 -1
  130. package/lib/generates/internal/SwaggerOperationResponseComposer.js.map +1 -1
  131. package/lib/generates/internal/SwaggerReadonlyArrayEmender.d.ts +9 -0
  132. package/lib/generates/internal/SwaggerReadonlyArrayEmender.js +174 -0
  133. package/lib/generates/internal/SwaggerReadonlyArrayEmender.js.map +1 -0
  134. package/lib/structures/INestiaSdkInput.d.ts +9 -2
  135. package/lib/structures/IReflectController.d.ts +2 -1
  136. package/lib/structures/IReflectHttpOperationSuccess.d.ts +4 -2
  137. package/lib/structures/IReflectMcpOperation.d.ts +35 -0
  138. package/lib/structures/IReflectMcpOperation.js +3 -0
  139. package/lib/structures/IReflectMcpOperation.js.map +1 -0
  140. package/lib/structures/IReflectMcpOperationParameter.d.ts +19 -0
  141. package/lib/structures/IReflectMcpOperationParameter.js +3 -0
  142. package/lib/structures/IReflectMcpOperationParameter.js.map +1 -0
  143. package/lib/structures/ITypedApplication.d.ts +2 -1
  144. package/lib/structures/ITypedHttpRouteSuccess.d.ts +3 -1
  145. package/lib/structures/ITypedMcpRoute.d.ts +31 -0
  146. package/lib/structures/ITypedMcpRoute.js +3 -0
  147. package/lib/structures/ITypedMcpRoute.js.map +1 -0
  148. package/lib/transform.d.ts +5 -9
  149. package/lib/transform.js +8 -31
  150. package/lib/transform.js.map +1 -1
  151. package/lib/utils/HttpResponseContentTypeUtil.d.ts +5 -0
  152. package/lib/utils/HttpResponseContentTypeUtil.js +22 -0
  153. package/lib/utils/HttpResponseContentTypeUtil.js.map +1 -0
  154. package/native/go.mod +52 -52
  155. package/native/go.sum +84 -54
  156. package/native/sdk/register.go +322 -165
  157. package/native/sdk/sdk.go +17 -17
  158. package/native/sdk/sdk_metadata_json.go +327 -327
  159. package/native/sdk/sdk_transform.go +1879 -1549
  160. package/package.json +13 -11
  161. package/src/INestiaConfig.ts +267 -267
  162. package/src/NestiaSdkApplication.ts +39 -8
  163. package/src/NestiaSwaggerComposer.ts +153 -142
  164. package/src/analyses/AccessorAnalyzer.ts +64 -67
  165. package/src/analyses/ConfigAnalyzer.ts +330 -330
  166. package/src/analyses/ImportAnalyzer.ts +92 -92
  167. package/src/analyses/PathAnalyzer.ts +130 -69
  168. package/src/analyses/ReflectControllerAnalyzer.ts +112 -105
  169. package/src/analyses/ReflectHttpOperationAnalyzer.ts +183 -183
  170. package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +90 -90
  171. package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +350 -350
  172. package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +163 -130
  173. package/src/analyses/ReflectMcpOperationAnalyzer.ts +124 -0
  174. package/src/analyses/ReflectMetadataAnalyzer.ts +44 -44
  175. package/src/analyses/SecurityAnalyzer.ts +25 -25
  176. package/src/analyses/TypedMcpRouteAnalyzer.ts +34 -0
  177. package/src/decorators/OperationMetadata.ts +29 -29
  178. package/src/executable/internal/CommandParser.ts +15 -15
  179. package/src/executable/internal/NestiaConfigLoader.ts +451 -446
  180. package/src/executable/internal/NestiaSdkCommand.ts +124 -106
  181. package/src/executable/internal/NestiaSdkWatcher.ts +342 -0
  182. package/src/executable/sdk.ts +90 -88
  183. package/src/factories/ExpressionFactory.ts +23 -0
  184. package/src/factories/IdentifierFactory.ts +84 -0
  185. package/src/factories/LiteralFactory.ts +54 -0
  186. package/src/factories/StatementFactory.ts +56 -0
  187. package/src/factories/TypeFactory.ts +27 -0
  188. package/src/generates/CloneGenerator.ts +74 -66
  189. package/src/generates/E2eGenerator.ts +32 -32
  190. package/src/generates/SdkGenerator.ts +176 -118
  191. package/src/generates/SwaggerGenerator.ts +342 -310
  192. package/src/generates/internal/E2eFileProgrammer.ts +246 -233
  193. package/src/generates/internal/FilePrinter.ts +57 -65
  194. package/src/generates/internal/ImportDictionary.ts +207 -204
  195. package/src/generates/internal/SdkAliasCollection.ts +280 -261
  196. package/src/generates/internal/SdkDistributionComposer.ts +123 -116
  197. package/src/generates/internal/SdkFileProgrammer.ts +113 -112
  198. package/src/generates/internal/SdkHttpCloneProgrammer.ts +124 -126
  199. package/src/generates/internal/SdkHttpCloneReferencer.ts +131 -77
  200. package/src/generates/internal/SdkHttpFunctionProgrammer.ts +290 -301
  201. package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +507 -510
  202. package/src/generates/internal/SdkHttpParameterProgrammer.ts +163 -165
  203. package/src/generates/internal/SdkHttpRouteProgrammer.ts +109 -109
  204. package/src/generates/internal/SdkHttpSimulationProgrammer.ts +322 -314
  205. package/src/generates/internal/SdkImportWizard.ts +62 -62
  206. package/src/generates/internal/SdkMcpRouteProgrammer.ts +447 -0
  207. package/src/generates/internal/SdkRouteDirectory.ts +21 -18
  208. package/src/generates/internal/SdkTypeProgrammer.ts +389 -382
  209. package/src/generates/internal/SdkTypeTagProgrammer.ts +110 -114
  210. package/src/generates/internal/SdkWebSocketCloneProgrammer.ts +319 -0
  211. package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +383 -389
  212. package/src/generates/internal/SdkWebSocketParameterProgrammer.ts +91 -89
  213. package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +304 -323
  214. package/src/generates/internal/SwaggerDescriptionComposer.ts +64 -64
  215. package/src/generates/internal/SwaggerOperationComposer.ts +119 -119
  216. package/src/generates/internal/SwaggerOperationParameterComposer.ts +175 -162
  217. package/src/generates/internal/SwaggerOperationResponseComposer.ts +115 -110
  218. package/src/generates/internal/SwaggerReadonlyArrayEmender.ts +262 -0
  219. package/src/index.ts +4 -4
  220. package/src/internal/legacy.ts +492 -492
  221. package/src/module.ts +4 -4
  222. package/src/structures/INestiaProject.ts +10 -10
  223. package/src/structures/INestiaSdkInput.ts +27 -20
  224. package/src/structures/IOperationMetadata.ts +41 -41
  225. package/src/structures/IReflectController.ts +18 -15
  226. package/src/structures/IReflectHttpOperation.ts +26 -26
  227. package/src/structures/IReflectHttpOperationException.ts +18 -18
  228. package/src/structures/IReflectHttpOperationParameter.ts +79 -79
  229. package/src/structures/IReflectHttpOperationSuccess.ts +18 -21
  230. package/src/structures/IReflectImport.ts +6 -6
  231. package/src/structures/IReflectMcpOperation.ts +38 -0
  232. package/src/structures/IReflectMcpOperationParameter.ts +27 -0
  233. package/src/structures/IReflectOperationError.ts +26 -26
  234. package/src/structures/IReflectType.ts +4 -4
  235. package/src/structures/IReflectWebSocketOperation.ts +17 -17
  236. package/src/structures/ITypedApplication.ts +12 -11
  237. package/src/structures/ITypedHttpRoute.ts +41 -41
  238. package/src/structures/ITypedHttpRouteException.ts +15 -15
  239. package/src/structures/ITypedHttpRouteParameter.ts +41 -41
  240. package/src/structures/ITypedHttpRouteSuccess.ts +18 -22
  241. package/src/structures/ITypedMcpRoute.ts +33 -0
  242. package/src/structures/ITypedWebSocketRoute.ts +24 -24
  243. package/src/structures/ITypedWebSocketRouteParameter.ts +3 -3
  244. package/src/transform.ts +28 -59
  245. package/src/typings/get-function-location.d.ts +7 -7
  246. package/src/utils/ArrayUtil.ts +26 -26
  247. package/src/utils/EmittedJavaScriptPatcher.ts +88 -88
  248. package/src/utils/FileRetriever.ts +22 -22
  249. package/src/utils/HttpResponseContentTypeUtil.ts +30 -0
  250. package/src/utils/MapUtil.ts +14 -14
  251. package/src/utils/PathUtil.ts +10 -10
  252. package/src/utils/SourceFinder.ts +63 -63
  253. package/src/utils/StringUtil.ts +17 -17
  254. package/src/utils/TsConfigReader.ts +108 -108
  255. package/src/utils/TtscExecutor.ts +68 -68
  256. package/src/utils/VersioningStrategy.ts +28 -28
  257. package/src/validators/HttpHeadersValidator.ts +11 -11
  258. package/src/validators/HttpQueryValidator.ts +11 -11
  259. 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
+ }