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,395 @@
|
|
|
1
|
+
# FortifyJS Schema System
|
|
2
|
+
|
|
3
|
+
A schema validation system with **TypeScript interface-like syntax** that's incredibly easy to use and completely separate from validators.
|
|
4
|
+
|
|
5
|
+
## 🎯 The Problem with Current Schema Libraries
|
|
6
|
+
|
|
7
|
+
**Zod, Joi, Yup** - they all suffer from the same issues:
|
|
8
|
+
|
|
9
|
+
- **Complex syntax** that doesn't feel natural
|
|
10
|
+
- **Verbose definitions** that are hard to read
|
|
11
|
+
- **Steep learning curves** for simple validation
|
|
12
|
+
- **Heavy bundle sizes** with unnecessary features
|
|
13
|
+
|
|
14
|
+
## 💡 Our Solution: Interface-Based Schemas
|
|
15
|
+
|
|
16
|
+
We created a schema system that **looks and feels exactly like TypeScript interfaces** but provides runtime validation:
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
// ❌ Zod (complex and verbose)
|
|
20
|
+
const UserSchema = z.object({
|
|
21
|
+
id: z.number().int().positive(),
|
|
22
|
+
email: z.string().email(),
|
|
23
|
+
name: z.string().min(2).max(50),
|
|
24
|
+
age: z.number().int().min(0).max(120).optional(),
|
|
25
|
+
isActive: z.boolean().default(true),
|
|
26
|
+
tags: z.array(z.string()).max(10).optional(),
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// ✅ FortifyJS Interface (clean and intuitive)
|
|
30
|
+
const UserSchema = Interface({
|
|
31
|
+
id: "number",
|
|
32
|
+
email: "email",
|
|
33
|
+
name: "string",
|
|
34
|
+
age: "number?", // Optional with ?
|
|
35
|
+
isActive: "boolean?", // Optional with smart defaults
|
|
36
|
+
tags: "string[]?", // Optional array
|
|
37
|
+
role: "=admin", // Constant values
|
|
38
|
+
});
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**It's literally that simple!** 🎉
|
|
42
|
+
|
|
43
|
+
## 🚀 Two Powerful Approaches
|
|
44
|
+
|
|
45
|
+
### 1. Interface-Based (Recommended)
|
|
46
|
+
|
|
47
|
+
**TypeScript interface syntax with runtime validation**
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import { Interface } from "reliant-type";
|
|
51
|
+
|
|
52
|
+
const UserSchema = Interface({
|
|
53
|
+
id: "number",
|
|
54
|
+
email: "email",
|
|
55
|
+
name: "string",
|
|
56
|
+
age: "number?", // Optional
|
|
57
|
+
isActive: "boolean?", // Optional
|
|
58
|
+
tags: "string[]?", // Optional array
|
|
59
|
+
role: "=admin", // Constant value
|
|
60
|
+
profile: {
|
|
61
|
+
// Nested object
|
|
62
|
+
bio: "string?",
|
|
63
|
+
avatar: "url?",
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 2. Fluent API (Traditional)
|
|
69
|
+
|
|
70
|
+
**Chainable method syntax for complex validation**
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
import { Schema } from "reliant-type";
|
|
74
|
+
|
|
75
|
+
const UserSchema = Schema.object({
|
|
76
|
+
id: Schema.number().int().positive(),
|
|
77
|
+
email: Schema.string().email(),
|
|
78
|
+
name: Schema.string().min(2).max(50),
|
|
79
|
+
age: Schema.number().int().min(0).max(120).optional(),
|
|
80
|
+
isActive: Schema.boolean().default(true),
|
|
81
|
+
});
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## 🎯 Why Interface-Based is Better
|
|
85
|
+
|
|
86
|
+
### ✅ Pros of Interface Syntax:
|
|
87
|
+
|
|
88
|
+
- **Instantly familiar** to TypeScript developers
|
|
89
|
+
- **Extremely readable** - looks like documentation
|
|
90
|
+
- **Minimal learning curve** - no new API to learn
|
|
91
|
+
- **Faster to write** - less typing, more intuitive
|
|
92
|
+
- **Self-documenting** - schema IS the documentation
|
|
93
|
+
|
|
94
|
+
### ❌ Cons of Traditional Fluent APIs:
|
|
95
|
+
|
|
96
|
+
- **Verbose and complex** - lots of chaining
|
|
97
|
+
- **Hard to read** - especially with nested objects
|
|
98
|
+
- **Learning curve** - need to memorize API methods
|
|
99
|
+
- **More typing** - repetitive method calls
|
|
100
|
+
|
|
101
|
+
## 📚 Interface Field Types
|
|
102
|
+
|
|
103
|
+
### Basic Types
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
{
|
|
107
|
+
name: "string", // String
|
|
108
|
+
age: "number", // Number
|
|
109
|
+
active: "boolean", // Boolean
|
|
110
|
+
created: "date", // Date
|
|
111
|
+
data: "any" // Any type
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Optional Fields (with `?`)
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
{
|
|
119
|
+
name: "string", // Required
|
|
120
|
+
age: "number?", // Optional
|
|
121
|
+
bio: "string?", // Optional
|
|
122
|
+
tags: "string[]?" // Optional array
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Format Validation
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
{
|
|
130
|
+
email: "email", // Email format
|
|
131
|
+
website: "url", // URL format
|
|
132
|
+
id: "uuid", // UUID format
|
|
133
|
+
phone: "phone", // Phone format
|
|
134
|
+
slug: "slug", // URL slug
|
|
135
|
+
username: "username" // Username format
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Number Types
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
{
|
|
143
|
+
id: "int", // Integer
|
|
144
|
+
count: "positive", // Positive number
|
|
145
|
+
price: "float", // Float number
|
|
146
|
+
rating: "number" // Any number
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Array Types
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
{
|
|
154
|
+
tags: "string[]", // Array of strings
|
|
155
|
+
scores: "number[]", // Array of numbers
|
|
156
|
+
flags: "boolean[]", // Array of booleans
|
|
157
|
+
ids: "int[]", // Array of integers
|
|
158
|
+
emails: "email[]", // Array of emails
|
|
159
|
+
urls: "url[]" // Array of URLs
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Constant Values (Safe Syntax)
|
|
164
|
+
|
|
165
|
+
```typescript
|
|
166
|
+
import { Make } from "reliant-type";
|
|
167
|
+
|
|
168
|
+
{
|
|
169
|
+
version: Make.const("1.0"), // Safe constant string
|
|
170
|
+
status: Make.const(200), // Safe constant number
|
|
171
|
+
type: Make.const("user"), // Safe constant value
|
|
172
|
+
enabled: Make.const(true) // Safe constant boolean
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Union Types (Multiple Allowed Values)
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
{
|
|
180
|
+
status: Make.union("pending", "accepted", "rejected"),
|
|
181
|
+
priority: Make.union("low", "medium", "high"),
|
|
182
|
+
role: Make.unionOptional("user", "admin", "moderator") // Optional union
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Nested Objects
|
|
187
|
+
|
|
188
|
+
```typescript
|
|
189
|
+
{
|
|
190
|
+
user: { // Nested object
|
|
191
|
+
name: "string",
|
|
192
|
+
email: "email"
|
|
193
|
+
},
|
|
194
|
+
address: { // Deeply nested
|
|
195
|
+
street: "string",
|
|
196
|
+
city: "string",
|
|
197
|
+
coordinates: {
|
|
198
|
+
lat: "number",
|
|
199
|
+
lng: "number"
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## 🔥 Real-World Examples
|
|
206
|
+
|
|
207
|
+
### User Registration
|
|
208
|
+
|
|
209
|
+
```typescript
|
|
210
|
+
const UserRegistrationSchema = Interface({
|
|
211
|
+
// Required fields
|
|
212
|
+
email: "email",
|
|
213
|
+
password: "string",
|
|
214
|
+
firstName: "string",
|
|
215
|
+
lastName: "string",
|
|
216
|
+
|
|
217
|
+
// Optional fields
|
|
218
|
+
age: "number?",
|
|
219
|
+
phone: "phone?",
|
|
220
|
+
website: "url?",
|
|
221
|
+
|
|
222
|
+
// Arrays
|
|
223
|
+
interests: "string[]?",
|
|
224
|
+
|
|
225
|
+
// Nested object
|
|
226
|
+
address: {
|
|
227
|
+
street: "string",
|
|
228
|
+
city: "string",
|
|
229
|
+
zipCode: "string",
|
|
230
|
+
country: "string",
|
|
231
|
+
},
|
|
232
|
+
|
|
233
|
+
// Safe constants
|
|
234
|
+
type: Make.const("user"),
|
|
235
|
+
version: Make.const("1.0"),
|
|
236
|
+
});
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### API Response
|
|
240
|
+
|
|
241
|
+
```typescript
|
|
242
|
+
const APIResponseSchema = Interface({
|
|
243
|
+
success: "boolean",
|
|
244
|
+
status: Make.const(200), // Safe constant status
|
|
245
|
+
data: {
|
|
246
|
+
users: [
|
|
247
|
+
{
|
|
248
|
+
// Array of objects
|
|
249
|
+
id: "int",
|
|
250
|
+
email: "email",
|
|
251
|
+
profile: {
|
|
252
|
+
name: "string",
|
|
253
|
+
avatar: "url?",
|
|
254
|
+
},
|
|
255
|
+
},
|
|
256
|
+
],
|
|
257
|
+
pagination: {
|
|
258
|
+
page: "int",
|
|
259
|
+
total: "int",
|
|
260
|
+
hasNext: "boolean",
|
|
261
|
+
},
|
|
262
|
+
},
|
|
263
|
+
errors: "string[]?",
|
|
264
|
+
timestamp: "date",
|
|
265
|
+
});
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Configuration
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
271
|
+
const ConfigSchema = Interface({
|
|
272
|
+
database: {
|
|
273
|
+
host: "string",
|
|
274
|
+
port: "int",
|
|
275
|
+
name: "string",
|
|
276
|
+
ssl: "boolean?",
|
|
277
|
+
},
|
|
278
|
+
server: {
|
|
279
|
+
port: "int",
|
|
280
|
+
cors: "boolean?",
|
|
281
|
+
},
|
|
282
|
+
features: {
|
|
283
|
+
auth: "boolean?",
|
|
284
|
+
logging: "boolean?",
|
|
285
|
+
},
|
|
286
|
+
environment: Make.const("production"), // Safe constant
|
|
287
|
+
});
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
## 🛠️ Validation Methods
|
|
291
|
+
|
|
292
|
+
### Parse (Throws on Error)
|
|
293
|
+
|
|
294
|
+
```typescript
|
|
295
|
+
try {
|
|
296
|
+
const user = UserSchema.parse(userData);
|
|
297
|
+
// user is fully typed and validated
|
|
298
|
+
} catch (error) {
|
|
299
|
+
console.error("Validation failed:", error.message);
|
|
300
|
+
}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### Safe Parse (Returns Result)
|
|
304
|
+
|
|
305
|
+
```typescript
|
|
306
|
+
const result = UserSchema.safeParse(userData);
|
|
307
|
+
|
|
308
|
+
if (result.success) {
|
|
309
|
+
console.log("Valid data:", result.data);
|
|
310
|
+
} else {
|
|
311
|
+
console.log("Errors:", result.errors);
|
|
312
|
+
console.log("Warnings:", result.warnings);
|
|
313
|
+
}
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
### Strict Mode
|
|
317
|
+
|
|
318
|
+
```typescript
|
|
319
|
+
const StrictSchema = Interface({
|
|
320
|
+
id: "number",
|
|
321
|
+
name: "string",
|
|
322
|
+
}).strict(); // No extra properties allowed
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
## 🛡️ Safer Syntax for Constants and Unions
|
|
326
|
+
|
|
327
|
+
### The Problem with Raw Values
|
|
328
|
+
|
|
329
|
+
```typescript
|
|
330
|
+
// ❌ DANGEROUS - Looks like a string type but it's actually a constant!
|
|
331
|
+
const BadSchema = Interface({
|
|
332
|
+
status: "pending", // Is this a string type or constant "pending"?
|
|
333
|
+
role: "=admin", // Very confusing and error-prone!
|
|
334
|
+
});
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
### The Solution - Make
|
|
338
|
+
|
|
339
|
+
```typescript
|
|
340
|
+
// ✅ SAFE - Crystal clear what's a type vs constant
|
|
341
|
+
import { Interface, Make } from "reliant-type";
|
|
342
|
+
|
|
343
|
+
const GoodSchema = Interface({
|
|
344
|
+
// Clear type definitions
|
|
345
|
+
name: "string",
|
|
346
|
+
email: "email",
|
|
347
|
+
|
|
348
|
+
// Clear constant values
|
|
349
|
+
status: Make.const("pending"),
|
|
350
|
+
role: Make.const("admin"),
|
|
351
|
+
|
|
352
|
+
// Clear union types (multiple allowed values)
|
|
353
|
+
priority: Make.union("low", "medium", "high"),
|
|
354
|
+
category: Make.unionOptional("tech", "business", "design"),
|
|
355
|
+
});
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
### Benefits of Make
|
|
359
|
+
|
|
360
|
+
- **🔒 Type Safety**: No confusion between types and constants
|
|
361
|
+
- **📖 Readability**: Crystal clear intent in your schemas
|
|
362
|
+
- **🐛 Bug Prevention**: Eliminates dangerous ambiguity
|
|
363
|
+
- **🔧 IntelliSense**: Better IDE support and autocomplete
|
|
364
|
+
|
|
365
|
+
## 📊 Comparison
|
|
366
|
+
|
|
367
|
+
| Feature | FortifyJS Interface | Zod | Joi |
|
|
368
|
+
| ------------------ | ------------------- | ----------- | ---------- |
|
|
369
|
+
| **Syntax** | TypeScript-like | Complex API | Verbose |
|
|
370
|
+
| **Learning Curve** | None | Steep | Moderate |
|
|
371
|
+
| **Readability** | Excellent | Poor | Fair |
|
|
372
|
+
| **Bundle Size** | Small | Large | Very Large |
|
|
373
|
+
| **Type Safety** | Full | Full | Limited |
|
|
374
|
+
| **Performance** | Fast | Slow | Slower |
|
|
375
|
+
|
|
376
|
+
## 🎉 Get Started
|
|
377
|
+
|
|
378
|
+
```bash
|
|
379
|
+
npm install reliant-type
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
```typescript
|
|
383
|
+
import { Interface } from "reliant-type";
|
|
384
|
+
|
|
385
|
+
const MySchema = Interface({
|
|
386
|
+
id: "number",
|
|
387
|
+
name: "string",
|
|
388
|
+
email: "email",
|
|
389
|
+
active: "boolean?",
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
const result = MySchema.safeParse(data);
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
**That's it!** No complex APIs to learn, no verbose syntax - just clean, readable schemas that work exactly like TypeScript interfaces! 🚀
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript Transformer for Schema Generation
|
|
3
|
+
*
|
|
4
|
+
* This transformer replaces Make.fromType<T>() calls with actual schema strings
|
|
5
|
+
* at compile time, providing true TypeScript-to-schema conversion.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import * as ts from 'typescript';
|
|
9
|
+
import { TypeAnalyzer } from './TypeAnalyzer';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Configuration for the schema transformer
|
|
13
|
+
*/
|
|
14
|
+
export interface TransformerConfig {
|
|
15
|
+
sourceFiles: string[];
|
|
16
|
+
compilerOptions?: ts.CompilerOptions;
|
|
17
|
+
debug?: boolean;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Create a TypeScript transformer that converts Make.fromType<T>() calls
|
|
22
|
+
* to actual schema strings at compile time
|
|
23
|
+
*/
|
|
24
|
+
export function createSchemaTransformer(config: TransformerConfig): ts.TransformerFactory<ts.SourceFile> {
|
|
25
|
+
const analyzer = new TypeAnalyzer(config.sourceFiles, config.compilerOptions);
|
|
26
|
+
|
|
27
|
+
return (context: ts.TransformationContext) => {
|
|
28
|
+
return (sourceFile: ts.SourceFile) => {
|
|
29
|
+
function visitor(node: ts.Node): ts.Node {
|
|
30
|
+
// Look for Make.fromType<T>() calls
|
|
31
|
+
if (ts.isCallExpression(node)) {
|
|
32
|
+
const result = transformMakeFromTypeCall(node, analyzer, config.debug);
|
|
33
|
+
if (result) {
|
|
34
|
+
if (config.debug) {
|
|
35
|
+
console.log(`🔄 Transformed: ${node.getText()} → ${result.getText()}`);
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Look for Make.fromInterface<T>() calls
|
|
42
|
+
if (ts.isCallExpression(node)) {
|
|
43
|
+
const result = transformMakeFromInterfaceCall(node, analyzer, config.debug);
|
|
44
|
+
if (result) {
|
|
45
|
+
if (config.debug) {
|
|
46
|
+
console.log(`🔄 Transformed: ${node.getText()} → ${result.getText()}`);
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return ts.visitEachChild(node, visitor, context);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return ts.visitNode(sourceFile, visitor) as ts.SourceFile;
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Transform Make.fromType<T>() calls to schema strings
|
|
62
|
+
*/
|
|
63
|
+
function transformMakeFromTypeCall(
|
|
64
|
+
node: ts.CallExpression,
|
|
65
|
+
analyzer: TypeAnalyzer,
|
|
66
|
+
debug?: boolean
|
|
67
|
+
): ts.StringLiteral | null {
|
|
68
|
+
// Check if this is a Make.fromType call
|
|
69
|
+
if (!isMakeFromTypeCall(node)) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Extract the type argument
|
|
74
|
+
const typeArgument = node.typeArguments?.[0];
|
|
75
|
+
if (!typeArgument) {
|
|
76
|
+
if (debug) {
|
|
77
|
+
console.warn('⚠️ Make.fromType call without type argument');
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Check if there are runtime arguments (sample data)
|
|
83
|
+
if (node.arguments.length > 0) {
|
|
84
|
+
// Has sample data - let runtime handle it
|
|
85
|
+
if (debug) {
|
|
86
|
+
console.log('ℹ️ Make.fromType has sample data - skipping transformation');
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
try {
|
|
92
|
+
// Analyze the type and generate schema
|
|
93
|
+
const typeInfo = analyzer.analyzeTypeFromNode(typeArgument);
|
|
94
|
+
const schemaString = analyzer.typeInfoToSchemaString(typeInfo);
|
|
95
|
+
|
|
96
|
+
if (debug) {
|
|
97
|
+
console.log(`✅ Generated schema: ${schemaString} for type: ${typeArgument.getText()}`);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Return the schema string literal
|
|
101
|
+
return ts.factory.createStringLiteral(schemaString);
|
|
102
|
+
} catch (error) {
|
|
103
|
+
if (debug) {
|
|
104
|
+
console.error(`❌ Failed to transform Make.fromType:`, error);
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Transform Make.fromInterface<T>() calls to schema objects
|
|
112
|
+
*/
|
|
113
|
+
function transformMakeFromInterfaceCall(
|
|
114
|
+
node: ts.CallExpression,
|
|
115
|
+
analyzer: TypeAnalyzer,
|
|
116
|
+
debug?: boolean
|
|
117
|
+
): ts.ObjectLiteralExpression | null {
|
|
118
|
+
// Check if this is a Make.fromInterface call
|
|
119
|
+
if (!isMakeFromInterfaceCall(node)) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Extract the type argument
|
|
124
|
+
const typeArgument = node.typeArguments?.[0];
|
|
125
|
+
if (!typeArgument) {
|
|
126
|
+
if (debug) {
|
|
127
|
+
console.warn('⚠️ Make.fromInterface call without type argument');
|
|
128
|
+
}
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Check if there are runtime arguments (sample data)
|
|
133
|
+
if (node.arguments.length > 0) {
|
|
134
|
+
// Has sample data - let runtime handle it
|
|
135
|
+
if (debug) {
|
|
136
|
+
console.log('ℹ️ Make.fromInterface has sample data - skipping transformation');
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
try {
|
|
142
|
+
// Analyze the type and generate schema object
|
|
143
|
+
const typeInfo = analyzer.analyzeTypeFromNode(typeArgument);
|
|
144
|
+
|
|
145
|
+
if (typeInfo.kind === 'object' && typeInfo.properties) {
|
|
146
|
+
// Generate object literal with schema properties
|
|
147
|
+
const properties: ts.PropertyAssignment[] = [];
|
|
148
|
+
|
|
149
|
+
for (const [propName, propInfo] of Object.entries(typeInfo.properties)) {
|
|
150
|
+
const schemaString = analyzer.typeInfoToSchemaString(propInfo);
|
|
151
|
+
properties.push(
|
|
152
|
+
ts.factory.createPropertyAssignment(
|
|
153
|
+
ts.factory.createStringLiteral(propName),
|
|
154
|
+
ts.factory.createStringLiteral(schemaString)
|
|
155
|
+
)
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (debug) {
|
|
160
|
+
console.log(`✅ Generated interface schema for: ${typeArgument.getText()}`);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return ts.factory.createObjectLiteralExpression(properties, true);
|
|
164
|
+
} else {
|
|
165
|
+
if (debug) {
|
|
166
|
+
console.warn(`⚠️ Type is not an object interface: ${typeArgument.getText()}`);
|
|
167
|
+
}
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
} catch (error) {
|
|
171
|
+
if (debug) {
|
|
172
|
+
console.error(`❌ Failed to transform Make.fromInterface:`, error);
|
|
173
|
+
}
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Check if a call expression is Make.fromType<T>()
|
|
180
|
+
*/
|
|
181
|
+
function isMakeFromTypeCall(node: ts.CallExpression): boolean {
|
|
182
|
+
// Check for Make.fromType pattern
|
|
183
|
+
if (ts.isPropertyAccessExpression(node.expression)) {
|
|
184
|
+
const { expression, name } = node.expression;
|
|
185
|
+
return ts.isIdentifier(expression) &&
|
|
186
|
+
expression.text === 'Make' &&
|
|
187
|
+
name.text === 'fromType';
|
|
188
|
+
}
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Check if a call expression is Make.fromInterface<T>()
|
|
194
|
+
*/
|
|
195
|
+
function isMakeFromInterfaceCall(node: ts.CallExpression): boolean {
|
|
196
|
+
// Check for Make.fromInterface pattern
|
|
197
|
+
if (ts.isPropertyAccessExpression(node.expression)) {
|
|
198
|
+
const { expression, name } = node.expression;
|
|
199
|
+
return ts.isIdentifier(expression) &&
|
|
200
|
+
expression.text === 'Make' &&
|
|
201
|
+
name.text === 'fromInterface';
|
|
202
|
+
}
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Utility function to transform TypeScript files with the schema transformer
|
|
208
|
+
*/
|
|
209
|
+
export function transformSourceFile(
|
|
210
|
+
sourceFile: ts.SourceFile,
|
|
211
|
+
config: TransformerConfig
|
|
212
|
+
): ts.SourceFile {
|
|
213
|
+
const transformer = createSchemaTransformer(config);
|
|
214
|
+
const transformationContext: ts.TransformationContext = {
|
|
215
|
+
getCompilerOptions: () => config.compilerOptions || {},
|
|
216
|
+
startLexicalEnvironment: () => {},
|
|
217
|
+
suspendLexicalEnvironment: () => {},
|
|
218
|
+
resumeLexicalEnvironment: () => {},
|
|
219
|
+
endLexicalEnvironment: () => [],
|
|
220
|
+
hoistFunctionDeclaration: () => {},
|
|
221
|
+
hoistVariableDeclaration: () => {},
|
|
222
|
+
requestEmitHelper: () => {},
|
|
223
|
+
readEmitHelpers: () => [],
|
|
224
|
+
enableSubstitution: () => {},
|
|
225
|
+
isSubstitutionEnabled: () => false,
|
|
226
|
+
onSubstituteNode: (hint, node) => node,
|
|
227
|
+
enableEmitNotification: () => {},
|
|
228
|
+
isEmitNotificationEnabled: () => false,
|
|
229
|
+
onEmitNode: () => {},
|
|
230
|
+
factory: ts.factory
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
const result = transformer(transformationContext)(sourceFile);
|
|
234
|
+
return result;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Transform multiple source files
|
|
239
|
+
*/
|
|
240
|
+
export function transformFiles(filePaths: string[], config: Partial<TransformerConfig> = {}): void {
|
|
241
|
+
const fullConfig: TransformerConfig = {
|
|
242
|
+
sourceFiles: filePaths,
|
|
243
|
+
debug: true,
|
|
244
|
+
...config
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
const program = ts.createProgram(filePaths, fullConfig.compilerOptions || {});
|
|
248
|
+
|
|
249
|
+
for (const sourceFile of program.getSourceFiles()) {
|
|
250
|
+
if (filePaths.includes(sourceFile.fileName)) {
|
|
251
|
+
console.log(`🔄 Transforming: ${sourceFile.fileName}`);
|
|
252
|
+
|
|
253
|
+
const transformed = transformSourceFile(sourceFile, fullConfig);
|
|
254
|
+
|
|
255
|
+
// Print the transformed result (in a real implementation, you'd write to file)
|
|
256
|
+
const printer = ts.createPrinter();
|
|
257
|
+
const result = printer.printFile(transformed);
|
|
258
|
+
|
|
259
|
+
console.log(`✅ Transformed result:\n${result}`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* CLI utility for testing the transformer
|
|
266
|
+
*/
|
|
267
|
+
export function runTransformerCLI(): void {
|
|
268
|
+
const args = process.argv.slice(2);
|
|
269
|
+
|
|
270
|
+
if (args.length === 0) {
|
|
271
|
+
console.log('Usage: node transformer.js <file1.ts> [file2.ts] ...');
|
|
272
|
+
process.exit(1);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
console.log('🚀 Running Schema Transformer');
|
|
276
|
+
console.log('============================');
|
|
277
|
+
|
|
278
|
+
transformFiles(args, { debug: true });
|
|
279
|
+
}
|