@nestia/sdk 14.0.1 → 14.0.3
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 +57 -80
- 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 +22 -5
- 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 +31 -1
- package/lib/structures/IOperationMetadata.d.ts +55 -0
- package/lib/structures/IReflectController.d.ts +11 -1
- package/lib/structures/IReflectHttpOperation.d.ts +11 -1
- 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 +27 -2
- 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 +393 -403
- package/package.json +9 -7
- 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 +59 -96
- 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 +48 -1
- package/src/analyses/ReflectWebSocketOperationAnalyzer.ts +34 -14
- 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 +31 -1
- package/src/structures/IOperationMetadata.ts +55 -0
- package/src/structures/IReflectController.ts +11 -1
- package/src/structures/IReflectHttpOperation.ts +11 -1
- 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 +37 -14
- 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
|
@@ -8,15 +8,16 @@ import (
|
|
|
8
8
|
"os"
|
|
9
9
|
"path/filepath"
|
|
10
10
|
"reflect"
|
|
11
|
-
"regexp"
|
|
12
11
|
"sort"
|
|
13
12
|
"strconv"
|
|
14
13
|
"strings"
|
|
15
14
|
|
|
16
15
|
shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
17
16
|
shimchecker "github.com/microsoft/typescript-go/shim/checker"
|
|
17
|
+
shimprinter "github.com/microsoft/typescript-go/shim/printer"
|
|
18
18
|
shimscanner "github.com/microsoft/typescript-go/shim/scanner"
|
|
19
19
|
"github.com/samchon/nestia/packages/core/native/transform"
|
|
20
|
+
"github.com/samchon/nestia/packages/core/native/transform/schemaprojection"
|
|
20
21
|
"github.com/samchon/ttsc/packages/ttsc/driver"
|
|
21
22
|
nativecontext "github.com/samchon/typia/packages/typia/native/core/context"
|
|
22
23
|
nativefactories "github.com/samchon/typia/packages/typia/native/core/factories"
|
|
@@ -188,22 +189,22 @@ func nestiaSDKMetadataText(context *nestiaSDKContext, file *shimast.SourceFile,
|
|
|
188
189
|
return nestiaSDKMetadataLiteralText(metadata)
|
|
189
190
|
}
|
|
190
191
|
|
|
191
|
-
|
|
192
|
+
// An explicit JSON null must have a distinct Go representation from authored
|
|
193
|
+
// strings, including strings that happen to resemble an internal marker.
|
|
194
|
+
var nestiaSDKLiteralNull = nativefactories.LiteralFactory_Null{}
|
|
192
195
|
|
|
193
196
|
func nestiaSDKMetadataLiteralText(metadata map[string]any) (string, error) {
|
|
194
197
|
data, err := json.Marshal(nestiaSDKFiniteLiteral(metadata))
|
|
195
198
|
if err != nil {
|
|
196
199
|
return "", err
|
|
197
200
|
}
|
|
198
|
-
|
|
199
|
-
text = strings.ReplaceAll(text, `"`+nestiaSDKLiteralNull+`"`, "null")
|
|
200
|
-
return text, nil
|
|
201
|
+
return string(data), nil
|
|
201
202
|
}
|
|
202
203
|
|
|
203
204
|
// nestiaSDKFiniteLiteral copies a metadata value for encoding/json, writing
|
|
204
205
|
// every non-finite number as null, the way JavaScript's `JSON.stringify` does.
|
|
205
206
|
//
|
|
206
|
-
// typia hands over NaN and
|
|
207
|
+
// typia hands over NaN and positive or negative Infinity wherever a type or a comment spells one: a
|
|
207
208
|
// numeric literal type such as `1e999`, a type tag argument such as
|
|
208
209
|
// `tags.Minimum<1e999>`, and a JSDoc `@x-` extension whose text parses as
|
|
209
210
|
// a float, which `NaN`, `Infinity`, and `inf` all do. encoding/json
|
|
@@ -717,43 +718,67 @@ func nestiaSDKNormalizeImportPath(fileName string, module string) string {
|
|
|
717
718
|
return filepath.ToSlash(filepath.Join("node_modules", module))
|
|
718
719
|
}
|
|
719
720
|
|
|
720
|
-
|
|
721
|
-
|
|
721
|
+
// nestiaSDKReflectImports collects imports from actual type references and
|
|
722
|
+
// typeof queries. Literal values, property names and template text do not bind
|
|
723
|
+
// imports, and named library types are classified by declaration provenance.
|
|
724
|
+
func nestiaSDKReflectImports(prog *driver.Program, node *shimast.Node, imports []nestiaSDKImportInfo) []any {
|
|
722
725
|
output := []any{}
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
continue
|
|
726
|
+
add := func(entity *shimast.Node) {
|
|
727
|
+
if entity == nil {
|
|
728
|
+
return
|
|
727
729
|
}
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
730
|
+
root := entity
|
|
731
|
+
for root != nil && root.Kind == shimast.KindQualifiedName {
|
|
732
|
+
root = root.AsQualifiedName().Left
|
|
733
|
+
}
|
|
734
|
+
if root == nil || root.Kind != shimast.KindIdentifier {
|
|
735
|
+
return
|
|
736
|
+
}
|
|
737
|
+
prefix := root.Text()
|
|
738
|
+
if nestiaSDKIsTypeKeyword(prefix) {
|
|
739
|
+
return
|
|
732
740
|
}
|
|
733
|
-
|
|
734
|
-
|
|
741
|
+
if prog != nil && prog.Checker != nil {
|
|
742
|
+
symbol := prog.Checker.GetSymbolAtLocation(root)
|
|
743
|
+
if symbol != nil && symbol.Flags&shimast.SymbolFlagsAlias != 0 {
|
|
744
|
+
prefixes := map[string]bool{prefix: true}
|
|
745
|
+
for _, imp := range imports {
|
|
746
|
+
if nestiaSDKImportMatches(prefixes, imp) {
|
|
747
|
+
output = append(output, nestiaSDKImportLiteral(imp, prefixes))
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
return
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
output = append(output, nestiaSDKReflectTypeReferenceSymbolImport(prog, entity, nestiaSDKEntityNameText(entity))...)
|
|
735
754
|
}
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
755
|
+
var walk func(*shimast.Node)
|
|
756
|
+
walk = func(current *shimast.Node) {
|
|
757
|
+
if current == nil {
|
|
758
|
+
return
|
|
759
|
+
}
|
|
760
|
+
switch current.Kind {
|
|
761
|
+
case shimast.KindTypeReference:
|
|
762
|
+
add(current.AsTypeReferenceNode().TypeName)
|
|
763
|
+
case shimast.KindTypeQuery:
|
|
764
|
+
add(current.AsTypeQueryNode().ExprName)
|
|
746
765
|
}
|
|
766
|
+
current.ForEachChild(func(child *shimast.Node) bool { walk(child); return false })
|
|
747
767
|
}
|
|
748
|
-
|
|
768
|
+
if node != nil && (node.Kind == shimast.KindIdentifier || node.Kind == shimast.KindQualifiedName) {
|
|
769
|
+
add(node)
|
|
770
|
+
} else {
|
|
771
|
+
walk(node)
|
|
772
|
+
}
|
|
773
|
+
return nestiaSDKMergeImportLiterals(output)
|
|
749
774
|
}
|
|
750
775
|
|
|
751
|
-
|
|
776
|
+
// nestiaSDKIsTypeKeyword reports type spellings that cannot name an imported
|
|
777
|
+
// declaration. Library names such as Date and Array can be shadowed in a module.
|
|
778
|
+
func nestiaSDKIsTypeKeyword(prefix string) bool {
|
|
752
779
|
switch prefix {
|
|
753
780
|
case "any", "unknown", "never", "void", "null", "undefined",
|
|
754
|
-
"string", "number", "boolean", "bigint", "symbol", "object"
|
|
755
|
-
"Array", "ReadonlyArray", "Promise", "Record", "Partial", "Pick", "Omit",
|
|
756
|
-
"Date", "File", "Blob", "Uint8Array", "ArrayBuffer", "Error":
|
|
781
|
+
"string", "number", "boolean", "bigint", "symbol", "object":
|
|
757
782
|
return true
|
|
758
783
|
default:
|
|
759
784
|
return false
|
|
@@ -888,10 +913,10 @@ func nestiaSDKSchemaPipe(context *nestiaSDKContext, typ *shimchecker.Type, typeN
|
|
|
888
913
|
// JSON-schema representation (e.g. a `void` route return or a parameter
|
|
889
914
|
// whose only members are functions). The legacy reader on the JS side
|
|
890
915
|
// already treats a missing `jsonSchema` as "skip", so swallow the panic
|
|
891
|
-
// and omit the field
|
|
916
|
+
// and omit the field; the SDK generator falls back to its own derived
|
|
892
917
|
// schema path. This must never mask a real bug, so re-raise anything we
|
|
893
918
|
// don't recognize as a transformer error from the typia runtime.
|
|
894
|
-
if baked := nestiaSDKTryBakeJsonSchema(prog,
|
|
919
|
+
if baked := nestiaSDKTryBakeJsonSchema(prog, typ, context.collection, result.Data, properties, escape); baked != nil {
|
|
895
920
|
metadataLiteral["jsonSchema"] = baked
|
|
896
921
|
}
|
|
897
922
|
data := map[string]any{
|
|
@@ -913,7 +938,7 @@ func nestiaSDKSchemaPipe(context *nestiaSDKContext, typ *shimchecker.Type, typeN
|
|
|
913
938
|
// nestiaSDKTryBakeJsonSchema runs `JsonSchemasProgrammer.WriteSchemas` for a
|
|
914
939
|
// single metadata and returns the OpenAPI 3.1 schema literal. Returns nil
|
|
915
940
|
// when typia signals the metadata has no JSON-schema representation (e.g.
|
|
916
|
-
// `void` returns, function-only types)
|
|
941
|
+
// `void` returns, function-only types); the JS-side reader handles missing
|
|
917
942
|
// `jsonSchema` fields. Any other panic is re-raised so real bugs surface.
|
|
918
943
|
//
|
|
919
944
|
// With `properties`, the literal also carries the schema of each property of
|
|
@@ -921,9 +946,11 @@ func nestiaSDKSchemaPipe(context *nestiaSDKContext, typ *shimchecker.Type, typeN
|
|
|
921
946
|
// individual parameters (see `nestiaSDKPropertySchemas`).
|
|
922
947
|
func nestiaSDKTryBakeJsonSchema(
|
|
923
948
|
prog *driver.Program,
|
|
924
|
-
|
|
949
|
+
typ *shimchecker.Type,
|
|
950
|
+
registry *schemametadata.MetadataCollection,
|
|
925
951
|
metadata *schemametadata.MetadataSchema,
|
|
926
952
|
properties bool,
|
|
953
|
+
escape bool,
|
|
927
954
|
) (baked map[string]any) {
|
|
928
955
|
defer func() {
|
|
929
956
|
if r := recover(); r != nil {
|
|
@@ -934,6 +961,7 @@ func nestiaSDKTryBakeJsonSchema(
|
|
|
934
961
|
panic(r)
|
|
935
962
|
}
|
|
936
963
|
}()
|
|
964
|
+
metadata = schemaprojection.Project(metadata)
|
|
937
965
|
collection := nativejson.JsonSchemasProgrammer.WriteSchemas(struct {
|
|
938
966
|
Version string
|
|
939
967
|
Metadatas []*schemametadata.MetadataSchema
|
|
@@ -969,7 +997,7 @@ func nestiaSDKTryBakeJsonSchema(
|
|
|
969
997
|
if propertySchemas != nil {
|
|
970
998
|
baked["properties"] = propertySchemas
|
|
971
999
|
}
|
|
972
|
-
nestiaSDKMarkReadonlyArrayJsonSchema(prog,
|
|
1000
|
+
nestiaSDKMarkReadonlyArrayJsonSchema(prog, typ, baked, registry, escape)
|
|
973
1001
|
return baked
|
|
974
1002
|
}
|
|
975
1003
|
|
|
@@ -1187,253 +1215,182 @@ func nestiaSDKIsNilLike(value any) bool {
|
|
|
1187
1215
|
}
|
|
1188
1216
|
}
|
|
1189
1217
|
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
) {
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
) {
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
}
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
property := member.AsPropertySignatureDeclaration()
|
|
1347
|
-
name := nestiaSDKSchemaPropertyName(property.Name())
|
|
1348
|
-
child := nestiaSDKSchemaMap(properties[name])
|
|
1349
|
-
nestiaSDKMarkReadonlyArraySchemaNode(
|
|
1350
|
-
prog,
|
|
1351
|
-
property.Type,
|
|
1352
|
-
child,
|
|
1353
|
-
components,
|
|
1354
|
-
visiting,
|
|
1355
|
-
)
|
|
1356
|
-
}
|
|
1357
|
-
}
|
|
1358
|
-
|
|
1359
|
-
func nestiaSDKTypeReferenceDeclarations(prog *driver.Program, node *shimast.Node) []*shimast.Node {
|
|
1360
|
-
if prog == nil || prog.Checker == nil || node == nil {
|
|
1361
|
-
return nil
|
|
1362
|
-
}
|
|
1363
|
-
symbol := prog.Checker.GetSymbolAtLocation(node)
|
|
1364
|
-
if symbol == nil {
|
|
1365
|
-
typ := prog.Checker.GetTypeFromTypeNode(node)
|
|
1366
|
-
if typ != nil {
|
|
1367
|
-
symbol = typ.Symbol()
|
|
1368
|
-
}
|
|
1369
|
-
}
|
|
1370
|
-
if symbol == nil {
|
|
1371
|
-
return nil
|
|
1372
|
-
}
|
|
1373
|
-
return symbol.Declarations
|
|
1374
|
-
}
|
|
1375
|
-
|
|
1376
|
-
func nestiaSDKReferencedSchema(schema map[string]any, components map[string]any, name string) map[string]any {
|
|
1377
|
-
ref, _ := schema["$ref"].(string)
|
|
1378
|
-
if ref == "" {
|
|
1379
|
-
return schema
|
|
1380
|
-
}
|
|
1381
|
-
const prefix = "#/components/schemas/"
|
|
1382
|
-
if strings.HasPrefix(ref, prefix) {
|
|
1383
|
-
name = strings.TrimPrefix(ref, prefix)
|
|
1384
|
-
}
|
|
1385
|
-
target := nestiaSDKSchemaMap(components[name])
|
|
1386
|
-
if target != nil {
|
|
1387
|
-
return target
|
|
1388
|
-
}
|
|
1389
|
-
return schema
|
|
1390
|
-
}
|
|
1391
|
-
|
|
1218
|
+
// nestiaSDKMarkReadonlyArrayJsonSchema carries the producing checker's readonly
|
|
1219
|
+
// facts into the baked schema. Alias spelling is never an immutability test.
|
|
1220
|
+
func nestiaSDKMarkReadonlyArrayJsonSchema(prog *driver.Program, typ *shimchecker.Type, baked map[string]any, registry *schemametadata.MetadataCollection, escape bool) {
|
|
1221
|
+
registry = registry.Clone()
|
|
1222
|
+
components, _ := baked["components"].(map[string]any)
|
|
1223
|
+
schemas, _ := components["schemas"].(map[string]any)
|
|
1224
|
+
nestiaSDKMarkReadonlySchemaType(prog, typ, nestiaSDKSchemaMap(baked["schema"]), schemas, registry, escape, map[nestiaSDKReadonlyVisit]bool{}, false)
|
|
1225
|
+
for key, schema := range nestiaSDKSchemaMap(baked["properties"]) {
|
|
1226
|
+
nestiaSDKMarkReadonlySchemaType(prog, prog.Checker.GetTypeOfPropertyOfType(typ, key), nestiaSDKSchemaMap(schema), schemas, registry, escape, map[nestiaSDKReadonlyVisit]bool{}, false)
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1229
|
+
|
|
1230
|
+
// nestiaSDKMarkReadonlySchemaType pairs actual substituted checker types with
|
|
1231
|
+
// the schema positions the writer emitted, including inferred types and cycles.
|
|
1232
|
+
func nestiaSDKMarkReadonlySchemaType(prog *driver.Program, typ *shimchecker.Type, schema map[string]any, components map[string]any, registry *schemametadata.MetadataCollection, escape bool, visiting map[nestiaSDKReadonlyVisit]bool, skipEscape bool) {
|
|
1233
|
+
if prog == nil || prog.Checker == nil || typ == nil || schema == nil { return }
|
|
1234
|
+
// The cloned registry preserves the producer's type-to-component identity.
|
|
1235
|
+
// Public emplace lookups cannot mutate the analysis registry or its counters.
|
|
1236
|
+
if escape && !skipEscape {
|
|
1237
|
+
if method := prog.Checker.GetTypeOfPropertyOfType(typ, "toJSON"); method != nil {
|
|
1238
|
+
for _, signature := range prog.Checker.GetSignaturesOfType(method, shimchecker.SignatureKindCall) {
|
|
1239
|
+
if returned := prog.Checker.GetReturnTypeOfSignature(signature); returned != nil && returned != typ {
|
|
1240
|
+
nestiaSDKMarkReadonlySchemaType(prog, returned, schema, components, registry, escape, visiting, true)
|
|
1241
|
+
return
|
|
1242
|
+
}
|
|
1243
|
+
}
|
|
1244
|
+
}
|
|
1245
|
+
}
|
|
1246
|
+
target := schema
|
|
1247
|
+
if ref, ok := schema["$ref"].(string); ok && strings.HasPrefix(ref, "#/components/schemas/") {
|
|
1248
|
+
name := strings.TrimPrefix(ref, "#/components/schemas/")
|
|
1249
|
+
if component := nestiaSDKSchemaMap(components[name]); component != nil {
|
|
1250
|
+
if component["type"] == "object" && typ.Flags() & shimchecker.TypeFlagsObject != 0 {
|
|
1251
|
+
owner, fresh := registry.Emplace(prog.Checker, typ)
|
|
1252
|
+
if fresh || owner.Name != name { return }
|
|
1253
|
+
}
|
|
1254
|
+
target = component
|
|
1255
|
+
}
|
|
1256
|
+
}
|
|
1257
|
+
key := nestiaSDKReadonlyVisit{Type: typ, Schema: reflect.ValueOf(schema).Pointer()}
|
|
1258
|
+
if visiting[key] { return }
|
|
1259
|
+
visiting[key] = true
|
|
1260
|
+
if typ.Flags() & (shimchecker.TypeFlagsUnion | shimchecker.TypeFlagsIntersection) != 0 {
|
|
1261
|
+
for _, child := range typ.AsUnionOrIntersectionType().Types() {
|
|
1262
|
+
matched := false
|
|
1263
|
+
if typ.Flags() & shimchecker.TypeFlagsUnion != 0 {
|
|
1264
|
+
for _, keyword := range []string{"oneOf", "anyOf"} {
|
|
1265
|
+
if branches := nestiaSDKSchemaList(target[keyword]); len(branches) != 0 {
|
|
1266
|
+
matched = true
|
|
1267
|
+
analyzed := nativefactories.MetadataFactory.Analyze(nativefactories.MetadataFactory_IProps{
|
|
1268
|
+
Checker: prog.Checker,
|
|
1269
|
+
Options: nativefactories.MetadataFactory_IOptions{Escape: escape && !skipEscape, Constant: true, Absorb: true},
|
|
1270
|
+
Components: registry.Clone(), Type: child,
|
|
1271
|
+
})
|
|
1272
|
+
if analyzed.Success {
|
|
1273
|
+
// A union constituent can have no JSON value (undefined, void, never,
|
|
1274
|
+
// or function-only). Unlike the top-level writer, this branch probe
|
|
1275
|
+
// must return nil for those omissions without rejecting the parent.
|
|
1276
|
+
produced := nativeiterate.Json_schema_station(nativeiterate.Json_schema_station_props{
|
|
1277
|
+
BlockNever: false,
|
|
1278
|
+
Components: &nativeiterate.OpenApi_IComponents{Schemas: map[string]nativeiterate.JsonSchema{}},
|
|
1279
|
+
Attribute: nativeiterate.JsonSchema{}, Metadata: schemaprojection.Project(analyzed.Data),
|
|
1280
|
+
})
|
|
1281
|
+
if produced != nil {
|
|
1282
|
+
expected := nestiaSDKJsonSchemaLiteral(produced)
|
|
1283
|
+
for _, branch := range branches {
|
|
1284
|
+
if nestiaSDKReadonlySchemaEquivalent(expected, branch) {
|
|
1285
|
+
nestiaSDKMarkReadonlySchemaType(prog, child, nestiaSDKSchemaMap(branch), components, registry, escape, visiting, skipEscape)
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1290
|
+
}
|
|
1291
|
+
}
|
|
1292
|
+
}
|
|
1293
|
+
if !matched { nestiaSDKMarkReadonlySchemaType(prog, child, schema, components, registry, escape, visiting, skipEscape) }
|
|
1294
|
+
}
|
|
1295
|
+
return
|
|
1296
|
+
}
|
|
1297
|
+
for _, keyword := range []string{"oneOf", "anyOf", "allOf"} {
|
|
1298
|
+
if branches := nestiaSDKSchemaList(target[keyword]); len(branches) != 0 {
|
|
1299
|
+
for _, branch := range branches {
|
|
1300
|
+
nestiaSDKMarkReadonlySchemaType(prog, typ, nestiaSDKSchemaMap(branch), components, registry, escape, visiting, skipEscape)
|
|
1301
|
+
}
|
|
1302
|
+
return
|
|
1303
|
+
}
|
|
1304
|
+
}
|
|
1305
|
+
if target["type"] == "array" {
|
|
1306
|
+
readonly := false
|
|
1307
|
+
var element *shimchecker.Type
|
|
1308
|
+
if shimchecker.IsTupleType(typ) {
|
|
1309
|
+
readonly = typ.TargetTupleType().IsReadonly()
|
|
1310
|
+
} else {
|
|
1311
|
+
for _, index := range prog.Checker.GetIndexInfosOfType(typ) {
|
|
1312
|
+
if index.KeyType().Flags() & shimchecker.TypeFlagsNumber != 0 { element = index.ValueType(); readonly = index.IsReadonly() }
|
|
1313
|
+
}
|
|
1314
|
+
}
|
|
1315
|
+
if !shimchecker.IsTupleType(typ) && element == nil { return }
|
|
1316
|
+
mutableKey := nestiaSDKReadonlyVisit{Schema: reflect.ValueOf(target).Pointer()}
|
|
1317
|
+
if !readonly {
|
|
1318
|
+
visiting[mutableKey] = true
|
|
1319
|
+
delete(schema, "x-readonly-array")
|
|
1320
|
+
delete(target, "x-readonly-array")
|
|
1321
|
+
} else if !visiting[mutableKey] { schema["x-readonly-array"] = true; target["x-readonly-array"] = true }
|
|
1322
|
+
if shimchecker.IsTupleType(typ) {
|
|
1323
|
+
arguments := prog.Checker.GetTypeArguments(typ)
|
|
1324
|
+
for index, flag := range typ.TargetTupleType().ElementFlags() {
|
|
1325
|
+
if flag == shimchecker.ElementFlagsRest && index < len(arguments) { nestiaSDKMarkReadonlySchemaType(prog, arguments[index], nestiaSDKSchemaMap(target["additionalItems"]), components, registry, escape, visiting, false) }
|
|
1326
|
+
}
|
|
1327
|
+
for index, child := range nestiaSDKSchemaList(target["prefixItems"]) {
|
|
1328
|
+
if index < len(arguments) { nestiaSDKMarkReadonlySchemaType(prog, arguments[index], nestiaSDKSchemaMap(child), components, registry, escape, visiting, false) }
|
|
1329
|
+
}
|
|
1330
|
+
} else if element != nil {
|
|
1331
|
+
nestiaSDKMarkReadonlySchemaType(prog, element, nestiaSDKSchemaMap(target["items"]), components, registry, escape, visiting, false)
|
|
1332
|
+
}
|
|
1333
|
+
return
|
|
1334
|
+
}
|
|
1335
|
+
for key, child := range nestiaSDKSchemaMap(target["properties"]) {
|
|
1336
|
+
nestiaSDKMarkReadonlySchemaType(prog, prog.Checker.GetTypeOfPropertyOfType(typ, key), nestiaSDKSchemaMap(child), components, registry, escape, visiting, false)
|
|
1337
|
+
}
|
|
1338
|
+
for _, index := range prog.Checker.GetIndexInfosOfType(typ) {
|
|
1339
|
+
nestiaSDKMarkReadonlySchemaType(prog, index.ValueType(), nestiaSDKSchemaMap(target["additionalProperties"]), components, registry, escape, visiting, false)
|
|
1340
|
+
}
|
|
1341
|
+
}
|
|
1342
|
+
|
|
1343
|
+
// nestiaSDKReadonlySchemaEquivalent compares the native writer's branch shape,
|
|
1344
|
+
// ignoring only the readonly facts this traversal has already attached.
|
|
1345
|
+
func nestiaSDKReadonlySchemaEquivalent(expected any, actual any) bool {
|
|
1346
|
+
left, right := nestiaSDKSchemaMap(expected), nestiaSDKSchemaMap(actual)
|
|
1347
|
+
if left != nil && right != nil {
|
|
1348
|
+
count := 0
|
|
1349
|
+
for key, value := range left {
|
|
1350
|
+
if key == "x-readonly-array" { continue }
|
|
1351
|
+
other, exists := right[key]
|
|
1352
|
+
if !exists || !nestiaSDKReadonlySchemaEquivalent(value, other) { return false }
|
|
1353
|
+
count++
|
|
1354
|
+
}
|
|
1355
|
+
for key := range right { if key != "x-readonly-array" { count-- } }
|
|
1356
|
+
return count == 0
|
|
1357
|
+
}
|
|
1358
|
+
leftList, rightList := nestiaSDKSchemaList(expected), nestiaSDKSchemaList(actual)
|
|
1359
|
+
if leftList != nil && rightList != nil {
|
|
1360
|
+
if len(leftList) != len(rightList) { return false }
|
|
1361
|
+
for i := range leftList { if !nestiaSDKReadonlySchemaEquivalent(leftList[i], rightList[i]) { return false } }
|
|
1362
|
+
return true
|
|
1363
|
+
}
|
|
1364
|
+
return reflect.DeepEqual(expected, actual)
|
|
1365
|
+
}
|
|
1366
|
+
// nestiaSDKReadonlyVisit identifies one checker-type/schema-map pair per bake.
|
|
1367
|
+
type nestiaSDKReadonlyVisit struct {
|
|
1368
|
+
Type *shimchecker.Type
|
|
1369
|
+
Schema uintptr
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
// nestiaSDKSchemaMap exposes schema maps and the values of an ordered property
|
|
1373
|
+
// dictionary without copying or changing its key order.
|
|
1392
1374
|
func nestiaSDKSchemaMap(input any) map[string]any {
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1375
|
+
switch value := input.(type) {
|
|
1376
|
+
case map[string]any: return value
|
|
1377
|
+
case nativeiterate.JsonSchema: return map[string]any(value)
|
|
1378
|
+
case nativefactories.LiteralFactory_OrderedObject: return value.Values
|
|
1379
|
+
case *nativefactories.LiteralFactory_OrderedObject:
|
|
1380
|
+
if value != nil { return value.Values }
|
|
1381
|
+
}
|
|
1382
|
+
return nil
|
|
1401
1383
|
}
|
|
1402
1384
|
|
|
1403
1385
|
func nestiaSDKSchemaList(input any) []any {
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
return output
|
|
1413
|
-
default:
|
|
1414
|
-
return nil
|
|
1415
|
-
}
|
|
1416
|
-
}
|
|
1417
|
-
|
|
1418
|
-
func nestiaSDKReadonlyArrayOperand(node *shimast.Node) bool {
|
|
1419
|
-
if node == nil {
|
|
1420
|
-
return false
|
|
1421
|
-
}
|
|
1422
|
-
switch node.Kind {
|
|
1423
|
-
case shimast.KindArrayType, shimast.KindTupleType:
|
|
1424
|
-
return true
|
|
1425
|
-
case shimast.KindTypeReference:
|
|
1426
|
-
return nestiaSDKEntityNameText(node.AsTypeReferenceNode().TypeName) == "Array"
|
|
1427
|
-
case shimast.KindParenthesizedType:
|
|
1428
|
-
return nestiaSDKReadonlyArrayOperand(node.AsParenthesizedTypeNode().Type)
|
|
1429
|
-
default:
|
|
1430
|
-
return false
|
|
1431
|
-
}
|
|
1432
|
-
}
|
|
1433
|
-
|
|
1434
|
-
func nestiaSDKSchemaPropertyName(node *shimast.Node) string {
|
|
1435
|
-
text := nestiaSDKTypeNodeText(node)
|
|
1436
|
-
return strings.Trim(text, "\"'")
|
|
1386
|
+
switch value := input.(type) {
|
|
1387
|
+
case []any: return value
|
|
1388
|
+
case []nativeiterate.JsonSchema:
|
|
1389
|
+
output := make([]any, len(value))
|
|
1390
|
+
for i, elem := range value { output[i] = elem }
|
|
1391
|
+
return output
|
|
1392
|
+
default: return nil
|
|
1393
|
+
}
|
|
1437
1394
|
}
|
|
1438
1395
|
|
|
1439
1396
|
func nestiaSDKRestoreUnionOrder(typeNode *shimast.Node, metadata *schemametadata.MetadataSchema) {
|
|
@@ -1622,27 +1579,11 @@ func nestiaSDKIsTypeGuardError(prog *driver.Program, typ *shimchecker.Type, type
|
|
|
1622
1579
|
}
|
|
1623
1580
|
|
|
1624
1581
|
func nestiaSDKIsTypiaSourceFile(prog *driver.Program, source *shimast.SourceFile) bool {
|
|
1625
|
-
|
|
1626
|
-
return false
|
|
1627
|
-
}
|
|
1628
|
-
for directory := filepath.Dir(source.FileName()); ; {
|
|
1629
|
-
contents, ok := prog.FS.ReadFile(filepath.Join(directory, "package.json"))
|
|
1630
|
-
if ok {
|
|
1631
|
-
var pack struct {
|
|
1632
|
-
Name string `json:"name"`
|
|
1633
|
-
}
|
|
1634
|
-
return json.Unmarshal([]byte(contents), &pack) == nil && pack.Name == "typia"
|
|
1635
|
-
}
|
|
1636
|
-
parent := filepath.Dir(directory)
|
|
1637
|
-
if parent == directory {
|
|
1638
|
-
return false
|
|
1639
|
-
}
|
|
1640
|
-
directory = parent
|
|
1641
|
-
}
|
|
1582
|
+
return transform.SourceFilePackageName(prog, source) == "typia"
|
|
1642
1583
|
}
|
|
1643
1584
|
|
|
1644
1585
|
func nestiaSDKTypeGuardErrorSchemaPipe() any {
|
|
1645
|
-
// Synthetic metadata for `TypeGuardError` exception responses
|
|
1586
|
+
// Synthetic metadata for `TypeGuardError` exception responses; it does not
|
|
1646
1587
|
// flow through `nestiaSDKSchemaPipe`, so the pre-baked fields legacy.ts
|
|
1647
1588
|
// reads (size/name/empty/jsonSchema) have to be filled by hand.
|
|
1648
1589
|
metadata := nestiaSDKObjectReferenceSchema("TypeGuardErrorany")
|
|
@@ -1792,6 +1733,9 @@ func nestiaSDKReflectType(
|
|
|
1792
1733
|
if typeNode == nil {
|
|
1793
1734
|
return map[string]any{"name": "__type"}, []any{}
|
|
1794
1735
|
}
|
|
1736
|
+
if ref, refs, ok := nestiaSDKReflectAsyncAlias(prog, imports, typ, typeNode); ok {
|
|
1737
|
+
return ref, refs
|
|
1738
|
+
}
|
|
1795
1739
|
if typeNode != nil {
|
|
1796
1740
|
if ref, refs, ok := nestiaSDKReflectTypeNode(prog, imports, typeNode); ok {
|
|
1797
1741
|
return ref, refs
|
|
@@ -1807,7 +1751,120 @@ func nestiaSDKReflectType(
|
|
|
1807
1751
|
if name == "any" && prog != nil && prog.Checker != nil && typ != nil {
|
|
1808
1752
|
name = prog.Checker.TypeToString(typ)
|
|
1809
1753
|
}
|
|
1810
|
-
return map[string]any{"name": name}, nestiaSDKReflectImports(
|
|
1754
|
+
return map[string]any{"name": name}, nestiaSDKReflectImports(prog, typeNode, imports)
|
|
1755
|
+
}
|
|
1756
|
+
|
|
1757
|
+
// nestiaSDKReflectAsyncAlias reflects the actual response payload when its
|
|
1758
|
+
// annotation aliases an asynchronous wrapper. The checker builds a concrete AST
|
|
1759
|
+
// in the annotation's scope, substituting generic arguments and defaults; its
|
|
1760
|
+
// identifier-symbol map preserves declaration identity without reparsing text.
|
|
1761
|
+
// Ordinary user wrappers keep their original annotation and imports.
|
|
1762
|
+
func nestiaSDKReflectAsyncAlias(
|
|
1763
|
+
prog *driver.Program,
|
|
1764
|
+
imports []nestiaSDKImportInfo,
|
|
1765
|
+
typ *shimchecker.Type,
|
|
1766
|
+
node *shimast.Node,
|
|
1767
|
+
) (map[string]any, []any, bool) {
|
|
1768
|
+
if prog == nil || prog.Checker == nil || typ == nil || node == nil {
|
|
1769
|
+
return nil, nil, false
|
|
1770
|
+
}
|
|
1771
|
+
reference := node
|
|
1772
|
+
for reference.Kind == shimast.KindParenthesizedType {
|
|
1773
|
+
reference = reference.AsParenthesizedTypeNode().Type
|
|
1774
|
+
}
|
|
1775
|
+
if reference.Kind != shimast.KindTypeReference || transform.NestiaCoreIsAsyncReturnWrapperReference(prog, reference.AsTypeReferenceNode().TypeName) {
|
|
1776
|
+
return nil, nil, false
|
|
1777
|
+
}
|
|
1778
|
+
declared := prog.Checker.GetTypeFromTypeNode(node)
|
|
1779
|
+
if declared == nil || declared == typ || declared.Symbol() == nil {
|
|
1780
|
+
return nil, nil, false
|
|
1781
|
+
}
|
|
1782
|
+
isAsync := func(current *shimchecker.Type) bool {
|
|
1783
|
+
if current == nil || current.Symbol() == nil {
|
|
1784
|
+
return false
|
|
1785
|
+
}
|
|
1786
|
+
for _, declaration := range current.Symbol().Declarations {
|
|
1787
|
+
if declaration != nil && declaration.Name() != nil && transform.NestiaCoreIsAsyncReturnWrapperReference(prog, declaration.Name()) {
|
|
1788
|
+
return true
|
|
1789
|
+
}
|
|
1790
|
+
}
|
|
1791
|
+
return false
|
|
1792
|
+
}
|
|
1793
|
+
if !isAsync(declared) {
|
|
1794
|
+
return nil, nil, false
|
|
1795
|
+
}
|
|
1796
|
+
seen := map[*shimchecker.Type]bool{}
|
|
1797
|
+
for isAsync(typ) && !seen[typ] {
|
|
1798
|
+
seen[typ] = true
|
|
1799
|
+
arguments := prog.Checker.GetTypeArguments(typ)
|
|
1800
|
+
if len(arguments) != 1 {
|
|
1801
|
+
break
|
|
1802
|
+
}
|
|
1803
|
+
typ = arguments[0]
|
|
1804
|
+
}
|
|
1805
|
+
symbols := map[*shimast.IdentifierNode]*shimast.Symbol{}
|
|
1806
|
+
// TypeScript's nodebuilder.FlagsNoTruncation is the public flag bit 1 << 0.
|
|
1807
|
+
// The shim exposes TypeToTypeNode but no alias for that internal enum; a
|
|
1808
|
+
// response type is executable client syntax and cannot use display elision.
|
|
1809
|
+
const noTruncation = 1 << 0
|
|
1810
|
+
projected := prog.Checker.TypeToTypeNode(typ, node, noTruncation, symbols)
|
|
1811
|
+
if projected == nil {
|
|
1812
|
+
return nil, nil, false
|
|
1813
|
+
}
|
|
1814
|
+
ref, _, ok := nestiaSDKReflectTypeNode(nil, nil, projected)
|
|
1815
|
+
if !ok {
|
|
1816
|
+
return nil, nil, false
|
|
1817
|
+
}
|
|
1818
|
+
refs := []any{}
|
|
1819
|
+
add := func(entity *shimast.Node) {
|
|
1820
|
+
root := entity
|
|
1821
|
+
for root != nil && root.Kind == shimast.KindQualifiedName {
|
|
1822
|
+
root = root.AsQualifiedName().Left
|
|
1823
|
+
}
|
|
1824
|
+
if root == nil || root.Kind != shimast.KindIdentifier {
|
|
1825
|
+
return
|
|
1826
|
+
}
|
|
1827
|
+
symbol := symbols[root]
|
|
1828
|
+
if symbol == nil || symbol.Flags&shimast.SymbolFlagsTypeParameter != 0 {
|
|
1829
|
+
return
|
|
1830
|
+
}
|
|
1831
|
+
prefixes := map[string]bool{root.Text(): true}
|
|
1832
|
+
matched := false
|
|
1833
|
+
for _, imp := range imports {
|
|
1834
|
+
if nestiaSDKImportMatches(prefixes, imp) {
|
|
1835
|
+
refs = append(refs, nestiaSDKImportLiteral(imp, prefixes))
|
|
1836
|
+
matched = true
|
|
1837
|
+
}
|
|
1838
|
+
}
|
|
1839
|
+
if matched {
|
|
1840
|
+
return
|
|
1841
|
+
}
|
|
1842
|
+
for _, declaration := range symbol.Declarations {
|
|
1843
|
+
source := shimast.GetSourceFileOfNode(declaration)
|
|
1844
|
+
if source != nil && (prog.TSProgram == nil || !prog.TSProgram.IsLibFile(source)) {
|
|
1845
|
+
refs = append(refs, map[string]any{
|
|
1846
|
+
"file": filepath.ToSlash(source.FileName()), "asterisk": nestiaSDKLiteralNull,
|
|
1847
|
+
"default": nestiaSDKLiteralNull, "elements": []string{root.Text()},
|
|
1848
|
+
})
|
|
1849
|
+
return
|
|
1850
|
+
}
|
|
1851
|
+
}
|
|
1852
|
+
}
|
|
1853
|
+
var walk func(*shimast.Node)
|
|
1854
|
+
walk = func(current *shimast.Node) {
|
|
1855
|
+
if current == nil {
|
|
1856
|
+
return
|
|
1857
|
+
}
|
|
1858
|
+
switch current.Kind {
|
|
1859
|
+
case shimast.KindTypeReference:
|
|
1860
|
+
add(current.AsTypeReferenceNode().TypeName)
|
|
1861
|
+
case shimast.KindTypeQuery:
|
|
1862
|
+
add(current.AsTypeQueryNode().ExprName)
|
|
1863
|
+
}
|
|
1864
|
+
current.ForEachChild(func(child *shimast.Node) bool { walk(child); return false })
|
|
1865
|
+
}
|
|
1866
|
+
walk(projected)
|
|
1867
|
+
return ref, nestiaSDKMergeImportLiterals(refs), true
|
|
1811
1868
|
}
|
|
1812
1869
|
|
|
1813
1870
|
func nestiaSDKReflectTypeNode(
|
|
@@ -1829,7 +1886,7 @@ func nestiaSDKReflectTypeNode(
|
|
|
1829
1886
|
element, refs, ok := nestiaSDKReflectTypeNode(prog, imports, node.AsArrayTypeNode().ElementType)
|
|
1830
1887
|
if ok == false {
|
|
1831
1888
|
element = map[string]any{"name": nestiaSDKTypeNodeText(node.AsArrayTypeNode().ElementType)}
|
|
1832
|
-
refs = nestiaSDKReflectImports(
|
|
1889
|
+
refs = nestiaSDKReflectImports(prog, node.AsArrayTypeNode().ElementType, imports)
|
|
1833
1890
|
}
|
|
1834
1891
|
return map[string]any{
|
|
1835
1892
|
"name": "Array",
|
|
@@ -1839,34 +1896,29 @@ func nestiaSDKReflectTypeNode(
|
|
|
1839
1896
|
child, refs, ok := nestiaSDKReflectTypeNode(prog, imports, node.AsParenthesizedTypeNode().Type)
|
|
1840
1897
|
if ok == false {
|
|
1841
1898
|
child = map[string]any{"name": nestiaSDKTypeNodeText(node.AsParenthesizedTypeNode().Type)}
|
|
1842
|
-
refs = nestiaSDKReflectImports(
|
|
1899
|
+
refs = nestiaSDKReflectImports(prog, node.AsParenthesizedTypeNode().Type, imports)
|
|
1843
1900
|
}
|
|
1844
|
-
name
|
|
1845
|
-
return map[string]any{"name": "(" + name + ")"}, refs, true
|
|
1901
|
+
return map[string]any{"name": "(" + nestiaSDKReflectTypeText(child) + ")"}, refs, true
|
|
1846
1902
|
case shimast.KindTypeOperator:
|
|
1847
1903
|
operator := node.AsTypeOperatorNode()
|
|
1848
1904
|
prefix := nestiaSDKTypeOperatorPrefix(node, operator.Type)
|
|
1849
1905
|
if prefix == "" {
|
|
1850
1906
|
return nil, nil, false
|
|
1851
1907
|
}
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
}
|
|
1857
|
-
|
|
1858
|
-
return map[string]any{"name": prefix + " " + name}, refs, true
|
|
1908
|
+
// Operators retain their actual syntax: readonly requires an array or
|
|
1909
|
+
// tuple operand, and rendering the reflected Array<T> form here would
|
|
1910
|
+
// produce invalid TypeScript. Checker-projected nodes already contain
|
|
1911
|
+
// concrete alias arguments and are printed by the same text operation.
|
|
1912
|
+
return map[string]any{"name": nestiaSDKTypeNodeText(node)},
|
|
1913
|
+
nestiaSDKReflectImports(prog, operator.Type, imports), true
|
|
1859
1914
|
case shimast.KindTypeQuery:
|
|
1860
1915
|
return nil, nil, false
|
|
1861
1916
|
case shimast.KindTypeReference:
|
|
1862
1917
|
ref := node.AsTypeReferenceNode()
|
|
1863
1918
|
name := nestiaSDKEntityNameText(ref.TypeName)
|
|
1864
|
-
rootRefs := nestiaSDKReflectImports(
|
|
1865
|
-
if len(rootRefs) == 0 && nestiaSDKIsAsyncReturnWrapper(prog, ref.TypeName, name) == false {
|
|
1866
|
-
rootRefs = nestiaSDKReflectTypeReferenceSymbolImport(prog, ref.TypeName, name)
|
|
1867
|
-
}
|
|
1919
|
+
rootRefs := nestiaSDKReflectImports(prog, ref.TypeName, imports)
|
|
1868
1920
|
if ref.TypeArguments != nil && len(ref.TypeArguments.Nodes) != 0 {
|
|
1869
|
-
if
|
|
1921
|
+
if transform.NestiaCoreIsAsyncReturnWrapperReference(prog, ref.TypeName) && len(ref.TypeArguments.Nodes) == 1 {
|
|
1870
1922
|
return nestiaSDKReflectTypeNode(prog, imports, ref.TypeArguments.Nodes[0])
|
|
1871
1923
|
}
|
|
1872
1924
|
args := make([]any, 0, len(ref.TypeArguments.Nodes))
|
|
@@ -1876,7 +1928,7 @@ func nestiaSDKReflectTypeNode(
|
|
|
1876
1928
|
if ok == false {
|
|
1877
1929
|
text := nestiaSDKTypeNodeText(child)
|
|
1878
1930
|
arg = map[string]any{"name": text}
|
|
1879
|
-
refs = nestiaSDKReflectImports(
|
|
1931
|
+
refs = nestiaSDKReflectImports(prog, child, imports)
|
|
1880
1932
|
}
|
|
1881
1933
|
args = append(args, arg)
|
|
1882
1934
|
groups = append(groups, refs)
|
|
@@ -1892,16 +1944,20 @@ func nestiaSDKReflectTypeNode(
|
|
|
1892
1944
|
if name == "" {
|
|
1893
1945
|
return nil, nil, false
|
|
1894
1946
|
}
|
|
1895
|
-
return map[string]any{"name": name}, nestiaSDKReflectImports(
|
|
1947
|
+
return map[string]any{"name": name}, nestiaSDKReflectImports(prog, node, imports), true
|
|
1896
1948
|
}
|
|
1897
1949
|
}
|
|
1898
1950
|
|
|
1951
|
+
// nestiaSDKReflectTypeReferenceSymbolImport supplies a declaration import when
|
|
1952
|
+
// no authored import binding describes the referenced type. The actual program's
|
|
1953
|
+
// library-file identity keeps global library declarations out of client imports.
|
|
1954
|
+
// Locally bound type parameters have no importable module declaration.
|
|
1899
1955
|
func nestiaSDKReflectTypeReferenceSymbolImport(prog *driver.Program, node *shimast.Node, name string) []any {
|
|
1900
1956
|
if prog == nil || prog.Checker == nil || node == nil {
|
|
1901
1957
|
return nil
|
|
1902
1958
|
}
|
|
1903
1959
|
prefix := strings.Split(name, ".")[0]
|
|
1904
|
-
if
|
|
1960
|
+
if nestiaSDKIsTypeKeyword(prefix) {
|
|
1905
1961
|
return nil
|
|
1906
1962
|
}
|
|
1907
1963
|
symbol := prog.Checker.GetSymbolAtLocation(node)
|
|
@@ -1911,17 +1967,18 @@ func nestiaSDKReflectTypeReferenceSymbolImport(prog *driver.Program, node *shima
|
|
|
1911
1967
|
symbol = typ.Symbol()
|
|
1912
1968
|
}
|
|
1913
1969
|
}
|
|
1914
|
-
if symbol == nil || len(symbol.Declarations) == 0 {
|
|
1970
|
+
if symbol == nil || symbol.Flags&shimast.SymbolFlagsTypeParameter != 0 || len(symbol.Declarations) == 0 {
|
|
1915
1971
|
return nil
|
|
1916
1972
|
}
|
|
1917
1973
|
sourceFile := shimast.GetSourceFileOfNode(symbol.Declarations[0])
|
|
1918
1974
|
if sourceFile == nil {
|
|
1919
1975
|
return nil
|
|
1920
1976
|
}
|
|
1921
|
-
|
|
1922
|
-
if
|
|
1977
|
+
// a default library type, whichever folder or replacement package supplies it
|
|
1978
|
+
if prog.TSProgram != nil && prog.TSProgram.IsLibFile(sourceFile) {
|
|
1923
1979
|
return nil
|
|
1924
1980
|
}
|
|
1981
|
+
file := filepath.ToSlash(sourceFile.FileName())
|
|
1925
1982
|
return []any{
|
|
1926
1983
|
map[string]any{
|
|
1927
1984
|
"file": file,
|
|
@@ -1948,7 +2005,7 @@ func nestiaSDKReflectJoinedTypeNode(
|
|
|
1948
2005
|
if ok == false {
|
|
1949
2006
|
text := nestiaSDKTypeNodeText(child)
|
|
1950
2007
|
names = append(names, text)
|
|
1951
|
-
groups = append(groups, nestiaSDKReflectImports(
|
|
2008
|
+
groups = append(groups, nestiaSDKReflectImports(prog, child, imports))
|
|
1952
2009
|
} else {
|
|
1953
2010
|
names = append(names, nestiaSDKReflectTypeText(ref))
|
|
1954
2011
|
groups = append(groups, refs)
|
|
@@ -2105,13 +2162,14 @@ func nestiaSDKIsConnectionHeader(typ *shimchecker.Type) bool {
|
|
|
2105
2162
|
}
|
|
2106
2163
|
|
|
2107
2164
|
// nestiaSDKWebSocketParameterType reflects an @WebSocketRoute.Acceptor() or
|
|
2108
|
-
// .Driver() parameter
|
|
2165
|
+
// .Driver() parameter as the
|
|
2109
2166
|
// tgrid reference it spells, such as `WebSocketAcceptor<Header, Provider,
|
|
2110
2167
|
// Listener>`, because the generated client needs those type arguments. Each
|
|
2111
2168
|
// argument is reflected in the file that writes it, and one naming a type
|
|
2112
2169
|
// parameter of a generic alias is replaced by what the annotation passes for
|
|
2113
|
-
// it.
|
|
2114
|
-
//
|
|
2170
|
+
// it. Only argument imports belong to the client; the outer server wrapper
|
|
2171
|
+
// binding is not written there. It returns nil for an unrecognized wrapper,
|
|
2172
|
+
// and an error for an alias using its type parameter inside an
|
|
2115
2173
|
// argument, such as `IRoom<P>`, which no written node spells.
|
|
2116
2174
|
func nestiaSDKWebSocketParameterType(
|
|
2117
2175
|
context *nestiaSDKContext,
|
|
@@ -2124,9 +2182,7 @@ func nestiaSDKWebSocketParameterType(
|
|
|
2124
2182
|
return nil, nil, nil
|
|
2125
2183
|
}
|
|
2126
2184
|
chain, name := transform.NestiaCoreWebSocketTypeReference(context.prog, nestiaSDKParameterTypeNode(param))
|
|
2127
|
-
|
|
2128
|
-
// plain type reference, but reflects an import type without its arguments
|
|
2129
|
-
if len(chain) == 0 || (len(chain) == 1 && chain[0].Kind == shimast.KindTypeReference) {
|
|
2185
|
+
if len(chain) == 0 {
|
|
2130
2186
|
return nil, nil, nil
|
|
2131
2187
|
}
|
|
2132
2188
|
args := []any{}
|
|
@@ -2149,7 +2205,7 @@ func nestiaSDKWebSocketParameterType(
|
|
|
2149
2205
|
if ok == false {
|
|
2150
2206
|
text := nestiaSDKTypeNodeText(argument)
|
|
2151
2207
|
arg = map[string]any{"name": text}
|
|
2152
|
-
refs = nestiaSDKReflectImports(
|
|
2208
|
+
refs = nestiaSDKReflectImports(context.prog, argument, imports)
|
|
2153
2209
|
}
|
|
2154
2210
|
args = append(args, arg)
|
|
2155
2211
|
groups = append(groups, refs)
|
|
@@ -2286,7 +2342,7 @@ func nestiaSDKMethodReturnTypeNode(prog *driver.Program, method *shimast.Node) *
|
|
|
2286
2342
|
func nestiaSDKReturnTypeNode(prog *driver.Program, node *shimast.Node) *shimast.Node {
|
|
2287
2343
|
if node != nil && node.Kind == shimast.KindTypeReference {
|
|
2288
2344
|
ref := node.AsTypeReferenceNode()
|
|
2289
|
-
if ref != nil && ref.TypeArguments != nil && len(ref.TypeArguments.Nodes) == 1 &&
|
|
2345
|
+
if ref != nil && ref.TypeArguments != nil && len(ref.TypeArguments.Nodes) == 1 && transform.NestiaCoreIsAsyncReturnWrapperReference(prog, ref.TypeName) {
|
|
2290
2346
|
return ref.TypeArguments.Nodes[0]
|
|
2291
2347
|
}
|
|
2292
2348
|
}
|
|
@@ -2296,84 +2352,18 @@ func nestiaSDKReturnTypeNode(prog *driver.Program, node *shimast.Node) *shimast.
|
|
|
2296
2352
|
func nestiaSDKEntityNameText(node *shimast.Node) string {
|
|
2297
2353
|
return nestiaSDKTypeNodeText(node)
|
|
2298
2354
|
}
|
|
2299
|
-
func nestiaSDKIsAsyncReturnWrapper(
|
|
2300
|
-
prog *driver.Program,
|
|
2301
|
-
node *shimast.Node,
|
|
2302
|
-
name string,
|
|
2303
|
-
) bool {
|
|
2304
|
-
if name == "Promise" {
|
|
2305
|
-
return true
|
|
2306
|
-
}
|
|
2307
|
-
if name != "Observable" || prog == nil || prog.Checker == nil {
|
|
2308
|
-
return false
|
|
2309
|
-
}
|
|
2310
|
-
symbol := prog.Checker.GetSymbolAtLocation(node)
|
|
2311
|
-
return nestiaSDKIsRxjsObservableImport(node) ||
|
|
2312
|
-
(symbol != nil && nestiaSDKIsRxjsDeclarations(symbol.Declarations))
|
|
2313
|
-
}
|
|
2314
|
-
|
|
2315
|
-
func nestiaSDKIsRxjsDeclarations(declarations []*shimast.Node) bool {
|
|
2316
|
-
for _, decl := range declarations {
|
|
2317
|
-
sourceFile := shimast.GetSourceFileOfNode(decl)
|
|
2318
|
-
if sourceFile == nil {
|
|
2319
|
-
continue
|
|
2320
|
-
}
|
|
2321
|
-
file := filepath.ToSlash(sourceFile.FileName())
|
|
2322
|
-
if strings.Contains(file, "/node_modules/rxjs/") {
|
|
2323
|
-
return true
|
|
2324
|
-
}
|
|
2325
|
-
}
|
|
2326
|
-
return false
|
|
2327
|
-
}
|
|
2328
|
-
|
|
2329
|
-
func nestiaSDKIsRxjsObservableImport(node *shimast.Node) bool {
|
|
2330
|
-
source, ok := transform.SourceFileText(shimast.GetSourceFileOfNode(node))
|
|
2331
|
-
return ok && nestiaSDKHasNamedImport(source, "rxjs", "Observable", "Observable")
|
|
2332
|
-
}
|
|
2333
|
-
|
|
2334
|
-
func nestiaSDKHasNamedImport(
|
|
2335
|
-
source string,
|
|
2336
|
-
module string,
|
|
2337
|
-
imported string,
|
|
2338
|
-
local string,
|
|
2339
|
-
) bool {
|
|
2340
|
-
for _, match := range nestiaSDKImportFromPattern.FindAllStringSubmatch(source, -1) {
|
|
2341
|
-
if len(match) < 3 || match[2] != module {
|
|
2342
|
-
continue
|
|
2343
|
-
}
|
|
2344
|
-
open := strings.Index(match[1], "{")
|
|
2345
|
-
close := strings.LastIndex(match[1], "}")
|
|
2346
|
-
if open < 0 || close <= open {
|
|
2347
|
-
continue
|
|
2348
|
-
}
|
|
2349
|
-
for _, part := range strings.Split(match[1][open+1:close], ",") {
|
|
2350
|
-
fields := strings.Fields(strings.TrimPrefix(strings.TrimSpace(part), "type "))
|
|
2351
|
-
if len(fields) == 1 && fields[0] == local && imported == local {
|
|
2352
|
-
return true
|
|
2353
|
-
}
|
|
2354
|
-
if len(fields) == 3 &&
|
|
2355
|
-
fields[0] == imported &&
|
|
2356
|
-
fields[1] == "as" &&
|
|
2357
|
-
fields[2] == local {
|
|
2358
|
-
return true
|
|
2359
|
-
}
|
|
2360
|
-
}
|
|
2361
|
-
}
|
|
2362
|
-
return false
|
|
2363
|
-
}
|
|
2364
|
-
|
|
2365
|
-
var nestiaSDKImportFromPattern = regexp.MustCompile(
|
|
2366
|
-
`(?s)import\s+(?:type\s+)?(.+?)\s+from\s+["']([^"']+)["']`,
|
|
2367
|
-
)
|
|
2368
|
-
|
|
2369
2355
|
func nestiaSDKTypeNodeText(node *shimast.Node) string {
|
|
2370
2356
|
if node == nil {
|
|
2371
2357
|
return ""
|
|
2372
2358
|
}
|
|
2373
2359
|
file := shimast.GetSourceFileOfNode(node)
|
|
2374
|
-
source, ok :=
|
|
2360
|
+
source, ok := "", false
|
|
2361
|
+
if file != nil {
|
|
2362
|
+
source, ok = transform.SourceFileText(file)
|
|
2363
|
+
}
|
|
2375
2364
|
if ok == false {
|
|
2376
|
-
|
|
2365
|
+
printer := shimprinter.NewPrinter(shimprinter.PrinterOptions{}, shimprinter.PrintHandlers{}, shimprinter.NewEmitContext())
|
|
2366
|
+
return strings.TrimSpace(printer.Emit(node, file))
|
|
2377
2367
|
}
|
|
2378
2368
|
start, end := node.Pos(), node.End()
|
|
2379
2369
|
if start < 0 || end > len(source) || start >= end {
|