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,1137 @@
|
|
|
1
|
+
# Live Utility - Comprehensive Guide
|
|
2
|
+
|
|
3
|
+
The Live utility transforms ReliantType into a powerful real-time validation system with full EventEmitter-like interface, data transformation pipelines, and stream control methods. This guide covers all features and use cases.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Overview](#overview)
|
|
8
|
+
- [Installation & Setup](#installation--setup)
|
|
9
|
+
- [Core Components](#core-components)
|
|
10
|
+
- [EventEmitter Interface](#eventemitter-interface)
|
|
11
|
+
- [Data Transformation Pipeline](#data-transformation-pipeline)
|
|
12
|
+
- [Stream Control Methods](#stream-control-methods)
|
|
13
|
+
- [Form Integration](#form-integration)
|
|
14
|
+
- [Performance Monitoring](#performance-monitoring)
|
|
15
|
+
- [Real-World Examples](#real-world-examples)
|
|
16
|
+
- [Best Practices](#best-practices)
|
|
17
|
+
- [API Reference](#api-reference)
|
|
18
|
+
|
|
19
|
+
## Overview
|
|
20
|
+
|
|
21
|
+
The Live utility provides three main components:
|
|
22
|
+
|
|
23
|
+
- **LiveValidator** - Real-time field validation for forms and UI
|
|
24
|
+
- **StreamValidator** - Advanced stream processing with EventEmitter interface
|
|
25
|
+
- **FormValidator** - Complete form integration with field binding
|
|
26
|
+
|
|
27
|
+
### Key Features
|
|
28
|
+
|
|
29
|
+
✅ **100% Stream Methods Coverage**
|
|
30
|
+
|
|
31
|
+
- `.on()`, `.emit()`, `.off()`, `.once()` - Full EventEmitter interface
|
|
32
|
+
- `.transform()`, `.filter()`, `.map()` - Data transformation pipeline
|
|
33
|
+
- `.pipe()` - Stream piping and chaining
|
|
34
|
+
- `.pause()`, `.resume()`, `.destroy()` - Stream control
|
|
35
|
+
|
|
36
|
+
✅ **Perfect InterfaceSchema Synchronization**
|
|
37
|
+
|
|
38
|
+
- Identical validation results with Interface.safeParse()
|
|
39
|
+
- Consistent error handling and type inference
|
|
40
|
+
- Full support for conditional validation
|
|
41
|
+
|
|
42
|
+
✅ **Production-Ready Features**
|
|
43
|
+
|
|
44
|
+
- Performance monitoring and statistics
|
|
45
|
+
- Error handling and graceful degradation
|
|
46
|
+
- Memory management and cleanup
|
|
47
|
+
|
|
48
|
+
## Installation & Setup
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
import { Live, Interface } from "reliant-type";
|
|
52
|
+
|
|
53
|
+
// Define your schema
|
|
54
|
+
const UserSchema = Interface({
|
|
55
|
+
id: "number",
|
|
56
|
+
name: "string(2,50)",
|
|
57
|
+
email: "email",
|
|
58
|
+
age: "number(18,120)",
|
|
59
|
+
profile: {
|
|
60
|
+
bio: "string?",
|
|
61
|
+
website: "url?",
|
|
62
|
+
verified: "boolean",
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Core Components
|
|
68
|
+
|
|
69
|
+
### LiveValidator - Real-time Field Validation
|
|
70
|
+
|
|
71
|
+
Perfect for form validation and real-time UI feedback:
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
const liveValidator = Live.validator(UserSchema);
|
|
75
|
+
|
|
76
|
+
// Listen for validation changes
|
|
77
|
+
liveValidator.onValidation((result) => {
|
|
78
|
+
console.log("Overall valid:", result.isValid);
|
|
79
|
+
console.log("Field errors:", result.errors);
|
|
80
|
+
|
|
81
|
+
// Update UI based on validation state
|
|
82
|
+
updateFormUI(result);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// Validate individual fields
|
|
86
|
+
liveValidator.validateField("email", "user@example.com");
|
|
87
|
+
liveValidator.validateField("name", "John Doe");
|
|
88
|
+
liveValidator.validateField("age", 25);
|
|
89
|
+
|
|
90
|
+
// Get current validation state
|
|
91
|
+
console.log("Is valid:", liveValidator.isValid);
|
|
92
|
+
console.log("All errors:", liveValidator.errors);
|
|
93
|
+
|
|
94
|
+
// Validate entire object
|
|
95
|
+
const fullResult = liveValidator.validateAll(userData);
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### StreamValidator - Advanced Stream Processing
|
|
99
|
+
|
|
100
|
+
Full EventEmitter interface with data transformation:
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
const streamValidator = Live.stream(UserSchema);
|
|
104
|
+
|
|
105
|
+
// EventEmitter methods
|
|
106
|
+
streamValidator.on("valid", (data) => {
|
|
107
|
+
console.log("✅ Valid data:", data);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
streamValidator.on("invalid", (data, errors) => {
|
|
111
|
+
console.log("❌ Invalid data:", errors);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
streamValidator.on("error", (error) => {
|
|
115
|
+
console.error("Stream error:", error);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// Process data
|
|
119
|
+
streamValidator.validate(userData);
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### FormValidator - Complete Form Integration
|
|
123
|
+
|
|
124
|
+
Designed for HTML form integration:
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
const formValidator = Live.form(UserSchema);
|
|
128
|
+
|
|
129
|
+
// Bind form fields
|
|
130
|
+
formValidator.bindField("email", document.getElementById("email"));
|
|
131
|
+
formValidator.bindField("name", document.getElementById("name"));
|
|
132
|
+
|
|
133
|
+
// Enable automatic validation
|
|
134
|
+
formValidator.enableAutoValidation();
|
|
135
|
+
|
|
136
|
+
// Handle form submission
|
|
137
|
+
formValidator.onSubmit((isValid, data, errors) => {
|
|
138
|
+
if (isValid) {
|
|
139
|
+
// Submit to API
|
|
140
|
+
submitToAPI(data);
|
|
141
|
+
} else {
|
|
142
|
+
// Display errors
|
|
143
|
+
displayFormErrors(errors);
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## EventEmitter Interface
|
|
149
|
+
|
|
150
|
+
The StreamValidator provides a complete EventEmitter-like interface:
|
|
151
|
+
|
|
152
|
+
### Basic Event Methods
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
const validator = Live.stream(UserSchema);
|
|
156
|
+
|
|
157
|
+
// .on() - Add event listener
|
|
158
|
+
validator.on("valid", (data) => {
|
|
159
|
+
console.log("Valid data received:", data);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
// .once() - One-time event listener
|
|
163
|
+
validator.once("invalid", (data, errors) => {
|
|
164
|
+
console.log("First invalid data:", errors);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
// .emit() - Emit custom events
|
|
168
|
+
validator.emit("custom-event", "Hello World!");
|
|
169
|
+
|
|
170
|
+
// .off() - Remove event listeners
|
|
171
|
+
validator.off("valid", specificListener);
|
|
172
|
+
validator.off("invalid"); // Remove all listeners for event
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Built-in Events
|
|
176
|
+
|
|
177
|
+
The StreamValidator emits these events automatically:
|
|
178
|
+
|
|
179
|
+
```typescript
|
|
180
|
+
// Data processing events
|
|
181
|
+
validator.on("data", (data) => {
|
|
182
|
+
console.log("Data received for validation");
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
validator.on("validated", (data, result) => {
|
|
186
|
+
console.log("Validation completed:", result.isValid);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
// Validation result events
|
|
190
|
+
validator.on("valid", (data) => {
|
|
191
|
+
console.log("Data passed validation");
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
validator.on("invalid", (data, errors) => {
|
|
195
|
+
console.log("Data failed validation:", errors);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
// Transformation events
|
|
199
|
+
validator.on("filtered", (data) => {
|
|
200
|
+
console.log("Data filtered out by pipeline");
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
// Stream control events
|
|
204
|
+
validator.on("pause", () => {
|
|
205
|
+
console.log("Stream paused");
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
validator.on("resume", () => {
|
|
209
|
+
console.log("Stream resumed");
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
validator.on("destroy", () => {
|
|
213
|
+
console.log("Stream destroyed");
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
// Queue events
|
|
217
|
+
validator.on("queued", (data) => {
|
|
218
|
+
console.log("Data queued (stream paused)");
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
// Error events
|
|
222
|
+
validator.on("error", (error) => {
|
|
223
|
+
console.error("Stream error:", error);
|
|
224
|
+
});
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## Data Transformation Pipeline
|
|
228
|
+
|
|
229
|
+
Build powerful data processing pipelines:
|
|
230
|
+
|
|
231
|
+
### Basic Transformations
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
const validator = Live.stream(UserSchema)
|
|
235
|
+
.transform((data) => {
|
|
236
|
+
// Add metadata
|
|
237
|
+
return {
|
|
238
|
+
...data,
|
|
239
|
+
timestamp: Date.now(),
|
|
240
|
+
source: "api",
|
|
241
|
+
version: "1.0",
|
|
242
|
+
};
|
|
243
|
+
})
|
|
244
|
+
.filter((data) => {
|
|
245
|
+
// Business logic filtering
|
|
246
|
+
return data.age >= 21 && data.email.includes("@company.com");
|
|
247
|
+
})
|
|
248
|
+
.map((data) => {
|
|
249
|
+
// Data format transformation
|
|
250
|
+
return {
|
|
251
|
+
...data,
|
|
252
|
+
name: data.name.toUpperCase(),
|
|
253
|
+
email: data.email.toLowerCase(),
|
|
254
|
+
displayName: `${data.name} (${data.age})`,
|
|
255
|
+
};
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
// Listen for pipeline results
|
|
259
|
+
validator.on("valid", (data) => {
|
|
260
|
+
console.log("Processed data:", data);
|
|
261
|
+
// Data has been transformed, filtered, and validated
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
validator.on("filtered", (data) => {
|
|
265
|
+
console.log("Data filtered out:", data);
|
|
266
|
+
// Data didn't pass filter conditions
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
validator.on("invalid", (data, errors) => {
|
|
270
|
+
console.log("Validation failed after transformation:", errors);
|
|
271
|
+
});
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Advanced Pipeline Example
|
|
275
|
+
|
|
276
|
+
```typescript
|
|
277
|
+
const advancedValidator = Live.stream(UserSchema)
|
|
278
|
+
// Step 1: Normalize data
|
|
279
|
+
.transform((data) => ({
|
|
280
|
+
...data,
|
|
281
|
+
email: data.email?.toLowerCase().trim(),
|
|
282
|
+
name: data.name?.trim(),
|
|
283
|
+
phone: data.phone?.replace(/\D/g, ""), // Remove non-digits
|
|
284
|
+
}))
|
|
285
|
+
|
|
286
|
+
// Step 2: Add computed fields
|
|
287
|
+
.transform((data) => ({
|
|
288
|
+
...data,
|
|
289
|
+
fullName: `${data.firstName} ${data.lastName}`,
|
|
290
|
+
isAdult: data.age >= 18,
|
|
291
|
+
emailDomain: data.email?.split("@")[1],
|
|
292
|
+
}))
|
|
293
|
+
|
|
294
|
+
// Step 3: Business logic filtering
|
|
295
|
+
.filter((data) => {
|
|
296
|
+
// Only process users from allowed domains
|
|
297
|
+
const allowedDomains = ["company.com", "partner.com"];
|
|
298
|
+
return allowedDomains.includes(data.emailDomain);
|
|
299
|
+
})
|
|
300
|
+
|
|
301
|
+
// Step 4: Final formatting
|
|
302
|
+
.map((data) => ({
|
|
303
|
+
...data,
|
|
304
|
+
displayName: data.isAdult ? `${data.fullName} (Adult)` : data.fullName,
|
|
305
|
+
contactInfo: `${data.email} | ${data.phone}`,
|
|
306
|
+
}));
|
|
307
|
+
|
|
308
|
+
// Process data through pipeline
|
|
309
|
+
advancedValidator.validate(rawUserData);
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
## Stream Control Methods
|
|
313
|
+
|
|
314
|
+
Control data flow with pause, resume, and destroy:
|
|
315
|
+
|
|
316
|
+
### Basic Stream Control
|
|
317
|
+
|
|
318
|
+
```typescript
|
|
319
|
+
const validator = Live.stream(UserSchema);
|
|
320
|
+
|
|
321
|
+
// Pause stream (incoming data gets queued)
|
|
322
|
+
validator.pause();
|
|
323
|
+
console.log("Stream paused:", validator.paused); // true
|
|
324
|
+
|
|
325
|
+
// Send data while paused
|
|
326
|
+
validator.validate(userData1); // Queued
|
|
327
|
+
validator.validate(userData2); // Queued
|
|
328
|
+
validator.validate(userData3); // Queued
|
|
329
|
+
|
|
330
|
+
console.log("Queue length:", validator.queueLength); // 3
|
|
331
|
+
|
|
332
|
+
// Resume stream (processes all queued data)
|
|
333
|
+
validator.resume();
|
|
334
|
+
console.log("Stream resumed, queue processed");
|
|
335
|
+
console.log("Queue length:", validator.queueLength); // 0
|
|
336
|
+
|
|
337
|
+
// Destroy stream (cleanup and prevent further use)
|
|
338
|
+
validator.destroy();
|
|
339
|
+
console.log("Stream destroyed:", validator.destroyed); // true
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### Advanced Stream Control
|
|
343
|
+
|
|
344
|
+
```typescript
|
|
345
|
+
const controlValidator = Live.stream(UserSchema);
|
|
346
|
+
|
|
347
|
+
// Listen for control events
|
|
348
|
+
controlValidator.on("pause", () => {
|
|
349
|
+
console.log("⏸️ Stream paused - data will be queued");
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
controlValidator.on("resume", () => {
|
|
353
|
+
console.log("▶️ Stream resumed - processing queue");
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
controlValidator.on("queued", (data) => {
|
|
357
|
+
console.log(
|
|
358
|
+
`📦 Data queued: ${data.name} (queue: ${controlValidator.queueLength})`
|
|
359
|
+
);
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
controlValidator.on("destroy", () => {
|
|
363
|
+
console.log("💥 Stream destroyed - cleanup completed");
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
// Conditional pause/resume based on load
|
|
367
|
+
let processedCount = 0;
|
|
368
|
+
controlValidator.on("valid", () => {
|
|
369
|
+
processedCount++;
|
|
370
|
+
|
|
371
|
+
// Pause if processing too fast
|
|
372
|
+
if (processedCount % 100 === 0) {
|
|
373
|
+
controlValidator.pause();
|
|
374
|
+
setTimeout(() => controlValidator.resume(), 1000);
|
|
375
|
+
}
|
|
376
|
+
});
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
## Stream Piping
|
|
380
|
+
|
|
381
|
+
Connect validators for complex workflows:
|
|
382
|
+
|
|
383
|
+
### Basic Piping
|
|
384
|
+
|
|
385
|
+
```typescript
|
|
386
|
+
const sourceValidator = Live.stream(InputSchema);
|
|
387
|
+
const destinationValidator = Live.stream(OutputSchema);
|
|
388
|
+
|
|
389
|
+
// Pipe valid data from source to destination
|
|
390
|
+
sourceValidator.pipe(destinationValidator);
|
|
391
|
+
|
|
392
|
+
// Data flows: source → destination
|
|
393
|
+
sourceValidator.validate(inputData);
|
|
394
|
+
// If valid, automatically sent to destinationValidator
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
### Multi-Stage Pipeline
|
|
398
|
+
|
|
399
|
+
```typescript
|
|
400
|
+
const rawDataValidator = Live.stream(RawDataSchema);
|
|
401
|
+
const cleanDataValidator = Live.stream(CleanDataSchema);
|
|
402
|
+
const processedDataValidator = Live.stream(ProcessedDataSchema);
|
|
403
|
+
const finalValidator = Live.stream(FinalSchema);
|
|
404
|
+
|
|
405
|
+
// Create processing pipeline
|
|
406
|
+
const pipeline = rawDataValidator
|
|
407
|
+
.transform((data) => cleanData(data))
|
|
408
|
+
.pipe(cleanDataValidator)
|
|
409
|
+
.transform((data) => processData(data))
|
|
410
|
+
.pipe(processedDataValidator)
|
|
411
|
+
.transform((data) => finalizeData(data))
|
|
412
|
+
.pipe(finalValidator);
|
|
413
|
+
|
|
414
|
+
// Listen at each stage
|
|
415
|
+
rawDataValidator.on("valid", (data) => console.log("✅ Raw data valid"));
|
|
416
|
+
cleanDataValidator.on("valid", (data) => console.log("✅ Clean data valid"));
|
|
417
|
+
processedDataValidator.on("valid", (data) =>
|
|
418
|
+
console.log("✅ Processed data valid")
|
|
419
|
+
);
|
|
420
|
+
finalValidator.on("valid", (data) => console.log("✅ Final data ready"));
|
|
421
|
+
|
|
422
|
+
// Start the pipeline
|
|
423
|
+
rawDataValidator.validate(inputData);
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
## Performance Monitoring
|
|
427
|
+
|
|
428
|
+
Built-in performance tracking and statistics:
|
|
429
|
+
|
|
430
|
+
### Basic Statistics
|
|
431
|
+
|
|
432
|
+
```typescript
|
|
433
|
+
const validator = Live.stream(UserSchema);
|
|
434
|
+
|
|
435
|
+
// Listen for statistics updates
|
|
436
|
+
validator.onStats((stats) => {
|
|
437
|
+
console.log("📊 Validation Statistics:");
|
|
438
|
+
console.log(`- Total validated: ${stats.totalValidated}`);
|
|
439
|
+
console.log(`- Valid count: ${stats.validCount}`);
|
|
440
|
+
console.log(`- Invalid count: ${stats.invalidCount}`);
|
|
441
|
+
console.log(`- Error rate: ${(stats.errorRate * 100).toFixed(2)}%`);
|
|
442
|
+
console.log(`- Running since: ${stats.startTime}`);
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
// Get current statistics
|
|
446
|
+
const currentStats = validator.getStats();
|
|
447
|
+
console.log("Current performance:", currentStats);
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
### Performance Monitoring Dashboard
|
|
451
|
+
|
|
452
|
+
```typescript
|
|
453
|
+
class ValidationDashboard {
|
|
454
|
+
private validators: Map<string, any> = new Map();
|
|
455
|
+
|
|
456
|
+
addValidator(name: string, validator: any) {
|
|
457
|
+
this.validators.set(name, validator);
|
|
458
|
+
|
|
459
|
+
validator.onStats((stats) => {
|
|
460
|
+
this.updateDashboard(name, stats);
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
updateDashboard(name: string, stats: any) {
|
|
465
|
+
console.log(`📊 ${name} Performance:`);
|
|
466
|
+
console.log(` Throughput: ${stats.validCount}/${stats.totalValidated}`);
|
|
467
|
+
console.log(
|
|
468
|
+
` Success Rate: ${((1 - stats.errorRate) * 100).toFixed(1)}%`
|
|
469
|
+
);
|
|
470
|
+
console.log(` Queue Length: ${this.validators.get(name).queueLength}`);
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
getOverallStats() {
|
|
474
|
+
let totalValidated = 0;
|
|
475
|
+
let totalValid = 0;
|
|
476
|
+
|
|
477
|
+
for (const [name, validator] of this.validators) {
|
|
478
|
+
const stats = validator.getStats();
|
|
479
|
+
totalValidated += stats.totalValidated;
|
|
480
|
+
totalValid += stats.validCount;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
return {
|
|
484
|
+
totalValidated,
|
|
485
|
+
totalValid,
|
|
486
|
+
overallSuccessRate: totalValidated > 0 ? totalValid / totalValidated : 0,
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
// Usage
|
|
492
|
+
const dashboard = new ValidationDashboard();
|
|
493
|
+
dashboard.addValidator("users", Live.stream(UserSchema));
|
|
494
|
+
dashboard.addValidator("products", Live.stream(ProductSchema));
|
|
495
|
+
dashboard.addValidator("orders", Live.stream(OrderSchema));
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
## Real-World Examples
|
|
499
|
+
|
|
500
|
+
### E-commerce Order Processing
|
|
501
|
+
|
|
502
|
+
```typescript
|
|
503
|
+
const OrderSchema = Interface({
|
|
504
|
+
orderId: "uuid",
|
|
505
|
+
customerId: "uuid",
|
|
506
|
+
items: "array",
|
|
507
|
+
total: "number(0.01,)",
|
|
508
|
+
status: "pending|processing|shipped|delivered",
|
|
509
|
+
shippingAddress: {
|
|
510
|
+
street: "string",
|
|
511
|
+
city: "string",
|
|
512
|
+
zipCode: "string(/^\\d{5}$/)",
|
|
513
|
+
country: "string",
|
|
514
|
+
},
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
const orderProcessor = Live.stream(OrderSchema)
|
|
518
|
+
.transform((order) => ({
|
|
519
|
+
...order,
|
|
520
|
+
processedAt: new Date(),
|
|
521
|
+
estimatedDelivery: calculateDelivery(order.shippingAddress),
|
|
522
|
+
}))
|
|
523
|
+
.filter((order) => {
|
|
524
|
+
// Only process orders with valid payment
|
|
525
|
+
return validatePayment(order.customerId, order.total);
|
|
526
|
+
})
|
|
527
|
+
.map((order) => ({
|
|
528
|
+
...order,
|
|
529
|
+
trackingNumber: generateTrackingNumber(),
|
|
530
|
+
status: "processing",
|
|
531
|
+
}));
|
|
532
|
+
|
|
533
|
+
orderProcessor.on("valid", (order) => {
|
|
534
|
+
console.log(`✅ Order ${order.orderId} processed successfully`);
|
|
535
|
+
updateInventory(order.items);
|
|
536
|
+
sendConfirmationEmail(order.customerId);
|
|
537
|
+
});
|
|
538
|
+
|
|
539
|
+
orderProcessor.on("filtered", (order) => {
|
|
540
|
+
console.log(`❌ Order ${order.orderId} payment failed`);
|
|
541
|
+
notifyPaymentFailure(order.customerId);
|
|
542
|
+
});
|
|
543
|
+
|
|
544
|
+
orderProcessor.on("invalid", (order, errors) => {
|
|
545
|
+
console.log(`❌ Order ${order.orderId} validation failed:`, errors);
|
|
546
|
+
logOrderError(order, errors);
|
|
547
|
+
});
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
### Real-time Chat Message Validation
|
|
551
|
+
|
|
552
|
+
```typescript
|
|
553
|
+
const MessageSchema = Interface({
|
|
554
|
+
messageId: "uuid",
|
|
555
|
+
userId: "uuid",
|
|
556
|
+
channelId: "uuid",
|
|
557
|
+
content: "string(1,1000)",
|
|
558
|
+
type: "text|image|file",
|
|
559
|
+
timestamp: "date",
|
|
560
|
+
});
|
|
561
|
+
|
|
562
|
+
const chatValidator = Live.stream(MessageSchema)
|
|
563
|
+
.transform((message) => ({
|
|
564
|
+
...message,
|
|
565
|
+
content: sanitizeContent(message.content),
|
|
566
|
+
wordCount: message.content.split(" ").length,
|
|
567
|
+
}))
|
|
568
|
+
.filter((message) => {
|
|
569
|
+
// Filter spam and inappropriate content
|
|
570
|
+
return (
|
|
571
|
+
!isSpam(message.content) && !hasInappropriateContent(message.content)
|
|
572
|
+
);
|
|
573
|
+
})
|
|
574
|
+
.map((message) => ({
|
|
575
|
+
...message,
|
|
576
|
+
displayContent: formatMessage(message.content),
|
|
577
|
+
mentions: extractMentions(message.content),
|
|
578
|
+
}));
|
|
579
|
+
|
|
580
|
+
chatValidator.on("valid", (message) => {
|
|
581
|
+
broadcastMessage(message);
|
|
582
|
+
updateChannelActivity(message.channelId);
|
|
583
|
+
});
|
|
584
|
+
|
|
585
|
+
chatValidator.on("filtered", (message) => {
|
|
586
|
+
notifyModerators(message);
|
|
587
|
+
sendWarningToUser(message.userId);
|
|
588
|
+
});
|
|
589
|
+
|
|
590
|
+
// Real-time message processing
|
|
591
|
+
websocket.on("message", (rawMessage) => {
|
|
592
|
+
chatValidator.validate(rawMessage);
|
|
593
|
+
});
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
## Best Practices
|
|
597
|
+
|
|
598
|
+
### 1. Error Handling
|
|
599
|
+
|
|
600
|
+
```typescript
|
|
601
|
+
const validator = Live.stream(UserSchema);
|
|
602
|
+
|
|
603
|
+
// Always handle errors gracefully
|
|
604
|
+
validator.on("error", (error) => {
|
|
605
|
+
console.error("Validation error:", error);
|
|
606
|
+
|
|
607
|
+
// Log for debugging
|
|
608
|
+
logger.error("Stream validation error", {
|
|
609
|
+
error: error.message,
|
|
610
|
+
stack: error.stack,
|
|
611
|
+
});
|
|
612
|
+
|
|
613
|
+
// Don't let errors crash the application
|
|
614
|
+
// Emit a recovery event or restart the stream if needed
|
|
615
|
+
});
|
|
616
|
+
```
|
|
617
|
+
|
|
618
|
+
### 2. Memory Management
|
|
619
|
+
|
|
620
|
+
```typescript
|
|
621
|
+
// Clean up validators when done
|
|
622
|
+
const validator = Live.stream(UserSchema);
|
|
623
|
+
|
|
624
|
+
// Use the validator...
|
|
625
|
+
|
|
626
|
+
// Clean up when component unmounts or process ends
|
|
627
|
+
validator.destroy();
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
### 3. Performance Optimization
|
|
631
|
+
|
|
632
|
+
```typescript
|
|
633
|
+
// Use pause/resume for backpressure control
|
|
634
|
+
const validator = Live.stream(UserSchema);
|
|
635
|
+
|
|
636
|
+
let queueSize = 0;
|
|
637
|
+
validator.on("queued", () => {
|
|
638
|
+
queueSize++;
|
|
639
|
+
if (queueSize > 1000) {
|
|
640
|
+
console.warn("Queue getting large, consider scaling");
|
|
641
|
+
}
|
|
642
|
+
});
|
|
643
|
+
|
|
644
|
+
validator.on("valid", () => {
|
|
645
|
+
queueSize = Math.max(0, queueSize - 1);
|
|
646
|
+
});
|
|
647
|
+
```
|
|
648
|
+
|
|
649
|
+
### 4. Testing
|
|
650
|
+
|
|
651
|
+
```typescript
|
|
652
|
+
// Test validators in isolation
|
|
653
|
+
describe("User Validator", () => {
|
|
654
|
+
let validator;
|
|
655
|
+
|
|
656
|
+
beforeEach(() => {
|
|
657
|
+
validator = Live.stream(UserSchema);
|
|
658
|
+
});
|
|
659
|
+
|
|
660
|
+
afterEach(() => {
|
|
661
|
+
validator.destroy();
|
|
662
|
+
});
|
|
663
|
+
|
|
664
|
+
it("should validate correct user data", (done) => {
|
|
665
|
+
validator.on("valid", (data) => {
|
|
666
|
+
expect(data.name).toBe("John Doe");
|
|
667
|
+
done();
|
|
668
|
+
});
|
|
669
|
+
|
|
670
|
+
validator.validate({
|
|
671
|
+
name: "John Doe",
|
|
672
|
+
email: "john@example.com",
|
|
673
|
+
age: 25,
|
|
674
|
+
});
|
|
675
|
+
});
|
|
676
|
+
});
|
|
677
|
+
```
|
|
678
|
+
|
|
679
|
+
## API Reference
|
|
680
|
+
|
|
681
|
+
### Live.validator(schema)
|
|
682
|
+
|
|
683
|
+
Creates a LiveValidator for real-time field validation.
|
|
684
|
+
|
|
685
|
+
### Live.stream(schema)
|
|
686
|
+
|
|
687
|
+
Creates a StreamValidator with full EventEmitter interface.
|
|
688
|
+
|
|
689
|
+
### Live.form(schema)
|
|
690
|
+
|
|
691
|
+
Creates a FormValidator for HTML form integration.
|
|
692
|
+
|
|
693
|
+
### StreamValidator Methods
|
|
694
|
+
|
|
695
|
+
#### Event Methods
|
|
696
|
+
|
|
697
|
+
- `.on(event, listener)` - Add event listener
|
|
698
|
+
- `.once(event, listener)` - Add one-time listener
|
|
699
|
+
- `.off(event, listener?)` - Remove listener(s)
|
|
700
|
+
- `.emit(event, ...args)` - Emit event
|
|
701
|
+
|
|
702
|
+
#### Transformation Methods
|
|
703
|
+
|
|
704
|
+
- `.transform(fn)` - Add data transformer
|
|
705
|
+
- `.filter(fn)` - Add data filter
|
|
706
|
+
- `.map(fn)` - Add data mapper
|
|
707
|
+
|
|
708
|
+
#### Control Methods
|
|
709
|
+
|
|
710
|
+
- `.pause()` - Pause stream (queue data)
|
|
711
|
+
- `.resume()` - Resume stream (process queue)
|
|
712
|
+
- `.destroy()` - Destroy stream (cleanup)
|
|
713
|
+
- `.pipe(destination)` - Pipe to another validator
|
|
714
|
+
|
|
715
|
+
#### Properties
|
|
716
|
+
|
|
717
|
+
- `.paused` - Boolean, stream pause state
|
|
718
|
+
- `.destroyed` - Boolean, stream destroy state
|
|
719
|
+
- `.queueLength` - Number, current queue size
|
|
720
|
+
|
|
721
|
+
#### Statistics
|
|
722
|
+
|
|
723
|
+
- `.onStats(listener)` - Listen for statistics
|
|
724
|
+
- `.getStats()` - Get current statistics
|
|
725
|
+
|
|
726
|
+
The Live utility provides a complete, production-ready solution for real-time validation with perfect InterfaceSchema synchronization.
|
|
727
|
+
|
|
728
|
+
### Stream Control Events
|
|
729
|
+
|
|
730
|
+
```typescript
|
|
731
|
+
const validator = Live.stream(UserSchema);
|
|
732
|
+
|
|
733
|
+
// Listen for control events
|
|
734
|
+
validator.on("pause", () => {
|
|
735
|
+
console.log("⏸️ Stream paused - data will be queued");
|
|
736
|
+
});
|
|
737
|
+
|
|
738
|
+
validator.on("resume", () => {
|
|
739
|
+
console.log("▶️ Stream resumed - processing queue");
|
|
740
|
+
});
|
|
741
|
+
|
|
742
|
+
validator.on("queued", (data) => {
|
|
743
|
+
console.log(`📦 Data queued (queue: ${validator.queueLength})`);
|
|
744
|
+
});
|
|
745
|
+
|
|
746
|
+
validator.on("destroy", () => {
|
|
747
|
+
console.log("💥 Stream destroyed - cleanup completed");
|
|
748
|
+
});
|
|
749
|
+
|
|
750
|
+
// Pause and send data
|
|
751
|
+
validator.pause();
|
|
752
|
+
validator.validate({ name: "John", email: "john@example.com", age: 25 });
|
|
753
|
+
// Output: 📦 Data queued (queue: 1)
|
|
754
|
+
|
|
755
|
+
validator.resume();
|
|
756
|
+
// Output: ▶️ Stream resumed - processing queue
|
|
757
|
+
```
|
|
758
|
+
|
|
759
|
+
## Stream Piping
|
|
760
|
+
|
|
761
|
+
Connect validators for complex workflows:
|
|
762
|
+
|
|
763
|
+
### Basic Piping
|
|
764
|
+
|
|
765
|
+
```typescript
|
|
766
|
+
const sourceValidator = Live.stream(InputSchema);
|
|
767
|
+
const destinationValidator = Live.stream(OutputSchema);
|
|
768
|
+
|
|
769
|
+
// Pipe valid data from source to destination
|
|
770
|
+
sourceValidator.pipe(destinationValidator);
|
|
771
|
+
|
|
772
|
+
// Listen for results
|
|
773
|
+
destinationValidator.on("valid", (data) => {
|
|
774
|
+
console.log("Final processed data:", data);
|
|
775
|
+
});
|
|
776
|
+
|
|
777
|
+
// Data flows: source → destination
|
|
778
|
+
sourceValidator.validate(inputData);
|
|
779
|
+
```
|
|
780
|
+
|
|
781
|
+
### Multi-Stage Pipeline
|
|
782
|
+
|
|
783
|
+
```typescript
|
|
784
|
+
const rawDataValidator = Live.stream(RawDataSchema);
|
|
785
|
+
const cleanDataValidator = Live.stream(CleanDataSchema);
|
|
786
|
+
const enrichedDataValidator = Live.stream(EnrichedDataSchema);
|
|
787
|
+
const finalValidator = Live.stream(FinalSchema);
|
|
788
|
+
|
|
789
|
+
// Build processing pipeline
|
|
790
|
+
rawDataValidator
|
|
791
|
+
.transform((data) => cleanData(data))
|
|
792
|
+
.pipe(cleanDataValidator)
|
|
793
|
+
.transform((data) => enrichData(data))
|
|
794
|
+
.pipe(enrichedDataValidator)
|
|
795
|
+
.transform((data) => finalizeData(data))
|
|
796
|
+
.pipe(finalValidator);
|
|
797
|
+
|
|
798
|
+
// Listen at each stage
|
|
799
|
+
rawDataValidator.on("valid", (data) => console.log("Raw data valid"));
|
|
800
|
+
cleanDataValidator.on("valid", (data) => console.log("Clean data valid"));
|
|
801
|
+
enrichedDataValidator.on("valid", (data) => console.log("Enriched data valid"));
|
|
802
|
+
finalValidator.on("valid", (data) => console.log("Final data ready:", data));
|
|
803
|
+
|
|
804
|
+
// Start the pipeline
|
|
805
|
+
rawDataValidator.validate(inputData);
|
|
806
|
+
```
|
|
807
|
+
|
|
808
|
+
## Performance Monitoring
|
|
809
|
+
|
|
810
|
+
Built-in performance tracking and statistics:
|
|
811
|
+
|
|
812
|
+
### Basic Statistics
|
|
813
|
+
|
|
814
|
+
```typescript
|
|
815
|
+
const validator = Live.stream(UserSchema);
|
|
816
|
+
|
|
817
|
+
// Listen for statistics updates
|
|
818
|
+
validator.onStats((stats) => {
|
|
819
|
+
console.log("📊 Validation Statistics:");
|
|
820
|
+
console.log(`- Total validated: ${stats.totalValidated}`);
|
|
821
|
+
console.log(`- Valid count: ${stats.validCount}`);
|
|
822
|
+
console.log(`- Invalid count: ${stats.invalidCount}`);
|
|
823
|
+
console.log(`- Error rate: ${(stats.errorRate * 100).toFixed(2)}%`);
|
|
824
|
+
console.log(`- Running since: ${stats.startTime}`);
|
|
825
|
+
});
|
|
826
|
+
|
|
827
|
+
// Get current statistics
|
|
828
|
+
const currentStats = validator.getStats();
|
|
829
|
+
console.log("Current performance:", currentStats);
|
|
830
|
+
```
|
|
831
|
+
|
|
832
|
+
### Performance Monitoring Dashboard
|
|
833
|
+
|
|
834
|
+
```typescript
|
|
835
|
+
class ValidationDashboard {
|
|
836
|
+
constructor(validator) {
|
|
837
|
+
this.validator = validator;
|
|
838
|
+
this.setupMonitoring();
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
setupMonitoring() {
|
|
842
|
+
// Real-time statistics
|
|
843
|
+
this.validator.onStats((stats) => {
|
|
844
|
+
this.updateDashboard(stats);
|
|
845
|
+
});
|
|
846
|
+
|
|
847
|
+
// Performance alerts
|
|
848
|
+
this.validator.onStats((stats) => {
|
|
849
|
+
if (stats.errorRate > 0.1) {
|
|
850
|
+
// 10% error rate
|
|
851
|
+
console.warn("⚠️ High error rate detected:", stats.errorRate);
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
if (stats.totalValidated > 10000) {
|
|
855
|
+
console.info("🎉 Processed 10k+ validations");
|
|
856
|
+
}
|
|
857
|
+
});
|
|
858
|
+
|
|
859
|
+
// Error tracking
|
|
860
|
+
this.validator.on("error", (error) => {
|
|
861
|
+
this.logError(error);
|
|
862
|
+
});
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
updateDashboard(stats) {
|
|
866
|
+
const throughput =
|
|
867
|
+
stats.totalValidated / ((Date.now() - stats.startTime.getTime()) / 1000);
|
|
868
|
+
|
|
869
|
+
console.log(`📈 Throughput: ${throughput.toFixed(2)} validations/sec`);
|
|
870
|
+
console.log(
|
|
871
|
+
`✅ Success rate: ${((1 - stats.errorRate) * 100).toFixed(2)}%`
|
|
872
|
+
);
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
logError(error) {
|
|
876
|
+
console.error("🚨 Validation error:", {
|
|
877
|
+
message: error.message,
|
|
878
|
+
timestamp: new Date().toISOString(),
|
|
879
|
+
stack: error.stack,
|
|
880
|
+
});
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
// Usage
|
|
885
|
+
const validator = Live.stream(UserSchema);
|
|
886
|
+
const dashboard = new ValidationDashboard(validator);
|
|
887
|
+
```
|
|
888
|
+
|
|
889
|
+
## Real-World Examples
|
|
890
|
+
|
|
891
|
+
### E-commerce Order Processing
|
|
892
|
+
|
|
893
|
+
```typescript
|
|
894
|
+
const OrderSchema = Interface({
|
|
895
|
+
orderId: "uuid",
|
|
896
|
+
customerId: "uuid",
|
|
897
|
+
items: "array",
|
|
898
|
+
total: "number(0.01,)",
|
|
899
|
+
status: "pending|processing|shipped|delivered",
|
|
900
|
+
shippingAddress: {
|
|
901
|
+
street: "string",
|
|
902
|
+
city: "string",
|
|
903
|
+
zipCode: "string(/^\\d{5}$/)",
|
|
904
|
+
country: "string",
|
|
905
|
+
},
|
|
906
|
+
});
|
|
907
|
+
|
|
908
|
+
const orderProcessor = Live.stream(OrderSchema)
|
|
909
|
+
.transform((order) => ({
|
|
910
|
+
...order,
|
|
911
|
+
processedAt: new Date(),
|
|
912
|
+
estimatedDelivery: calculateDelivery(order.shippingAddress),
|
|
913
|
+
}))
|
|
914
|
+
.filter((order) => {
|
|
915
|
+
// Only process orders with valid payment
|
|
916
|
+
return validatePayment(order.customerId, order.total);
|
|
917
|
+
})
|
|
918
|
+
.map((order) => ({
|
|
919
|
+
...order,
|
|
920
|
+
trackingNumber: generateTrackingNumber(),
|
|
921
|
+
status: "processing",
|
|
922
|
+
}));
|
|
923
|
+
|
|
924
|
+
// Handle processed orders
|
|
925
|
+
orderProcessor.on("valid", (order) => {
|
|
926
|
+
console.log("✅ Order processed:", order.orderId);
|
|
927
|
+
updateInventory(order.items);
|
|
928
|
+
sendConfirmationEmail(order);
|
|
929
|
+
});
|
|
930
|
+
|
|
931
|
+
orderProcessor.on("filtered", (order) => {
|
|
932
|
+
console.log("💳 Payment failed for order:", order.orderId);
|
|
933
|
+
notifyPaymentFailure(order);
|
|
934
|
+
});
|
|
935
|
+
|
|
936
|
+
orderProcessor.on("invalid", (order, errors) => {
|
|
937
|
+
console.log("❌ Invalid order data:", errors);
|
|
938
|
+
logOrderError(order, errors);
|
|
939
|
+
});
|
|
940
|
+
```
|
|
941
|
+
|
|
942
|
+
### Real-time Chat Message Validation
|
|
943
|
+
|
|
944
|
+
```typescript
|
|
945
|
+
const MessageSchema = Interface({
|
|
946
|
+
messageId: "uuid",
|
|
947
|
+
userId: "uuid",
|
|
948
|
+
content: "string(1,1000)",
|
|
949
|
+
timestamp: "date",
|
|
950
|
+
channelId: "uuid",
|
|
951
|
+
messageType: "text|image|file|system",
|
|
952
|
+
});
|
|
953
|
+
|
|
954
|
+
const messageValidator = Live.stream(MessageSchema)
|
|
955
|
+
.transform((message) => ({
|
|
956
|
+
...message,
|
|
957
|
+
content: sanitizeContent(message.content),
|
|
958
|
+
wordCount: message.content.split(" ").length,
|
|
959
|
+
}))
|
|
960
|
+
.filter((message) => {
|
|
961
|
+
// Content moderation
|
|
962
|
+
return !containsProfanity(message.content) && !isSpam(message.content);
|
|
963
|
+
})
|
|
964
|
+
.map((message) => ({
|
|
965
|
+
...message,
|
|
966
|
+
formattedContent: formatMessage(message.content),
|
|
967
|
+
mentions: extractMentions(message.content),
|
|
968
|
+
}));
|
|
969
|
+
|
|
970
|
+
// Real-time message processing
|
|
971
|
+
messageValidator.on("valid", (message) => {
|
|
972
|
+
broadcastMessage(message);
|
|
973
|
+
updateChannelActivity(message.channelId);
|
|
974
|
+
});
|
|
975
|
+
|
|
976
|
+
messageValidator.on("filtered", (message) => {
|
|
977
|
+
console.log("🚫 Message filtered:", message.messageId);
|
|
978
|
+
notifyModerationAction(message.userId);
|
|
979
|
+
});
|
|
980
|
+
|
|
981
|
+
// Process incoming messages
|
|
982
|
+
websocket.on("message", (rawMessage) => {
|
|
983
|
+
messageValidator.validate(rawMessage);
|
|
984
|
+
});
|
|
985
|
+
```
|
|
986
|
+
|
|
987
|
+
## Best Practices
|
|
988
|
+
|
|
989
|
+
### 1. Error Handling
|
|
990
|
+
|
|
991
|
+
```typescript
|
|
992
|
+
const validator = Live.stream(UserSchema);
|
|
993
|
+
|
|
994
|
+
// Always handle errors gracefully
|
|
995
|
+
validator.on("error", (error) => {
|
|
996
|
+
console.error("Validation error:", error);
|
|
997
|
+
|
|
998
|
+
// Don't let errors crash the application
|
|
999
|
+
if (error.code === "VALIDATION_TIMEOUT") {
|
|
1000
|
+
validator.resume(); // Retry
|
|
1001
|
+
} else {
|
|
1002
|
+
// Log and continue
|
|
1003
|
+
logError(error);
|
|
1004
|
+
}
|
|
1005
|
+
});
|
|
1006
|
+
```
|
|
1007
|
+
|
|
1008
|
+
### 2. Memory Management
|
|
1009
|
+
|
|
1010
|
+
```typescript
|
|
1011
|
+
// Clean up when done
|
|
1012
|
+
function cleanupValidator(validator) {
|
|
1013
|
+
validator.destroy();
|
|
1014
|
+
|
|
1015
|
+
// Remove all listeners
|
|
1016
|
+
validator.off("valid");
|
|
1017
|
+
validator.off("invalid");
|
|
1018
|
+
validator.off("error");
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
// Use try-finally for cleanup
|
|
1022
|
+
try {
|
|
1023
|
+
const validator = Live.stream(UserSchema);
|
|
1024
|
+
// Use validator...
|
|
1025
|
+
} finally {
|
|
1026
|
+
cleanupValidator(validator);
|
|
1027
|
+
}
|
|
1028
|
+
```
|
|
1029
|
+
|
|
1030
|
+
### 3. Performance Optimization
|
|
1031
|
+
|
|
1032
|
+
```typescript
|
|
1033
|
+
// Use pause/resume for batch processing
|
|
1034
|
+
const validator = Live.stream(UserSchema);
|
|
1035
|
+
|
|
1036
|
+
async function processBatch(dataArray) {
|
|
1037
|
+
validator.pause();
|
|
1038
|
+
|
|
1039
|
+
// Queue all data
|
|
1040
|
+
dataArray.forEach((data) => validator.validate(data));
|
|
1041
|
+
|
|
1042
|
+
// Process batch
|
|
1043
|
+
validator.resume();
|
|
1044
|
+
}
|
|
1045
|
+
```
|
|
1046
|
+
|
|
1047
|
+
### 4. Type Safety
|
|
1048
|
+
|
|
1049
|
+
```typescript
|
|
1050
|
+
// Maintain type safety with TypeScript
|
|
1051
|
+
interface User {
|
|
1052
|
+
id: number;
|
|
1053
|
+
name: string;
|
|
1054
|
+
email: string;
|
|
1055
|
+
age: number;
|
|
1056
|
+
}
|
|
1057
|
+
|
|
1058
|
+
const validator = Live.stream(UserSchema);
|
|
1059
|
+
|
|
1060
|
+
validator.on("valid", (data: User) => {
|
|
1061
|
+
// data is fully typed
|
|
1062
|
+
console.log(data.name.toUpperCase());
|
|
1063
|
+
});
|
|
1064
|
+
```
|
|
1065
|
+
|
|
1066
|
+
## API Reference
|
|
1067
|
+
|
|
1068
|
+
### Live.validator(schema)
|
|
1069
|
+
|
|
1070
|
+
Creates a LiveValidator for real-time field validation.
|
|
1071
|
+
|
|
1072
|
+
**Returns:** `LiveValidator`
|
|
1073
|
+
|
|
1074
|
+
**Methods:**
|
|
1075
|
+
|
|
1076
|
+
- `validateField(fieldName: string, value: any): FieldValidationResult`
|
|
1077
|
+
- `validateAll(data: any): ValidationResult`
|
|
1078
|
+
- `onValidation(callback: (result: ValidationResult) => void): void`
|
|
1079
|
+
- `get isValid(): boolean`
|
|
1080
|
+
- `get errors(): Record<string, string[]>`
|
|
1081
|
+
|
|
1082
|
+
### Live.stream(schema)
|
|
1083
|
+
|
|
1084
|
+
Creates a StreamValidator with full EventEmitter interface.
|
|
1085
|
+
|
|
1086
|
+
**Returns:** `StreamValidator`
|
|
1087
|
+
|
|
1088
|
+
**EventEmitter Methods:**
|
|
1089
|
+
|
|
1090
|
+
- `on(event: string, listener: (...args: any[]) => void): this`
|
|
1091
|
+
- `once(event: string, listener: (...args: any[]) => void): this`
|
|
1092
|
+
- `off(event: string, listener?: (...args: any[]) => void): this`
|
|
1093
|
+
- `emit(event: string, ...args: any[]): boolean`
|
|
1094
|
+
|
|
1095
|
+
**Transformation Methods:**
|
|
1096
|
+
|
|
1097
|
+
- `transform(transformer: (data: any) => any): this`
|
|
1098
|
+
- `filter(predicate: (data: any) => boolean): this`
|
|
1099
|
+
- `map(mapper: (data: any) => any): this`
|
|
1100
|
+
|
|
1101
|
+
**Stream Control Methods:**
|
|
1102
|
+
|
|
1103
|
+
- `pause(): this`
|
|
1104
|
+
- `resume(): this`
|
|
1105
|
+
- `destroy(): this`
|
|
1106
|
+
- `pipe(destination: StreamValidator): StreamValidator`
|
|
1107
|
+
|
|
1108
|
+
**Validation Methods:**
|
|
1109
|
+
|
|
1110
|
+
- `validate(data: any): void`
|
|
1111
|
+
- `onValid(callback: (data: any) => void): void`
|
|
1112
|
+
- `onInvalid(callback: (data: any, errors: Record<string, string[]>) => void): void`
|
|
1113
|
+
- `onStats(callback: (stats: ValidationStats) => void): void`
|
|
1114
|
+
- `getStats(): ValidationStats`
|
|
1115
|
+
|
|
1116
|
+
**Properties:**
|
|
1117
|
+
|
|
1118
|
+
- `get destroyed(): boolean`
|
|
1119
|
+
- `get paused(): boolean`
|
|
1120
|
+
- `get queueLength(): number`
|
|
1121
|
+
|
|
1122
|
+
### Live.form(schema)
|
|
1123
|
+
|
|
1124
|
+
Creates a FormValidator for HTML form integration.
|
|
1125
|
+
|
|
1126
|
+
**Returns:** `FormValidator`
|
|
1127
|
+
|
|
1128
|
+
**Methods:**
|
|
1129
|
+
|
|
1130
|
+
- `bindField(fieldName: string, element: HTMLElement): void`
|
|
1131
|
+
- `enableAutoValidation(): void`
|
|
1132
|
+
- `onSubmit(callback: (isValid: boolean, data: any, errors: Record<string, string[]>) => void): void`
|
|
1133
|
+
- `validateForm(): ValidationResult`
|
|
1134
|
+
|
|
1135
|
+
---
|
|
1136
|
+
|
|
1137
|
+
The Live utility provides a complete real-time validation solution with **100% stream methods coverage** and **perfect InterfaceSchema synchronization**. Use it to build reactive, high-performance validation systems for modern applications.
|