@nestia/sdk 11.2.0 → 12.0.0-dev.20260520.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.
- package/assets/bundle/distribute/package.json +1 -1
- package/lib/NestiaSdkApplication.js +5 -4
- package/lib/NestiaSdkApplication.js.map +1 -1
- package/lib/NestiaSwaggerComposer.js +2 -2
- package/lib/NestiaSwaggerComposer.js.map +1 -1
- package/lib/analyses/AccessorAnalyzer.js.map +1 -1
- package/lib/analyses/ConfigAnalyzer.js +133 -7
- package/lib/analyses/ConfigAnalyzer.js.map +1 -1
- package/lib/analyses/ImportAnalyzer.d.ts +9 -2
- package/lib/analyses/ImportAnalyzer.js +13 -50
- package/lib/analyses/ImportAnalyzer.js.map +1 -1
- package/lib/analyses/PathAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectControllerAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectHttpOperationAnalyzer.d.ts +1 -1
- package/lib/analyses/ReflectHttpOperationAnalyzer.js +5 -4
- package/lib/analyses/ReflectHttpOperationAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectHttpOperationExceptionAnalyzer.d.ts +1 -1
- package/lib/analyses/ReflectHttpOperationExceptionAnalyzer.js +22 -5
- package/lib/analyses/ReflectHttpOperationExceptionAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectHttpOperationParameterAnalyzer.d.ts +1 -1
- package/lib/analyses/ReflectHttpOperationParameterAnalyzer.js +8 -8
- package/lib/analyses/ReflectHttpOperationParameterAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectHttpOperationResponseAnalyzer.d.ts +1 -1
- package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js +15 -15
- package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectMetadataAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectWebSocketOperationAnalyzer.d.ts +1 -1
- package/lib/analyses/ReflectWebSocketOperationAnalyzer.js +1 -1
- package/lib/analyses/ReflectWebSocketOperationAnalyzer.js.map +1 -1
- package/lib/analyses/SecurityAnalyzer.js.map +1 -1
- package/lib/analyses/TypedHttpRouteAnalyzer.d.ts +2 -1
- package/lib/analyses/TypedHttpRouteAnalyzer.js +296 -39
- package/lib/analyses/TypedHttpRouteAnalyzer.js.map +1 -1
- package/lib/analyses/TypedWebSocketRouteAnalyzer.js +1 -4
- package/lib/analyses/TypedWebSocketRouteAnalyzer.js.map +1 -1
- package/lib/decorators/OperationMetadata.d.ts +1 -1
- package/lib/decorators/OperationMetadata.js.map +1 -1
- package/lib/executable/internal/CommandParser.js.map +1 -1
- package/lib/executable/internal/NestiaConfigLoader.d.ts +6 -2
- package/lib/executable/internal/NestiaConfigLoader.js +285 -792
- package/lib/executable/internal/NestiaConfigLoader.js.map +1 -1
- package/lib/executable/internal/NestiaSdkCommand.js +6 -4
- package/lib/executable/internal/NestiaSdkCommand.js.map +1 -1
- package/lib/executable/sdk.js +17 -5
- package/lib/executable/sdk.js.map +1 -1
- package/lib/generates/CloneGenerator.js +2 -2
- package/lib/generates/CloneGenerator.js.map +1 -1
- package/lib/generates/E2eGenerator.js.map +1 -1
- package/lib/generates/SdkGenerator.js +6 -9
- package/lib/generates/SdkGenerator.js.map +1 -1
- package/lib/generates/SwaggerGenerator.js +20 -107
- package/lib/generates/SwaggerGenerator.js.map +1 -1
- package/lib/generates/internal/E2eFileProgrammer.js +44 -28
- package/lib/generates/internal/E2eFileProgrammer.js.map +1 -1
- package/lib/generates/internal/FilePrinter.d.ts +4 -4
- package/lib/generates/internal/FilePrinter.js +25 -16
- package/lib/generates/internal/FilePrinter.js.map +1 -1
- package/lib/generates/internal/ImportDictionary.d.ts +2 -2
- package/lib/generates/internal/ImportDictionary.js +7 -5
- package/lib/generates/internal/ImportDictionary.js.map +1 -1
- package/lib/generates/internal/SdkAliasCollection.d.ts +11 -11
- package/lib/generates/internal/SdkAliasCollection.js +27 -31
- package/lib/generates/internal/SdkAliasCollection.js.map +1 -1
- package/lib/generates/internal/SdkDistributionComposer.js +15 -70
- package/lib/generates/internal/SdkDistributionComposer.js.map +1 -1
- package/lib/generates/internal/SdkFileProgrammer.js +2 -2
- package/lib/generates/internal/SdkFileProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpCloneProgrammer.d.ts +2 -2
- package/lib/generates/internal/SdkHttpCloneProgrammer.js +6 -12
- package/lib/generates/internal/SdkHttpCloneProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpCloneReferencer.js +2 -1
- package/lib/generates/internal/SdkHttpCloneReferencer.js.map +1 -1
- package/lib/generates/internal/SdkHttpFunctionProgrammer.d.ts +2 -2
- package/lib/generates/internal/SdkHttpFunctionProgrammer.js +73 -77
- package/lib/generates/internal/SdkHttpFunctionProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpNamespaceProgrammer.d.ts +2 -2
- package/lib/generates/internal/SdkHttpNamespaceProgrammer.js +64 -66
- package/lib/generates/internal/SdkHttpNamespaceProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpParameterProgrammer.d.ts +4 -10
- package/lib/generates/internal/SdkHttpParameterProgrammer.js +15 -22
- package/lib/generates/internal/SdkHttpParameterProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpRouteProgrammer.d.ts +2 -2
- package/lib/generates/internal/SdkHttpRouteProgrammer.js +18 -20
- package/lib/generates/internal/SdkHttpRouteProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpSimulationProgrammer.d.ts +3 -3
- package/lib/generates/internal/SdkHttpSimulationProgrammer.js +47 -49
- package/lib/generates/internal/SdkHttpSimulationProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkImportWizard.js.map +1 -1
- package/lib/generates/internal/SdkRouteDirectory.js.map +1 -1
- package/lib/generates/internal/SdkTypeProgrammer.d.ts +4 -4
- package/lib/generates/internal/SdkTypeProgrammer.js +66 -67
- package/lib/generates/internal/SdkTypeProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkTypeTagProgrammer.d.ts +1 -2
- package/lib/generates/internal/SdkTypeTagProgrammer.js +29 -11
- package/lib/generates/internal/SdkTypeTagProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.d.ts +2 -2
- package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js +55 -55
- package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkWebSocketParameterProgrammer.d.ts +3 -3
- package/lib/generates/internal/SdkWebSocketParameterProgrammer.js +9 -12
- package/lib/generates/internal/SdkWebSocketParameterProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkWebSocketRouteProgrammer.d.ts +2 -2
- package/lib/generates/internal/SdkWebSocketRouteProgrammer.js +43 -45
- package/lib/generates/internal/SdkWebSocketRouteProgrammer.js.map +1 -1
- package/lib/generates/internal/SwaggerDescriptionComposer.js.map +1 -1
- package/lib/generates/internal/SwaggerOperationComposer.d.ts +1 -1
- package/lib/generates/internal/SwaggerOperationComposer.js +5 -4
- package/lib/generates/internal/SwaggerOperationComposer.js.map +1 -1
- package/lib/generates/internal/SwaggerOperationParameterComposer.d.ts +0 -3
- package/lib/generates/internal/SwaggerOperationParameterComposer.js +19 -20
- package/lib/generates/internal/SwaggerOperationParameterComposer.js.map +1 -1
- package/lib/generates/internal/SwaggerOperationResponseComposer.d.ts +1 -1
- package/lib/generates/internal/SwaggerOperationResponseComposer.js +4 -3
- package/lib/generates/internal/SwaggerOperationResponseComposer.js.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/internal/legacy.d.ts +180 -0
- package/lib/internal/legacy.js +361 -0
- package/lib/internal/legacy.js.map +1 -0
- package/lib/structures/INestiaProject.d.ts +0 -2
- package/lib/{transformers → structures}/IOperationMetadata.d.ts +2 -7
- package/lib/structures/IOperationMetadata.js.map +1 -0
- package/lib/structures/IReflectHttpOperationException.d.ts +1 -1
- package/lib/structures/IReflectHttpOperationParameter.d.ts +1 -1
- package/lib/structures/IReflectHttpOperationSuccess.d.ts +1 -1
- package/lib/structures/IReflectOperationError.d.ts +1 -1
- package/lib/structures/IReflectOperationError.js.map +1 -1
- package/lib/structures/IReflectWebSocketOperation.d.ts +2 -2
- package/lib/structures/ITypedApplication.d.ts +1 -1
- package/lib/structures/ITypedHttpRouteException.d.ts +1 -1
- package/lib/structures/ITypedHttpRouteParameter.d.ts +1 -1
- package/lib/structures/ITypedHttpRouteSuccess.d.ts +1 -1
- package/lib/structures/ITypedWebSocketRoute.d.ts +2 -2
- package/lib/transform.d.ts +9 -3
- package/lib/transform.js +47 -5
- package/lib/transform.js.map +1 -1
- package/lib/utils/ArrayUtil.js.map +1 -1
- package/lib/utils/FileRetriever.js.map +1 -1
- package/lib/utils/MapUtil.js.map +1 -1
- package/lib/utils/PathUtil.js.map +1 -1
- package/lib/utils/SourceFinder.js.map +1 -1
- package/lib/utils/StringUtil.js.map +1 -1
- package/lib/utils/TsConfigReader.d.ts +7 -0
- package/lib/utils/TsConfigReader.js +102 -0
- package/lib/utils/TsConfigReader.js.map +1 -0
- package/lib/utils/TtscExecutor.d.ts +8 -0
- package/lib/utils/TtscExecutor.js +58 -0
- package/lib/utils/TtscExecutor.js.map +1 -0
- package/lib/utils/VersioningStrategy.js.map +1 -1
- package/lib/validators/HttpHeadersValidator.d.ts +8 -5
- package/lib/validators/HttpHeadersValidator.js +7 -26
- package/lib/validators/HttpHeadersValidator.js.map +1 -1
- package/lib/validators/HttpQueryValidator.d.ts +8 -5
- package/lib/validators/HttpQueryValidator.js +7 -26
- package/lib/validators/HttpQueryValidator.js.map +1 -1
- package/lib/{transformers → validators}/TextPlainValidator.d.ts +1 -1
- package/lib/{transformers → validators}/TextPlainValidator.js +2 -1
- package/lib/validators/TextPlainValidator.js.map +1 -0
- package/package.json +21 -19
- package/src/NestiaSdkApplication.ts +9 -5
- package/src/NestiaSwaggerComposer.ts +2 -3
- package/src/analyses/ConfigAnalyzer.ts +175 -1
- package/src/analyses/ImportAnalyzer.ts +15 -49
- package/src/analyses/ReflectControllerAnalyzer.ts +1 -1
- package/src/analyses/ReflectHttpOperationAnalyzer.ts +1 -1
- package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +24 -6
- package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +3 -3
- package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +14 -10
- package/src/analyses/ReflectWebSocketOperationAnalyzer.ts +2 -2
- package/src/analyses/TypedHttpRouteAnalyzer.ts +354 -22
- package/src/decorators/OperationMetadata.ts +1 -1
- package/src/executable/internal/NestiaConfigLoader.ts +419 -52
- package/src/executable/internal/NestiaSdkCommand.ts +9 -10
- package/src/executable/sdk.ts +15 -4
- package/src/generates/CloneGenerator.ts +10 -10
- package/src/generates/SwaggerGenerator.ts +28 -9
- package/src/generates/internal/E2eFileProgrammer.ts +80 -43
- package/src/generates/internal/FilePrinter.ts +38 -37
- package/src/generates/internal/ImportDictionary.ts +18 -16
- package/src/generates/internal/SdkAliasCollection.ts +41 -40
- package/src/generates/internal/SdkDistributionComposer.ts +21 -8
- package/src/generates/internal/SdkFileProgrammer.ts +7 -5
- package/src/generates/internal/SdkHttpCloneProgrammer.ts +10 -10
- package/src/generates/internal/SdkHttpCloneReferencer.ts +6 -6
- package/src/generates/internal/SdkHttpFunctionProgrammer.ts +101 -78
- package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +153 -145
- package/src/generates/internal/SdkHttpParameterProgrammer.ts +20 -33
- package/src/generates/internal/SdkHttpRouteProgrammer.ts +2 -2
- package/src/generates/internal/SdkHttpSimulationProgrammer.ts +88 -86
- package/src/generates/internal/SdkTypeProgrammer.ts +93 -99
- package/src/generates/internal/SdkTypeTagProgrammer.ts +12 -12
- package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +128 -118
- package/src/generates/internal/SdkWebSocketParameterProgrammer.ts +15 -13
- package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +133 -112
- package/src/generates/internal/SwaggerOperationComposer.ts +1 -1
- package/src/generates/internal/SwaggerOperationParameterComposer.ts +10 -9
- package/src/generates/internal/SwaggerOperationResponseComposer.ts +1 -1
- package/src/internal/legacy.ts +492 -0
- package/src/structures/INestiaProject.ts +0 -3
- package/src/{transformers → structures}/IOperationMetadata.ts +2 -7
- package/src/structures/IReflectHttpOperationException.ts +1 -1
- package/src/structures/IReflectHttpOperationParameter.ts +1 -1
- package/src/structures/IReflectHttpOperationSuccess.ts +1 -1
- package/src/structures/IReflectOperationError.ts +1 -1
- package/src/structures/IReflectWebSocketOperation.ts +2 -2
- package/src/structures/ITypedApplication.ts +1 -1
- package/src/structures/ITypedHttpRouteException.ts +1 -1
- package/src/structures/ITypedHttpRouteParameter.ts +1 -1
- package/src/structures/ITypedHttpRouteSuccess.ts +1 -1
- package/src/structures/ITypedWebSocketRoute.ts +2 -2
- package/src/transform.ts +68 -7
- package/src/utils/TsConfigReader.ts +108 -0
- package/src/utils/TtscExecutor.ts +63 -0
- package/src/validators/HttpHeadersValidator.ts +8 -37
- package/src/validators/HttpQueryValidator.ts +8 -37
- package/src/{transformers → validators}/TextPlainValidator.ts +2 -2
- package/lib/analyses/DtoAnalyzer.d.ts +0 -21
- package/lib/analyses/DtoAnalyzer.js +0 -219
- package/lib/analyses/DtoAnalyzer.js.map +0 -1
- package/lib/analyses/ExceptionAnalyzer.d.ts +0 -0
- package/lib/analyses/ExceptionAnalyzer.js +0 -2
- package/lib/analyses/ExceptionAnalyzer.js.map +0 -1
- package/lib/analyses/GenericAnalyzer.d.ts +0 -4
- package/lib/analyses/GenericAnalyzer.js +0 -42
- package/lib/analyses/GenericAnalyzer.js.map +0 -1
- package/lib/structures/IReflectApplication.d.ts +0 -6
- package/lib/structures/IReflectApplication.js +0 -3
- package/lib/structures/IReflectApplication.js.map +0 -1
- package/lib/structures/MethodType.d.ts +0 -4
- package/lib/structures/MethodType.js +0 -8
- package/lib/structures/MethodType.js.map +0 -1
- package/lib/structures/ParamCategory.d.ts +0 -1
- package/lib/structures/ParamCategory.js +0 -3
- package/lib/structures/ParamCategory.js.map +0 -1
- package/lib/structures/TypeEntry.d.ts +0 -9
- package/lib/structures/TypeEntry.js +0 -21
- package/lib/structures/TypeEntry.js.map +0 -1
- package/lib/transformers/IOperationMetadata.js.map +0 -1
- package/lib/transformers/ISdkOperationTransformerContext.d.ts +0 -7
- package/lib/transformers/ISdkOperationTransformerContext.js +0 -3
- package/lib/transformers/ISdkOperationTransformerContext.js.map +0 -1
- package/lib/transformers/SdkOperationProgrammer.d.ts +0 -15
- package/lib/transformers/SdkOperationProgrammer.js +0 -186
- package/lib/transformers/SdkOperationProgrammer.js.map +0 -1
- package/lib/transformers/SdkOperationTransformer.d.ts +0 -4
- package/lib/transformers/SdkOperationTransformer.js +0 -128
- package/lib/transformers/SdkOperationTransformer.js.map +0 -1
- package/lib/transformers/TextPlainValidator.js.map +0 -1
- package/lib/utils/MetadataUtil.d.ts +0 -4
- package/lib/utils/MetadataUtil.js +0 -34
- package/lib/utils/MetadataUtil.js.map +0 -1
- package/lib/utils/StripEnums.d.ts +0 -3
- package/lib/utils/StripEnums.js +0 -3
- package/lib/utils/StripEnums.js.map +0 -1
- package/lib/utils/TypeLiteralExpression.d.ts +0 -0
- package/lib/utils/TypeLiteralExpression.js +0 -2
- package/lib/utils/TypeLiteralExpression.js.map +0 -1
- package/src/analyses/DtoAnalyzer.ts +0 -260
- package/src/analyses/ExceptionAnalyzer.ts +0 -154
- package/src/analyses/GenericAnalyzer.ts +0 -49
- package/src/structures/IReflectApplication.ts +0 -8
- package/src/structures/MethodType.ts +0 -5
- package/src/structures/ParamCategory.ts +0 -1
- package/src/structures/TypeEntry.ts +0 -22
- package/src/transformers/ISdkOperationTransformerContext.ts +0 -8
- package/src/transformers/SdkOperationProgrammer.ts +0 -240
- package/src/transformers/SdkOperationTransformer.ts +0 -248
- package/src/utils/MetadataUtil.ts +0 -26
- package/src/utils/StripEnums.ts +0 -5
- package/src/utils/TypeLiteralExpression.ts +0 -0
- /package/lib/{transformers → structures}/IOperationMetadata.js +0 -0
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
IMetadataDictionary,
|
|
3
|
+
MetadataAliasType,
|
|
4
|
+
MetadataArrayType,
|
|
3
5
|
MetadataComponents,
|
|
4
6
|
MetadataFactory,
|
|
5
7
|
MetadataObjectType,
|
|
6
8
|
MetadataSchema,
|
|
7
|
-
|
|
9
|
+
MetadataTupleType,
|
|
10
|
+
} from "../internal/legacy";
|
|
8
11
|
import { NamingConvention } from "@typia/utils";
|
|
9
12
|
import { IMetadataComponents, IMetadataSchema } from "typia";
|
|
10
13
|
|
|
@@ -31,26 +34,10 @@ export namespace TypedHttpRouteAnalyzer {
|
|
|
31
34
|
individual.push(e.components);
|
|
32
35
|
}
|
|
33
36
|
const components: MetadataComponents = MetadataComponents.from({
|
|
34
|
-
objects:
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
),
|
|
39
|
-
arrays: Object.values(
|
|
40
|
-
Object.fromEntries(
|
|
41
|
-
individual.map((c) => c.arrays.map((a) => [a.name, a])).flat(),
|
|
42
|
-
),
|
|
43
|
-
),
|
|
44
|
-
tuples: Object.values(
|
|
45
|
-
Object.fromEntries(
|
|
46
|
-
individual.map((c) => c.tuples.map((t) => [t.name, t])).flat(),
|
|
47
|
-
),
|
|
48
|
-
),
|
|
49
|
-
aliases: Object.values(
|
|
50
|
-
Object.fromEntries(
|
|
51
|
-
individual.map((c) => c.aliases.map((a) => [a.name, a])).flat(),
|
|
52
|
-
),
|
|
53
|
-
),
|
|
37
|
+
objects: uniqueComponents(individual.flatMap((c) => c.objects)),
|
|
38
|
+
arrays: uniqueComponents(individual.flatMap((c) => c.arrays)),
|
|
39
|
+
tuples: uniqueComponents(individual.flatMap((c) => c.tuples)),
|
|
40
|
+
aliases: uniqueComponents(individual.flatMap((c) => c.aliases)),
|
|
54
41
|
});
|
|
55
42
|
return components.dictionary;
|
|
56
43
|
};
|
|
@@ -66,14 +53,18 @@ export namespace TypedHttpRouteAnalyzer {
|
|
|
66
53
|
const cast = (
|
|
67
54
|
next: {
|
|
68
55
|
metadata: IMetadataSchema;
|
|
56
|
+
components: IMetadataComponents;
|
|
69
57
|
validate: MetadataFactory.Validator;
|
|
70
58
|
},
|
|
71
59
|
from: string,
|
|
72
60
|
escape: boolean,
|
|
73
61
|
): MetadataSchema => {
|
|
62
|
+
const components: MetadataComponents = MetadataComponents.from(
|
|
63
|
+
next.components,
|
|
64
|
+
);
|
|
74
65
|
const metadata: MetadataSchema = MetadataSchema.from(
|
|
75
66
|
next.metadata,
|
|
76
|
-
|
|
67
|
+
components.dictionary,
|
|
77
68
|
);
|
|
78
69
|
const metaErrors: MetadataFactory.IError[] = MetadataFactory.validate({
|
|
79
70
|
options: {
|
|
@@ -192,8 +183,349 @@ export namespace TypedHttpRouteAnalyzer {
|
|
|
192
183
|
}) satisfies ITypedHttpRoute,
|
|
193
184
|
);
|
|
194
185
|
};
|
|
186
|
+
|
|
187
|
+
export const routeDictionary = (
|
|
188
|
+
routes: Array<ITypedHttpRoute>,
|
|
189
|
+
): IMetadataDictionary => {
|
|
190
|
+
renameDuplicateComponents(routes);
|
|
191
|
+
const dictionary: IMetadataDictionary = {
|
|
192
|
+
objects: new Map(),
|
|
193
|
+
aliases: new Map(),
|
|
194
|
+
arrays: new Map(),
|
|
195
|
+
tuples: new Map(),
|
|
196
|
+
};
|
|
197
|
+
for (const route of routes) {
|
|
198
|
+
for (const p of [
|
|
199
|
+
...route.pathParameters,
|
|
200
|
+
...route.queryParameters,
|
|
201
|
+
...route.headerParameters,
|
|
202
|
+
...(route.queryObject ? [route.queryObject] : []),
|
|
203
|
+
...(route.body ? [route.body] : []),
|
|
204
|
+
...(route.headerObject ? [route.headerObject] : []),
|
|
205
|
+
])
|
|
206
|
+
enrollMetadata(dictionary, p.metadata);
|
|
207
|
+
for (const e of Object.values(route.exceptions))
|
|
208
|
+
enrollMetadata(dictionary, e.metadata);
|
|
209
|
+
enrollMetadata(dictionary, route.success.metadata);
|
|
210
|
+
}
|
|
211
|
+
return dictionary;
|
|
212
|
+
};
|
|
195
213
|
}
|
|
196
214
|
|
|
215
|
+
type ComponentKind = "objects" | "aliases" | "arrays" | "tuples";
|
|
216
|
+
type ComponentType =
|
|
217
|
+
| MetadataObjectType
|
|
218
|
+
| MetadataAliasType
|
|
219
|
+
| MetadataArrayType
|
|
220
|
+
| MetadataTupleType;
|
|
221
|
+
|
|
222
|
+
interface IComponentEntry {
|
|
223
|
+
kind: ComponentKind;
|
|
224
|
+
route: ITypedHttpRoute;
|
|
225
|
+
signature: string;
|
|
226
|
+
type: ComponentType;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
const renameDuplicateComponents = (routes: ITypedHttpRoute[]): void => {
|
|
230
|
+
const entries: IComponentEntry[] = [];
|
|
231
|
+
for (const route of routes)
|
|
232
|
+
for (const metadata of routeMetadatas(route))
|
|
233
|
+
collectComponentEntries(entries, route, metadata);
|
|
234
|
+
|
|
235
|
+
const used: Set<string> = new Set(entries.map((e) => e.type!.name));
|
|
236
|
+
const groups: Map<string, IComponentEntry[]> = new Map();
|
|
237
|
+
for (const entry of entries) {
|
|
238
|
+
const key: string = `${entry.kind}:${entry.type!.name}`;
|
|
239
|
+
const group: IComponentEntry[] | undefined = groups.get(key);
|
|
240
|
+
if (group === undefined) groups.set(key, [entry]);
|
|
241
|
+
else group.push(entry);
|
|
242
|
+
}
|
|
243
|
+
for (const group of groups.values()) {
|
|
244
|
+
const signatures: Set<string> = new Set(group.map((e) => e.signature));
|
|
245
|
+
if (signatures.size <= 1) continue;
|
|
246
|
+
|
|
247
|
+
const renamed: Map<string, string> = new Map();
|
|
248
|
+
for (const entry of group) {
|
|
249
|
+
const oldName: string = entry.type!.name;
|
|
250
|
+
const next: string =
|
|
251
|
+
renamed.get(entry.signature) ??
|
|
252
|
+
(() => {
|
|
253
|
+
const prefix: string = normalizeComponentNamespace(
|
|
254
|
+
entry.route.controller.class.name,
|
|
255
|
+
);
|
|
256
|
+
const name: string = escapeComponentName(
|
|
257
|
+
used,
|
|
258
|
+
`${prefix}.${oldName}`,
|
|
259
|
+
);
|
|
260
|
+
renamed.set(entry.signature, name);
|
|
261
|
+
used.add(name);
|
|
262
|
+
return name;
|
|
263
|
+
})();
|
|
264
|
+
(entry.type as { name: string }).name = next;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
for (const route of routes)
|
|
268
|
+
for (const metadata of routeMetadatas(route)) clearMetadataNameCache(metadata);
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
const routeMetadatas = (route: ITypedHttpRoute): MetadataSchema[] => [
|
|
272
|
+
...[
|
|
273
|
+
...route.pathParameters,
|
|
274
|
+
...route.queryParameters,
|
|
275
|
+
...route.headerParameters,
|
|
276
|
+
...(route.queryObject ? [route.queryObject] : []),
|
|
277
|
+
...(route.body ? [route.body] : []),
|
|
278
|
+
...(route.headerObject ? [route.headerObject] : []),
|
|
279
|
+
].map((p) => p.metadata),
|
|
280
|
+
...Object.values(route.exceptions).map((e) => e.metadata),
|
|
281
|
+
route.success.metadata,
|
|
282
|
+
];
|
|
283
|
+
|
|
284
|
+
const collectComponentEntries = (
|
|
285
|
+
entries: IComponentEntry[],
|
|
286
|
+
route: ITypedHttpRoute,
|
|
287
|
+
metadata: MetadataSchema,
|
|
288
|
+
visited: ICollectVisited = createCollectVisited(),
|
|
289
|
+
): void => {
|
|
290
|
+
if (visited.schemas.has(metadata)) return;
|
|
291
|
+
visited.schemas.add(metadata);
|
|
292
|
+
|
|
293
|
+
if (metadata.rest !== null)
|
|
294
|
+
collectComponentEntries(entries, route, metadata.rest, visited);
|
|
295
|
+
if (metadata.escaped !== null) {
|
|
296
|
+
collectComponentEntries(entries, route, metadata.escaped.original, visited);
|
|
297
|
+
collectComponentEntries(entries, route, metadata.escaped.returns, visited);
|
|
298
|
+
}
|
|
299
|
+
for (const func of metadata.functions) {
|
|
300
|
+
for (const p of func.parameters)
|
|
301
|
+
collectComponentEntries(entries, route, p.type, visited);
|
|
302
|
+
collectComponentEntries(entries, route, func.output, visited);
|
|
303
|
+
}
|
|
304
|
+
for (const set of metadata.sets)
|
|
305
|
+
collectComponentEntries(entries, route, set.value, visited);
|
|
306
|
+
for (const map of metadata.maps) {
|
|
307
|
+
collectComponentEntries(entries, route, map.key, visited);
|
|
308
|
+
collectComponentEntries(entries, route, map.value, visited);
|
|
309
|
+
}
|
|
310
|
+
for (const array of metadata.arrays)
|
|
311
|
+
if (visited.arrays.has((array.type as MetadataArrayType)) === false) {
|
|
312
|
+
visited.arrays.add((array.type as MetadataArrayType));
|
|
313
|
+
entries.push(componentEntry(route, "arrays", (array.type as MetadataArrayType)));
|
|
314
|
+
collectComponentEntries(entries, route, ((array.type as MetadataArrayType) as MetadataArrayType).value, visited);
|
|
315
|
+
}
|
|
316
|
+
for (const tuple of metadata.tuples)
|
|
317
|
+
if (visited.tuples.has((tuple.type as MetadataTupleType)) === false) {
|
|
318
|
+
visited.tuples.add((tuple.type as MetadataTupleType));
|
|
319
|
+
entries.push(componentEntry(route, "tuples", (tuple.type as MetadataTupleType)));
|
|
320
|
+
for (const elem of ((tuple.type as MetadataTupleType) as MetadataTupleType).elements)
|
|
321
|
+
collectComponentEntries(entries, route, elem, visited);
|
|
322
|
+
}
|
|
323
|
+
for (const alias of metadata.aliases)
|
|
324
|
+
if (visited.aliases.has((alias.type as MetadataAliasType)) === false) {
|
|
325
|
+
visited.aliases.add((alias.type as MetadataAliasType));
|
|
326
|
+
entries.push(componentEntry(route, "aliases", (alias.type as MetadataAliasType)));
|
|
327
|
+
collectComponentEntries(entries, route, ((alias.type as MetadataAliasType) as MetadataAliasType).value, visited);
|
|
328
|
+
}
|
|
329
|
+
for (const obj of metadata.objects)
|
|
330
|
+
if (visited.objects.has((obj.type as MetadataObjectType)) === false) {
|
|
331
|
+
visited.objects.add((obj.type as MetadataObjectType));
|
|
332
|
+
entries.push(componentEntry(route, "objects", (obj.type as MetadataObjectType)));
|
|
333
|
+
for (const p of ((obj.type as MetadataObjectType) as MetadataObjectType).properties) {
|
|
334
|
+
collectComponentEntries(entries, route, p.key, visited);
|
|
335
|
+
collectComponentEntries(entries, route, p.value, visited);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
const componentEntry = <T extends ComponentType>(
|
|
341
|
+
route: ITypedHttpRoute,
|
|
342
|
+
kind: ComponentKind,
|
|
343
|
+
type: T,
|
|
344
|
+
): IComponentEntry => ({
|
|
345
|
+
kind,
|
|
346
|
+
route,
|
|
347
|
+
signature: componentSignature(type),
|
|
348
|
+
type,
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
const componentSignature = (type: ComponentType): string =>
|
|
352
|
+
JSON.stringify(type, (key, value) =>
|
|
353
|
+
// `type` is the resolved back-reference attached by
|
|
354
|
+
// `MetadataSchema.from`; it closes a cycle on recursive schemas.
|
|
355
|
+
// `index` carries the per-route ordinal and is not part of the
|
|
356
|
+
// component's identity.
|
|
357
|
+
key === "index" || key === "type" ? undefined : value,
|
|
358
|
+
);
|
|
359
|
+
|
|
360
|
+
const normalizeComponentNamespace = (name: string): string => {
|
|
361
|
+
const next: string = name.replace(/[^A-Za-z0-9_$]/g, "_");
|
|
362
|
+
return next.length ? next : "Route";
|
|
363
|
+
};
|
|
364
|
+
|
|
365
|
+
const escapeComponentName = (used: Set<string>, name: string): string =>
|
|
366
|
+
used.has(name) ? escapeComponentName(used, `_${name}`) : name;
|
|
367
|
+
|
|
368
|
+
const clearMetadataNameCache = (
|
|
369
|
+
metadata: MetadataSchema,
|
|
370
|
+
visited: WeakSet<MetadataSchema> = new WeakSet(),
|
|
371
|
+
): void => {
|
|
372
|
+
if (visited.has(metadata)) return;
|
|
373
|
+
visited.add(metadata);
|
|
374
|
+
(metadata as unknown as { name_?: string }).name_ = undefined;
|
|
375
|
+
|
|
376
|
+
if (metadata.rest !== null) clearMetadataNameCache(metadata.rest, visited);
|
|
377
|
+
if (metadata.escaped !== null) {
|
|
378
|
+
clearMetadataNameCache(metadata.escaped.original, visited);
|
|
379
|
+
clearMetadataNameCache(metadata.escaped.returns, visited);
|
|
380
|
+
}
|
|
381
|
+
for (const func of metadata.functions) {
|
|
382
|
+
for (const p of func.parameters) clearMetadataNameCache(p.type, visited);
|
|
383
|
+
clearMetadataNameCache(func.output, visited);
|
|
384
|
+
}
|
|
385
|
+
for (const set of metadata.sets) {
|
|
386
|
+
(set as unknown as { name_?: string }).name_ = undefined;
|
|
387
|
+
clearMetadataNameCache(set.value, visited);
|
|
388
|
+
}
|
|
389
|
+
for (const map of metadata.maps) {
|
|
390
|
+
(map as unknown as { name_?: string }).name_ = undefined;
|
|
391
|
+
clearMetadataNameCache(map.key, visited);
|
|
392
|
+
clearMetadataNameCache(map.value, visited);
|
|
393
|
+
}
|
|
394
|
+
for (const array of metadata.arrays) {
|
|
395
|
+
(array as unknown as { name_?: string }).name_ = undefined;
|
|
396
|
+
clearMetadataNameCache(((array.type as MetadataArrayType) as MetadataArrayType).value, visited);
|
|
397
|
+
}
|
|
398
|
+
for (const tuple of metadata.tuples) {
|
|
399
|
+
(tuple as unknown as { name_?: string }).name_ = undefined;
|
|
400
|
+
for (const elem of ((tuple.type as MetadataTupleType) as MetadataTupleType).elements)
|
|
401
|
+
clearMetadataNameCache(elem, visited);
|
|
402
|
+
}
|
|
403
|
+
for (const alias of metadata.aliases) {
|
|
404
|
+
(alias as unknown as { name_?: string }).name_ = undefined;
|
|
405
|
+
clearMetadataNameCache(((alias.type as MetadataAliasType) as MetadataAliasType).value, visited);
|
|
406
|
+
}
|
|
407
|
+
for (const obj of metadata.objects) {
|
|
408
|
+
(obj as unknown as { name_?: string }).name_ = undefined;
|
|
409
|
+
for (const p of ((obj.type as MetadataObjectType) as MetadataObjectType).properties) {
|
|
410
|
+
clearMetadataNameCache(p.key, visited);
|
|
411
|
+
clearMetadataNameCache(p.value, visited);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
};
|
|
415
|
+
|
|
416
|
+
interface ICollectVisited {
|
|
417
|
+
aliases: WeakSet<MetadataAliasType>;
|
|
418
|
+
arrays: WeakSet<MetadataArrayType>;
|
|
419
|
+
objects: WeakSet<MetadataObjectType>;
|
|
420
|
+
schemas: WeakSet<MetadataSchema>;
|
|
421
|
+
tuples: WeakSet<MetadataTupleType>;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
const createCollectVisited = (): ICollectVisited => ({
|
|
425
|
+
aliases: new WeakSet<MetadataAliasType>(),
|
|
426
|
+
arrays: new WeakSet<MetadataArrayType>(),
|
|
427
|
+
objects: new WeakSet<MetadataObjectType>(),
|
|
428
|
+
schemas: new WeakSet<MetadataSchema>(),
|
|
429
|
+
tuples: new WeakSet<MetadataTupleType>(),
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
const uniqueComponents = <T extends { name: string }>(input: T[]): T[] => {
|
|
433
|
+
const dict: Record<string, T> = {};
|
|
434
|
+
for (const elem of input) {
|
|
435
|
+
const oldbie: T | undefined = dict[elem.name];
|
|
436
|
+
if (oldbie === undefined)
|
|
437
|
+
dict[elem.name] = elem;
|
|
438
|
+
else if (
|
|
439
|
+
elem.name.includes(".") ||
|
|
440
|
+
componentScore(oldbie) < componentScore(elem)
|
|
441
|
+
)
|
|
442
|
+
dict[elem.name] = elem;
|
|
443
|
+
}
|
|
444
|
+
return Object.values(dict);
|
|
445
|
+
};
|
|
446
|
+
|
|
447
|
+
const componentScore = (input: unknown): number =>
|
|
448
|
+
JSON.stringify(input, (key, value) =>
|
|
449
|
+
// Resolved-reference back-edges close cycles on recursive schemas;
|
|
450
|
+
// skip them when scoring component "richness".
|
|
451
|
+
key === "type" ? undefined : value,
|
|
452
|
+
).length;
|
|
453
|
+
|
|
454
|
+
const enrollMetadata = (
|
|
455
|
+
dictionary: IMetadataDictionary,
|
|
456
|
+
metadata: MetadataSchema,
|
|
457
|
+
visited: IVisitedMetadata = createVisitedMetadata(),
|
|
458
|
+
): void => {
|
|
459
|
+
if (visited.schemas.has(metadata)) return;
|
|
460
|
+
visited.schemas.add(metadata);
|
|
461
|
+
|
|
462
|
+
if (metadata.rest !== null) enrollMetadata(dictionary, metadata.rest, visited);
|
|
463
|
+
if (metadata.escaped !== null) {
|
|
464
|
+
enrollMetadata(dictionary, metadata.escaped.original, visited);
|
|
465
|
+
enrollMetadata(dictionary, metadata.escaped.returns, visited);
|
|
466
|
+
}
|
|
467
|
+
for (const func of metadata.functions) {
|
|
468
|
+
for (const p of func.parameters)
|
|
469
|
+
enrollMetadata(dictionary, p.type, visited);
|
|
470
|
+
enrollMetadata(dictionary, func.output, visited);
|
|
471
|
+
}
|
|
472
|
+
for (const set of metadata.sets)
|
|
473
|
+
enrollMetadata(dictionary, set.value, visited);
|
|
474
|
+
for (const map of metadata.maps) {
|
|
475
|
+
enrollMetadata(dictionary, map.key, visited);
|
|
476
|
+
enrollMetadata(dictionary, map.value, visited);
|
|
477
|
+
}
|
|
478
|
+
for (const array of metadata.arrays)
|
|
479
|
+
if (enroll(dictionary.arrays, (array.type as MetadataArrayType)))
|
|
480
|
+
enrollMetadata(dictionary, ((array.type as MetadataArrayType) as MetadataArrayType).value, visited);
|
|
481
|
+
for (const tuple of metadata.tuples)
|
|
482
|
+
if (enroll(dictionary.tuples, (tuple.type as MetadataTupleType)))
|
|
483
|
+
for (const elem of ((tuple.type as MetadataTupleType) as MetadataTupleType).elements)
|
|
484
|
+
enrollMetadata(dictionary, elem, visited);
|
|
485
|
+
for (const alias of metadata.aliases)
|
|
486
|
+
if (enroll(dictionary.aliases, (alias.type as MetadataAliasType)))
|
|
487
|
+
enrollMetadata(dictionary, ((alias.type as MetadataAliasType) as MetadataAliasType).value, visited);
|
|
488
|
+
for (const obj of metadata.objects)
|
|
489
|
+
if (enroll(dictionary.objects, (obj.type as MetadataObjectType)))
|
|
490
|
+
for (const p of ((obj.type as MetadataObjectType) as MetadataObjectType).properties) {
|
|
491
|
+
enrollMetadata(dictionary, p.key, visited);
|
|
492
|
+
enrollMetadata(dictionary, p.value, visited);
|
|
493
|
+
}
|
|
494
|
+
};
|
|
495
|
+
|
|
496
|
+
const enroll = <
|
|
497
|
+
T extends
|
|
498
|
+
| MetadataObjectType
|
|
499
|
+
| MetadataAliasType
|
|
500
|
+
| MetadataArrayType
|
|
501
|
+
| MetadataTupleType,
|
|
502
|
+
>(
|
|
503
|
+
dict: Map<string, T>,
|
|
504
|
+
elem: T,
|
|
505
|
+
): boolean => {
|
|
506
|
+
const oldbie: T | undefined = dict.get(elem.name);
|
|
507
|
+
if (oldbie === elem) return false;
|
|
508
|
+
if (oldbie === undefined) {
|
|
509
|
+
dict.set(elem.name, elem);
|
|
510
|
+
return true;
|
|
511
|
+
} else if (
|
|
512
|
+
elem.name.includes(".") ||
|
|
513
|
+
componentScore(oldbie) < componentScore(elem)
|
|
514
|
+
) {
|
|
515
|
+
dict.set(elem.name, elem);
|
|
516
|
+
return true;
|
|
517
|
+
}
|
|
518
|
+
return false;
|
|
519
|
+
};
|
|
520
|
+
|
|
521
|
+
interface IVisitedMetadata {
|
|
522
|
+
schemas: WeakSet<MetadataSchema>;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
const createVisitedMetadata = (): IVisitedMetadata => ({
|
|
526
|
+
schemas: new WeakSet<MetadataSchema>(),
|
|
527
|
+
});
|
|
528
|
+
|
|
197
529
|
const join = ({
|
|
198
530
|
object,
|
|
199
531
|
key,
|