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.
Files changed (345) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1305 -0
  3. package/dist/cjs/constants/SECURITY_CONSTANTS.js +49 -0
  4. package/dist/cjs/constants/SECURITY_CONSTANTS.js.map +1 -0
  5. package/dist/cjs/constants/VALIDATION_CONSTANTS.js +103 -0
  6. package/dist/cjs/constants/VALIDATION_CONSTANTS.js.map +1 -0
  7. package/dist/cjs/core/schema/extensions/SmartInference.js +200 -0
  8. package/dist/cjs/core/schema/extensions/SmartInference.js.map +1 -0
  9. package/dist/cjs/core/schema/extensions/components/AutoDocumentation/Docs.js +100 -0
  10. package/dist/cjs/core/schema/extensions/components/AutoDocumentation/Docs.js.map +1 -0
  11. package/dist/cjs/core/schema/extensions/components/AutoDocumentation/DocumentationGenerator.js +192 -0
  12. package/dist/cjs/core/schema/extensions/components/AutoDocumentation/DocumentationGenerator.js.map +1 -0
  13. package/dist/cjs/core/schema/extensions/components/AutoDocumentation/InteractiveDocumentationGenerator.js +174 -0
  14. package/dist/cjs/core/schema/extensions/components/AutoDocumentation/InteractiveDocumentationGenerator.js.map +1 -0
  15. package/dist/cjs/core/schema/extensions/components/AutoDocumentation/SchemaAnalyzer.js +54 -0
  16. package/dist/cjs/core/schema/extensions/components/AutoDocumentation/SchemaAnalyzer.js.map +1 -0
  17. package/dist/cjs/core/schema/extensions/components/AutoDocumentation/TypeScriptGenerator.js +50 -0
  18. package/dist/cjs/core/schema/extensions/components/AutoDocumentation/TypeScriptGenerator.js.map +1 -0
  19. package/dist/cjs/core/schema/extensions/components/AutoDocumentation/index.js +15 -0
  20. package/dist/cjs/core/schema/extensions/components/AutoDocumentation/index.js.map +1 -0
  21. package/dist/cjs/core/schema/extensions/components/ConditionalValidation/ConditionalBuilder.js +70 -0
  22. package/dist/cjs/core/schema/extensions/components/ConditionalValidation/ConditionalBuilder.js.map +1 -0
  23. package/dist/cjs/core/schema/extensions/components/ConditionalValidation/ConditionalElse.js +40 -0
  24. package/dist/cjs/core/schema/extensions/components/ConditionalValidation/ConditionalElse.js.map +1 -0
  25. package/dist/cjs/core/schema/extensions/components/ConditionalValidation/ConditionalThen.js +19 -0
  26. package/dist/cjs/core/schema/extensions/components/ConditionalValidation/ConditionalThen.js.map +1 -0
  27. package/dist/cjs/core/schema/extensions/components/ConditionalValidation/MultiConditionalBuilder.js +20 -0
  28. package/dist/cjs/core/schema/extensions/components/ConditionalValidation/MultiConditionalBuilder.js.map +1 -0
  29. package/dist/cjs/core/schema/extensions/components/ConditionalValidation/MultiConditionalThen.js +49 -0
  30. package/dist/cjs/core/schema/extensions/components/ConditionalValidation/MultiConditionalThen.js.map +1 -0
  31. package/dist/cjs/core/schema/extensions/components/ConditionalValidation/index.js +98 -0
  32. package/dist/cjs/core/schema/extensions/components/ConditionalValidation/index.js.map +1 -0
  33. package/dist/cjs/core/schema/extensions/components/RealtimeValidation/FormValidator.js +85 -0
  34. package/dist/cjs/core/schema/extensions/components/RealtimeValidation/FormValidator.js.map +1 -0
  35. package/dist/cjs/core/schema/extensions/components/RealtimeValidation/LiveValidator.js +133 -0
  36. package/dist/cjs/core/schema/extensions/components/RealtimeValidation/LiveValidator.js.map +1 -0
  37. package/dist/cjs/core/schema/extensions/components/RealtimeValidation/StreamValidator.js +351 -0
  38. package/dist/cjs/core/schema/extensions/components/RealtimeValidation/StreamValidator.js.map +1 -0
  39. package/dist/cjs/core/schema/extensions/components/RealtimeValidation/index.js +109 -0
  40. package/dist/cjs/core/schema/extensions/components/RealtimeValidation/index.js.map +1 -0
  41. package/dist/cjs/core/schema/extensions/index.js +61 -0
  42. package/dist/cjs/core/schema/extensions/index.js.map +1 -0
  43. package/dist/cjs/core/schema/extensions/mods/index.js +51 -0
  44. package/dist/cjs/core/schema/extensions/mods/index.js.map +1 -0
  45. package/dist/cjs/core/schema/extensions/mods/openapi-converter.js +227 -0
  46. package/dist/cjs/core/schema/extensions/mods/openapi-converter.js.map +1 -0
  47. package/dist/cjs/core/schema/extensions/mods/typescript-generator.js +287 -0
  48. package/dist/cjs/core/schema/extensions/mods/typescript-generator.js.map +1 -0
  49. package/dist/cjs/core/schema/extensions/mods/validation-engine.js +224 -0
  50. package/dist/cjs/core/schema/extensions/mods/validation-engine.js.map +1 -0
  51. package/dist/cjs/core/schema/mode/interfaces/Interface.js +277 -0
  52. package/dist/cjs/core/schema/mode/interfaces/Interface.js.map +1 -0
  53. package/dist/cjs/core/schema/mode/interfaces/InterfaceSchema.js +1431 -0
  54. package/dist/cjs/core/schema/mode/interfaces/InterfaceSchema.js.map +1 -0
  55. package/dist/cjs/core/schema/mode/interfaces/conditional/evaluator/ConditionalEvaluator.js +520 -0
  56. package/dist/cjs/core/schema/mode/interfaces/conditional/evaluator/ConditionalEvaluator.js.map +1 -0
  57. package/dist/cjs/core/schema/mode/interfaces/conditional/parser/ConditionalAST.js +624 -0
  58. package/dist/cjs/core/schema/mode/interfaces/conditional/parser/ConditionalAST.js.map +1 -0
  59. package/dist/cjs/core/schema/mode/interfaces/conditional/parser/ConditionalLexer.js +811 -0
  60. package/dist/cjs/core/schema/mode/interfaces/conditional/parser/ConditionalLexer.js.map +1 -0
  61. package/dist/cjs/core/schema/mode/interfaces/conditional/parser/ConditionalParser.js +599 -0
  62. package/dist/cjs/core/schema/mode/interfaces/conditional/parser/ConditionalParser.js.map +1 -0
  63. package/dist/cjs/core/schema/mode/interfaces/conditional/types/ConditionalTypes.js +89 -0
  64. package/dist/cjs/core/schema/mode/interfaces/conditional/types/ConditionalTypes.js.map +1 -0
  65. package/dist/cjs/core/schema/mode/interfaces/errors/ErrorHandler.js +356 -0
  66. package/dist/cjs/core/schema/mode/interfaces/errors/ErrorHandler.js.map +1 -0
  67. package/dist/cjs/core/schema/mode/interfaces/errors/types/errors.type.js +80 -0
  68. package/dist/cjs/core/schema/mode/interfaces/errors/types/errors.type.js.map +1 -0
  69. package/dist/cjs/core/schema/mode/interfaces/precompilation/FieldPrecompilers.js +778 -0
  70. package/dist/cjs/core/schema/mode/interfaces/precompilation/FieldPrecompilers.js.map +1 -0
  71. package/dist/cjs/core/schema/mode/interfaces/precompilation/SchemaPrecompiler.js +523 -0
  72. package/dist/cjs/core/schema/mode/interfaces/precompilation/SchemaPrecompiler.js.map +1 -0
  73. package/dist/cjs/core/schema/mode/interfaces/typescript/ConditionalTypes.js +681 -0
  74. package/dist/cjs/core/schema/mode/interfaces/typescript/ConditionalTypes.js.map +1 -0
  75. package/dist/cjs/core/schema/mode/interfaces/typescript/IDESupport.js +430 -0
  76. package/dist/cjs/core/schema/mode/interfaces/typescript/IDESupport.js.map +1 -0
  77. package/dist/cjs/core/schema/mode/interfaces/typescript/TypeInference.js +225 -0
  78. package/dist/cjs/core/schema/mode/interfaces/typescript/TypeInference.js.map +1 -0
  79. package/dist/cjs/core/schema/mode/interfaces/typescript/index.js +44 -0
  80. package/dist/cjs/core/schema/mode/interfaces/typescript/index.js.map +1 -0
  81. package/dist/cjs/core/schema/mode/interfaces/validators/ConstraintParser.js +1134 -0
  82. package/dist/cjs/core/schema/mode/interfaces/validators/ConstraintParser.js.map +1 -0
  83. package/dist/cjs/core/schema/mode/interfaces/validators/TypeGuards.js +256 -0
  84. package/dist/cjs/core/schema/mode/interfaces/validators/TypeGuards.js.map +1 -0
  85. package/dist/cjs/core/schema/mode/interfaces/validators/TypeValidators.js +429 -0
  86. package/dist/cjs/core/schema/mode/interfaces/validators/TypeValidators.js.map +1 -0
  87. package/dist/cjs/core/schema/mode/interfaces/validators/UnionCache.js +404 -0
  88. package/dist/cjs/core/schema/mode/interfaces/validators/UnionCache.js.map +1 -0
  89. package/dist/cjs/core/schema/mode/interfaces/validators/ValidationHelpers.js +851 -0
  90. package/dist/cjs/core/schema/mode/interfaces/validators/ValidationHelpers.js.map +1 -0
  91. package/dist/cjs/core/schema/mode/interfaces/validators/mods/passValidator.js +262 -0
  92. package/dist/cjs/core/schema/mode/interfaces/validators/mods/passValidator.js.map +1 -0
  93. package/dist/cjs/core/schema/mode/interfaces/validators/mods/securityValidator.js +887 -0
  94. package/dist/cjs/core/schema/mode/interfaces/validators/mods/securityValidator.js.map +1 -0
  95. package/dist/cjs/core/schema/mode/interfaces/validators/mods/urlValidation.js +191 -0
  96. package/dist/cjs/core/schema/mode/interfaces/validators/mods/urlValidation.js.map +1 -0
  97. package/dist/cjs/core/schema/optimization/ObjectValidationCache.js +462 -0
  98. package/dist/cjs/core/schema/optimization/ObjectValidationCache.js.map +1 -0
  99. package/dist/cjs/core/schema/optimization/PerformanceMonitor.js +773 -0
  100. package/dist/cjs/core/schema/optimization/PerformanceMonitor.js.map +1 -0
  101. package/dist/cjs/core/schema/optimization/SchemaCompiler.js +600 -0
  102. package/dist/cjs/core/schema/optimization/SchemaCompiler.js.map +1 -0
  103. package/dist/cjs/core/types/ValidatorTypes.js +70 -0
  104. package/dist/cjs/core/types/ValidatorTypes.js.map +1 -0
  105. package/dist/cjs/core/types/parser.type.js +12 -0
  106. package/dist/cjs/core/types/parser.type.js.map +1 -0
  107. package/dist/cjs/core/utils/Make.js +61 -0
  108. package/dist/cjs/core/utils/Make.js.map +1 -0
  109. package/dist/cjs/core/utils/Mod.js +1033 -0
  110. package/dist/cjs/core/utils/Mod.js.map +1 -0
  111. package/dist/cjs/core/utils/UrlArgs.js +102 -0
  112. package/dist/cjs/core/utils/UrlArgs.js.map +1 -0
  113. package/dist/cjs/core/utils/arrayToEnum.js +18 -0
  114. package/dist/cjs/core/utils/arrayToEnum.js.map +1 -0
  115. package/dist/cjs/core/utils/createUrlArgsEnumFArray.js +13 -0
  116. package/dist/cjs/core/utils/createUrlArgsEnumFArray.js.map +1 -0
  117. package/dist/cjs/core/utils/securityHelpers.js +215 -0
  118. package/dist/cjs/core/utils/securityHelpers.js.map +1 -0
  119. package/dist/cjs/core/utils/securityValidatorHelpers.js +65 -0
  120. package/dist/cjs/core/utils/securityValidatorHelpers.js.map +1 -0
  121. package/dist/cjs/index.js +31 -0
  122. package/dist/cjs/index.js.map +1 -0
  123. package/dist/cjs/package.json +3 -0
  124. package/dist/esm/constants/SECURITY_CONSTANTS.js +47 -0
  125. package/dist/esm/constants/SECURITY_CONSTANTS.js.map +1 -0
  126. package/dist/esm/constants/VALIDATION_CONSTANTS.js +98 -0
  127. package/dist/esm/constants/VALIDATION_CONSTANTS.js.map +1 -0
  128. package/dist/esm/core/schema/extensions/SmartInference.js +197 -0
  129. package/dist/esm/core/schema/extensions/SmartInference.js.map +1 -0
  130. package/dist/esm/core/schema/extensions/components/AutoDocumentation/Docs.js +98 -0
  131. package/dist/esm/core/schema/extensions/components/AutoDocumentation/Docs.js.map +1 -0
  132. package/dist/esm/core/schema/extensions/components/AutoDocumentation/DocumentationGenerator.js +190 -0
  133. package/dist/esm/core/schema/extensions/components/AutoDocumentation/DocumentationGenerator.js.map +1 -0
  134. package/dist/esm/core/schema/extensions/components/AutoDocumentation/InteractiveDocumentationGenerator.js +172 -0
  135. package/dist/esm/core/schema/extensions/components/AutoDocumentation/InteractiveDocumentationGenerator.js.map +1 -0
  136. package/dist/esm/core/schema/extensions/components/AutoDocumentation/SchemaAnalyzer.js +52 -0
  137. package/dist/esm/core/schema/extensions/components/AutoDocumentation/SchemaAnalyzer.js.map +1 -0
  138. package/dist/esm/core/schema/extensions/components/AutoDocumentation/TypeScriptGenerator.js +48 -0
  139. package/dist/esm/core/schema/extensions/components/AutoDocumentation/TypeScriptGenerator.js.map +1 -0
  140. package/dist/esm/core/schema/extensions/components/AutoDocumentation/index.js +12 -0
  141. package/dist/esm/core/schema/extensions/components/AutoDocumentation/index.js.map +1 -0
  142. package/dist/esm/core/schema/extensions/components/ConditionalValidation/ConditionalBuilder.js +68 -0
  143. package/dist/esm/core/schema/extensions/components/ConditionalValidation/ConditionalBuilder.js.map +1 -0
  144. package/dist/esm/core/schema/extensions/components/ConditionalValidation/ConditionalElse.js +38 -0
  145. package/dist/esm/core/schema/extensions/components/ConditionalValidation/ConditionalElse.js.map +1 -0
  146. package/dist/esm/core/schema/extensions/components/ConditionalValidation/ConditionalThen.js +17 -0
  147. package/dist/esm/core/schema/extensions/components/ConditionalValidation/ConditionalThen.js.map +1 -0
  148. package/dist/esm/core/schema/extensions/components/ConditionalValidation/MultiConditionalBuilder.js +18 -0
  149. package/dist/esm/core/schema/extensions/components/ConditionalValidation/MultiConditionalBuilder.js.map +1 -0
  150. package/dist/esm/core/schema/extensions/components/ConditionalValidation/MultiConditionalThen.js +45 -0
  151. package/dist/esm/core/schema/extensions/components/ConditionalValidation/MultiConditionalThen.js.map +1 -0
  152. package/dist/esm/core/schema/extensions/components/ConditionalValidation/index.js +92 -0
  153. package/dist/esm/core/schema/extensions/components/ConditionalValidation/index.js.map +1 -0
  154. package/dist/esm/core/schema/extensions/components/RealtimeValidation/FormValidator.js +83 -0
  155. package/dist/esm/core/schema/extensions/components/RealtimeValidation/FormValidator.js.map +1 -0
  156. package/dist/esm/core/schema/extensions/components/RealtimeValidation/LiveValidator.js +131 -0
  157. package/dist/esm/core/schema/extensions/components/RealtimeValidation/LiveValidator.js.map +1 -0
  158. package/dist/esm/core/schema/extensions/components/RealtimeValidation/StreamValidator.js +349 -0
  159. package/dist/esm/core/schema/extensions/components/RealtimeValidation/StreamValidator.js.map +1 -0
  160. package/dist/esm/core/schema/extensions/components/RealtimeValidation/index.js +103 -0
  161. package/dist/esm/core/schema/extensions/components/RealtimeValidation/index.js.map +1 -0
  162. package/dist/esm/core/schema/extensions/index.js +53 -0
  163. package/dist/esm/core/schema/extensions/index.js.map +1 -0
  164. package/dist/esm/core/schema/extensions/mods/index.js +47 -0
  165. package/dist/esm/core/schema/extensions/mods/index.js.map +1 -0
  166. package/dist/esm/core/schema/extensions/mods/openapi-converter.js +225 -0
  167. package/dist/esm/core/schema/extensions/mods/openapi-converter.js.map +1 -0
  168. package/dist/esm/core/schema/extensions/mods/typescript-generator.js +284 -0
  169. package/dist/esm/core/schema/extensions/mods/typescript-generator.js.map +1 -0
  170. package/dist/esm/core/schema/extensions/mods/validation-engine.js +222 -0
  171. package/dist/esm/core/schema/extensions/mods/validation-engine.js.map +1 -0
  172. package/dist/esm/core/schema/mode/interfaces/Interface.js +269 -0
  173. package/dist/esm/core/schema/mode/interfaces/Interface.js.map +1 -0
  174. package/dist/esm/core/schema/mode/interfaces/InterfaceSchema.js +1429 -0
  175. package/dist/esm/core/schema/mode/interfaces/InterfaceSchema.js.map +1 -0
  176. package/dist/esm/core/schema/mode/interfaces/conditional/evaluator/ConditionalEvaluator.js +518 -0
  177. package/dist/esm/core/schema/mode/interfaces/conditional/evaluator/ConditionalEvaluator.js.map +1 -0
  178. package/dist/esm/core/schema/mode/interfaces/conditional/parser/ConditionalAST.js +620 -0
  179. package/dist/esm/core/schema/mode/interfaces/conditional/parser/ConditionalAST.js.map +1 -0
  180. package/dist/esm/core/schema/mode/interfaces/conditional/parser/ConditionalLexer.js +809 -0
  181. package/dist/esm/core/schema/mode/interfaces/conditional/parser/ConditionalLexer.js.map +1 -0
  182. package/dist/esm/core/schema/mode/interfaces/conditional/parser/ConditionalParser.js +597 -0
  183. package/dist/esm/core/schema/mode/interfaces/conditional/parser/ConditionalParser.js.map +1 -0
  184. package/dist/esm/core/schema/mode/interfaces/conditional/types/ConditionalTypes.js +89 -0
  185. package/dist/esm/core/schema/mode/interfaces/conditional/types/ConditionalTypes.js.map +1 -0
  186. package/dist/esm/core/schema/mode/interfaces/errors/ErrorHandler.js +354 -0
  187. package/dist/esm/core/schema/mode/interfaces/errors/ErrorHandler.js.map +1 -0
  188. package/dist/esm/core/schema/mode/interfaces/errors/types/errors.type.js +80 -0
  189. package/dist/esm/core/schema/mode/interfaces/errors/types/errors.type.js.map +1 -0
  190. package/dist/esm/core/schema/mode/interfaces/precompilation/FieldPrecompilers.js +776 -0
  191. package/dist/esm/core/schema/mode/interfaces/precompilation/FieldPrecompilers.js.map +1 -0
  192. package/dist/esm/core/schema/mode/interfaces/precompilation/SchemaPrecompiler.js +521 -0
  193. package/dist/esm/core/schema/mode/interfaces/precompilation/SchemaPrecompiler.js.map +1 -0
  194. package/dist/esm/core/schema/mode/interfaces/typescript/ConditionalTypes.js +681 -0
  195. package/dist/esm/core/schema/mode/interfaces/typescript/ConditionalTypes.js.map +1 -0
  196. package/dist/esm/core/schema/mode/interfaces/typescript/IDESupport.js +428 -0
  197. package/dist/esm/core/schema/mode/interfaces/typescript/IDESupport.js.map +1 -0
  198. package/dist/esm/core/schema/mode/interfaces/typescript/TypeInference.js +223 -0
  199. package/dist/esm/core/schema/mode/interfaces/typescript/TypeInference.js.map +1 -0
  200. package/dist/esm/core/schema/mode/interfaces/typescript/index.js +35 -0
  201. package/dist/esm/core/schema/mode/interfaces/typescript/index.js.map +1 -0
  202. package/dist/esm/core/schema/mode/interfaces/validators/ConstraintParser.js +1132 -0
  203. package/dist/esm/core/schema/mode/interfaces/validators/ConstraintParser.js.map +1 -0
  204. package/dist/esm/core/schema/mode/interfaces/validators/TypeGuards.js +254 -0
  205. package/dist/esm/core/schema/mode/interfaces/validators/TypeGuards.js.map +1 -0
  206. package/dist/esm/core/schema/mode/interfaces/validators/TypeValidators.js +427 -0
  207. package/dist/esm/core/schema/mode/interfaces/validators/TypeValidators.js.map +1 -0
  208. package/dist/esm/core/schema/mode/interfaces/validators/UnionCache.js +400 -0
  209. package/dist/esm/core/schema/mode/interfaces/validators/UnionCache.js.map +1 -0
  210. package/dist/esm/core/schema/mode/interfaces/validators/ValidationHelpers.js +849 -0
  211. package/dist/esm/core/schema/mode/interfaces/validators/ValidationHelpers.js.map +1 -0
  212. package/dist/esm/core/schema/mode/interfaces/validators/mods/passValidator.js +260 -0
  213. package/dist/esm/core/schema/mode/interfaces/validators/mods/passValidator.js.map +1 -0
  214. package/dist/esm/core/schema/mode/interfaces/validators/mods/securityValidator.js +881 -0
  215. package/dist/esm/core/schema/mode/interfaces/validators/mods/securityValidator.js.map +1 -0
  216. package/dist/esm/core/schema/mode/interfaces/validators/mods/urlValidation.js +189 -0
  217. package/dist/esm/core/schema/mode/interfaces/validators/mods/urlValidation.js.map +1 -0
  218. package/dist/esm/core/schema/optimization/ObjectValidationCache.js +460 -0
  219. package/dist/esm/core/schema/optimization/ObjectValidationCache.js.map +1 -0
  220. package/dist/esm/core/schema/optimization/PerformanceMonitor.js +771 -0
  221. package/dist/esm/core/schema/optimization/PerformanceMonitor.js.map +1 -0
  222. package/dist/esm/core/schema/optimization/SchemaCompiler.js +598 -0
  223. package/dist/esm/core/schema/optimization/SchemaCompiler.js.map +1 -0
  224. package/dist/esm/core/types/ValidatorTypes.js +65 -0
  225. package/dist/esm/core/types/ValidatorTypes.js.map +1 -0
  226. package/dist/esm/core/types/parser.type.js +12 -0
  227. package/dist/esm/core/types/parser.type.js.map +1 -0
  228. package/dist/esm/core/utils/Make.js +59 -0
  229. package/dist/esm/core/utils/Make.js.map +1 -0
  230. package/dist/esm/core/utils/Mod.js +1031 -0
  231. package/dist/esm/core/utils/Mod.js.map +1 -0
  232. package/dist/esm/core/utils/UrlArgs.js +98 -0
  233. package/dist/esm/core/utils/UrlArgs.js.map +1 -0
  234. package/dist/esm/core/utils/arrayToEnum.js +16 -0
  235. package/dist/esm/core/utils/arrayToEnum.js.map +1 -0
  236. package/dist/esm/core/utils/createUrlArgsEnumFArray.js +11 -0
  237. package/dist/esm/core/utils/createUrlArgsEnumFArray.js.map +1 -0
  238. package/dist/esm/core/utils/securityHelpers.js +207 -0
  239. package/dist/esm/core/utils/securityHelpers.js.map +1 -0
  240. package/dist/esm/core/utils/securityValidatorHelpers.js +62 -0
  241. package/dist/esm/core/utils/securityValidatorHelpers.js.map +1 -0
  242. package/dist/esm/index.js +12 -0
  243. package/dist/esm/index.js.map +1 -0
  244. package/dist/esm/package.json +3 -0
  245. package/dist/schema.d.ts +2595 -0
  246. package/docs/ALL_TYPES.md +120 -0
  247. package/docs/API-STABILITY.md +336 -0
  248. package/docs/CONDITIONAL-VALIDATION.md +637 -0
  249. package/docs/EXAMPLES.md +876 -0
  250. package/docs/FIELD-TYPES.md +829 -0
  251. package/docs/GETTING-STARTED.md +394 -0
  252. package/docs/LIVE-UTILITY.md +1137 -0
  253. package/docs/QUICK-REFERENCE.md +346 -0
  254. package/docs/README.md +205 -0
  255. package/docs/VSCODE-EXTENSION.md +458 -0
  256. package/package.json +219 -0
  257. package/src/bench/BENCHMARK-RESULTS.md +211 -0
  258. package/src/bench/benchmark-results.json +148 -0
  259. package/src/bench/performance-comparison.ts +218 -0
  260. package/src/bench/precompilation-benchmark.ts +218 -0
  261. package/src/constants/SECURITY_CONSTANTS.ts +44 -0
  262. package/src/constants/VALIDATION_CONSTANTS.ts +176 -0
  263. package/src/core/README.md +395 -0
  264. package/src/core/compiler/SchemaTransformer.ts +279 -0
  265. package/src/core/compiler/TypeAnalyzer.ts +378 -0
  266. package/src/core/compiler/TypeScriptCompilerIntegration.ts +220 -0
  267. package/src/core/compiler/TypeToSchemaConverter.ts +288 -0
  268. package/src/core/index.ts +70 -0
  269. package/src/core/schema/extensions/AutoDocumentation.ts +572 -0
  270. package/src/core/schema/extensions/ConditionalValidation.ts +330 -0
  271. package/src/core/schema/extensions/README.md +171 -0
  272. package/src/core/schema/extensions/RealtimeValidation.ts +656 -0
  273. package/src/core/schema/extensions/SmartInference.ts +224 -0
  274. package/src/core/schema/extensions/components/AutoDocumentation/Docs.ts +98 -0
  275. package/src/core/schema/extensions/components/AutoDocumentation/DocumentationGenerator.ts +201 -0
  276. package/src/core/schema/extensions/components/AutoDocumentation/InteractiveDocumentationGenerator.ts +176 -0
  277. package/src/core/schema/extensions/components/AutoDocumentation/OpenAPIGenerator.ts +175 -0
  278. package/src/core/schema/extensions/components/AutoDocumentation/SchemaAnalyzer.ts +49 -0
  279. package/src/core/schema/extensions/components/AutoDocumentation/TypeScriptGenerator.ts +54 -0
  280. package/src/core/schema/extensions/components/AutoDocumentation/index.ts +17 -0
  281. package/src/core/schema/extensions/components/ConditionalValidation/ConditionalBuilder.ts +101 -0
  282. package/src/core/schema/extensions/components/ConditionalValidation/ConditionalElse.ts +65 -0
  283. package/src/core/schema/extensions/components/ConditionalValidation/ConditionalThen.ts +33 -0
  284. package/src/core/schema/extensions/components/ConditionalValidation/Extend.ts +75 -0
  285. package/src/core/schema/extensions/components/ConditionalValidation/MultiConditionalBuilder.ts +16 -0
  286. package/src/core/schema/extensions/components/ConditionalValidation/MultiConditionalThen.ts +50 -0
  287. package/src/core/schema/extensions/components/ConditionalValidation/index.ts +104 -0
  288. package/src/core/schema/extensions/components/RealtimeValidation/FormValidator.ts +88 -0
  289. package/src/core/schema/extensions/components/RealtimeValidation/LiveValidator.ts +171 -0
  290. package/src/core/schema/extensions/components/RealtimeValidation/StreamValidator.ts +397 -0
  291. package/src/core/schema/extensions/components/RealtimeValidation/index.ts +114 -0
  292. package/src/core/schema/extensions/index.ts +76 -0
  293. package/src/core/schema/extensions/mods/index.ts +131 -0
  294. package/src/core/schema/extensions/mods/openapi-converter.ts +338 -0
  295. package/src/core/schema/extensions/mods/typescript-generator.ts +379 -0
  296. package/src/core/schema/extensions/mods/validation-engine.ts +295 -0
  297. package/src/core/schema/mode/interfaces/Interface.ts +364 -0
  298. package/src/core/schema/mode/interfaces/InterfaceSchema.ts +1838 -0
  299. package/src/core/schema/mode/interfaces/README.md +278 -0
  300. package/src/core/schema/mode/interfaces/conditional/evaluator/ConditionalEvaluator.ts +657 -0
  301. package/src/core/schema/mode/interfaces/conditional/parser/ConditionalAST.ts +826 -0
  302. package/src/core/schema/mode/interfaces/conditional/parser/ConditionalLexer.ts +992 -0
  303. package/src/core/schema/mode/interfaces/conditional/parser/ConditionalParser.ts +803 -0
  304. package/src/core/schema/mode/interfaces/conditional/parser/readme.md +406 -0
  305. package/src/core/schema/mode/interfaces/conditional/types/ConditionalTypes.ts +273 -0
  306. package/src/core/schema/mode/interfaces/errors/ErrorHandler.ts +624 -0
  307. package/src/core/schema/mode/interfaces/errors/types/errors.type.ts +102 -0
  308. package/src/core/schema/mode/interfaces/precompilation/FieldPrecompilers.ts +962 -0
  309. package/src/core/schema/mode/interfaces/precompilation/SchemaPrecompiler.ts +667 -0
  310. package/src/core/schema/mode/interfaces/typescript/ConditionalTypes.ts +1534 -0
  311. package/src/core/schema/mode/interfaces/typescript/IDESupport.ts +534 -0
  312. package/src/core/schema/mode/interfaces/typescript/TypeInference.ts +737 -0
  313. package/src/core/schema/mode/interfaces/typescript/index.ts +92 -0
  314. package/src/core/schema/mode/interfaces/validators/ConstraintParser.ts +1438 -0
  315. package/src/core/schema/mode/interfaces/validators/EnhancedErrorReporting.ts +227 -0
  316. package/src/core/schema/mode/interfaces/validators/TypeGuards.ts +288 -0
  317. package/src/core/schema/mode/interfaces/validators/TypeValidators.ts +660 -0
  318. package/src/core/schema/mode/interfaces/validators/UnionCache.ts +508 -0
  319. package/src/core/schema/mode/interfaces/validators/ValidationHelpers.ts +1257 -0
  320. package/src/core/schema/mode/interfaces/validators/index.ts +21 -0
  321. package/src/core/schema/mode/interfaces/validators/mods/passValidator.ts +424 -0
  322. package/src/core/schema/mode/interfaces/validators/mods/securityValidator.ts +1634 -0
  323. package/src/core/schema/mode/interfaces/validators/mods/urlValidation.ts +333 -0
  324. package/src/core/schema/optimization/ObjectValidationCache.ts +560 -0
  325. package/src/core/schema/optimization/PerformanceInitializer.ts +188 -0
  326. package/src/core/schema/optimization/PerformanceMonitor.ts +898 -0
  327. package/src/core/schema/optimization/SchemaCompiler.ts +730 -0
  328. package/src/core/testing/TestDataGenerator.ts +590 -0
  329. package/src/core/types/SchemaValidator.type.ts +210 -0
  330. package/src/core/types/ValidatorTypes.ts +93 -0
  331. package/src/core/types/extension.type.ts +109 -0
  332. package/src/core/types/objValidationCache.ts +17 -0
  333. package/src/core/types/parser.type.ts +15 -0
  334. package/src/core/types/perfoMonitor.ts +37 -0
  335. package/src/core/types/scompiler.ts +22 -0
  336. package/src/core/types/securityValidator.type.ts +10 -0
  337. package/src/core/types/types.ts +154 -0
  338. package/src/core/utils/Make.ts +97 -0
  339. package/src/core/utils/Mod.ts +1168 -0
  340. package/src/core/utils/UrlArgs.ts +124 -0
  341. package/src/core/utils/arrayToEnum.ts +89 -0
  342. package/src/core/utils/createUrlArgsEnumFArray.ts +11 -0
  343. package/src/core/utils/securityHelpers.ts +341 -0
  344. package/src/core/utils/securityValidatorHelpers.ts +76 -0
  345. package/src/index.ts +124 -0
