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,378 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript Compiler API Integration
|
|
3
|
+
*
|
|
4
|
+
* This module uses TypeScript's compiler API to extract real type information
|
|
5
|
+
* and generate proper validation schemas at compile-time.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// Import TypeScript compiler API
|
|
9
|
+
// Note: This requires 'typescript' package to be installed
|
|
10
|
+
import * as ts from 'typescript';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Detailed TypeScript type information extracted via compiler API
|
|
14
|
+
*/
|
|
15
|
+
export interface TypeScriptTypeInfo {
|
|
16
|
+
kind: 'string' | 'number' | 'boolean' | 'array' | 'object' | 'union' | 'literal' | 'record' | 'unknown';
|
|
17
|
+
name?: string;
|
|
18
|
+
isOptional: boolean;
|
|
19
|
+
isArray: boolean;
|
|
20
|
+
elementType?: TypeScriptTypeInfo;
|
|
21
|
+
properties?: Record<string, TypeScriptTypeInfo>;
|
|
22
|
+
unionTypes?: TypeScriptTypeInfo[];
|
|
23
|
+
literalValue?: string | number | boolean;
|
|
24
|
+
keyType?: string;
|
|
25
|
+
valueType?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* TypeScript Type Analyzer
|
|
30
|
+
*
|
|
31
|
+
* Uses TypeScript's compiler API to analyze types and generate schemas
|
|
32
|
+
*/
|
|
33
|
+
export class TypeAnalyzer {
|
|
34
|
+
private program: ts.Program;
|
|
35
|
+
private checker: ts.TypeChecker;
|
|
36
|
+
|
|
37
|
+
constructor(sourceFiles: string[], compilerOptions?: ts.CompilerOptions) {
|
|
38
|
+
const defaultOptions: ts.CompilerOptions = {
|
|
39
|
+
target: ts.ScriptTarget.ES2020,
|
|
40
|
+
module: ts.ModuleKind.CommonJS,
|
|
41
|
+
strict: true,
|
|
42
|
+
esModuleInterop: true,
|
|
43
|
+
skipLibCheck: true,
|
|
44
|
+
forceConsistentCasingInFileNames: true,
|
|
45
|
+
...compilerOptions
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
this.program = ts.createProgram(sourceFiles, defaultOptions);
|
|
49
|
+
this.checker = this.program.getTypeChecker();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Analyze a TypeScript type and return detailed type information
|
|
54
|
+
*/
|
|
55
|
+
analyzeType(typeName: string, sourceFile?: string): TypeScriptTypeInfo {
|
|
56
|
+
try {
|
|
57
|
+
const type = this.findTypeByName(typeName, sourceFile);
|
|
58
|
+
if (type) {
|
|
59
|
+
return this.convertTypeToInfo(type);
|
|
60
|
+
}
|
|
61
|
+
} catch (error) {
|
|
62
|
+
console.warn(`Failed to analyze type "${typeName}":`, error);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return {
|
|
66
|
+
kind: 'unknown',
|
|
67
|
+
isOptional: false,
|
|
68
|
+
isArray: false
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Analyze a type from a specific node in the AST
|
|
74
|
+
*/
|
|
75
|
+
analyzeTypeFromNode(node: ts.TypeNode): TypeScriptTypeInfo {
|
|
76
|
+
try {
|
|
77
|
+
const type = this.checker.getTypeAtLocation(node);
|
|
78
|
+
return this.convertTypeToInfo(type);
|
|
79
|
+
} catch (error) {
|
|
80
|
+
console.warn('Failed to analyze type from node:', error);
|
|
81
|
+
return {
|
|
82
|
+
kind: 'unknown',
|
|
83
|
+
isOptional: false,
|
|
84
|
+
isArray: false
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Convert TypeScript type to our internal type information
|
|
91
|
+
*/
|
|
92
|
+
private convertTypeToInfo(type: ts.Type): TypeScriptTypeInfo {
|
|
93
|
+
// Handle optional types (union with undefined)
|
|
94
|
+
const isOptional = this.isOptionalType(type);
|
|
95
|
+
const nonOptionalType = isOptional ? this.getNonUndefinedType(type) : type;
|
|
96
|
+
|
|
97
|
+
// Handle primitive types
|
|
98
|
+
if (nonOptionalType.flags & ts.TypeFlags.String) {
|
|
99
|
+
return { kind: 'string', isOptional, isArray: false };
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (nonOptionalType.flags & ts.TypeFlags.Number) {
|
|
103
|
+
return { kind: 'number', isOptional, isArray: false };
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (nonOptionalType.flags & ts.TypeFlags.Boolean) {
|
|
107
|
+
return { kind: 'boolean', isOptional, isArray: false };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Handle string literals
|
|
111
|
+
if (nonOptionalType.flags & ts.TypeFlags.StringLiteral) {
|
|
112
|
+
const literalType = nonOptionalType as ts.StringLiteralType;
|
|
113
|
+
return {
|
|
114
|
+
kind: 'literal',
|
|
115
|
+
isOptional,
|
|
116
|
+
isArray: false,
|
|
117
|
+
literalValue: literalType.value
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Handle number literals
|
|
122
|
+
if (nonOptionalType.flags & ts.TypeFlags.NumberLiteral) {
|
|
123
|
+
const literalType = nonOptionalType as ts.NumberLiteralType;
|
|
124
|
+
return {
|
|
125
|
+
kind: 'literal',
|
|
126
|
+
isOptional,
|
|
127
|
+
isArray: false,
|
|
128
|
+
literalValue: literalType.value
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Handle arrays
|
|
133
|
+
if (this.checker.isArrayType(nonOptionalType)) {
|
|
134
|
+
const elementType = this.checker.getElementTypeOfArrayType(nonOptionalType);
|
|
135
|
+
return {
|
|
136
|
+
kind: 'array',
|
|
137
|
+
isOptional,
|
|
138
|
+
isArray: true,
|
|
139
|
+
elementType: this.convertTypeToInfo(elementType)
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Handle union types
|
|
144
|
+
if (nonOptionalType.flags & ts.TypeFlags.Union) {
|
|
145
|
+
const unionType = nonOptionalType as ts.UnionType;
|
|
146
|
+
return {
|
|
147
|
+
kind: 'union',
|
|
148
|
+
isOptional,
|
|
149
|
+
isArray: false,
|
|
150
|
+
unionTypes: unionType.types.map(t => this.convertTypeToInfo(t))
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Handle Record<K, V> types
|
|
155
|
+
if (this.isRecordType(nonOptionalType)) {
|
|
156
|
+
const recordInfo = this.getRecordTypeInfo(nonOptionalType);
|
|
157
|
+
return {
|
|
158
|
+
kind: 'record',
|
|
159
|
+
isOptional,
|
|
160
|
+
isArray: false,
|
|
161
|
+
keyType: recordInfo.keyType,
|
|
162
|
+
valueType: recordInfo.valueType
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Handle object types
|
|
167
|
+
if (nonOptionalType.flags & ts.TypeFlags.Object) {
|
|
168
|
+
const properties = this.getObjectProperties(nonOptionalType);
|
|
169
|
+
return {
|
|
170
|
+
kind: 'object',
|
|
171
|
+
isOptional,
|
|
172
|
+
isArray: false,
|
|
173
|
+
properties,
|
|
174
|
+
name: this.getTypeName(nonOptionalType)
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return {
|
|
179
|
+
kind: 'unknown',
|
|
180
|
+
isOptional,
|
|
181
|
+
isArray: false
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Check if type is optional (union with undefined)
|
|
187
|
+
*/
|
|
188
|
+
private isOptionalType(type: ts.Type): boolean {
|
|
189
|
+
if (type.flags & ts.TypeFlags.Union) {
|
|
190
|
+
const unionType = type as ts.UnionType;
|
|
191
|
+
return unionType.types.some(t => t.flags & ts.TypeFlags.Undefined);
|
|
192
|
+
}
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Get non-undefined type from optional union
|
|
198
|
+
*/
|
|
199
|
+
private getNonUndefinedType(type: ts.Type): ts.Type {
|
|
200
|
+
if (type.flags & ts.TypeFlags.Union) {
|
|
201
|
+
const unionType = type as ts.UnionType;
|
|
202
|
+
const nonUndefinedTypes = unionType.types.filter(t => !(t.flags & ts.TypeFlags.Undefined));
|
|
203
|
+
if (nonUndefinedTypes.length === 1) {
|
|
204
|
+
return nonUndefinedTypes[0];
|
|
205
|
+
}
|
|
206
|
+
// If multiple non-undefined types, return the union of them
|
|
207
|
+
return this.checker.getUnionType(nonUndefinedTypes);
|
|
208
|
+
}
|
|
209
|
+
return type;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Check if type is Record<K, V>
|
|
214
|
+
*/
|
|
215
|
+
private isRecordType(type: ts.Type): boolean {
|
|
216
|
+
const symbol = type.getSymbol();
|
|
217
|
+
return symbol?.getName() === 'Record' ||
|
|
218
|
+
(type.flags & ts.TypeFlags.Object && this.hasStringIndexSignature(type));
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Check if type has string index signature
|
|
223
|
+
*/
|
|
224
|
+
private hasStringIndexSignature(type: ts.Type): boolean {
|
|
225
|
+
const stringIndexType = this.checker.getIndexTypeOfType(type, ts.IndexKind.String);
|
|
226
|
+
return stringIndexType !== undefined;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Get Record<K, V> type information
|
|
231
|
+
*/
|
|
232
|
+
private getRecordTypeInfo(type: ts.Type): { keyType: string; valueType: string } {
|
|
233
|
+
if (type.symbol?.getName() === 'Record') {
|
|
234
|
+
// Handle Record<K, V> generic type
|
|
235
|
+
const typeArgs = this.checker.getTypeArguments(type as ts.TypeReference);
|
|
236
|
+
if (typeArgs && typeArgs.length >= 2) {
|
|
237
|
+
const keyTypeInfo = this.convertTypeToInfo(typeArgs[0]);
|
|
238
|
+
const valueTypeInfo = this.convertTypeToInfo(typeArgs[1]);
|
|
239
|
+
return {
|
|
240
|
+
keyType: this.typeInfoToSchemaString(keyTypeInfo),
|
|
241
|
+
valueType: this.typeInfoToSchemaString(valueTypeInfo)
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Handle object with string index signature
|
|
247
|
+
const stringIndexType = this.checker.getIndexTypeOfType(type, ts.IndexKind.String);
|
|
248
|
+
if (stringIndexType) {
|
|
249
|
+
const valueTypeInfo = this.convertTypeToInfo(stringIndexType);
|
|
250
|
+
return {
|
|
251
|
+
keyType: 'string',
|
|
252
|
+
valueType: this.typeInfoToSchemaString(valueTypeInfo)
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
return { keyType: 'string', valueType: 'any' };
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Get object properties
|
|
261
|
+
*/
|
|
262
|
+
private getObjectProperties(type: ts.Type): Record<string, TypeScriptTypeInfo> {
|
|
263
|
+
const properties: Record<string, TypeScriptTypeInfo> = {};
|
|
264
|
+
const symbol = type.getSymbol();
|
|
265
|
+
|
|
266
|
+
if (symbol) {
|
|
267
|
+
for (const prop of this.checker.getPropertiesOfType(type)) {
|
|
268
|
+
const propType = this.checker.getTypeOfSymbolAtLocation(prop, prop.valueDeclaration!);
|
|
269
|
+
properties[prop.getName()] = this.convertTypeToInfo(propType);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
return properties;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Get type name
|
|
278
|
+
*/
|
|
279
|
+
private getTypeName(type: ts.Type): string | undefined {
|
|
280
|
+
const symbol = type.getSymbol();
|
|
281
|
+
return symbol?.getName();
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Find type by name in source files
|
|
286
|
+
*/
|
|
287
|
+
private findTypeByName(typeName: string, sourceFile?: string): ts.Type | undefined {
|
|
288
|
+
const sourceFiles = sourceFile ?
|
|
289
|
+
[this.program.getSourceFile(sourceFile)].filter(Boolean) :
|
|
290
|
+
this.program.getSourceFiles();
|
|
291
|
+
|
|
292
|
+
for (const file of sourceFiles) {
|
|
293
|
+
if (!file) continue;
|
|
294
|
+
|
|
295
|
+
const result = this.findTypeInSourceFile(file, typeName);
|
|
296
|
+
if (result) return result;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
return undefined;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Find type in specific source file
|
|
304
|
+
*/
|
|
305
|
+
private findTypeInSourceFile(sourceFile: ts.SourceFile, typeName: string): ts.Type | undefined {
|
|
306
|
+
let foundType: ts.Type | undefined;
|
|
307
|
+
|
|
308
|
+
const visit = (node: ts.Node) => {
|
|
309
|
+
if (ts.isTypeAliasDeclaration(node) && node.name.text === typeName) {
|
|
310
|
+
foundType = this.checker.getTypeAtLocation(node.type);
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
if (ts.isInterfaceDeclaration(node) && node.name.text === typeName) {
|
|
314
|
+
foundType = this.checker.getTypeAtLocation(node);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
ts.forEachChild(node, visit);
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
visit(sourceFile);
|
|
321
|
+
return foundType;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Convert type info to schema string
|
|
326
|
+
*/
|
|
327
|
+
typeInfoToSchemaString(typeInfo: TypeScriptTypeInfo): string {
|
|
328
|
+
let schema = '';
|
|
329
|
+
|
|
330
|
+
switch (typeInfo.kind) {
|
|
331
|
+
case 'string':
|
|
332
|
+
schema = 'string';
|
|
333
|
+
break;
|
|
334
|
+
case 'number':
|
|
335
|
+
schema = 'number';
|
|
336
|
+
break;
|
|
337
|
+
case 'boolean':
|
|
338
|
+
schema = 'boolean';
|
|
339
|
+
break;
|
|
340
|
+
case 'array':
|
|
341
|
+
if (typeInfo.elementType) {
|
|
342
|
+
const elementSchema = this.typeInfoToSchemaString(typeInfo.elementType);
|
|
343
|
+
schema = `${elementSchema}[]`;
|
|
344
|
+
} else {
|
|
345
|
+
schema = 'any[]';
|
|
346
|
+
}
|
|
347
|
+
break;
|
|
348
|
+
case 'record':
|
|
349
|
+
schema = `record<${typeInfo.keyType || 'string'},${typeInfo.valueType || 'any'}>`;
|
|
350
|
+
break;
|
|
351
|
+
case 'union':
|
|
352
|
+
if (typeInfo.unionTypes) {
|
|
353
|
+
const unionSchemas = typeInfo.unionTypes
|
|
354
|
+
.filter(t => t.kind === 'literal')
|
|
355
|
+
.map(t => String(t.literalValue));
|
|
356
|
+
schema = unionSchemas.length > 0 ? unionSchemas.join('|') : 'any';
|
|
357
|
+
} else {
|
|
358
|
+
schema = 'any';
|
|
359
|
+
}
|
|
360
|
+
break;
|
|
361
|
+
case 'literal':
|
|
362
|
+
schema = String(typeInfo.literalValue);
|
|
363
|
+
break;
|
|
364
|
+
case 'object':
|
|
365
|
+
// For complex objects, return the type name or 'object'
|
|
366
|
+
schema = typeInfo.name || 'object';
|
|
367
|
+
break;
|
|
368
|
+
default:
|
|
369
|
+
schema = 'any';
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
if (typeInfo.isOptional) {
|
|
373
|
+
schema += '?';
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
return schema;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript Compiler API Integration
|
|
3
|
+
*
|
|
4
|
+
* This module uses TypeScript's compiler API to extract real type information
|
|
5
|
+
* and generate proper validation schemas at compile-time.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// Note: This would require TypeScript as a dependency
|
|
9
|
+
// import * as ts from 'typescript';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* TypeScript type information extracted via compiler API
|
|
13
|
+
*/
|
|
14
|
+
export interface TypeScriptTypeInfo {
|
|
15
|
+
kind: string;
|
|
16
|
+
name?: string;
|
|
17
|
+
isOptional: boolean;
|
|
18
|
+
isArray: boolean;
|
|
19
|
+
elementType?: TypeScriptTypeInfo;
|
|
20
|
+
properties?: Record<string, TypeScriptTypeInfo>;
|
|
21
|
+
unionTypes?: TypeScriptTypeInfo[];
|
|
22
|
+
literalValue?: string | number | boolean;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* TypeScript Compiler API Integration Class
|
|
27
|
+
*
|
|
28
|
+
* This would use the actual TypeScript compiler to introspect types
|
|
29
|
+
*/
|
|
30
|
+
export class TypeScriptCompilerIntegration {
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Extract type information from TypeScript type
|
|
34
|
+
* This would use ts.TypeChecker to get real type info
|
|
35
|
+
*/
|
|
36
|
+
static extractTypeInfo(typeName: string, sourceFile?: string): TypeScriptTypeInfo {
|
|
37
|
+
// TODO: Implement with actual TypeScript compiler API
|
|
38
|
+
//
|
|
39
|
+
// const program = ts.createProgram([sourceFile], {});
|
|
40
|
+
// const checker = program.getTypeChecker();
|
|
41
|
+
// const sourceFileNode = program.getSourceFile(sourceFile);
|
|
42
|
+
//
|
|
43
|
+
// // Find the type declaration
|
|
44
|
+
// const typeNode = findTypeDeclaration(sourceFileNode, typeName);
|
|
45
|
+
// const type = checker.getTypeAtLocation(typeNode);
|
|
46
|
+
//
|
|
47
|
+
// return this.convertTypeToInfo(type, checker);
|
|
48
|
+
|
|
49
|
+
// Placeholder implementation
|
|
50
|
+
return {
|
|
51
|
+
kind: 'unknown',
|
|
52
|
+
isOptional: false,
|
|
53
|
+
isArray: false
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Convert TypeScript type to schema string
|
|
59
|
+
*/
|
|
60
|
+
static typeInfoToSchema(typeInfo: TypeScriptTypeInfo): string {
|
|
61
|
+
switch (typeInfo.kind) {
|
|
62
|
+
case 'string':
|
|
63
|
+
return typeInfo.isOptional ? 'string?' : 'string';
|
|
64
|
+
case 'number':
|
|
65
|
+
return typeInfo.isOptional ? 'number?' : 'number';
|
|
66
|
+
case 'boolean':
|
|
67
|
+
return typeInfo.isOptional ? 'boolean?' : 'boolean';
|
|
68
|
+
case 'array':
|
|
69
|
+
if (typeInfo.elementType) {
|
|
70
|
+
const elementSchema = this.typeInfoToSchema(typeInfo.elementType);
|
|
71
|
+
return typeInfo.isOptional ? `${elementSchema}[]?` : `${elementSchema}[]`;
|
|
72
|
+
}
|
|
73
|
+
return typeInfo.isOptional ? 'any[]?' : 'any[]';
|
|
74
|
+
case 'object':
|
|
75
|
+
// For Record<string, T> types
|
|
76
|
+
if (typeInfo.name?.startsWith('Record')) {
|
|
77
|
+
// Extract Record<K, V> information
|
|
78
|
+
return typeInfo.isOptional ? 'record<string,any>?' : 'record<string,any>';
|
|
79
|
+
}
|
|
80
|
+
// For complex objects, we'd need to generate nested schemas
|
|
81
|
+
return typeInfo.isOptional ? 'any?' : 'any';
|
|
82
|
+
case 'union':
|
|
83
|
+
if (typeInfo.unionTypes) {
|
|
84
|
+
const unionValues = typeInfo.unionTypes
|
|
85
|
+
.filter(t => t.kind === 'literal')
|
|
86
|
+
.map(t => t.literalValue)
|
|
87
|
+
.join('|');
|
|
88
|
+
return typeInfo.isOptional ? `${unionValues}?` : unionValues;
|
|
89
|
+
}
|
|
90
|
+
return typeInfo.isOptional ? 'any?' : 'any';
|
|
91
|
+
case 'literal':
|
|
92
|
+
return String(typeInfo.literalValue);
|
|
93
|
+
default:
|
|
94
|
+
return typeInfo.isOptional ? 'any?' : 'any';
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Generate schema interface from TypeScript interface
|
|
100
|
+
*/
|
|
101
|
+
static generateSchemaFromInterface(interfaceName: string, sourceFile?: string): Record<string, string> {
|
|
102
|
+
const typeInfo = this.extractTypeInfo(interfaceName, sourceFile);
|
|
103
|
+
|
|
104
|
+
if (typeInfo.properties) {
|
|
105
|
+
const schema: Record<string, string> = {};
|
|
106
|
+
|
|
107
|
+
for (const [propName, propInfo] of Object.entries(typeInfo.properties)) {
|
|
108
|
+
schema[propName] = this.typeInfoToSchema(propInfo);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return schema;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return {};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Enhanced Make utilities with TypeScript Compiler API integration
|
|
120
|
+
*/
|
|
121
|
+
export class CompilerBasedMake {
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Generate schema from TypeScript type using compiler API
|
|
125
|
+
* This would provide REAL compile-time type-to-schema conversion
|
|
126
|
+
*/
|
|
127
|
+
static fromTypeCompiled<T>(typeName?: string): string {
|
|
128
|
+
if (typeName) {
|
|
129
|
+
// Use TypeScript compiler API to extract real type information
|
|
130
|
+
const typeInfo = TypeScriptCompilerIntegration.extractTypeInfo(typeName);
|
|
131
|
+
return TypeScriptCompilerIntegration.typeInfoToSchema(typeInfo);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Fallback to runtime detection if no type name provided
|
|
135
|
+
return 'any';
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Generate schema from TypeScript interface using compiler API
|
|
140
|
+
*/
|
|
141
|
+
static fromInterfaceCompiled<T>(interfaceName: string): Record<string, string> {
|
|
142
|
+
return TypeScriptCompilerIntegration.generateSchemaFromInterface(interfaceName);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* IMPLEMENTATION PLAN FOR REAL TYPESCRIPT COMPILER API INTEGRATION:
|
|
148
|
+
*
|
|
149
|
+
* 1. Add TypeScript as dependency:
|
|
150
|
+
* npm install typescript
|
|
151
|
+
*
|
|
152
|
+
* 2. Create build-time code generation:
|
|
153
|
+
* - Use TypeScript compiler API to analyze source files
|
|
154
|
+
* - Extract type information from interfaces/types
|
|
155
|
+
* - Generate schema definitions at build time
|
|
156
|
+
*
|
|
157
|
+
* 3. Integration approaches:
|
|
158
|
+
* a) Build-time plugin: Generate schema files during compilation
|
|
159
|
+
* b) Transformer plugin: Transform Make.fromType calls during compilation
|
|
160
|
+
* c) CLI tool: Generate schemas from TypeScript files
|
|
161
|
+
*
|
|
162
|
+
* 4. Example implementation with real TypeScript API:
|
|
163
|
+
*
|
|
164
|
+
* ```typescript
|
|
165
|
+
* import * as ts from 'typescript';
|
|
166
|
+
*
|
|
167
|
+
* function extractTypeInfo(typeNode: ts.TypeNode, checker: ts.TypeChecker): TypeScriptTypeInfo {
|
|
168
|
+
* const type = checker.getTypeAtLocation(typeNode);
|
|
169
|
+
*
|
|
170
|
+
* if (type.flags & ts.TypeFlags.String) {
|
|
171
|
+
* return { kind: 'string', isOptional: false, isArray: false };
|
|
172
|
+
* }
|
|
173
|
+
*
|
|
174
|
+
* if (type.flags & ts.TypeFlags.Number) {
|
|
175
|
+
* return { kind: 'number', isOptional: false, isArray: false };
|
|
176
|
+
* }
|
|
177
|
+
*
|
|
178
|
+
* if (checker.isArrayType(type)) {
|
|
179
|
+
* const elementType = checker.getElementTypeOfArrayType(type);
|
|
180
|
+
* return {
|
|
181
|
+
* kind: 'array',
|
|
182
|
+
* isArray: true,
|
|
183
|
+
* isOptional: false,
|
|
184
|
+
* elementType: extractTypeInfo(elementType.symbol?.valueDeclaration, checker)
|
|
185
|
+
* };
|
|
186
|
+
* }
|
|
187
|
+
*
|
|
188
|
+
* // Handle Record<K, V> types
|
|
189
|
+
* if (type.symbol?.name === 'Record') {
|
|
190
|
+
* const typeArgs = checker.getTypeArguments(type as ts.TypeReference);
|
|
191
|
+
* return {
|
|
192
|
+
* kind: 'object',
|
|
193
|
+
* name: 'Record',
|
|
194
|
+
* isOptional: false,
|
|
195
|
+
* isArray: false
|
|
196
|
+
* };
|
|
197
|
+
* }
|
|
198
|
+
*
|
|
199
|
+
* // Handle union types
|
|
200
|
+
* if (type.flags & ts.TypeFlags.Union) {
|
|
201
|
+
* const unionType = type as ts.UnionType;
|
|
202
|
+
* return {
|
|
203
|
+
* kind: 'union',
|
|
204
|
+
* isOptional: false,
|
|
205
|
+
* isArray: false,
|
|
206
|
+
* unionTypes: unionType.types.map(t => extractTypeInfo(t.symbol?.valueDeclaration, checker))
|
|
207
|
+
* };
|
|
208
|
+
* }
|
|
209
|
+
*
|
|
210
|
+
* return { kind: 'unknown', isOptional: false, isArray: false };
|
|
211
|
+
* }
|
|
212
|
+
* ```
|
|
213
|
+
*
|
|
214
|
+
* 5. Build integration:
|
|
215
|
+
* - Create a TypeScript transformer
|
|
216
|
+
* - Hook into the compilation process
|
|
217
|
+
* - Replace Make.fromType<T>() calls with actual schema strings
|
|
218
|
+
*
|
|
219
|
+
* This would provide REAL compile-time type-to-schema conversion!
|
|
220
|
+
*/
|