@nestia/sdk 14.0.1 → 14.0.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/assets/bundle/distribute/build-sdk.cjs +28 -0
- package/assets/bundle/distribute/package.json +6 -2
- package/lib/INestiaConfig.d.ts +55 -24
- package/lib/NestiaSdkApplication.d.ts +60 -0
- package/lib/NestiaSdkApplication.js +63 -5
- package/lib/NestiaSdkApplication.js.map +1 -1
- package/lib/NestiaSwaggerComposer.d.ts +21 -0
- package/lib/NestiaSwaggerComposer.js +21 -3
- package/lib/NestiaSwaggerComposer.js.map +1 -1
- package/lib/analyses/AccessorAnalyzer.d.ts +26 -0
- package/lib/analyses/AccessorAnalyzer.js +26 -0
- package/lib/analyses/AccessorAnalyzer.js.map +1 -1
- package/lib/analyses/ConfigAnalyzer.d.ts +41 -0
- package/lib/analyses/ConfigAnalyzer.js +48 -73
- package/lib/analyses/ConfigAnalyzer.js.map +1 -1
- package/lib/analyses/ImportAnalyzer.d.ts +25 -0
- package/lib/analyses/ImportAnalyzer.js +25 -0
- package/lib/analyses/ImportAnalyzer.js.map +1 -1
- package/lib/analyses/ParameterNameAnalyzer.d.ts +24 -0
- package/lib/analyses/ParameterNameAnalyzer.js +15 -0
- package/lib/analyses/ParameterNameAnalyzer.js.map +1 -1
- package/lib/analyses/PathAnalyzer.d.ts +63 -1
- package/lib/analyses/PathAnalyzer.js +54 -9
- package/lib/analyses/PathAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectControllerAnalyzer.d.ts +32 -0
- package/lib/analyses/ReflectControllerAnalyzer.js +22 -0
- package/lib/analyses/ReflectControllerAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectHttpOperationAnalyzer.d.ts +29 -0
- package/lib/analyses/ReflectHttpOperationAnalyzer.js +28 -17
- package/lib/analyses/ReflectHttpOperationAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectHttpOperationExceptionAnalyzer.d.ts +31 -0
- package/lib/analyses/ReflectHttpOperationExceptionAnalyzer.js +21 -0
- package/lib/analyses/ReflectHttpOperationExceptionAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectHttpOperationParameterAnalyzer.d.ts +31 -0
- package/lib/analyses/ReflectHttpOperationParameterAnalyzer.js +21 -0
- package/lib/analyses/ReflectHttpOperationParameterAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectHttpOperationResponseAnalyzer.d.ts +32 -0
- package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js +22 -0
- package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectMcpOperationAnalyzer.d.ts +29 -0
- package/lib/analyses/ReflectMcpOperationAnalyzer.js +30 -9
- package/lib/analyses/ReflectMcpOperationAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectMetadataAnalyzer.d.ts +47 -0
- package/lib/analyses/ReflectMetadataAnalyzer.js +47 -0
- package/lib/analyses/ReflectMetadataAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectWebSocketOperationAnalyzer.d.ts +29 -0
- package/lib/analyses/ReflectWebSocketOperationAnalyzer.js +21 -2
- package/lib/analyses/ReflectWebSocketOperationAnalyzer.js.map +1 -1
- package/lib/analyses/SecurityAnalyzer.d.ts +15 -0
- package/lib/analyses/SecurityAnalyzer.js +15 -0
- package/lib/analyses/SecurityAnalyzer.js.map +1 -1
- package/lib/analyses/SwaggerExampleAnalyzer.d.ts +16 -0
- package/lib/analyses/SwaggerExampleAnalyzer.js +16 -0
- package/lib/analyses/SwaggerExampleAnalyzer.js.map +1 -1
- package/lib/analyses/TypedHttpRouteAnalyzer.d.ts +41 -3
- package/lib/analyses/TypedHttpRouteAnalyzer.js +172 -157
- package/lib/analyses/TypedHttpRouteAnalyzer.js.map +1 -1
- package/lib/analyses/TypedMcpRouteAnalyzer.d.ts +29 -0
- package/lib/analyses/TypedMcpRouteAnalyzer.js +152 -20
- package/lib/analyses/TypedMcpRouteAnalyzer.js.map +1 -1
- package/lib/analyses/TypedWebSocketRouteAnalyzer.d.ts +19 -0
- package/lib/analyses/TypedWebSocketRouteAnalyzer.js +19 -0
- package/lib/analyses/TypedWebSocketRouteAnalyzer.js.map +1 -1
- package/lib/decorators/OperationMetadata.d.ts +6 -0
- package/lib/decorators/OperationMetadata.js +6 -0
- package/lib/decorators/OperationMetadata.js.map +1 -1
- package/lib/executable/internal/CommandParser.d.ts +19 -0
- package/lib/executable/internal/CommandParser.js +19 -0
- package/lib/executable/internal/CommandParser.js.map +1 -1
- package/lib/executable/internal/NestiaConfigLoader.d.ts +56 -0
- package/lib/executable/internal/NestiaConfigLoader.js +48 -42
- package/lib/executable/internal/NestiaConfigLoader.js.map +1 -1
- package/lib/executable/internal/NestiaSdkCommand.d.ts +60 -0
- package/lib/executable/internal/NestiaSdkCommand.js +95 -3
- package/lib/executable/internal/NestiaSdkCommand.js.map +1 -1
- package/lib/executable/internal/NestiaSdkWatcher.d.ts +81 -0
- package/lib/executable/internal/NestiaSdkWatcher.js +122 -38
- package/lib/executable/internal/NestiaSdkWatcher.js.map +1 -1
- package/lib/executable/internal/NestiaSwaggerWatch.d.ts +80 -0
- package/lib/executable/internal/NestiaSwaggerWatch.js +308 -0
- package/lib/executable/internal/NestiaSwaggerWatch.js.map +1 -0
- package/lib/factories/ExpressionFactory.d.ts +17 -2
- package/lib/factories/ExpressionFactory.js +17 -2
- package/lib/factories/ExpressionFactory.js.map +1 -1
- package/lib/factories/IdentifierFactory.d.ts +24 -0
- package/lib/factories/IdentifierFactory.js +24 -0
- package/lib/factories/IdentifierFactory.js.map +1 -1
- package/lib/factories/LiteralFactory.d.ts +22 -4
- package/lib/factories/LiteralFactory.js +30 -10
- package/lib/factories/LiteralFactory.js.map +1 -1
- package/lib/factories/StatementFactory.d.ts +28 -1
- package/lib/factories/StatementFactory.js +28 -1
- package/lib/factories/StatementFactory.js.map +1 -1
- package/lib/factories/TypeFactory.d.ts +24 -0
- package/lib/factories/TypeFactory.js +15 -0
- package/lib/factories/TypeFactory.js.map +1 -1
- package/lib/generates/CloneGenerator.d.ts +22 -0
- package/lib/generates/CloneGenerator.js +26 -5
- package/lib/generates/CloneGenerator.js.map +1 -1
- package/lib/generates/E2eGenerator.d.ts +19 -0
- package/lib/generates/E2eGenerator.js +19 -0
- package/lib/generates/E2eGenerator.js.map +1 -1
- package/lib/generates/SdkGenerator.d.ts +38 -0
- package/lib/generates/SdkGenerator.js +40 -2
- package/lib/generates/SdkGenerator.js.map +1 -1
- package/lib/generates/SwaggerGenerator.d.ts +36 -6
- package/lib/generates/SwaggerGenerator.js +55 -13
- package/lib/generates/SwaggerGenerator.js.map +1 -1
- package/lib/generates/internal/E2eFileProgrammer.d.ts +19 -0
- package/lib/generates/internal/E2eFileProgrammer.js +20 -1
- package/lib/generates/internal/E2eFileProgrammer.js.map +1 -1
- package/lib/generates/internal/FilePrinter.d.ts +43 -0
- package/lib/generates/internal/FilePrinter.js +43 -0
- package/lib/generates/internal/FilePrinter.js.map +1 -1
- package/lib/generates/internal/ImportDictionary.d.ts +92 -2
- package/lib/generates/internal/ImportDictionary.js +91 -3
- package/lib/generates/internal/ImportDictionary.js.map +1 -1
- package/lib/generates/internal/SdkAliasCollection.d.ts +119 -0
- package/lib/generates/internal/SdkAliasCollection.js +124 -7
- package/lib/generates/internal/SdkAliasCollection.js.map +1 -1
- package/lib/generates/internal/SdkDistributionComposer.d.ts +19 -0
- package/lib/generates/internal/SdkDistributionComposer.js +98 -59
- package/lib/generates/internal/SdkDistributionComposer.js.map +1 -1
- package/lib/generates/internal/SdkFileProgrammer.d.ts +18 -0
- package/lib/generates/internal/SdkFileProgrammer.js +18 -0
- package/lib/generates/internal/SdkFileProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpCloneProgrammer.d.ts +29 -0
- package/lib/generates/internal/SdkHttpCloneProgrammer.js +33 -0
- package/lib/generates/internal/SdkHttpCloneProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpCloneReferencer.d.ts +19 -0
- package/lib/generates/internal/SdkHttpCloneReferencer.js +78 -25
- package/lib/generates/internal/SdkHttpCloneReferencer.js.map +1 -1
- package/lib/generates/internal/SdkHttpFunctionProgrammer.d.ts +19 -0
- package/lib/generates/internal/SdkHttpFunctionProgrammer.js +19 -0
- package/lib/generates/internal/SdkHttpFunctionProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpNamespaceProgrammer.d.ts +19 -0
- package/lib/generates/internal/SdkHttpNamespaceProgrammer.js +19 -0
- package/lib/generates/internal/SdkHttpNamespaceProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpParameterProgrammer.d.ts +104 -2
- package/lib/generates/internal/SdkHttpParameterProgrammer.js +70 -0
- package/lib/generates/internal/SdkHttpParameterProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpRouteProgrammer.d.ts +20 -0
- package/lib/generates/internal/SdkHttpRouteProgrammer.js +20 -0
- package/lib/generates/internal/SdkHttpRouteProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpSimulationProgrammer.d.ts +38 -0
- package/lib/generates/internal/SdkHttpSimulationProgrammer.js +49 -5
- package/lib/generates/internal/SdkHttpSimulationProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkImportWizard.d.ts +63 -0
- package/lib/generates/internal/SdkImportWizard.js +63 -0
- package/lib/generates/internal/SdkImportWizard.js.map +1 -1
- package/lib/generates/internal/SdkMcpRouteProgrammer.d.ts +17 -2
- package/lib/generates/internal/SdkMcpRouteProgrammer.js +33 -13
- package/lib/generates/internal/SdkMcpRouteProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkPathTemplate.d.ts +15 -0
- package/lib/generates/internal/SdkPathTemplate.js +15 -0
- package/lib/generates/internal/SdkPathTemplate.js.map +1 -1
- package/lib/generates/internal/SdkRouteDirectory.d.ts +10 -0
- package/lib/generates/internal/SdkRouteDirectory.js +10 -0
- package/lib/generates/internal/SdkRouteDirectory.js.map +1 -1
- package/lib/generates/internal/SdkTypeProgrammer.d.ts +54 -1
- package/lib/generates/internal/SdkTypeProgrammer.js +96 -12
- package/lib/generates/internal/SdkTypeProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkTypeTagProgrammer.d.ts +36 -3
- package/lib/generates/internal/SdkTypeTagProgrammer.js +28 -7
- package/lib/generates/internal/SdkTypeTagProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkWebSocketCloneProgrammer.d.ts +40 -0
- package/lib/generates/internal/SdkWebSocketCloneProgrammer.js +149 -142
- package/lib/generates/internal/SdkWebSocketCloneProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.d.ts +19 -0
- package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js +19 -0
- package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkWebSocketParameterProgrammer.d.ts +81 -2
- package/lib/generates/internal/SdkWebSocketParameterProgrammer.js +48 -0
- package/lib/generates/internal/SdkWebSocketParameterProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkWebSocketRouteProgrammer.d.ts +18 -0
- package/lib/generates/internal/SdkWebSocketRouteProgrammer.js +18 -0
- package/lib/generates/internal/SdkWebSocketRouteProgrammer.js.map +1 -1
- package/lib/generates/internal/SwaggerDescriptionComposer.d.ts +42 -0
- package/lib/generates/internal/SwaggerDescriptionComposer.js +44 -1
- package/lib/generates/internal/SwaggerDescriptionComposer.js.map +1 -1
- package/lib/generates/internal/SwaggerOperationComposer.d.ts +18 -0
- package/lib/generates/internal/SwaggerOperationComposer.js +18 -0
- package/lib/generates/internal/SwaggerOperationComposer.js.map +1 -1
- package/lib/generates/internal/SwaggerOperationParameterComposer.d.ts +39 -0
- package/lib/generates/internal/SwaggerOperationParameterComposer.js +31 -8
- package/lib/generates/internal/SwaggerOperationParameterComposer.js.map +1 -1
- package/lib/generates/internal/SwaggerOperationResponseComposer.d.ts +19 -0
- package/lib/generates/internal/SwaggerOperationResponseComposer.js +19 -0
- package/lib/generates/internal/SwaggerOperationResponseComposer.js.map +1 -1
- package/lib/internal/legacy.d.ts +296 -16
- package/lib/internal/legacy.js +127 -10
- package/lib/internal/legacy.js.map +1 -1
- package/lib/structures/INestiaProject.d.ts +10 -0
- package/lib/structures/INestiaSdkInput.d.ts +30 -0
- package/lib/structures/IOperationMetadata.d.ts +55 -0
- package/lib/structures/IReflectController.d.ts +10 -0
- package/lib/structures/IReflectHttpOperation.d.ts +10 -0
- package/lib/structures/IReflectHttpOperationException.d.ts +10 -0
- package/lib/structures/IReflectHttpOperationParameter.d.ts +47 -0
- package/lib/structures/IReflectHttpOperationSuccess.d.ts +11 -0
- package/lib/structures/IReflectImport.d.ts +10 -0
- package/lib/structures/IReflectMcpOperation.d.ts +19 -0
- package/lib/structures/IReflectMcpOperationParameter.d.ts +9 -0
- package/lib/structures/IReflectOperationError.d.ts +28 -0
- package/lib/structures/IReflectOperationError.js +22 -2
- package/lib/structures/IReflectOperationError.js.map +1 -1
- package/lib/structures/IReflectType.d.ts +9 -0
- package/lib/structures/IReflectWebSocketOperation.d.ts +10 -0
- package/lib/structures/IReflectWebSocketOperationParameter.d.ts +55 -0
- package/lib/structures/ITypedApplication.d.ts +10 -0
- package/lib/structures/ITypedHttpRoute.d.ts +10 -0
- package/lib/structures/ITypedHttpRouteException.d.ts +10 -0
- package/lib/structures/ITypedHttpRouteParameter.d.ts +45 -0
- package/lib/structures/ITypedHttpRouteSuccess.d.ts +10 -0
- package/lib/structures/ITypedMcpRoute.d.ts +11 -0
- package/lib/structures/ITypedWebSocketRoute.d.ts +10 -0
- package/lib/transform.d.ts +6 -0
- package/lib/transform.js +6 -0
- package/lib/transform.js.map +1 -1
- package/lib/utils/ArrayUtil.d.ts +31 -1
- package/lib/utils/ArrayUtil.js +32 -11
- package/lib/utils/ArrayUtil.js.map +1 -1
- package/lib/utils/EmittedJavaScriptPatcher.d.ts +20 -0
- package/lib/utils/EmittedJavaScriptPatcher.js +65 -46
- package/lib/utils/EmittedJavaScriptPatcher.js.map +1 -1
- package/lib/utils/FileRetriever.d.ts +29 -0
- package/lib/utils/FileRetriever.js +29 -0
- package/lib/utils/FileRetriever.js.map +1 -1
- package/lib/utils/HttpResponseContentTypeUtil.d.ts +41 -0
- package/lib/utils/HttpResponseContentTypeUtil.js +31 -0
- package/lib/utils/HttpResponseContentTypeUtil.js.map +1 -1
- package/lib/utils/MapUtil.d.ts +64 -1
- package/lib/utils/MapUtil.js +24 -3
- package/lib/utils/MapUtil.js.map +1 -1
- package/lib/utils/PathUtil.d.ts +31 -0
- package/lib/utils/PathUtil.js +38 -0
- package/lib/utils/PathUtil.js.map +1 -1
- package/lib/utils/SdkBundlePath.d.ts +2 -0
- package/lib/utils/SdkBundlePath.js +10 -0
- package/lib/utils/SdkBundlePath.js.map +1 -0
- package/lib/utils/SdkInputFilter.d.ts +31 -0
- package/lib/utils/SdkInputFilter.js +115 -0
- package/lib/utils/SdkInputFilter.js.map +1 -0
- package/lib/utils/SourceFinder.d.ts +35 -0
- package/lib/utils/SourceFinder.js +47 -12
- package/lib/utils/SourceFinder.js.map +1 -1
- package/lib/utils/StringUtil.d.ts +77 -2
- package/lib/utils/StringUtil.js +166 -4
- package/lib/utils/StringUtil.js.map +1 -1
- package/lib/utils/TemporaryDirectory.d.ts +60 -0
- package/lib/utils/TemporaryDirectory.js +112 -0
- package/lib/utils/TemporaryDirectory.js.map +1 -0
- package/lib/utils/TsConfigReader.d.ts +42 -0
- package/lib/utils/TsConfigReader.js +98 -14
- package/lib/utils/TsConfigReader.js.map +1 -1
- package/lib/utils/TtscExecutor.d.ts +23 -1
- package/lib/utils/TtscExecutor.js +22 -0
- package/lib/utils/TtscExecutor.js.map +1 -1
- package/lib/utils/VersioningStrategy.d.ts +26 -1
- package/lib/utils/VersioningStrategy.js +30 -9
- package/lib/utils/VersioningStrategy.js.map +1 -1
- package/lib/validators/TextPlainValidator.d.ts +19 -0
- package/lib/validators/TextPlainValidator.js +19 -0
- package/lib/validators/TextPlainValidator.js.map +1 -1
- package/native/go.mod +1 -1
- package/native/go.sum +2 -2
- package/native/sdk/register.go +12 -2
- package/native/sdk/sdk_metadata_json.go +6 -1
- package/native/sdk/sdk_transform.go +388 -397
- package/package.json +7 -5
- package/src/INestiaConfig.ts +55 -24
- package/src/NestiaSdkApplication.ts +66 -7
- package/src/NestiaSwaggerComposer.ts +21 -6
- package/src/analyses/AccessorAnalyzer.ts +26 -0
- package/src/analyses/ConfigAnalyzer.ts +49 -87
- package/src/analyses/ImportAnalyzer.ts +25 -0
- package/src/analyses/ParameterNameAnalyzer.ts +24 -0
- package/src/analyses/PathAnalyzer.ts +63 -11
- package/src/analyses/ReflectControllerAnalyzer.ts +32 -0
- package/src/analyses/ReflectHttpOperationAnalyzer.ts +32 -10
- package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +31 -0
- package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +31 -0
- package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +32 -0
- package/src/analyses/ReflectMcpOperationAnalyzer.ts +32 -1
- package/src/analyses/ReflectMetadataAnalyzer.ts +47 -0
- package/src/analyses/ReflectWebSocketOperationAnalyzer.ts +33 -4
- package/src/analyses/SecurityAnalyzer.ts +15 -0
- package/src/analyses/SwaggerExampleAnalyzer.ts +16 -0
- package/src/analyses/TypedHttpRouteAnalyzer.ts +240 -184
- package/src/analyses/TypedMcpRouteAnalyzer.ts +180 -20
- package/src/analyses/TypedWebSocketRouteAnalyzer.ts +19 -0
- package/src/decorators/OperationMetadata.ts +6 -0
- package/src/executable/internal/CommandParser.ts +19 -0
- package/src/executable/internal/NestiaConfigLoader.ts +66 -50
- package/src/executable/internal/NestiaSdkCommand.ts +96 -3
- package/src/executable/internal/NestiaSdkWatcher.ts +169 -41
- package/src/executable/internal/NestiaSwaggerWatch.ts +359 -0
- package/src/factories/ExpressionFactory.ts +17 -2
- package/src/factories/IdentifierFactory.ts +24 -0
- package/src/factories/LiteralFactory.ts +44 -11
- package/src/factories/StatementFactory.ts +28 -1
- package/src/factories/TypeFactory.ts +24 -0
- package/src/generates/CloneGenerator.ts +26 -5
- package/src/generates/E2eGenerator.ts +19 -0
- package/src/generates/SdkGenerator.ts +40 -9
- package/src/generates/SwaggerGenerator.ts +56 -14
- package/src/generates/internal/E2eFileProgrammer.ts +20 -0
- package/src/generates/internal/FilePrinter.ts +43 -0
- package/src/generates/internal/ImportDictionary.ts +110 -3
- package/src/generates/internal/SdkAliasCollection.ts +133 -11
- package/src/generates/internal/SdkDistributionComposer.ts +117 -66
- package/src/generates/internal/SdkFileProgrammer.ts +18 -0
- package/src/generates/internal/SdkHttpCloneProgrammer.ts +55 -0
- package/src/generates/internal/SdkHttpCloneReferencer.ts +97 -23
- package/src/generates/internal/SdkHttpFunctionProgrammer.ts +19 -0
- package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +19 -0
- package/src/generates/internal/SdkHttpParameterProgrammer.ts +104 -2
- package/src/generates/internal/SdkHttpRouteProgrammer.ts +20 -0
- package/src/generates/internal/SdkHttpSimulationProgrammer.ts +72 -5
- package/src/generates/internal/SdkImportWizard.ts +63 -0
- package/src/generates/internal/SdkMcpRouteProgrammer.ts +38 -18
- package/src/generates/internal/SdkPathTemplate.ts +15 -0
- package/src/generates/internal/SdkRouteDirectory.ts +10 -0
- package/src/generates/internal/SdkTypeProgrammer.ts +118 -14
- package/src/generates/internal/SdkTypeTagProgrammer.ts +37 -7
- package/src/generates/internal/SdkWebSocketCloneProgrammer.ts +185 -142
- package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +19 -0
- package/src/generates/internal/SdkWebSocketParameterProgrammer.ts +81 -2
- package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +18 -0
- package/src/generates/internal/SwaggerDescriptionComposer.ts +47 -1
- package/src/generates/internal/SwaggerOperationComposer.ts +18 -0
- package/src/generates/internal/SwaggerOperationParameterComposer.ts +41 -8
- package/src/generates/internal/SwaggerOperationResponseComposer.ts +19 -0
- package/src/internal/legacy-augmentation.d.ts +16 -0
- package/src/internal/legacy.ts +296 -26
- package/src/structures/INestiaProject.ts +10 -0
- package/src/structures/INestiaSdkInput.ts +30 -0
- package/src/structures/IOperationMetadata.ts +55 -0
- package/src/structures/IReflectController.ts +10 -0
- package/src/structures/IReflectHttpOperation.ts +10 -0
- package/src/structures/IReflectHttpOperationException.ts +10 -0
- package/src/structures/IReflectHttpOperationParameter.ts +47 -0
- package/src/structures/IReflectHttpOperationSuccess.ts +11 -0
- package/src/structures/IReflectImport.ts +10 -0
- package/src/structures/IReflectMcpOperation.ts +19 -0
- package/src/structures/IReflectMcpOperationParameter.ts +9 -0
- package/src/structures/IReflectOperationError.ts +31 -2
- package/src/structures/IReflectType.ts +9 -0
- package/src/structures/IReflectWebSocketOperation.ts +10 -0
- package/src/structures/IReflectWebSocketOperationParameter.ts +55 -0
- package/src/structures/ITypedApplication.ts +10 -0
- package/src/structures/ITypedHttpRoute.ts +10 -0
- package/src/structures/ITypedHttpRouteException.ts +10 -0
- package/src/structures/ITypedHttpRouteParameter.ts +45 -0
- package/src/structures/ITypedHttpRouteSuccess.ts +10 -0
- package/src/structures/ITypedMcpRoute.ts +12 -0
- package/src/structures/ITypedWebSocketRoute.ts +10 -0
- package/src/transform.ts +6 -0
- package/src/utils/ArrayUtil.ts +32 -13
- package/src/utils/EmittedJavaScriptPatcher.ts +70 -47
- package/src/utils/FileRetriever.ts +29 -0
- package/src/utils/HttpResponseContentTypeUtil.ts +41 -0
- package/src/utils/MapUtil.ts +68 -3
- package/src/utils/PathUtil.ts +38 -0
- package/src/utils/SdkBundlePath.ts +11 -0
- package/src/utils/SdkInputFilter.ts +108 -0
- package/src/utils/SourceFinder.ts +51 -14
- package/src/utils/StringUtil.ts +182 -5
- package/src/utils/TemporaryDirectory.ts +108 -0
- package/src/utils/TsConfigReader.ts +124 -26
- package/src/utils/TtscExecutor.ts +23 -1
- package/src/utils/VersioningStrategy.ts +33 -13
- package/src/validators/TextPlainValidator.ts +19 -0
- package/lib/generates/internal/SwaggerReadonlyArrayEmender.d.ts +0 -9
- package/lib/generates/internal/SwaggerReadonlyArrayEmender.js +0 -178
- package/lib/generates/internal/SwaggerReadonlyArrayEmender.js.map +0 -1
- package/src/generates/internal/SwaggerReadonlyArrayEmender.ts +0 -264
|
@@ -18,34 +18,40 @@ import { ITypedHttpRoute } from "../structures/ITypedHttpRoute";
|
|
|
18
18
|
import { ITypedHttpRouteException } from "../structures/ITypedHttpRouteException";
|
|
19
19
|
import { ITypedHttpRouteParameter } from "../structures/ITypedHttpRouteParameter";
|
|
20
20
|
import { ITypedHttpRouteSuccess } from "../structures/ITypedHttpRouteSuccess";
|
|
21
|
+
import { ITypedMcpRoute } from "../structures/ITypedMcpRoute";
|
|
21
22
|
import { PathUtil } from "../utils/PathUtil";
|
|
23
|
+
import { StringUtil } from "../utils/StringUtil";
|
|
22
24
|
|
|
25
|
+
/**
|
|
26
|
+
* Turns reflected HTTP operations into typed routes, one per path, and builds
|
|
27
|
+
* the shared dictionary of the JSON components HTTP and MCP routes use.
|
|
28
|
+
*
|
|
29
|
+
* @evidence contracts/common.md#principled-implementation Each operation's metadata is resolved against its own components and validated by the policy of its position, the routes carry the typed parameters, the success response, and the exceptions, and the dictionary of the routes is built after component names that collide with different definitions are renamed per controller.
|
|
30
|
+
* @evidence contracts/common.md#clear-and-simple-design Two public functions and private collectors for the component rename.
|
|
31
|
+
* @evidence contracts/common.md#prohibited-implementation-shortcuts The rename mutates only component definitions owned by analysis; consumers emit resolved structural types rather than modifying foreign cache fields or replacing names in strings.
|
|
32
|
+
* @evidence contracts/common.md#meaningful-documentation The comment states its purpose.
|
|
33
|
+
* efficient algorithms: This namespace groups operations; analyze and routeDictionary own the algorithms.
|
|
34
|
+
* reuse equivalent work: The namespace itself coordinates no completed or in-flight work.
|
|
35
|
+
* bound retention and release resources: The namespace owns no cache, handle or running task.
|
|
36
|
+
* @evidenceExclude contracts/portability.md#os-neutral-implementation TypedHttpRouteAnalyzer analyzes reflected route metadata; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
|
|
37
|
+
*/
|
|
23
38
|
export namespace TypedHttpRouteAnalyzer {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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)),
|
|
41
|
-
});
|
|
42
|
-
return components.dictionary;
|
|
43
|
-
};
|
|
44
|
-
|
|
39
|
+
/**
|
|
40
|
+
* Returns the typed routes of one operation, one per path, or none when the
|
|
41
|
+
* metadata violates a policy; the violations are pushed to the errors.
|
|
42
|
+
*
|
|
43
|
+
* @evidence contracts/common.md#principled-implementation Each metadata is resolved against its own components and validated with the policy of its position (JSON, query, header, or text), the `@setHeader` and `@assignHeaders` tags become header directives, and the route splits the parameters by category.
|
|
44
|
+
* @evidence contracts/common.md#clear-and-simple-design One function.
|
|
45
|
+
* @evidence contracts/common.md#prohibited-implementation-shortcuts The policies come from the validators of the package.
|
|
46
|
+
* @evidence contracts/common.md#meaningful-documentation The comment states the result and the errors.
|
|
47
|
+
* efficient algorithms: Each supplied parameter and exception is cast once, policy validation belongs to MetadataFactory, and route splitting maps only the supplied paths.
|
|
48
|
+
* reuse equivalent work: Independently supplied operation metadata and position-specific validation have no shared completed or in-flight request.
|
|
49
|
+
* bound retention and release resources: Metadata dictionaries and local diagnostics belong to this synchronous operation and its returned routes; no process, handle or persistent history is retained.
|
|
50
|
+
* @evidenceExclude contracts/portability.md#os-neutral-implementation TypedHttpRouteAnalyzer.analyze analyzes reflected route metadata; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
|
|
51
|
+
*/
|
|
45
52
|
export const analyze = (props: {
|
|
46
53
|
controller: IReflectController;
|
|
47
54
|
errors: IReflectOperationError[];
|
|
48
|
-
dictionary: IMetadataDictionary;
|
|
49
55
|
operation: IReflectHttpOperation;
|
|
50
56
|
paths: string[];
|
|
51
57
|
}): ITypedHttpRoute[] => {
|
|
@@ -57,7 +63,6 @@ export namespace TypedHttpRouteAnalyzer {
|
|
|
57
63
|
validate?: MetadataFactory.Validator;
|
|
58
64
|
},
|
|
59
65
|
from: string,
|
|
60
|
-
escape: boolean,
|
|
61
66
|
): MetadataSchema => {
|
|
62
67
|
const components: MetadataComponents = MetadataComponents.from(
|
|
63
68
|
next.components,
|
|
@@ -70,12 +75,6 @@ export namespace TypedHttpRouteAnalyzer {
|
|
|
70
75
|
next.validate === undefined
|
|
71
76
|
? []
|
|
72
77
|
: MetadataFactory.validate({
|
|
73
|
-
options: {
|
|
74
|
-
escape,
|
|
75
|
-
constant: true,
|
|
76
|
-
absorb: true,
|
|
77
|
-
validate: next.validate,
|
|
78
|
-
},
|
|
79
78
|
functor: next.validate,
|
|
80
79
|
metadata,
|
|
81
80
|
});
|
|
@@ -111,28 +110,18 @@ export namespace TypedHttpRouteAnalyzer {
|
|
|
111
110
|
example: value.example,
|
|
112
111
|
examples: value.examples,
|
|
113
112
|
type: value.type,
|
|
114
|
-
metadata: cast(value, `exception (status: ${key})
|
|
113
|
+
metadata: cast(value, `exception (status: ${key})`),
|
|
115
114
|
},
|
|
116
115
|
]),
|
|
117
116
|
);
|
|
118
117
|
const parameters: ITypedHttpRouteParameter[] =
|
|
119
118
|
props.operation.parameters.map((p) => ({
|
|
120
119
|
...p,
|
|
121
|
-
metadata: cast(
|
|
122
|
-
p,
|
|
123
|
-
`parameter (name: ${JSON.stringify(p.name)})`,
|
|
124
|
-
p.category === "body" &&
|
|
125
|
-
(p.contentType === "application/json" || p.encrypted === true),
|
|
126
|
-
),
|
|
120
|
+
metadata: cast(p, `parameter (name: ${JSON.stringify(p.name)})`),
|
|
127
121
|
}));
|
|
128
122
|
const success: ITypedHttpRouteSuccess = {
|
|
129
123
|
...props.operation.success,
|
|
130
|
-
metadata: cast(
|
|
131
|
-
props.operation.success,
|
|
132
|
-
"success",
|
|
133
|
-
props.operation.success.encrypted ||
|
|
134
|
-
props.operation.success.contentType === "application/json",
|
|
135
|
-
),
|
|
124
|
+
metadata: cast(props.operation.success, "success"),
|
|
136
125
|
setHeaders: props.operation.jsDocTags
|
|
137
126
|
.filter(
|
|
138
127
|
(t) =>
|
|
@@ -193,8 +182,21 @@ export namespace TypedHttpRouteAnalyzer {
|
|
|
193
182
|
);
|
|
194
183
|
};
|
|
195
184
|
|
|
185
|
+
/**
|
|
186
|
+
* Returns the dictionary of the components the routes actually use, after
|
|
187
|
+
* renaming components whose names collide with different definitions.
|
|
188
|
+
*
|
|
189
|
+
* @evidence contracts/common.md#principled-implementation Objects, aliases and recursive arrays/tuples share their emitted accessor-path slots, while finite and object-mediated collections remain kind-specific inline groups. Different semantic classes in one slot receive unique controller-qualified names, and the emitted dictionary follows escaped returns rather than original-only toJSON declarations.
|
|
190
|
+
* @evidence contracts/common.md#clear-and-simple-design One function over private collectors.
|
|
191
|
+
* @evidence contracts/common.md#prohibited-implementation-shortcuts Finite partition refinement preserves semantic discriminators and user payloads while component edges reference equivalence classes. Only actual component ordinals are omitted; no foreign name cache or generated text is rewritten.
|
|
192
|
+
* @evidence contracts/common.md#meaningful-documentation The comment states the result and the rename.
|
|
193
|
+
* efficient algorithms: Each refinement round encodes each distinct component body with constant-sized component edges. The partition only splits and stabilizes within the distinct component count, avoiding exponential expansion of shared DAGs.
|
|
194
|
+
* reuse equivalent work: One local partition compares all routes together, reuses graph node colors for shared children and supplies all collision groups; equivalent same-slot definitions reuse one emitted representative.
|
|
195
|
+
* bound retention and release resources: Collected nodes, partitions and visited sets are local to this synchronous call and are released with it; the returned dictionary retains only its reachable emitted representatives.
|
|
196
|
+
* @evidenceExclude contracts/portability.md#os-neutral-implementation TypedHttpRouteAnalyzer.routeDictionary analyzes reflected route metadata; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
|
|
197
|
+
*/
|
|
196
198
|
export const routeDictionary = (
|
|
197
|
-
routes: Array<ITypedHttpRoute>,
|
|
199
|
+
routes: Array<ITypedHttpRoute | ITypedMcpRoute>,
|
|
198
200
|
): IMetadataDictionary => {
|
|
199
201
|
renameDuplicateComponents(routes);
|
|
200
202
|
const dictionary: IMetadataDictionary = {
|
|
@@ -203,20 +205,9 @@ export namespace TypedHttpRouteAnalyzer {
|
|
|
203
205
|
arrays: new Map(),
|
|
204
206
|
tuples: new Map(),
|
|
205
207
|
};
|
|
206
|
-
for (const route of routes)
|
|
207
|
-
for (const
|
|
208
|
-
|
|
209
|
-
...route.queryParameters,
|
|
210
|
-
...route.headerParameters,
|
|
211
|
-
...(route.queryObject ? [route.queryObject] : []),
|
|
212
|
-
...(route.body ? [route.body] : []),
|
|
213
|
-
...(route.headerObject ? [route.headerObject] : []),
|
|
214
|
-
])
|
|
215
|
-
enrollMetadata(dictionary, p.metadata);
|
|
216
|
-
for (const e of Object.values(route.exceptions))
|
|
217
|
-
enrollMetadata(dictionary, e.metadata);
|
|
218
|
-
enrollMetadata(dictionary, route.success.metadata);
|
|
219
|
-
}
|
|
208
|
+
for (const route of routes)
|
|
209
|
+
for (const metadata of routeMetadatas(route))
|
|
210
|
+
enrollMetadata(dictionary, metadata);
|
|
220
211
|
return dictionary;
|
|
221
212
|
};
|
|
222
213
|
}
|
|
@@ -230,21 +221,51 @@ type ComponentType =
|
|
|
230
221
|
|
|
231
222
|
interface IComponentEntry {
|
|
232
223
|
kind: ComponentKind;
|
|
233
|
-
route: ITypedHttpRoute;
|
|
224
|
+
route: ITypedHttpRoute | ITypedMcpRoute;
|
|
234
225
|
signature: string;
|
|
235
226
|
type: ComponentType;
|
|
236
227
|
}
|
|
237
228
|
|
|
238
|
-
const renameDuplicateComponents = (
|
|
229
|
+
const renameDuplicateComponents = (
|
|
230
|
+
routes: Array<ITypedHttpRoute | ITypedMcpRoute>,
|
|
231
|
+
): void => {
|
|
239
232
|
const entries: IComponentEntry[] = [];
|
|
240
233
|
for (const route of routes)
|
|
241
234
|
for (const metadata of routeMetadatas(route))
|
|
242
235
|
collectComponentEntries(entries, route, metadata);
|
|
236
|
+
// Original toJSON definitions participate in semantic comparison but do not
|
|
237
|
+
// become emitted declarations unless another route uses them directly.
|
|
238
|
+
const comparisonEntries: IComponentEntry[] = [];
|
|
239
|
+
for (const route of routes)
|
|
240
|
+
for (const metadata of routeMetadatas(route))
|
|
241
|
+
collectComponentEntries(
|
|
242
|
+
comparisonEntries,
|
|
243
|
+
route,
|
|
244
|
+
metadata,
|
|
245
|
+
createCollectVisited(),
|
|
246
|
+
true,
|
|
247
|
+
);
|
|
248
|
+
const signatures = componentSignatures(comparisonEntries);
|
|
249
|
+
for (const entry of entries) entry.signature = signatures.get(entry.type)!;
|
|
243
250
|
|
|
244
|
-
const used: Set<string> = new Set(
|
|
251
|
+
const used: Set<string> = new Set(
|
|
252
|
+
entries.map((e) => StringUtil.accessorsOf(e.type.name).join(".")),
|
|
253
|
+
);
|
|
245
254
|
const groups: Map<string, IComponentEntry[]> = new Map();
|
|
246
255
|
for (const entry of entries) {
|
|
247
|
-
|
|
256
|
+
// Named recursive collections also need a declaration to break cycles.
|
|
257
|
+
// Ordinary arrays and tuples remain inline forms without their own slot.
|
|
258
|
+
const slot =
|
|
259
|
+
entry.kind === "objects" ||
|
|
260
|
+
entry.kind === "aliases" ||
|
|
261
|
+
entry.type.recursive
|
|
262
|
+
? "declarations"
|
|
263
|
+
: entry.kind;
|
|
264
|
+
const name =
|
|
265
|
+
slot === "declarations"
|
|
266
|
+
? StringUtil.accessorsOf(entry.type.name).join(".")
|
|
267
|
+
: entry.type.name;
|
|
268
|
+
const key: string = `${slot}:${name}`;
|
|
248
269
|
const group: IComponentEntry[] | undefined = groups.get(key);
|
|
249
270
|
if (group === undefined) groups.set(key, [entry]);
|
|
250
271
|
else group.push(entry);
|
|
@@ -267,55 +288,100 @@ const renameDuplicateComponents = (routes: ITypedHttpRoute[]): void => {
|
|
|
267
288
|
`${prefix}.${oldName}`,
|
|
268
289
|
);
|
|
269
290
|
renamed.set(entry.signature, name);
|
|
270
|
-
used.add(name);
|
|
291
|
+
used.add(StringUtil.accessorsOf(name).join("."));
|
|
271
292
|
return name;
|
|
272
293
|
})();
|
|
273
294
|
(entry.type as { name: string }).name = next;
|
|
274
295
|
}
|
|
275
296
|
}
|
|
276
|
-
for (const route of routes)
|
|
277
|
-
for (const metadata of routeMetadatas(route))
|
|
278
|
-
clearMetadataNameCache(metadata);
|
|
279
297
|
};
|
|
280
298
|
|
|
281
|
-
const routeMetadatas = (
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
299
|
+
const routeMetadatas = (
|
|
300
|
+
route: ITypedHttpRoute | ITypedMcpRoute,
|
|
301
|
+
): MetadataSchema[] =>
|
|
302
|
+
route.protocol === "mcp"
|
|
303
|
+
? [route.inputMetadata, route.outputMetadata].filter(
|
|
304
|
+
(m): m is MetadataSchema => m !== undefined,
|
|
305
|
+
)
|
|
306
|
+
: [
|
|
307
|
+
...[
|
|
308
|
+
...route.pathParameters,
|
|
309
|
+
...route.queryParameters,
|
|
310
|
+
...route.headerParameters,
|
|
311
|
+
...(route.queryObject ? [route.queryObject] : []),
|
|
312
|
+
...(route.body ? [route.body] : []),
|
|
313
|
+
...(route.headerObject ? [route.headerObject] : []),
|
|
314
|
+
].map((p) => p.metadata),
|
|
315
|
+
...Object.values(route.exceptions).map((e) => e.metadata),
|
|
316
|
+
route.success.metadata,
|
|
317
|
+
];
|
|
293
318
|
|
|
294
319
|
const collectComponentEntries = (
|
|
295
320
|
entries: IComponentEntry[],
|
|
296
|
-
route: ITypedHttpRoute,
|
|
321
|
+
route: ITypedHttpRoute | ITypedMcpRoute,
|
|
297
322
|
metadata: MetadataSchema,
|
|
298
323
|
visited: ICollectVisited = createCollectVisited(),
|
|
324
|
+
includeOriginal: boolean = false,
|
|
299
325
|
): void => {
|
|
300
326
|
if (visited.schemas.has(metadata)) return;
|
|
301
327
|
visited.schemas.add(metadata);
|
|
302
328
|
|
|
303
329
|
if (metadata.rest !== null)
|
|
304
|
-
collectComponentEntries(
|
|
330
|
+
collectComponentEntries(
|
|
331
|
+
entries,
|
|
332
|
+
route,
|
|
333
|
+
metadata.rest,
|
|
334
|
+
visited,
|
|
335
|
+
includeOriginal,
|
|
336
|
+
);
|
|
305
337
|
if (metadata.escaped !== null) {
|
|
306
|
-
|
|
307
|
-
|
|
338
|
+
if (includeOriginal)
|
|
339
|
+
collectComponentEntries(
|
|
340
|
+
entries,
|
|
341
|
+
route,
|
|
342
|
+
metadata.escaped.original,
|
|
343
|
+
visited,
|
|
344
|
+
includeOriginal,
|
|
345
|
+
);
|
|
346
|
+
collectComponentEntries(
|
|
347
|
+
entries,
|
|
348
|
+
route,
|
|
349
|
+
metadata.escaped.returns,
|
|
350
|
+
visited,
|
|
351
|
+
includeOriginal,
|
|
352
|
+
);
|
|
308
353
|
}
|
|
354
|
+
for (const template of metadata.templates)
|
|
355
|
+
for (const elem of template.row ?? template)
|
|
356
|
+
collectComponentEntries(entries, route, elem, visited, includeOriginal);
|
|
309
357
|
for (const func of metadata.functions) {
|
|
310
358
|
for (const p of func.parameters)
|
|
311
|
-
collectComponentEntries(entries, route, p.type, visited);
|
|
312
|
-
collectComponentEntries(
|
|
359
|
+
collectComponentEntries(entries, route, p.type, visited, includeOriginal);
|
|
360
|
+
collectComponentEntries(
|
|
361
|
+
entries,
|
|
362
|
+
route,
|
|
363
|
+
func.output,
|
|
364
|
+
visited,
|
|
365
|
+
includeOriginal,
|
|
366
|
+
);
|
|
313
367
|
}
|
|
314
368
|
for (const set of metadata.sets)
|
|
315
|
-
collectComponentEntries(
|
|
369
|
+
collectComponentEntries(
|
|
370
|
+
entries,
|
|
371
|
+
route,
|
|
372
|
+
set.value,
|
|
373
|
+
visited,
|
|
374
|
+
includeOriginal,
|
|
375
|
+
);
|
|
316
376
|
for (const map of metadata.maps) {
|
|
317
|
-
collectComponentEntries(entries, route, map.key, visited);
|
|
318
|
-
collectComponentEntries(
|
|
377
|
+
collectComponentEntries(entries, route, map.key, visited, includeOriginal);
|
|
378
|
+
collectComponentEntries(
|
|
379
|
+
entries,
|
|
380
|
+
route,
|
|
381
|
+
map.value,
|
|
382
|
+
visited,
|
|
383
|
+
includeOriginal,
|
|
384
|
+
);
|
|
319
385
|
}
|
|
320
386
|
for (const array of metadata.arrays)
|
|
321
387
|
if (visited.arrays.has(array.type as MetadataArrayType) === false) {
|
|
@@ -328,6 +394,7 @@ const collectComponentEntries = (
|
|
|
328
394
|
route,
|
|
329
395
|
(array.type as MetadataArrayType as MetadataArrayType).value,
|
|
330
396
|
visited,
|
|
397
|
+
includeOriginal,
|
|
331
398
|
);
|
|
332
399
|
}
|
|
333
400
|
for (const tuple of metadata.tuples)
|
|
@@ -338,7 +405,7 @@ const collectComponentEntries = (
|
|
|
338
405
|
);
|
|
339
406
|
for (const elem of (tuple.type as MetadataTupleType as MetadataTupleType)
|
|
340
407
|
.elements)
|
|
341
|
-
collectComponentEntries(entries, route, elem, visited);
|
|
408
|
+
collectComponentEntries(entries, route, elem, visited, includeOriginal);
|
|
342
409
|
}
|
|
343
410
|
for (const alias of metadata.aliases)
|
|
344
411
|
if (visited.aliases.has(alias.type as MetadataAliasType) === false) {
|
|
@@ -351,6 +418,7 @@ const collectComponentEntries = (
|
|
|
351
418
|
route,
|
|
352
419
|
(alias.type as MetadataAliasType as MetadataAliasType).value,
|
|
353
420
|
visited,
|
|
421
|
+
includeOriginal,
|
|
354
422
|
);
|
|
355
423
|
}
|
|
356
424
|
for (const obj of metadata.objects)
|
|
@@ -361,31 +429,96 @@ const collectComponentEntries = (
|
|
|
361
429
|
);
|
|
362
430
|
for (const p of (obj.type as MetadataObjectType as MetadataObjectType)
|
|
363
431
|
.properties) {
|
|
364
|
-
collectComponentEntries(
|
|
365
|
-
|
|
432
|
+
collectComponentEntries(
|
|
433
|
+
entries,
|
|
434
|
+
route,
|
|
435
|
+
p.key,
|
|
436
|
+
visited,
|
|
437
|
+
includeOriginal,
|
|
438
|
+
);
|
|
439
|
+
collectComponentEntries(
|
|
440
|
+
entries,
|
|
441
|
+
route,
|
|
442
|
+
p.value,
|
|
443
|
+
visited,
|
|
444
|
+
includeOriginal,
|
|
445
|
+
);
|
|
366
446
|
}
|
|
367
447
|
}
|
|
368
448
|
};
|
|
369
449
|
|
|
370
450
|
const componentEntry = <T extends ComponentType>(
|
|
371
|
-
route: ITypedHttpRoute,
|
|
451
|
+
route: ITypedHttpRoute | ITypedMcpRoute,
|
|
372
452
|
kind: ComponentKind,
|
|
373
453
|
type: T,
|
|
374
454
|
): IComponentEntry => ({
|
|
375
455
|
kind,
|
|
376
456
|
route,
|
|
377
|
-
signature:
|
|
457
|
+
signature: "",
|
|
378
458
|
type,
|
|
379
459
|
});
|
|
380
460
|
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
461
|
+
/**
|
|
462
|
+
* Refines a finite component graph until no semantic equivalence class splits.
|
|
463
|
+
* Component edges carry class numbers, so shared children are never expanded as
|
|
464
|
+
* trees. Ordinary payloads retain separate object/array representations. Each
|
|
465
|
+
* round preserves the previous partition and can only split its classes; at
|
|
466
|
+
* most the number of distinct components rounds are necessary.
|
|
467
|
+
*/
|
|
468
|
+
const componentSignatures = (
|
|
469
|
+
entries: IComponentEntry[],
|
|
470
|
+
): Map<ComponentType, string> => {
|
|
471
|
+
const kinds = new Map<ComponentType, ComponentKind>();
|
|
472
|
+
for (const entry of entries) kinds.set(entry.type, entry.kind);
|
|
473
|
+
const nodes = [...kinds.keys()];
|
|
474
|
+
let colors = new Map(nodes.map((node) => [node, 0]));
|
|
475
|
+
let classes = nodes.length ? 1 : 0;
|
|
476
|
+
while (nodes.length) {
|
|
477
|
+
const intern = new Map<string, number>();
|
|
478
|
+
const next = new Map<ComponentType, number>();
|
|
479
|
+
for (const node of nodes) {
|
|
480
|
+
const ancestors = new WeakMap<object, number>();
|
|
481
|
+
let depth = 0;
|
|
482
|
+
const encode = (value: unknown, root = false): unknown => {
|
|
483
|
+
if (value === null || typeof value !== "object") return value;
|
|
484
|
+
if (!root && kinds.has(value as ComponentType))
|
|
485
|
+
return ["component", colors.get(value as ComponentType)];
|
|
486
|
+
const position = ancestors.get(value);
|
|
487
|
+
if (position !== undefined) return ["payload-cycle", position];
|
|
488
|
+
ancestors.set(value, depth++);
|
|
489
|
+
const result = Array.isArray(value)
|
|
490
|
+
? ["array", value.map((child) => encode(child))]
|
|
491
|
+
: [
|
|
492
|
+
"object",
|
|
493
|
+
Object.entries(value)
|
|
494
|
+
.filter(
|
|
495
|
+
([key, child]) =>
|
|
496
|
+
child !== undefined && !(root && key === "index"),
|
|
497
|
+
)
|
|
498
|
+
.map(([key, child]) => [key, encode(child)]),
|
|
499
|
+
];
|
|
500
|
+
ancestors.delete(value);
|
|
501
|
+
--depth;
|
|
502
|
+
return result;
|
|
503
|
+
};
|
|
504
|
+
const signature = JSON.stringify([
|
|
505
|
+
colors.get(node),
|
|
506
|
+
kinds.get(node),
|
|
507
|
+
encode(node, true),
|
|
508
|
+
]);
|
|
509
|
+
let color = intern.get(signature);
|
|
510
|
+
if (color === undefined) {
|
|
511
|
+
color = intern.size;
|
|
512
|
+
intern.set(signature, color);
|
|
513
|
+
}
|
|
514
|
+
next.set(node, color);
|
|
515
|
+
}
|
|
516
|
+
colors = next;
|
|
517
|
+
if (intern.size === classes) break;
|
|
518
|
+
classes = intern.size;
|
|
519
|
+
}
|
|
520
|
+
return new Map(nodes.map((node) => [node, String(colors.get(node))]));
|
|
521
|
+
};
|
|
389
522
|
|
|
390
523
|
const normalizeComponentNamespace = (name: string): string => {
|
|
391
524
|
const next: string = name.replace(/[^A-Za-z0-9_$]/g, "_");
|
|
@@ -393,63 +526,9 @@ const normalizeComponentNamespace = (name: string): string => {
|
|
|
393
526
|
};
|
|
394
527
|
|
|
395
528
|
const escapeComponentName = (used: Set<string>, name: string): string =>
|
|
396
|
-
used.has(name)
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
metadata: MetadataSchema,
|
|
400
|
-
visited: WeakSet<MetadataSchema> = new WeakSet(),
|
|
401
|
-
): void => {
|
|
402
|
-
if (visited.has(metadata)) return;
|
|
403
|
-
visited.add(metadata);
|
|
404
|
-
(metadata as unknown as { name_?: string }).name_ = undefined;
|
|
405
|
-
|
|
406
|
-
if (metadata.rest !== null) clearMetadataNameCache(metadata.rest, visited);
|
|
407
|
-
if (metadata.escaped !== null) {
|
|
408
|
-
clearMetadataNameCache(metadata.escaped.original, visited);
|
|
409
|
-
clearMetadataNameCache(metadata.escaped.returns, visited);
|
|
410
|
-
}
|
|
411
|
-
for (const func of metadata.functions) {
|
|
412
|
-
for (const p of func.parameters) clearMetadataNameCache(p.type, visited);
|
|
413
|
-
clearMetadataNameCache(func.output, visited);
|
|
414
|
-
}
|
|
415
|
-
for (const set of metadata.sets) {
|
|
416
|
-
(set as unknown as { name_?: string }).name_ = undefined;
|
|
417
|
-
clearMetadataNameCache(set.value, visited);
|
|
418
|
-
}
|
|
419
|
-
for (const map of metadata.maps) {
|
|
420
|
-
(map as unknown as { name_?: string }).name_ = undefined;
|
|
421
|
-
clearMetadataNameCache(map.key, visited);
|
|
422
|
-
clearMetadataNameCache(map.value, visited);
|
|
423
|
-
}
|
|
424
|
-
for (const array of metadata.arrays) {
|
|
425
|
-
(array as unknown as { name_?: string }).name_ = undefined;
|
|
426
|
-
clearMetadataNameCache(
|
|
427
|
-
(array.type as MetadataArrayType as MetadataArrayType).value,
|
|
428
|
-
visited,
|
|
429
|
-
);
|
|
430
|
-
}
|
|
431
|
-
for (const tuple of metadata.tuples) {
|
|
432
|
-
(tuple as unknown as { name_?: string }).name_ = undefined;
|
|
433
|
-
for (const elem of (tuple.type as MetadataTupleType as MetadataTupleType)
|
|
434
|
-
.elements)
|
|
435
|
-
clearMetadataNameCache(elem, visited);
|
|
436
|
-
}
|
|
437
|
-
for (const alias of metadata.aliases) {
|
|
438
|
-
(alias as unknown as { name_?: string }).name_ = undefined;
|
|
439
|
-
clearMetadataNameCache(
|
|
440
|
-
(alias.type as MetadataAliasType as MetadataAliasType).value,
|
|
441
|
-
visited,
|
|
442
|
-
);
|
|
443
|
-
}
|
|
444
|
-
for (const obj of metadata.objects) {
|
|
445
|
-
(obj as unknown as { name_?: string }).name_ = undefined;
|
|
446
|
-
for (const p of (obj.type as MetadataObjectType as MetadataObjectType)
|
|
447
|
-
.properties) {
|
|
448
|
-
clearMetadataNameCache(p.key, visited);
|
|
449
|
-
clearMetadataNameCache(p.value, visited);
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
};
|
|
529
|
+
used.has(StringUtil.accessorsOf(name).join("."))
|
|
530
|
+
? escapeComponentName(used, `_${name}`)
|
|
531
|
+
: name;
|
|
453
532
|
|
|
454
533
|
interface ICollectVisited {
|
|
455
534
|
aliases: WeakSet<MetadataAliasType>;
|
|
@@ -467,27 +546,6 @@ const createCollectVisited = (): ICollectVisited => ({
|
|
|
467
546
|
tuples: new WeakSet<MetadataTupleType>(),
|
|
468
547
|
});
|
|
469
548
|
|
|
470
|
-
const uniqueComponents = <T extends { name: string }>(input: T[]): T[] => {
|
|
471
|
-
const dict: Record<string, T> = {};
|
|
472
|
-
for (const elem of input) {
|
|
473
|
-
const oldbie: T | undefined = dict[elem.name];
|
|
474
|
-
if (oldbie === undefined) dict[elem.name] = elem;
|
|
475
|
-
else if (
|
|
476
|
-
elem.name.includes(".") ||
|
|
477
|
-
componentScore(oldbie) < componentScore(elem)
|
|
478
|
-
)
|
|
479
|
-
dict[elem.name] = elem;
|
|
480
|
-
}
|
|
481
|
-
return Object.values(dict);
|
|
482
|
-
};
|
|
483
|
-
|
|
484
|
-
const componentScore = (input: unknown): number =>
|
|
485
|
-
JSON.stringify(input, (key, value) =>
|
|
486
|
-
// Resolved-reference back-edges close cycles on recursive schemas;
|
|
487
|
-
// skip them when scoring component "richness".
|
|
488
|
-
key === "type" ? undefined : value,
|
|
489
|
-
).length;
|
|
490
|
-
|
|
491
549
|
const enrollMetadata = (
|
|
492
550
|
dictionary: IMetadataDictionary,
|
|
493
551
|
metadata: MetadataSchema,
|
|
@@ -499,9 +557,11 @@ const enrollMetadata = (
|
|
|
499
557
|
if (metadata.rest !== null)
|
|
500
558
|
enrollMetadata(dictionary, metadata.rest, visited);
|
|
501
559
|
if (metadata.escaped !== null) {
|
|
502
|
-
enrollMetadata(dictionary, metadata.escaped.original, visited);
|
|
503
560
|
enrollMetadata(dictionary, metadata.escaped.returns, visited);
|
|
504
561
|
}
|
|
562
|
+
for (const template of metadata.templates)
|
|
563
|
+
for (const elem of template.row ?? template)
|
|
564
|
+
enrollMetadata(dictionary, elem, visited);
|
|
505
565
|
for (const func of metadata.functions) {
|
|
506
566
|
for (const p of func.parameters)
|
|
507
567
|
enrollMetadata(dictionary, p.type, visited);
|
|
@@ -551,17 +611,13 @@ const enroll = <
|
|
|
551
611
|
dict: Map<string, T>,
|
|
552
612
|
elem: T,
|
|
553
613
|
): boolean => {
|
|
614
|
+
// Collision refinement established equivalence for every remaining same-name
|
|
615
|
+
// entry in this kind; selecting another representative cannot add meaning.
|
|
554
616
|
const oldbie: T | undefined = dict.get(elem.name);
|
|
555
617
|
if (oldbie === elem) return false;
|
|
556
618
|
if (oldbie === undefined) {
|
|
557
619
|
dict.set(elem.name, elem);
|
|
558
620
|
return true;
|
|
559
|
-
} else if (
|
|
560
|
-
elem.name.includes(".") ||
|
|
561
|
-
componentScore(oldbie) < componentScore(elem)
|
|
562
|
-
) {
|
|
563
|
-
dict.set(elem.name, elem);
|
|
564
|
-
return true;
|
|
565
621
|
}
|
|
566
622
|
return false;
|
|
567
623
|
};
|