@typia/utils 12.0.0-dev.20260225
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +79 -0
- package/lib/converters/LlmSchemaConverter.d.ts +102 -0
- package/lib/converters/LlmSchemaConverter.js +652 -0
- package/lib/converters/LlmSchemaConverter.js.map +1 -0
- package/lib/converters/LlmSchemaConverter.mjs +771 -0
- package/lib/converters/LlmSchemaConverter.mjs.map +1 -0
- package/lib/converters/OpenApiConverter.d.ts +135 -0
- package/lib/converters/OpenApiConverter.js +130 -0
- package/lib/converters/OpenApiConverter.js.map +1 -0
- package/lib/converters/OpenApiConverter.mjs +128 -0
- package/lib/converters/OpenApiConverter.mjs.map +1 -0
- package/lib/converters/index.d.ts +2 -0
- package/lib/converters/index.js +21 -0
- package/lib/converters/index.js.map +1 -0
- package/lib/converters/index.mjs +4 -0
- package/lib/converters/index.mjs.map +1 -0
- package/lib/converters/internal/LlmDescriptionInverter.d.ts +6 -0
- package/lib/converters/internal/LlmDescriptionInverter.js +141 -0
- package/lib/converters/internal/LlmDescriptionInverter.js.map +1 -0
- package/lib/converters/internal/LlmDescriptionInverter.mjs +141 -0
- package/lib/converters/internal/LlmDescriptionInverter.mjs.map +1 -0
- package/lib/converters/internal/LlmParametersComposer.d.ts +1 -0
- package/lib/converters/internal/LlmParametersComposer.js +39 -0
- package/lib/converters/internal/LlmParametersComposer.js.map +1 -0
- package/lib/converters/internal/LlmParametersComposer.mjs +42 -0
- package/lib/converters/internal/LlmParametersComposer.mjs.map +1 -0
- package/lib/converters/internal/OpenApiConstraintShifter.d.ts +6 -0
- package/lib/converters/internal/OpenApiConstraintShifter.js +103 -0
- package/lib/converters/internal/OpenApiConstraintShifter.js.map +1 -0
- package/lib/converters/internal/OpenApiConstraintShifter.mjs +102 -0
- package/lib/converters/internal/OpenApiConstraintShifter.mjs.map +1 -0
- package/lib/converters/internal/OpenApiExclusiveEmender.d.ts +4 -0
- package/lib/converters/internal/OpenApiExclusiveEmender.js +32 -0
- package/lib/converters/internal/OpenApiExclusiveEmender.js.map +1 -0
- package/lib/converters/internal/OpenApiExclusiveEmender.mjs +35 -0
- package/lib/converters/internal/OpenApiExclusiveEmender.mjs.map +1 -0
- package/lib/converters/internal/OpenApiV3Downgrader.d.ts +10 -0
- package/lib/converters/internal/OpenApiV3Downgrader.js +214 -0
- package/lib/converters/internal/OpenApiV3Downgrader.js.map +1 -0
- package/lib/converters/internal/OpenApiV3Downgrader.mjs +279 -0
- package/lib/converters/internal/OpenApiV3Downgrader.mjs.map +1 -0
- package/lib/converters/internal/OpenApiV3Upgrader.d.ts +6 -0
- package/lib/converters/internal/OpenApiV3Upgrader.js +285 -0
- package/lib/converters/internal/OpenApiV3Upgrader.js.map +1 -0
- package/lib/converters/internal/OpenApiV3Upgrader.mjs +349 -0
- package/lib/converters/internal/OpenApiV3Upgrader.mjs.map +1 -0
- package/lib/converters/internal/OpenApiV3_1Upgrader.d.ts +6 -0
- package/lib/converters/internal/OpenApiV3_1Upgrader.js +405 -0
- package/lib/converters/internal/OpenApiV3_1Upgrader.js.map +1 -0
- package/lib/converters/internal/OpenApiV3_1Upgrader.mjs +545 -0
- package/lib/converters/internal/OpenApiV3_1Upgrader.mjs.map +1 -0
- package/lib/converters/internal/SwaggerV2Downgrader.d.ts +10 -0
- package/lib/converters/internal/SwaggerV2Downgrader.js +294 -0
- package/lib/converters/internal/SwaggerV2Downgrader.js.map +1 -0
- package/lib/converters/internal/SwaggerV2Downgrader.mjs +332 -0
- package/lib/converters/internal/SwaggerV2Downgrader.mjs.map +1 -0
- package/lib/converters/internal/SwaggerV2Upgrader.d.ts +6 -0
- package/lib/converters/internal/SwaggerV2Upgrader.js +357 -0
- package/lib/converters/internal/SwaggerV2Upgrader.js.map +1 -0
- package/lib/converters/internal/SwaggerV2Upgrader.mjs +403 -0
- package/lib/converters/internal/SwaggerV2Upgrader.mjs.map +1 -0
- package/lib/http/HttpError.d.ts +61 -0
- package/lib/http/HttpError.js +70 -0
- package/lib/http/HttpError.js.map +1 -0
- package/lib/http/HttpError.mjs +76 -0
- package/lib/http/HttpError.mjs.map +1 -0
- package/lib/http/HttpLlm.d.ts +130 -0
- package/lib/http/HttpLlm.js +124 -0
- package/lib/http/HttpLlm.js.map +1 -0
- package/lib/http/HttpLlm.mjs +123 -0
- package/lib/http/HttpLlm.mjs.map +1 -0
- package/lib/http/HttpMigration.d.ts +58 -0
- package/lib/http/HttpMigration.js +52 -0
- package/lib/http/HttpMigration.js.map +1 -0
- package/lib/http/HttpMigration.mjs +52 -0
- package/lib/http/HttpMigration.mjs.map +1 -0
- package/lib/http/index.d.ts +3 -0
- package/lib/http/index.js +20 -0
- package/lib/http/index.js.map +1 -0
- package/lib/http/index.mjs +4 -0
- package/lib/http/index.mjs.map +1 -0
- package/lib/http/internal/HttpLlmApplicationComposer.d.ts +8 -0
- package/lib/http/internal/HttpLlmApplicationComposer.js +254 -0
- package/lib/http/internal/HttpLlmApplicationComposer.js.map +1 -0
- package/lib/http/internal/HttpLlmApplicationComposer.mjs +256 -0
- package/lib/http/internal/HttpLlmApplicationComposer.mjs.map +1 -0
- package/lib/http/internal/HttpLlmFunctionFetcher.d.ts +6 -0
- package/lib/http/internal/HttpLlmFunctionFetcher.js +24 -0
- package/lib/http/internal/HttpLlmFunctionFetcher.js.map +1 -0
- package/lib/http/internal/HttpLlmFunctionFetcher.mjs +24 -0
- package/lib/http/internal/HttpLlmFunctionFetcher.mjs.map +1 -0
- package/lib/http/internal/HttpMigrateApplicationComposer.d.ts +4 -0
- package/lib/http/internal/HttpMigrateApplicationComposer.js +45 -0
- package/lib/http/internal/HttpMigrateApplicationComposer.js.map +1 -0
- package/lib/http/internal/HttpMigrateApplicationComposer.mjs +47 -0
- package/lib/http/internal/HttpMigrateApplicationComposer.mjs.map +1 -0
- package/lib/http/internal/HttpMigrateRouteAccessor.d.ts +4 -0
- package/lib/http/internal/HttpMigrateRouteAccessor.js +107 -0
- package/lib/http/internal/HttpMigrateRouteAccessor.js.map +1 -0
- package/lib/http/internal/HttpMigrateRouteAccessor.mjs +106 -0
- package/lib/http/internal/HttpMigrateRouteAccessor.mjs.map +1 -0
- package/lib/http/internal/HttpMigrateRouteComposer.d.ts +11 -0
- package/lib/http/internal/HttpMigrateRouteComposer.js +398 -0
- package/lib/http/internal/HttpMigrateRouteComposer.js.map +1 -0
- package/lib/http/internal/HttpMigrateRouteComposer.mjs +392 -0
- package/lib/http/internal/HttpMigrateRouteComposer.mjs.map +1 -0
- package/lib/http/internal/HttpMigrateRouteFetcher.d.ts +6 -0
- package/lib/http/internal/HttpMigrateRouteFetcher.js +179 -0
- package/lib/http/internal/HttpMigrateRouteFetcher.js.map +1 -0
- package/lib/http/internal/HttpMigrateRouteFetcher.mjs +174 -0
- package/lib/http/internal/HttpMigrateRouteFetcher.mjs.map +1 -0
- package/lib/http/internal/LlmDataMerger.d.ts +48 -0
- package/lib/http/internal/LlmDataMerger.js +60 -0
- package/lib/http/internal/LlmDataMerger.js.map +1 -0
- package/lib/http/internal/LlmDataMerger.mjs +59 -0
- package/lib/http/internal/LlmDataMerger.mjs.map +1 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +21 -0
- package/lib/index.js.map +1 -0
- package/lib/index.mjs +20 -0
- package/lib/index.mjs.map +1 -0
- package/lib/utils/ArrayUtil.d.ts +1 -0
- package/lib/utils/ArrayUtil.js +29 -0
- package/lib/utils/ArrayUtil.js.map +1 -0
- package/lib/utils/ArrayUtil.mjs +28 -0
- package/lib/utils/ArrayUtil.mjs.map +1 -0
- package/lib/utils/MapUtil.d.ts +1 -0
- package/lib/utils/MapUtil.js +16 -0
- package/lib/utils/MapUtil.js.map +1 -0
- package/lib/utils/MapUtil.mjs +15 -0
- package/lib/utils/MapUtil.mjs.map +1 -0
- package/lib/utils/NamingConvention.d.ts +68 -0
- package/lib/utils/NamingConvention.js +199 -0
- package/lib/utils/NamingConvention.js.map +1 -0
- package/lib/utils/NamingConvention.mjs +198 -0
- package/lib/utils/NamingConvention.mjs.map +1 -0
- package/lib/utils/Singleton.d.ts +1 -0
- package/lib/utils/Singleton.js +18 -0
- package/lib/utils/Singleton.js.map +1 -0
- package/lib/utils/Singleton.mjs +18 -0
- package/lib/utils/Singleton.mjs.map +1 -0
- package/lib/utils/StringUtil.d.ts +1 -0
- package/lib/utils/StringUtil.js +17 -0
- package/lib/utils/StringUtil.js.map +1 -0
- package/lib/utils/StringUtil.mjs +13 -0
- package/lib/utils/StringUtil.mjs.map +1 -0
- package/lib/utils/dedent.d.ts +12 -0
- package/lib/utils/dedent.js +51 -0
- package/lib/utils/dedent.js.map +1 -0
- package/lib/utils/dedent.mjs +50 -0
- package/lib/utils/dedent.mjs.map +1 -0
- package/lib/utils/index.d.ts +7 -0
- package/lib/utils/index.js +24 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/index.mjs +8 -0
- package/lib/utils/index.mjs.map +1 -0
- package/lib/utils/internal/EndpointUtil.d.ts +8 -0
- package/lib/utils/internal/EndpointUtil.js +37 -0
- package/lib/utils/internal/EndpointUtil.js.map +1 -0
- package/lib/utils/internal/EndpointUtil.mjs +37 -0
- package/lib/utils/internal/EndpointUtil.mjs.map +1 -0
- package/lib/utils/internal/JsonDescriptor.d.ts +10 -0
- package/lib/utils/internal/JsonDescriptor.js +58 -0
- package/lib/utils/internal/JsonDescriptor.js.map +1 -0
- package/lib/utils/internal/JsonDescriptor.mjs +48 -0
- package/lib/utils/internal/JsonDescriptor.mjs.map +1 -0
- package/lib/utils/internal/OpenApiTypeCheckerBase.d.ts +1 -0
- package/lib/utils/internal/OpenApiTypeCheckerBase.js +520 -0
- package/lib/utils/internal/OpenApiTypeCheckerBase.js.map +1 -0
- package/lib/utils/internal/OpenApiTypeCheckerBase.mjs +584 -0
- package/lib/utils/internal/OpenApiTypeCheckerBase.mjs.map +1 -0
- package/lib/utils/stringifyValidationFailure.d.ts +25 -0
- package/lib/utils/stringifyValidationFailure.js +326 -0
- package/lib/utils/stringifyValidationFailure.js.map +1 -0
- package/lib/utils/stringifyValidationFailure.mjs +325 -0
- package/lib/utils/stringifyValidationFailure.mjs.map +1 -0
- package/lib/validators/LlmTypeChecker.d.ts +117 -0
- package/lib/validators/LlmTypeChecker.js +309 -0
- package/lib/validators/LlmTypeChecker.js.map +1 -0
- package/lib/validators/LlmTypeChecker.mjs +300 -0
- package/lib/validators/LlmTypeChecker.mjs.map +1 -0
- package/lib/validators/OpenApiTypeChecker.d.ts +211 -0
- package/lib/validators/OpenApiTypeChecker.js +207 -0
- package/lib/validators/OpenApiTypeChecker.js.map +1 -0
- package/lib/validators/OpenApiTypeChecker.mjs +218 -0
- package/lib/validators/OpenApiTypeChecker.mjs.map +1 -0
- package/lib/validators/OpenApiV3TypeChecker.d.ts +26 -0
- package/lib/validators/OpenApiV3TypeChecker.js +30 -0
- package/lib/validators/OpenApiV3TypeChecker.js.map +1 -0
- package/lib/validators/OpenApiV3TypeChecker.mjs +29 -0
- package/lib/validators/OpenApiV3TypeChecker.mjs.map +1 -0
- package/lib/validators/OpenApiV3_1TypeChecker.d.ts +29 -0
- package/lib/validators/OpenApiV3_1TypeChecker.js +34 -0
- package/lib/validators/OpenApiV3_1TypeChecker.js.map +1 -0
- package/lib/validators/OpenApiV3_1TypeChecker.mjs +33 -0
- package/lib/validators/OpenApiV3_1TypeChecker.mjs.map +1 -0
- package/lib/validators/OpenApiValidator.d.ts +36 -0
- package/lib/validators/OpenApiValidator.js +71 -0
- package/lib/validators/OpenApiValidator.js.map +1 -0
- package/lib/validators/OpenApiValidator.mjs +75 -0
- package/lib/validators/OpenApiValidator.mjs.map +1 -0
- package/lib/validators/SwaggerV2TypeChecker.d.ts +27 -0
- package/lib/validators/SwaggerV2TypeChecker.js +31 -0
- package/lib/validators/SwaggerV2TypeChecker.js.map +1 -0
- package/lib/validators/SwaggerV2TypeChecker.mjs +30 -0
- package/lib/validators/SwaggerV2TypeChecker.mjs.map +1 -0
- package/lib/validators/functional/_isBigintString.d.ts +1 -0
- package/lib/validators/functional/_isBigintString.js +14 -0
- package/lib/validators/functional/_isBigintString.js.map +1 -0
- package/lib/validators/functional/_isBigintString.mjs +12 -0
- package/lib/validators/functional/_isBigintString.mjs.map +1 -0
- package/lib/validators/functional/_isFormatByte.d.ts +1 -0
- package/lib/validators/functional/_isFormatByte.js +10 -0
- package/lib/validators/functional/_isFormatByte.js.map +1 -0
- package/lib/validators/functional/_isFormatByte.mjs +8 -0
- package/lib/validators/functional/_isFormatByte.mjs.map +1 -0
- package/lib/validators/functional/_isFormatDate.d.ts +1 -0
- package/lib/validators/functional/_isFormatDate.js +7 -0
- package/lib/validators/functional/_isFormatDate.js.map +1 -0
- package/lib/validators/functional/_isFormatDate.mjs +5 -0
- package/lib/validators/functional/_isFormatDate.mjs.map +1 -0
- package/lib/validators/functional/_isFormatDateTime.d.ts +1 -0
- package/lib/validators/functional/_isFormatDateTime.js +7 -0
- package/lib/validators/functional/_isFormatDateTime.js.map +1 -0
- package/lib/validators/functional/_isFormatDateTime.mjs +5 -0
- package/lib/validators/functional/_isFormatDateTime.mjs.map +1 -0
- package/lib/validators/functional/_isFormatDuration.d.ts +1 -0
- package/lib/validators/functional/_isFormatDuration.js +7 -0
- package/lib/validators/functional/_isFormatDuration.js.map +1 -0
- package/lib/validators/functional/_isFormatDuration.mjs +5 -0
- package/lib/validators/functional/_isFormatDuration.mjs.map +1 -0
- package/lib/validators/functional/_isFormatEmail.d.ts +1 -0
- package/lib/validators/functional/_isFormatEmail.js +7 -0
- package/lib/validators/functional/_isFormatEmail.js.map +1 -0
- package/lib/validators/functional/_isFormatEmail.mjs +5 -0
- package/lib/validators/functional/_isFormatEmail.mjs.map +1 -0
- package/lib/validators/functional/_isFormatHostname.d.ts +1 -0
- package/lib/validators/functional/_isFormatHostname.js +7 -0
- package/lib/validators/functional/_isFormatHostname.js.map +1 -0
- package/lib/validators/functional/_isFormatHostname.mjs +5 -0
- package/lib/validators/functional/_isFormatHostname.mjs.map +1 -0
- package/lib/validators/functional/_isFormatIdnEmail.d.ts +1 -0
- package/lib/validators/functional/_isFormatIdnEmail.js +7 -0
- package/lib/validators/functional/_isFormatIdnEmail.js.map +1 -0
- package/lib/validators/functional/_isFormatIdnEmail.mjs +5 -0
- package/lib/validators/functional/_isFormatIdnEmail.mjs.map +1 -0
- package/lib/validators/functional/_isFormatIdnHostname.d.ts +1 -0
- package/lib/validators/functional/_isFormatIdnHostname.js +7 -0
- package/lib/validators/functional/_isFormatIdnHostname.js.map +1 -0
- package/lib/validators/functional/_isFormatIdnHostname.mjs +5 -0
- package/lib/validators/functional/_isFormatIdnHostname.mjs.map +1 -0
- package/lib/validators/functional/_isFormatIpv4.d.ts +1 -0
- package/lib/validators/functional/_isFormatIpv4.js +7 -0
- package/lib/validators/functional/_isFormatIpv4.js.map +1 -0
- package/lib/validators/functional/_isFormatIpv4.mjs +5 -0
- package/lib/validators/functional/_isFormatIpv4.mjs.map +1 -0
- package/lib/validators/functional/_isFormatIpv6.d.ts +1 -0
- package/lib/validators/functional/_isFormatIpv6.js +7 -0
- package/lib/validators/functional/_isFormatIpv6.js.map +1 -0
- package/lib/validators/functional/_isFormatIpv6.mjs +5 -0
- package/lib/validators/functional/_isFormatIpv6.mjs.map +1 -0
- package/lib/validators/functional/_isFormatIri.d.ts +1 -0
- package/lib/validators/functional/_isFormatIri.js +7 -0
- package/lib/validators/functional/_isFormatIri.js.map +1 -0
- package/lib/validators/functional/_isFormatIri.mjs +5 -0
- package/lib/validators/functional/_isFormatIri.mjs.map +1 -0
- package/lib/validators/functional/_isFormatIriReference.d.ts +1 -0
- package/lib/validators/functional/_isFormatIriReference.js +7 -0
- package/lib/validators/functional/_isFormatIriReference.js.map +1 -0
- package/lib/validators/functional/_isFormatIriReference.mjs +5 -0
- package/lib/validators/functional/_isFormatIriReference.mjs.map +1 -0
- package/lib/validators/functional/_isFormatJsonPointer.d.ts +1 -0
- package/lib/validators/functional/_isFormatJsonPointer.js +7 -0
- package/lib/validators/functional/_isFormatJsonPointer.js.map +1 -0
- package/lib/validators/functional/_isFormatJsonPointer.mjs +5 -0
- package/lib/validators/functional/_isFormatJsonPointer.mjs.map +1 -0
- package/lib/validators/functional/_isFormatPassword.d.ts +1 -0
- package/lib/validators/functional/_isFormatPassword.js +6 -0
- package/lib/validators/functional/_isFormatPassword.js.map +1 -0
- package/lib/validators/functional/_isFormatPassword.mjs +4 -0
- package/lib/validators/functional/_isFormatPassword.mjs.map +1 -0
- package/lib/validators/functional/_isFormatRegex.d.ts +1 -0
- package/lib/validators/functional/_isFormatRegex.js +14 -0
- package/lib/validators/functional/_isFormatRegex.js.map +1 -0
- package/lib/validators/functional/_isFormatRegex.mjs +12 -0
- package/lib/validators/functional/_isFormatRegex.mjs.map +1 -0
- package/lib/validators/functional/_isFormatRelativeJsonPointer.d.ts +1 -0
- package/lib/validators/functional/_isFormatRelativeJsonPointer.js +7 -0
- package/lib/validators/functional/_isFormatRelativeJsonPointer.js.map +1 -0
- package/lib/validators/functional/_isFormatRelativeJsonPointer.mjs +5 -0
- package/lib/validators/functional/_isFormatRelativeJsonPointer.mjs.map +1 -0
- package/lib/validators/functional/_isFormatTime.d.ts +1 -0
- package/lib/validators/functional/_isFormatTime.js +7 -0
- package/lib/validators/functional/_isFormatTime.js.map +1 -0
- package/lib/validators/functional/_isFormatTime.mjs +5 -0
- package/lib/validators/functional/_isFormatTime.mjs.map +1 -0
- package/lib/validators/functional/_isFormatUri.d.ts +1 -0
- package/lib/validators/functional/_isFormatUri.js +8 -0
- package/lib/validators/functional/_isFormatUri.js.map +1 -0
- package/lib/validators/functional/_isFormatUri.mjs +6 -0
- package/lib/validators/functional/_isFormatUri.mjs.map +1 -0
- package/lib/validators/functional/_isFormatUriReference.d.ts +1 -0
- package/lib/validators/functional/_isFormatUriReference.js +7 -0
- package/lib/validators/functional/_isFormatUriReference.js.map +1 -0
- package/lib/validators/functional/_isFormatUriReference.mjs +5 -0
- package/lib/validators/functional/_isFormatUriReference.mjs.map +1 -0
- package/lib/validators/functional/_isFormatUriTemplate.d.ts +1 -0
- package/lib/validators/functional/_isFormatUriTemplate.js +7 -0
- package/lib/validators/functional/_isFormatUriTemplate.js.map +1 -0
- package/lib/validators/functional/_isFormatUriTemplate.mjs +5 -0
- package/lib/validators/functional/_isFormatUriTemplate.mjs.map +1 -0
- package/lib/validators/functional/_isFormatUrl.d.ts +1 -0
- package/lib/validators/functional/_isFormatUrl.js +7 -0
- package/lib/validators/functional/_isFormatUrl.js.map +1 -0
- package/lib/validators/functional/_isFormatUrl.mjs +5 -0
- package/lib/validators/functional/_isFormatUrl.mjs.map +1 -0
- package/lib/validators/functional/_isFormatUuid.d.ts +1 -0
- package/lib/validators/functional/_isFormatUuid.js +7 -0
- package/lib/validators/functional/_isFormatUuid.js.map +1 -0
- package/lib/validators/functional/_isFormatUuid.mjs +5 -0
- package/lib/validators/functional/_isFormatUuid.mjs.map +1 -0
- package/lib/validators/functional/_isUniqueItems.d.ts +1 -0
- package/lib/validators/functional/_isUniqueItems.js +140 -0
- package/lib/validators/functional/_isUniqueItems.js.map +1 -0
- package/lib/validators/functional/_isUniqueItems.mjs +138 -0
- package/lib/validators/functional/_isUniqueItems.mjs.map +1 -0
- package/lib/validators/index.d.ts +2 -0
- package/lib/validators/index.js +27 -0
- package/lib/validators/index.js.map +1 -0
- package/lib/validators/index.mjs +7 -0
- package/lib/validators/index.mjs.map +1 -0
- package/lib/validators/internal/IOpenApiValidatorContext.d.ts +14 -0
- package/lib/validators/internal/IOpenApiValidatorContext.js +3 -0
- package/lib/validators/internal/IOpenApiValidatorContext.js.map +1 -0
- package/lib/validators/internal/IOpenApiValidatorContext.mjs +2 -0
- package/lib/validators/internal/IOpenApiValidatorContext.mjs.map +1 -0
- package/lib/validators/internal/OpenApiArrayValidator.d.ts +5 -0
- package/lib/validators/internal/OpenApiArrayValidator.js +32 -0
- package/lib/validators/internal/OpenApiArrayValidator.js.map +1 -0
- package/lib/validators/internal/OpenApiArrayValidator.mjs +47 -0
- package/lib/validators/internal/OpenApiArrayValidator.mjs.map +1 -0
- package/lib/validators/internal/OpenApiBooleanValidator.d.ts +5 -0
- package/lib/validators/internal/OpenApiBooleanValidator.js +10 -0
- package/lib/validators/internal/OpenApiBooleanValidator.js.map +1 -0
- package/lib/validators/internal/OpenApiBooleanValidator.mjs +9 -0
- package/lib/validators/internal/OpenApiBooleanValidator.mjs.map +1 -0
- package/lib/validators/internal/OpenApiConstantValidator.d.ts +5 -0
- package/lib/validators/internal/OpenApiConstantValidator.js +10 -0
- package/lib/validators/internal/OpenApiConstantValidator.js.map +1 -0
- package/lib/validators/internal/OpenApiConstantValidator.mjs +9 -0
- package/lib/validators/internal/OpenApiConstantValidator.mjs.map +1 -0
- package/lib/validators/internal/OpenApiIntegerValidator.d.ts +5 -0
- package/lib/validators/internal/OpenApiIntegerValidator.js +33 -0
- package/lib/validators/internal/OpenApiIntegerValidator.js.map +1 -0
- package/lib/validators/internal/OpenApiIntegerValidator.mjs +47 -0
- package/lib/validators/internal/OpenApiIntegerValidator.mjs.map +1 -0
- package/lib/validators/internal/OpenApiNumberValidator.d.ts +5 -0
- package/lib/validators/internal/OpenApiNumberValidator.js +33 -0
- package/lib/validators/internal/OpenApiNumberValidator.js.map +1 -0
- package/lib/validators/internal/OpenApiNumberValidator.mjs +47 -0
- package/lib/validators/internal/OpenApiNumberValidator.mjs.map +1 -0
- package/lib/validators/internal/OpenApiObjectValidator.d.ts +5 -0
- package/lib/validators/internal/OpenApiObjectValidator.js +58 -0
- package/lib/validators/internal/OpenApiObjectValidator.js.map +1 -0
- package/lib/validators/internal/OpenApiObjectValidator.mjs +68 -0
- package/lib/validators/internal/OpenApiObjectValidator.mjs.map +1 -0
- package/lib/validators/internal/OpenApiOneOfValidator.d.ts +5 -0
- package/lib/validators/internal/OpenApiOneOfValidator.js +182 -0
- package/lib/validators/internal/OpenApiOneOfValidator.js.map +1 -0
- package/lib/validators/internal/OpenApiOneOfValidator.mjs +206 -0
- package/lib/validators/internal/OpenApiOneOfValidator.mjs.map +1 -0
- package/lib/validators/internal/OpenApiSchemaNamingRule.d.ts +4 -0
- package/lib/validators/internal/OpenApiSchemaNamingRule.js +122 -0
- package/lib/validators/internal/OpenApiSchemaNamingRule.js.map +1 -0
- package/lib/validators/internal/OpenApiSchemaNamingRule.mjs +121 -0
- package/lib/validators/internal/OpenApiSchemaNamingRule.mjs.map +1 -0
- package/lib/validators/internal/OpenApiStationValidator.d.ts +5 -0
- package/lib/validators/internal/OpenApiStationValidator.js +63 -0
- package/lib/validators/internal/OpenApiStationValidator.js.map +1 -0
- package/lib/validators/internal/OpenApiStationValidator.mjs +107 -0
- package/lib/validators/internal/OpenApiStationValidator.mjs.map +1 -0
- package/lib/validators/internal/OpenApiStringValidator.d.ts +5 -0
- package/lib/validators/internal/OpenApiStringValidator.js +73 -0
- package/lib/validators/internal/OpenApiStringValidator.js.map +1 -0
- package/lib/validators/internal/OpenApiStringValidator.mjs +85 -0
- package/lib/validators/internal/OpenApiStringValidator.mjs.map +1 -0
- package/lib/validators/internal/OpenApiTupleValidator.d.ts +5 -0
- package/lib/validators/internal/OpenApiTupleValidator.js +31 -0
- package/lib/validators/internal/OpenApiTupleValidator.js.map +1 -0
- package/lib/validators/internal/OpenApiTupleValidator.mjs +46 -0
- package/lib/validators/internal/OpenApiTupleValidator.mjs.map +1 -0
- package/package.json +91 -0
- package/src/converters/LlmSchemaConverter.ts +924 -0
- package/src/converters/OpenApiConverter.ts +285 -0
- package/src/converters/index.ts +5 -0
- package/src/converters/internal/LlmDescriptionInverter.ts +178 -0
- package/src/converters/internal/LlmParametersComposer.ts +52 -0
- package/src/converters/internal/OpenApiConstraintShifter.ts +154 -0
- package/src/converters/internal/OpenApiExclusiveEmender.ts +46 -0
- package/src/converters/internal/OpenApiV3Downgrader.ts +355 -0
- package/src/converters/internal/OpenApiV3Upgrader.ts +470 -0
- package/src/converters/internal/OpenApiV3_1Upgrader.ts +685 -0
- package/src/converters/internal/SwaggerV2Downgrader.ts +424 -0
- package/src/converters/internal/SwaggerV2Upgrader.ts +523 -0
- package/src/http/HttpError.ts +107 -0
- package/src/http/HttpLlm.ts +210 -0
- package/src/http/HttpMigration.ts +92 -0
- package/src/http/index.ts +3 -0
- package/src/http/internal/HttpLlmApplicationComposer.ts +308 -0
- package/src/http/internal/HttpLlmFunctionFetcher.ts +37 -0
- package/src/http/internal/HttpMigrateApplicationComposer.ts +56 -0
- package/src/http/internal/HttpMigrateRouteAccessor.ts +135 -0
- package/src/http/internal/HttpMigrateRouteComposer.ts +513 -0
- package/src/http/internal/HttpMigrateRouteFetcher.ts +203 -0
- package/src/http/internal/LlmDataMerger.ts +73 -0
- package/src/index.ts +4 -0
- package/src/utils/ArrayUtil.ts +42 -0
- package/src/utils/MapUtil.ts +15 -0
- package/src/utils/NamingConvention.ts +205 -0
- package/src/utils/Singleton.ts +17 -0
- package/src/utils/StringUtil.ts +14 -0
- package/src/utils/dedent.ts +57 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/internal/EndpointUtil.ts +44 -0
- package/src/utils/internal/JsonDescriptor.ts +70 -0
- package/src/utils/internal/OpenApiTypeCheckerBase.ts +822 -0
- package/src/utils/stringifyValidationFailure.ts +415 -0
- package/src/validators/LlmTypeChecker.ts +402 -0
- package/src/validators/OpenApiTypeChecker.ts +297 -0
- package/src/validators/OpenApiV3TypeChecker.ts +70 -0
- package/src/validators/OpenApiV3_1TypeChecker.ts +86 -0
- package/src/validators/OpenApiValidator.ts +94 -0
- package/src/validators/SwaggerV2TypeChecker.ts +71 -0
- package/src/validators/functional/_isBigintString.ts +8 -0
- package/src/validators/functional/_isFormatByte.ts +7 -0
- package/src/validators/functional/_isFormatDate.ts +3 -0
- package/src/validators/functional/_isFormatDateTime.ts +4 -0
- package/src/validators/functional/_isFormatDuration.ts +4 -0
- package/src/validators/functional/_isFormatEmail.ts +4 -0
- package/src/validators/functional/_isFormatHostname.ts +4 -0
- package/src/validators/functional/_isFormatIdnEmail.ts +4 -0
- package/src/validators/functional/_isFormatIdnHostname.ts +4 -0
- package/src/validators/functional/_isFormatIpv4.ts +4 -0
- package/src/validators/functional/_isFormatIpv6.ts +4 -0
- package/src/validators/functional/_isFormatIri.ts +3 -0
- package/src/validators/functional/_isFormatIriReference.ts +4 -0
- package/src/validators/functional/_isFormatJsonPointer.ts +3 -0
- package/src/validators/functional/_isFormatPassword.ts +1 -0
- package/src/validators/functional/_isFormatRegex.ts +8 -0
- package/src/validators/functional/_isFormatRelativeJsonPointer.ts +4 -0
- package/src/validators/functional/_isFormatTime.ts +4 -0
- package/src/validators/functional/_isFormatUri.ts +6 -0
- package/src/validators/functional/_isFormatUriReference.ts +5 -0
- package/src/validators/functional/_isFormatUriTemplate.ts +4 -0
- package/src/validators/functional/_isFormatUrl.ts +4 -0
- package/src/validators/functional/_isFormatUuid.ts +3 -0
- package/src/validators/functional/_isUniqueItems.ts +159 -0
- package/src/validators/index.ts +14 -0
- package/src/validators/internal/IOpenApiValidatorContext.ts +17 -0
- package/src/validators/internal/OpenApiArrayValidator.ts +49 -0
- package/src/validators/internal/OpenApiBooleanValidator.ts +11 -0
- package/src/validators/internal/OpenApiConstantValidator.ts +11 -0
- package/src/validators/internal/OpenApiIntegerValidator.ts +49 -0
- package/src/validators/internal/OpenApiNumberValidator.ts +48 -0
- package/src/validators/internal/OpenApiObjectValidator.ts +83 -0
- package/src/validators/internal/OpenApiOneOfValidator.ts +309 -0
- package/src/validators/internal/OpenApiSchemaNamingRule.ts +124 -0
- package/src/validators/internal/OpenApiStationValidator.ts +115 -0
- package/src/validators/internal/OpenApiStringValidator.ts +88 -0
- package/src/validators/internal/OpenApiTupleValidator.ts +55 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.stringifyValidationFailure = stringifyValidationFailure;
|
|
4
|
+
const NamingConvention_1 = require("./NamingConvention");
|
|
5
|
+
const dedent_1 = require("./dedent");
|
|
6
|
+
/**
|
|
7
|
+
* Format validation failure for LLM auto-correction feedback.
|
|
8
|
+
*
|
|
9
|
+
* When LLM generates invalid function call arguments, this produces annotated
|
|
10
|
+
* JSON with inline `// ❌` error comments at each invalid property. The output
|
|
11
|
+
* is wrapped in a markdown code block so that LLM can understand and correct
|
|
12
|
+
* its mistakes in the next turn.
|
|
13
|
+
*
|
|
14
|
+
* Below is an example of the output format:
|
|
15
|
+
*
|
|
16
|
+
* ```json
|
|
17
|
+
* {
|
|
18
|
+
* "name": "John",
|
|
19
|
+
* "age": "twenty", // ❌ [{"path":"$input.age","expected":"number & Type<\"uint32\">"}]
|
|
20
|
+
* "email": "not-an-email", // ❌ [{"path":"$input.email","expected":"string & Format<\"email\">"}]
|
|
21
|
+
* "hobbies": "reading" // ❌ [{"path":"$input.hobbies","expected":"Array<string>"}]
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @author Jeongho Nam - https://github.com/samchon
|
|
26
|
+
* @param failure Validation failure from {@link ILlmFunction.validate}
|
|
27
|
+
* @returns Markdown code block with error-annotated JSON
|
|
28
|
+
*/
|
|
29
|
+
function stringifyValidationFailure(failure) {
|
|
30
|
+
const usedErrors = new Set();
|
|
31
|
+
const jsonOutput = stringify({
|
|
32
|
+
value: failure.data,
|
|
33
|
+
errors: failure.errors,
|
|
34
|
+
path: "$input",
|
|
35
|
+
tab: 0,
|
|
36
|
+
inArray: false,
|
|
37
|
+
inToJson: false,
|
|
38
|
+
usedErrors,
|
|
39
|
+
});
|
|
40
|
+
// Find errors that couldn't be embedded
|
|
41
|
+
const unmappableErrors = failure.errors.filter((e) => !usedErrors.has(e));
|
|
42
|
+
// If there are unmappable errors, append them as a separate block
|
|
43
|
+
if (unmappableErrors.length > 0)
|
|
44
|
+
return (0, dedent_1.dedent) `
|
|
45
|
+
\`\`\`json
|
|
46
|
+
${jsonOutput}
|
|
47
|
+
\`\`\`
|
|
48
|
+
|
|
49
|
+
**Unmappable validation errors:**
|
|
50
|
+
\`\`\`json
|
|
51
|
+
${JSON.stringify(unmappableErrors, null, 2)}
|
|
52
|
+
\`\`\`
|
|
53
|
+
`;
|
|
54
|
+
return (0, dedent_1.dedent) `
|
|
55
|
+
\`\`\`json
|
|
56
|
+
${jsonOutput}
|
|
57
|
+
\`\`\`
|
|
58
|
+
`;
|
|
59
|
+
}
|
|
60
|
+
function stringify(props) {
|
|
61
|
+
var _a;
|
|
62
|
+
const { value, errors, path, tab, inArray, inToJson, usedErrors } = props;
|
|
63
|
+
const indent = " ".repeat(tab);
|
|
64
|
+
const errorComment = getErrorComment(path, errors, usedErrors);
|
|
65
|
+
// Handle undefined in arrays
|
|
66
|
+
if (inArray && value === undefined) {
|
|
67
|
+
return `${indent}undefined${errorComment}`;
|
|
68
|
+
}
|
|
69
|
+
// Array
|
|
70
|
+
if (Array.isArray(value)) {
|
|
71
|
+
// Check for missing array element errors (path[])
|
|
72
|
+
const missingElementErrors = getMissingArrayElementErrors(path, errors, usedErrors);
|
|
73
|
+
const hasMissingElements = missingElementErrors.length > 0;
|
|
74
|
+
if (value.length === 0) {
|
|
75
|
+
// Empty array but has missing element errors - show placeholders
|
|
76
|
+
if (hasMissingElements) {
|
|
77
|
+
const innerIndent = " ".repeat(tab + 1);
|
|
78
|
+
const lines = [];
|
|
79
|
+
lines.push(`${indent}[${errorComment}`);
|
|
80
|
+
missingElementErrors.forEach((e, idx) => {
|
|
81
|
+
const errComment = ` // ❌ ${JSON.stringify([{ path: e.path, expected: e.expected, description: e.description }])}`;
|
|
82
|
+
const comma = idx < missingElementErrors.length - 1 ? "," : "";
|
|
83
|
+
lines.push(`${innerIndent}undefined${comma}${errComment}`);
|
|
84
|
+
});
|
|
85
|
+
lines.push(`${indent}]`);
|
|
86
|
+
return lines.join("\n");
|
|
87
|
+
}
|
|
88
|
+
return `${indent}[]${errorComment}`;
|
|
89
|
+
}
|
|
90
|
+
const lines = [];
|
|
91
|
+
lines.push(`${indent}[${errorComment}`);
|
|
92
|
+
value.forEach((item, index) => {
|
|
93
|
+
const itemPath = `${path}[${index}]`;
|
|
94
|
+
const isLastElement = index === value.length - 1;
|
|
95
|
+
// If there are missing element errors, this is not truly the last line
|
|
96
|
+
const needsComma = !isLastElement || hasMissingElements;
|
|
97
|
+
let itemStr = stringify({
|
|
98
|
+
value: item,
|
|
99
|
+
errors,
|
|
100
|
+
path: itemPath,
|
|
101
|
+
tab: tab + 1,
|
|
102
|
+
inArray: true,
|
|
103
|
+
inToJson: false,
|
|
104
|
+
usedErrors,
|
|
105
|
+
});
|
|
106
|
+
// Add comma before the error comment if not the last element
|
|
107
|
+
if (needsComma) {
|
|
108
|
+
const itemLines = itemStr.split("\n");
|
|
109
|
+
const lastLine = itemLines[itemLines.length - 1];
|
|
110
|
+
const commentIndex = lastLine.indexOf(" //");
|
|
111
|
+
if (commentIndex !== -1) {
|
|
112
|
+
itemLines[itemLines.length - 1] = `${lastLine.slice(0, commentIndex)},${lastLine.slice(commentIndex)}`;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
itemLines[itemLines.length - 1] += ",";
|
|
116
|
+
}
|
|
117
|
+
itemStr = itemLines.join("\n");
|
|
118
|
+
}
|
|
119
|
+
lines.push(itemStr);
|
|
120
|
+
});
|
|
121
|
+
// Add missing element placeholders at the end for each [] error
|
|
122
|
+
if (hasMissingElements) {
|
|
123
|
+
const innerIndent = " ".repeat(tab + 1);
|
|
124
|
+
missingElementErrors.forEach((e, idx) => {
|
|
125
|
+
const errComment = ` // ❌ ${JSON.stringify([{ path: e.path, expected: e.expected, description: e.description }])}`;
|
|
126
|
+
const comma = idx < missingElementErrors.length - 1 ? "," : "";
|
|
127
|
+
lines.push(`${innerIndent}undefined${comma}${errComment}`);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
lines.push(`${indent}]`);
|
|
131
|
+
return lines.join("\n");
|
|
132
|
+
}
|
|
133
|
+
// Object
|
|
134
|
+
if (typeof value === "object" && value !== null) {
|
|
135
|
+
// Check for toJSON method
|
|
136
|
+
// biome-ignore lint: intended
|
|
137
|
+
if (!inToJson && typeof value.toJSON === "function") {
|
|
138
|
+
// biome-ignore lint: intended
|
|
139
|
+
const jsonValue = value.toJSON();
|
|
140
|
+
return stringify({
|
|
141
|
+
value: jsonValue,
|
|
142
|
+
errors,
|
|
143
|
+
path,
|
|
144
|
+
tab,
|
|
145
|
+
inArray,
|
|
146
|
+
inToJson: true,
|
|
147
|
+
usedErrors,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
// Get all entries from the object (including undefined values that have errors)
|
|
151
|
+
const allEntries = Object.entries(value);
|
|
152
|
+
// Split into defined and undefined entries
|
|
153
|
+
const definedEntries = allEntries.filter(([_, val]) => val !== undefined);
|
|
154
|
+
const undefinedEntryKeys = new Set(allEntries.filter(([_, val]) => val === undefined).map(([key]) => key));
|
|
155
|
+
// Find missing properties that have validation errors (not in object at all)
|
|
156
|
+
const missingKeys = getMissingProperties(path, value, errors);
|
|
157
|
+
// Combine: defined entries + undefined entries with errors + missing properties
|
|
158
|
+
const undefinedKeysWithErrors = Array.from(undefinedEntryKeys).filter((key) => {
|
|
159
|
+
const propPath = NamingConvention_1.NamingConvention.variable(key)
|
|
160
|
+
? `${path}.${key}`
|
|
161
|
+
: `${path}[${JSON.stringify(key)}]`;
|
|
162
|
+
return errors.some((e) => e.path.startsWith(propPath));
|
|
163
|
+
});
|
|
164
|
+
const allKeys = [
|
|
165
|
+
...definedEntries.map(([key]) => key),
|
|
166
|
+
...undefinedKeysWithErrors,
|
|
167
|
+
...missingKeys,
|
|
168
|
+
];
|
|
169
|
+
if (allKeys.length === 0) {
|
|
170
|
+
return `${indent}{}${errorComment}`;
|
|
171
|
+
}
|
|
172
|
+
const lines = [];
|
|
173
|
+
lines.push(`${indent}{${errorComment}`);
|
|
174
|
+
allKeys.forEach((key, index, array) => {
|
|
175
|
+
const propPath = NamingConvention_1.NamingConvention.variable(key)
|
|
176
|
+
? `${path}.${key}`
|
|
177
|
+
: `${path}[${JSON.stringify(key)}]`;
|
|
178
|
+
const propIndent = " ".repeat(tab + 1);
|
|
179
|
+
// Get the value (undefined for missing properties or undefined entries)
|
|
180
|
+
const val = missingKeys.includes(key) || undefinedKeysWithErrors.includes(key)
|
|
181
|
+
? undefined
|
|
182
|
+
: // biome-ignore lint: intended
|
|
183
|
+
value[key];
|
|
184
|
+
// Primitive property value (including undefined for missing properties)
|
|
185
|
+
if (val === undefined ||
|
|
186
|
+
val === null ||
|
|
187
|
+
typeof val === "boolean" ||
|
|
188
|
+
typeof val === "number" ||
|
|
189
|
+
typeof val === "string") {
|
|
190
|
+
const propErrorComment = getErrorComment(propPath, errors, usedErrors);
|
|
191
|
+
const keyStr = JSON.stringify(key);
|
|
192
|
+
const valueStr = val === undefined
|
|
193
|
+
? `${propIndent}${keyStr}: undefined`
|
|
194
|
+
: `${propIndent}${keyStr}: ${JSON.stringify(val)}`;
|
|
195
|
+
const withComma = index < array.length - 1 ? `${valueStr},` : valueStr;
|
|
196
|
+
const line = withComma + propErrorComment;
|
|
197
|
+
lines.push(line);
|
|
198
|
+
}
|
|
199
|
+
// Complex property value (object or array)
|
|
200
|
+
else {
|
|
201
|
+
const keyLine = `${propIndent}${JSON.stringify(key)}: `;
|
|
202
|
+
let valStr = stringify({
|
|
203
|
+
value: val,
|
|
204
|
+
errors,
|
|
205
|
+
path: propPath,
|
|
206
|
+
tab: tab + 1,
|
|
207
|
+
inArray: false,
|
|
208
|
+
inToJson: false,
|
|
209
|
+
usedErrors,
|
|
210
|
+
});
|
|
211
|
+
const valStrWithoutIndent = valStr.trimStart();
|
|
212
|
+
// Add comma before the error comment if not the last property
|
|
213
|
+
if (index < array.length - 1) {
|
|
214
|
+
const valLines = valStrWithoutIndent.split("\n");
|
|
215
|
+
const lastLine = valLines[valLines.length - 1];
|
|
216
|
+
const commentIndex = lastLine.indexOf(" //");
|
|
217
|
+
if (commentIndex !== -1) {
|
|
218
|
+
valLines[valLines.length - 1] = `${lastLine.slice(0, commentIndex)},${lastLine.slice(commentIndex)}`;
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
valLines[valLines.length - 1] += ",";
|
|
222
|
+
}
|
|
223
|
+
valStr = valLines.join("\n");
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
valStr = valStrWithoutIndent;
|
|
227
|
+
}
|
|
228
|
+
const combined = keyLine + valStr;
|
|
229
|
+
lines.push(combined);
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
lines.push(`${indent}}`);
|
|
233
|
+
return lines.join("\n");
|
|
234
|
+
}
|
|
235
|
+
// Primitive types (null, boolean, number, string, undefined, etc.)
|
|
236
|
+
const valStr = value === undefined
|
|
237
|
+
? "undefined"
|
|
238
|
+
: ((_a = JSON.stringify(value)) !== null && _a !== void 0 ? _a : String(value));
|
|
239
|
+
return `${indent}${valStr}${errorComment}`;
|
|
240
|
+
}
|
|
241
|
+
/** Get error comment for a given path */
|
|
242
|
+
function getErrorComment(path, errors, usedErrors) {
|
|
243
|
+
const pathErrors = errors.filter((e) => e.path === path);
|
|
244
|
+
if (pathErrors.length === 0) {
|
|
245
|
+
return "";
|
|
246
|
+
}
|
|
247
|
+
// Mark these errors as used
|
|
248
|
+
pathErrors.forEach((e) => usedErrors.add(e));
|
|
249
|
+
return ` // ❌ ${JSON.stringify(pathErrors.map((e) => ({
|
|
250
|
+
path: e.path,
|
|
251
|
+
expected: e.expected,
|
|
252
|
+
description: e.description,
|
|
253
|
+
})))}`;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Check if there are missing array element errors (path ending with []) Returns
|
|
257
|
+
* an array of error objects, one per missing element
|
|
258
|
+
*/
|
|
259
|
+
function getMissingArrayElementErrors(path, errors, usedErrors) {
|
|
260
|
+
const wildcardPath = `${path}[]`;
|
|
261
|
+
const missingErrors = errors.filter((e) => e.path === wildcardPath);
|
|
262
|
+
// Mark these errors as used
|
|
263
|
+
missingErrors.forEach((e) => usedErrors.add(e));
|
|
264
|
+
return missingErrors;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Find missing properties that have validation errors but don't exist in the
|
|
268
|
+
* data Returns array of property keys that should be displayed as undefined
|
|
269
|
+
*/
|
|
270
|
+
function getMissingProperties(path, value, errors) {
|
|
271
|
+
const missingKeys = new Set();
|
|
272
|
+
for (const e of errors) {
|
|
273
|
+
// Check if error.path is a direct child of current path
|
|
274
|
+
const childKey = extractDirectChildKey(path, e.path);
|
|
275
|
+
if (childKey !== null) {
|
|
276
|
+
// Check if this property actually exists in the value
|
|
277
|
+
if (!(childKey in value)) {
|
|
278
|
+
missingKeys.add(childKey);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return Array.from(missingKeys);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Extract direct child property key if errorPath is a direct child of
|
|
286
|
+
* parentPath Returns null if not a direct child
|
|
287
|
+
*
|
|
288
|
+
* Examples:
|
|
289
|
+
*
|
|
290
|
+
* - ExtractDirectChildKey("$input", "$input.email") => "email"
|
|
291
|
+
* - ExtractDirectChildKey("$input", "$input.user.email") => null (grandchild)
|
|
292
|
+
* - ExtractDirectChildKey("$input.user", "$input.user.email") => "email"
|
|
293
|
+
* - ExtractDirectChildKey("$input", "$input[0]") => null (array index, not object
|
|
294
|
+
* property)
|
|
295
|
+
* - ExtractDirectChildKey("$input", "$input["foo-bar"]") => "foo-bar"
|
|
296
|
+
* - ExtractDirectChildKey("$input", "$input["foo"]["bar"]") => null (grandchild)
|
|
297
|
+
*/
|
|
298
|
+
function extractDirectChildKey(parentPath, errorPath) {
|
|
299
|
+
if (!errorPath.startsWith(parentPath)) {
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
const suffix = errorPath.slice(parentPath.length);
|
|
303
|
+
// Match ".propertyName" pattern (direct child property with dot notation)
|
|
304
|
+
// Should not contain additional dots or brackets after the property name
|
|
305
|
+
const dotMatch = suffix.match(/^\.([^.[\]]+)$/);
|
|
306
|
+
if (dotMatch !== null) {
|
|
307
|
+
return dotMatch[1];
|
|
308
|
+
}
|
|
309
|
+
// Match '["key"]' pattern (direct child property with bracket notation)
|
|
310
|
+
// The key is a JSON-encoded string
|
|
311
|
+
const bracketMatch = suffix.match(/^\[("[^"\\]*(?:\\.[^"\\]*)*")\]$/);
|
|
312
|
+
if (bracketMatch !== null) {
|
|
313
|
+
try {
|
|
314
|
+
const parsed = JSON.parse(bracketMatch[1]);
|
|
315
|
+
// Ensure it's a string key, not a number (array index)
|
|
316
|
+
if (typeof parsed === "string") {
|
|
317
|
+
return parsed;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
catch (_a) {
|
|
321
|
+
// Invalid JSON, ignore
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return null;
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=stringifyValidationFailure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stringifyValidationFailure.js","sourceRoot":"","sources":["../../src/utils/stringifyValidationFailure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import { NamingConvention } from './NamingConvention.mjs';
|
|
2
|
+
import { dedent } from './dedent.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Format validation failure for LLM auto-correction feedback.
|
|
6
|
+
*
|
|
7
|
+
* When LLM generates invalid function call arguments, this produces annotated
|
|
8
|
+
* JSON with inline `// ❌` error comments at each invalid property. The output
|
|
9
|
+
* is wrapped in a markdown code block so that LLM can understand and correct
|
|
10
|
+
* its mistakes in the next turn.
|
|
11
|
+
*
|
|
12
|
+
* Below is an example of the output format:
|
|
13
|
+
*
|
|
14
|
+
* ```json
|
|
15
|
+
* {
|
|
16
|
+
* "name": "John",
|
|
17
|
+
* "age": "twenty", // ❌ [{"path":"$input.age","expected":"number & Type<\"uint32\">"}]
|
|
18
|
+
* "email": "not-an-email", // ❌ [{"path":"$input.email","expected":"string & Format<\"email\">"}]
|
|
19
|
+
* "hobbies": "reading" // ❌ [{"path":"$input.hobbies","expected":"Array<string>"}]
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @author Jeongho Nam - https://github.com/samchon
|
|
24
|
+
* @param failure Validation failure from {@link ILlmFunction.validate}
|
|
25
|
+
* @returns Markdown code block with error-annotated JSON
|
|
26
|
+
*/
|
|
27
|
+
function stringifyValidationFailure(failure) {
|
|
28
|
+
const usedErrors = new Set();
|
|
29
|
+
const jsonOutput = stringify({
|
|
30
|
+
value: failure.data,
|
|
31
|
+
errors: failure.errors,
|
|
32
|
+
path: "$input",
|
|
33
|
+
tab: 0,
|
|
34
|
+
inArray: false,
|
|
35
|
+
inToJson: false,
|
|
36
|
+
usedErrors,
|
|
37
|
+
});
|
|
38
|
+
// Find errors that couldn't be embedded
|
|
39
|
+
const unmappableErrors = failure.errors.filter((e) => !usedErrors.has(e));
|
|
40
|
+
// If there are unmappable errors, append them as a separate block
|
|
41
|
+
if (unmappableErrors.length > 0)
|
|
42
|
+
return dedent `
|
|
43
|
+
\`\`\`json
|
|
44
|
+
${jsonOutput}
|
|
45
|
+
\`\`\`
|
|
46
|
+
|
|
47
|
+
**Unmappable validation errors:**
|
|
48
|
+
\`\`\`json
|
|
49
|
+
${JSON.stringify(unmappableErrors, null, 2)}
|
|
50
|
+
\`\`\`
|
|
51
|
+
`;
|
|
52
|
+
return dedent `
|
|
53
|
+
\`\`\`json
|
|
54
|
+
${jsonOutput}
|
|
55
|
+
\`\`\`
|
|
56
|
+
`;
|
|
57
|
+
}
|
|
58
|
+
function stringify(props) {
|
|
59
|
+
const { value, errors, path, tab, inArray, inToJson, usedErrors } = props;
|
|
60
|
+
const indent = " ".repeat(tab);
|
|
61
|
+
const errorComment = getErrorComment(path, errors, usedErrors);
|
|
62
|
+
// Handle undefined in arrays
|
|
63
|
+
if (inArray && value === undefined) {
|
|
64
|
+
return `${indent}undefined${errorComment}`;
|
|
65
|
+
}
|
|
66
|
+
// Array
|
|
67
|
+
if (Array.isArray(value)) {
|
|
68
|
+
// Check for missing array element errors (path[])
|
|
69
|
+
const missingElementErrors = getMissingArrayElementErrors(path, errors, usedErrors);
|
|
70
|
+
const hasMissingElements = missingElementErrors.length > 0;
|
|
71
|
+
if (value.length === 0) {
|
|
72
|
+
// Empty array but has missing element errors - show placeholders
|
|
73
|
+
if (hasMissingElements) {
|
|
74
|
+
const innerIndent = " ".repeat(tab + 1);
|
|
75
|
+
const lines = [];
|
|
76
|
+
lines.push(`${indent}[${errorComment}`);
|
|
77
|
+
missingElementErrors.forEach((e, idx) => {
|
|
78
|
+
const errComment = ` // ❌ ${JSON.stringify([{ path: e.path, expected: e.expected, description: e.description }])}`;
|
|
79
|
+
const comma = idx < missingElementErrors.length - 1 ? "," : "";
|
|
80
|
+
lines.push(`${innerIndent}undefined${comma}${errComment}`);
|
|
81
|
+
});
|
|
82
|
+
lines.push(`${indent}]`);
|
|
83
|
+
return lines.join("\n");
|
|
84
|
+
}
|
|
85
|
+
return `${indent}[]${errorComment}`;
|
|
86
|
+
}
|
|
87
|
+
const lines = [];
|
|
88
|
+
lines.push(`${indent}[${errorComment}`);
|
|
89
|
+
value.forEach((item, index) => {
|
|
90
|
+
const itemPath = `${path}[${index}]`;
|
|
91
|
+
const isLastElement = index === value.length - 1;
|
|
92
|
+
// If there are missing element errors, this is not truly the last line
|
|
93
|
+
const needsComma = !isLastElement || hasMissingElements;
|
|
94
|
+
let itemStr = stringify({
|
|
95
|
+
value: item,
|
|
96
|
+
errors,
|
|
97
|
+
path: itemPath,
|
|
98
|
+
tab: tab + 1,
|
|
99
|
+
inArray: true,
|
|
100
|
+
inToJson: false,
|
|
101
|
+
usedErrors,
|
|
102
|
+
});
|
|
103
|
+
// Add comma before the error comment if not the last element
|
|
104
|
+
if (needsComma) {
|
|
105
|
+
const itemLines = itemStr.split("\n");
|
|
106
|
+
const lastLine = itemLines[itemLines.length - 1];
|
|
107
|
+
const commentIndex = lastLine.indexOf(" //");
|
|
108
|
+
if (commentIndex !== -1) {
|
|
109
|
+
itemLines[itemLines.length - 1] = `${lastLine.slice(0, commentIndex)},${lastLine.slice(commentIndex)}`;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
itemLines[itemLines.length - 1] += ",";
|
|
113
|
+
}
|
|
114
|
+
itemStr = itemLines.join("\n");
|
|
115
|
+
}
|
|
116
|
+
lines.push(itemStr);
|
|
117
|
+
});
|
|
118
|
+
// Add missing element placeholders at the end for each [] error
|
|
119
|
+
if (hasMissingElements) {
|
|
120
|
+
const innerIndent = " ".repeat(tab + 1);
|
|
121
|
+
missingElementErrors.forEach((e, idx) => {
|
|
122
|
+
const errComment = ` // ❌ ${JSON.stringify([{ path: e.path, expected: e.expected, description: e.description }])}`;
|
|
123
|
+
const comma = idx < missingElementErrors.length - 1 ? "," : "";
|
|
124
|
+
lines.push(`${innerIndent}undefined${comma}${errComment}`);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
lines.push(`${indent}]`);
|
|
128
|
+
return lines.join("\n");
|
|
129
|
+
}
|
|
130
|
+
// Object
|
|
131
|
+
if (typeof value === "object" && value !== null) {
|
|
132
|
+
// Check for toJSON method
|
|
133
|
+
// biome-ignore lint: intended
|
|
134
|
+
if (!inToJson && typeof value.toJSON === "function") {
|
|
135
|
+
// biome-ignore lint: intended
|
|
136
|
+
const jsonValue = value.toJSON();
|
|
137
|
+
return stringify({
|
|
138
|
+
value: jsonValue,
|
|
139
|
+
errors,
|
|
140
|
+
path,
|
|
141
|
+
tab,
|
|
142
|
+
inArray,
|
|
143
|
+
inToJson: true,
|
|
144
|
+
usedErrors,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
// Get all entries from the object (including undefined values that have errors)
|
|
148
|
+
const allEntries = Object.entries(value);
|
|
149
|
+
// Split into defined and undefined entries
|
|
150
|
+
const definedEntries = allEntries.filter(([_, val]) => val !== undefined);
|
|
151
|
+
const undefinedEntryKeys = new Set(allEntries.filter(([_, val]) => val === undefined).map(([key]) => key));
|
|
152
|
+
// Find missing properties that have validation errors (not in object at all)
|
|
153
|
+
const missingKeys = getMissingProperties(path, value, errors);
|
|
154
|
+
// Combine: defined entries + undefined entries with errors + missing properties
|
|
155
|
+
const undefinedKeysWithErrors = Array.from(undefinedEntryKeys).filter((key) => {
|
|
156
|
+
const propPath = NamingConvention.variable(key)
|
|
157
|
+
? `${path}.${key}`
|
|
158
|
+
: `${path}[${JSON.stringify(key)}]`;
|
|
159
|
+
return errors.some((e) => e.path.startsWith(propPath));
|
|
160
|
+
});
|
|
161
|
+
const allKeys = [
|
|
162
|
+
...definedEntries.map(([key]) => key),
|
|
163
|
+
...undefinedKeysWithErrors,
|
|
164
|
+
...missingKeys,
|
|
165
|
+
];
|
|
166
|
+
if (allKeys.length === 0) {
|
|
167
|
+
return `${indent}{}${errorComment}`;
|
|
168
|
+
}
|
|
169
|
+
const lines = [];
|
|
170
|
+
lines.push(`${indent}{${errorComment}`);
|
|
171
|
+
allKeys.forEach((key, index, array) => {
|
|
172
|
+
const propPath = NamingConvention.variable(key)
|
|
173
|
+
? `${path}.${key}`
|
|
174
|
+
: `${path}[${JSON.stringify(key)}]`;
|
|
175
|
+
const propIndent = " ".repeat(tab + 1);
|
|
176
|
+
// Get the value (undefined for missing properties or undefined entries)
|
|
177
|
+
const val = missingKeys.includes(key) || undefinedKeysWithErrors.includes(key)
|
|
178
|
+
? undefined
|
|
179
|
+
: // biome-ignore lint: intended
|
|
180
|
+
value[key];
|
|
181
|
+
// Primitive property value (including undefined for missing properties)
|
|
182
|
+
if (val === undefined ||
|
|
183
|
+
val === null ||
|
|
184
|
+
typeof val === "boolean" ||
|
|
185
|
+
typeof val === "number" ||
|
|
186
|
+
typeof val === "string") {
|
|
187
|
+
const propErrorComment = getErrorComment(propPath, errors, usedErrors);
|
|
188
|
+
const keyStr = JSON.stringify(key);
|
|
189
|
+
const valueStr = val === undefined
|
|
190
|
+
? `${propIndent}${keyStr}: undefined`
|
|
191
|
+
: `${propIndent}${keyStr}: ${JSON.stringify(val)}`;
|
|
192
|
+
const withComma = index < array.length - 1 ? `${valueStr},` : valueStr;
|
|
193
|
+
const line = withComma + propErrorComment;
|
|
194
|
+
lines.push(line);
|
|
195
|
+
}
|
|
196
|
+
// Complex property value (object or array)
|
|
197
|
+
else {
|
|
198
|
+
const keyLine = `${propIndent}${JSON.stringify(key)}: `;
|
|
199
|
+
let valStr = stringify({
|
|
200
|
+
value: val,
|
|
201
|
+
errors,
|
|
202
|
+
path: propPath,
|
|
203
|
+
tab: tab + 1,
|
|
204
|
+
inArray: false,
|
|
205
|
+
inToJson: false,
|
|
206
|
+
usedErrors,
|
|
207
|
+
});
|
|
208
|
+
const valStrWithoutIndent = valStr.trimStart();
|
|
209
|
+
// Add comma before the error comment if not the last property
|
|
210
|
+
if (index < array.length - 1) {
|
|
211
|
+
const valLines = valStrWithoutIndent.split("\n");
|
|
212
|
+
const lastLine = valLines[valLines.length - 1];
|
|
213
|
+
const commentIndex = lastLine.indexOf(" //");
|
|
214
|
+
if (commentIndex !== -1) {
|
|
215
|
+
valLines[valLines.length - 1] = `${lastLine.slice(0, commentIndex)},${lastLine.slice(commentIndex)}`;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
valLines[valLines.length - 1] += ",";
|
|
219
|
+
}
|
|
220
|
+
valStr = valLines.join("\n");
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
valStr = valStrWithoutIndent;
|
|
224
|
+
}
|
|
225
|
+
const combined = keyLine + valStr;
|
|
226
|
+
lines.push(combined);
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
lines.push(`${indent}}`);
|
|
230
|
+
return lines.join("\n");
|
|
231
|
+
}
|
|
232
|
+
// Primitive types (null, boolean, number, string, undefined, etc.)
|
|
233
|
+
const valStr = value === undefined
|
|
234
|
+
? "undefined"
|
|
235
|
+
: (JSON.stringify(value) ?? String(value));
|
|
236
|
+
return `${indent}${valStr}${errorComment}`;
|
|
237
|
+
}
|
|
238
|
+
/** Get error comment for a given path */
|
|
239
|
+
function getErrorComment(path, errors, usedErrors) {
|
|
240
|
+
const pathErrors = errors.filter((e) => e.path === path);
|
|
241
|
+
if (pathErrors.length === 0) {
|
|
242
|
+
return "";
|
|
243
|
+
}
|
|
244
|
+
// Mark these errors as used
|
|
245
|
+
pathErrors.forEach((e) => usedErrors.add(e));
|
|
246
|
+
return ` // ❌ ${JSON.stringify(pathErrors.map((e) => ({
|
|
247
|
+
path: e.path,
|
|
248
|
+
expected: e.expected,
|
|
249
|
+
description: e.description,
|
|
250
|
+
})))}`;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Check if there are missing array element errors (path ending with []) Returns
|
|
254
|
+
* an array of error objects, one per missing element
|
|
255
|
+
*/
|
|
256
|
+
function getMissingArrayElementErrors(path, errors, usedErrors) {
|
|
257
|
+
const wildcardPath = `${path}[]`;
|
|
258
|
+
const missingErrors = errors.filter((e) => e.path === wildcardPath);
|
|
259
|
+
// Mark these errors as used
|
|
260
|
+
missingErrors.forEach((e) => usedErrors.add(e));
|
|
261
|
+
return missingErrors;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Find missing properties that have validation errors but don't exist in the
|
|
265
|
+
* data Returns array of property keys that should be displayed as undefined
|
|
266
|
+
*/
|
|
267
|
+
function getMissingProperties(path, value, errors) {
|
|
268
|
+
const missingKeys = new Set();
|
|
269
|
+
for (const e of errors) {
|
|
270
|
+
// Check if error.path is a direct child of current path
|
|
271
|
+
const childKey = extractDirectChildKey(path, e.path);
|
|
272
|
+
if (childKey !== null) {
|
|
273
|
+
// Check if this property actually exists in the value
|
|
274
|
+
if (!(childKey in value)) {
|
|
275
|
+
missingKeys.add(childKey);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return Array.from(missingKeys);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Extract direct child property key if errorPath is a direct child of
|
|
283
|
+
* parentPath Returns null if not a direct child
|
|
284
|
+
*
|
|
285
|
+
* Examples:
|
|
286
|
+
*
|
|
287
|
+
* - ExtractDirectChildKey("$input", "$input.email") => "email"
|
|
288
|
+
* - ExtractDirectChildKey("$input", "$input.user.email") => null (grandchild)
|
|
289
|
+
* - ExtractDirectChildKey("$input.user", "$input.user.email") => "email"
|
|
290
|
+
* - ExtractDirectChildKey("$input", "$input[0]") => null (array index, not object
|
|
291
|
+
* property)
|
|
292
|
+
* - ExtractDirectChildKey("$input", "$input["foo-bar"]") => "foo-bar"
|
|
293
|
+
* - ExtractDirectChildKey("$input", "$input["foo"]["bar"]") => null (grandchild)
|
|
294
|
+
*/
|
|
295
|
+
function extractDirectChildKey(parentPath, errorPath) {
|
|
296
|
+
if (!errorPath.startsWith(parentPath)) {
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
const suffix = errorPath.slice(parentPath.length);
|
|
300
|
+
// Match ".propertyName" pattern (direct child property with dot notation)
|
|
301
|
+
// Should not contain additional dots or brackets after the property name
|
|
302
|
+
const dotMatch = suffix.match(/^\.([^.[\]]+)$/);
|
|
303
|
+
if (dotMatch !== null) {
|
|
304
|
+
return dotMatch[1];
|
|
305
|
+
}
|
|
306
|
+
// Match '["key"]' pattern (direct child property with bracket notation)
|
|
307
|
+
// The key is a JSON-encoded string
|
|
308
|
+
const bracketMatch = suffix.match(/^\[("[^"\\]*(?:\\.[^"\\]*)*")\]$/);
|
|
309
|
+
if (bracketMatch !== null) {
|
|
310
|
+
try {
|
|
311
|
+
const parsed = JSON.parse(bracketMatch[1]);
|
|
312
|
+
// Ensure it's a string key, not a number (array index)
|
|
313
|
+
if (typeof parsed === "string") {
|
|
314
|
+
return parsed;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
catch {
|
|
318
|
+
// Invalid JSON, ignore
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return null;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
export { stringifyValidationFailure };
|
|
325
|
+
//# sourceMappingURL=stringifyValidationFailure.mjs.map
|