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,681 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Conditional Types and Operators System
|
|
3
|
+
*
|
|
4
|
+
* A robust, maintainable, and extensible TypeScript conditional types system
|
|
5
|
+
* with improved error handling, better organization, and type safety.
|
|
6
|
+
*/
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// OPERATOR SYSTEM - with validation and metadata
|
|
9
|
+
// ============================================================================
|
|
10
|
+
/**
|
|
11
|
+
* Comprehensive operator definitions with strict typing
|
|
12
|
+
*/
|
|
13
|
+
var Operators;
|
|
14
|
+
(function (Operators) {
|
|
15
|
+
// Comprehensive operator configuration
|
|
16
|
+
Operators.OPERATOR_CONFIG = {
|
|
17
|
+
// Existence operators (highest precedence)
|
|
18
|
+
"!exists": {
|
|
19
|
+
precedence: 100,
|
|
20
|
+
requiresValue: false,
|
|
21
|
+
typeSupport: ["string", "number", "boolean", "array", "object", "date"],
|
|
22
|
+
description: "Field does not exist or is undefined",
|
|
23
|
+
examples: ["name!exists", "user.email!exists"],
|
|
24
|
+
},
|
|
25
|
+
exists: {
|
|
26
|
+
precedence: 99,
|
|
27
|
+
requiresValue: false,
|
|
28
|
+
typeSupport: ["string", "number", "boolean", "array", "object", "date"],
|
|
29
|
+
description: "Field exists and is not undefined",
|
|
30
|
+
examples: ["name exists", "user.email exists"],
|
|
31
|
+
},
|
|
32
|
+
// State operators
|
|
33
|
+
"!empty": {
|
|
34
|
+
precedence: 98,
|
|
35
|
+
requiresValue: false,
|
|
36
|
+
typeSupport: ["string", "array", "object"],
|
|
37
|
+
description: "Field is not empty (non-zero length)",
|
|
38
|
+
examples: ["name!empty", "items!empty"],
|
|
39
|
+
},
|
|
40
|
+
empty: {
|
|
41
|
+
precedence: 97,
|
|
42
|
+
requiresValue: false,
|
|
43
|
+
typeSupport: ["string", "array", "object"],
|
|
44
|
+
description: "Field is empty (zero length)",
|
|
45
|
+
examples: ["name empty", "items empty"],
|
|
46
|
+
},
|
|
47
|
+
"!null": {
|
|
48
|
+
precedence: 96,
|
|
49
|
+
requiresValue: false,
|
|
50
|
+
typeSupport: ["string", "number", "boolean", "array", "object", "date"],
|
|
51
|
+
description: "Field is not null",
|
|
52
|
+
examples: ["value!null", "user.id!null"],
|
|
53
|
+
},
|
|
54
|
+
null: {
|
|
55
|
+
precedence: 95,
|
|
56
|
+
requiresValue: false,
|
|
57
|
+
typeSupport: ["string", "number", "boolean", "array", "object", "date"],
|
|
58
|
+
description: "Field is null",
|
|
59
|
+
examples: ["value null", "user.id null"],
|
|
60
|
+
},
|
|
61
|
+
// Inclusion operators
|
|
62
|
+
"!in": {
|
|
63
|
+
precedence: 94,
|
|
64
|
+
requiresValue: true,
|
|
65
|
+
typeSupport: ["string", "number", "boolean"],
|
|
66
|
+
description: "Field value is not in the provided list",
|
|
67
|
+
examples: ["status!in(active,pending)", "priority!in(1,2,3)"],
|
|
68
|
+
},
|
|
69
|
+
in: {
|
|
70
|
+
precedence: 93,
|
|
71
|
+
requiresValue: true,
|
|
72
|
+
typeSupport: ["string", "number", "boolean"],
|
|
73
|
+
description: "Field value is in the provided list",
|
|
74
|
+
examples: ["status in(active,pending)", "priority in(1,2,3)"],
|
|
75
|
+
},
|
|
76
|
+
// Regex operators
|
|
77
|
+
"!~": {
|
|
78
|
+
precedence: 92,
|
|
79
|
+
requiresValue: true,
|
|
80
|
+
typeSupport: ["string"],
|
|
81
|
+
description: "Field value does not match the regex pattern",
|
|
82
|
+
examples: ["email!~^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"],
|
|
83
|
+
},
|
|
84
|
+
"~": {
|
|
85
|
+
precedence: 91,
|
|
86
|
+
requiresValue: true,
|
|
87
|
+
typeSupport: ["string"],
|
|
88
|
+
description: "Field value matches the regex pattern",
|
|
89
|
+
examples: ["email~^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"],
|
|
90
|
+
},
|
|
91
|
+
// String operators
|
|
92
|
+
"!contains": {
|
|
93
|
+
precedence: 90,
|
|
94
|
+
requiresValue: true,
|
|
95
|
+
typeSupport: ["string"],
|
|
96
|
+
description: "Field value does not contain the substring",
|
|
97
|
+
examples: ["name!contains John", "description!contains urgent"],
|
|
98
|
+
},
|
|
99
|
+
contains: {
|
|
100
|
+
precedence: 89,
|
|
101
|
+
requiresValue: true,
|
|
102
|
+
typeSupport: ["string"],
|
|
103
|
+
description: "Field value contains the substring",
|
|
104
|
+
examples: ["name contains John", "description contains urgent"],
|
|
105
|
+
},
|
|
106
|
+
endsWith: {
|
|
107
|
+
precedence: 88,
|
|
108
|
+
requiresValue: true,
|
|
109
|
+
typeSupport: ["string"],
|
|
110
|
+
description: "Field value ends with the substring",
|
|
111
|
+
examples: ["filename endsWith .pdf", "email endsWith @company.com"],
|
|
112
|
+
},
|
|
113
|
+
startsWith: {
|
|
114
|
+
precedence: 87,
|
|
115
|
+
requiresValue: true,
|
|
116
|
+
typeSupport: ["string"],
|
|
117
|
+
description: "Field value starts with the substring",
|
|
118
|
+
examples: ["name startsWith Mr.", "path startsWith /api/"],
|
|
119
|
+
},
|
|
120
|
+
// Comparison operators (lowest precedence)
|
|
121
|
+
"!=": {
|
|
122
|
+
precedence: 86,
|
|
123
|
+
requiresValue: true,
|
|
124
|
+
typeSupport: ["string", "number", "boolean", "date"],
|
|
125
|
+
description: "Field value is not equal to the provided value",
|
|
126
|
+
examples: ["status!=active", "count!=0", "isEnabled!=true"],
|
|
127
|
+
},
|
|
128
|
+
">=": {
|
|
129
|
+
precedence: 85,
|
|
130
|
+
requiresValue: true,
|
|
131
|
+
typeSupport: ["number", "date"],
|
|
132
|
+
description: "Field value is greater than or equal to the provided value",
|
|
133
|
+
examples: ["age>=18", "score>=80"],
|
|
134
|
+
},
|
|
135
|
+
"<=": {
|
|
136
|
+
precedence: 84,
|
|
137
|
+
requiresValue: true,
|
|
138
|
+
typeSupport: ["number", "date"],
|
|
139
|
+
description: "Field value is less than or equal to the provided value",
|
|
140
|
+
examples: ["age<=65", "score<=100"],
|
|
141
|
+
},
|
|
142
|
+
">": {
|
|
143
|
+
precedence: 83,
|
|
144
|
+
requiresValue: true,
|
|
145
|
+
typeSupport: ["number", "date"],
|
|
146
|
+
description: "Field value is greater than the provided value",
|
|
147
|
+
examples: ["age>18", "score>80"],
|
|
148
|
+
},
|
|
149
|
+
"<": {
|
|
150
|
+
precedence: 82,
|
|
151
|
+
requiresValue: true,
|
|
152
|
+
typeSupport: ["number", "date"],
|
|
153
|
+
description: "Field value is less than the provided value",
|
|
154
|
+
examples: ["age<65", "score<100"],
|
|
155
|
+
},
|
|
156
|
+
"=": {
|
|
157
|
+
precedence: 81,
|
|
158
|
+
requiresValue: true,
|
|
159
|
+
typeSupport: ["string", "number", "boolean", "date"],
|
|
160
|
+
description: "Field value is equal to the provided value",
|
|
161
|
+
examples: ["status=active", "count=0", "isEnabled=true"],
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
// Utility functions for operator validation
|
|
165
|
+
function isValidOperator(op) {
|
|
166
|
+
return op in Operators.OPERATOR_CONFIG;
|
|
167
|
+
}
|
|
168
|
+
Operators.isValidOperator = isValidOperator;
|
|
169
|
+
function getOperatorsByPrecedence() {
|
|
170
|
+
return Object.entries(Operators.OPERATOR_CONFIG)
|
|
171
|
+
.sort(([, a], [, b]) => b.precedence - a.precedence)
|
|
172
|
+
.map(([op]) => op);
|
|
173
|
+
}
|
|
174
|
+
Operators.getOperatorsByPrecedence = getOperatorsByPrecedence;
|
|
175
|
+
function validateOperatorForType(operator, type) {
|
|
176
|
+
return Operators.OPERATOR_CONFIG[operator].typeSupport.includes(type);
|
|
177
|
+
}
|
|
178
|
+
Operators.validateOperatorForType = validateOperatorForType;
|
|
179
|
+
})(Operators || (Operators = {}));
|
|
180
|
+
// ============================================================================
|
|
181
|
+
// RUNTIME UTILITIES - Implementation helpers
|
|
182
|
+
// ============================================================================
|
|
183
|
+
/**
|
|
184
|
+
* Runtime utilities for working with conditional expressions
|
|
185
|
+
*/
|
|
186
|
+
var Runtime;
|
|
187
|
+
(function (Runtime) {
|
|
188
|
+
// Runtime condition evaluator
|
|
189
|
+
function evaluateCondition(fieldValue, operator, conditionValue) {
|
|
190
|
+
switch (operator) {
|
|
191
|
+
// Existence operators
|
|
192
|
+
case "exists":
|
|
193
|
+
return fieldValue !== undefined && fieldValue !== null;
|
|
194
|
+
case "!exists":
|
|
195
|
+
return fieldValue === undefined || fieldValue === null;
|
|
196
|
+
// State operators
|
|
197
|
+
case "empty":
|
|
198
|
+
if (typeof fieldValue === "string")
|
|
199
|
+
return fieldValue.length === 0;
|
|
200
|
+
if (Array.isArray(fieldValue))
|
|
201
|
+
return fieldValue.length === 0;
|
|
202
|
+
if (typeof fieldValue === "object" && fieldValue !== null) {
|
|
203
|
+
return Object.keys(fieldValue).length === 0;
|
|
204
|
+
}
|
|
205
|
+
return false;
|
|
206
|
+
case "!empty":
|
|
207
|
+
if (typeof fieldValue === "string")
|
|
208
|
+
return fieldValue.length > 0;
|
|
209
|
+
if (Array.isArray(fieldValue))
|
|
210
|
+
return fieldValue.length > 0;
|
|
211
|
+
if (typeof fieldValue === "object" && fieldValue !== null) {
|
|
212
|
+
return Object.keys(fieldValue).length > 0;
|
|
213
|
+
}
|
|
214
|
+
return true;
|
|
215
|
+
case "null":
|
|
216
|
+
return fieldValue === null;
|
|
217
|
+
case "!null":
|
|
218
|
+
return fieldValue !== null;
|
|
219
|
+
// Comparison operators
|
|
220
|
+
case "=":
|
|
221
|
+
return String(fieldValue) === conditionValue;
|
|
222
|
+
case "!=":
|
|
223
|
+
return String(fieldValue) !== conditionValue;
|
|
224
|
+
case ">":
|
|
225
|
+
return Number(fieldValue) > Number(conditionValue);
|
|
226
|
+
case ">=":
|
|
227
|
+
return Number(fieldValue) >= Number(conditionValue);
|
|
228
|
+
case "<":
|
|
229
|
+
return Number(fieldValue) < Number(conditionValue);
|
|
230
|
+
case "<=":
|
|
231
|
+
return Number(fieldValue) <= Number(conditionValue);
|
|
232
|
+
// String operators
|
|
233
|
+
case "contains":
|
|
234
|
+
return String(fieldValue).includes(conditionValue);
|
|
235
|
+
case "!contains":
|
|
236
|
+
return !String(fieldValue).includes(conditionValue);
|
|
237
|
+
case "startsWith":
|
|
238
|
+
return String(fieldValue).startsWith(conditionValue);
|
|
239
|
+
case "endsWith":
|
|
240
|
+
return String(fieldValue).endsWith(conditionValue);
|
|
241
|
+
// Regex operators
|
|
242
|
+
case "~":
|
|
243
|
+
try {
|
|
244
|
+
return new RegExp(conditionValue).test(String(fieldValue));
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
case "!~":
|
|
250
|
+
try {
|
|
251
|
+
return !new RegExp(conditionValue).test(String(fieldValue));
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
// Inclusion operators
|
|
257
|
+
case "in":
|
|
258
|
+
const inValues = conditionValue.split(",").map((v) => v.trim());
|
|
259
|
+
return inValues.includes(String(fieldValue));
|
|
260
|
+
case "!in":
|
|
261
|
+
const notInValues = conditionValue.split(",").map((v) => v.trim());
|
|
262
|
+
return !notInValues.includes(String(fieldValue));
|
|
263
|
+
default:
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
Runtime.evaluateCondition = evaluateCondition;
|
|
268
|
+
// Runtime field value extraction with path support
|
|
269
|
+
function getFieldValue(data, path) {
|
|
270
|
+
if (!path || typeof data !== "object" || data === null) {
|
|
271
|
+
return undefined;
|
|
272
|
+
}
|
|
273
|
+
const keys = path.split(".");
|
|
274
|
+
let current = data;
|
|
275
|
+
for (const key of keys) {
|
|
276
|
+
if (current === null || current === undefined) {
|
|
277
|
+
return undefined;
|
|
278
|
+
}
|
|
279
|
+
// Handle array indices
|
|
280
|
+
if (/^\d+$/.test(key)) {
|
|
281
|
+
const index = parseInt(key, 10);
|
|
282
|
+
if (Array.isArray(current) && index >= 0 && index < current.length) {
|
|
283
|
+
current = current[index];
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
return undefined;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
current = current[key];
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return current;
|
|
294
|
+
}
|
|
295
|
+
Runtime.getFieldValue = getFieldValue;
|
|
296
|
+
// Runtime conditional expression parser
|
|
297
|
+
function parseCondition(conditionStr) {
|
|
298
|
+
const trimmed = conditionStr.trim();
|
|
299
|
+
// Try operators in precedence order
|
|
300
|
+
for (const operator of Operators.getOperatorsByPrecedence()) {
|
|
301
|
+
const config = Operators.OPERATOR_CONFIG[operator];
|
|
302
|
+
if (!config.requiresValue) {
|
|
303
|
+
// For operators that don't require a value (exists, empty, null)
|
|
304
|
+
if (trimmed.endsWith(operator)) {
|
|
305
|
+
const field = trimmed.slice(0, -operator.length);
|
|
306
|
+
return { field, operator, value: "" };
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
// For operators that require a value
|
|
311
|
+
const operatorIndex = trimmed.indexOf(operator);
|
|
312
|
+
if (operatorIndex > 0) {
|
|
313
|
+
const field = trimmed.slice(0, operatorIndex);
|
|
314
|
+
const value = trimmed.slice(operatorIndex + operator.length);
|
|
315
|
+
return { field, operator, value };
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return null;
|
|
320
|
+
}
|
|
321
|
+
Runtime.parseCondition = parseCondition;
|
|
322
|
+
// Runtime conditional expression evaluator
|
|
323
|
+
function evaluateConditionalExpression(data, expression) {
|
|
324
|
+
// Parse different syntax formats
|
|
325
|
+
let condition, thenValue, elseValue;
|
|
326
|
+
// syntax: when condition *? then : else
|
|
327
|
+
let match = expression.match(/when\s+(.+?)\s*\*\?\s*(.+?)\s*:\s*(.+)/);
|
|
328
|
+
if (match) {
|
|
329
|
+
[, condition, thenValue, elseValue] = match;
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
// Parentheses syntax: when(condition) then(value) else(value)
|
|
333
|
+
match = expression.match(/when\((.+?)\)\s*then\((.+?)\)\s*else\((.+?)\)/);
|
|
334
|
+
if (match) {
|
|
335
|
+
[, condition, thenValue, elseValue] = match;
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
// Legacy syntax: when:condition:then:else
|
|
339
|
+
match = expression.match(/when:(.+?):(.+?):(.+)/);
|
|
340
|
+
if (match) {
|
|
341
|
+
[, condition, thenValue, elseValue] = match;
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
throw new Error(`Invalid conditional expression format: ${expression}`);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
// Parse the condition
|
|
349
|
+
const parsedCondition = parseCondition(condition.trim());
|
|
350
|
+
if (!parsedCondition) {
|
|
351
|
+
throw new Error(`Could not parse condition: ${condition}`);
|
|
352
|
+
}
|
|
353
|
+
// Get field value
|
|
354
|
+
const fieldValue = getFieldValue(data, parsedCondition.field);
|
|
355
|
+
// Evaluate condition
|
|
356
|
+
const conditionResult = evaluateCondition(fieldValue, parsedCondition.operator, parsedCondition.value);
|
|
357
|
+
// Return appropriate value
|
|
358
|
+
return conditionResult
|
|
359
|
+
? parseValue(thenValue.trim())
|
|
360
|
+
: parseValue(elseValue.trim());
|
|
361
|
+
}
|
|
362
|
+
Runtime.evaluateConditionalExpression = evaluateConditionalExpression;
|
|
363
|
+
// Parse value with type coercion
|
|
364
|
+
function parseValue(value) {
|
|
365
|
+
const trimmed = value.trim();
|
|
366
|
+
// Handle quoted strings
|
|
367
|
+
if ((trimmed.startsWith('"') && trimmed.endsWith('"')) ||
|
|
368
|
+
(trimmed.startsWith("'") && trimmed.endsWith("'"))) {
|
|
369
|
+
return trimmed.slice(1, -1);
|
|
370
|
+
}
|
|
371
|
+
// Handle booleans
|
|
372
|
+
if (trimmed === "true")
|
|
373
|
+
return true;
|
|
374
|
+
if (trimmed === "false")
|
|
375
|
+
return false;
|
|
376
|
+
// Handle null/undefined
|
|
377
|
+
if (trimmed === "null")
|
|
378
|
+
return null;
|
|
379
|
+
if (trimmed === "undefined")
|
|
380
|
+
return undefined;
|
|
381
|
+
// Handle numbers
|
|
382
|
+
if (/^-?\d+(\.\d+)?$/.test(trimmed)) {
|
|
383
|
+
return Number(trimmed);
|
|
384
|
+
}
|
|
385
|
+
// Handle arrays (simple comma-separated values)
|
|
386
|
+
if (trimmed.startsWith("[") && trimmed.endsWith("]")) {
|
|
387
|
+
const arrayContent = trimmed.slice(1, -1);
|
|
388
|
+
if (arrayContent.trim() === "")
|
|
389
|
+
return [];
|
|
390
|
+
return arrayContent.split(",").map((item) => parseValue(item.trim()));
|
|
391
|
+
}
|
|
392
|
+
// Default to string
|
|
393
|
+
return trimmed;
|
|
394
|
+
}
|
|
395
|
+
// Validation helper
|
|
396
|
+
function validateConditionSyntax(condition) {
|
|
397
|
+
const errors = [];
|
|
398
|
+
const warnings = [];
|
|
399
|
+
try {
|
|
400
|
+
const parsed = parseCondition(condition);
|
|
401
|
+
if (!parsed) {
|
|
402
|
+
errors.push("Could not parse condition syntax");
|
|
403
|
+
return { isValid: false, errors, warnings };
|
|
404
|
+
}
|
|
405
|
+
// Validate operator
|
|
406
|
+
if (!Operators.isValidOperator(parsed.operator)) {
|
|
407
|
+
errors.push(`Unknown operator: ${parsed.operator}`);
|
|
408
|
+
}
|
|
409
|
+
// Validate value requirement
|
|
410
|
+
const config = Operators.OPERATOR_CONFIG[parsed.operator];
|
|
411
|
+
if (config.requiresValue && !parsed.value) {
|
|
412
|
+
errors.push(`Operator '${parsed.operator}' requires a value`);
|
|
413
|
+
}
|
|
414
|
+
// Check for common mistakes
|
|
415
|
+
if (parsed.field.includes(" ")) {
|
|
416
|
+
warnings.push("Field names with spaces may cause issues");
|
|
417
|
+
}
|
|
418
|
+
if (parsed.operator === "~" || parsed.operator === "!~") {
|
|
419
|
+
try {
|
|
420
|
+
new RegExp(parsed.value);
|
|
421
|
+
}
|
|
422
|
+
catch {
|
|
423
|
+
errors.push("Invalid regex pattern");
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
catch (error) {
|
|
428
|
+
errors.push(`Validation error: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
429
|
+
}
|
|
430
|
+
return {
|
|
431
|
+
isValid: errors.length === 0,
|
|
432
|
+
errors,
|
|
433
|
+
warnings,
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
Runtime.validateConditionSyntax = validateConditionSyntax;
|
|
437
|
+
})(Runtime || (Runtime = {}));
|
|
438
|
+
// ============================================================================
|
|
439
|
+
// FACTORY FUNCTIONS - Convenient creation helpers
|
|
440
|
+
// ============================================================================
|
|
441
|
+
/**
|
|
442
|
+
* Factory functions for creating conditional expressions
|
|
443
|
+
*/
|
|
444
|
+
var Factory;
|
|
445
|
+
(function (Factory) {
|
|
446
|
+
function createConditionalBuilder() {
|
|
447
|
+
return {
|
|
448
|
+
when(field) {
|
|
449
|
+
return createFieldBuilder(field);
|
|
450
|
+
},
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
Factory.createConditionalBuilder = createConditionalBuilder;
|
|
454
|
+
function createFieldBuilder(field) {
|
|
455
|
+
return {
|
|
456
|
+
equals: (value) => createThenBuilder(field, "=", value),
|
|
457
|
+
notEquals: (value) => createThenBuilder(field, "!=", value),
|
|
458
|
+
greaterThan: (value) => createThenBuilder(field, ">", value),
|
|
459
|
+
greaterEqual: (value) => createThenBuilder(field, ">=", value),
|
|
460
|
+
lessThan: (value) => createThenBuilder(field, "<", value),
|
|
461
|
+
lessEqual: (value) => createThenBuilder(field, "<=", value),
|
|
462
|
+
matches: (pattern) => createThenBuilder(field, "~", pattern),
|
|
463
|
+
contains: (value) => createThenBuilder(field, "contains", value),
|
|
464
|
+
startsWith: (value) => createThenBuilder(field, "startsWith", value),
|
|
465
|
+
endsWith: (value) => createThenBuilder(field, "endsWith", value),
|
|
466
|
+
in: (...values) => createThenBuilder(field, "in", values.join(",")),
|
|
467
|
+
notIn: (...values) => createThenBuilder(field, "!in", values.join(",")),
|
|
468
|
+
exists: () => createThenBuilder(field, "exists", undefined),
|
|
469
|
+
notExists: () => createThenBuilder(field, "!exists", undefined),
|
|
470
|
+
empty: () => createThenBuilder(field, "empty", undefined),
|
|
471
|
+
notEmpty: () => createThenBuilder(field, "!empty", undefined),
|
|
472
|
+
isNull: () => createThenBuilder(field, "null", undefined),
|
|
473
|
+
notNull: () => createThenBuilder(field, "!null", undefined),
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
function createThenBuilder(field, operator, value) {
|
|
477
|
+
return {
|
|
478
|
+
then: (thenValue) => createElseBuilder(field, operator, value, thenValue),
|
|
479
|
+
thenType: (type) => createElseBuilder(field, operator, value, type),
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
function createElseBuilder(field, operator, value, thenType) {
|
|
483
|
+
return {
|
|
484
|
+
else: (elseValue) => createConditionalExpression(field, operator, value, thenType, elseValue),
|
|
485
|
+
elseType: (type) => createConditionalExpression(field, operator, value, thenType, type),
|
|
486
|
+
elseWhen: (field2) => createFieldBuilder(field2),
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
function createConditionalExpression(field, operator, value, thenType, elseType) {
|
|
490
|
+
const valueStr = value === undefined ? "" : String(value);
|
|
491
|
+
const condition = `${field}${operator}${valueStr}`;
|
|
492
|
+
const expression = `when ${condition} *? ${thenType} : ${elseType}`;
|
|
493
|
+
return {
|
|
494
|
+
expression,
|
|
495
|
+
resultType: (thenType || elseType),
|
|
496
|
+
metadata: {
|
|
497
|
+
field,
|
|
498
|
+
operator,
|
|
499
|
+
value,
|
|
500
|
+
validation: Runtime.validateConditionSyntax(condition),
|
|
501
|
+
},
|
|
502
|
+
toString: () => expression,
|
|
503
|
+
validate: () => ({
|
|
504
|
+
isValid: true,
|
|
505
|
+
errors: [],
|
|
506
|
+
warnings: [],
|
|
507
|
+
result: (thenType || elseType),
|
|
508
|
+
}),
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
// Quick creation helpers
|
|
512
|
+
function when() {
|
|
513
|
+
return createConditionalBuilder();
|
|
514
|
+
}
|
|
515
|
+
Factory.when = when;
|
|
516
|
+
function condition(conditionStr) {
|
|
517
|
+
return {
|
|
518
|
+
then: (thenValue) => ({
|
|
519
|
+
else: (elseValue) => `when ${conditionStr} *? ${thenValue} : ${elseValue}`,
|
|
520
|
+
elseType: (elseType) => `when ${conditionStr} *? ${thenValue} : ${elseType}`,
|
|
521
|
+
}),
|
|
522
|
+
thenType: (thenType) => ({
|
|
523
|
+
else: (elseValue) => `when ${conditionStr} *? ${thenType} : ${elseValue}`,
|
|
524
|
+
elseType: (elseType) => `when ${conditionStr} *? ${thenType} : ${elseType}`,
|
|
525
|
+
}),
|
|
526
|
+
};
|
|
527
|
+
}
|
|
528
|
+
Factory.condition = condition;
|
|
529
|
+
})(Factory || (Factory = {}));
|
|
530
|
+
// ============================================================================
|
|
531
|
+
// TESTING UTILITIES - For development and debugging
|
|
532
|
+
// ============================================================================
|
|
533
|
+
/**
|
|
534
|
+
* Testing and debugging utilities
|
|
535
|
+
*/
|
|
536
|
+
var Testing;
|
|
537
|
+
(function (Testing) {
|
|
538
|
+
function runTest(testCase) {
|
|
539
|
+
try {
|
|
540
|
+
const actual = Runtime.evaluateConditionalExpression(testCase.data, testCase.expression);
|
|
541
|
+
const passed = JSON.stringify(actual) === JSON.stringify(testCase.expected);
|
|
542
|
+
return {
|
|
543
|
+
passed,
|
|
544
|
+
actual,
|
|
545
|
+
expected: testCase.expected,
|
|
546
|
+
};
|
|
547
|
+
}
|
|
548
|
+
catch (error) {
|
|
549
|
+
return {
|
|
550
|
+
passed: false,
|
|
551
|
+
actual: undefined,
|
|
552
|
+
expected: testCase.expected,
|
|
553
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
554
|
+
};
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
Testing.runTest = runTest;
|
|
558
|
+
function runTestSuite(testCases) {
|
|
559
|
+
const results = testCases.map((testCase) => ({
|
|
560
|
+
testCase,
|
|
561
|
+
result: runTest(testCase),
|
|
562
|
+
}));
|
|
563
|
+
const passed = results.filter((r) => r.result.passed).length;
|
|
564
|
+
const failed = results.length - passed;
|
|
565
|
+
return { passed, failed, results };
|
|
566
|
+
}
|
|
567
|
+
Testing.runTestSuite = runTestSuite;
|
|
568
|
+
// Example test cases
|
|
569
|
+
Testing.EXAMPLE_TESTS = [
|
|
570
|
+
{
|
|
571
|
+
name: "Simple equality",
|
|
572
|
+
data: { status: "active" },
|
|
573
|
+
expression: "when status=active *? enabled : disabled",
|
|
574
|
+
expected: "enabled",
|
|
575
|
+
},
|
|
576
|
+
{
|
|
577
|
+
name: "Numeric comparison",
|
|
578
|
+
data: { age: 25 },
|
|
579
|
+
expression: "when age>=18 *? adult : minor",
|
|
580
|
+
expected: "adult",
|
|
581
|
+
},
|
|
582
|
+
{
|
|
583
|
+
name: "String contains",
|
|
584
|
+
data: { email: "user@example.com" },
|
|
585
|
+
expression: "when email contains @ *? valid : invalid",
|
|
586
|
+
expected: "valid",
|
|
587
|
+
},
|
|
588
|
+
{
|
|
589
|
+
name: "Existence check",
|
|
590
|
+
data: { name: "John" },
|
|
591
|
+
expression: "when name exists *? present : missing",
|
|
592
|
+
expected: "present",
|
|
593
|
+
},
|
|
594
|
+
{
|
|
595
|
+
name: "Array inclusion",
|
|
596
|
+
data: { role: "admin" },
|
|
597
|
+
expression: "when role in(admin,moderator) *? authorized : unauthorized",
|
|
598
|
+
expected: "authorized",
|
|
599
|
+
},
|
|
600
|
+
];
|
|
601
|
+
})(Testing || (Testing = {}));
|
|
602
|
+
// ============================================================================
|
|
603
|
+
// DOCUMENTATION HELPERS - Auto-generated docs
|
|
604
|
+
// ============================================================================
|
|
605
|
+
/**
|
|
606
|
+
* Documentation generation utilities
|
|
607
|
+
*/
|
|
608
|
+
var Documentation;
|
|
609
|
+
(function (Documentation) {
|
|
610
|
+
function generateOperatorDocs() {
|
|
611
|
+
let docs = "# Conditional Operators Reference\n\n";
|
|
612
|
+
const groupedOps = {
|
|
613
|
+
"Existence Operators": ["exists", "!exists"],
|
|
614
|
+
"State Operators": ["empty", "!empty", "null", "!null"],
|
|
615
|
+
"Inclusion Operators": ["in", "!in"],
|
|
616
|
+
"String Operators": [
|
|
617
|
+
"contains",
|
|
618
|
+
"!contains",
|
|
619
|
+
"startsWith",
|
|
620
|
+
"endsWith",
|
|
621
|
+
],
|
|
622
|
+
"Regex Operators": ["~", "!~"],
|
|
623
|
+
"Comparison Operators": ["=", "!=", ">", ">=", "<", "<="],
|
|
624
|
+
};
|
|
625
|
+
Object.entries(groupedOps).forEach(([group, operators]) => {
|
|
626
|
+
docs += `## ${group}\n\n`;
|
|
627
|
+
operators.forEach((op) => {
|
|
628
|
+
const config = Operators.OPERATOR_CONFIG[op];
|
|
629
|
+
docs += `### \`${op}\`\n`;
|
|
630
|
+
docs += `${config.description}\n\n`;
|
|
631
|
+
docs += `**Type Support:** ${config.typeSupport.join(", ")}\n`;
|
|
632
|
+
docs += `**Requires Value:** ${config.requiresValue ? "Yes" : "No"}\n`;
|
|
633
|
+
docs += `**Examples:**\n`;
|
|
634
|
+
config.examples.forEach((example) => {
|
|
635
|
+
docs += `- \`${example}\`\n`;
|
|
636
|
+
});
|
|
637
|
+
docs += "\n";
|
|
638
|
+
});
|
|
639
|
+
});
|
|
640
|
+
return docs;
|
|
641
|
+
}
|
|
642
|
+
Documentation.generateOperatorDocs = generateOperatorDocs;
|
|
643
|
+
function generateSyntaxDocs() {
|
|
644
|
+
return `# Conditional Syntax Reference
|
|
645
|
+
|
|
646
|
+
## Syntax (Recommended)
|
|
647
|
+
\`\`\`
|
|
648
|
+
when <condition> *? <then_value> : <else_value>
|
|
649
|
+
\`\`\`
|
|
650
|
+
|
|
651
|
+
Example:
|
|
652
|
+
\`\`\`
|
|
653
|
+
when status=active *? enabled : disabled
|
|
654
|
+
\`\`\`
|
|
655
|
+
|
|
656
|
+
## Parentheses Syntax
|
|
657
|
+
\`\`\`
|
|
658
|
+
when(<condition>) then(<then_value>) else(<else_value>)
|
|
659
|
+
\`\`\`
|
|
660
|
+
|
|
661
|
+
Example:
|
|
662
|
+
\`\`\`
|
|
663
|
+
when(status=active) then(enabled) else(disabled)
|
|
664
|
+
\`\`\`
|
|
665
|
+
|
|
666
|
+
## Legacy Syntax
|
|
667
|
+
\`\`\`
|
|
668
|
+
when:<condition>:<then_value>:<else_value>
|
|
669
|
+
\`\`\`
|
|
670
|
+
|
|
671
|
+
Example:
|
|
672
|
+
\`\`\`
|
|
673
|
+
when:status=active:enabled:disabled
|
|
674
|
+
\`\`\`
|
|
675
|
+
`;
|
|
676
|
+
}
|
|
677
|
+
Documentation.generateSyntaxDocs = generateSyntaxDocs;
|
|
678
|
+
})(Documentation || (Documentation = {}));
|
|
679
|
+
|
|
680
|
+
export { Documentation, Factory, Operators, Runtime, Testing };
|
|
681
|
+
//# sourceMappingURL=ConditionalTypes.js.map
|