@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.
- package/LICENSE +21 -21
- package/README.md +93 -93
- package/assets/bundle/api/HttpError.ts +1 -1
- package/assets/bundle/api/IConnection.ts +1 -1
- package/assets/bundle/api/Primitive.ts +1 -1
- package/assets/bundle/api/Resolved.ts +1 -1
- package/assets/bundle/api/index.ts +4 -4
- package/assets/bundle/api/module.ts +6 -6
- package/assets/bundle/distribute/README.md +37 -37
- package/assets/bundle/distribute/package.json +28 -28
- package/assets/bundle/distribute/tsconfig.json +109 -109
- package/assets/bundle/e2e/index.ts +42 -42
- package/assets/config/nestia.config.ts +97 -97
- package/lib/NestiaSdkApplication.js +29 -7
- package/lib/NestiaSdkApplication.js.map +1 -1
- package/lib/NestiaSwaggerComposer.js +21 -13
- package/lib/NestiaSwaggerComposer.js.map +1 -1
- package/lib/analyses/AccessorAnalyzer.d.ts +4 -1
- package/lib/analyses/AccessorAnalyzer.js.map +1 -1
- package/lib/analyses/ConfigAnalyzer.js +1 -1
- package/lib/analyses/PathAnalyzer.d.ts +18 -3
- package/lib/analyses/PathAnalyzer.js +32 -0
- package/lib/analyses/PathAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectControllerAnalyzer.js +3 -2
- package/lib/analyses/ReflectControllerAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectHttpOperationAnalyzer.d.ts +1 -1
- package/lib/analyses/ReflectHttpOperationAnalyzer.js +1 -1
- package/lib/analyses/ReflectHttpOperationAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectHttpOperationResponseAnalyzer.d.ts +1 -1
- package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js +53 -20
- package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectMcpOperationAnalyzer.d.ts +14 -0
- package/lib/analyses/ReflectMcpOperationAnalyzer.js +79 -0
- package/lib/analyses/ReflectMcpOperationAnalyzer.js.map +1 -0
- package/lib/analyses/TypedMcpRouteAnalyzer.d.ts +9 -0
- package/lib/analyses/TypedMcpRouteAnalyzer.js +31 -0
- package/lib/analyses/TypedMcpRouteAnalyzer.js.map +1 -0
- package/lib/executable/internal/NestiaConfigLoader.js +5 -1
- package/lib/executable/internal/NestiaConfigLoader.js.map +1 -1
- package/lib/executable/internal/NestiaSdkCommand.js +30 -14
- package/lib/executable/internal/NestiaSdkCommand.js.map +1 -1
- package/lib/executable/internal/NestiaSdkWatcher.d.ts +10 -0
- package/lib/executable/internal/NestiaSdkWatcher.js +322 -0
- package/lib/executable/internal/NestiaSdkWatcher.js.map +1 -0
- package/lib/executable/sdk.js +12 -12
- package/lib/executable/sdk.js.map +1 -1
- package/lib/generates/CloneGenerator.js +4 -2
- package/lib/generates/CloneGenerator.js.map +1 -1
- package/lib/generates/SdkGenerator.js +50 -1
- package/lib/generates/SdkGenerator.js.map +1 -1
- package/lib/generates/SwaggerGenerator.js +18 -2
- package/lib/generates/SwaggerGenerator.js.map +1 -1
- package/lib/generates/internal/E2eFileProgrammer.js +3 -1
- package/lib/generates/internal/E2eFileProgrammer.js.map +1 -1
- package/lib/generates/internal/ImportDictionary.d.ts +1 -0
- package/lib/generates/internal/ImportDictionary.js +9 -4
- package/lib/generates/internal/ImportDictionary.js.map +1 -1
- package/lib/generates/internal/SdkAliasCollection.d.ts +2 -0
- package/lib/generates/internal/SdkAliasCollection.js +11 -2
- package/lib/generates/internal/SdkAliasCollection.js.map +1 -1
- package/lib/generates/internal/SdkDistributionComposer.d.ts +1 -0
- package/lib/generates/internal/SdkDistributionComposer.js +3 -0
- package/lib/generates/internal/SdkDistributionComposer.js.map +1 -1
- package/lib/generates/internal/SdkFileProgrammer.js +4 -1
- package/lib/generates/internal/SdkFileProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpCloneReferencer.d.ts +1 -1
- package/lib/generates/internal/SdkHttpCloneReferencer.js +42 -9
- package/lib/generates/internal/SdkHttpCloneReferencer.js.map +1 -1
- package/lib/generates/internal/SdkHttpFunctionProgrammer.js +3 -4
- package/lib/generates/internal/SdkHttpFunctionProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpNamespaceProgrammer.js +2 -1
- package/lib/generates/internal/SdkHttpNamespaceProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpSimulationProgrammer.js +6 -3
- package/lib/generates/internal/SdkHttpSimulationProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkMcpRouteProgrammer.d.ts +15 -0
- package/lib/generates/internal/SdkMcpRouteProgrammer.js +148 -0
- package/lib/generates/internal/SdkMcpRouteProgrammer.js.map +1 -0
- package/lib/generates/internal/SdkRouteDirectory.d.ts +2 -1
- package/lib/generates/internal/SdkRouteDirectory.js.map +1 -1
- package/lib/generates/internal/SdkWebSocketCloneProgrammer.d.ts +6 -0
- package/lib/generates/internal/SdkWebSocketCloneProgrammer.js +283 -0
- package/lib/generates/internal/SdkWebSocketCloneProgrammer.js.map +1 -0
- package/lib/generates/internal/SdkWebSocketRouteProgrammer.js +11 -9
- package/lib/generates/internal/SdkWebSocketRouteProgrammer.js.map +1 -1
- package/lib/generates/internal/SwaggerOperationParameterComposer.js +10 -2
- package/lib/generates/internal/SwaggerOperationParameterComposer.js.map +1 -1
- package/lib/generates/internal/SwaggerOperationResponseComposer.d.ts +1 -1
- package/lib/generates/internal/SwaggerOperationResponseComposer.js +6 -1
- package/lib/generates/internal/SwaggerOperationResponseComposer.js.map +1 -1
- package/lib/generates/internal/SwaggerReadonlyArrayEmender.d.ts +9 -0
- package/lib/generates/internal/SwaggerReadonlyArrayEmender.js +174 -0
- package/lib/generates/internal/SwaggerReadonlyArrayEmender.js.map +1 -0
- package/lib/structures/INestiaSdkInput.d.ts +9 -2
- package/lib/structures/IReflectController.d.ts +2 -1
- package/lib/structures/IReflectHttpOperationSuccess.d.ts +4 -2
- package/lib/structures/IReflectMcpOperation.d.ts +35 -0
- package/lib/structures/IReflectMcpOperation.js +3 -0
- package/lib/structures/IReflectMcpOperation.js.map +1 -0
- package/lib/structures/IReflectMcpOperationParameter.d.ts +19 -0
- package/lib/structures/IReflectMcpOperationParameter.js +3 -0
- package/lib/structures/IReflectMcpOperationParameter.js.map +1 -0
- package/lib/structures/ITypedApplication.d.ts +2 -1
- package/lib/structures/ITypedHttpRouteSuccess.d.ts +3 -1
- package/lib/structures/ITypedMcpRoute.d.ts +31 -0
- package/lib/structures/ITypedMcpRoute.js +3 -0
- package/lib/structures/ITypedMcpRoute.js.map +1 -0
- package/lib/utils/HttpResponseContentTypeUtil.d.ts +5 -0
- package/lib/utils/HttpResponseContentTypeUtil.js +22 -0
- package/lib/utils/HttpResponseContentTypeUtil.js.map +1 -0
- package/native/go.mod +52 -52
- package/native/go.sum +84 -54
- package/native/sdk/register.go +322 -165
- package/native/sdk/sdk.go +17 -17
- package/native/sdk/sdk_metadata_json.go +327 -327
- package/native/sdk/sdk_transform.go +1879 -1549
- package/package.json +11 -9
- package/src/INestiaConfig.ts +267 -267
- package/src/NestiaSdkApplication.ts +39 -8
- package/src/NestiaSwaggerComposer.ts +153 -142
- package/src/analyses/AccessorAnalyzer.ts +64 -67
- package/src/analyses/ConfigAnalyzer.ts +330 -330
- package/src/analyses/ImportAnalyzer.ts +92 -92
- package/src/analyses/PathAnalyzer.ts +130 -69
- package/src/analyses/ReflectControllerAnalyzer.ts +112 -105
- package/src/analyses/ReflectHttpOperationAnalyzer.ts +183 -183
- package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +90 -90
- package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +350 -350
- package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +163 -130
- package/src/analyses/ReflectMcpOperationAnalyzer.ts +124 -0
- package/src/analyses/ReflectMetadataAnalyzer.ts +44 -44
- package/src/analyses/SecurityAnalyzer.ts +25 -25
- package/src/analyses/TypedMcpRouteAnalyzer.ts +34 -0
- package/src/decorators/OperationMetadata.ts +29 -29
- package/src/executable/internal/CommandParser.ts +15 -15
- package/src/executable/internal/NestiaConfigLoader.ts +451 -446
- package/src/executable/internal/NestiaSdkCommand.ts +124 -106
- package/src/executable/internal/NestiaSdkWatcher.ts +342 -0
- package/src/executable/sdk.ts +90 -88
- package/src/generates/CloneGenerator.ts +73 -66
- package/src/generates/E2eGenerator.ts +32 -32
- package/src/generates/SdkGenerator.ts +176 -118
- package/src/generates/SwaggerGenerator.ts +342 -310
- package/src/generates/internal/E2eFileProgrammer.ts +240 -233
- package/src/generates/internal/FilePrinter.ts +65 -65
- package/src/generates/internal/ImportDictionary.ts +209 -204
- package/src/generates/internal/SdkAliasCollection.ts +274 -261
- package/src/generates/internal/SdkDistributionComposer.ts +123 -116
- package/src/generates/internal/SdkFileProgrammer.ts +116 -112
- package/src/generates/internal/SdkHttpCloneProgrammer.ts +126 -126
- package/src/generates/internal/SdkHttpCloneReferencer.ts +131 -77
- package/src/generates/internal/SdkHttpFunctionProgrammer.ts +301 -301
- package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +520 -510
- package/src/generates/internal/SdkHttpParameterProgrammer.ts +165 -165
- package/src/generates/internal/SdkHttpRouteProgrammer.ts +109 -109
- package/src/generates/internal/SdkHttpSimulationProgrammer.ts +331 -314
- package/src/generates/internal/SdkImportWizard.ts +62 -62
- package/src/generates/internal/SdkMcpRouteProgrammer.ts +452 -0
- package/src/generates/internal/SdkRouteDirectory.ts +21 -18
- package/src/generates/internal/SdkTypeTagProgrammer.ts +114 -114
- package/src/generates/internal/SdkWebSocketCloneProgrammer.ts +319 -0
- package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +389 -389
- package/src/generates/internal/SdkWebSocketParameterProgrammer.ts +89 -89
- package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +331 -323
- package/src/generates/internal/SwaggerDescriptionComposer.ts +64 -64
- package/src/generates/internal/SwaggerOperationComposer.ts +119 -119
- package/src/generates/internal/SwaggerOperationParameterComposer.ts +175 -162
- package/src/generates/internal/SwaggerOperationResponseComposer.ts +115 -110
- package/src/generates/internal/SwaggerReadonlyArrayEmender.ts +262 -0
- package/src/index.ts +4 -4
- package/src/internal/legacy.ts +492 -492
- package/src/module.ts +4 -4
- package/src/structures/INestiaProject.ts +10 -10
- package/src/structures/INestiaSdkInput.ts +27 -20
- package/src/structures/IOperationMetadata.ts +41 -41
- package/src/structures/IReflectController.ts +18 -15
- package/src/structures/IReflectHttpOperation.ts +26 -26
- package/src/structures/IReflectHttpOperationException.ts +18 -18
- package/src/structures/IReflectHttpOperationParameter.ts +79 -79
- package/src/structures/IReflectHttpOperationSuccess.ts +18 -21
- package/src/structures/IReflectImport.ts +6 -6
- package/src/structures/IReflectMcpOperation.ts +38 -0
- package/src/structures/IReflectMcpOperationParameter.ts +27 -0
- package/src/structures/IReflectOperationError.ts +26 -26
- package/src/structures/IReflectType.ts +4 -4
- package/src/structures/IReflectWebSocketOperation.ts +17 -17
- package/src/structures/ITypedApplication.ts +12 -11
- package/src/structures/ITypedHttpRoute.ts +41 -41
- package/src/structures/ITypedHttpRouteException.ts +15 -15
- package/src/structures/ITypedHttpRouteParameter.ts +41 -41
- package/src/structures/ITypedHttpRouteSuccess.ts +18 -22
- package/src/structures/ITypedMcpRoute.ts +33 -0
- package/src/structures/ITypedWebSocketRoute.ts +24 -24
- package/src/structures/ITypedWebSocketRouteParameter.ts +3 -3
- package/src/transform.ts +59 -59
- package/src/typings/get-function-location.d.ts +7 -7
- package/src/utils/ArrayUtil.ts +26 -26
- package/src/utils/EmittedJavaScriptPatcher.ts +88 -88
- package/src/utils/FileRetriever.ts +22 -22
- package/src/utils/HttpResponseContentTypeUtil.ts +30 -0
- package/src/utils/MapUtil.ts +14 -14
- package/src/utils/PathUtil.ts +10 -10
- package/src/utils/SourceFinder.ts +63 -63
- package/src/utils/StringUtil.ts +17 -17
- package/src/utils/TsConfigReader.ts +108 -108
- package/src/utils/TtscExecutor.ts +68 -68
- package/src/utils/VersioningStrategy.ts +28 -28
- package/src/validators/HttpHeadersValidator.ts +11 -11
- package/src/validators/HttpQueryValidator.ts +11 -11
- package/src/validators/TextPlainValidator.ts +17 -17
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { IMetadataDictionary } from "./internal/legacy";
|
|
2
1
|
import fs from "fs";
|
|
3
2
|
import path from "path";
|
|
4
3
|
import { HashSet, Pair, TreeMap } from "tstl";
|
|
@@ -9,17 +8,20 @@ import { ConfigAnalyzer } from "./analyses/ConfigAnalyzer";
|
|
|
9
8
|
import { PathAnalyzer } from "./analyses/PathAnalyzer";
|
|
10
9
|
import { ReflectControllerAnalyzer } from "./analyses/ReflectControllerAnalyzer";
|
|
11
10
|
import { TypedHttpRouteAnalyzer } from "./analyses/TypedHttpRouteAnalyzer";
|
|
11
|
+
import { TypedMcpRouteAnalyzer } from "./analyses/TypedMcpRouteAnalyzer";
|
|
12
12
|
import { TypedWebSocketRouteAnalyzer } from "./analyses/TypedWebSocketRouteAnalyzer";
|
|
13
13
|
import { E2eGenerator } from "./generates/E2eGenerator";
|
|
14
14
|
import { SdkGenerator } from "./generates/SdkGenerator";
|
|
15
15
|
import { SwaggerGenerator } from "./generates/SwaggerGenerator";
|
|
16
|
+
import { IMetadataDictionary } from "./internal/legacy";
|
|
16
17
|
import { INestiaProject } from "./structures/INestiaProject";
|
|
18
|
+
import { IOperationMetadata } from "./structures/IOperationMetadata";
|
|
17
19
|
import { IReflectController } from "./structures/IReflectController";
|
|
18
20
|
import { IReflectOperationError } from "./structures/IReflectOperationError";
|
|
19
21
|
import { ITypedApplication } from "./structures/ITypedApplication";
|
|
20
22
|
import { ITypedHttpRoute } from "./structures/ITypedHttpRoute";
|
|
23
|
+
import { ITypedMcpRoute } from "./structures/ITypedMcpRoute";
|
|
21
24
|
import { ITypedWebSocketRoute } from "./structures/ITypedWebSocketRoute";
|
|
22
|
-
import { IOperationMetadata } from "./structures/IOperationMetadata";
|
|
23
25
|
import { StringUtil } from "./utils/StringUtil";
|
|
24
26
|
import { VersioningStrategy } from "./utils/VersioningStrategy";
|
|
25
27
|
|
|
@@ -161,7 +163,11 @@ export class NestiaSdkApplication {
|
|
|
161
163
|
const set: HashSet<Pair<string, string>> = new HashSet();
|
|
162
164
|
for (const controller of controllers)
|
|
163
165
|
for (const controllerPath of controller.paths)
|
|
164
|
-
for (const operation of controller.operations)
|
|
166
|
+
for (const operation of controller.operations) {
|
|
167
|
+
if (operation.protocol === "mcp") {
|
|
168
|
+
set.insert(new Pair(`mcp:${operation.toolName}`, "mcp"));
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
165
171
|
for (const operationPath of operation.paths)
|
|
166
172
|
set.insert(
|
|
167
173
|
new Pair(
|
|
@@ -169,6 +175,7 @@ export class NestiaSdkApplication {
|
|
|
169
175
|
operation.protocol === "http" ? operation.method : "",
|
|
170
176
|
),
|
|
171
177
|
);
|
|
178
|
+
}
|
|
172
179
|
return set.size();
|
|
173
180
|
})();
|
|
174
181
|
|
|
@@ -179,7 +186,9 @@ export class NestiaSdkApplication {
|
|
|
179
186
|
.map(
|
|
180
187
|
(c) =>
|
|
181
188
|
c.paths.length *
|
|
182
|
-
c.operations
|
|
189
|
+
c.operations
|
|
190
|
+
.map((f) => (f.protocol === "mcp" ? 1 : f.paths.length))
|
|
191
|
+
.reduce((a, b) => a + b, 0),
|
|
183
192
|
)
|
|
184
193
|
.reduce((a, b) => a + b, 0)}`,
|
|
185
194
|
);
|
|
@@ -194,10 +203,20 @@ export class NestiaSdkApplication {
|
|
|
194
203
|
TypedHttpRouteAnalyzer.dictionary(controllers);
|
|
195
204
|
|
|
196
205
|
// CONVERT TO TYPED OPERATIONS
|
|
197
|
-
const
|
|
198
|
-
|
|
206
|
+
const routes: Array<
|
|
207
|
+
ITypedHttpRoute | ITypedWebSocketRoute | ITypedMcpRoute
|
|
208
|
+
> = [];
|
|
199
209
|
for (const c of controllers)
|
|
200
210
|
for (const o of c.operations) {
|
|
211
|
+
if (o.protocol === "mcp") {
|
|
212
|
+
routes.push(
|
|
213
|
+
...TypedMcpRouteAnalyzer.analyze({
|
|
214
|
+
controller: c,
|
|
215
|
+
operation: o,
|
|
216
|
+
}),
|
|
217
|
+
);
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
201
220
|
const pathList: Set<string> = new Set();
|
|
202
221
|
const versions: string[] = VersioningStrategy.merge(project)([
|
|
203
222
|
...(c.versions ?? []),
|
|
@@ -206,10 +225,22 @@ export class NestiaSdkApplication {
|
|
|
206
225
|
for (const v of versions)
|
|
207
226
|
for (const prefix of wrapPaths(c.prefixes))
|
|
208
227
|
for (const cPath of wrapPaths(c.paths))
|
|
209
|
-
for (const filePath of wrapPaths(o.paths))
|
|
228
|
+
for (const filePath of wrapPaths(o.paths)) {
|
|
229
|
+
const localPath: string = PathAnalyzer.join(
|
|
230
|
+
prefix,
|
|
231
|
+
cPath,
|
|
232
|
+
filePath,
|
|
233
|
+
);
|
|
210
234
|
pathList.add(
|
|
211
|
-
PathAnalyzer.
|
|
235
|
+
PathAnalyzer.joinWithGlobalPrefix({
|
|
236
|
+
globalPrefix: project.input.globalPrefix?.prefix ?? "",
|
|
237
|
+
exclude: project.input.globalPrefix?.exclude,
|
|
238
|
+
excludePath: localPath,
|
|
239
|
+
method: o.protocol === "http" ? o.method : "",
|
|
240
|
+
path: PathAnalyzer.join(v, localPath),
|
|
241
|
+
}),
|
|
212
242
|
);
|
|
243
|
+
}
|
|
213
244
|
if (o.protocol === "http")
|
|
214
245
|
routes.push(
|
|
215
246
|
...TypedHttpRouteAnalyzer.analyze({
|
|
@@ -1,142 +1,153 @@
|
|
|
1
|
-
import { INestApplication } from "@nestjs/common";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import { INestiaProject } from "./structures/INestiaProject";
|
|
17
|
-
import { INestiaSdkInput } from "./structures/INestiaSdkInput";
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
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<
|
|
29
|
-
| OpenApi.IDocument
|
|
30
|
-
| OpenApiV3_1.IDocument
|
|
31
|
-
| OpenApiV3.IDocument
|
|
32
|
-
| SwaggerV2.IDocument
|
|
33
|
-
> => {
|
|
34
|
-
const input: INestiaSdkInput = await ConfigAnalyzer.application(app);
|
|
35
|
-
const document: OpenApi.IDocument = await SwaggerGenerator.compose({
|
|
36
|
-
config,
|
|
37
|
-
routes: analyze(input),
|
|
38
|
-
document: await SwaggerGenerator.initialize(config),
|
|
39
|
-
});
|
|
40
|
-
return (config.openapi ?? "3.2") === "3.2"
|
|
41
|
-
? document
|
|
42
|
-
: OpenApiConverter.downgradeDocument(document, config.openapi as "2.0");
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
const analyze = (input: INestiaSdkInput): ITypedHttpRoute[] => {
|
|
46
|
-
// GET REFLECT CONTROLLERS
|
|
47
|
-
const unique: WeakSet<any> = new WeakSet();
|
|
48
|
-
const project: Omit<INestiaProject, "config"> = {
|
|
49
|
-
input,
|
|
50
|
-
errors: [],
|
|
51
|
-
warnings: [],
|
|
52
|
-
};
|
|
53
|
-
const controllers: IReflectController[] = project.input.controllers
|
|
54
|
-
.map((c) =>
|
|
55
|
-
ReflectControllerAnalyzer.analyze({ project, controller: c, unique }),
|
|
56
|
-
)
|
|
57
|
-
.filter((c): c is IReflectController => c !== null);
|
|
58
|
-
if (project.errors.length)
|
|
59
|
-
throw report({ type: "error", errors: project.errors });
|
|
60
|
-
|
|
61
|
-
// METADATA COMPONENTS
|
|
62
|
-
const collection: IMetadataDictionary =
|
|
63
|
-
TypedHttpRouteAnalyzer.dictionary(controllers);
|
|
64
|
-
|
|
65
|
-
// CONVERT TO TYPED OPERATIONS
|
|
66
|
-
const
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const pathList: Set<string> = new Set();
|
|
71
|
-
const versions: string[] = VersioningStrategy.merge(project)([
|
|
72
|
-
...(c.versions ?? []),
|
|
73
|
-
...(o.versions ?? []),
|
|
74
|
-
]);
|
|
75
|
-
for (const v of versions)
|
|
76
|
-
for (const prefix of wrapPaths(c.prefixes))
|
|
77
|
-
for (const cPath of wrapPaths(c.paths))
|
|
78
|
-
for (const filePath of wrapPaths(o.paths))
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
1
|
+
import { INestApplication } from "@nestjs/common";
|
|
2
|
+
import { OpenApiV3, OpenApiV3_1, SwaggerV2 } from "@typia/interface";
|
|
3
|
+
import { OpenApiConverter } from "@typia/utils";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import { TreeMap } from "tstl";
|
|
6
|
+
import { OpenApi } from "typia";
|
|
7
|
+
|
|
8
|
+
import { INestiaConfig } from "./INestiaConfig";
|
|
9
|
+
import { AccessorAnalyzer } from "./analyses/AccessorAnalyzer";
|
|
10
|
+
import { ConfigAnalyzer } from "./analyses/ConfigAnalyzer";
|
|
11
|
+
import { PathAnalyzer } from "./analyses/PathAnalyzer";
|
|
12
|
+
import { ReflectControllerAnalyzer } from "./analyses/ReflectControllerAnalyzer";
|
|
13
|
+
import { TypedHttpRouteAnalyzer } from "./analyses/TypedHttpRouteAnalyzer";
|
|
14
|
+
import { SwaggerGenerator } from "./generates/SwaggerGenerator";
|
|
15
|
+
import { IMetadataDictionary } from "./internal/legacy";
|
|
16
|
+
import { INestiaProject } from "./structures/INestiaProject";
|
|
17
|
+
import { INestiaSdkInput } from "./structures/INestiaSdkInput";
|
|
18
|
+
import { IOperationMetadata } from "./structures/IOperationMetadata";
|
|
19
|
+
import { IReflectController } from "./structures/IReflectController";
|
|
20
|
+
import { IReflectOperationError } from "./structures/IReflectOperationError";
|
|
21
|
+
import { ITypedHttpRoute } from "./structures/ITypedHttpRoute";
|
|
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<
|
|
29
|
+
| OpenApi.IDocument
|
|
30
|
+
| OpenApiV3_1.IDocument
|
|
31
|
+
| OpenApiV3.IDocument
|
|
32
|
+
| SwaggerV2.IDocument
|
|
33
|
+
> => {
|
|
34
|
+
const input: INestiaSdkInput = await ConfigAnalyzer.application(app);
|
|
35
|
+
const document: OpenApi.IDocument = await SwaggerGenerator.compose({
|
|
36
|
+
config,
|
|
37
|
+
routes: analyze(input),
|
|
38
|
+
document: await SwaggerGenerator.initialize(config),
|
|
39
|
+
});
|
|
40
|
+
return (config.openapi ?? "3.2") === "3.2"
|
|
41
|
+
? document
|
|
42
|
+
: OpenApiConverter.downgradeDocument(document, config.openapi as "2.0");
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const analyze = (input: INestiaSdkInput): ITypedHttpRoute[] => {
|
|
46
|
+
// GET REFLECT CONTROLLERS
|
|
47
|
+
const unique: WeakSet<any> = new WeakSet();
|
|
48
|
+
const project: Omit<INestiaProject, "config"> = {
|
|
49
|
+
input,
|
|
50
|
+
errors: [],
|
|
51
|
+
warnings: [],
|
|
52
|
+
};
|
|
53
|
+
const controllers: IReflectController[] = project.input.controllers
|
|
54
|
+
.map((c) =>
|
|
55
|
+
ReflectControllerAnalyzer.analyze({ project, controller: c, unique }),
|
|
56
|
+
)
|
|
57
|
+
.filter((c): c is IReflectController => c !== null);
|
|
58
|
+
if (project.errors.length)
|
|
59
|
+
throw report({ type: "error", errors: project.errors });
|
|
60
|
+
|
|
61
|
+
// METADATA COMPONENTS
|
|
62
|
+
const collection: IMetadataDictionary =
|
|
63
|
+
TypedHttpRouteAnalyzer.dictionary(controllers);
|
|
64
|
+
|
|
65
|
+
// CONVERT TO TYPED OPERATIONS
|
|
66
|
+
const routes: ITypedHttpRoute[] = [];
|
|
67
|
+
for (const c of controllers)
|
|
68
|
+
for (const o of c.operations) {
|
|
69
|
+
if (o.protocol !== "http") continue;
|
|
70
|
+
const pathList: Set<string> = new Set();
|
|
71
|
+
const versions: string[] = VersioningStrategy.merge(project)([
|
|
72
|
+
...(c.versions ?? []),
|
|
73
|
+
...(o.versions ?? []),
|
|
74
|
+
]);
|
|
75
|
+
for (const v of versions)
|
|
76
|
+
for (const prefix of wrapPaths(c.prefixes))
|
|
77
|
+
for (const cPath of wrapPaths(c.paths))
|
|
78
|
+
for (const filePath of wrapPaths(o.paths)) {
|
|
79
|
+
const localPath: string = PathAnalyzer.join(
|
|
80
|
+
prefix,
|
|
81
|
+
cPath,
|
|
82
|
+
filePath,
|
|
83
|
+
);
|
|
84
|
+
pathList.add(
|
|
85
|
+
PathAnalyzer.joinWithGlobalPrefix({
|
|
86
|
+
globalPrefix: project.input.globalPrefix?.prefix ?? "",
|
|
87
|
+
exclude: project.input.globalPrefix?.exclude,
|
|
88
|
+
excludePath: localPath,
|
|
89
|
+
method: o.method,
|
|
90
|
+
path: PathAnalyzer.join(v, localPath),
|
|
91
|
+
}),
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
routes.push(
|
|
95
|
+
...TypedHttpRouteAnalyzer.analyze({
|
|
96
|
+
controller: c,
|
|
97
|
+
errors: project.errors,
|
|
98
|
+
dictionary: collection,
|
|
99
|
+
operation: o,
|
|
100
|
+
paths: Array.from(pathList),
|
|
101
|
+
}),
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
AccessorAnalyzer.analyze(routes);
|
|
105
|
+
return routes;
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const report = (props: {
|
|
110
|
+
type: "error" | "warning";
|
|
111
|
+
errors: IReflectOperationError[];
|
|
112
|
+
}): void => {
|
|
113
|
+
const map: TreeMap<
|
|
114
|
+
IReflectOperationError.Key,
|
|
115
|
+
Array<string | IOperationMetadata.IError>
|
|
116
|
+
> = new TreeMap();
|
|
117
|
+
for (const e of props.errors)
|
|
118
|
+
map.take(new IReflectOperationError.Key(e), () => []).push(...e.contents);
|
|
119
|
+
|
|
120
|
+
const messages: string[] = [];
|
|
121
|
+
for (const {
|
|
122
|
+
first: { error },
|
|
123
|
+
second: contents,
|
|
124
|
+
} of map) {
|
|
125
|
+
if (error.contents.length === 0) continue;
|
|
126
|
+
const location: string = path.relative(process.cwd(), error.file);
|
|
127
|
+
messages.push(
|
|
128
|
+
[
|
|
129
|
+
`${location} - `,
|
|
130
|
+
error.class,
|
|
131
|
+
...(error.function !== null ? [`.${error.function}()`] : [""]),
|
|
132
|
+
...(error.from !== null ? [` from ${error.from}`] : [""]),
|
|
133
|
+
":\n",
|
|
134
|
+
contents
|
|
135
|
+
.map((c) => {
|
|
136
|
+
if (typeof c === "string") return ` - ${c}`;
|
|
137
|
+
else
|
|
138
|
+
return [
|
|
139
|
+
c.accessor
|
|
140
|
+
? ` - ${c.name}: `
|
|
141
|
+
: ` - ${c.name} (${c.accessor}): `,
|
|
142
|
+
...c.messages.map((msg) => ` - ${msg}`),
|
|
143
|
+
].join("\n");
|
|
144
|
+
})
|
|
145
|
+
.join("\n"),
|
|
146
|
+
].join(""),
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
throw new Error(`Error on NestiaSwaggerComposer.compose():\n${messages}`);
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
const wrapPaths = (paths: string[]): string[] =>
|
|
153
|
+
paths.length === 0 ? [""] : paths;
|
|
@@ -1,67 +1,64 @@
|
|
|
1
|
-
import { NamingConvention } from "@typia/utils";
|
|
2
|
-
|
|
3
|
-
import { ITypedHttpRoute } from "../structures/ITypedHttpRoute";
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
accessor
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
}
|
|
1
|
+
import { NamingConvention } from "@typia/utils";
|
|
2
|
+
|
|
3
|
+
import { ITypedHttpRoute } from "../structures/ITypedHttpRoute";
|
|
4
|
+
import { ITypedMcpRoute } from "../structures/ITypedMcpRoute";
|
|
5
|
+
import { ITypedWebSocketRoute } from "../structures/ITypedWebSocketRoute";
|
|
6
|
+
|
|
7
|
+
type AnyRoute = ITypedHttpRoute | ITypedWebSocketRoute | ITypedMcpRoute;
|
|
8
|
+
|
|
9
|
+
export namespace AccessorAnalyzer {
|
|
10
|
+
export const analyze = (routes: Array<AnyRoute>) => {
|
|
11
|
+
shrink(routes);
|
|
12
|
+
variable(routes);
|
|
13
|
+
shrink(routes);
|
|
14
|
+
for (const r of routes) r.name = r.accessor.at(-1) ?? r.name;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const prepare = (routeList: Array<AnyRoute>): Map<string, number> => {
|
|
18
|
+
const dict: Map<string, number> = new Map();
|
|
19
|
+
for (const route of routeList)
|
|
20
|
+
route.accessor.forEach((_a, i) => {
|
|
21
|
+
const key: string = route.accessor.slice(0, i + 1).join(".");
|
|
22
|
+
dict.set(key, (dict.get(key) ?? 0) + 1);
|
|
23
|
+
});
|
|
24
|
+
return dict;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const variable = (routeList: Array<AnyRoute>) => {
|
|
28
|
+
const dict: Map<string, number> = prepare(routeList);
|
|
29
|
+
for (const route of routeList) {
|
|
30
|
+
const emended: string[] = route.accessor.slice();
|
|
31
|
+
route.accessor.forEach((accessor, i) => {
|
|
32
|
+
if (NamingConvention.variable(accessor)) return;
|
|
33
|
+
while (true) {
|
|
34
|
+
accessor = "_" + accessor;
|
|
35
|
+
const partial: string = [
|
|
36
|
+
...route.accessor.slice(0, i),
|
|
37
|
+
accessor,
|
|
38
|
+
].join(".");
|
|
39
|
+
if (dict.has(partial) === false) {
|
|
40
|
+
emended[i] = accessor;
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
route.accessor.splice(0, route.accessor.length, ...emended);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const shrink = (routeList: Array<AnyRoute>) => {
|
|
50
|
+
const dict: Map<string, number> = prepare(routeList);
|
|
51
|
+
for (const route of routeList) {
|
|
52
|
+
if (
|
|
53
|
+
route.accessor.length < 2 ||
|
|
54
|
+
route.accessor.at(-1) !== route.accessor.at(-2)
|
|
55
|
+
)
|
|
56
|
+
continue;
|
|
57
|
+
|
|
58
|
+
const cut: string[] = route.accessor.slice(0, -1);
|
|
59
|
+
if ((dict.get(cut.join(".")) ?? 0) > 1) continue;
|
|
60
|
+
|
|
61
|
+
route.accessor = cut;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
}
|