@@ -0,0 +1,881 @@
1
+ import { SECURITY_CONSTANTS } from '../../../../../../constants/SECURITY_CONSTANTS.js';
2
+ import { MAX_OBJECT_DEPTH } from '../../../../../../constants/VALIDATION_CONSTANTS.js';
3
+ import { validateJsonDeep, validateJsonSchema, validateIPv4, validateIPv6, normalizeIPv6, validateObjectDeep, validateObjectSchema } from '../../../../../utils/securityHelpers.js';
4
+ import Ajv from 'ajv';
5
+ import addFormats from 'ajv-formats';
6
+ import { ValidationMetrics, ValidationCache } from '../../../../../utils/securityValidatorHelpers.js';
7
+ import { ErrorHandler } from '../../errors/ErrorHandler.js';
8
+ import { ErrorCode } from '../../errors/types/errors.type.js';
9
+
10
+ class SecurityValidators {
11
+ /**
12
+ * Initialize AJV instance with enhanced security configurations
13
+ */
14
+ static getAjv() {
15
+ if (!this.ajv) {
16
+ this.ajv = new Ajv(this.ajvOptions);
17
+ addFormats(this.ajv);
18
+ // security schema with more comprehensive protections
19
+ this.ajv.addSchema({
20
+ $id: "https://nehonix.space/lib/v/reliant-type",
21
+ type: ["object", "array", "string", "number", "boolean", "null"],
22
+ definitions: {
23
+ secureObject: {
24
+ type: "object",
25
+ not: {
26
+ anyOf: [
27
+ ...Array.from(SECURITY_CONSTANTS.DANGEROUS_PROPERTIES).map((prop) => ({
28
+ properties: { [prop]: {} },
29
+ required: [prop],
30
+ })),
31
+ { additionalProperties: { type: "function" } },
32
+ ],
33
+ },
34
+ patternProperties: {
35
+ "^(?!__|constructor|prototype).*": { $ref: "#" },
36
+ },
37
+ },
38
+ },
39
+ if: { type: "object" },
40
+ then: { $ref: "#/definitions/secureObject" },
41
+ else: {
42
+ if: { type: "array" },
43
+ then: { items: { $ref: "#" } },
44
+ },
45
+ }, "secure-json-v2");
46
+ }
47
+ return this.ajv;
48
+ }
49
+ /**
50
+ * Check for dangerous properties that could lead to prototype pollution
51
+ */
52
+ static hasDangerousProperties(obj, visited = new WeakSet()) {
53
+ if (!obj || typeof obj !== "object" || visited.has(obj)) {
54
+ return false;
55
+ }
56
+ visited.add(obj);
57
+ // Check current level
58
+ for (const key of Object.keys(obj)) {
59
+ if (SECURITY_CONSTANTS.DANGEROUS_PROPERTIES.has(key)) {
60
+ return true;
61
+ }
62
+ }
63
+ // Recursively check nested objects
64
+ for (const value of Object.values(obj)) {
65
+ if (this.hasDangerousProperties(value, visited)) {
66
+ return true;
67
+ }
68
+ }
69
+ return false;
70
+ }
71
+ /**
72
+ * Execute validation with timeout protection
73
+ */
74
+ static async withTimeout(operation, timeoutMs = SECURITY_CONSTANTS.MAX_VALIDATION_TIME) {
75
+ return new Promise((resolve, reject) => {
76
+ const timer = setTimeout(() => {
77
+ reject(new Error(`Validation timeout after ${timeoutMs}ms`));
78
+ }, timeoutMs);
79
+ Promise.resolve(operation()).then((result) => {
80
+ clearTimeout(timer);
81
+ resolve(result);
82
+ }, (error) => {
83
+ clearTimeout(timer);
84
+ reject(error);
85
+ });
86
+ });
87
+ }
88
+ /**
89
+ * text validation with comprehensive security checks
90
+ */
91
+ static async validateText(value, options = {}) {
92
+ const startTime = Date.now();
93
+ const operationName = "validateText";
94
+ try {
95
+ const result = await this.withTimeout(async () => {
96
+ return this.validateTextSync(value, options);
97
+ }, options.timeout);
98
+ if (options.enableMetrics) {
99
+ ValidationMetrics.record(operationName, Date.now() - startTime, !result.success);
100
+ }
101
+ return result;
102
+ }
103
+ catch (error) {
104
+ if (options.enableMetrics) {
105
+ ValidationMetrics.record(operationName, Date.now() - startTime, true);
106
+ }
107
+ const msg = `${error instanceof Error ? error.message : "Unknown error"}`;
108
+ return {
109
+ success: false,
110
+ errors: [
111
+ ErrorHandler.createValidationError([], msg, ErrorCode.UNKNOWN_ERROR),
112
+ ],
113
+ warnings: [],
114
+ data: value,
115
+ };
116
+ }
117
+ }
118
+ static validateTextSync(value, options) {
119
+ const result = {
120
+ success: true,
121
+ errors: [],
122
+ warnings: [],
123
+ data: value,
124
+ };
125
+ const { minLength = 0, maxLength = SECURITY_CONSTANTS.MAX_TEXT_LENGTH, allowEmpty = true, trimWhitespace = false, allowedCharacters, forbiddenPatterns = [], encoding = "utf8", preventXSS = true, preventSQLInjection = true, preventLDAPInjection = false, preventCommandInjection = false, normalizeUnicode = false, maxLines = Infinity, requireAlphanumeric = false, allowHTML = false, stripHTML = false, } = options;
126
+ if (typeof value !== "string") {
127
+ result.success = false;
128
+ result.errors.push(ErrorHandler.createTypeError([], "string", value));
129
+ return result;
130
+ }
131
+ let text = value;
132
+ // Early size check to prevent DoS
133
+ if (text.length > maxLength) {
134
+ result.success = false;
135
+ result.errors.push(ErrorHandler.createStringError([], `Text exceeds maximum length of ${maxLength} characters`, value, ErrorCode.STRING_TOO_LONG));
136
+ return result;
137
+ }
138
+ // Trim whitespace if requested
139
+ if (trimWhitespace) {
140
+ const trimmed = text.trim();
141
+ if (trimmed !== text) {
142
+ text = trimmed;
143
+ result.data = text;
144
+ result.warnings.push("Whitespace trimmed from text");
145
+ }
146
+ }
147
+ // Unicode normalization
148
+ if (normalizeUnicode) {
149
+ try {
150
+ const normalized = text.normalize("NFC");
151
+ if (normalized !== text) {
152
+ text = normalized;
153
+ result.data = text;
154
+ result.warnings.push("Unicode characters normalized");
155
+ }
156
+ }
157
+ catch (error) {
158
+ result.warnings.push("Unicode normalization failed");
159
+ }
160
+ }
161
+ // Empty string validation
162
+ if (!allowEmpty && text.length === 0) {
163
+ result.success = false;
164
+ result.errors.push(ErrorHandler.createStringError([], "Text cannot be empty", value, ErrorCode.STRING_TOO_SHORT));
165
+ return result;
166
+ }
167
+ // Length validation
168
+ if (text.length < minLength) {
169
+ result.success = false;
170
+ result.errors.push(ErrorHandler.createStringError([], `Text must be at least ${minLength} characters long`, value, ErrorCode.STRING_TOO_SHORT));
171
+ }
172
+ // Line count validation
173
+ if (maxLines !== Infinity) {
174
+ const lineCount = text.split("\n").length;
175
+ if (lineCount > maxLines) {
176
+ result.success = false;
177
+ result.errors.push(ErrorHandler.createStringError([], `Text cannot exceed ${maxLines} lines`, value, ErrorCode.STRING_TOO_LONG));
178
+ }
179
+ }
180
+ // Character encoding validation
181
+ if (encoding === "ascii" && !/^[\x00-\x7F]*$/.test(text)) {
182
+ result.success = false;
183
+ result.errors.push(ErrorHandler.createStringError([], "Text contains non-ASCII characters", value, ErrorCode.INVALID_STRING_FORMAT));
184
+ }
185
+ // Alphanumeric requirement
186
+ if (requireAlphanumeric && !/^[a-zA-Z0-9\s]*$/.test(text)) {
187
+ result.success = false;
188
+ result.errors.push(ErrorHandler.createStringError([], "Text must contain only alphanumeric characters and spaces", value, ErrorCode.INVALID_STRING_FORMAT));
189
+ }
190
+ // Allowed characters validation
191
+ if (allowedCharacters && !allowedCharacters.test(text)) {
192
+ result.success = false;
193
+ result.errors.push(ErrorHandler.createStringError([], "Text contains disallowed characters", value, ErrorCode.INVALID_STRING_FORMAT));
194
+ }
195
+ // Forbidden patterns check
196
+ for (const pattern of forbiddenPatterns) {
197
+ if (pattern.test(text)) {
198
+ result.success = false;
199
+ result.errors.push(ErrorHandler.createStringError([], "Text contains forbidden pattern", value, ErrorCode.PATTERN_MISMATCH));
200
+ break;
201
+ }
202
+ }
203
+ // XSS prevention
204
+ if (preventXSS && !allowHTML) {
205
+ for (const pattern of SECURITY_CONSTANTS.XSS_PATTERNS) {
206
+ if (pattern.test(text)) {
207
+ result.success = false;
208
+ result.errors.push(ErrorHandler.createStringError([], "Text contains potentially malicious content (XSS)", value, ErrorCode.INVALID_STRING_FORMAT));
209
+ break;
210
+ }
211
+ }
212
+ // Additional XSS checks
213
+ if (text.includes("javascript:") || text.includes("data:text/html")) {
214
+ result.success = false;
215
+ result.errors.push(ErrorHandler.createStringError([], "Text contains dangerous URI schemes", value, ErrorCode.INVALID_STRING_FORMAT));
216
+ }
217
+ }
218
+ // SQL injection prevention
219
+ if (preventSQLInjection) {
220
+ for (const pattern of SECURITY_CONSTANTS.SQL_PATTERNS) {
221
+ if (pattern.test(text)) {
222
+ result.warnings.push("Text contains SQL-like patterns");
223
+ break;
224
+ }
225
+ }
226
+ }
227
+ // LDAP injection prevention
228
+ if (preventLDAPInjection) {
229
+ for (const pattern of SECURITY_CONSTANTS.LDAP_PATTERNS) {
230
+ if (pattern.test(text)) {
231
+ result.success = false;
232
+ result.errors.push(ErrorHandler.createStringError([], "Text contains LDAP injection patterns", value, ErrorCode.INVALID_STRING_FORMAT));
233
+ break;
234
+ }
235
+ }
236
+ }
237
+ // Command injection prevention
238
+ if (preventCommandInjection) {
239
+ for (const pattern of SECURITY_CONSTANTS.COMMAND_INJECTION_PATTERNS) {
240
+ if (pattern.test(text)) {
241
+ result.success = false;
242
+ result.errors.push(ErrorHandler.createStringError([], "Text contains command injection patterns", value, ErrorCode.INVALID_STRING_FORMAT));
243
+ break;
244
+ }
245
+ }
246
+ }
247
+ // Control character detection
248
+ if (/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]/.test(text)) {
249
+ result.warnings.push("Text contains control characters");
250
+ }
251
+ // Null byte detection
252
+ if (text.includes("\0")) {
253
+ result.success = false;
254
+ result.errors.push(ErrorHandler.createStringError([], "Text contains null bytes", value, ErrorCode.INVALID_STRING_FORMAT));
255
+ }
256
+ return result;
257
+ }
258
+ /**
259
+ * JSON validation with improved security and performance
260
+ */
261
+ static async validateJson(value, options = {}) {
262
+ const startTime = Date.now();
263
+ const operationName = "validateJson";
264
+ // Generate cache key if caching is enabled
265
+ const cacheKey = options.useCache
266
+ ? `json_${JSON.stringify(value).substring(0, 100)}_${JSON.stringify(options)}`
267
+ : null;
268
+ if (cacheKey) {
269
+ const cached = ValidationCache.get(cacheKey);
270
+ if (cached) {
271
+ return cached;
272
+ }
273
+ }
274
+ try {
275
+ const result = await this.withTimeout(async () => {
276
+ return this.validateJsonSync(value, options);
277
+ }, options.timeout);
278
+ if (options.enableMetrics) {
279
+ ValidationMetrics.record(operationName, Date.now() - startTime, !result.success);
280
+ }
281
+ if (cacheKey && result.success) {
282
+ ValidationCache.set(cacheKey, result);
283
+ }
284
+ return result;
285
+ }
286
+ catch (error) {
287
+ if (options.enableMetrics) {
288
+ ValidationMetrics.record(operationName, Date.now() - startTime, true);
289
+ }
290
+ const msg = `${error instanceof Error ? error.message : "Unknown error"}`;
291
+ const code = error instanceof Error ? error.name : ErrorCode.UNKNOWN_ERROR;
292
+ return {
293
+ success: false,
294
+ errors: [ErrorHandler.createValidationError([], msg, code)],
295
+ warnings: [],
296
+ data: value,
297
+ };
298
+ }
299
+ }
300
+ static validateJsonSync(value, options) {
301
+ const result = {
302
+ success: true,
303
+ errors: [],
304
+ warnings: [],
305
+ data: value,
306
+ };
307
+ const { maxDepth = MAX_OBJECT_DEPTH, maxKeys = 1000, maxStringLength = 10000, maxArrayLength = 1000, allowedTypes = ["object", "array", "string", "number", "boolean", "null"], forbiddenKeys = [], schema, preventCircular = true, maxSize = SECURITY_CONSTANTS.MAX_JSON_SIZE, securityMode = "secure", } = options;
308
+ let parsedData;
309
+ if (typeof value === "string") {
310
+ // Size check for string
311
+ if (value.length > maxSize) {
312
+ result.success = false;
313
+ result.errors.push(ErrorHandler.createStringError([], `JSON string exceeds maximum size of ${maxSize} characters`, value, ErrorCode.STRING_TOO_LONG));
314
+ return result;
315
+ }
316
+ try {
317
+ parsedData = JSON.parse(value);
318
+ }
319
+ catch (error) {
320
+ result.success = false;
321
+ result.errors.push(ErrorHandler.createValidationError([], `Invalid JSON string: ${error instanceof Error ? error.message : "Parse error"}`, ErrorCode.INVALID_JSON));
322
+ return result;
323
+ }
324
+ }
325
+ else if (typeof value === "object" && value !== null) {
326
+ parsedData = value;
327
+ }
328
+ else {
329
+ result.success = false;
330
+ result.errors.push(ErrorHandler.createTypeError([], "string or object", value));
331
+ return result;
332
+ }
333
+ // Security validations based on mode
334
+ if (securityMode === "secure" || securityMode === "strict") {
335
+ if (this.hasDangerousProperties(parsedData)) {
336
+ result.success = false;
337
+ result.errors.push(ErrorHandler.createValidationError([], "JSON contains dangerous properties (prototype pollution risk)", ErrorCode.INVALID_JSON));
338
+ return result;
339
+ }
340
+ if (securityMode === "strict") {
341
+ const ajv = this.getAjv();
342
+ const validate = ajv.getSchema("secure-json-v2");
343
+ if (validate && !validate(parsedData)) {
344
+ result.success = false;
345
+ result.errors.push(ErrorHandler.createValidationError([], "JSON failed strict security validation", ErrorCode.INVALID_JSON));
346
+ if (validate.errors) {
347
+ result.warnings.push(`AJV errors: ${JSON.stringify(validate.errors)}`);
348
+ }
349
+ return result;
350
+ }
351
+ }
352
+ }
353
+ // Circular reference detection
354
+ if (preventCircular) {
355
+ try {
356
+ JSON.stringify(parsedData);
357
+ }
358
+ catch (error) {
359
+ result.success = false;
360
+ result.errors.push(ErrorHandler.createValidationError([], "JSON contains circular references", ErrorCode.INVALID_JSON));
361
+ return result;
362
+ }
363
+ }
364
+ // Deep validation
365
+ const validationResult = validateJsonDeep(parsedData, {
366
+ maxDepth,
367
+ maxKeys,
368
+ maxStringLength,
369
+ maxArrayLength,
370
+ allowedTypes,
371
+ forbiddenKeys,
372
+ currentDepth: 0,
373
+ keyCount: 0,
374
+ });
375
+ result.success = result.success && validationResult.success;
376
+ result.errors.push(...validationResult.errors);
377
+ result.warnings.push(...validationResult.warnings);
378
+ result.data = parsedData;
379
+ // Schema validation if provided
380
+ if (schema && result.success) {
381
+ const schemaResult = validateJsonSchema(parsedData, schema);
382
+ result.success = result.success && schemaResult.success;
383
+ result.errors.push(...schemaResult.errors);
384
+ result.warnings.push(...schemaResult.warnings);
385
+ }
386
+ return result;
387
+ }
388
+ /**
389
+ * IP validation with geographic and security checks
390
+ */
391
+ static validateIp(value, options = {}) {
392
+ const result = {
393
+ success: true,
394
+ errors: [],
395
+ warnings: [],
396
+ data: value,
397
+ };
398
+ const { version = "both", allowPrivate = true, allowLoopback = true, allowMulticast = false, allowReserved = true, allowCIDR = false, strict = true, blockBogons = false, allowDocumentation = true, } = options;
399
+ if (typeof value !== "string") {
400
+ result.success = false;
401
+ result.errors.push(ErrorHandler.createSimpleError("Expected string for IP address", [], "string"));
402
+ return result;
403
+ }
404
+ const ip = value.trim();
405
+ // Basic format validation
406
+ if (!/^[\d\.:a-fA-F\/]+$/.test(ip)) {
407
+ result.success = false;
408
+ result.errors.push(ErrorHandler.createValidationError([], "IP address contains invalid characters", ErrorCode.SECURITY_VIOLATION));
409
+ return result;
410
+ }
411
+ let ipAddress = ip;
412
+ let cidrPrefix = null;
413
+ let isIPv4 = false;
414
+ let isIPv6 = false;
415
+ // Handle CIDR notation
416
+ if (ip.includes("/")) {
417
+ if (!allowCIDR) {
418
+ result.success = false;
419
+ result.errors.push(ErrorHandler.createValidationError([], "CIDR notation is not allowed", ErrorCode.SECURITY_VIOLATION));
420
+ return result;
421
+ }
422
+ const parts = ip.split("/");
423
+ if (parts.length !== 2) {
424
+ result.success = false;
425
+ result.errors.push(ErrorHandler.createValidationError([], "Invalid CIDR notation format", ErrorCode.SECURITY_VIOLATION));
426
+ return result;
427
+ }
428
+ ipAddress = parts[0];
429
+ const prefixStr = parts[1];
430
+ if (!/^\d+$/.test(prefixStr)) {
431
+ result.success = false;
432
+ result.errors.push(ErrorHandler.createValidationError([], "CIDR prefix must be numeric", ErrorCode.SECURITY_VIOLATION));
433
+ return result;
434
+ }
435
+ cidrPrefix = parseInt(prefixStr, 10);
436
+ }
437
+ // Validate IP format
438
+ const ipv4Result = validateIPv4(ipAddress, strict);
439
+ const ipv6Result = validateIPv6(ipAddress);
440
+ isIPv4 = ipv4Result.valid;
441
+ isIPv6 = ipv6Result.valid;
442
+ // Version validation
443
+ if (version === "v4" && !isIPv4) {
444
+ result.success = false;
445
+ result.errors.push(ErrorHandler.createValidationError([], "Invalid IPv4 address format", ErrorCode.SECURITY_VIOLATION));
446
+ return result;
447
+ }
448
+ if (version === "v6" && !isIPv6) {
449
+ result.success = false;
450
+ result.errors.push(ErrorHandler.createValidationError([], "Invalid IPv6 address format", ErrorCode.SECURITY_VIOLATION));
451
+ return result;
452
+ }
453
+ if (version === "both" && !isIPv4 && !isIPv6) {
454
+ result.success = false;
455
+ result.errors.push(ErrorHandler.createValidationError([], "Invalid IP address format (must be valid IPv4 or IPv6)", ErrorCode.SECURITY_VIOLATION));
456
+ return result;
457
+ }
458
+ // CIDR prefix validation
459
+ if (cidrPrefix !== null) {
460
+ if (isIPv4 && (cidrPrefix < 0 || cidrPrefix > 32)) {
461
+ result.success = false;
462
+ result.errors.push(ErrorHandler.createValidationError([], "Invalid IPv4 CIDR prefix (must be 0-32)", ErrorCode.SECURITY_VIOLATION));
463
+ }
464
+ if (isIPv6 && (cidrPrefix < 0 || cidrPrefix > 128)) {
465
+ result.success = false;
466
+ result.errors.push(ErrorHandler.createValidationError([], "Invalid IPv6 CIDR prefix (must be 0-128)", ErrorCode.SECURITY_VIOLATION));
467
+ }
468
+ }
469
+ // IPv4 specific validations
470
+ if (isIPv4) {
471
+ const octets = ipAddress.split(".").map(Number);
472
+ // private IP detection
473
+ if (!allowPrivate) {
474
+ if (octets[0] === 10 ||
475
+ (octets[0] === 172 && octets[1] >= 16 && octets[1] <= 31) ||
476
+ (octets[0] === 192 && octets[1] === 168) ||
477
+ (octets[0] === 169 && octets[1] === 254) // Link-local
478
+ ) {
479
+ result.success = false;
480
+ result.errors.push(ErrorHandler.createValidationError([], "Private IPv4 addresses not allowed", ErrorCode.SECURITY_VIOLATION));
481
+ }
482
+ }
483
+ // Loopback validation
484
+ if (!allowLoopback && octets[0] === 127) {
485
+ result.success = false;
486
+ result.errors.push(ErrorHandler.createValidationError([], "Loopback addresses not allowed", ErrorCode.SECURITY_VIOLATION));
487
+ }
488
+ // Multicast validation
489
+ if (!allowMulticast && octets[0] >= 224 && octets[0] <= 239) {
490
+ result.success = false;
491
+ result.errors.push(ErrorHandler.createValidationError([], "Multicast addresses not allowed", ErrorCode.SECURITY_VIOLATION));
492
+ }
493
+ // Documentation addresses (RFC 5737)
494
+ if (!allowDocumentation) {
495
+ if ((octets[0] === 192 && octets[1] === 0 && octets[2] === 2) ||
496
+ (octets[0] === 198 && octets[1] === 51 && octets[2] === 100) ||
497
+ (octets[0] === 203 && octets[1] === 0 && octets[2] === 113)) {
498
+ result.success = false;
499
+ result.errors.push(ErrorHandler.createValidationError([], "Documentation addresses not allowed", ErrorCode.SECURITY_VIOLATION));
500
+ }
501
+ }
502
+ // Bogon detection
503
+ if (blockBogons) {
504
+ if (octets[0] === 0 ||
505
+ octets[0] === 255 ||
506
+ (octets[0] >= 240 && octets[0] <= 255)) {
507
+ result.success = false;
508
+ result.errors.push(ErrorHandler.createValidationError([], "Bogon IP address detected", ErrorCode.SECURITY_VIOLATION));
509
+ }
510
+ }
511
+ // Reserved ranges
512
+ if (!allowReserved) {
513
+ if (octets[0] === 0 || octets[0] === 255) {
514
+ result.success = false;
515
+ result.errors.push(ErrorHandler.createValidationError([], "Reserved IPv4 addresses not allowed", ErrorCode.SECURITY_VIOLATION));
516
+ }
517
+ }
518
+ }
519
+ // IPv6 specific validations
520
+ if (isIPv6) {
521
+ const normalized = normalizeIPv6(ipAddress);
522
+ if (!allowLoopback &&
523
+ normalized === "0000:0000:0000:0000:0000:0000:0000:0001") {
524
+ result.success = false;
525
+ result.errors.push(ErrorHandler.createValidationError([], "IPv6 loopback address not allowed", ErrorCode.SECURITY_VIOLATION));
526
+ }
527
+ // Unique local addresses (RFC 4193)
528
+ if (!allowPrivate &&
529
+ (normalized.startsWith("fc00:") || normalized.startsWith("fd00:"))) {
530
+ result.success = false;
531
+ result.errors.push(ErrorHandler.createValidationError([], "Private IPv6 addresses not allowed", ErrorCode.SECURITY_VIOLATION));
532
+ }
533
+ // Link-local addresses
534
+ if (!allowPrivate && normalized.startsWith("fe80:")) {
535
+ result.success = false;
536
+ result.errors.push(ErrorHandler.createValidationError([], "Link-local IPv6 addresses not allowed", ErrorCode.SECURITY_VIOLATION));
537
+ }
538
+ if (!allowMulticast && normalized.startsWith("ff00:")) {
539
+ result.success = false;
540
+ result.errors.push(ErrorHandler.createValidationError([], "IPv6 multicast addresses not allowed", ErrorCode.SECURITY_VIOLATION));
541
+ }
542
+ // Documentation prefix (RFC 3849)
543
+ if (!allowDocumentation && normalized.startsWith("2001:0db8:")) {
544
+ result.success = false;
545
+ result.errors.push(ErrorHandler.createValidationError([], "Documentation IPv6 addresses not allowed", ErrorCode.SECURITY_VIOLATION));
546
+ }
547
+ }
548
+ return result;
549
+ }
550
+ /**
551
+ * object validation with better security and performance
552
+ */
553
+ static validateObject(value, options = {}) {
554
+ const result = {
555
+ success: true,
556
+ errors: [],
557
+ warnings: [],
558
+ data: value,
559
+ };
560
+ const { allowNull = false, allowArray = false, maxDepth = MAX_OBJECT_DEPTH, maxKeys = 1000, requiredKeys = [], allowedKeys = [], forbiddenKeys = [], keyPattern, schema, strict = false, preventPrototypePollution = true, maxPropertyNameLength = 100, } = options;
561
+ // Null check
562
+ if (value === null) {
563
+ if (!allowNull) {
564
+ result.success = false;
565
+ result.errors.push(ErrorHandler.createValidationError([], "Null values not allowed", ErrorCode.SECURITY_VIOLATION));
566
+ }
567
+ return result;
568
+ }
569
+ // Array check
570
+ if (Array.isArray(value)) {
571
+ if (!allowArray) {
572
+ result.success = false;
573
+ result.errors.push(ErrorHandler.createValidationError([], "Arrays not allowed", ErrorCode.SECURITY_VIOLATION));
574
+ }
575
+ return result;
576
+ }
577
+ // Type check
578
+ if (typeof value !== "object") {
579
+ result.success = false;
580
+ result.errors.push(ErrorHandler.createTypeError([], "object", value));
581
+ return result;
582
+ }
583
+ // Prototype pollution check
584
+ if (preventPrototypePollution && this.hasDangerousProperties(value)) {
585
+ result.success = false;
586
+ result.errors.push(ErrorHandler.createValidationError([], "Object contains dangerous properties that could lead to prototype pollution", ErrorCode.SECURITY_VIOLATION));
587
+ return result;
588
+ }
589
+ const keys = Object.keys(value);
590
+ // Key count validation
591
+ if (keys.length > maxKeys) {
592
+ result.success = false;
593
+ result.errors.push(ErrorHandler.createValidationError([], `Object has too many keys (${keys.length}), maximum allowed: ${maxKeys}`, ErrorCode.SECURITY_VIOLATION));
594
+ }
595
+ // Required keys validation
596
+ for (const requiredKey of requiredKeys) {
597
+ if (!(requiredKey in value)) {
598
+ result.success = false;
599
+ result.errors.push(ErrorHandler.createValidationError([], `Missing required key: ${requiredKey}`, ErrorCode.SECURITY_VIOLATION));
600
+ }
601
+ }
602
+ // key validation
603
+ for (const key of keys) {
604
+ // Property name length check
605
+ if (key.length > maxPropertyNameLength) {
606
+ result.success = false;
607
+ result.errors.push(ErrorHandler.createValidationError([], `Property name '${key.substring(0, 20)}...' exceeds maximum length of ${maxPropertyNameLength}`, ErrorCode.SECURITY_VIOLATION));
608
+ continue;
609
+ }
610
+ // Dangerous key detection
611
+ if (SECURITY_CONSTANTS.DANGEROUS_PROPERTIES.has(key)) {
612
+ result.success = false;
613
+ result.errors.push(ErrorHandler.createValidationError([], `Dangerous property name detected: '${key}'`, ErrorCode.SECURITY_VIOLATION));
614
+ continue;
615
+ }
616
+ // Allowed keys check
617
+ if (allowedKeys.length > 0 && !allowedKeys.includes(key)) {
618
+ if (strict) {
619
+ result.success = false;
620
+ result.errors.push(ErrorHandler.createValidationError([], `Key '${key}' is not in allowed keys list`, ErrorCode.SECURITY_VIOLATION));
621
+ }
622
+ else {
623
+ result.warnings.push(`Key '${key}' is not in allowed keys list`);
624
+ }
625
+ }
626
+ // Forbidden keys check
627
+ if (forbiddenKeys.includes(key)) {
628
+ result.success = false;
629
+ result.errors.push(ErrorHandler.createValidationError([], `Key '${key}' is forbidden`, ErrorCode.SECURITY_VIOLATION));
630
+ }
631
+ // Key pattern validation
632
+ if (keyPattern && !keyPattern.test(key)) {
633
+ result.success = false;
634
+ result.errors.push(ErrorHandler.createValidationError([], `Key '${key}' does not match required pattern`, ErrorCode.SECURITY_VIOLATION));
635
+ }
636
+ // Check for suspicious patterns in key names
637
+ if (/^__|.*prototype.*|.*constructor.*$/i.test(key)) {
638
+ result.warnings.push(`Suspicious property name detected: '${key}'`);
639
+ }
640
+ }
641
+ // Deep structure validation
642
+ const deepResult = validateObjectDeep(value, maxDepth, 0);
643
+ result.success = result.success && deepResult.success;
644
+ result.errors.push(...deepResult.errors);
645
+ result.warnings.push(...deepResult.warnings);
646
+ // Schema validation if provided
647
+ if (schema && result.success) {
648
+ const schemaResult = validateObjectSchema(value, schema);
649
+ result.success = result.success && schemaResult.success;
650
+ result.errors.push(...schemaResult.errors);
651
+ result.warnings.push(...schemaResult.warnings);
652
+ }
653
+ return result;
654
+ }
655
+ /**
656
+ * Validate email address with comprehensive checks
657
+ */
658
+ static validateEmail(value, options = {}) {
659
+ const result = {
660
+ success: true,
661
+ errors: [],
662
+ warnings: [],
663
+ data: value,
664
+ };
665
+ const { allowInternational = true, maxLength = 254, allowedDomains = [], blockedDomains = [], strict = true, } = options;
666
+ if (typeof value !== "string") {
667
+ result.success = false;
668
+ result.errors.push(ErrorHandler.createTypeError([], "string", value));
669
+ return result;
670
+ }
671
+ const email = value.trim().toLowerCase();
672
+ // Length check
673
+ if (email.length > maxLength) {
674
+ result.success = false;
675
+ result.errors.push(ErrorHandler.createStringError([], `Email exceeds maximum length of ${maxLength} characters`, value, ErrorCode.STRING_TOO_LONG));
676
+ return result;
677
+ }
678
+ // Basic format check - must contain exactly one @
679
+ const atSymbolCount = (email.match(/@/g) || []).length;
680
+ if (atSymbolCount !== 1) {
681
+ result.success = false;
682
+ result.errors.push(ErrorHandler.createValidationError([], "Email must contain exactly one @ symbol", ErrorCode.SECURITY_VIOLATION));
683
+ return result;
684
+ }
685
+ const [localPart, domain] = email.split("@");
686
+ // Check for empty parts
687
+ if (!localPart || !domain) {
688
+ result.success = false;
689
+ result.errors.push(ErrorHandler.createValidationError([], "Email local part and domain cannot be empty", ErrorCode.SECURITY_VIOLATION));
690
+ return result;
691
+ }
692
+ // Local part length validation
693
+ if (localPart.length > 64) {
694
+ result.success = false;
695
+ result.errors.push(ErrorHandler.createValidationError([], "Email local part exceeds 64 characters", ErrorCode.SECURITY_VIOLATION));
696
+ }
697
+ // Plus addressing check - FIXED LOGIC
698
+ if (localPart.includes("+")) {
699
+ result.success = false;
700
+ result.errors.push(ErrorHandler.createValidationError([], "Plus addressing (+ symbols) is not allowed", ErrorCode.SECURITY_VIOLATION));
701
+ }
702
+ // Local part character validation - FIXED TO PROPERLY HANDLE INVALID CHARACTERS
703
+ if (strict) {
704
+ // Practical validation - common characters only (excludes # and other problematic chars)
705
+ const validLocalPartRegex = /^[a-zA-Z0-9._+-]+$/;
706
+ if (!validLocalPartRegex.test(localPart)) {
707
+ result.success = false;
708
+ result.errors.push(ErrorHandler.createValidationError([], "Email local part contains invalid characters", ErrorCode.SECURITY_VIOLATION));
709
+ }
710
+ }
711
+ else {
712
+ // RFC 5322 compliant - more permissive but excludes problematic chars like #
713
+ const validLocalPartRegex = /^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*$/;
714
+ if (!validLocalPartRegex.test(localPart)) {
715
+ result.success = false;
716
+ result.errors.push(ErrorHandler.createValidationError([], "Email local part contains invalid characters", ErrorCode.SECURITY_VIOLATION));
717
+ }
718
+ }
719
+ // Check for consecutive dots
720
+ if (localPart.includes("..")) {
721
+ result.success = false;
722
+ result.errors.push(ErrorHandler.createValidationError([], "Email local part cannot contain consecutive dots", ErrorCode.SECURITY_VIOLATION));
723
+ }
724
+ // Check for dots at start or end
725
+ if (localPart.startsWith(".") || localPart.endsWith(".")) {
726
+ result.success = false;
727
+ result.errors.push(ErrorHandler.createValidationError([], "Email local part cannot start or end with a dot", ErrorCode.SECURITY_VIOLATION));
728
+ }
729
+ // Domain validation
730
+ if (domain.length > 255) {
731
+ result.success = false;
732
+ result.errors.push(ErrorHandler.createValidationError([], "Email domain exceeds 255 characters", ErrorCode.SECURITY_VIOLATION));
733
+ }
734
+ // Domain format validation
735
+ if (strict) {
736
+ // Basic domain validation - must have at least one dot and valid TLD
737
+ const validDomainRegex = /^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
738
+ if (!validDomainRegex.test(domain)) {
739
+ result.success = false;
740
+ result.errors.push(ErrorHandler.createValidationError([], "Invalid domain format - must contain at least one dot and valid TLD", ErrorCode.SECURITY_VIOLATION));
741
+ }
742
+ }
743
+ else {
744
+ // More strict domain validation
745
+ const validDomainRegex = /^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
746
+ if (!validDomainRegex.test(domain)) {
747
+ result.success = false;
748
+ result.errors.push(ErrorHandler.createValidationError([], "Invalid domain format", ErrorCode.SECURITY_VIOLATION));
749
+ }
750
+ }
751
+ // Check for consecutive dots in domain
752
+ if (domain.includes("..")) {
753
+ result.success = false;
754
+ result.errors.push(ErrorHandler.createValidationError([], "Domain cannot contain consecutive dots", ErrorCode.SECURITY_VIOLATION));
755
+ }
756
+ // Check for dots at start or end of domain
757
+ if (domain.startsWith(".") || domain.endsWith(".")) {
758
+ result.success = false;
759
+ result.errors.push(ErrorHandler.createValidationError([], "Domain cannot start or end with a dot", ErrorCode.SECURITY_VIOLATION));
760
+ }
761
+ // International domain validation
762
+ if (!allowInternational && /[^\x00-\x7F]/.test(domain)) {
763
+ result.success = false;
764
+ result.errors.push(ErrorHandler.createValidationError([], "International domain names are not allowed", ErrorCode.SECURITY_VIOLATION));
765
+ }
766
+ // Domain whitelist/blacklist
767
+ if (allowedDomains.length > 0 && !allowedDomains.includes(domain)) {
768
+ result.success = false;
769
+ result.errors.push(ErrorHandler.createValidationError([], `Email domain '${domain}' is not allowed`, ErrorCode.SECURITY_VIOLATION));
770
+ }
771
+ if (blockedDomains.includes(domain)) {
772
+ result.success = false;
773
+ result.errors.push(ErrorHandler.createValidationError([], `Email domain '${domain}' is blocked`, ErrorCode.SECURITY_VIOLATION));
774
+ }
775
+ // Additional validation for common invalid patterns
776
+ const invalidCharsRegex = /[<>()[\]\\,;:\s@"]/;
777
+ if (invalidCharsRegex.test(localPart)) {
778
+ result.success = false;
779
+ result.errors.push(ErrorHandler.createValidationError([], "Email local part contains prohibited characters (spaces, quotes, brackets, etc.)", ErrorCode.SECURITY_VIOLATION));
780
+ }
781
+ // Suspicious patterns
782
+ if (/test|temp|fake|spam|noreply/i.test(email)) {
783
+ result.warnings.push("Email appears to be temporary or test address");
784
+ }
785
+ // Set the cleaned data
786
+ result.data = email;
787
+ return result;
788
+ }
789
+ /**
790
+ * Get validation performance metrics
791
+ */
792
+ static getMetrics() {
793
+ return ValidationMetrics.getMetrics();
794
+ }
795
+ /**
796
+ * Reset validation metrics
797
+ */
798
+ static resetMetrics() {
799
+ ValidationMetrics.reset();
800
+ }
801
+ /**
802
+ * Clear validation cache
803
+ */
804
+ static clearCache() {
805
+ ValidationCache.clear();
806
+ }
807
+ /**
808
+ * Validate multiple values with batch processing
809
+ */
810
+ static async validateBatch(values, validator, options = {}) {
811
+ const { continueOnError = true, maxConcurrency = 10, timeout = 30000, } = options;
812
+ const results = [];
813
+ const batches = [];
814
+ // Create batches
815
+ for (let i = 0; i < values.length; i += maxConcurrency) {
816
+ batches.push(values.slice(i, i + maxConcurrency));
817
+ }
818
+ try {
819
+ await this.withTimeout(async () => {
820
+ for (const batch of batches) {
821
+ const batchPromises = batch.map(async (value) => {
822
+ try {
823
+ return await Promise.resolve(validator(value));
824
+ }
825
+ catch (error) {
826
+ return {
827
+ success: false,
828
+ errors: [
829
+ ErrorHandler.createValidationError([], `Batch validation error: ${error instanceof Error ? error.message : "Unknown error"}`, ErrorCode.UNKNOWN_ERROR),
830
+ ],
831
+ warnings: [],
832
+ data: value,
833
+ };
834
+ }
835
+ });
836
+ const batchResults = await Promise.all(batchPromises);
837
+ results.push(...batchResults);
838
+ // Stop on first error if continueOnError is false
839
+ if (!continueOnError && batchResults.some((r) => !r.success)) {
840
+ break;
841
+ }
842
+ }
843
+ }, timeout);
844
+ }
845
+ catch (error) {
846
+ // Add timeout error for remaining values
847
+ const remaining = values.length - results.length;
848
+ for (let i = 0; i < remaining; i++) {
849
+ results.push({
850
+ success: false,
851
+ errors: [
852
+ ErrorHandler.createValidationError([], `Batch validation timeout: ${error instanceof Error ? error.message : "Unknown error"}`, ErrorCode.UNKNOWN_ERROR),
853
+ ],
854
+ warnings: [],
855
+ data: values[results.length + i],
856
+ });
857
+ }
858
+ }
859
+ const summary = {
860
+ total: results.length,
861
+ passed: results.filter((r) => r.success).length,
862
+ failed: results.filter((r) => !r.success).length,
863
+ };
864
+ return { results, summary };
865
+ }
866
+ }
867
+ SecurityValidators.ajv = null;
868
+ SecurityValidators.ajvOptions = {
869
+ strict: false,
870
+ allErrors: true,
871
+ removeAdditional: false,
872
+ useDefaults: false,
873
+ coerceTypes: false,
874
+ validateFormats: true,
875
+ addUsedSchema: false,
876
+ verbose: false,
877
+ loadSchema: false, // Disable remote schema loading for security
878
+ };
879
+
880
+ export { SECURITY_CONSTANTS, SecurityValidators as Security, SecurityValidators, ValidationCache, ValidationMetrics };
881
+ //# sourceMappingURL=securityValidator.js.map