@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,138 +1,140 @@
1
- import { INestApplication } from "@nestjs/common";
2
- import { OpenApi, OpenApiV3, SwaggerV2 } from "@samchon/openapi";
3
- import path from "path";
4
- import { TreeMap } from "tstl";
5
- import { IMetadataDictionary } from "typia/lib/schemas/metadata/IMetadataDictionary";
6
-
7
- import { INestiaConfig } from "./INestiaConfig";
8
- import { AccessorAnalyzer } from "./analyses/AccessorAnalyzer";
9
- import { ConfigAnalyzer } from "./analyses/ConfigAnalyzer";
10
- import { PathAnalyzer } from "./analyses/PathAnalyzer";
11
- import { ReflectControllerAnalyzer } from "./analyses/ReflectControllerAnalyzer";
12
- import { TypedHttpRouteAnalyzer } from "./analyses/TypedHttpRouteAnalyzer";
13
- import { SwaggerGenerator } from "./generates/SwaggerGenerator";
14
- import { INestiaProject } from "./structures/INestiaProject";
15
- import { INestiaSdkInput } from "./structures/INestiaSdkInput";
16
- import { IReflectController } from "./structures/IReflectController";
17
- import { IReflectOperationError } from "./structures/IReflectOperationError";
18
- import { ITypedHttpRoute } from "./structures/ITypedHttpRoute";
19
- import { IOperationMetadata } from "./transformers/IOperationMetadata";
20
- import { VersioningStrategy } from "./utils/VersioningStrategy";
21
-
22
- export namespace NestiaSwaggerComposer {
23
- export const document = async (
24
- app: INestApplication,
25
- config: Omit<INestiaConfig.ISwaggerConfig, "output">,
26
- ): Promise<OpenApi.IDocument | OpenApiV3.IDocument | SwaggerV2.IDocument> => {
27
- const input: INestiaSdkInput = await ConfigAnalyzer.application(app);
28
- const document: OpenApi.IDocument = await SwaggerGenerator.compose({
29
- config,
30
- routes: analyze(input),
31
- document: await SwaggerGenerator.initialize(config),
32
- });
33
- return config.openapi === "2.0"
34
- ? OpenApi.downgrade(document, "2.0")
35
- : config.openapi === "3.0"
36
- ? OpenApi.downgrade(document, "3.0")
37
- : document;
38
- };
39
-
40
- const analyze = (input: INestiaSdkInput): ITypedHttpRoute[] => {
41
- // GET REFLECT CONTROLLERS
42
- const unique: WeakSet<any> = new WeakSet();
43
- const project: Omit<INestiaProject, "config"> = {
44
- input,
45
- checker: null!,
46
- errors: [],
47
- warnings: [],
48
- };
49
- const controllers: IReflectController[] = project.input.controllers
50
- .map((c) =>
51
- ReflectControllerAnalyzer.analyze({ project, controller: c, unique }),
52
- )
53
- .filter((c): c is IReflectController => c !== null);
54
- if (project.errors.length)
55
- throw report({ type: "error", errors: project.errors });
56
-
57
- // METADATA COMPONENTS
58
- const collection: IMetadataDictionary =
59
- TypedHttpRouteAnalyzer.dictionary(controllers);
60
-
61
- // CONVERT TO TYPED OPERATIONS
62
- const globalPrefix: string = project.input.globalPrefix?.prefix ?? "";
63
- const routes: ITypedHttpRoute[] = [];
64
- for (const c of controllers)
65
- for (const o of c.operations) {
66
- const pathList: Set<string> = new Set();
67
- const versions: string[] = VersioningStrategy.merge(project)([
68
- ...(c.versions ?? []),
69
- ...(o.versions ?? []),
70
- ]);
71
- for (const v of versions)
72
- for (const prefix of wrapPaths(c.prefixes))
73
- for (const cPath of wrapPaths(c.paths))
74
- for (const filePath of wrapPaths(o.paths))
75
- pathList.add(
76
- PathAnalyzer.join(globalPrefix, v, prefix, cPath, filePath),
77
- );
78
- if (o.protocol === "http")
79
- routes.push(
80
- ...TypedHttpRouteAnalyzer.analyze({
81
- controller: c,
82
- errors: project.errors,
83
- dictionary: collection,
84
- operation: o,
85
- paths: Array.from(pathList),
86
- }),
87
- );
88
- }
89
- AccessorAnalyzer.analyze(routes);
90
- return routes;
91
- };
92
- }
93
-
94
- const report = (props: {
95
- type: "error" | "warning";
96
- errors: IReflectOperationError[];
97
- }): void => {
98
- const map: TreeMap<
99
- IReflectOperationError.Key,
100
- Array<string | IOperationMetadata.IError>
101
- > = new TreeMap();
102
- for (const e of props.errors)
103
- map.take(new IReflectOperationError.Key(e), () => []).push(...e.contents);
104
-
105
- const messages: string[] = [];
106
- for (const {
107
- first: { error },
108
- second: contents,
109
- } of map) {
110
- if (error.contents.length === 0) continue;
111
- const location: string = path.relative(process.cwd(), error.file);
112
- messages.push(
113
- [
114
- `${location} - `,
115
- error.class,
116
- ...(error.function !== null ? [`.${error.function}()`] : [""]),
117
- ...(error.from !== null ? [` from ${error.from}`] : [""]),
118
- ":\n",
119
- contents
120
- .map((c) => {
121
- if (typeof c === "string") return ` - ${c}`;
122
- else
123
- return [
124
- c.accessor
125
- ? ` - ${c.name}: `
126
- : ` - ${c.name} (${c.accessor}): `,
127
- ...c.messages.map((msg) => ` - ${msg}`),
128
- ].join("\n");
129
- })
130
- .join("\n"),
131
- ].join(""),
132
- );
133
- }
134
- throw new Error(`Error on NestiaSwaggerComposer.compose():\n${messages}`);
135
- };
136
-
137
- const wrapPaths = (paths: string[]): string[] =>
138
- paths.length === 0 ? [""] : paths;
1
+ import { INestApplication } from "@nestjs/common";
2
+ import { IMetadataDictionary } from "@typia/core";
3
+ import { OpenApiV3, SwaggerV2 } from "@typia/interface";
4
+ import { OpenApiConverter } from "@typia/utils";
5
+ import path from "path";
6
+ import { TreeMap } from "tstl";
7
+ import { OpenApi } from "typia";
8
+
9
+ import { INestiaConfig } from "./INestiaConfig";
10
+ import { AccessorAnalyzer } from "./analyses/AccessorAnalyzer";
11
+ import { ConfigAnalyzer } from "./analyses/ConfigAnalyzer";
12
+ import { PathAnalyzer } from "./analyses/PathAnalyzer";
13
+ import { ReflectControllerAnalyzer } from "./analyses/ReflectControllerAnalyzer";
14
+ import { TypedHttpRouteAnalyzer } from "./analyses/TypedHttpRouteAnalyzer";
15
+ import { SwaggerGenerator } from "./generates/SwaggerGenerator";
16
+ import { INestiaProject } from "./structures/INestiaProject";
17
+ import { INestiaSdkInput } from "./structures/INestiaSdkInput";
18
+ import { IReflectController } from "./structures/IReflectController";
19
+ import { IReflectOperationError } from "./structures/IReflectOperationError";
20
+ import { ITypedHttpRoute } from "./structures/ITypedHttpRoute";
21
+ import { IOperationMetadata } from "./transformers/IOperationMetadata";
22
+ import { VersioningStrategy } from "./utils/VersioningStrategy";
23
+
24
+ export namespace NestiaSwaggerComposer {
25
+ export const document = async (
26
+ app: INestApplication,
27
+ config: Omit<INestiaConfig.ISwaggerConfig, "output">,
28
+ ): Promise<OpenApi.IDocument | OpenApiV3.IDocument | SwaggerV2.IDocument> => {
29
+ const input: INestiaSdkInput = await ConfigAnalyzer.application(app);
30
+ const document: OpenApi.IDocument = await SwaggerGenerator.compose({
31
+ config,
32
+ routes: analyze(input),
33
+ document: await SwaggerGenerator.initialize(config),
34
+ });
35
+ return config.openapi === "2.0"
36
+ ? OpenApiConverter.downgradeDocument(document, "2.0")
37
+ : config.openapi === "3.0"
38
+ ? OpenApiConverter.downgradeDocument(document, "3.0")
39
+ : document;
40
+ };
41
+
42
+ const analyze = (input: INestiaSdkInput): ITypedHttpRoute[] => {
43
+ // GET REFLECT CONTROLLERS
44
+ const unique: WeakSet<any> = new WeakSet();
45
+ const project: Omit<INestiaProject, "config"> = {
46
+ input,
47
+ checker: null!,
48
+ errors: [],
49
+ warnings: [],
50
+ };
51
+ const controllers: IReflectController[] = project.input.controllers
52
+ .map((c) =>
53
+ ReflectControllerAnalyzer.analyze({ project, controller: c, unique }),
54
+ )
55
+ .filter((c): c is IReflectController => c !== null);
56
+ if (project.errors.length)
57
+ throw report({ type: "error", errors: project.errors });
58
+
59
+ // METADATA COMPONENTS
60
+ const collection: IMetadataDictionary =
61
+ TypedHttpRouteAnalyzer.dictionary(controllers);
62
+
63
+ // CONVERT TO TYPED OPERATIONS
64
+ const globalPrefix: string = project.input.globalPrefix?.prefix ?? "";
65
+ const routes: ITypedHttpRoute[] = [];
66
+ for (const c of controllers)
67
+ for (const o of c.operations) {
68
+ const pathList: Set<string> = new Set();
69
+ const versions: string[] = VersioningStrategy.merge(project)([
70
+ ...(c.versions ?? []),
71
+ ...(o.versions ?? []),
72
+ ]);
73
+ for (const v of versions)
74
+ for (const prefix of wrapPaths(c.prefixes))
75
+ for (const cPath of wrapPaths(c.paths))
76
+ for (const filePath of wrapPaths(o.paths))
77
+ pathList.add(
78
+ PathAnalyzer.join(globalPrefix, v, prefix, cPath, filePath),
79
+ );
80
+ if (o.protocol === "http")
81
+ routes.push(
82
+ ...TypedHttpRouteAnalyzer.analyze({
83
+ controller: c,
84
+ errors: project.errors,
85
+ dictionary: collection,
86
+ operation: o,
87
+ paths: Array.from(pathList),
88
+ }),
89
+ );
90
+ }
91
+ AccessorAnalyzer.analyze(routes);
92
+ return routes;
93
+ };
94
+ }
95
+
96
+ const report = (props: {
97
+ type: "error" | "warning";
98
+ errors: IReflectOperationError[];
99
+ }): void => {
100
+ const map: TreeMap<
101
+ IReflectOperationError.Key,
102
+ Array<string | IOperationMetadata.IError>
103
+ > = new TreeMap();
104
+ for (const e of props.errors)
105
+ map.take(new IReflectOperationError.Key(e), () => []).push(...e.contents);
106
+
107
+ const messages: string[] = [];
108
+ for (const {
109
+ first: { error },
110
+ second: contents,
111
+ } of map) {
112
+ if (error.contents.length === 0) continue;
113
+ const location: string = path.relative(process.cwd(), error.file);
114
+ messages.push(
115
+ [
116
+ `${location} - `,
117
+ error.class,
118
+ ...(error.function !== null ? [`.${error.function}()`] : [""]),
119
+ ...(error.from !== null ? [` from ${error.from}`] : [""]),
120
+ ":\n",
121
+ contents
122
+ .map((c) => {
123
+ if (typeof c === "string") return ` - ${c}`;
124
+ else
125
+ return [
126
+ c.accessor
127
+ ? ` - ${c.name}: `
128
+ : ` - ${c.name} (${c.accessor}): `,
129
+ ...c.messages.map((msg) => ` - ${msg}`),
130
+ ].join("\n");
131
+ })
132
+ .join("\n"),
133
+ ].join(""),
134
+ );
135
+ }
136
+ throw new Error(`Error on NestiaSwaggerComposer.compose():\n${messages}`);
137
+ };
138
+
139
+ const wrapPaths = (paths: string[]): string[] =>
140
+ paths.length === 0 ? [""] : paths;
@@ -1,67 +1,67 @@
1
- import { Escaper } from "typia/lib/utils/Escaper";
2
-
3
- import { ITypedHttpRoute } from "../structures/ITypedHttpRoute";
4
- import { ITypedWebSocketRoute } from "../structures/ITypedWebSocketRoute";
5
-
6
- export namespace AccessorAnalyzer {
7
- export const analyze = (
8
- routes: Array<ITypedHttpRoute | ITypedWebSocketRoute>,
9
- ) => {
10
- shrink(routes);
11
- variable(routes);
12
- shrink(routes);
13
- for (const r of routes) r.name = r.accessor.at(-1) ?? r.name;
14
- };
15
-
16
- const prepare = (
17
- routeList: Array<ITypedHttpRoute | ITypedWebSocketRoute>,
18
- ): Map<string, number> => {
19
- const dict: Map<string, number> = new Map();
20
- for (const route of routeList)
21
- route.accessor.forEach((_a, i) => {
22
- const key: string = route.accessor.slice(0, i + 1).join(".");
23
- dict.set(key, (dict.get(key) ?? 0) + 1);
24
- });
25
- return dict;
26
- };
27
-
28
- const variable = (
29
- routeList: Array<ITypedHttpRoute | ITypedWebSocketRoute>,
30
- ) => {
31
- const dict: Map<string, number> = prepare(routeList);
32
- for (const route of routeList) {
33
- const emended: string[] = route.accessor.slice();
34
- route.accessor.forEach((accessor, i) => {
35
- if (Escaper.variable(accessor)) return;
36
- while (true) {
37
- accessor = "_" + accessor;
38
- const partial: string = [
39
- ...route.accessor.slice(0, i),
40
- accessor,
41
- ].join(".");
42
- if (dict.has(partial) === false) {
43
- emended[i] = accessor;
44
- break;
45
- }
46
- }
47
- });
48
- route.accessor.splice(0, route.accessor.length, ...emended);
49
- }
50
- };
51
-
52
- const shrink = (routeList: Array<ITypedHttpRoute | ITypedWebSocketRoute>) => {
53
- const dict: Map<string, number> = prepare(routeList);
54
- for (const route of routeList) {
55
- if (
56
- route.accessor.length < 2 ||
57
- route.accessor.at(-1) !== route.accessor.at(-2)
58
- )
59
- continue;
60
-
61
- const cut: string[] = route.accessor.slice(0, -1);
62
- if ((dict.get(cut.join(".")) ?? 0) > 1) continue;
63
-
64
- route.accessor = cut;
65
- }
66
- };
67
- }
1
+ import { NamingConvention } from "@typia/utils";
2
+
3
+ import { ITypedHttpRoute } from "../structures/ITypedHttpRoute";
4
+ import { ITypedWebSocketRoute } from "../structures/ITypedWebSocketRoute";
5
+
6
+ export namespace AccessorAnalyzer {
7
+ export const analyze = (
8
+ routes: Array<ITypedHttpRoute | ITypedWebSocketRoute>,
9
+ ) => {
10
+ shrink(routes);
11
+ variable(routes);
12
+ shrink(routes);
13
+ for (const r of routes) r.name = r.accessor.at(-1) ?? r.name;
14
+ };
15
+
16
+ const prepare = (
17
+ routeList: Array<ITypedHttpRoute | ITypedWebSocketRoute>,
18
+ ): Map<string, number> => {
19
+ const dict: Map<string, number> = new Map();
20
+ for (const route of routeList)
21
+ route.accessor.forEach((_a, i) => {
22
+ const key: string = route.accessor.slice(0, i + 1).join(".");
23
+ dict.set(key, (dict.get(key) ?? 0) + 1);
24
+ });
25
+ return dict;
26
+ };
27
+
28
+ const variable = (
29
+ routeList: Array<ITypedHttpRoute | ITypedWebSocketRoute>,
30
+ ) => {
31
+ const dict: Map<string, number> = prepare(routeList);
32
+ for (const route of routeList) {
33
+ const emended: string[] = route.accessor.slice();
34
+ route.accessor.forEach((accessor, i) => {
35
+ if (NamingConvention.variable(accessor)) return;
36
+ while (true) {
37
+ accessor = "_" + accessor;
38
+ const partial: string = [
39
+ ...route.accessor.slice(0, i),
40
+ accessor,
41
+ ].join(".");
42
+ if (dict.has(partial) === false) {
43
+ emended[i] = accessor;
44
+ break;
45
+ }
46
+ }
47
+ });
48
+ route.accessor.splice(0, route.accessor.length, ...emended);
49
+ }
50
+ };
51
+
52
+ const shrink = (routeList: Array<ITypedHttpRoute | ITypedWebSocketRoute>) => {
53
+ const dict: Map<string, number> = prepare(routeList);
54
+ for (const route of routeList) {
55
+ if (
56
+ route.accessor.length < 2 ||
57
+ route.accessor.at(-1) !== route.accessor.at(-2)
58
+ )
59
+ continue;
60
+
61
+ const cut: string[] = route.accessor.slice(0, -1);
62
+ if ((dict.get(cut.join(".")) ?? 0) > 1) continue;
63
+
64
+ route.accessor = cut;
65
+ }
66
+ };
67
+ }