reliant-type 1.0.0
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 +1305 -0
- package/dist/cjs/constants/SECURITY_CONSTANTS.js +49 -0
- package/dist/cjs/constants/SECURITY_CONSTANTS.js.map +1 -0
- package/dist/cjs/constants/VALIDATION_CONSTANTS.js +103 -0
- package/dist/cjs/constants/VALIDATION_CONSTANTS.js.map +1 -0
- package/dist/cjs/core/schema/extensions/SmartInference.js +200 -0
- package/dist/cjs/core/schema/extensions/SmartInference.js.map +1 -0
- package/dist/cjs/core/schema/extensions/components/AutoDocumentation/Docs.js +100 -0
- package/dist/cjs/core/schema/extensions/components/AutoDocumentation/Docs.js.map +1 -0
- package/dist/cjs/core/schema/extensions/components/AutoDocumentation/DocumentationGenerator.js +192 -0
- package/dist/cjs/core/schema/extensions/components/AutoDocumentation/DocumentationGenerator.js.map +1 -0
- package/dist/cjs/core/schema/extensions/components/AutoDocumentation/InteractiveDocumentationGenerator.js +174 -0
- package/dist/cjs/core/schema/extensions/components/AutoDocumentation/InteractiveDocumentationGenerator.js.map +1 -0
- package/dist/cjs/core/schema/extensions/components/AutoDocumentation/SchemaAnalyzer.js +54 -0
- package/dist/cjs/core/schema/extensions/components/AutoDocumentation/SchemaAnalyzer.js.map +1 -0
- package/dist/cjs/core/schema/extensions/components/AutoDocumentation/TypeScriptGenerator.js +50 -0
- package/dist/cjs/core/schema/extensions/components/AutoDocumentation/TypeScriptGenerator.js.map +1 -0
- package/dist/cjs/core/schema/extensions/components/AutoDocumentation/index.js +15 -0
- package/dist/cjs/core/schema/extensions/components/AutoDocumentation/index.js.map +1 -0
- package/dist/cjs/core/schema/extensions/components/ConditionalValidation/ConditionalBuilder.js +70 -0
- package/dist/cjs/core/schema/extensions/components/ConditionalValidation/ConditionalBuilder.js.map +1 -0
- package/dist/cjs/core/schema/extensions/components/ConditionalValidation/ConditionalElse.js +40 -0
- package/dist/cjs/core/schema/extensions/components/ConditionalValidation/ConditionalElse.js.map +1 -0
- package/dist/cjs/core/schema/extensions/components/ConditionalValidation/ConditionalThen.js +19 -0
- package/dist/cjs/core/schema/extensions/components/ConditionalValidation/ConditionalThen.js.map +1 -0
- package/dist/cjs/core/schema/extensions/components/ConditionalValidation/MultiConditionalBuilder.js +20 -0
- package/dist/cjs/core/schema/extensions/components/ConditionalValidation/MultiConditionalBuilder.js.map +1 -0
- package/dist/cjs/core/schema/extensions/components/ConditionalValidation/MultiConditionalThen.js +49 -0
- package/dist/cjs/core/schema/extensions/components/ConditionalValidation/MultiConditionalThen.js.map +1 -0
- package/dist/cjs/core/schema/extensions/components/ConditionalValidation/index.js +98 -0
- package/dist/cjs/core/schema/extensions/components/ConditionalValidation/index.js.map +1 -0
- package/dist/cjs/core/schema/extensions/components/RealtimeValidation/FormValidator.js +85 -0
- package/dist/cjs/core/schema/extensions/components/RealtimeValidation/FormValidator.js.map +1 -0
- package/dist/cjs/core/schema/extensions/components/RealtimeValidation/LiveValidator.js +133 -0
- package/dist/cjs/core/schema/extensions/components/RealtimeValidation/LiveValidator.js.map +1 -0
- package/dist/cjs/core/schema/extensions/components/RealtimeValidation/StreamValidator.js +351 -0
- package/dist/cjs/core/schema/extensions/components/RealtimeValidation/StreamValidator.js.map +1 -0
- package/dist/cjs/core/schema/extensions/components/RealtimeValidation/index.js +109 -0
- package/dist/cjs/core/schema/extensions/components/RealtimeValidation/index.js.map +1 -0
- package/dist/cjs/core/schema/extensions/index.js +61 -0
- package/dist/cjs/core/schema/extensions/index.js.map +1 -0
- package/dist/cjs/core/schema/extensions/mods/index.js +51 -0
- package/dist/cjs/core/schema/extensions/mods/index.js.map +1 -0
- package/dist/cjs/core/schema/extensions/mods/openapi-converter.js +227 -0
- package/dist/cjs/core/schema/extensions/mods/openapi-converter.js.map +1 -0
- package/dist/cjs/core/schema/extensions/mods/typescript-generator.js +287 -0
- package/dist/cjs/core/schema/extensions/mods/typescript-generator.js.map +1 -0
- package/dist/cjs/core/schema/extensions/mods/validation-engine.js +224 -0
- package/dist/cjs/core/schema/extensions/mods/validation-engine.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/Interface.js +277 -0
- package/dist/cjs/core/schema/mode/interfaces/Interface.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/InterfaceSchema.js +1431 -0
- package/dist/cjs/core/schema/mode/interfaces/InterfaceSchema.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/conditional/evaluator/ConditionalEvaluator.js +520 -0
- package/dist/cjs/core/schema/mode/interfaces/conditional/evaluator/ConditionalEvaluator.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/conditional/parser/ConditionalAST.js +624 -0
- package/dist/cjs/core/schema/mode/interfaces/conditional/parser/ConditionalAST.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/conditional/parser/ConditionalLexer.js +811 -0
- package/dist/cjs/core/schema/mode/interfaces/conditional/parser/ConditionalLexer.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/conditional/parser/ConditionalParser.js +599 -0
- package/dist/cjs/core/schema/mode/interfaces/conditional/parser/ConditionalParser.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/conditional/types/ConditionalTypes.js +89 -0
- package/dist/cjs/core/schema/mode/interfaces/conditional/types/ConditionalTypes.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/errors/ErrorHandler.js +356 -0
- package/dist/cjs/core/schema/mode/interfaces/errors/ErrorHandler.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/errors/types/errors.type.js +80 -0
- package/dist/cjs/core/schema/mode/interfaces/errors/types/errors.type.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/precompilation/FieldPrecompilers.js +778 -0
- package/dist/cjs/core/schema/mode/interfaces/precompilation/FieldPrecompilers.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/precompilation/SchemaPrecompiler.js +523 -0
- package/dist/cjs/core/schema/mode/interfaces/precompilation/SchemaPrecompiler.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/typescript/ConditionalTypes.js +681 -0
- package/dist/cjs/core/schema/mode/interfaces/typescript/ConditionalTypes.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/typescript/IDESupport.js +430 -0
- package/dist/cjs/core/schema/mode/interfaces/typescript/IDESupport.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/typescript/TypeInference.js +225 -0
- package/dist/cjs/core/schema/mode/interfaces/typescript/TypeInference.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/typescript/index.js +44 -0
- package/dist/cjs/core/schema/mode/interfaces/typescript/index.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/validators/ConstraintParser.js +1134 -0
- package/dist/cjs/core/schema/mode/interfaces/validators/ConstraintParser.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/validators/TypeGuards.js +256 -0
- package/dist/cjs/core/schema/mode/interfaces/validators/TypeGuards.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/validators/TypeValidators.js +429 -0
- package/dist/cjs/core/schema/mode/interfaces/validators/TypeValidators.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/validators/UnionCache.js +404 -0
- package/dist/cjs/core/schema/mode/interfaces/validators/UnionCache.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/validators/ValidationHelpers.js +851 -0
- package/dist/cjs/core/schema/mode/interfaces/validators/ValidationHelpers.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/validators/mods/passValidator.js +262 -0
- package/dist/cjs/core/schema/mode/interfaces/validators/mods/passValidator.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/validators/mods/securityValidator.js +887 -0
- package/dist/cjs/core/schema/mode/interfaces/validators/mods/securityValidator.js.map +1 -0
- package/dist/cjs/core/schema/mode/interfaces/validators/mods/urlValidation.js +191 -0
- package/dist/cjs/core/schema/mode/interfaces/validators/mods/urlValidation.js.map +1 -0
- package/dist/cjs/core/schema/optimization/ObjectValidationCache.js +462 -0
- package/dist/cjs/core/schema/optimization/ObjectValidationCache.js.map +1 -0
- package/dist/cjs/core/schema/optimization/PerformanceMonitor.js +773 -0
- package/dist/cjs/core/schema/optimization/PerformanceMonitor.js.map +1 -0
- package/dist/cjs/core/schema/optimization/SchemaCompiler.js +600 -0
- package/dist/cjs/core/schema/optimization/SchemaCompiler.js.map +1 -0
- package/dist/cjs/core/types/ValidatorTypes.js +70 -0
- package/dist/cjs/core/types/ValidatorTypes.js.map +1 -0
- package/dist/cjs/core/types/parser.type.js +12 -0
- package/dist/cjs/core/types/parser.type.js.map +1 -0
- package/dist/cjs/core/utils/Make.js +61 -0
- package/dist/cjs/core/utils/Make.js.map +1 -0
- package/dist/cjs/core/utils/Mod.js +1033 -0
- package/dist/cjs/core/utils/Mod.js.map +1 -0
- package/dist/cjs/core/utils/UrlArgs.js +102 -0
- package/dist/cjs/core/utils/UrlArgs.js.map +1 -0
- package/dist/cjs/core/utils/arrayToEnum.js +18 -0
- package/dist/cjs/core/utils/arrayToEnum.js.map +1 -0
- package/dist/cjs/core/utils/createUrlArgsEnumFArray.js +13 -0
- package/dist/cjs/core/utils/createUrlArgsEnumFArray.js.map +1 -0
- package/dist/cjs/core/utils/securityHelpers.js +215 -0
- package/dist/cjs/core/utils/securityHelpers.js.map +1 -0
- package/dist/cjs/core/utils/securityValidatorHelpers.js +65 -0
- package/dist/cjs/core/utils/securityValidatorHelpers.js.map +1 -0
- package/dist/cjs/index.js +31 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/esm/constants/SECURITY_CONSTANTS.js +47 -0
- package/dist/esm/constants/SECURITY_CONSTANTS.js.map +1 -0
- package/dist/esm/constants/VALIDATION_CONSTANTS.js +98 -0
- package/dist/esm/constants/VALIDATION_CONSTANTS.js.map +1 -0
- package/dist/esm/core/schema/extensions/SmartInference.js +197 -0
- package/dist/esm/core/schema/extensions/SmartInference.js.map +1 -0
- package/dist/esm/core/schema/extensions/components/AutoDocumentation/Docs.js +98 -0
- package/dist/esm/core/schema/extensions/components/AutoDocumentation/Docs.js.map +1 -0
- package/dist/esm/core/schema/extensions/components/AutoDocumentation/DocumentationGenerator.js +190 -0
- package/dist/esm/core/schema/extensions/components/AutoDocumentation/DocumentationGenerator.js.map +1 -0
- package/dist/esm/core/schema/extensions/components/AutoDocumentation/InteractiveDocumentationGenerator.js +172 -0
- package/dist/esm/core/schema/extensions/components/AutoDocumentation/InteractiveDocumentationGenerator.js.map +1 -0
- package/dist/esm/core/schema/extensions/components/AutoDocumentation/SchemaAnalyzer.js +52 -0
- package/dist/esm/core/schema/extensions/components/AutoDocumentation/SchemaAnalyzer.js.map +1 -0
- package/dist/esm/core/schema/extensions/components/AutoDocumentation/TypeScriptGenerator.js +48 -0
- package/dist/esm/core/schema/extensions/components/AutoDocumentation/TypeScriptGenerator.js.map +1 -0
- package/dist/esm/core/schema/extensions/components/AutoDocumentation/index.js +12 -0
- package/dist/esm/core/schema/extensions/components/AutoDocumentation/index.js.map +1 -0
- package/dist/esm/core/schema/extensions/components/ConditionalValidation/ConditionalBuilder.js +68 -0
- package/dist/esm/core/schema/extensions/components/ConditionalValidation/ConditionalBuilder.js.map +1 -0
- package/dist/esm/core/schema/extensions/components/ConditionalValidation/ConditionalElse.js +38 -0
- package/dist/esm/core/schema/extensions/components/ConditionalValidation/ConditionalElse.js.map +1 -0
- package/dist/esm/core/schema/extensions/components/ConditionalValidation/ConditionalThen.js +17 -0
- package/dist/esm/core/schema/extensions/components/ConditionalValidation/ConditionalThen.js.map +1 -0
- package/dist/esm/core/schema/extensions/components/ConditionalValidation/MultiConditionalBuilder.js +18 -0
- package/dist/esm/core/schema/extensions/components/ConditionalValidation/MultiConditionalBuilder.js.map +1 -0
- package/dist/esm/core/schema/extensions/components/ConditionalValidation/MultiConditionalThen.js +45 -0
- package/dist/esm/core/schema/extensions/components/ConditionalValidation/MultiConditionalThen.js.map +1 -0
- package/dist/esm/core/schema/extensions/components/ConditionalValidation/index.js +92 -0
- package/dist/esm/core/schema/extensions/components/ConditionalValidation/index.js.map +1 -0
- package/dist/esm/core/schema/extensions/components/RealtimeValidation/FormValidator.js +83 -0
- package/dist/esm/core/schema/extensions/components/RealtimeValidation/FormValidator.js.map +1 -0
- package/dist/esm/core/schema/extensions/components/RealtimeValidation/LiveValidator.js +131 -0
- package/dist/esm/core/schema/extensions/components/RealtimeValidation/LiveValidator.js.map +1 -0
- package/dist/esm/core/schema/extensions/components/RealtimeValidation/StreamValidator.js +349 -0
- package/dist/esm/core/schema/extensions/components/RealtimeValidation/StreamValidator.js.map +1 -0
- package/dist/esm/core/schema/extensions/components/RealtimeValidation/index.js +103 -0
- package/dist/esm/core/schema/extensions/components/RealtimeValidation/index.js.map +1 -0
- package/dist/esm/core/schema/extensions/index.js +53 -0
- package/dist/esm/core/schema/extensions/index.js.map +1 -0
- package/dist/esm/core/schema/extensions/mods/index.js +47 -0
- package/dist/esm/core/schema/extensions/mods/index.js.map +1 -0
- package/dist/esm/core/schema/extensions/mods/openapi-converter.js +225 -0
- package/dist/esm/core/schema/extensions/mods/openapi-converter.js.map +1 -0
- package/dist/esm/core/schema/extensions/mods/typescript-generator.js +284 -0
- package/dist/esm/core/schema/extensions/mods/typescript-generator.js.map +1 -0
- package/dist/esm/core/schema/extensions/mods/validation-engine.js +222 -0
- package/dist/esm/core/schema/extensions/mods/validation-engine.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/Interface.js +269 -0
- package/dist/esm/core/schema/mode/interfaces/Interface.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/InterfaceSchema.js +1429 -0
- package/dist/esm/core/schema/mode/interfaces/InterfaceSchema.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/conditional/evaluator/ConditionalEvaluator.js +518 -0
- package/dist/esm/core/schema/mode/interfaces/conditional/evaluator/ConditionalEvaluator.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/conditional/parser/ConditionalAST.js +620 -0
- package/dist/esm/core/schema/mode/interfaces/conditional/parser/ConditionalAST.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/conditional/parser/ConditionalLexer.js +809 -0
- package/dist/esm/core/schema/mode/interfaces/conditional/parser/ConditionalLexer.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/conditional/parser/ConditionalParser.js +597 -0
- package/dist/esm/core/schema/mode/interfaces/conditional/parser/ConditionalParser.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/conditional/types/ConditionalTypes.js +89 -0
- package/dist/esm/core/schema/mode/interfaces/conditional/types/ConditionalTypes.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/errors/ErrorHandler.js +354 -0
- package/dist/esm/core/schema/mode/interfaces/errors/ErrorHandler.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/errors/types/errors.type.js +80 -0
- package/dist/esm/core/schema/mode/interfaces/errors/types/errors.type.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/precompilation/FieldPrecompilers.js +776 -0
- package/dist/esm/core/schema/mode/interfaces/precompilation/FieldPrecompilers.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/precompilation/SchemaPrecompiler.js +521 -0
- package/dist/esm/core/schema/mode/interfaces/precompilation/SchemaPrecompiler.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/typescript/ConditionalTypes.js +681 -0
- package/dist/esm/core/schema/mode/interfaces/typescript/ConditionalTypes.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/typescript/IDESupport.js +428 -0
- package/dist/esm/core/schema/mode/interfaces/typescript/IDESupport.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/typescript/TypeInference.js +223 -0
- package/dist/esm/core/schema/mode/interfaces/typescript/TypeInference.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/typescript/index.js +35 -0
- package/dist/esm/core/schema/mode/interfaces/typescript/index.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/validators/ConstraintParser.js +1132 -0
- package/dist/esm/core/schema/mode/interfaces/validators/ConstraintParser.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/validators/TypeGuards.js +254 -0
- package/dist/esm/core/schema/mode/interfaces/validators/TypeGuards.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/validators/TypeValidators.js +427 -0
- package/dist/esm/core/schema/mode/interfaces/validators/TypeValidators.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/validators/UnionCache.js +400 -0
- package/dist/esm/core/schema/mode/interfaces/validators/UnionCache.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/validators/ValidationHelpers.js +849 -0
- package/dist/esm/core/schema/mode/interfaces/validators/ValidationHelpers.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/validators/mods/passValidator.js +260 -0
- package/dist/esm/core/schema/mode/interfaces/validators/mods/passValidator.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/validators/mods/securityValidator.js +881 -0
- package/dist/esm/core/schema/mode/interfaces/validators/mods/securityValidator.js.map +1 -0
- package/dist/esm/core/schema/mode/interfaces/validators/mods/urlValidation.js +189 -0
- package/dist/esm/core/schema/mode/interfaces/validators/mods/urlValidation.js.map +1 -0
- package/dist/esm/core/schema/optimization/ObjectValidationCache.js +460 -0
- package/dist/esm/core/schema/optimization/ObjectValidationCache.js.map +1 -0
- package/dist/esm/core/schema/optimization/PerformanceMonitor.js +771 -0
- package/dist/esm/core/schema/optimization/PerformanceMonitor.js.map +1 -0
- package/dist/esm/core/schema/optimization/SchemaCompiler.js +598 -0
- package/dist/esm/core/schema/optimization/SchemaCompiler.js.map +1 -0
- package/dist/esm/core/types/ValidatorTypes.js +65 -0
- package/dist/esm/core/types/ValidatorTypes.js.map +1 -0
- package/dist/esm/core/types/parser.type.js +12 -0
- package/dist/esm/core/types/parser.type.js.map +1 -0
- package/dist/esm/core/utils/Make.js +59 -0
- package/dist/esm/core/utils/Make.js.map +1 -0
- package/dist/esm/core/utils/Mod.js +1031 -0
- package/dist/esm/core/utils/Mod.js.map +1 -0
- package/dist/esm/core/utils/UrlArgs.js +98 -0
- package/dist/esm/core/utils/UrlArgs.js.map +1 -0
- package/dist/esm/core/utils/arrayToEnum.js +16 -0
- package/dist/esm/core/utils/arrayToEnum.js.map +1 -0
- package/dist/esm/core/utils/createUrlArgsEnumFArray.js +11 -0
- package/dist/esm/core/utils/createUrlArgsEnumFArray.js.map +1 -0
- package/dist/esm/core/utils/securityHelpers.js +207 -0
- package/dist/esm/core/utils/securityHelpers.js.map +1 -0
- package/dist/esm/core/utils/securityValidatorHelpers.js +62 -0
- package/dist/esm/core/utils/securityValidatorHelpers.js.map +1 -0
- package/dist/esm/index.js +12 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/schema.d.ts +2595 -0
- package/docs/ALL_TYPES.md +120 -0
- package/docs/API-STABILITY.md +336 -0
- package/docs/CONDITIONAL-VALIDATION.md +637 -0
- package/docs/EXAMPLES.md +876 -0
- package/docs/FIELD-TYPES.md +829 -0
- package/docs/GETTING-STARTED.md +394 -0
- package/docs/LIVE-UTILITY.md +1137 -0
- package/docs/QUICK-REFERENCE.md +346 -0
- package/docs/README.md +205 -0
- package/docs/VSCODE-EXTENSION.md +458 -0
- package/package.json +219 -0
- package/src/bench/BENCHMARK-RESULTS.md +211 -0
- package/src/bench/benchmark-results.json +148 -0
- package/src/bench/performance-comparison.ts +218 -0
- package/src/bench/precompilation-benchmark.ts +218 -0
- package/src/constants/SECURITY_CONSTANTS.ts +44 -0
- package/src/constants/VALIDATION_CONSTANTS.ts +176 -0
- package/src/core/README.md +395 -0
- package/src/core/compiler/SchemaTransformer.ts +279 -0
- package/src/core/compiler/TypeAnalyzer.ts +378 -0
- package/src/core/compiler/TypeScriptCompilerIntegration.ts +220 -0
- package/src/core/compiler/TypeToSchemaConverter.ts +288 -0
- package/src/core/index.ts +70 -0
- package/src/core/schema/extensions/AutoDocumentation.ts +572 -0
- package/src/core/schema/extensions/ConditionalValidation.ts +330 -0
- package/src/core/schema/extensions/README.md +171 -0
- package/src/core/schema/extensions/RealtimeValidation.ts +656 -0
- package/src/core/schema/extensions/SmartInference.ts +224 -0
- package/src/core/schema/extensions/components/AutoDocumentation/Docs.ts +98 -0
- package/src/core/schema/extensions/components/AutoDocumentation/DocumentationGenerator.ts +201 -0
- package/src/core/schema/extensions/components/AutoDocumentation/InteractiveDocumentationGenerator.ts +176 -0
- package/src/core/schema/extensions/components/AutoDocumentation/OpenAPIGenerator.ts +175 -0
- package/src/core/schema/extensions/components/AutoDocumentation/SchemaAnalyzer.ts +49 -0
- package/src/core/schema/extensions/components/AutoDocumentation/TypeScriptGenerator.ts +54 -0
- package/src/core/schema/extensions/components/AutoDocumentation/index.ts +17 -0
- package/src/core/schema/extensions/components/ConditionalValidation/ConditionalBuilder.ts +101 -0
- package/src/core/schema/extensions/components/ConditionalValidation/ConditionalElse.ts +65 -0
- package/src/core/schema/extensions/components/ConditionalValidation/ConditionalThen.ts +33 -0
- package/src/core/schema/extensions/components/ConditionalValidation/Extend.ts +75 -0
- package/src/core/schema/extensions/components/ConditionalValidation/MultiConditionalBuilder.ts +16 -0
- package/src/core/schema/extensions/components/ConditionalValidation/MultiConditionalThen.ts +50 -0
- package/src/core/schema/extensions/components/ConditionalValidation/index.ts +104 -0
- package/src/core/schema/extensions/components/RealtimeValidation/FormValidator.ts +88 -0
- package/src/core/schema/extensions/components/RealtimeValidation/LiveValidator.ts +171 -0
- package/src/core/schema/extensions/components/RealtimeValidation/StreamValidator.ts +397 -0
- package/src/core/schema/extensions/components/RealtimeValidation/index.ts +114 -0
- package/src/core/schema/extensions/index.ts +76 -0
- package/src/core/schema/extensions/mods/index.ts +131 -0
- package/src/core/schema/extensions/mods/openapi-converter.ts +338 -0
- package/src/core/schema/extensions/mods/typescript-generator.ts +379 -0
- package/src/core/schema/extensions/mods/validation-engine.ts +295 -0
- package/src/core/schema/mode/interfaces/Interface.ts +364 -0
- package/src/core/schema/mode/interfaces/InterfaceSchema.ts +1838 -0
- package/src/core/schema/mode/interfaces/README.md +278 -0
- package/src/core/schema/mode/interfaces/conditional/evaluator/ConditionalEvaluator.ts +657 -0
- package/src/core/schema/mode/interfaces/conditional/parser/ConditionalAST.ts +826 -0
- package/src/core/schema/mode/interfaces/conditional/parser/ConditionalLexer.ts +992 -0
- package/src/core/schema/mode/interfaces/conditional/parser/ConditionalParser.ts +803 -0
- package/src/core/schema/mode/interfaces/conditional/parser/readme.md +406 -0
- package/src/core/schema/mode/interfaces/conditional/types/ConditionalTypes.ts +273 -0
- package/src/core/schema/mode/interfaces/errors/ErrorHandler.ts +624 -0
- package/src/core/schema/mode/interfaces/errors/types/errors.type.ts +102 -0
- package/src/core/schema/mode/interfaces/precompilation/FieldPrecompilers.ts +962 -0
- package/src/core/schema/mode/interfaces/precompilation/SchemaPrecompiler.ts +667 -0
- package/src/core/schema/mode/interfaces/typescript/ConditionalTypes.ts +1534 -0
- package/src/core/schema/mode/interfaces/typescript/IDESupport.ts +534 -0
- package/src/core/schema/mode/interfaces/typescript/TypeInference.ts +737 -0
- package/src/core/schema/mode/interfaces/typescript/index.ts +92 -0
- package/src/core/schema/mode/interfaces/validators/ConstraintParser.ts +1438 -0
- package/src/core/schema/mode/interfaces/validators/EnhancedErrorReporting.ts +227 -0
- package/src/core/schema/mode/interfaces/validators/TypeGuards.ts +288 -0
- package/src/core/schema/mode/interfaces/validators/TypeValidators.ts +660 -0
- package/src/core/schema/mode/interfaces/validators/UnionCache.ts +508 -0
- package/src/core/schema/mode/interfaces/validators/ValidationHelpers.ts +1257 -0
- package/src/core/schema/mode/interfaces/validators/index.ts +21 -0
- package/src/core/schema/mode/interfaces/validators/mods/passValidator.ts +424 -0
- package/src/core/schema/mode/interfaces/validators/mods/securityValidator.ts +1634 -0
- package/src/core/schema/mode/interfaces/validators/mods/urlValidation.ts +333 -0
- package/src/core/schema/optimization/ObjectValidationCache.ts +560 -0
- package/src/core/schema/optimization/PerformanceInitializer.ts +188 -0
- package/src/core/schema/optimization/PerformanceMonitor.ts +898 -0
- package/src/core/schema/optimization/SchemaCompiler.ts +730 -0
- package/src/core/testing/TestDataGenerator.ts +590 -0
- package/src/core/types/SchemaValidator.type.ts +210 -0
- package/src/core/types/ValidatorTypes.ts +93 -0
- package/src/core/types/extension.type.ts +109 -0
- package/src/core/types/objValidationCache.ts +17 -0
- package/src/core/types/parser.type.ts +15 -0
- package/src/core/types/perfoMonitor.ts +37 -0
- package/src/core/types/scompiler.ts +22 -0
- package/src/core/types/securityValidator.type.ts +10 -0
- package/src/core/types/types.ts +154 -0
- package/src/core/utils/Make.ts +97 -0
- package/src/core/utils/Mod.ts +1168 -0
- package/src/core/utils/UrlArgs.ts +124 -0
- package/src/core/utils/arrayToEnum.ts +89 -0
- package/src/core/utils/createUrlArgsEnumFArray.ts +11 -0
- package/src/core/utils/securityHelpers.ts +341 -0
- package/src/core/utils/securityValidatorHelpers.ts +76 -0
- package/src/index.ts +124 -0
|
@@ -0,0 +1,737 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified TypeScript Type Inference System
|
|
3
|
+
*
|
|
4
|
+
* Combines core schema type inference with advanced conditional analysis.
|
|
5
|
+
* This is the single source of truth for all TypeScript type operations.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
ConditionalNode,
|
|
10
|
+
FieldAccessNode,
|
|
11
|
+
ComparisonNode,
|
|
12
|
+
MethodCallNode,
|
|
13
|
+
TokenType,
|
|
14
|
+
} from "../conditional/types/ConditionalTypes";
|
|
15
|
+
import { ASTWalker, ASTVisitor } from "../conditional/parser/ConditionalAST";
|
|
16
|
+
import {
|
|
17
|
+
ConstantValue,
|
|
18
|
+
OptionalConstantValue,
|
|
19
|
+
OptionalSchemaInterface,
|
|
20
|
+
UnionValue,
|
|
21
|
+
} from "../../../../types/SchemaValidator.type";
|
|
22
|
+
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// CORE TYPE SYSTEM - Unified from types/interface.type.ts
|
|
25
|
+
// ============================================================================
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Core type mapping for basic field types
|
|
29
|
+
*/
|
|
30
|
+
export type CoreTypeMap = {
|
|
31
|
+
// Basic types
|
|
32
|
+
string: string;
|
|
33
|
+
number: number;
|
|
34
|
+
boolean: boolean;
|
|
35
|
+
date: Date;
|
|
36
|
+
any: any;
|
|
37
|
+
|
|
38
|
+
// String formats
|
|
39
|
+
email: string;
|
|
40
|
+
url: string;
|
|
41
|
+
uuid: string;
|
|
42
|
+
phone: string;
|
|
43
|
+
slug: string;
|
|
44
|
+
username: string;
|
|
45
|
+
|
|
46
|
+
// Number types
|
|
47
|
+
int: number;
|
|
48
|
+
integer: number;
|
|
49
|
+
positive: number;
|
|
50
|
+
negative: number;
|
|
51
|
+
float: number;
|
|
52
|
+
double: number;
|
|
53
|
+
|
|
54
|
+
// Special types
|
|
55
|
+
unknown: unknown;
|
|
56
|
+
void: undefined;
|
|
57
|
+
null: null;
|
|
58
|
+
undefined: undefined;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Extract base type from field type string (removes constraints and modifiers)
|
|
63
|
+
*/
|
|
64
|
+
export type ExtractBaseType<T extends string> =
|
|
65
|
+
T extends `${infer Base}(${string})`
|
|
66
|
+
? Base
|
|
67
|
+
: T extends `${infer Base}?`
|
|
68
|
+
? Base
|
|
69
|
+
: T extends `${infer Base}[]`
|
|
70
|
+
? Base
|
|
71
|
+
: T extends `${infer Base}[]?`
|
|
72
|
+
? Base
|
|
73
|
+
: T extends `${infer Base}!`
|
|
74
|
+
? Base
|
|
75
|
+
: // Handle parentheses around union types like "(web | test | ok)?"
|
|
76
|
+
T extends `(${infer Content})?`
|
|
77
|
+
? Content
|
|
78
|
+
: T extends `(${infer Content})`
|
|
79
|
+
? Content
|
|
80
|
+
: T;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Check if field type is optional
|
|
84
|
+
*/
|
|
85
|
+
export type IsOptional<T extends string> = T extends `${string}?`
|
|
86
|
+
? true
|
|
87
|
+
: false;
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Check if field type is required (non-empty/non-zero)
|
|
91
|
+
*/
|
|
92
|
+
export type IsRequired<T extends string> = T extends `${string}!`
|
|
93
|
+
? true
|
|
94
|
+
: false;
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Check if field type is an array
|
|
98
|
+
*/
|
|
99
|
+
export type IsArray<T extends string> = T extends `${string}[]` | `${string}[]?`
|
|
100
|
+
? true
|
|
101
|
+
: false;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Extract element type from array type, handling parentheses
|
|
105
|
+
*/
|
|
106
|
+
export type ExtractElementType<T extends string> =
|
|
107
|
+
T extends `${infer Element}[]`
|
|
108
|
+
? Element extends `(${infer UnionContent})`
|
|
109
|
+
? UnionContent
|
|
110
|
+
: Element
|
|
111
|
+
: T extends `${infer Element}[]?`
|
|
112
|
+
? Element extends `(${infer UnionContent})`
|
|
113
|
+
? UnionContent
|
|
114
|
+
: Element
|
|
115
|
+
: T;
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Map field type string to TypeScript type
|
|
119
|
+
*/
|
|
120
|
+
export type MapFieldType<T extends string> =
|
|
121
|
+
// Handle arrays first
|
|
122
|
+
IsArray<T> extends true
|
|
123
|
+
? Array<MapFieldType<ExtractElementType<T>>>
|
|
124
|
+
: // Handle record types (record<K, V> or Record<K, V>)
|
|
125
|
+
T extends `record<${infer K}, ${infer V}>`
|
|
126
|
+
? Record<
|
|
127
|
+
MapFieldType<K> extends string | number | symbol
|
|
128
|
+
? MapFieldType<K>
|
|
129
|
+
: string,
|
|
130
|
+
MapFieldType<V>
|
|
131
|
+
>
|
|
132
|
+
: T extends `Record<${infer K}, ${infer V}>`
|
|
133
|
+
? Record<
|
|
134
|
+
MapFieldType<K> extends string | number | symbol
|
|
135
|
+
? MapFieldType<K>
|
|
136
|
+
: string,
|
|
137
|
+
MapFieldType<V>
|
|
138
|
+
>
|
|
139
|
+
: // Handle conditional expressions (contains "when" and "*?")
|
|
140
|
+
T extends `when ${string} *? ${string}`
|
|
141
|
+
? InferConditionalType<T>
|
|
142
|
+
: // Handle union types (contains |) - check after removing optional and parentheses
|
|
143
|
+
ExtractBaseType<T> extends `${string}|${string}`
|
|
144
|
+
? ParseUnionType<ExtractBaseType<T>>
|
|
145
|
+
: // Handle constant types (starts with =)
|
|
146
|
+
T extends `=${infer Value}?`
|
|
147
|
+
? Value | undefined
|
|
148
|
+
: T extends `=${infer Value}`
|
|
149
|
+
? Value
|
|
150
|
+
: // Handle core types
|
|
151
|
+
ExtractBaseType<T> extends keyof CoreTypeMap
|
|
152
|
+
? CoreTypeMap[ExtractBaseType<T>]
|
|
153
|
+
: // Fallback to any for unknown types
|
|
154
|
+
any;
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Utility type to trim whitespace from string literal types
|
|
158
|
+
*/
|
|
159
|
+
export type Trim<T extends string> = T extends ` ${infer Rest}`
|
|
160
|
+
? Trim<Rest>
|
|
161
|
+
: T extends `${infer Rest} `
|
|
162
|
+
? Trim<Rest>
|
|
163
|
+
: T;
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Parse union type string into union of literal types
|
|
167
|
+
*/
|
|
168
|
+
export type ParseUnionType<T extends string> =
|
|
169
|
+
// First handle parentheses if present - trim the content inside
|
|
170
|
+
T extends `(${infer Content})`
|
|
171
|
+
? ParseUnionType<Trim<Content>>
|
|
172
|
+
: // Then parse the union
|
|
173
|
+
T extends `${infer First}|${infer Rest}`
|
|
174
|
+
? Trim<First> | ParseUnionType<Rest>
|
|
175
|
+
: Trim<T>;
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Handle optional fields
|
|
179
|
+
*/
|
|
180
|
+
export type HandleOptional<T, IsOpt extends boolean> = IsOpt extends true
|
|
181
|
+
? T | undefined
|
|
182
|
+
: T;
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Infer type for a single field
|
|
186
|
+
*/
|
|
187
|
+
export type InferFieldType<T> = T extends string
|
|
188
|
+
? HandleOptional<MapFieldType<T>, IsOptional<T>>
|
|
189
|
+
: T extends ConstantValue
|
|
190
|
+
? T["const"]
|
|
191
|
+
: T extends OptionalConstantValue
|
|
192
|
+
? T["const"] | undefined
|
|
193
|
+
: T extends UnionValue<infer U> & { optional: true }
|
|
194
|
+
? U[number] | undefined
|
|
195
|
+
: T extends UnionValue<infer U>
|
|
196
|
+
? U[number]
|
|
197
|
+
: T extends OptionalSchemaInterface
|
|
198
|
+
? InferSchemaType<T["schema"]> | undefined
|
|
199
|
+
: T extends Array<infer U>
|
|
200
|
+
? Array<InferSchemaType<U>>
|
|
201
|
+
: T extends object
|
|
202
|
+
? InferSchemaType<T>
|
|
203
|
+
: any;
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Main type inference for schema interfaces
|
|
207
|
+
* FIXED: Handle optional properties correctly in nested objects
|
|
208
|
+
*/
|
|
209
|
+
export type InferSchemaType<T> = {
|
|
210
|
+
// Required properties (non-optional)
|
|
211
|
+
[K in keyof T as T[K] extends string
|
|
212
|
+
? IsOptional<T[K]> extends true
|
|
213
|
+
? never
|
|
214
|
+
: K
|
|
215
|
+
: K]: InferFieldType<T[K]>;
|
|
216
|
+
} & {
|
|
217
|
+
// Optional properties (with ? suffix)
|
|
218
|
+
[K in keyof T as T[K] extends string
|
|
219
|
+
? IsOptional<T[K]> extends true
|
|
220
|
+
? K
|
|
221
|
+
: never
|
|
222
|
+
: never]?: InferFieldType<T[K]>;
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
// Additional utility types for Make.ts compatibility
|
|
226
|
+
export type InterfaceSchemaFromType<T> = {
|
|
227
|
+
[K in keyof T]: T[K] extends string
|
|
228
|
+
? T[K]
|
|
229
|
+
: T[K] extends number
|
|
230
|
+
? "number"
|
|
231
|
+
: T[K] extends boolean
|
|
232
|
+
? "boolean"
|
|
233
|
+
: T[K] extends Date
|
|
234
|
+
? "date"
|
|
235
|
+
: T[K] extends any[]
|
|
236
|
+
? "array"
|
|
237
|
+
: T[K] extends object
|
|
238
|
+
? InterfaceSchemaFromType<T[K]>
|
|
239
|
+
: "any";
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
export type TypeToSchema<T> = InterfaceSchemaFromType<T>;
|
|
243
|
+
|
|
244
|
+
// ============================================================================
|
|
245
|
+
// CONDITIONAL TYPE ANALYSIS - Advanced conditional logic
|
|
246
|
+
// ============================================================================
|
|
247
|
+
|
|
248
|
+
// TypeScript utility types for conditional validation
|
|
249
|
+
export type ConditionalExpression<T> = string;
|
|
250
|
+
|
|
251
|
+
// Extract field paths from conditional expressions
|
|
252
|
+
export type ExtractFields<T extends string> =
|
|
253
|
+
T extends `when ${infer Field} ${string}`
|
|
254
|
+
? Field extends `${infer F}.${infer Rest}`
|
|
255
|
+
? F | ExtractFields<`when ${Rest} ${string}`>
|
|
256
|
+
: Field
|
|
257
|
+
: never;
|
|
258
|
+
|
|
259
|
+
// Infer return type from conditional expression
|
|
260
|
+
export type InferConditionalType<
|
|
261
|
+
T extends string,
|
|
262
|
+
ThenType = unknown,
|
|
263
|
+
ElseType = unknown,
|
|
264
|
+
> = T extends `${string} *? ${infer Then} : ${infer Else}`
|
|
265
|
+
? Then extends `=${infer ThenValue}`
|
|
266
|
+
? Else extends `=${infer ElseValue}`
|
|
267
|
+
? ThenValue | ElseValue
|
|
268
|
+
: ThenType | ElseType
|
|
269
|
+
: ThenType | ElseType
|
|
270
|
+
: ThenType | ElseType;
|
|
271
|
+
|
|
272
|
+
// Validate field access against data type
|
|
273
|
+
export type ValidateFieldAccess<
|
|
274
|
+
TData,
|
|
275
|
+
TField extends string,
|
|
276
|
+
> = TField extends keyof TData
|
|
277
|
+
? TData[TField]
|
|
278
|
+
: TField extends `${infer K}.${infer Rest}`
|
|
279
|
+
? K extends keyof TData
|
|
280
|
+
? TData[K] extends object
|
|
281
|
+
? ValidateFieldAccess<TData[K], Rest>
|
|
282
|
+
: never
|
|
283
|
+
: never
|
|
284
|
+
: never;
|
|
285
|
+
|
|
286
|
+
// Type-safe conditional validation
|
|
287
|
+
export interface TypeSafeConditional<TData = any> {
|
|
288
|
+
/**
|
|
289
|
+
* Create a type-safe conditional expression
|
|
290
|
+
*/
|
|
291
|
+
when<TField extends keyof TData>(
|
|
292
|
+
field: TField
|
|
293
|
+
): ConditionalBuilder<TData, TData[TField]>;
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Create a type-safe nested field conditional
|
|
297
|
+
*/
|
|
298
|
+
whenField<TPath extends string>(
|
|
299
|
+
path: TPath
|
|
300
|
+
): ConditionalBuilder<TData, ValidateFieldAccess<TData, TPath>>;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// Conditional builder for type-safe chaining
|
|
304
|
+
export interface ConditionalBuilder<TData, TFieldType> {
|
|
305
|
+
/**
|
|
306
|
+
* Equality comparison
|
|
307
|
+
*/
|
|
308
|
+
equals<TValue extends TFieldType>(
|
|
309
|
+
value: TValue
|
|
310
|
+
): ConditionalThen<TData, TFieldType>;
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Inequality comparison
|
|
314
|
+
*/
|
|
315
|
+
notEquals<TValue extends TFieldType>(
|
|
316
|
+
value: TValue
|
|
317
|
+
): ConditionalThen<TData, TFieldType>;
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Greater than comparison (for numbers)
|
|
321
|
+
*/
|
|
322
|
+
greaterThan<TValue extends TFieldType>(
|
|
323
|
+
value: TFieldType extends number ? TValue : never
|
|
324
|
+
): ConditionalThen<TData, TFieldType>;
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Greater than or equal comparison (for numbers)
|
|
328
|
+
*/
|
|
329
|
+
greaterEqual<TValue extends TFieldType>(
|
|
330
|
+
value: TFieldType extends number ? TValue : never
|
|
331
|
+
): ConditionalThen<TData, TFieldType>;
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Less than comparison (for numbers)
|
|
335
|
+
*/
|
|
336
|
+
lessThan<TValue extends TFieldType>(
|
|
337
|
+
value: TFieldType extends number ? TValue : never
|
|
338
|
+
): ConditionalThen<TData, TFieldType>;
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Less than or equal comparison (for numbers)
|
|
342
|
+
*/
|
|
343
|
+
lessEqual<TValue extends TFieldType>(
|
|
344
|
+
value: TFieldType extends number ? TValue : never
|
|
345
|
+
): ConditionalThen<TData, TFieldType>;
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Regex match (for strings)
|
|
349
|
+
*/
|
|
350
|
+
matches<TPattern extends string>(
|
|
351
|
+
pattern: TFieldType extends string ? TPattern : never
|
|
352
|
+
): ConditionalThen<TData, TFieldType>;
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* Array inclusion check
|
|
356
|
+
*/
|
|
357
|
+
in<TValues extends readonly TFieldType[]>(
|
|
358
|
+
...values: TValues
|
|
359
|
+
): ConditionalThen<TData, TFieldType>;
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Array exclusion check
|
|
363
|
+
*/
|
|
364
|
+
notIn<TValues extends readonly TFieldType[]>(
|
|
365
|
+
...values: TValues
|
|
366
|
+
): ConditionalThen<TData, TFieldType>;
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Existence check
|
|
370
|
+
*/
|
|
371
|
+
exists(): ConditionalThen<TData, TFieldType>;
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* Non-existence check
|
|
375
|
+
*/
|
|
376
|
+
notExists(): ConditionalThen<TData, TFieldType>;
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Contains check (for strings and arrays)
|
|
380
|
+
*/
|
|
381
|
+
contains<TValue>(
|
|
382
|
+
value: TFieldType extends string
|
|
383
|
+
? string
|
|
384
|
+
: TFieldType extends readonly (infer U)[]
|
|
385
|
+
? U
|
|
386
|
+
: never
|
|
387
|
+
): ConditionalThen<TData, TFieldType>;
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Starts with check (for strings)
|
|
391
|
+
*/
|
|
392
|
+
startsWith<TPrefix extends string>(
|
|
393
|
+
prefix: TFieldType extends string ? TPrefix : never
|
|
394
|
+
): ConditionalThen<TData, TFieldType>;
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* Ends with check (for strings)
|
|
398
|
+
*/
|
|
399
|
+
endsWith<TSuffix extends string>(
|
|
400
|
+
suffix: TFieldType extends string ? TSuffix : never
|
|
401
|
+
): ConditionalThen<TData, TFieldType>;
|
|
402
|
+
|
|
403
|
+
/**
|
|
404
|
+
* Between check (for numbers)
|
|
405
|
+
*/
|
|
406
|
+
between<TMin extends TFieldType, TMax extends TFieldType>(
|
|
407
|
+
min: TFieldType extends number ? TMin : never,
|
|
408
|
+
max: TFieldType extends number ? TMax : never
|
|
409
|
+
): ConditionalThen<TData, TFieldType>;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
// Then clause builder
|
|
413
|
+
export interface ConditionalThen<TData, TFieldType> {
|
|
414
|
+
/**
|
|
415
|
+
* Specify the value when condition is true
|
|
416
|
+
*/
|
|
417
|
+
then<TThenType>(
|
|
418
|
+
value: TThenType
|
|
419
|
+
): ConditionalElse<TData, TFieldType, TThenType>;
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* Specify a constant value when condition is true
|
|
423
|
+
*/
|
|
424
|
+
thenConstant<TConstant extends string>(
|
|
425
|
+
value: TConstant
|
|
426
|
+
): ConditionalElse<TData, TFieldType, TConstant>;
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* Specify an array when condition is true
|
|
430
|
+
*/
|
|
431
|
+
thenArray<TArrayType>(
|
|
432
|
+
value: TArrayType[]
|
|
433
|
+
): ConditionalElse<TData, TFieldType, TArrayType[]>;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
// Else clause builder
|
|
437
|
+
export interface ConditionalElse<TData, _TFieldType, TThenType> {
|
|
438
|
+
/**
|
|
439
|
+
* Specify the value when condition is false
|
|
440
|
+
*/
|
|
441
|
+
else<TElseType>(value: TElseType): ConditionalResult<TThenType | TElseType>;
|
|
442
|
+
|
|
443
|
+
/**
|
|
444
|
+
* Specify a constant value when condition is false
|
|
445
|
+
*/
|
|
446
|
+
elseConstant<TConstant extends string>(
|
|
447
|
+
value: TConstant
|
|
448
|
+
): ConditionalResult<TThenType | TConstant>;
|
|
449
|
+
|
|
450
|
+
/**
|
|
451
|
+
* Specify an array when condition is false
|
|
452
|
+
*/
|
|
453
|
+
elseArray<TArrayType>(
|
|
454
|
+
value: TArrayType[]
|
|
455
|
+
): ConditionalResult<TThenType | TArrayType[]>;
|
|
456
|
+
|
|
457
|
+
/**
|
|
458
|
+
* Nested conditional for else clause
|
|
459
|
+
*/
|
|
460
|
+
elseWhen<TField extends keyof TData>(
|
|
461
|
+
field: TField
|
|
462
|
+
): ConditionalBuilder<TData, TData[TField]>;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
// Final conditional result
|
|
466
|
+
export interface ConditionalResult<TResultType> {
|
|
467
|
+
/**
|
|
468
|
+
* Get the conditional expression string
|
|
469
|
+
*/
|
|
470
|
+
toString(): string;
|
|
471
|
+
|
|
472
|
+
/**
|
|
473
|
+
* Get the inferred result type
|
|
474
|
+
*/
|
|
475
|
+
getType(): TResultType;
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* Validate the conditional against data
|
|
479
|
+
*/
|
|
480
|
+
validate(data: any): {
|
|
481
|
+
success: boolean;
|
|
482
|
+
value?: TResultType;
|
|
483
|
+
errors: string[];
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
/**
|
|
488
|
+
* Type inference analyzer for existing conditional expressions
|
|
489
|
+
*/
|
|
490
|
+
export class TypeInferenceAnalyzer {
|
|
491
|
+
/**
|
|
492
|
+
* Analyze a conditional AST and infer types
|
|
493
|
+
*/
|
|
494
|
+
static analyzeConditional(ast: ConditionalNode): TypeInferenceResult {
|
|
495
|
+
const analyzer = new TypeInferenceVisitor();
|
|
496
|
+
return ASTWalker.walk(ast, analyzer);
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
/**
|
|
500
|
+
* Extract field types from conditional expression
|
|
501
|
+
*/
|
|
502
|
+
static extractFieldTypes(ast: ConditionalNode): Record<string, string> {
|
|
503
|
+
const fieldTypes: Record<string, string> = {};
|
|
504
|
+
|
|
505
|
+
const visitor: ASTVisitor<void> = {
|
|
506
|
+
visitConditional: (node) => {
|
|
507
|
+
ASTWalker.walk(node.condition, visitor);
|
|
508
|
+
ASTWalker.walk(node.thenValue, visitor);
|
|
509
|
+
if (node.elseValue) ASTWalker.walk(node.elseValue, visitor);
|
|
510
|
+
},
|
|
511
|
+
|
|
512
|
+
visitLogicalExpression: (node) => {
|
|
513
|
+
ASTWalker.walk(node.left, visitor);
|
|
514
|
+
ASTWalker.walk(node.right, visitor);
|
|
515
|
+
},
|
|
516
|
+
|
|
517
|
+
visitComparison: (node) => {
|
|
518
|
+
const fieldPath = node.left.path.join(".");
|
|
519
|
+
const valueType = this.inferTypeFromComparison(node);
|
|
520
|
+
fieldTypes[fieldPath] = valueType;
|
|
521
|
+
},
|
|
522
|
+
|
|
523
|
+
visitMethodCall: (node) => {
|
|
524
|
+
const fieldPath = node.field.path.join(".");
|
|
525
|
+
const valueType = this.inferTypeFromMethod(node);
|
|
526
|
+
fieldTypes[fieldPath] = valueType;
|
|
527
|
+
},
|
|
528
|
+
|
|
529
|
+
visitFieldAccess: () => {},
|
|
530
|
+
visitLiteral: () => {},
|
|
531
|
+
visitConstant: () => {},
|
|
532
|
+
visitArray: () => {},
|
|
533
|
+
};
|
|
534
|
+
|
|
535
|
+
ASTWalker.walk(ast, visitor);
|
|
536
|
+
return fieldTypes;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
private static inferTypeFromComparison(node: ComparisonNode): string {
|
|
540
|
+
switch (node.operator) {
|
|
541
|
+
case TokenType.GREATER_THAN:
|
|
542
|
+
case TokenType.GREATER_EQUAL:
|
|
543
|
+
case TokenType.LESS_THAN:
|
|
544
|
+
case TokenType.LESS_EQUAL:
|
|
545
|
+
return "number";
|
|
546
|
+
|
|
547
|
+
case TokenType.MATCHES:
|
|
548
|
+
return "string";
|
|
549
|
+
|
|
550
|
+
case TokenType.EQUALS:
|
|
551
|
+
case TokenType.NOT_EQUALS:
|
|
552
|
+
return node.right.dataType;
|
|
553
|
+
|
|
554
|
+
default:
|
|
555
|
+
return "unknown";
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
private static inferTypeFromMethod(node: MethodCallNode): string {
|
|
560
|
+
switch (node.method) {
|
|
561
|
+
case TokenType.IN:
|
|
562
|
+
case TokenType.NOT_IN:
|
|
563
|
+
return node.arguments && node.arguments.length > 0
|
|
564
|
+
? node.arguments[0].dataType
|
|
565
|
+
: "unknown";
|
|
566
|
+
|
|
567
|
+
case TokenType.CONTAINS:
|
|
568
|
+
case TokenType.STARTS_WITH:
|
|
569
|
+
case TokenType.ENDS_WITH:
|
|
570
|
+
return "string | array";
|
|
571
|
+
|
|
572
|
+
case TokenType.BETWEEN:
|
|
573
|
+
return "number";
|
|
574
|
+
|
|
575
|
+
case TokenType.EXISTS:
|
|
576
|
+
case TokenType.NOT_EXISTS:
|
|
577
|
+
return "any";
|
|
578
|
+
|
|
579
|
+
default:
|
|
580
|
+
return "unknown";
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
// Type inference result
|
|
586
|
+
export interface TypeInferenceResult {
|
|
587
|
+
fieldTypes: Record<string, string>;
|
|
588
|
+
returnType: string;
|
|
589
|
+
complexity: number;
|
|
590
|
+
suggestions: string[];
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
// Type inference visitor
|
|
594
|
+
class TypeInferenceVisitor implements ASTVisitor<TypeInferenceResult> {
|
|
595
|
+
visitConditional(node: ConditionalNode): TypeInferenceResult {
|
|
596
|
+
const conditionResult = ASTWalker.walk(node.condition, this);
|
|
597
|
+
const thenResult = ASTWalker.walk(node.thenValue, this);
|
|
598
|
+
const elseResult = node.elseValue
|
|
599
|
+
? ASTWalker.walk(node.elseValue, this)
|
|
600
|
+
: null;
|
|
601
|
+
|
|
602
|
+
return {
|
|
603
|
+
fieldTypes: {
|
|
604
|
+
...conditionResult.fieldTypes,
|
|
605
|
+
...thenResult.fieldTypes,
|
|
606
|
+
...(elseResult?.fieldTypes || {}),
|
|
607
|
+
},
|
|
608
|
+
returnType: this.combineTypes(
|
|
609
|
+
thenResult.returnType,
|
|
610
|
+
elseResult?.returnType || "undefined"
|
|
611
|
+
),
|
|
612
|
+
complexity:
|
|
613
|
+
conditionResult.complexity +
|
|
614
|
+
thenResult.complexity +
|
|
615
|
+
(elseResult?.complexity || 0) +
|
|
616
|
+
1,
|
|
617
|
+
suggestions: [
|
|
618
|
+
...conditionResult.suggestions,
|
|
619
|
+
...thenResult.suggestions,
|
|
620
|
+
...(elseResult?.suggestions || []),
|
|
621
|
+
],
|
|
622
|
+
};
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
visitLogicalExpression(node: any): TypeInferenceResult {
|
|
626
|
+
const leftResult = ASTWalker.walk(node.left, this);
|
|
627
|
+
const rightResult = ASTWalker.walk(node.right, this);
|
|
628
|
+
|
|
629
|
+
return {
|
|
630
|
+
fieldTypes: { ...leftResult.fieldTypes, ...rightResult.fieldTypes },
|
|
631
|
+
returnType: "boolean",
|
|
632
|
+
complexity: leftResult.complexity + rightResult.complexity + 1,
|
|
633
|
+
suggestions: [...leftResult.suggestions, ...rightResult.suggestions],
|
|
634
|
+
};
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
visitComparison(node: any): TypeInferenceResult {
|
|
638
|
+
const fieldPath = node.left.path.join(".");
|
|
639
|
+
// Use public method or implement inline
|
|
640
|
+
const fieldType = this.inferTypeFromComparison(node);
|
|
641
|
+
|
|
642
|
+
return {
|
|
643
|
+
fieldTypes: { [fieldPath]: fieldType },
|
|
644
|
+
returnType: "boolean",
|
|
645
|
+
complexity: 1,
|
|
646
|
+
suggestions: [],
|
|
647
|
+
};
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
visitMethodCall(node: any): TypeInferenceResult {
|
|
651
|
+
const fieldPath = node.field.path.join(".");
|
|
652
|
+
// Use public method or implement inline
|
|
653
|
+
const fieldType = this.inferTypeFromMethod(node);
|
|
654
|
+
|
|
655
|
+
return {
|
|
656
|
+
fieldTypes: { [fieldPath]: fieldType },
|
|
657
|
+
returnType: "boolean",
|
|
658
|
+
complexity: 2,
|
|
659
|
+
suggestions: [],
|
|
660
|
+
};
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
private inferTypeFromComparison(node: any): string {
|
|
664
|
+
// Simple type inference based on comparison
|
|
665
|
+
if (node.right && node.right.dataType) {
|
|
666
|
+
return node.right.dataType;
|
|
667
|
+
}
|
|
668
|
+
return "unknown";
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
private inferTypeFromMethod(node: any): string {
|
|
672
|
+
// Simple type inference based on method
|
|
673
|
+
switch (node.method) {
|
|
674
|
+
case "in":
|
|
675
|
+
case "not_in":
|
|
676
|
+
return node.arguments && node.arguments.length > 0
|
|
677
|
+
? node.arguments[0].dataType
|
|
678
|
+
: "unknown";
|
|
679
|
+
case "contains":
|
|
680
|
+
case "starts_with":
|
|
681
|
+
case "ends_with":
|
|
682
|
+
return "string | array";
|
|
683
|
+
case "between":
|
|
684
|
+
return "number";
|
|
685
|
+
case "exists":
|
|
686
|
+
case "not_exists":
|
|
687
|
+
return "any";
|
|
688
|
+
default:
|
|
689
|
+
return "unknown";
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
visitFieldAccess(): TypeInferenceResult {
|
|
694
|
+
return {
|
|
695
|
+
fieldTypes: {},
|
|
696
|
+
returnType: "unknown",
|
|
697
|
+
complexity: 0,
|
|
698
|
+
suggestions: [],
|
|
699
|
+
};
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
visitLiteral(node: any): TypeInferenceResult {
|
|
703
|
+
return {
|
|
704
|
+
fieldTypes: {},
|
|
705
|
+
returnType: node.dataType,
|
|
706
|
+
complexity: 0,
|
|
707
|
+
suggestions: [],
|
|
708
|
+
};
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
visitConstant(_node: any): TypeInferenceResult {
|
|
712
|
+
return {
|
|
713
|
+
fieldTypes: {},
|
|
714
|
+
returnType: "string",
|
|
715
|
+
complexity: 0,
|
|
716
|
+
suggestions: [],
|
|
717
|
+
};
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
visitArray(node: any): TypeInferenceResult {
|
|
721
|
+
const elementType =
|
|
722
|
+
node.elements.length > 0 ? node.elements[0].dataType : "unknown";
|
|
723
|
+
return {
|
|
724
|
+
fieldTypes: {},
|
|
725
|
+
returnType: `${elementType}[]`,
|
|
726
|
+
complexity: 0,
|
|
727
|
+
suggestions: [],
|
|
728
|
+
};
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
private combineTypes(type1: string, type2: string): string {
|
|
732
|
+
if (type1 === type2) return type1;
|
|
733
|
+
if (type1 === "undefined") return type2;
|
|
734
|
+
if (type2 === "undefined") return type1;
|
|
735
|
+
return `${type1} | ${type2}`;
|
|
736
|
+
}
|
|
737
|
+
}
|