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,406 @@
|
|
|
1
|
+
# ReliantType Conditional Parser - Complete Guide
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The `ConditionalParser` is responsible for parsing conditional validation expressions in ReliantType into an Abstract Syntax Tree (AST). It handles complex syntax like:
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
"when role=admin *? string[] : string[]?"
|
|
9
|
+
"when age > 18 AND status=active *? string(1,50) : string?"
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Architecture Flow
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
Input String → Lexer → Tokens → Parser → AST → Validation
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Class Structure
|
|
19
|
+
|
|
20
|
+
### Constructor & Configuration
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
constructor(config: Partial<ParserConfig> = {})
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Purpose**: Initialize the parser with configuration options.
|
|
27
|
+
|
|
28
|
+
**Key Properties**:
|
|
29
|
+
- `tokens`: Array of tokens from the lexer
|
|
30
|
+
- `current`: Current position in the token array
|
|
31
|
+
- `errors`: Collection of parsing errors
|
|
32
|
+
- `config`: Parser configuration settings
|
|
33
|
+
|
|
34
|
+
**Default Config**:
|
|
35
|
+
```typescript
|
|
36
|
+
{
|
|
37
|
+
allowNestedConditionals: true, // Allow "when ... *? when ... *? ..."
|
|
38
|
+
maxNestingDepth: 5, // Maximum nesting levels
|
|
39
|
+
strictMode: false, // Strict parsing rules
|
|
40
|
+
enableDebug: false // Debug output
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Main Parsing Flow
|
|
45
|
+
|
|
46
|
+
### 1. `parse(input: string)` - Entry Point
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
parse(input: string): { ast?: ConditionalNode; errors: ConditionalError[] }
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Steps**:
|
|
53
|
+
1. **Tokenize**: Uses `ConditionalLexer` to convert string to tokens
|
|
54
|
+
2. **Parse**: Calls `parseConditional()` to build AST
|
|
55
|
+
3. **Validate**: Checks for remaining tokens
|
|
56
|
+
4. **Return**: AST and any errors found
|
|
57
|
+
|
|
58
|
+
**Example Flow**:
|
|
59
|
+
```
|
|
60
|
+
Input: "when role=admin *? string[] : string[]?"
|
|
61
|
+
Tokens: [WHEN, IDENTIFIER(role), EQUALS, IDENTIFIER(admin), CONDITIONAL_THEN, ...]
|
|
62
|
+
AST: ConditionalNode with condition and values
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### 2. `parseConditional()` - Core Logic
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
private parseConditional(): ConditionalNode
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**Purpose**: Parse the main conditional structure: `when condition *? thenValue : elseValue`
|
|
72
|
+
|
|
73
|
+
**Steps**:
|
|
74
|
+
1. **Expect "when"**: Must start with WHEN token
|
|
75
|
+
2. **Parse condition**: Call `parseCondition()` for the condition part
|
|
76
|
+
3. **Expect "*?"**: Must have CONDITIONAL_THEN token
|
|
77
|
+
4. **Parse then value**: What to return if condition is true
|
|
78
|
+
5. **Parse else value** (optional): What to return if condition is false
|
|
79
|
+
|
|
80
|
+
**AST Structure Created**:
|
|
81
|
+
```typescript
|
|
82
|
+
{
|
|
83
|
+
type: "conditional",
|
|
84
|
+
condition: ConditionNode,
|
|
85
|
+
thenValue: ValueNode,
|
|
86
|
+
elseValue?: ValueNode,
|
|
87
|
+
position: number
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Condition Parsing (Left Side of *?)
|
|
92
|
+
|
|
93
|
+
### 3. `parseCondition()` - Condition Entry Point
|
|
94
|
+
|
|
95
|
+
Delegates to `parseLogicalOr()` to handle operator precedence.
|
|
96
|
+
|
|
97
|
+
### 4. `parseLogicalOr()` - Handle OR Operations
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
private parseLogicalOr(): ConditionNode
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Purpose**: Parse expressions like `condition1 OR condition2 OR condition3`
|
|
104
|
+
|
|
105
|
+
**Logic**:
|
|
106
|
+
1. Parse left side with `parseLogicalAnd()`
|
|
107
|
+
2. While OR tokens exist:
|
|
108
|
+
- Parse right side
|
|
109
|
+
- Create LogicalExpressionNode
|
|
110
|
+
- Continue chain
|
|
111
|
+
|
|
112
|
+
**Example**: `role=admin OR role=superuser`
|
|
113
|
+
```
|
|
114
|
+
Result: LogicalExpressionNode {
|
|
115
|
+
operator: "OR",
|
|
116
|
+
left: ComparisonNode(role=admin),
|
|
117
|
+
right: ComparisonNode(role=superuser)
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### 5. `parseLogicalAnd()` - Handle AND Operations
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
private parseLogicalAnd(): ConditionNode
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**Purpose**: Parse expressions like `condition1 AND condition2`
|
|
128
|
+
|
|
129
|
+
**Higher precedence than OR**, so `A OR B AND C` becomes `A OR (B AND C)`
|
|
130
|
+
|
|
131
|
+
### 6. `parseComparison()` - Handle Comparisons & Methods
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
private parseComparison(): ConditionNode
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**Most Complex Method** - Handles:
|
|
138
|
+
- **Parentheses**: `(role=admin OR role=user)`
|
|
139
|
+
- **Field access**: `user.profile.name`
|
|
140
|
+
- **Method calls**: `email.contains("@company.com")`
|
|
141
|
+
- **Comparisons**: `age > 18`, `status = "active"`
|
|
142
|
+
|
|
143
|
+
**Flow**:
|
|
144
|
+
1. **Check parentheses**: If `(`, parse grouped condition
|
|
145
|
+
2. **Parse field**: Get field path like `user.profile.name`
|
|
146
|
+
3. **Check for method**: If `.methodName`, parse method call
|
|
147
|
+
4. **Parse comparison**: Handle operators like `=`, `>`, `<`, etc.
|
|
148
|
+
|
|
149
|
+
## Field & Method Parsing
|
|
150
|
+
|
|
151
|
+
### 7. `parseFieldAccess()` - Parse Field Paths
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
private parseFieldAccess(): FieldAccessNode
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**Purpose**: Parse field paths like `user.profile.name`
|
|
158
|
+
|
|
159
|
+
**Logic**:
|
|
160
|
+
1. Start with identifier (field name)
|
|
161
|
+
2. While seeing `.identifier` (not method):
|
|
162
|
+
- Add to path
|
|
163
|
+
3. Stop when hitting method name or end
|
|
164
|
+
|
|
165
|
+
**Result**: `FieldAccessNode { path: ["user", "profile", "name"] }`
|
|
166
|
+
|
|
167
|
+
### 8. `parseMethodCall()` - Parse Method Invocations
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
private parseMethodCall(field: FieldAccessNode, position: number): MethodCallNode
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**Purpose**: Parse method calls like `.exists`, `.contains("value")`, `.!empty`
|
|
174
|
+
|
|
175
|
+
**Supported Methods**:
|
|
176
|
+
- **No arguments**: `.exists`, `.empty`, `.null`
|
|
177
|
+
- **With arguments**: `.contains("text")`, `.in(["a", "b"])`
|
|
178
|
+
- **Negated**: `.!exists`, `.!empty`, `.!null`
|
|
179
|
+
|
|
180
|
+
**Special Handling**:
|
|
181
|
+
- Methods starting with `!` (negation)
|
|
182
|
+
- Methods without parentheses
|
|
183
|
+
- Argument parsing for parameterized methods
|
|
184
|
+
|
|
185
|
+
## Value Parsing (Right Side of *?)
|
|
186
|
+
|
|
187
|
+
### 9. `parseValue()` - Parse Return Values
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
private parseValue(): ValueNode
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
**Purpose**: Parse what the conditional should return
|
|
194
|
+
|
|
195
|
+
**Handles**:
|
|
196
|
+
- **Nested conditionals**: `when ... *? when ... *? value : value : value`
|
|
197
|
+
- **Constants**: `=admin` (literal value)
|
|
198
|
+
- **Arrays**: `["value1", "value2"]`
|
|
199
|
+
- **Literals**: `"string"`, `42`, `true`
|
|
200
|
+
|
|
201
|
+
### 10. `parseArray()` - Parse Array Values
|
|
202
|
+
|
|
203
|
+
```typescript
|
|
204
|
+
private parseArray(position: number): ArrayNode
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**Purpose**: Parse array literals like `["admin", "user", "guest"]`
|
|
208
|
+
|
|
209
|
+
**Logic**:
|
|
210
|
+
1. Expect `[`
|
|
211
|
+
2. Parse comma-separated literals
|
|
212
|
+
3. Expect `]`
|
|
213
|
+
|
|
214
|
+
### 11. `parseLiteral()` - Parse Basic Values
|
|
215
|
+
|
|
216
|
+
```typescript
|
|
217
|
+
private parseLiteral(): LiteralNode
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**Purpose**: Parse primitive values and complex patterns
|
|
221
|
+
|
|
222
|
+
**Handles**:
|
|
223
|
+
- **Strings**: `"hello world"`
|
|
224
|
+
- **Numbers**: `42`, `3.14`
|
|
225
|
+
- **Booleans**: `true`, `false`
|
|
226
|
+
- **Complex patterns**: `.tmp`, `@(company|org|gov)`
|
|
227
|
+
- **Schema types**: `string[]`, `number(1,10)`
|
|
228
|
+
|
|
229
|
+
## Pattern Parsing
|
|
230
|
+
|
|
231
|
+
### 12. `parseComplexPattern()` - Handle Regex-like Patterns
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
private parseComplexPattern(): LiteralNode
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
**Purpose**: Parse complex patterns like:
|
|
238
|
+
- `@(company|org|gov)` - Email domain patterns
|
|
239
|
+
- `(temp|disposable|10min)` - Choice patterns
|
|
240
|
+
- `^[A-Z]+$` - Regex patterns
|
|
241
|
+
|
|
242
|
+
**Logic**:
|
|
243
|
+
1. Track parentheses depth
|
|
244
|
+
2. Build pattern string token by token
|
|
245
|
+
3. Stop at conditional operators or balanced parentheses
|
|
246
|
+
|
|
247
|
+
### 13. `parseComparisonValue()` - Parse Right Side of Comparisons
|
|
248
|
+
|
|
249
|
+
```typescript
|
|
250
|
+
private parseComparisonValue(): LiteralNode
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
**Purpose**: Parse values used in comparisons, with special handling for patterns
|
|
254
|
+
|
|
255
|
+
**Special Cases**:
|
|
256
|
+
- Regex patterns
|
|
257
|
+
- Complex patterns with parentheses
|
|
258
|
+
- Pattern building until delimiter
|
|
259
|
+
|
|
260
|
+
## Utility Methods
|
|
261
|
+
|
|
262
|
+
### Token Navigation
|
|
263
|
+
|
|
264
|
+
```typescript
|
|
265
|
+
private match(...types: TokenType[]): boolean // Check and consume token
|
|
266
|
+
private check(type: TokenType): boolean // Check without consuming
|
|
267
|
+
private advance(): Token // Move to next token
|
|
268
|
+
private peek(): Token // Look at current token
|
|
269
|
+
private peekNext(): Token | undefined // Look ahead one token
|
|
270
|
+
private previous(): Token // Get previous token
|
|
271
|
+
private isAtEnd(): boolean // Check if at end
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Method Resolution
|
|
275
|
+
|
|
276
|
+
```typescript
|
|
277
|
+
private getMethodTokenType(methodName: string): TokenType | undefined
|
|
278
|
+
private isMethodName(name: string): boolean
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**Purpose**: Map method names to token types for validation
|
|
282
|
+
|
|
283
|
+
**Method Mapping**:
|
|
284
|
+
```typescript
|
|
285
|
+
{
|
|
286
|
+
"in": TokenType.IN,
|
|
287
|
+
"!in": TokenType.NOT_IN,
|
|
288
|
+
"exists": TokenType.EXISTS,
|
|
289
|
+
"!exists": TokenType.NOT_EXISTS,
|
|
290
|
+
"contains": TokenType.CONTAINS,
|
|
291
|
+
"!contains": TokenType.NOT_CONTAINS,
|
|
292
|
+
// ... more methods
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Error Handling
|
|
297
|
+
|
|
298
|
+
```typescript
|
|
299
|
+
private addError(type: ErrorType, message: string, suggestion?: string): void
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
**Purpose**: Add detailed error information with context
|
|
303
|
+
|
|
304
|
+
**Error Context Includes**:
|
|
305
|
+
- Token position and line/column
|
|
306
|
+
- Nearby tokens for context
|
|
307
|
+
- Suggestions for fixing
|
|
308
|
+
- Error type classification
|
|
309
|
+
|
|
310
|
+
## Complete Example Walkthrough
|
|
311
|
+
|
|
312
|
+
Let's trace through parsing: `"when role=admin AND age > 18 *? string[] : string?"`
|
|
313
|
+
|
|
314
|
+
### Step 1: Tokenization
|
|
315
|
+
```
|
|
316
|
+
[WHEN, IDENTIFIER(role), EQUALS, IDENTIFIER(admin), AND,
|
|
317
|
+
IDENTIFIER(age), GREATER_THAN, NUMBER(18), CONDITIONAL_THEN,
|
|
318
|
+
IDENTIFIER(string), LBRACKET, RBRACKET, COLON,
|
|
319
|
+
IDENTIFIER(string), UNKNOWN(?), EOF]
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### Step 2: Parse Flow
|
|
323
|
+
1. **parseConditional()**: Expects WHEN ✓
|
|
324
|
+
2. **parseCondition()** → **parseLogicalOr()**:
|
|
325
|
+
- **parseLogicalAnd()**:
|
|
326
|
+
- **parseComparison()**: `role=admin` → ComparisonNode
|
|
327
|
+
- See AND token, continue
|
|
328
|
+
- **parseComparison()**: `age > 18` → ComparisonNode
|
|
329
|
+
- Create LogicalExpressionNode(AND, left, right)
|
|
330
|
+
3. Expect CONDITIONAL_THEN (*?) ✓
|
|
331
|
+
4. **parseValue()**: `string[]` → LiteralNode("string[]")
|
|
332
|
+
5. See COLON, parse else value
|
|
333
|
+
6. **parseValue()**: `string?` → LiteralNode("string?")
|
|
334
|
+
|
|
335
|
+
### Step 3: Final AST
|
|
336
|
+
```typescript
|
|
337
|
+
ConditionalNode {
|
|
338
|
+
condition: LogicalExpressionNode {
|
|
339
|
+
operator: "AND",
|
|
340
|
+
left: ComparisonNode {
|
|
341
|
+
operator: "EQUALS",
|
|
342
|
+
left: FieldAccessNode { path: ["role"] },
|
|
343
|
+
right: LiteralNode { value: "admin" }
|
|
344
|
+
},
|
|
345
|
+
right: ComparisonNode {
|
|
346
|
+
operator: "GREATER_THAN",
|
|
347
|
+
left: FieldAccessNode { path: ["age"] },
|
|
348
|
+
right: LiteralNode { value: 18 }
|
|
349
|
+
}
|
|
350
|
+
},
|
|
351
|
+
thenValue: LiteralNode { value: "string[]" },
|
|
352
|
+
elseValue: LiteralNode { value: "string?" }
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
## Key Design Patterns
|
|
357
|
+
|
|
358
|
+
### 1. Recursive Descent Parser
|
|
359
|
+
- Each grammar rule has its own method
|
|
360
|
+
- Methods call each other recursively
|
|
361
|
+
- Operator precedence handled by method hierarchy
|
|
362
|
+
|
|
363
|
+
### 2. Error Recovery
|
|
364
|
+
- Errors collected rather than throwing immediately
|
|
365
|
+
- Context preserved for better error messages
|
|
366
|
+
- Parsing continues when possible
|
|
367
|
+
|
|
368
|
+
### 3. Token Lookahead
|
|
369
|
+
- `peek()` and `peekNext()` for decision making
|
|
370
|
+
- No backtracking needed
|
|
371
|
+
- Efficient single-pass parsing
|
|
372
|
+
|
|
373
|
+
### 4. AST Builder Pattern
|
|
374
|
+
- Centralized AST node creation in `ASTBuilder`
|
|
375
|
+
- Consistent node structure
|
|
376
|
+
- Position tracking for error reporting
|
|
377
|
+
|
|
378
|
+
## Contributing Tips
|
|
379
|
+
|
|
380
|
+
### Understanding the Code Flow
|
|
381
|
+
1. **Start with `parse()`** - the entry point
|
|
382
|
+
2. **Follow the grammar** - each method represents a grammar rule
|
|
383
|
+
3. **Trace with examples** - use simple examples to understand flow
|
|
384
|
+
4. **Check error handling** - see how errors are collected and reported
|
|
385
|
+
|
|
386
|
+
### Common Areas for Contribution
|
|
387
|
+
1. **New operators** - Add support for new comparison operators
|
|
388
|
+
2. **New methods** - Add field methods like `.matches()`, `.length()`
|
|
389
|
+
3. **Better error messages** - Improve error context and suggestions
|
|
390
|
+
4. **Performance** - Optimize token consumption and lookahead
|
|
391
|
+
5. **Type inference** - Enhance TypeScript type inference from AST
|
|
392
|
+
|
|
393
|
+
### Testing Strategy
|
|
394
|
+
```typescript
|
|
395
|
+
// Test individual parsing methods
|
|
396
|
+
const parser = new ConditionalParser();
|
|
397
|
+
const result = parser.parse("when field=value *? string : string?");
|
|
398
|
+
|
|
399
|
+
// Test error cases
|
|
400
|
+
const errorResult = parser.parse("when field= *? string"); // Missing value
|
|
401
|
+
|
|
402
|
+
// Test complex nested cases
|
|
403
|
+
const nestedResult = parser.parse("when a=1 *? when b=2 *? string : number : boolean");
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
This parser is the core of ReliantType's conditional validation system, enabling powerful, readable validation logic with full TypeScript support.
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for enhanced conditional validation system
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { ValidationError } from "../../../../../types/types";
|
|
6
|
+
|
|
7
|
+
// Token types for lexical analysis
|
|
8
|
+
export enum TokenType {
|
|
9
|
+
// Keywords
|
|
10
|
+
WHEN = "WHEN",
|
|
11
|
+
|
|
12
|
+
// Operators
|
|
13
|
+
EQUALS = "EQUALS", // =
|
|
14
|
+
NOT_EQUALS = "NOT_EQUALS", // !=
|
|
15
|
+
GREATER_THAN = "GREATER_THAN", // >
|
|
16
|
+
GREATER_EQUAL = "GREATER_EQUAL", // >=
|
|
17
|
+
LESS_THAN = "LESS_THAN", // <
|
|
18
|
+
LESS_EQUAL = "LESS_EQUAL", // <=
|
|
19
|
+
MATCHES = "MATCHES", // ~
|
|
20
|
+
NOT_MATCHES = "NOT_MATCHES", // !~
|
|
21
|
+
|
|
22
|
+
// Logical operators
|
|
23
|
+
AND = "AND", // &&
|
|
24
|
+
OR = "OR", // ||
|
|
25
|
+
NOT = "NOT", // !
|
|
26
|
+
|
|
27
|
+
// State operators
|
|
28
|
+
NOT_EXISTS = "NOT_EXISTS", // !exists
|
|
29
|
+
NOT_EMPTY = "NOT_EMPTY", // !empty
|
|
30
|
+
NOT_NULL = "NOT_NULL", // !null
|
|
31
|
+
|
|
32
|
+
// Method operators
|
|
33
|
+
IN = "IN", // .in()
|
|
34
|
+
NOT_IN = "NOT_IN", // .notIn()
|
|
35
|
+
EXISTS = "EXISTS", // .exists
|
|
36
|
+
EMPTY = "EMPTY", // .empty
|
|
37
|
+
NULL = "NULL", // .null
|
|
38
|
+
CONTAINS = "CONTAINS", // .contains()
|
|
39
|
+
NOT_CONTAINS = "NOT_CONTAINS", // .notContains()
|
|
40
|
+
STARTS_WITH = "STARTS_WITH", // .startsWith()
|
|
41
|
+
ENDS_WITH = "ENDS_WITH", // .endsWith()
|
|
42
|
+
BETWEEN = "BETWEEN", // .between()
|
|
43
|
+
|
|
44
|
+
// Conditional syntax
|
|
45
|
+
CONDITIONAL_THEN = "CONDITIONAL_THEN", // *?
|
|
46
|
+
COLON = "COLON", // :
|
|
47
|
+
|
|
48
|
+
// Grouping
|
|
49
|
+
LPAREN = "LPAREN", // (
|
|
50
|
+
RPAREN = "RPAREN", // )
|
|
51
|
+
LBRACKET = "LBRACKET", // [
|
|
52
|
+
RBRACKET = "RBRACKET", // ]
|
|
53
|
+
LBRACE = "LBRACE", // {
|
|
54
|
+
RBRACE = "RBRACE", // }
|
|
55
|
+
|
|
56
|
+
// Values
|
|
57
|
+
IDENTIFIER = "IDENTIFIER", // field names, values
|
|
58
|
+
STRING = "STRING", // quoted strings
|
|
59
|
+
NUMBER = "NUMBER", // numeric values
|
|
60
|
+
BOOLEAN = "BOOLEAN", // true/false
|
|
61
|
+
CONSTANT = "CONSTANT", // =value syntax
|
|
62
|
+
|
|
63
|
+
// Separators
|
|
64
|
+
COMMA = "COMMA", // ,
|
|
65
|
+
DOT = "DOT", // .
|
|
66
|
+
PIPE = "PIPE", // | (for regex alternation)
|
|
67
|
+
CARET = "CARET", // ^ (for regex start anchor)
|
|
68
|
+
DOLLAR = "DOLLAR", // $ (for regex end anchor)
|
|
69
|
+
AT = "AT", // @ (for email patterns)
|
|
70
|
+
|
|
71
|
+
// Special
|
|
72
|
+
EOF = "EOF", // End of input
|
|
73
|
+
WHITESPACE = "WHITESPACE", // Spaces, tabs
|
|
74
|
+
UNKNOWN = "UNKNOWN", // Unknown token
|
|
75
|
+
REGEX_PATTERN = "REGEX_PATTERN", // Complex regex patterns
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Token structure
|
|
79
|
+
export interface Token {
|
|
80
|
+
type: TokenType;
|
|
81
|
+
value: string;
|
|
82
|
+
position: number;
|
|
83
|
+
line: number;
|
|
84
|
+
column: number;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// AST Node types
|
|
88
|
+
export enum ASTNodeType {
|
|
89
|
+
CONDITIONAL = "CONDITIONAL",
|
|
90
|
+
CONDITION = "CONDITION",
|
|
91
|
+
LOGICAL_EXPRESSION = "LOGICAL_EXPRESSION",
|
|
92
|
+
COMPARISON = "COMPARISON",
|
|
93
|
+
METHOD_CALL = "METHOD_CALL",
|
|
94
|
+
FIELD_ACCESS = "FIELD_ACCESS",
|
|
95
|
+
LITERAL = "LITERAL",
|
|
96
|
+
CONSTANT = "CONSTANT",
|
|
97
|
+
ARRAY = "ARRAY",
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Base AST node
|
|
101
|
+
export interface ASTNode {
|
|
102
|
+
type: ASTNodeType;
|
|
103
|
+
position: number;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Conditional expression: when condition *? thenValue : elseValue
|
|
107
|
+
export interface ConditionalNode extends ASTNode {
|
|
108
|
+
type: ASTNodeType.CONDITIONAL;
|
|
109
|
+
condition: ConditionNode;
|
|
110
|
+
thenValue: ValueNode;
|
|
111
|
+
elseValue?: ValueNode;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Condition node (can be logical expression or simple comparison)
|
|
115
|
+
export type ConditionNode =
|
|
116
|
+
| LogicalExpressionNode
|
|
117
|
+
| ComparisonNode
|
|
118
|
+
| MethodCallNode;
|
|
119
|
+
|
|
120
|
+
// Logical expression: condition && condition, condition || condition
|
|
121
|
+
export interface LogicalExpressionNode extends ASTNode {
|
|
122
|
+
type: ASTNodeType.LOGICAL_EXPRESSION;
|
|
123
|
+
operator: "AND" | "OR";
|
|
124
|
+
left: ConditionNode;
|
|
125
|
+
right: ConditionNode;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Comparison: field = value, field > value, etc.
|
|
129
|
+
export interface ComparisonNode extends ASTNode {
|
|
130
|
+
type: ASTNodeType.COMPARISON;
|
|
131
|
+
operator: TokenType;
|
|
132
|
+
left: FieldAccessNode;
|
|
133
|
+
right: LiteralNode;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Method call: field.in(values), field.exists, field.$exists(), etc.
|
|
137
|
+
export interface MethodCallNode extends ASTNode {
|
|
138
|
+
type: ASTNodeType.METHOD_CALL;
|
|
139
|
+
method: TokenType;
|
|
140
|
+
field: FieldAccessNode;
|
|
141
|
+
arguments?: LiteralNode[];
|
|
142
|
+
isRuntimeMethod?: boolean; // Flag to indicate runtime methods (starting with $)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Field access: simple field or nested field.subfield
|
|
146
|
+
export interface FieldAccessNode extends ASTNode {
|
|
147
|
+
type: ASTNodeType.FIELD_ACCESS;
|
|
148
|
+
path: string[];
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Literal values: strings, numbers, booleans
|
|
152
|
+
export interface LiteralNode extends ASTNode {
|
|
153
|
+
type: ASTNodeType.LITERAL;
|
|
154
|
+
value: string | number | boolean;
|
|
155
|
+
dataType: "string" | "number" | "boolean";
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Constant values: =value syntax
|
|
159
|
+
export interface ConstantNode extends ASTNode {
|
|
160
|
+
type: ASTNodeType.CONSTANT;
|
|
161
|
+
value: string;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Array of values: [value1, value2]
|
|
165
|
+
export interface ArrayNode extends ASTNode {
|
|
166
|
+
type: ASTNodeType.ARRAY;
|
|
167
|
+
elements: LiteralNode[];
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Value types for then/else clauses
|
|
171
|
+
export type ValueNode =
|
|
172
|
+
| LiteralNode
|
|
173
|
+
| ConstantNode
|
|
174
|
+
| ArrayNode
|
|
175
|
+
| ConditionalNode;
|
|
176
|
+
|
|
177
|
+
// Evaluation context
|
|
178
|
+
export interface EvaluationContext {
|
|
179
|
+
data: Record<string, any>;
|
|
180
|
+
schema?: Record<string, any>; // Add schema for path validation
|
|
181
|
+
fieldPath: string[];
|
|
182
|
+
parentContext?: Record<string, any>; // NEW: Parent context for nested field resolution
|
|
183
|
+
options?: {
|
|
184
|
+
strict?: boolean;
|
|
185
|
+
debug?: boolean;
|
|
186
|
+
validatePaths?: boolean; // New option to enable path validation
|
|
187
|
+
enableCaching?: boolean; // Performance optimization option
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Evaluation result
|
|
192
|
+
export interface EvaluationResult {
|
|
193
|
+
success: boolean;
|
|
194
|
+
value?: any;
|
|
195
|
+
errors: ValidationError[];
|
|
196
|
+
debugInfo?: {
|
|
197
|
+
evaluationPath: string[];
|
|
198
|
+
conditionResults: Record<string, boolean>;
|
|
199
|
+
finalCondition: boolean;
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Parser configuration
|
|
204
|
+
export interface ParserConfig {
|
|
205
|
+
allowNestedConditionals: boolean;
|
|
206
|
+
maxNestingDepth: number;
|
|
207
|
+
strictMode: boolean;
|
|
208
|
+
enableDebug: boolean;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Error types
|
|
212
|
+
export enum ErrorType {
|
|
213
|
+
SYNTAX_ERROR = "SYNTAX_ERROR",
|
|
214
|
+
SEMANTIC_ERROR = "SEMANTIC_ERROR",
|
|
215
|
+
EVALUATION_ERROR = "EVALUATION_ERROR",
|
|
216
|
+
TYPE_ERROR = "TYPE_ERROR",
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Enhanced error information
|
|
220
|
+
export interface ConditionalError {
|
|
221
|
+
type: ErrorType;
|
|
222
|
+
message: string;
|
|
223
|
+
position: number;
|
|
224
|
+
line: number;
|
|
225
|
+
column: number;
|
|
226
|
+
suggestion?: string;
|
|
227
|
+
context?: {
|
|
228
|
+
nearbyTokens: Token[];
|
|
229
|
+
expectedTokens: TokenType[];
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Operator metadata
|
|
234
|
+
export interface OperatorInfo {
|
|
235
|
+
symbol: string;
|
|
236
|
+
precedence: number;
|
|
237
|
+
associativity: "left" | "right";
|
|
238
|
+
operandCount: number;
|
|
239
|
+
supportedTypes: string[];
|
|
240
|
+
description: string;
|
|
241
|
+
examples: string[];
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Method metadata
|
|
245
|
+
export interface MethodInfo {
|
|
246
|
+
name: string;
|
|
247
|
+
parameterCount: number;
|
|
248
|
+
parameterTypes: string[];
|
|
249
|
+
returnType: string;
|
|
250
|
+
description: string;
|
|
251
|
+
examples: string[];
|
|
252
|
+
supportedFieldTypes: string[];
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Schema introspection result
|
|
256
|
+
export interface SchemaIntrospection {
|
|
257
|
+
fieldName: string;
|
|
258
|
+
conditionalSyntax: string;
|
|
259
|
+
parsedAST: ConditionalNode;
|
|
260
|
+
possibleValues: any[];
|
|
261
|
+
requiredConditions: string[];
|
|
262
|
+
optionalConditions: string[];
|
|
263
|
+
nullabilityRules: string[];
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// Validation result for schema pre-validation
|
|
267
|
+
export interface SchemaValidationResult {
|
|
268
|
+
valid: boolean;
|
|
269
|
+
errors: ConditionalError[];
|
|
270
|
+
warnings: string[];
|
|
271
|
+
suggestions: string[];
|
|
272
|
+
introspection: SchemaIntrospection[];
|
|
273
|
+
}
|