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,637 @@
|
|
|
1
|
+
# Conditional Validation Guide
|
|
2
|
+
|
|
3
|
+
Complete guide to ReliantType's conditional validation - from basic V1 syntax to advanced V2 runtime methods.
|
|
4
|
+
|
|
5
|
+
## 📚 Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Introduction](#introduction)
|
|
8
|
+
- [V1 Conditional Validation (Legacy)](#v1-conditional-validation-legacy)
|
|
9
|
+
- [V2 Conditional Validation (Current)](#v2-conditional-validation-current)
|
|
10
|
+
- [V2 Runtime Methods](#v2-runtime-methods)
|
|
11
|
+
- [Advanced Patterns](#advanced-patterns)
|
|
12
|
+
- [Migration from V1 to V2](#migration-from-v1-to-v2)
|
|
13
|
+
- [Best Practices](#best-practices)
|
|
14
|
+
|
|
15
|
+
## Introduction
|
|
16
|
+
|
|
17
|
+
Conditional validation allows you to create dynamic validation rules based on the values of other fields or runtime properties. ReliantType supports both V1 (legacy) and V2 (current) conditional validation syntax.
|
|
18
|
+
|
|
19
|
+
### Basic Concept
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
const Schema = Interface({
|
|
23
|
+
role: "admin|user|guest",
|
|
24
|
+
|
|
25
|
+
// Conditional validation: "when condition *? then : else"
|
|
26
|
+
permissions: "when role=admin *? string[] : string[]?",
|
|
27
|
+
// ^^^^ ^^ ^
|
|
28
|
+
// keyword operator separator
|
|
29
|
+
});
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## V1 Conditional Validation (Legacy)
|
|
33
|
+
|
|
34
|
+
V1 syntax is still supported for backward compatibility but V2 is recommended for new projects. But the same logic can be applied to V2, only the methods call syntax are different.
|
|
35
|
+
|
|
36
|
+
### Basic V1 Syntax
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
const V1Schema = Interface({
|
|
40
|
+
role: "admin|user|guest",
|
|
41
|
+
accountType: "free|premium|enterprise",
|
|
42
|
+
age: "number(13,120)",
|
|
43
|
+
|
|
44
|
+
// Basic equality
|
|
45
|
+
adminAccess: "when role=admin *? string[] : string[]?",
|
|
46
|
+
|
|
47
|
+
// Inequality
|
|
48
|
+
nonGuestAccess: "when role!=guest *? boolean : boolean?",
|
|
49
|
+
|
|
50
|
+
// Numeric comparisons
|
|
51
|
+
adultContent: "when age>=18 *? boolean : boolean?",
|
|
52
|
+
seniorDiscount: "when age>65 *? number(0,50) : number(0,0)",
|
|
53
|
+
youthProgram: "when age<25 *? boolean : boolean?",
|
|
54
|
+
|
|
55
|
+
// Value inclusion
|
|
56
|
+
premiumFeatures:
|
|
57
|
+
"when accountType.$in(premium,enterprise) *? string[] : string[]?",
|
|
58
|
+
});
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### V1 Operators
|
|
62
|
+
|
|
63
|
+
| Operator | Description | Example |
|
|
64
|
+
| -------- | --------------------- | ------------------------------- |
|
|
65
|
+
| `=` | Equals | `when role=admin` |
|
|
66
|
+
| `!=` | Not equals | `when role!=guest` |
|
|
67
|
+
| `>` | Greater than | `when age>18` |
|
|
68
|
+
| `>=` | Greater than or equal | `when age>=21` |
|
|
69
|
+
| `<` | Less than | `when age<65` |
|
|
70
|
+
| `<=` | Less than or equal | `when age<=25` |
|
|
71
|
+
| `.in()` | Value in list | `when role.in(admin,moderator)` |
|
|
72
|
+
|
|
73
|
+
### V1 Limitations
|
|
74
|
+
|
|
75
|
+
- Will be deprecated in future versions
|
|
76
|
+
- Limited to simple property comparisons
|
|
77
|
+
- No runtime property existence checking
|
|
78
|
+
- No complex method calls
|
|
79
|
+
- Limited string operations
|
|
80
|
+
|
|
81
|
+
## V2 Conditional Validation (Current)
|
|
82
|
+
|
|
83
|
+
V2 introduces powerful runtime property checking with the new `property.$method()` syntax.
|
|
84
|
+
|
|
85
|
+
### Basic V2 Syntax
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
const V2Schema = Interface({
|
|
89
|
+
// Runtime data objects
|
|
90
|
+
config: "any?",
|
|
91
|
+
user: "any?",
|
|
92
|
+
features: "any?",
|
|
93
|
+
|
|
94
|
+
// Basic user data
|
|
95
|
+
id: "uuid",
|
|
96
|
+
email: "email",
|
|
97
|
+
role: "admin|user|guest",
|
|
98
|
+
|
|
99
|
+
// V2 Runtime Methods - Enhanced property checking
|
|
100
|
+
hasPermissions: "when config.permissions.$exists() *? boolean : =false",
|
|
101
|
+
hasProfile: "when user.profile.$exists() *? boolean : =false",
|
|
102
|
+
isListEmpty: "when config.items.$empty() *? boolean : =true",
|
|
103
|
+
hasAdminRole: "when user.roles.$contains(admin) *? boolean : =false",
|
|
104
|
+
});
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### V2 Advantages
|
|
108
|
+
|
|
109
|
+
- **Runtime property checking** - Check if properties exist at runtime
|
|
110
|
+
- **Deep property access** - Navigate nested objects safely
|
|
111
|
+
- **String operations** - Advanced string checking methods
|
|
112
|
+
- **Numeric operations** - Range and value checking
|
|
113
|
+
- **Complex defaults** - Object and array default values
|
|
114
|
+
- **Special character support** - Handle properties with special characters
|
|
115
|
+
|
|
116
|
+
## V2 Runtime Methods
|
|
117
|
+
|
|
118
|
+
### Property Existence Methods
|
|
119
|
+
|
|
120
|
+
#### `$exists()` - Check Property Existence
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
const ExistsSchema = Interface({
|
|
124
|
+
config: "any?",
|
|
125
|
+
user: "any?",
|
|
126
|
+
|
|
127
|
+
// Basic existence checking
|
|
128
|
+
hasConfig: "when config.$exists() *? boolean : =false",
|
|
129
|
+
hasUserProfile: "when user.profile.$exists() *? boolean : =false",
|
|
130
|
+
|
|
131
|
+
// Deep nested checking
|
|
132
|
+
hasAdvancedSettings:
|
|
133
|
+
"when user.profile.settings.advanced.$exists() *? boolean : =false",
|
|
134
|
+
|
|
135
|
+
// Special characters
|
|
136
|
+
hasSpecialFeature:
|
|
137
|
+
'when config["admin-override"].$exists() *? boolean : =false',
|
|
138
|
+
|
|
139
|
+
// Unicode support
|
|
140
|
+
hasUnicodeFeature: "when features.feature_🚀.$exists() *? boolean : =false",
|
|
141
|
+
});
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Empty/Null Checking Methods
|
|
145
|
+
|
|
146
|
+
#### `$empty()` - Check if Empty
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
const EmptySchema = Interface({
|
|
150
|
+
data: "any?",
|
|
151
|
+
|
|
152
|
+
// String empty checking
|
|
153
|
+
hasContent: "when data.description.$empty() *? =no_content : =has_content",
|
|
154
|
+
|
|
155
|
+
// Array empty checking
|
|
156
|
+
hasItems: "when data.items.$empty() *? =no_items : =has_items",
|
|
157
|
+
|
|
158
|
+
// Object empty checking
|
|
159
|
+
hasMetadata: "when data.metadata.$empty() *? =no_metadata : =has_metadata",
|
|
160
|
+
});
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
#### `$null()` - Check if Null
|
|
164
|
+
|
|
165
|
+
```typescript
|
|
166
|
+
const NullSchema = Interface({
|
|
167
|
+
data: "any?",
|
|
168
|
+
|
|
169
|
+
// Null checking
|
|
170
|
+
isDataNull: "when data.value.$null() *? =is_null : =not_null",
|
|
171
|
+
|
|
172
|
+
// Combined with existence
|
|
173
|
+
hasValidData:
|
|
174
|
+
"when data.value.$exists() && !data.value.$null() *? boolean : =false",
|
|
175
|
+
});
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### String Methods
|
|
179
|
+
|
|
180
|
+
#### `$contains(value)` - Check String Contains
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
const ContainsSchema = Interface({
|
|
184
|
+
data: "any?",
|
|
185
|
+
|
|
186
|
+
// Basic contains
|
|
187
|
+
hasImportantInfo:
|
|
188
|
+
"when data.description.$contains(important) *? boolean : =none",
|
|
189
|
+
|
|
190
|
+
// Multiple contains checks
|
|
191
|
+
hasKeywords:
|
|
192
|
+
"when data.content.$contains(urgent) || data.content.$contains(priority) *? boolean : =no_keywords",
|
|
193
|
+
|
|
194
|
+
// Case-sensitive checking
|
|
195
|
+
hasExactMatch: "when data.title.$contains(URGENT) *? boolean : =no_match",
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
const data = {
|
|
199
|
+
title: "Big title ..... ",
|
|
200
|
+
content: "something more beautifull....urgent",
|
|
201
|
+
description: `Lorem ipsum dolor sit amet consectetur, adipisicing elit. Harum neque
|
|
202
|
+
architecto commodi ipsam excepturi repellat consequatur, provident
|
|
203
|
+
asperiores. Excepturi earum vero amet enim consequatur quasi, fugit
|
|
204
|
+
cupiditate! Corrupti, incidunt exercitationem. something ..... `,
|
|
205
|
+
};
|
|
206
|
+
const result = ContainsSchema.safeParse({
|
|
207
|
+
data,
|
|
208
|
+
hasExactMatch: "no_match",
|
|
209
|
+
hasImportantInfo: "none",
|
|
210
|
+
hasKeywords: "no_keywords",
|
|
211
|
+
});
|
|
212
|
+
if (result.success) {
|
|
213
|
+
console.log("✅ Expected success:", result.data);
|
|
214
|
+
} else {
|
|
215
|
+
console.log("❌ Expected errors:", result.errors);
|
|
216
|
+
}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
#### `$startsWith(prefix)` - Check String Prefix
|
|
220
|
+
|
|
221
|
+
```typescript
|
|
222
|
+
const StartsWithSchema = Interface({
|
|
223
|
+
data: "any?",
|
|
224
|
+
|
|
225
|
+
// Prefix checking
|
|
226
|
+
isSystemMessage: "when data.message.$startsWith(SYSTEM:) *? boolean : =false",
|
|
227
|
+
isErrorCode: "when data.code.$startsWith(ERR_) *? boolean : =false",
|
|
228
|
+
|
|
229
|
+
// URL checking
|
|
230
|
+
isSecureUrl: "when data.url.$startsWith(https://) *? boolean : =false",
|
|
231
|
+
});
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
#### `$endsWith(suffix)` - Check String Suffix
|
|
235
|
+
|
|
236
|
+
```typescript
|
|
237
|
+
const EndsWithSchema = Interface({
|
|
238
|
+
data: "any?",
|
|
239
|
+
|
|
240
|
+
// File extension checking
|
|
241
|
+
isPdfFile: "when data.filename.$endsWith(.pdf) *? boolean : =no_pdf_file",
|
|
242
|
+
isImageFile:
|
|
243
|
+
"when data.filename.$endsWith(.jpg) || data.filename.$endsWith(.png) *? boolean : =no_img",
|
|
244
|
+
|
|
245
|
+
// Domain checking
|
|
246
|
+
isCorporateEmail:
|
|
247
|
+
"when data.email.$endsWith(@company.com) *? boolean : =no_itsnot_corporated",
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
const data = {
|
|
251
|
+
filename: "super_file.ehezezpaozdj.pdf", //is pdf
|
|
252
|
+
email: "mail@somethingelse.com", //false so should fail
|
|
253
|
+
};
|
|
254
|
+
const result = EndsWithSchema.safeParse({
|
|
255
|
+
data,
|
|
256
|
+
isPdfFile: true,
|
|
257
|
+
isCorporateEmail: true,
|
|
258
|
+
isImageFile: "no_img",
|
|
259
|
+
});
|
|
260
|
+
if (result.success) {
|
|
261
|
+
console.log("✅ Expected success:", result.data);
|
|
262
|
+
} else {
|
|
263
|
+
console.log("❌ Expected errors:", result.errors);
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### Numeric Methods
|
|
268
|
+
|
|
269
|
+
#### `$between(min,max)` - Check Numeric Range
|
|
270
|
+
|
|
271
|
+
```typescript
|
|
272
|
+
const BetweenSchema = Interface({
|
|
273
|
+
data: "any?",
|
|
274
|
+
|
|
275
|
+
// Age range checking
|
|
276
|
+
isAdult: "when data.age.$between(18,65) *? boolean : =isnt_adult",
|
|
277
|
+
|
|
278
|
+
// Score validation
|
|
279
|
+
isPassingGrade:
|
|
280
|
+
"when data.score.$between(60,100) *? boolean : =itsnt_passgrade",
|
|
281
|
+
|
|
282
|
+
// Price range
|
|
283
|
+
isAffordable: "when data.price.$between(0,100) *? boolean : =yes_itis",
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
const data = {
|
|
287
|
+
age: 17,
|
|
288
|
+
score: 59,
|
|
289
|
+
price: 40,
|
|
290
|
+
};
|
|
291
|
+
const result = BetweenSchema.safeParse({
|
|
292
|
+
data,
|
|
293
|
+
isAdult: true, //should fail because of age >= 18
|
|
294
|
+
isPassingGrade: true, //should also faild
|
|
295
|
+
isAffordable: true,
|
|
296
|
+
});
|
|
297
|
+
if (result.success) {
|
|
298
|
+
console.log("✅ Expected success:", result.data);
|
|
299
|
+
} else {
|
|
300
|
+
console.log("❌ Expected errors:", result.errors);
|
|
301
|
+
}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
#### `$in(val1,val2,...)` - Check Value Inclusion
|
|
305
|
+
|
|
306
|
+
```typescript
|
|
307
|
+
const InSchema = Interface({
|
|
308
|
+
data: "any?",
|
|
309
|
+
|
|
310
|
+
// Role checking
|
|
311
|
+
hasElevatedAccess:
|
|
312
|
+
"when data.role.$in(admin,moderator,super_admin) *? boolean : =not_allowed",
|
|
313
|
+
|
|
314
|
+
// Status checking
|
|
315
|
+
isActiveStatus:
|
|
316
|
+
"when data.status.$in(active,pending,processing) *? boolean : =not_active",
|
|
317
|
+
|
|
318
|
+
// Category checking
|
|
319
|
+
isPremiumCategory:
|
|
320
|
+
"when data.category.$in(premium,enterprise,vip) *? boolean : =itsnot_premium",
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
const data = {
|
|
324
|
+
age: 17,
|
|
325
|
+
role: "admin",
|
|
326
|
+
status: "active",
|
|
327
|
+
category: "premium",
|
|
328
|
+
};
|
|
329
|
+
const result = InSchema.safeParse({
|
|
330
|
+
data,
|
|
331
|
+
hasElevatedAccess: true,
|
|
332
|
+
isActiveStatus: "not_active", //should faild because "status" contains one of the requirements
|
|
333
|
+
isPremiumCategory: "itsnot_premium", // should faild also
|
|
334
|
+
});
|
|
335
|
+
if (result.success) {
|
|
336
|
+
console.log("✅ Expected success:", result.data);
|
|
337
|
+
} else {
|
|
338
|
+
console.log("❌ Expected errors:", result.errors);
|
|
339
|
+
}
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
## Advanced Patterns
|
|
343
|
+
|
|
344
|
+
### Complex Default Values
|
|
345
|
+
|
|
346
|
+
```typescript
|
|
347
|
+
|
|
348
|
+
const ComplexDefaultsSchema = Interface({
|
|
349
|
+
config: "any?",
|
|
350
|
+
|
|
351
|
+
// Object defaults
|
|
352
|
+
// @fortify-ignore
|
|
353
|
+
defaultSettings:
|
|
354
|
+
'when config.settings.$exists() *? any : ={"theme":"dark","lang":"en"}',
|
|
355
|
+
|
|
356
|
+
// Array defaults
|
|
357
|
+
// @fortify-ignore
|
|
358
|
+
defaultTags: 'when config.tags.$exists() *? string[] : =["default","user"]',
|
|
359
|
+
|
|
360
|
+
// Nested object defaults
|
|
361
|
+
defaultProfile:
|
|
362
|
+
'when config.profile.$exists() *? any : ={"name":"Anonymous","avatar":null}',
|
|
363
|
+
|
|
364
|
+
// Complex conditional defaults
|
|
365
|
+
advancedConfig:
|
|
366
|
+
'when config.advanced.$exists() *? any : ={"features":[],"permissions":{}}',
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
const config = {
|
|
370
|
+
// settings: "yes", //not exist
|
|
371
|
+
// advancedConfig: "yes", //not exist
|
|
372
|
+
defaultProfile: "yes",
|
|
373
|
+
defaultTags: "yes"
|
|
374
|
+
};
|
|
375
|
+
const result = ComplexDefaultsSchema.safeParse({
|
|
376
|
+
config,
|
|
377
|
+
defaultSettings: "",
|
|
378
|
+
defaultTags: true,
|
|
379
|
+
defaultProfile: true,
|
|
380
|
+
advancedConfig: ""
|
|
381
|
+
});
|
|
382
|
+
if (result.success) {
|
|
383
|
+
console.log("✅ Expected success:", result.data);
|
|
384
|
+
} else {
|
|
385
|
+
console.log("❌ Expected errors:", result.errors);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
### Method Combinations
|
|
391
|
+
|
|
392
|
+
```typescript
|
|
393
|
+
const CombinedMethodsSchema = Interface({
|
|
394
|
+
user: "any?",
|
|
395
|
+
config: "any?",
|
|
396
|
+
|
|
397
|
+
// Logical AND
|
|
398
|
+
isValidUser:
|
|
399
|
+
"when user.email.$exists() && user.verified.$exists() *? boolean : =false",
|
|
400
|
+
|
|
401
|
+
// Logical OR
|
|
402
|
+
hasContact:
|
|
403
|
+
"when user.email.$exists() || user.phone.$exists() *? boolean : =false",
|
|
404
|
+
|
|
405
|
+
// Complex combinations
|
|
406
|
+
canAccessFeature:
|
|
407
|
+
"when user.role.$in(admin,premium) && config.features.$contains(advanced) *? boolean : =false",
|
|
408
|
+
|
|
409
|
+
// Nested conditions
|
|
410
|
+
accessLevel:
|
|
411
|
+
"when user.role=admin *? when config.superAdmin.$exists() *? =super : =admin : =user",
|
|
412
|
+
});
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
### Deep Property Access
|
|
416
|
+
|
|
417
|
+
```typescript
|
|
418
|
+
const DeepAccessSchema = Interface({
|
|
419
|
+
data: "any?",
|
|
420
|
+
|
|
421
|
+
// Multi-level property access
|
|
422
|
+
hasDeepFeature:
|
|
423
|
+
"when data.user.profile.settings.advanced.features.$exists() *? boolean : =false",
|
|
424
|
+
|
|
425
|
+
// Array property access
|
|
426
|
+
hasFirstItem: "when data.items[0].$exists() *? boolean : =false",
|
|
427
|
+
|
|
428
|
+
// Mixed access patterns
|
|
429
|
+
hasNestedValue:
|
|
430
|
+
"when data.config.nested.deep.value.$exists() *? boolean : =false",
|
|
431
|
+
});
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
### Special Characters and Unicode
|
|
435
|
+
|
|
436
|
+
```typescript
|
|
437
|
+
|
|
438
|
+
const SpecialCharsSchema = Interface({
|
|
439
|
+
config: "any?",
|
|
440
|
+
|
|
441
|
+
// Properties with hyphens
|
|
442
|
+
hasAdminOverride:
|
|
443
|
+
'when config["admin-override"].$exists() *? boolean : =not_allowed',
|
|
444
|
+
|
|
445
|
+
// Properties with spaces
|
|
446
|
+
hasSpecialConfig:
|
|
447
|
+
'when config["special config"].$exists() *? boolean : =no_sp_config',
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
const config = {
|
|
451
|
+
"admin-override": true,
|
|
452
|
+
"special config": true
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
const result = SpecialCharsSchema.safeParse({
|
|
456
|
+
config,
|
|
457
|
+
hasAdminOverride: "not_allowed", // should throw err
|
|
458
|
+
hasSpecialConfig: "no_sp_config", // should also throw err
|
|
459
|
+
});
|
|
460
|
+
if (result.success) {
|
|
461
|
+
console.log("✅ Expected success:", result.data);
|
|
462
|
+
} else {
|
|
463
|
+
console.log("❌ Expected errors:", result.errors);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
## Migration from V1 to V2
|
|
469
|
+
|
|
470
|
+
### Migration Examples
|
|
471
|
+
|
|
472
|
+
#### Basic Property Checking
|
|
473
|
+
|
|
474
|
+
```typescript
|
|
475
|
+
|
|
476
|
+
const Schema1 = Interface({
|
|
477
|
+
role: "admin|user|guest",
|
|
478
|
+
permissions: "when role=admin *? string[] : string[]?",
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
const Schema2 = Interface({
|
|
482
|
+
role: "admin|user|guest",
|
|
483
|
+
config: "any?",
|
|
484
|
+
permissions: "when config.hasPermissions.$exists() *? string[] : =[]",
|
|
485
|
+
});
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
#### Complex Business Logic
|
|
489
|
+
|
|
490
|
+
```typescript
|
|
491
|
+
const V1BusinessSchema = Interface({
|
|
492
|
+
accountType: "free|premium|enterprise",
|
|
493
|
+
userLevel: "basic|advanced|expert",
|
|
494
|
+
|
|
495
|
+
maxProjects: "when accountType=free *? number(1,3) : number(1,100)",
|
|
496
|
+
advancedFeatures:
|
|
497
|
+
"when userLevel.in(advanced,expert) *? string[] : string[]?",
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
const V2BusinessSchema = Interface({
|
|
501
|
+
accountType: "free|premium|enterprise",
|
|
502
|
+
userLevel: "basic|advanced|expert",
|
|
503
|
+
config: "any?",
|
|
504
|
+
features: "any?",
|
|
505
|
+
|
|
506
|
+
maxProjects:
|
|
507
|
+
"when config.account.$in(free,trial) *? number(1,3) : number(1,100)",
|
|
508
|
+
advancedFeatures: "when features.advanced.$exists() *? string[] : =[]",
|
|
509
|
+
|
|
510
|
+
// New capabilities not possible in V1
|
|
511
|
+
dynamicLimits: "when config.limits.$exists() *? any : ={}",
|
|
512
|
+
customFeatures: "when features.custom.$exists() *? string[] : =[]",
|
|
513
|
+
});
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
### Migration Strategy
|
|
517
|
+
|
|
518
|
+
1. **Identify V1 patterns** in your existing schemas
|
|
519
|
+
2. **Add runtime data objects** (`config: "any?"`, `features: "any?"`)
|
|
520
|
+
3. **Replace simple comparisons** with runtime method calls
|
|
521
|
+
4. **Enhance with new capabilities** available in V2
|
|
522
|
+
5. **Test thoroughly** to ensure behavior matches expectations
|
|
523
|
+
|
|
524
|
+
## Best Practices
|
|
525
|
+
|
|
526
|
+
### 1. Use Descriptive Property Names
|
|
527
|
+
|
|
528
|
+
```typescript
|
|
529
|
+
// ✅ Good
|
|
530
|
+
const Schema = Interface({
|
|
531
|
+
config: "any?",
|
|
532
|
+
hasPermissions: "when config.permissions.$exists() *? boolean : =false",
|
|
533
|
+
canEditContent: "when config.editRights.$exists() *? boolean : =false",
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
// ❌ Avoid
|
|
537
|
+
const Schema = Interface({
|
|
538
|
+
config: "any?",
|
|
539
|
+
p: "when config.permissions.$exists() *? boolean : =false",
|
|
540
|
+
e: "when config.editRights.$exists() *? boolean : =false",
|
|
541
|
+
});
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
### 2. Provide Meaningful Defaults
|
|
545
|
+
|
|
546
|
+
```typescript
|
|
547
|
+
// ✅ Good - Clear default values
|
|
548
|
+
const Schema = Interface({
|
|
549
|
+
config: "any?",
|
|
550
|
+
userRole: "when config.role.$exists() *? string : =guest",
|
|
551
|
+
permissions: "when config.permissions.$exists() *? string[] : =[]",
|
|
552
|
+
settings: 'when config.settings.$exists() *? any : ={"theme":"light"}',
|
|
553
|
+
});
|
|
554
|
+
|
|
555
|
+
// ❌ Avoid - Unclear defaults
|
|
556
|
+
const Schema = Interface({
|
|
557
|
+
config: "any?",
|
|
558
|
+
userRole: "when config.role.$exists() *? string : =unknown",
|
|
559
|
+
permissions: "when config.permissions.$exists() *? string[] : =null",
|
|
560
|
+
});
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
### 3. Use Appropriate Methods
|
|
564
|
+
|
|
565
|
+
```typescript
|
|
566
|
+
// ✅ Good - Use specific methods for specific checks
|
|
567
|
+
const Schema = Interface({
|
|
568
|
+
data: "any?",
|
|
569
|
+
hasContent:
|
|
570
|
+
"when data.description.$exists() && !data.description.$empty() *? boolean : =false",
|
|
571
|
+
isValidEmail:
|
|
572
|
+
"when data.email.$exists() && data.email.$contains(@) *? boolean : =false",
|
|
573
|
+
isAdminUser: "when data.role.$in(admin,super_admin) *? boolean : =false",
|
|
574
|
+
});
|
|
575
|
+
|
|
576
|
+
// ❌ Avoid - Generic existence checking when specific methods exist
|
|
577
|
+
const Schema = Interface({
|
|
578
|
+
data: "any?",
|
|
579
|
+
hasContent: "when data.description.$exists() *? boolean : =false", // Doesn't check if empty
|
|
580
|
+
isValidEmail: "when data.email.$exists() *? boolean : =false", // Doesn't validate format
|
|
581
|
+
isAdminUser: "when data.role.$exists() *? boolean : =false", // Doesn't check specific values
|
|
582
|
+
});
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
### 4. Handle Edge Cases
|
|
586
|
+
|
|
587
|
+
```typescript
|
|
588
|
+
const RobustSchema = Interface({
|
|
589
|
+
user: "any?",
|
|
590
|
+
config: "any?",
|
|
591
|
+
|
|
592
|
+
// Handle missing nested properties safely
|
|
593
|
+
hasValidProfile:
|
|
594
|
+
"when user.$exists() && user.profile.$exists() && !user.profile.$empty() *? boolean : =false",
|
|
595
|
+
|
|
596
|
+
// Provide fallbacks for missing configuration
|
|
597
|
+
maxRetries: "when config.retries.$exists() *? number : =3",
|
|
598
|
+
timeout: "when config.timeout.$exists() *? number : =5000",
|
|
599
|
+
|
|
600
|
+
// Handle array edge cases
|
|
601
|
+
hasItems:
|
|
602
|
+
"when config.items.$exists() && !config.items.$empty() *? boolean : =false",
|
|
603
|
+
});
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
### 5. Performance Considerations
|
|
607
|
+
|
|
608
|
+
```typescript
|
|
609
|
+
// ✅ Good - Efficient condition ordering
|
|
610
|
+
const Schema = Interface({
|
|
611
|
+
config: "any?",
|
|
612
|
+
|
|
613
|
+
// Check existence first (fastest)
|
|
614
|
+
hasFeature:
|
|
615
|
+
"when config.$exists() && config.features.$exists() *? boolean : =false",
|
|
616
|
+
|
|
617
|
+
// Simple checks before complex ones
|
|
618
|
+
isEnabled:
|
|
619
|
+
"when config.enabled.$exists() && config.features.$contains(advanced) *? boolean : =false",
|
|
620
|
+
});
|
|
621
|
+
|
|
622
|
+
// ❌ Avoid - Inefficient ordering
|
|
623
|
+
const Schema = Interface({
|
|
624
|
+
config: "any?",
|
|
625
|
+
|
|
626
|
+
// Complex check before existence check
|
|
627
|
+
hasFeature:
|
|
628
|
+
"when config.features.$contains(advanced) && config.$exists() *? boolean : =false",
|
|
629
|
+
});
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
## 🔗 Related Documentation
|
|
633
|
+
|
|
634
|
+
- **[Getting Started](./GETTING-STARTED.md)** - Basic ReliantType usage
|
|
635
|
+
- **[Field Types Reference](./FIELD-TYPES.md)** - Complete type reference
|
|
636
|
+
- **[Examples Collection](./EXAMPLES.md)** - Real-world usage patterns
|
|
637
|
+
- **[Quick Reference](./QUICK-REFERENCE.md)** - Syntax cheat sheet
|