@maroonedog/luq 0.1.0-alpha

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 (312) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +879 -0
  3. package/dist/constants.d.ts +27 -0
  4. package/dist/core/async.experimental/async-context.d.ts +60 -0
  5. package/dist/core/builder/array-batch-optimizer.d.ts +66 -0
  6. package/dist/core/builder/context/field-context.d.ts +31 -0
  7. package/dist/core/builder/context/field-type-detector.d.ts +19 -0
  8. package/dist/core/builder/core/builder.d.ts +10 -0
  9. package/dist/core/builder/core/field-builder.d.ts +13 -0
  10. package/dist/core/builder/core/index.d.ts +17 -0
  11. package/dist/core/builder/index.d.ts +24 -0
  12. package/dist/core/builder/nested-array-processor.d.ts +52 -0
  13. package/dist/core/builder/plugins/composable-conditional-plugin.d.ts +32 -0
  14. package/dist/core/builder/plugins/composable-directly-plugin.d.ts +32 -0
  15. package/dist/core/builder/plugins/composable-plugin.d.ts +242 -0
  16. package/dist/core/builder/plugins/plugin-creator.d.ts +38 -0
  17. package/dist/core/builder/plugins/plugin-interfaces.d.ts +343 -0
  18. package/dist/core/builder/plugins/plugin-types.d.ts +441 -0
  19. package/dist/core/builder/raw-validator.d.ts +22 -0
  20. package/dist/core/builder/types/field-options.d.ts +46 -0
  21. package/dist/core/builder/types/types.d.ts +318 -0
  22. package/dist/core/builder/ultra-fast-validator.d.ts +30 -0
  23. package/dist/core/builder/validator-factory.d.ts +29 -0
  24. package/dist/core/global-config.d.ts +27 -0
  25. package/dist/core/index.d.ts +36 -0
  26. package/dist/core/optimization/array-batch-validator.d.ts +68 -0
  27. package/dist/core/optimization/core/field-utils.d.ts +103 -0
  28. package/dist/core/optimization/core/strategy-factory.d.ts +84 -0
  29. package/dist/core/optimization/core/validation-engine.d.ts +107 -0
  30. package/dist/core/optimization/execution-strategy-selector.d.ts +23 -0
  31. package/dist/core/optimization/unified-validator.d.ts +45 -0
  32. package/dist/core/plugin/__tests__/test-utils.d.ts +1 -0
  33. package/dist/core/plugin/arrayContains.d.ts +37 -0
  34. package/dist/core/plugin/arrayIncludes.d.ts +42 -0
  35. package/dist/core/plugin/arrayMaxLength.d.ts +43 -0
  36. package/dist/core/plugin/arrayMinLength.d.ts +43 -0
  37. package/dist/core/plugin/arrayUnique.d.ts +41 -0
  38. package/dist/core/plugin/booleanFalsy.d.ts +41 -0
  39. package/dist/core/plugin/booleanTruthy.d.ts +38 -0
  40. package/dist/core/plugin/compareField.d.ts +58 -0
  41. package/dist/core/plugin/conditionalSchema.d.ts +24 -0
  42. package/dist/core/plugin/custom.d.ts +60 -0
  43. package/dist/core/plugin/fromContext.d.ts +150 -0
  44. package/dist/core/plugin/index.d.ts +71 -0
  45. package/dist/core/plugin/jsonSchema/dsl-converter.d.ts +22 -0
  46. package/dist/core/plugin/jsonSchema/error-generation.d.ts +14 -0
  47. package/dist/core/plugin/jsonSchema/format-validators.d.ts +20 -0
  48. package/dist/core/plugin/jsonSchema/index.d.ts +11 -0
  49. package/dist/core/plugin/jsonSchema/plugin.d.ts +35 -0
  50. package/dist/core/plugin/jsonSchema/ref-resolver.d.ts +14 -0
  51. package/dist/core/plugin/jsonSchema/types.d.ts +69 -0
  52. package/dist/core/plugin/jsonSchema/validation-core.d.ts +29 -0
  53. package/dist/core/plugin/jsonSchemaFullFeature.d.ts +31 -0
  54. package/dist/core/plugin/literal.d.ts +40 -0
  55. package/dist/core/plugin/message-factories.d.ts +9 -0
  56. package/dist/core/plugin/nullable.d.ts +34 -0
  57. package/dist/core/plugin/numberFinite.d.ts +41 -0
  58. package/dist/core/plugin/numberInteger.d.ts +41 -0
  59. package/dist/core/plugin/numberMax.d.ts +49 -0
  60. package/dist/core/plugin/numberMin.d.ts +49 -0
  61. package/dist/core/plugin/numberMultipleOf.d.ts +42 -0
  62. package/dist/core/plugin/numberNegative.d.ts +41 -0
  63. package/dist/core/plugin/numberPositive.d.ts +41 -0
  64. package/dist/core/plugin/numberRange.d.ts +48 -0
  65. package/dist/core/plugin/object.d.ts +43 -0
  66. package/dist/core/plugin/objectAdditionalProperties.d.ts +51 -0
  67. package/dist/core/plugin/objectDependentRequired.d.ts +42 -0
  68. package/dist/core/plugin/objectDependentSchemas.d.ts +40 -0
  69. package/dist/core/plugin/objectMaxProperties.d.ts +42 -0
  70. package/dist/core/plugin/objectMinProperties.d.ts +42 -0
  71. package/dist/core/plugin/objectPatternProperties.d.ts +46 -0
  72. package/dist/core/plugin/objectPropertyNames.d.ts +36 -0
  73. package/dist/core/plugin/objectRecursively.d.ts +81 -0
  74. package/dist/core/plugin/oneOf.d.ts +44 -0
  75. package/dist/core/plugin/optional.d.ts +35 -0
  76. package/dist/core/plugin/optionalIf.d.ts +42 -0
  77. package/dist/core/plugin/orFail.d.ts +132 -0
  78. package/dist/core/plugin/readOnlyWriteOnly.d.ts +48 -0
  79. package/dist/core/plugin/required.d.ts +45 -0
  80. package/dist/core/plugin/requiredIf.d.ts +66 -0
  81. package/dist/core/plugin/shared-constants.d.ts +45 -0
  82. package/dist/core/plugin/shared.d.ts +3 -0
  83. package/dist/core/plugin/skip.d.ts +57 -0
  84. package/dist/core/plugin/stitch-typed.d.ts +15 -0
  85. package/dist/core/plugin/stitch.d.ts +1 -0
  86. package/dist/core/plugin/stitchSimple.d.ts +4 -0
  87. package/dist/core/plugin/stringAlphanumeric.d.ts +42 -0
  88. package/dist/core/plugin/stringBase64.d.ts +119 -0
  89. package/dist/core/plugin/stringContentEncoding.d.ts +43 -0
  90. package/dist/core/plugin/stringContentMediaType.d.ts +47 -0
  91. package/dist/core/plugin/stringDate.d.ts +48 -0
  92. package/dist/core/plugin/stringDatetime.d.ts +108 -0
  93. package/dist/core/plugin/stringDuration.d.ts +41 -0
  94. package/dist/core/plugin/stringEmail.d.ts +81 -0
  95. package/dist/core/plugin/stringEndsWith.d.ts +42 -0
  96. package/dist/core/plugin/stringExactLength.d.ts +46 -0
  97. package/dist/core/plugin/stringHostname.d.ts +104 -0
  98. package/dist/core/plugin/stringIpv4.d.ts +85 -0
  99. package/dist/core/plugin/stringIpv6.d.ts +104 -0
  100. package/dist/core/plugin/stringIri.d.ts +117 -0
  101. package/dist/core/plugin/stringIriReference.d.ts +43 -0
  102. package/dist/core/plugin/stringJsonPointer.d.ts +107 -0
  103. package/dist/core/plugin/stringMax.d.ts +43 -0
  104. package/dist/core/plugin/stringMin.d.ts +43 -0
  105. package/dist/core/plugin/stringPattern.d.ts +40 -0
  106. package/dist/core/plugin/stringRelativeJsonPointer.d.ts +42 -0
  107. package/dist/core/plugin/stringStartsWith.d.ts +42 -0
  108. package/dist/core/plugin/stringTime.d.ts +39 -0
  109. package/dist/core/plugin/stringUriTemplate.d.ts +43 -0
  110. package/dist/core/plugin/stringUrl.d.ts +97 -0
  111. package/dist/core/plugin/testUtils.d.ts +15 -0
  112. package/dist/core/plugin/transform-type-restrictions.d.ts +61 -0
  113. package/dist/core/plugin/transform.d.ts +35 -0
  114. package/dist/core/plugin/tupleBuilder.d.ts +66 -0
  115. package/dist/core/plugin/types.d.ts +143 -0
  116. package/dist/core/plugin/unionGuard.d.ts +50 -0
  117. package/dist/core/plugin/utils/field-accessor-optimized.d.ts +50 -0
  118. package/dist/core/plugin/utils/field-accessor.d.ts +107 -0
  119. package/dist/core/plugin/uuid.d.ts +95 -0
  120. package/dist/core/plugin/validateIf.d.ts +57 -0
  121. package/dist/core/registry/plugin-registry.d.ts +116 -0
  122. package/dist/core/registry.d.ts +6 -0
  123. package/dist/core/transform/index.d.ts +1 -0
  124. package/dist/core/transform/string/defaultValue.d.ts +6 -0
  125. package/dist/core/transform/string/index.d.ts +3 -0
  126. package/dist/core/transform/string/replace.d.ts +14 -0
  127. package/dist/core/transform/string/sanitize.d.ts +6 -0
  128. package/dist/core/utils/type-guards.d.ts +68 -0
  129. package/dist/index.d.ts +72 -0
  130. package/dist/index.js +2 -0
  131. package/dist/index.js.map +7 -0
  132. package/dist/index.mjs +2 -0
  133. package/dist/index.mjs.map +7 -0
  134. package/dist/plugins/arrayContains.d.ts +37 -0
  135. package/dist/plugins/arrayContains.js +1 -0
  136. package/dist/plugins/arrayContains.mjs +1 -0
  137. package/dist/plugins/arrayIncludes.d.ts +42 -0
  138. package/dist/plugins/arrayIncludes.js +1 -0
  139. package/dist/plugins/arrayIncludes.mjs +1 -0
  140. package/dist/plugins/arrayMaxLength.d.ts +43 -0
  141. package/dist/plugins/arrayMaxLength.js +1 -0
  142. package/dist/plugins/arrayMaxLength.mjs +1 -0
  143. package/dist/plugins/arrayMinLength.d.ts +43 -0
  144. package/dist/plugins/arrayMinLength.js +1 -0
  145. package/dist/plugins/arrayMinLength.mjs +1 -0
  146. package/dist/plugins/arrayUnique.d.ts +41 -0
  147. package/dist/plugins/arrayUnique.js +1 -0
  148. package/dist/plugins/arrayUnique.mjs +1 -0
  149. package/dist/plugins/booleanFalsy.d.ts +41 -0
  150. package/dist/plugins/booleanFalsy.js +1 -0
  151. package/dist/plugins/booleanFalsy.mjs +1 -0
  152. package/dist/plugins/booleanTruthy.d.ts +38 -0
  153. package/dist/plugins/booleanTruthy.js +1 -0
  154. package/dist/plugins/booleanTruthy.mjs +1 -0
  155. package/dist/plugins/compareField.d.ts +58 -0
  156. package/dist/plugins/compareField.js +1 -0
  157. package/dist/plugins/compareField.mjs +1 -0
  158. package/dist/plugins/custom.d.ts +60 -0
  159. package/dist/plugins/custom.js +1 -0
  160. package/dist/plugins/custom.mjs +1 -0
  161. package/dist/plugins/jsonSchema.d.ts +11 -0
  162. package/dist/plugins/jsonSchema.js +1 -0
  163. package/dist/plugins/jsonSchema.mjs +1 -0
  164. package/dist/plugins/jsonSchemaFullFeature.d.ts +31 -0
  165. package/dist/plugins/jsonSchemaFullFeature.js +1 -0
  166. package/dist/plugins/jsonSchemaFullFeature.mjs +1 -0
  167. package/dist/plugins/literal.d.ts +40 -0
  168. package/dist/plugins/literal.js +1 -0
  169. package/dist/plugins/literal.mjs +1 -0
  170. package/dist/plugins/nullable.d.ts +34 -0
  171. package/dist/plugins/nullable.js +1 -0
  172. package/dist/plugins/nullable.mjs +1 -0
  173. package/dist/plugins/numberInteger.d.ts +41 -0
  174. package/dist/plugins/numberInteger.js +1 -0
  175. package/dist/plugins/numberInteger.mjs +1 -0
  176. package/dist/plugins/numberMax.d.ts +49 -0
  177. package/dist/plugins/numberMax.js +1 -0
  178. package/dist/plugins/numberMax.mjs +1 -0
  179. package/dist/plugins/numberMin.d.ts +49 -0
  180. package/dist/plugins/numberMin.js +1 -0
  181. package/dist/plugins/numberMin.mjs +1 -0
  182. package/dist/plugins/numberMultipleOf.d.ts +42 -0
  183. package/dist/plugins/numberMultipleOf.js +1 -0
  184. package/dist/plugins/numberMultipleOf.mjs +1 -0
  185. package/dist/plugins/numberNegative.d.ts +41 -0
  186. package/dist/plugins/numberNegative.js +1 -0
  187. package/dist/plugins/numberNegative.mjs +1 -0
  188. package/dist/plugins/numberPositive.d.ts +41 -0
  189. package/dist/plugins/numberPositive.js +1 -0
  190. package/dist/plugins/numberPositive.mjs +1 -0
  191. package/dist/plugins/object.d.ts +43 -0
  192. package/dist/plugins/object.js +1 -0
  193. package/dist/plugins/object.mjs +1 -0
  194. package/dist/plugins/objectAdditionalProperties.d.ts +51 -0
  195. package/dist/plugins/objectAdditionalProperties.js +1 -0
  196. package/dist/plugins/objectAdditionalProperties.mjs +1 -0
  197. package/dist/plugins/objectDependentRequired.d.ts +42 -0
  198. package/dist/plugins/objectDependentRequired.js +1 -0
  199. package/dist/plugins/objectDependentRequired.mjs +1 -0
  200. package/dist/plugins/objectDependentSchemas.d.ts +40 -0
  201. package/dist/plugins/objectDependentSchemas.js +1 -0
  202. package/dist/plugins/objectDependentSchemas.mjs +1 -0
  203. package/dist/plugins/objectMaxProperties.d.ts +42 -0
  204. package/dist/plugins/objectMaxProperties.js +1 -0
  205. package/dist/plugins/objectMaxProperties.mjs +1 -0
  206. package/dist/plugins/objectMinProperties.d.ts +42 -0
  207. package/dist/plugins/objectMinProperties.js +1 -0
  208. package/dist/plugins/objectMinProperties.mjs +1 -0
  209. package/dist/plugins/objectPatternProperties.d.ts +46 -0
  210. package/dist/plugins/objectPatternProperties.js +1 -0
  211. package/dist/plugins/objectPatternProperties.mjs +1 -0
  212. package/dist/plugins/objectPropertyNames.d.ts +36 -0
  213. package/dist/plugins/objectPropertyNames.js +1 -0
  214. package/dist/plugins/objectPropertyNames.mjs +1 -0
  215. package/dist/plugins/oneOf.d.ts +44 -0
  216. package/dist/plugins/oneOf.js +1 -0
  217. package/dist/plugins/oneOf.mjs +1 -0
  218. package/dist/plugins/optional.d.ts +35 -0
  219. package/dist/plugins/optional.js +1 -0
  220. package/dist/plugins/optional.mjs +1 -0
  221. package/dist/plugins/readOnlyWriteOnly.d.ts +48 -0
  222. package/dist/plugins/readOnlyWriteOnly.js +1 -0
  223. package/dist/plugins/readOnlyWriteOnly.mjs +1 -0
  224. package/dist/plugins/required.d.ts +45 -0
  225. package/dist/plugins/required.js +1 -0
  226. package/dist/plugins/required.mjs +1 -0
  227. package/dist/plugins/requiredIf.d.ts +66 -0
  228. package/dist/plugins/requiredIf.js +1 -0
  229. package/dist/plugins/requiredIf.mjs +1 -0
  230. package/dist/plugins/skip.d.ts +57 -0
  231. package/dist/plugins/skip.js +1 -0
  232. package/dist/plugins/skip.mjs +1 -0
  233. package/dist/plugins/stringBase64.d.ts +119 -0
  234. package/dist/plugins/stringBase64.js +1 -0
  235. package/dist/plugins/stringBase64.mjs +1 -0
  236. package/dist/plugins/stringContentEncoding.d.ts +43 -0
  237. package/dist/plugins/stringContentEncoding.js +1 -0
  238. package/dist/plugins/stringContentEncoding.mjs +1 -0
  239. package/dist/plugins/stringContentMediaType.d.ts +47 -0
  240. package/dist/plugins/stringContentMediaType.js +1 -0
  241. package/dist/plugins/stringContentMediaType.mjs +1 -0
  242. package/dist/plugins/stringDate.d.ts +48 -0
  243. package/dist/plugins/stringDate.js +1 -0
  244. package/dist/plugins/stringDate.mjs +1 -0
  245. package/dist/plugins/stringDatetime.d.ts +108 -0
  246. package/dist/plugins/stringDatetime.js +1 -0
  247. package/dist/plugins/stringDatetime.mjs +1 -0
  248. package/dist/plugins/stringDuration.d.ts +41 -0
  249. package/dist/plugins/stringDuration.js +1 -0
  250. package/dist/plugins/stringDuration.mjs +1 -0
  251. package/dist/plugins/stringEmail.d.ts +81 -0
  252. package/dist/plugins/stringEmail.js +1 -0
  253. package/dist/plugins/stringEmail.mjs +1 -0
  254. package/dist/plugins/stringHostname.d.ts +104 -0
  255. package/dist/plugins/stringHostname.js +1 -0
  256. package/dist/plugins/stringHostname.mjs +1 -0
  257. package/dist/plugins/stringIpv4.d.ts +85 -0
  258. package/dist/plugins/stringIpv4.js +1 -0
  259. package/dist/plugins/stringIpv4.mjs +1 -0
  260. package/dist/plugins/stringIpv6.d.ts +104 -0
  261. package/dist/plugins/stringIpv6.js +1 -0
  262. package/dist/plugins/stringIpv6.mjs +1 -0
  263. package/dist/plugins/stringIri.d.ts +117 -0
  264. package/dist/plugins/stringIri.js +1 -0
  265. package/dist/plugins/stringIri.mjs +1 -0
  266. package/dist/plugins/stringIriReference.d.ts +43 -0
  267. package/dist/plugins/stringIriReference.js +1 -0
  268. package/dist/plugins/stringIriReference.mjs +1 -0
  269. package/dist/plugins/stringJsonPointer.d.ts +107 -0
  270. package/dist/plugins/stringJsonPointer.js +1 -0
  271. package/dist/plugins/stringJsonPointer.mjs +1 -0
  272. package/dist/plugins/stringMax.d.ts +43 -0
  273. package/dist/plugins/stringMax.js +1 -0
  274. package/dist/plugins/stringMax.mjs +1 -0
  275. package/dist/plugins/stringMin.d.ts +43 -0
  276. package/dist/plugins/stringMin.js +1 -0
  277. package/dist/plugins/stringMin.mjs +1 -0
  278. package/dist/plugins/stringPattern.d.ts +40 -0
  279. package/dist/plugins/stringPattern.js +1 -0
  280. package/dist/plugins/stringPattern.mjs +1 -0
  281. package/dist/plugins/stringRelativeJsonPointer.d.ts +42 -0
  282. package/dist/plugins/stringRelativeJsonPointer.js +1 -0
  283. package/dist/plugins/stringRelativeJsonPointer.mjs +1 -0
  284. package/dist/plugins/stringTime.d.ts +39 -0
  285. package/dist/plugins/stringTime.js +1 -0
  286. package/dist/plugins/stringTime.mjs +1 -0
  287. package/dist/plugins/stringUriTemplate.d.ts +43 -0
  288. package/dist/plugins/stringUriTemplate.js +1 -0
  289. package/dist/plugins/stringUriTemplate.mjs +1 -0
  290. package/dist/plugins/stringUrl.d.ts +97 -0
  291. package/dist/plugins/stringUrl.js +1 -0
  292. package/dist/plugins/stringUrl.mjs +1 -0
  293. package/dist/plugins/transform.d.ts +35 -0
  294. package/dist/plugins/transform.js +1 -0
  295. package/dist/plugins/transform.mjs +1 -0
  296. package/dist/plugins/tupleBuilder.d.ts +66 -0
  297. package/dist/plugins/tupleBuilder.js +1 -0
  298. package/dist/plugins/tupleBuilder.mjs +1 -0
  299. package/dist/plugins/uuid.d.ts +95 -0
  300. package/dist/plugins/uuid.js +1 -0
  301. package/dist/plugins/uuid.mjs +1 -0
  302. package/dist/plugins/validateIf.d.ts +57 -0
  303. package/dist/plugins/validateIf.js +1 -0
  304. package/dist/plugins/validateIf.mjs +1 -0
  305. package/dist/types/array-type-analysis.d.ts +115 -0
  306. package/dist/types/index.d.ts +74 -0
  307. package/dist/types/indexed-result.d.ts +44 -0
  308. package/dist/types/result.d.ts +159 -0
  309. package/dist/types/stitch-types.d.ts +118 -0
  310. package/dist/types/util.d.ts +19 -0
  311. package/dist/types/valitator.d.ts +10 -0
  312. package/package.json +353 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../core-entry.ts", "../src/core/builder/types/field-options.ts", "../src/types/result.ts", "../src/core/builder/plugins/composable-plugin.ts", "../src/core/builder/context/field-context.ts", "../src/core/optimization/core/field-utils.ts", "../src/core/optimization/core/validation-engine.ts", "../src/core/optimization/core/strategy-factory.ts", "../src/core/optimization/execution-strategy-selector.ts", "../src/constants.ts", "../src/core/optimization/unified-validator.ts", "../src/core/plugin/utils/field-accessor.ts", "../src/core/builder/nested-array-processor.ts", "../src/core/builder/array-batch-optimizer.ts", "../src/core/plugin/utils/field-accessor-optimized.ts", "../src/core/builder/raw-validator.ts", "../src/core/builder/validator-factory.ts", "../src/core/builder/core/field-builder.ts", "../src/core/builder/core/builder.ts", "../src/core/registry/plugin-registry.ts", "../src/core/builder/plugins/plugin-creator.ts", "../src/core/global-config.ts"],
4
+ "sourcesContent": ["// Core exports only (no plugins)\nexport { Builder } from \"./src/core/builder/core/builder\";\nexport { createPluginRegistry } from \"./src/core/registry/plugin-registry\";\nexport type { \n PluginRegistry,\n FieldRule,\n ExtractFieldRuleType,\n FieldRuleDefinition \n} from \"./src/core/registry/plugin-registry\";\nexport type {\n FieldBuilder,\n TransformAwareValidator,\n ApplyFieldTransforms,\n ExtractFieldType,\n TypedPlugin,\n PluginType,\n PluginCategory,\n TypeName,\n BuilderExtensionPlugin,\n BuilderExtensionMethod,\n} from \"./src/core/builder/plugins/plugin-types\";\nexport { ValidationResult } from \"./src/core/builder/plugins/plugin-types\";\nexport type {\n ValidationOptions,\n MessageContext,\n SEVERITY,\n} from \"./src/core/plugin/types\";\nexport type {\n PluginValidationResult as BasicValidationResult,\n StandardPluginImplementation,\n ConditionalPluginImplementation,\n TransformPluginImplementation,\n FieldReferencePluginImplementation,\n ArrayElementPluginImplementation,\n} from \"./src/core/builder/plugins/plugin-interfaces\";\nexport {\n plugin,\n pluginPredefinedTransform,\n pluginConfigurableTransform,\n pluginBuilderExtension,\n} from \"./src/core/builder/plugins/plugin-creator\";\nexport type { PluginImplementation } from \"./src/core/builder/plugins/plugin-creator\";\nexport { Result } from \"./src/types/result\";\nexport {\n GlobalConfig,\n globalConfig,\n setGlobalConfig,\n getGlobalConfig,\n resetGlobalConfig,\n} from \"./src/core/global-config\";", "/**\r\n * Field-level options that are not validation rules but field configuration\r\n * Field-level settings (not validation rules)\r\n */\r\nexport interface FieldOptions<T = any> {\r\n /**\r\n * Default value when the field is undefined or null\r\n * Can be a static value or a function that returns the value\r\n */\r\n default?: T | (() => T);\r\n \r\n /**\r\n * Whether to apply default to null values (not just undefined)\r\n * @default true\r\n */\r\n applyDefaultToNull?: boolean;\r\n \r\n /**\r\n * Field description for documentation\r\n */\r\n description?: string;\r\n \r\n /**\r\n * Mark field as deprecated\r\n */\r\n deprecated?: boolean | string;\r\n \r\n /**\r\n * Custom metadata\r\n */\r\n metadata?: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Simplified default value type (for shorthand syntax)\r\n */\r\nexport type DefaultValue<T> = T | (() => T);\r\n\r\n/**\r\n * Field configuration: either just default value or full options\r\n */\r\nexport type FieldConfig<T> = DefaultValue<T> | FieldOptions<T>;\r\n\r\n/**\r\n * Helper to normalize field config\r\n */\r\nexport function normalizeFieldConfig<T>(\r\n config?: FieldConfig<T>\r\n): FieldOptions<T> | undefined {\r\n if (config === undefined) {\r\n return undefined;\r\n }\r\n \r\n // If it's already an options object (has any of the known properties)\r\n if (\r\n typeof config === 'object' &&\r\n config !== null &&\r\n !Array.isArray(config) &&\r\n ('default' in config || \r\n 'description' in config || \r\n 'deprecated' in config ||\r\n 'metadata' in config)\r\n ) {\r\n return config as FieldOptions<T>;\r\n }\r\n \r\n // Otherwise, treat it as a default value\r\n return {\r\n default: config as DefaultValue<T>\r\n };\r\n}\r\n\r\n/**\r\n * Apply default value if needed\r\n */\r\nexport function applyDefault<T>(\r\n value: any,\r\n options?: FieldOptions<T>,\r\n context?: { allValues?: any }\r\n): any {\r\n if (!options || !('default' in options)) {\r\n return value;\r\n }\r\n \r\n // Check if we should apply default\r\n const shouldApply = \r\n value === undefined ||\r\n (value === null && options.applyDefaultToNull !== false);\r\n \r\n if (!shouldApply) {\r\n return value;\r\n }\r\n \r\n // Apply default value\r\n const defaultValue = options.default;\r\n if (typeof defaultValue === 'function') {\r\n return (defaultValue as () => T)();\r\n }\r\n \r\n return defaultValue;\r\n}", "/**\r\n * Result pattern implementation for Luq validation\r\n * Provides a type-safe, functional approach to handling validation results\r\n */\r\n\r\nimport { ValidationError } from \"./index\";\r\n\r\n/**\r\n * Lightweight validation exception interface\r\n */\r\nexport interface LuqValidationException {\r\n readonly name: string;\r\n readonly message: string;\r\n readonly errors: ValidationError[];\r\n toString(): string;\r\n}\r\n\r\n/**\r\n * Create a validation exception (does not extend Error for performance)\r\n */\r\nexport function createLuqValidationException(\r\n message: string,\r\n errors: ValidationError[]\r\n): LuqValidationException {\r\n return {\r\n name: \"LuqValidationException\",\r\n message,\r\n errors,\r\n toString() {\r\n return `${this.name}: ${this.message}`;\r\n },\r\n };\r\n}\r\n\r\n// For backward compatibility\r\nexport const LuqValidationException = createLuqValidationException as any as {\r\n new (message: string, errors: ValidationError[]): LuqValidationException;\r\n};\r\n\r\n/**\r\n * Represents a successful validation result\r\n */\r\nexport interface ValidResult<T> {\r\n readonly isValid: true;\r\n readonly data: T;\r\n readonly errors: never;\r\n}\r\n\r\n/**\r\n * Represents a failed validation result\r\n */\r\nexport interface InvalidResult {\r\n readonly isValid: false;\r\n readonly data: never;\r\n readonly errors: ValidationError[];\r\n}\r\n\r\n/**\r\n * Union type for validation results\r\n */\r\nexport type ValidationState<T> = ValidResult<T> | InvalidResult;\r\n\r\n/**\r\n * Result interface providing functional validation result handling\r\n * Pattern 3: Function-based interface approach\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = validator.validate(data);\r\n *\r\n * // Check if valid\r\n * if (result.isValid()) {\r\n * // unwrap data safely\r\n * const data = result.unwrap();\r\n * }\r\n *\r\n * // Functional approach\r\n * const processed = result\r\n * .map(data => ({ ...data, processed: true }))\r\n * .unwrapOr(defaultValue);\r\n *\r\n * // Exception approach\r\n * const data = result.unwrap(); // throws if invalid\r\n * ```\r\n */\r\nexport interface Result<T> {\r\n /**\r\n * Check if result is valid\r\n */\r\n isValid(): boolean;\r\n\r\n /**\r\n * Backward compatibility: Check if result is valid (property access)\r\n */\r\n readonly valid: boolean;\r\n\r\n /**\r\n * Check if result is invalid\r\n */\r\n isError(): boolean;\r\n\r\n /**\r\n * Get the data if valid, otherwise throw ValidationException\r\n *\r\n * @throws {LuqValidationException} If the result is invalid\r\n */\r\n unwrap(): T;\r\n\r\n /**\r\n * Get the data if valid, otherwise return the default value\r\n */\r\n unwrapOr(defaultValue: T): T;\r\n\r\n /**\r\n * Get the data if valid, otherwise compute default using lazy function\r\n */\r\n unwrapOrElse(fn: (errors: ValidationError[]) => T): T;\r\n\r\n /**\r\n * Transform the data if valid, leave errors unchanged\r\n */\r\n map<U>(fn: (data: T) => U): Result<U>;\r\n\r\n /**\r\n * Transform the data if valid, allowing for fallible transformation\r\n */\r\n flatMap<U>(fn: (data: T) => Result<U>): Result<U>;\r\n\r\n /**\r\n * Execute a side effect if the result is valid\r\n */\r\n tap(fn: (data: T) => void): Result<T>;\r\n\r\n /**\r\n * Execute a side effect if the result is invalid\r\n */\r\n tapError(fn: (errors: ValidationError[]) => void): Result<T>;\r\n\r\n /**\r\n * Get the data if valid, undefined otherwise\r\n * Use with caution - prefer unwrapOr() or check isValid() first\r\n */\r\n data(): T | undefined;\r\n\r\n /**\r\n * Get the errors if invalid, empty array otherwise\r\n */\r\n readonly errors: ValidationError[];\r\n\r\n /**\r\n * Convert to plain object (for serialization/compatibility)\r\n */\r\n toPlainObject(): {\r\n valid: boolean;\r\n data?: T;\r\n errors: ValidationError[];\r\n };\r\n}\r\n\r\n/**\r\n * Optimized success result prototype\r\n */\r\nconst successProto = {\r\n isValid(): boolean {\r\n return true;\r\n },\r\n\r\n isError(): boolean {\r\n return false;\r\n },\r\n\r\n data(): any {\r\n return (this as any)._data;\r\n },\r\n\r\n unwrap(): any {\r\n return (this as any)._data;\r\n },\r\n\r\n unwrapOr(defaultValue: any): any {\r\n return (this as any)._data;\r\n },\r\n\r\n unwrapOrElse(fn: (errors: ValidationError[]) => any): any {\r\n return (this as any)._data;\r\n },\r\n\r\n map(fn: (data: any) => any): Result<any> {\r\n return Result.ok(fn((this as any)._data));\r\n },\r\n\r\n flatMap(fn: (data: any) => Result<any>): Result<any> {\r\n return fn((this as any)._data);\r\n },\r\n\r\n tap(fn: (data: any) => void): Result<any> {\r\n fn((this as any)._data);\r\n return this;\r\n },\r\n\r\n tapError(fn: (errors: ValidationError[]) => void): Result<any> {\r\n return this;\r\n },\r\n\r\n onSuccessPostProcess(fn: (data: any) => void): Result<any> {\r\n fn((this as any)._data);\r\n return this;\r\n },\r\n\r\n errors(): ValidationError[] {\r\n return [];\r\n },\r\n\r\n toPlainObject(): any {\r\n return {\r\n valid: true,\r\n data: (this as any)._data,\r\n errors: [],\r\n };\r\n },\r\n\r\n get valid(): boolean {\r\n return true;\r\n },\r\n\r\n get value(): any {\r\n return (this as any)._data;\r\n },\r\n};\r\n\r\n/**\r\n * Result implementation factory\r\n */\r\nexport const Result = {\r\n /**\r\n * Create a successful result - optimized for performance\r\n */\r\n ok<T>(data: T): Result<T> {\r\n // Use prototype-based approach for better performance\r\n const result = Object.create(successProto);\r\n result._data = data;\r\n return result;\r\n },\r\n\r\n /**\r\n * Create a failed result\r\n */\r\n error<T>(errors: ValidationError[]): Result<T> {\r\n return createResult({\r\n isValid: false,\r\n data: undefined as never,\r\n errors,\r\n } as InvalidResult);\r\n },\r\n};\r\n\r\n/**\r\n * Internal function to create Result implementation\r\n */\r\nfunction createResult<T>(state: ValidationState<T>): Result<T> {\r\n const result: Result<T> = {\r\n isValid(): boolean {\r\n return state.isValid;\r\n },\r\n\r\n isError(): boolean {\r\n return !state.isValid;\r\n },\r\n\r\n unwrap(): T {\r\n if (state.isValid) {\r\n return state.data;\r\n }\r\n throw createLuqValidationException(\r\n `Validation failed with ${state.errors.length} error(s)`,\r\n state.errors\r\n );\r\n },\r\n\r\n unwrapOr(defaultValue: T): T {\r\n return state.isValid ? state.data : defaultValue;\r\n },\r\n\r\n unwrapOrElse(fn: (errors: ValidationError[]) => T): T {\r\n return state.isValid ? state.data : fn(state.errors);\r\n },\r\n\r\n map<U>(fn: (data: T) => U): Result<U> {\r\n if (state.isValid) {\r\n return Result.ok(fn(state.data));\r\n }\r\n return Result.error(state.errors);\r\n },\r\n\r\n flatMap<U>(fn: (data: T) => Result<U>): Result<U> {\r\n if (state.isValid) {\r\n return fn(state.data);\r\n }\r\n return Result.error(state.errors);\r\n },\r\n\r\n tap(fn: (data: T) => void): Result<T> {\r\n if (state.isValid) {\r\n fn(state.data);\r\n }\r\n return createResult(state);\r\n },\r\n\r\n tapError(fn: (errors: ValidationError[]) => void): Result<T> {\r\n if (!state.isValid) {\r\n fn(state.errors);\r\n }\r\n return createResult(state);\r\n },\r\n\r\n data(): T | undefined {\r\n return state.isValid ? state.data : undefined;\r\n },\r\n\r\n toPlainObject(): {\r\n valid: boolean;\r\n data?: T;\r\n errors: ValidationError[];\r\n } {\r\n return {\r\n valid: state.isValid,\r\n data: state.isValid ? state.data : undefined,\r\n errors: state.isValid ? [] : state.errors,\r\n };\r\n },\r\n\r\n // Backward compatibility properties\r\n get valid(): boolean {\r\n return state.isValid;\r\n },\r\n\r\n get errors(): ValidationError[] {\r\n return state.isValid ? [] : state.errors;\r\n },\r\n };\r\n return result;\r\n}\r\n\r\n/**\r\n * Utility functions for working with Results\r\n */\r\nexport namespace ResultUtils {\r\n /**\r\n * Combine multiple results into a single result containing an array\r\n * If any result is invalid, returns the first error\r\n */\r\n export function all<T>(results: Result<T>[]): Result<T[]> {\r\n const data: T[] = [];\r\n const resultsLength = results.length;\r\n for (let i = 0; i < resultsLength; i++) {\r\n const result = results[i];\r\n if (result.isError()) {\r\n return Result.error(result.errors);\r\n }\r\n data.push(result.unwrap());\r\n }\r\n return Result.ok(data);\r\n }\r\n\r\n /**\r\n * Return the first valid result, or all errors if none are valid\r\n */\r\n export function any<T>(results: Result<T>[]): Result<T> {\r\n const allErrors: ValidationError[] = [];\r\n const resultsLength = results.length;\r\n for (let i = 0; i < resultsLength; i++) {\r\n const result = results[i];\r\n if (result.isValid()) {\r\n return result;\r\n }\r\n allErrors.push(...result.errors);\r\n }\r\n return Result.error(allErrors);\r\n }\r\n\r\n /**\r\n * Partition results into valid and invalid arrays\r\n */\r\n export function partition<T>(results: Result<T>[]): {\r\n valid: T[];\r\n invalid: ValidationError[][];\r\n } {\r\n const valid: T[] = [];\r\n const invalid: ValidationError[][] = [];\r\n const resultsLength = results.length;\r\n\r\n for (let i = 0; i < resultsLength; i++) {\r\n const result = results[i];\r\n if (result.isValid()) {\r\n valid.push(result.unwrap());\r\n } else {\r\n invalid.push(result.errors);\r\n }\r\n }\r\n\r\n return { valid, invalid };\r\n }\r\n}\r\n", "/**\r\n * Composable Plugin Pattern - Accumulate multiple calls and build validators\r\n *\r\n * This module provides utilities for creating composable plugins that can accumulate\r\n * multiple method calls and build a unified validator. This pattern is useful for\r\n * validation rules that need to be composed from multiple conditions or checks.\r\n *\r\n * Example usage:\r\n * ```typescript\r\n * // Create a composable plugin\r\n * const myPlugin = createComposablePlugin(\r\n * \"myPlugin\",\r\n * \"check\",\r\n * [\"string\", \"number\"] as const,\r\n * (compositions, fieldPath, plugins) => {\r\n * // Build validators from compositions\r\n * const validators = compositions.map(([arg1, arg2]) =>\r\n * createValidator(\"myCheck\", (value) => checkSomething(value, arg1, arg2))\r\n * );\r\n * return createValidatorResult(validators);\r\n * }\r\n * );\r\n *\r\n * // Use in field builder\r\n * builder.field(\"name\", b => b.string.check(arg1, arg2).check(arg3, arg4))\r\n * ```\r\n */\r\n\r\nimport type { TypeName, TransformFunction } from \"../plugins/plugin-types\";\r\n\r\n// Re-export TransformFunction for external use\r\nexport type { TransformFunction };\r\n\r\n/**\r\n * Pre-defined validation results for common cases\r\n */\r\nexport const VALID_RESULT = Object.freeze({ valid: true });\r\nexport const INVALID_RESULT = Object.freeze({ valid: false });\r\n\r\n/**\r\n * Basic interface for Composable Plugin\r\n */\r\nexport interface ComposablePlugin<\r\n TName extends string,\r\n TMethodName extends string,\r\n TAllowedTypes extends readonly TypeName[],\r\n> {\r\n name: TName;\r\n methodName: TMethodName;\r\n allowedTypes: TAllowedTypes;\r\n category: \"composable\";\r\n\r\n /**\r\n * Create a Composer that accumulates multiple calls\r\n */\r\n createComposer<TPlugins>(\r\n fieldPath: string,\r\n plugins: TPlugins\r\n ): ComposableComposerWithMethod<TMethodName>;\r\n}\r\n\r\n/**\r\n * Single validator definition\r\n */\r\nexport interface ValidatorDefinition {\r\n check: (value: unknown, currentValue: unknown) => boolean;\r\n name: string;\r\n inputType?: TypeName;\r\n outputType?: TypeName;\r\n metadata?: {\r\n severity?: \"error\" | \"warning\" | \"info\";\r\n async?: boolean;\r\n };\r\n}\r\n\r\n// TransformFunction is imported from plugin-types\r\n\r\n/**\r\n * Validator build result type\r\n */\r\nexport interface ComposableValidatorResult {\r\n _validators: ValidatorDefinition[];\r\n _transforms: TransformFunction<unknown, unknown>[];\r\n validate: (value: unknown) => { valid: boolean };\r\n}\r\n\r\n/**\r\n * Creates a validator result from an array of validators and transforms.\r\n *\r\n * @param validators - Array of validator definitions to include\r\n * @param transforms - Optional array of transform functions to apply\r\n * @param customValidate - Optional custom validation function that overrides default behavior\r\n * @returns A composable validator result that can be used by the builder\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = createValidatorResult([\r\n * createValidator(\"minLength\", (value) => value.length >= 3),\r\n * createValidator(\"maxLength\", (value) => value.length <= 10)\r\n * ]);\r\n * ```\r\n */\r\nexport function createValidatorResult(\r\n validators: ValidatorDefinition[],\r\n transforms: TransformFunction<unknown, unknown>[] = [],\r\n customValidate?: (value: unknown) => { valid: boolean }\r\n): ComposableValidatorResult {\r\n return {\r\n _validators: validators,\r\n _transforms: transforms,\r\n validate:\r\n customValidate ||\r\n ((value: unknown) => {\r\n for (let i = 0; i < transforms.length; i++) {\r\n if (!validators[i].check(value, value)) {\r\n return INVALID_RESULT;\r\n }\r\n }\r\n return VALID_RESULT;\r\n }),\r\n };\r\n}\r\n\r\n/**\r\n * Creates a validator result from a single validator with optional configuration.\r\n * This is a convenience function that combines createValidator and createValidatorResult.\r\n *\r\n * @param name - The name of the validator\r\n * @param check - The validation function\r\n * @param options - Optional configuration including metadata and transforms\r\n * @returns A composable validator result\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = createSingleValidatorResult(\r\n * \"email\",\r\n * (value) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value),\r\n * { inputType: \"string\", severity: \"error\" }\r\n * );\r\n * ```\r\n */\r\nexport function createSingleValidatorResult(\r\n name: string,\r\n check: (value: unknown, currentValue: unknown) => boolean,\r\n options?: {\r\n inputType?: TypeName;\r\n outputType?: TypeName;\r\n severity?: \"error\" | \"warning\" | \"info\";\r\n async?: boolean;\r\n transforms?: TransformFunction<unknown, unknown>[];\r\n customValidate?: (value: unknown) => { valid: boolean };\r\n }\r\n): ComposableValidatorResult {\r\n const validator = createValidator(name, check, options);\r\n return createValidatorResult(\r\n [validator],\r\n options?.transforms || [],\r\n options?.customValidate\r\n );\r\n}\r\n\r\n/**\r\n * Creates a single validator definition with metadata.\r\n *\r\n * @param name - The name of the validator\r\n * @param check - The validation function that returns true if valid\r\n * @param options - Optional metadata for the validator\r\n * @returns A validator definition\r\n *\r\n * @example\r\n * ```typescript\r\n * const validator = createValidator(\r\n * \"range\",\r\n * (value) => value >= 0 && value <= 100,\r\n * { inputType: \"number\", severity: \"error\" }\r\n * );\r\n * ```\r\n */\r\nexport function createValidator(\r\n name: string,\r\n check: (value: unknown, currentValue: unknown) => boolean,\r\n options?: {\r\n inputType?: TypeName;\r\n outputType?: TypeName;\r\n severity?: \"error\" | \"warning\" | \"info\";\r\n async?: boolean;\r\n }\r\n): ValidatorDefinition {\r\n return {\r\n check,\r\n name,\r\n inputType: options?.inputType,\r\n outputType: options?.outputType,\r\n metadata: options\r\n ? {\r\n severity: options.severity || \"error\",\r\n async: options.async || false,\r\n }\r\n : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * Composition builder context for accumulating validations\r\n */\r\nexport interface CompositionBuilder<TComposition> {\r\n compositions: TComposition[];\r\n add(composition: TComposition): this;\r\n}\r\n\r\n/**\r\n * Creates a builder for accumulating compositions.\r\n * This is useful for plugins that need to collect multiple method calls.\r\n *\r\n * @returns A composition builder instance\r\n *\r\n * @example\r\n * ```typescript\r\n * const builder = createCompositionBuilder<[string, number]>();\r\n * builder.add([\"test\", 5]).add([\"example\", 10]);\r\n * // builder.compositions now contains all added items\r\n * ```\r\n */\r\nexport function createCompositionBuilder<\r\n TComposition,\r\n>(): CompositionBuilder<TComposition> {\r\n const compositions: TComposition[] = [];\r\n return {\r\n compositions,\r\n add(composition: TComposition) {\r\n compositions.push(composition);\r\n return this;\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Merges multiple validator results into a single result.\r\n * All validators and transforms are combined, and validation stops at the first failure.\r\n *\r\n * @param results - Array of validator results to merge\r\n * @returns A single merged validator result\r\n *\r\n * @example\r\n * ```typescript\r\n * const result1 = createSingleValidatorResult(\"min\", (v) => v >= 0);\r\n * const result2 = createSingleValidatorResult(\"max\", (v) => v <= 100);\r\n * const merged = mergeValidatorResults([result1, result2]);\r\n * ```\r\n */\r\nexport function mergeValidatorResults(\r\n results: ComposableValidatorResult[]\r\n): ComposableValidatorResult {\r\n const allValidators: ValidatorDefinition[] = [];\r\n const allTransforms: TransformFunction<unknown, unknown>[] = [];\r\n\r\n for (const result of results) {\r\n allValidators.push(...result._validators);\r\n allTransforms.push(...result._transforms);\r\n }\r\n\r\n return createValidatorResult(\r\n allValidators,\r\n allTransforms,\r\n (value: unknown) => {\r\n for (let i = 0; i < results.length; i++) {\r\n const result = results[i].validate(value);\r\n if (!result.valid) {\r\n return INVALID_RESULT;\r\n }\r\n }\r\n return VALID_RESULT;\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Composer that accumulates calls and builds a validator\r\n */\r\nexport interface ComposableComposer<TMethodName extends string> {\r\n /**\r\n * Add a call (chainable)\r\n */\r\n add(args: unknown[]): ComposableComposer<TMethodName>;\r\n\r\n /**\r\n * Build validator from accumulated calls\r\n */\r\n build(): ComposableValidatorResult;\r\n}\r\n\r\nexport type ComposableComposerWithMethod<TMethodName extends string> =\r\n ComposableComposer<TMethodName> & {\r\n [K in TMethodName]: (\r\n ...args: unknown[]\r\n ) => ComposableComposerWithMethod<TMethodName>;\r\n };\r\n\r\n/**\r\n * Creates a composable plugin that can accumulate multiple method calls.\r\n *\r\n * @param name - The unique name of the plugin\r\n * @param methodName - The method name that will be added to the field builder\r\n * @param allowedTypes - Array of type names this plugin can be applied to\r\n * @param builderFn - Function that builds validators from accumulated compositions\r\n * @returns A composable plugin instance\r\n *\r\n * @example\r\n * ```typescript\r\n * // Example: Create a range check plugin that accumulates multiple ranges\r\n * const rangePlugin = createComposablePlugin(\r\n * \"range\",\r\n * \"between\",\r\n * [\"number\"] as const,\r\n * (compositions: Array<[number, number]>, fieldPath, plugins) => {\r\n * const validators = compositions.map(([min, max], index) =>\r\n * createValidator(\r\n * `range_${index}`,\r\n * (value) => typeof value === 'number' && value >= min && value <= max,\r\n * { inputType: \"number\", severity: \"error\" }\r\n * )\r\n * );\r\n *\r\n * // Custom validate function that checks all ranges\r\n * const customValidate = (value: unknown) => {\r\n * if (typeof value !== 'number') return { valid: false };\r\n * return compositions.every(([min, max]) => value >= min && value <= max)\r\n * ? { valid: true }\r\n * : { valid: false };\r\n * };\r\n *\r\n * return createValidatorResult(validators, [], customValidate);\r\n * }\r\n * );\r\n *\r\n * // Usage:\r\n * builder.field(\"score\", b => b.number.between(0, 100).between(10, 90))\r\n * ```\r\n */\r\nexport function createComposablePlugin<\r\n TName extends string,\r\n TMethodName extends string,\r\n TAllowedTypes extends readonly TypeName[],\r\n TComposition = unknown[],\r\n>(\r\n name: TName,\r\n methodName: TMethodName,\r\n allowedTypes: TAllowedTypes,\r\n builderFn: <TPlugins>(\r\n compositions: TComposition[],\r\n fieldPath: string,\r\n plugins: TPlugins\r\n ) => ComposableValidatorResult\r\n): ComposablePlugin<TName, TMethodName, TAllowedTypes> {\r\n return {\r\n name,\r\n methodName,\r\n allowedTypes,\r\n category: \"composable\",\r\n\r\n createComposer<TPlugins>(\r\n fieldPath: string,\r\n plugins: TPlugins\r\n ): ComposableComposerWithMethod<TMethodName> {\r\n const compositions: TComposition[] = [];\r\n\r\n const composer: ComposableComposer<TMethodName> = {\r\n add(args: unknown[]) {\r\n compositions.push(args as TComposition);\r\n return composer as ComposableComposerWithMethod<TMethodName>;\r\n },\r\n\r\n build() {\r\n return builderFn(compositions, fieldPath, plugins);\r\n },\r\n };\r\n\r\n // Dynamically add method to make it chainable\r\n const result = composer as ComposableComposerWithMethod<TMethodName>;\r\n (result as any)[methodName] = function (...args: unknown[]) {\r\n return result.add(args);\r\n };\r\n\r\n return result;\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Integration of Composable Plugin in Field Context\r\n */\r\nexport function attachComposablePlugin<\r\n TObject extends object,\r\n TPlugins,\r\n TBuilder,\r\n>(\r\n builder: TBuilder,\r\n plugin: ComposablePlugin<string, string, readonly TypeName[]>,\r\n fieldPath: string,\r\n plugins: TPlugins\r\n): void {\r\n const methodName = plugin.methodName;\r\n\r\n // Track composer state\r\n let composer: ComposableComposer<string> | null = null;\r\n let composerResult: ComposableValidatorResult | null = null;\r\n\r\n // Create method that starts composition\r\n (builder as Record<string, unknown>)[methodName] = function (\r\n ...args: unknown[]\r\n ) {\r\n // Create Composer on first call\r\n if (!composer) {\r\n composer = plugin.createComposer(fieldPath, plugins);\r\n }\r\n\r\n // Add the call to composer\r\n composer.add(args);\r\n\r\n // Add composer's method for chaining (but not build)\r\n (builder as any)[methodName] = (composer as any)[methodName];\r\n\r\n // Build the composer result immediately and integrate with execution plan\r\n if (composer) {\r\n composerResult = composer.build();\r\n\r\n // Add validators to execution plan immediately\r\n const executionPlan = (builder as any)._executionPlan;\r\n if (executionPlan && composerResult && typeof composerResult.validate === 'function') {\r\n // Always use the custom validate function if available\r\n // TODO: Restore complex validation logic\r\n } else if (composerResult && composerResult._validators) {\r\n // Fallback to individual validators\r\n for (const validator of composerResult._validators) {\r\n executionPlan.addValidator(validator.name, (value: any, context: any) => {\r\n const valid = validator.check(value, value);\r\n return {\r\n valid,\r\n message: valid\r\n ? undefined\r\n : `Validation failed for ${validator.name}`,\r\n };\r\n });\r\n }\r\n }\r\n }\r\n\r\n return builder;\r\n };\r\n}\r\n", "/**\r\n * Optimized field context creation for V8 performance\r\n * Removes Proxy usage and reduces object allocation\r\n */\r\n\r\nimport type {\r\n TypeName,\r\n ChainableFieldBuilder,\r\n FieldBuilderContext,\r\n TransformFunction,\r\n} from \"../plugins/plugin-types\";\r\nimport { attachComposablePlugin } from \"../plugins/composable-plugin\";\r\n\r\n// Validation function signature optimized for monomorphic calls\r\ntype OptimizedValidator<T = unknown> = (value: T, currentValue: T) => boolean;\r\n\r\n// Type-safe validator with metadata\r\ninterface ValidatorWithMeta<TValue = unknown> {\r\n check: OptimizedValidator<TValue>;\r\n name: string;\r\n messageFactory?: (context: any) => string;\r\n\r\n // Type information for better type safety\r\n inputType?: TypeName;\r\n outputType?: TypeName;\r\n // Validation metadata\r\n metadata?: {\r\n severity?: \"error\" | \"warning\" | \"info\";\r\n async?: boolean;\r\n dependencies?: string[];\r\n };\r\n}\r\n\r\n/**\r\n * Get basic type validator for a given type\r\n */\r\nfunction getTypeValidator(type: TypeName): ValidatorWithMeta<unknown> | null {\r\n switch (type) {\r\n case \"string\":\r\n return {\r\n check: (value: any) => {\r\n // Skip null check if nullable plugin is present (will be handled later)\r\n if (value === null || value === undefined) {\r\n // Let nullable plugin handle this later in the chain\r\n return true;\r\n }\r\n return typeof value === \"string\";\r\n },\r\n name: \"stringType\",\r\n messageFactory: () => \"Expected string\",\r\n inputType: \"string\",\r\n outputType: \"string\",\r\n metadata: { severity: \"error\" as const, async: false },\r\n };\r\n case \"number\":\r\n return {\r\n check: (value: any) => {\r\n // Skip null check if nullable plugin is present (will be handled later)\r\n if (value === null || value === undefined) {\r\n // Let nullable plugin handle this later in the chain\r\n return true;\r\n }\r\n return typeof value === \"number\" && !isNaN(value);\r\n },\r\n name: \"numberType\",\r\n messageFactory: () => \"Expected number\",\r\n inputType: \"number\",\r\n outputType: \"number\",\r\n metadata: { severity: \"error\" as const, async: false },\r\n };\r\n case \"boolean\":\r\n return {\r\n check: (value: any) => {\r\n // Skip null check if nullable plugin is present (will be handled later)\r\n if (value === null || value === undefined) {\r\n // Let nullable plugin handle this later in the chain\r\n return true;\r\n }\r\n return typeof value === \"boolean\";\r\n },\r\n name: \"booleanType\",\r\n messageFactory: () => \"Expected boolean\",\r\n inputType: \"boolean\",\r\n outputType: \"boolean\",\r\n metadata: { severity: \"error\" as const, async: false },\r\n };\r\n case \"array\":\r\n return {\r\n check: (value: any) => {\r\n // Skip null check if nullable plugin is present (will be handled later)\r\n if (value === null || value === undefined) {\r\n // Let nullable plugin handle this later in the chain\r\n return true;\r\n }\r\n return Array.isArray(value);\r\n },\r\n name: \"arrayType\",\r\n messageFactory: () => \"Expected array\",\r\n inputType: \"array\",\r\n outputType: \"array\",\r\n metadata: { severity: \"error\" as const, async: false },\r\n };\r\n case \"object\":\r\n return {\r\n check: (value: any) => {\r\n // Skip null check if nullable plugin is present (will be handled later)\r\n if (value === null || value === undefined) {\r\n // Let nullable plugin handle this later in the chain\r\n return true;\r\n }\r\n return (\r\n typeof value === \"object\" && value !== null && !Array.isArray(value)\r\n );\r\n },\r\n name: \"objectType\",\r\n messageFactory: () => \"Expected object\",\r\n inputType: \"object\",\r\n outputType: \"object\",\r\n metadata: { severity: \"error\" as const, async: false },\r\n };\r\n case \"date\":\r\n return {\r\n check: (value: any) => {\r\n // Skip null check if nullable plugin is present (will be handled later)\r\n if (value === null || value === undefined) {\r\n // Let nullable plugin handle this later in the chain\r\n return true;\r\n }\r\n return value instanceof Date;\r\n },\r\n name: \"dateType\",\r\n messageFactory: () => \"Expected Date\",\r\n inputType: \"date\",\r\n outputType: \"date\",\r\n metadata: { severity: \"error\" as const, async: false },\r\n };\r\n case \"null\":\r\n return {\r\n check: (value: any) => value === null,\r\n name: \"nullType\",\r\n messageFactory: () => \"Expected null\",\r\n inputType: \"null\",\r\n outputType: \"null\",\r\n metadata: { severity: \"error\" as const, async: false },\r\n };\r\n case \"any\":\r\n // For \"any\" type, we always return true (accept any value)\r\n return {\r\n check: () => true,\r\n name: \"anyType\",\r\n messageFactory: () => \"\",\r\n inputType: \"any\",\r\n outputType: \"any\",\r\n metadata: { severity: \"error\" as const, async: false },\r\n };\r\n default:\r\n return null; // union, tuple types don't get automatic validation\r\n }\r\n}\r\n\r\n/**\r\n * Create type-safe chainable field builder without Proxy\r\n * All methods are directly attached to the builder object with proper typing\r\n */\r\nexport function createOptimizedTypeBuilder<\r\n TObject extends object,\r\n TPlugins,\r\n TType extends TypeName,\r\n>(\r\n type: TType,\r\n fieldPath: string,\r\n plugins: TPlugins,\r\n existingState?: {\r\n validators: ValidatorWithMeta<unknown>[];\r\n transforms: Array<TransformFunction<unknown, unknown>>;\r\n }\r\n): ChainableFieldBuilder<TObject, TPlugins, TType, any> {\r\n // Simplified arrays without ExecutionPlan\r\n const validators: ValidatorWithMeta<unknown>[] = existingState?.validators\r\n ? [...existingState.validators]\r\n : [];\r\n\r\n // Add basic type checking validator for the specified type\r\n if (!existingState && type !== \"union\") {\r\n // Only add for new builders, not chained ones\r\n const typeValidator = getTypeValidator(type);\r\n if (typeValidator) {\r\n validators.push(typeValidator);\r\n }\r\n }\r\n const transforms: Array<TransformFunction<unknown, unknown>> =\r\n existingState?.transforms ? [...existingState.transforms] : [];\r\n\r\n // Base builder object - simplified without ExecutionPlan\r\n const builder: Record<string, unknown> = {\r\n _type: type,\r\n _fieldPath: fieldPath,\r\n _validators: validators,\r\n _transforms: transforms,\r\n\r\n build() {\r\n // For union types with no validators, add a default fail validator\r\n if (type === \"union\" && validators.length === 0) {\r\n validators.push({\r\n check: () => false,\r\n name: \"unionGuard\",\r\n messageFactory: () => \"No union type guards defined\",\r\n inputType: \"union\" as TypeName,\r\n outputType: \"union\" as TypeName,\r\n metadata: { severity: \"error\" as const, async: false },\r\n });\r\n }\r\n\r\n // Return minimal structure for unified-validator\r\n return {\r\n _validators: validators,\r\n _transforms: transforms,\r\n };\r\n },\r\n };\r\n\r\n // Attach plugin methods directly to builder\r\n attachPluginMethods(\r\n builder,\r\n type,\r\n fieldPath,\r\n plugins,\r\n validators,\r\n transforms\r\n );\r\n\r\n // Attach refine methods (needed by jsonSchema.ts)\r\n builder.refineString = () => {\r\n return createOptimizedTypeBuilder<TObject, TPlugins, \"string\">(\r\n \"string\",\r\n fieldPath,\r\n plugins,\r\n { validators, transforms }\r\n );\r\n };\r\n builder.refineNumber = () => {\r\n return createOptimizedTypeBuilder<TObject, TPlugins, \"number\">(\r\n \"number\",\r\n fieldPath,\r\n plugins,\r\n { validators, transforms }\r\n );\r\n };\r\n builder.refineBoolean = () => {\r\n return createOptimizedTypeBuilder<TObject, TPlugins, \"boolean\">(\r\n \"boolean\",\r\n fieldPath,\r\n plugins,\r\n { validators, transforms }\r\n );\r\n };\r\n builder.refineArray = () => {\r\n return createOptimizedTypeBuilder<TObject, TPlugins, \"array\">(\r\n \"array\",\r\n fieldPath,\r\n plugins,\r\n { validators, transforms }\r\n );\r\n };\r\n builder.refineObject = () => {\r\n return createOptimizedTypeBuilder<TObject, TPlugins, \"object\">(\r\n \"object\",\r\n fieldPath,\r\n plugins,\r\n { validators, transforms }\r\n );\r\n };\r\n builder.refineTuple = () => {\r\n return createOptimizedTypeBuilder<TObject, TPlugins, \"tuple\">(\r\n \"tuple\",\r\n fieldPath,\r\n plugins,\r\n { validators, transforms }\r\n );\r\n };\r\n builder.refineUnion = () => {\r\n return createOptimizedTypeBuilder<TObject, TPlugins, \"union\">(\r\n \"union\",\r\n fieldPath,\r\n plugins,\r\n { validators, transforms }\r\n );\r\n };\r\n builder.refineDate = () => {\r\n return createOptimizedTypeBuilder<TObject, TPlugins, \"date\">(\r\n \"date\",\r\n fieldPath,\r\n plugins,\r\n { validators, transforms }\r\n );\r\n };\r\n builder.refineAny = () => {\r\n return createOptimizedTypeBuilder<TObject, TPlugins, \"any\">(\r\n \"any\",\r\n fieldPath,\r\n plugins,\r\n { validators, transforms }\r\n );\r\n };\r\n\r\n return builder as ChainableFieldBuilder<TObject, TPlugins, TType, any>;\r\n}\r\n\r\n/**\r\n * Streamlined plugin method attachment - removed ExecutionPlan for bundle size\r\n */\r\nfunction attachPluginMethods<TObject extends object, TPlugins>(\r\n builder: Record<string, unknown>,\r\n type: TypeName,\r\n fieldPath: string,\r\n plugins: TPlugins,\r\n validators: ValidatorWithMeta<unknown>[],\r\n transforms: Array<TransformFunction<unknown, unknown>>\r\n): void {\r\n const pluginEntries = Object.entries(plugins as Record<string, any>);\r\n const entriesLength = pluginEntries.length;\r\n\r\n for (let i = 0; i < entriesLength; i++) {\r\n const [, plugin] = pluginEntries[i];\r\n\r\n // Quick skip invalid plugins\r\n if (!plugin || typeof plugin !== \"object\") continue;\r\n\r\n // Handle composable plugins\r\n if (plugin.category?.startsWith(\"composable\")) {\r\n if (plugin.allowedTypes && !plugin.allowedTypes.includes(type)) continue;\r\n attachComposablePlugin(builder, plugin, fieldPath, plugins);\r\n continue;\r\n }\r\n\r\n // Handle typed plugins\r\n if (typeof plugin.create !== \"function\") continue;\r\n if (plugin.allowedTypes && !plugin.allowedTypes.includes(type)) continue;\r\n\r\n const { methodName, category = \"standard\", name } = plugin;\r\n const createFn = plugin.create();\r\n\r\n // Consolidated method creation\r\n builder[methodName] = function (...args: any[]) {\r\n try {\r\n const result = createFn(...args);\r\n\r\n if (category === \"transform\") {\r\n const transformFn = extractTransformFunction(result, args[0]);\r\n transforms.push(transformFn);\r\n } else {\r\n // All validation categories (standard, conditional, fieldReference, preprocessor)\r\n const checkFn = extractCheckFunction(result, fieldPath);\r\n const validator = createValidatorMeta(\r\n checkFn,\r\n name || methodName,\r\n type,\r\n args,\r\n result\r\n );\r\n validators.push(validator);\r\n }\r\n } catch (e) {\r\n // Plugin error - ignore silently\r\n }\r\n return builder;\r\n };\r\n }\r\n}\r\n\r\n// Consolidated helper functions\r\nfunction extractTransformFunction(result: any, fallback: any) {\r\n if (typeof result === \"function\") return fallback;\r\n if (result?.__isTransform) return result.__transformFn;\r\n if (result?.__isCoerce) return (v: any) => result.coerce.coerceFn(v);\r\n if (result?.__isDefault)\r\n return (v: any, ctx: any) => result.default.applyDefault(v, ctx);\r\n if (result?.__isPreprocess)\r\n return (v: any, ctx: any) => result.preprocess.applyPreprocess(v, ctx);\r\n return fallback || ((v: any) => v);\r\n}\r\n\r\nfunction extractCheckFunction(result: any, fieldPath: string) {\r\n if (typeof result === \"function\") {\r\n return (value: any, currentValue: any) =>\r\n result(value, { path: fieldPath, allValues: currentValue }).valid;\r\n }\r\n if (result?.check) {\r\n return (value: any, currentValue: any) => result.check(value, currentValue);\r\n }\r\n return () => false;\r\n}\r\n\r\nfunction createValidatorMeta(\r\n checkFn: any,\r\n name: string,\r\n type: TypeName,\r\n args: any[],\r\n originalResult?: any\r\n) {\r\n const validator = {\r\n check: checkFn,\r\n name,\r\n // V8 optimization: Keep code and getErrorMessage from plugin\r\n code: originalResult?.code || name,\r\n pluginName: originalResult?.pluginName || name,\r\n getErrorMessage: originalResult?.getErrorMessage,\r\n messageFactory:\r\n args[args.length - 1]?.messageFactory ||\r\n originalResult?.messageFactory ||\r\n (() => \"Validation failed\"),\r\n inputType: type,\r\n outputType: type,\r\n metadata: originalResult?.metadata || {\r\n severity: \"error\" as const,\r\n async: false,\r\n },\r\n };\r\n\r\n // Preserve special methods from the original result\r\n if (originalResult) {\r\n if (originalResult.shouldSkipAllValidation) {\r\n (validator as any).shouldSkipAllValidation =\r\n originalResult.shouldSkipAllValidation;\r\n }\r\n if (originalResult.shouldSkipValidation) {\r\n (validator as any).shouldSkipValidation =\r\n originalResult.shouldSkipValidation;\r\n }\r\n if (originalResult.shouldSkipFurtherValidation) {\r\n (validator as any).shouldSkipFurtherValidation =\r\n originalResult.shouldSkipFurtherValidation;\r\n }\r\n // Preserve skip flags for null/undefined values\r\n if (originalResult.skipForNull !== undefined) {\r\n (validator as any).skipForNull = originalResult.skipForNull;\r\n }\r\n if (originalResult.skipForUndefined !== undefined) {\r\n (validator as any).skipForUndefined = originalResult.skipForUndefined;\r\n }\r\n // Preserve recursive validation markers\r\n if (originalResult.__isRecursive) {\r\n (validator as any).__isRecursive = originalResult.__isRecursive;\r\n }\r\n if (originalResult.recursive) {\r\n (validator as any).recursive = originalResult.recursive;\r\n }\r\n }\r\n\r\n return validator;\r\n}\r\n\r\n/**\r\n * Create type-safe field context without Proxy\r\n */\r\nexport function createOptimizedFieldContext<\r\n TObject extends object,\r\n TPlugins,\r\n TFieldType,\r\n>(\r\n fieldPath: string,\r\n plugins: TPlugins\r\n): FieldBuilderContext<TObject, TPlugins, TFieldType> {\r\n // Pre-create all type builders to avoid lazy initialization\r\n const stringBuilder = createOptimizedTypeBuilder<TObject, TPlugins, \"string\">(\r\n \"string\",\r\n fieldPath,\r\n plugins\r\n );\r\n const numberBuilder = createOptimizedTypeBuilder<TObject, TPlugins, \"number\">(\r\n \"number\",\r\n fieldPath,\r\n plugins\r\n );\r\n const booleanBuilder = createOptimizedTypeBuilder<\r\n TObject,\r\n TPlugins,\r\n \"boolean\"\r\n >(\"boolean\", fieldPath, plugins);\r\n const arrayBuilder = createOptimizedTypeBuilder<TObject, TPlugins, \"array\">(\r\n \"array\",\r\n fieldPath,\r\n plugins\r\n );\r\n const objectBuilder = createOptimizedTypeBuilder<TObject, TPlugins, \"object\">(\r\n \"object\",\r\n fieldPath,\r\n plugins\r\n );\r\n const unionBuilder = createOptimizedTypeBuilder<TObject, TPlugins, \"union\">(\r\n \"union\",\r\n fieldPath,\r\n plugins\r\n );\r\n const tupleBuilder = createOptimizedTypeBuilder<TObject, TPlugins, \"tuple\">(\r\n \"tuple\",\r\n fieldPath,\r\n plugins\r\n );\r\n const dateBuilder = createOptimizedTypeBuilder<TObject, TPlugins, \"date\">(\r\n \"date\",\r\n fieldPath,\r\n plugins\r\n );\r\n const anyBuilder = createOptimizedTypeBuilder<TObject, TPlugins, \"any\">(\r\n \"any\",\r\n fieldPath,\r\n plugins\r\n );\r\n\r\n // Return direct object without getters\r\n return {\r\n string: stringBuilder,\r\n number: numberBuilder,\r\n boolean: booleanBuilder,\r\n date: dateBuilder,\r\n array: arrayBuilder,\r\n tuple: tupleBuilder,\r\n union: unionBuilder,\r\n object: objectBuilder,\r\n any: anyBuilder,\r\n } as FieldBuilderContext<TObject, TPlugins, TFieldType>;\r\n}\r\n\r\n// Export with standard name for compatibility\r\nexport { createOptimizedFieldContext as createFieldContext };\r\n", "/**\r\n * Field Processing Utilities\r\n * Integrated field processing utilities - eliminates duplicate logic\r\n */\r\n\r\nexport type FieldAccessor<T = any> = (obj: any) => T;\r\nexport type FieldSetter<T = any> = (obj: any, value: T) => void;\r\n\r\nexport interface ParsedFieldPath {\r\n segments: string[];\r\n isArrayElement: boolean;\r\n arrayPath?: string;\r\n elementKey?: string;\r\n depth: number;\r\n}\r\n\r\nexport interface ArrayFieldInfo {\r\n arrayPath: string;\r\n elementPath: string;\r\n indexPattern: RegExp;\r\n}\r\n\r\n// NOTE: Caches removed to prevent memory leaks in server environments\r\n// Each validator instance should manage its own cache if needed\r\n\r\n/**\r\n * Parse field path (consolidates logic duplicated across 4 files)\r\n */\r\nexport function parseFieldPath(path: string): ParsedFieldPath {\r\n // Direct computation without caching\r\n const segments = path.split(\".\");\r\n let isArrayElement = false;\r\n let arrayPath: string | undefined;\r\n let elementKey: string | undefined;\r\n\r\n const result: ParsedFieldPath = {\r\n segments,\r\n isArrayElement,\r\n arrayPath,\r\n elementKey,\r\n depth: segments.length,\r\n };\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Create field accessor (consolidates and optimizes duplicated logic)\r\n */\r\nexport function createFieldAccessor<T = any>(path: string): FieldAccessor<T> {\r\n // Direct creation without caching\r\n const parsedPath = parseFieldPath(path);\r\n let accessor: FieldAccessor<T>;\r\n\r\n // Performance optimization: Generate optimized accessor based on depth\r\n if (parsedPath.depth === 1) {\r\n // Single property (fastest)\r\n const key = parsedPath.segments[0];\r\n accessor = (obj: any) => obj?.[key];\r\n } else if (parsedPath.depth === 2) {\r\n // 2 levels (fast)\r\n const [key1, key2] = parsedPath.segments;\r\n accessor = (obj: any) => obj?.[key1]?.[key2];\r\n } else if (parsedPath.depth === 3) {\r\n // 3 levels (medium speed)\r\n const [key1, key2, key3] = parsedPath.segments;\r\n accessor = (obj: any) => obj?.[key1]?.[key2]?.[key3];\r\n } else {\r\n // Deep nesting (generic)\r\n accessor = (obj: any) => {\r\n let current = obj;\r\n for (const segment of parsedPath.segments) {\r\n if (current == null) return undefined;\r\n current = current[segment];\r\n }\r\n return current;\r\n };\r\n }\r\n\r\n return accessor;\r\n}\r\n\r\n/**\r\n * Create field setter (consolidates and optimizes duplicated logic)\r\n */\r\nexport function createFieldSetter<T = any>(path: string): FieldSetter<T> {\r\n // Direct creation without caching\r\n const parsedPath = parseFieldPath(path);\r\n let setter: FieldSetter<T>;\r\n\r\n // Performance optimization: Generate optimized setter based on depth\r\n if (parsedPath.depth === 1) {\r\n // Single property (fastest)\r\n const key = parsedPath.segments[0];\r\n setter = (obj: any, value: T) => {\r\n if (obj != null) obj[key] = value;\r\n };\r\n } else if (parsedPath.depth === 2) {\r\n // 2 levels (fast)\r\n const [key1, key2] = parsedPath.segments;\r\n setter = (obj: any, value: T) => {\r\n if (obj != null) {\r\n if (!obj[key1]) obj[key1] = {};\r\n obj[key1][key2] = value;\r\n }\r\n };\r\n } else if (parsedPath.depth === 3) {\r\n // 3 levels (medium speed)\r\n const [key1, key2, key3] = parsedPath.segments;\r\n setter = (obj: any, value: T) => {\r\n if (obj != null) {\r\n if (!obj[key1]) obj[key1] = {};\r\n if (!obj[key1][key2]) obj[key1][key2] = {};\r\n obj[key1][key2][key3] = value;\r\n }\r\n };\r\n } else {\r\n // Deep nesting (generic)\r\n setter = (obj: any, value: T) => {\r\n if (obj == null) return;\r\n\r\n let current = obj;\r\n const segments = parsedPath.segments;\r\n\r\n for (let i = 0; i < segments.length - 1; i++) {\r\n const segment = segments[i];\r\n if (!current[segment]) {\r\n current[segment] = {};\r\n }\r\n current = current[segment];\r\n }\r\n\r\n current[segments[segments.length - 1]] = value;\r\n };\r\n }\r\n\r\n return setter;\r\n}\r\n\r\n/**\r\n * Get nested value (unified helper)\r\n */\r\nexport function getNestedValue(obj: any, path: string): any {\r\n const accessor = createFieldAccessor(path);\r\n return accessor(obj);\r\n}\r\n\r\n/**\r\n * Set nested value (unified helper)\r\n */\r\nexport function setNestedValue(obj: any, path: string, value: any): void {\r\n const setter = createFieldSetter(path);\r\n setter(obj, value);\r\n}\r\n\r\n/**\r\n * Analyze array field information\r\n */\r\nexport function analyzeArrayField(path: string): ArrayFieldInfo | null {\r\n const parsedPath = parseFieldPath(path);\r\n\r\n if (\r\n !parsedPath.isArrayElement ||\r\n !parsedPath.arrayPath ||\r\n !parsedPath.elementKey\r\n ) {\r\n return null;\r\n }\r\n\r\n return {\r\n arrayPath: parsedPath.arrayPath,\r\n elementPath: parsedPath.elementKey,\r\n indexPattern: new RegExp(\r\n `${parsedPath.arrayPath.replace(/\\./g, \"\\\\.\")}\\\\[(\\\\d+)\\\\]\\\\.${parsedPath.elementKey.replace(/\\./g, \"\\\\.\")}`\r\n ),\r\n };\r\n}\r\n\r\n/**\r\n * Create array accessor (optimized)\r\n */\r\nexport function createArrayAccessor(arrayPath: string): FieldAccessor<any[]> {\r\n const baseAccessor = createFieldAccessor<any>(arrayPath);\r\n\r\n return (obj: any) => {\r\n const value = baseAccessor(obj);\r\n return Array.isArray(value) ? value : [];\r\n };\r\n}\r\n\r\n/**\r\n * Group array fields from field definitions\r\n */\r\nexport function groupArrayFields(\r\n fieldPaths: string[]\r\n): Map<string, { arrayPath: string; elementFields: string[] }> {\r\n const arrayGroups = new Map<\r\n string,\r\n { arrayPath: string; elementFields: string[] }\r\n >();\r\n\r\n for (const path of fieldPaths) {\r\n const arrayInfo = analyzeArrayField(path);\r\n\r\n if (arrayInfo) {\r\n const { arrayPath, elementPath } = arrayInfo;\r\n\r\n if (!arrayGroups.has(arrayPath)) {\r\n arrayGroups.set(arrayPath, {\r\n arrayPath,\r\n elementFields: [],\r\n });\r\n }\r\n\r\n arrayGroups.get(arrayPath)!.elementFields.push(elementPath);\r\n }\r\n }\r\n\r\n return arrayGroups;\r\n}\r\n\r\n/**\r\n * Create batch accessors (for accessing multiple fields at once)\r\n */\r\nexport function createBatchAccessors(\r\n paths: string[]\r\n): Array<{ fieldName: string; path: string; accessor: FieldAccessor }> {\r\n return paths.map((path) => ({\r\n fieldName: path.split(\".\").pop() || path,\r\n path,\r\n accessor: createFieldAccessor(path),\r\n }));\r\n}\r\n\r\n/**\r\n * Validate field path\r\n */\r\nexport function isValidFieldPath(path: string): boolean {\r\n if (!path || typeof path !== \"string\") {\r\n return false;\r\n }\r\n\r\n // Check for empty segments or invalid characters\r\n const segments = path.split(\".\");\r\n return segments.every(\r\n (segment) =>\r\n segment.length > 0 && /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(segment)\r\n );\r\n}\r\n\r\n/**\r\n * Normalize field path\r\n */\r\nexport function normalizeFieldPath(path: string): string {\r\n return path\r\n .split(\".\")\r\n .filter((segment) => segment.length > 0)\r\n .join(\".\");\r\n}\r\n\r\n/**\r\n * Compare field paths\r\n */\r\nexport function compareFieldPaths(path1: string, path2: string): number {\r\n const segments1 = path1.split(\".\");\r\n const segments2 = path2.split(\".\");\r\n\r\n // Compare by depth\r\n if (segments1.length !== segments2.length) {\r\n return segments1.length - segments2.length;\r\n }\r\n\r\n // Compare alphabetically\r\n return path1.localeCompare(path2);\r\n}\r\n\r\n/**\r\n * Clear cache (for memory management)\r\n * @deprecated Caches have been removed to prevent memory leaks\r\n */\r\nexport function clearCache(): void {\r\n // No-op: caches have been removed\r\n}\r\n\r\n/**\r\n * Get cache statistics (for debugging)\r\n * @deprecated Caches have been removed to prevent memory leaks\r\n */\r\nexport function getCacheStats(): {\r\n pathCacheSize: number;\r\n accessorCacheSize: number;\r\n setterCacheSize: number;\r\n} {\r\n return {\r\n pathCacheSize: 0,\r\n accessorCacheSize: 0,\r\n setterCacheSize: 0,\r\n };\r\n}\r\n\r\n// FieldUtils object for backward compatibility\r\nexport const FieldUtils = {\r\n parseFieldPath,\r\n createFieldAccessor,\r\n createFieldSetter,\r\n getNestedValue,\r\n setNestedValue,\r\n analyzeArrayField,\r\n createArrayAccessor,\r\n groupArrayFields,\r\n createBatchAccessors,\r\n isValidFieldPath,\r\n normalizeFieldPath,\r\n compareFieldPaths,\r\n clearCache,\r\n getCacheStats,\r\n};\r\n", "/**\r\n * Core Validation Engine\r\n * Integrated validation execution engine - eliminates duplicate logic\r\n */\r\n\r\nimport { createFieldAccessor } from \"./field-utils\";\r\nexport interface ValidationError {\r\n path: string;\r\n code: string;\r\n message: string;\r\n}\r\n\r\nexport interface ValidationResult {\r\n valid: boolean;\r\n errors: ValidationError[];\r\n}\r\n\r\nexport interface ParseResult extends ValidationResult {\r\n data?: any;\r\n}\r\n\r\nexport interface ValidationContext {\r\n originalValue: any;\r\n currentValue: any;\r\n allValues: any;\r\n path: string;\r\n arrayContext?: import(\"../../plugin/types\").ArrayContext;\r\n}\r\n\r\nexport interface ValidatorFunction {\r\n check: (\r\n value: any,\r\n allValues?: any,\r\n arrayContext?: import(\"../../plugin/types\").ArrayContext\r\n ) => boolean;\r\n code?: string;\r\n pluginName?: string;\r\n getErrorMessage?: (\r\n value: any,\r\n path: string,\r\n allValues?: any,\r\n arrayContext?: import(\"../../plugin/types\").ArrayContext\r\n ) => string;\r\n messageFactory?: (context: any) => string;\r\n params?: any[];\r\n metadata?: {\r\n type?: string;\r\n category?: string;\r\n [key: string]: any;\r\n };\r\n}\r\n\r\nexport interface TransformFunction {\r\n apply?: (value: any, context?: any) => any;\r\n transformFn?: (value: any) => any;\r\n (value: any): any;\r\n}\r\n\r\nexport interface ValidationField {\r\n path: string;\r\n validators: ValidatorFunction[];\r\n transforms: TransformFunction[];\r\n}\r\n\r\n// === Private helper functions ===\r\n\r\n/**\r\n * Execute validator (normalized common logic)\r\n */\r\nfunction executeValidator(\r\n validator: ValidatorFunction,\r\n value: any,\r\n context: ValidationContext\r\n): boolean {\r\n const checkFn = validator.check;\r\n\r\n if (typeof checkFn !== \"function\") {\r\n throw new Error(`Invalid validator: check function is not defined`);\r\n }\r\n\r\n try {\r\n return checkFn(value, context.allValues, context.arrayContext);\r\n } catch (error) {\r\n // Validator execution error - treat as validation failure\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Issue params extraction\r\n */\r\nfunction extractIssueParams(\r\n validator: ValidatorFunction,\r\n value: any\r\n): Record<string, any> {\r\n const params = validator.params || [];\r\n\r\n // Extract common parameters based on validator type\r\n if (params.length > 0) {\r\n const firstParam = params[0];\r\n\r\n if (typeof firstParam === \"number\") {\r\n return {\r\n expected: firstParam,\r\n actual: typeof value === \"string\" ? value.length : value,\r\n };\r\n }\r\n\r\n if (typeof firstParam === \"string\") {\r\n return {\r\n pattern: firstParam,\r\n expected: firstParam,\r\n };\r\n }\r\n }\r\n\r\n return {};\r\n}\r\n\r\n/**\r\n * Create validation error (integrated error handling)\r\n */\r\nfunction createValidationError(\r\n validator: ValidatorFunction,\r\n value: any,\r\n context: ValidationContext\r\n): ValidationError {\r\n const code = validator.code || validator.pluginName || \"VALIDATION_ERROR\";\r\n let message = \"Validation failed\";\r\n\r\n // Error message generation (duplicated logic)\r\n try {\r\n if (validator.getErrorMessage) {\r\n message = validator.getErrorMessage(\r\n value,\r\n context.path,\r\n context.allValues,\r\n context.arrayContext\r\n );\r\n } else if (validator.messageFactory) {\r\n const issueContext = {\r\n path: context.path,\r\n value,\r\n code,\r\n ...extractIssueParams(validator, value),\r\n };\r\n message = validator.messageFactory(issueContext);\r\n }\r\n } catch (error) {\r\n // Fallback to default message if error generation fails\r\n message = `Validation failed for ${context.path}`;\r\n }\r\n\r\n return {\r\n path: context.path,\r\n code,\r\n message,\r\n };\r\n}\r\n\r\n/**\r\n * Transform function \u6B63\u898F\u5316\r\n */\r\nfunction normalizeTransformFunction(\r\n transform: TransformFunction\r\n): (value: any, context?: any) => any {\r\n if (typeof transform === \"function\") {\r\n return transform;\r\n }\r\n\r\n // Type guard for object with apply property\r\n const transformObj = transform as {\r\n apply?: (value: any, context?: any) => any;\r\n transformFn?: (value: any) => any;\r\n };\r\n\r\n if (transformObj.apply && typeof transformObj.apply === \"function\") {\r\n return transformObj.apply;\r\n }\r\n\r\n if (\r\n transformObj.transformFn &&\r\n typeof transformObj.transformFn === \"function\"\r\n ) {\r\n return transformObj.transformFn;\r\n }\r\n\r\n throw new Error(\"Invalid transform function\");\r\n}\r\n\r\n/**\r\n * Field value getter (integrated path parsing)\r\n */\r\nfunction getFieldValue(obj: any, path: string): any {\r\n if (!path.includes(\".\")) {\r\n return obj?.[path];\r\n }\r\n\r\n // V8 Optimization: Inline simple 2-level access\r\n const dotIndex = path.indexOf(\".\");\r\n if (dotIndex > 0 && path.indexOf(\".\", dotIndex + 1) === -1) {\r\n // Exactly one dot - optimize for common case\r\n const key1 = path.substring(0, dotIndex);\r\n const key2 = path.substring(dotIndex + 1);\r\n return obj?.[key1]?.[key2];\r\n }\r\n\r\n // Use optimized pre-compiled accessor for complex paths\r\n const accessor = createFieldAccessor(path);\r\n return accessor(obj);\r\n}\r\n\r\n/**\r\n * Field value setter (integrated path parsing)\r\n */\r\nfunction setFieldValue(obj: any, path: string, value: any): void {\r\n if (!path.includes(\".\")) {\r\n if (obj != null) obj[path] = value;\r\n return;\r\n }\r\n\r\n // This function is kept for backward compatibility but uses path.split\r\n // New code should use scoped setters from the engine\r\n const segments = path.split(\".\");\r\n const lastIndex = segments.length - 1;\r\n let current = obj;\r\n for (let i = 0; i < lastIndex; i++) {\r\n const segment = segments[i];\r\n if (!current[segment]) {\r\n current[segment] = {};\r\n }\r\n current = current[segment];\r\n }\r\n current[segments[lastIndex]] = value;\r\n}\r\n\r\n/**\r\n * Deep clone (for data transformation)\r\n */\r\nfunction deepClone(obj: any): any {\r\n if (obj === null || typeof obj !== \"object\") return obj;\r\n if (obj instanceof Date) return new Date(obj.getTime());\r\n\r\n // V8 Optimization: Handle arrays with traditional for loop\r\n if (Array.isArray(obj)) {\r\n const len = obj.length;\r\n const cloned = new Array(len);\r\n for (let i = 0; i < len; i++) {\r\n cloned[i] = deepClone(obj[i]);\r\n }\r\n return cloned;\r\n }\r\n\r\n // V8 Optimization: Use Object.keys for better performance\r\n const cloned: any = {};\r\n const keys = Object.keys(obj);\r\n const keysLen = keys.length;\r\n for (let i = 0; i < keysLen; i++) {\r\n const key = keys[i];\r\n cloned[key] = deepClone(obj[key]);\r\n }\r\n return cloned;\r\n}\r\n\r\n// === Public functions ===\r\n/**\r\n * Execute validation for single field\r\n */\r\nexport function validateField(\r\n field: ValidationField,\r\n value: any,\r\n context: ValidationContext,\r\n options: { abortEarly?: boolean } = {}\r\n): ValidationResult {\r\n const { abortEarly = true } = options;\r\n const validatorsLength = field.validators.length;\r\n\r\n // Fast path: no validators\r\n if (validatorsLength === 0) {\r\n return { valid: true, errors: [] };\r\n }\r\n\r\n // Fast path: single validator\r\n if (validatorsLength === 1) {\r\n const validator = field.validators[0];\r\n const checkFn = validator.check;\r\n\r\n if (typeof checkFn !== \"function\") {\r\n throw new Error(`Invalid validator: check function is not defined`);\r\n }\r\n\r\n try {\r\n const isValid = checkFn(value, context.allValues, context.arrayContext);\r\n if (isValid) {\r\n return { valid: true, errors: [] };\r\n }\r\n\r\n return {\r\n valid: false,\r\n errors: [createValidationError(validator, value, context)],\r\n };\r\n } catch (error) {\r\n return {\r\n valid: false,\r\n errors: [createValidationError(validator, value, context)],\r\n };\r\n }\r\n }\r\n\r\n const errors: ValidationError[] = [];\r\n\r\n // Check for skip conditions first using metadata-based approach\r\n for (let i = 0; i < validatorsLength; i++) {\r\n const validator = field.validators[i];\r\n\r\n // Check if this is a skip validator using metadata\r\n if (\r\n validator.metadata?.type === \"conditional\" &&\r\n validator.metadata?.category === \"skip\"\r\n ) {\r\n // For skip validators, if check returns true, skip all further validation\r\n const checkFn = validator.check;\r\n if (typeof checkFn === \"function\") {\r\n try {\r\n if (checkFn(value, context.allValues, context.arrayContext)) {\r\n return { valid: true, errors: [] };\r\n }\r\n } catch (error) {\r\n // Skip validator failed, continue validation\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Validator execution loop with inlined executeValidator for performance\r\n for (let i = 0; i < validatorsLength; i++) {\r\n const validator = field.validators[i];\r\n const checkFn = validator.check;\r\n\r\n if (typeof checkFn !== \"function\") {\r\n throw new Error(`Invalid validator: check function is not defined`);\r\n }\r\n\r\n let isValid = false;\r\n try {\r\n isValid = checkFn(value, context.allValues, context.arrayContext);\r\n } catch (error) {\r\n // Validator execution error - treat as validation failure\r\n isValid = false;\r\n }\r\n\r\n if (!isValid) {\r\n errors.push(createValidationError(validator, value, context));\r\n\r\n if (abortEarly) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n };\r\n}\r\n\r\n/**\r\n * Batch validation for multiple fields\r\n */\r\nexport function validateBatch(\r\n fields: ValidationField[],\r\n values: any,\r\n options: { abortEarly?: boolean; abortEarlyOnEachField?: boolean } = {}\r\n): ValidationResult {\r\n const { abortEarly = false, abortEarlyOnEachField = true } = options;\r\n const allErrors: ValidationError[] = [];\r\n\r\n const fieldsLength = fields.length;\r\n for (let i = 0; i < fieldsLength; i++) {\r\n const field = fields[i];\r\n const fieldValue = getFieldValue(values, field.path);\r\n const context: ValidationContext = {\r\n originalValue: fieldValue,\r\n currentValue: fieldValue,\r\n allValues: values,\r\n path: field.path,\r\n };\r\n\r\n const result = validateField(field, fieldValue, context, {\r\n abortEarly: abortEarlyOnEachField,\r\n });\r\n\r\n if (!result.valid) {\r\n allErrors.push(...result.errors);\r\n\r\n if (abortEarly) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n valid: allErrors.length === 0,\r\n errors: allErrors,\r\n };\r\n}\r\n\r\n/**\r\n * Parse field (validation + transform)\r\n */\r\nexport function parseField(\r\n field: ValidationField,\r\n value: any,\r\n context: ValidationContext,\r\n options: { abortEarly?: boolean } = {}\r\n): ParseResult {\r\n const { abortEarly = true } = options;\r\n\r\n // First validate\r\n const validationResult = validateField(field, value, context, { abortEarly });\r\n\r\n if (!validationResult.valid) {\r\n return {\r\n valid: false,\r\n errors: validationResult.errors,\r\n };\r\n }\r\n\r\n // Then apply transforms\r\n let transformedValue = value;\r\n try {\r\n transformedValue = applyTransforms(field.transforms, value, context);\r\n } catch (error) {\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n path: context.path,\r\n code: \"TRANSFORM_ERROR\",\r\n message: `Transform failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n return {\r\n valid: true,\r\n data: transformedValue,\r\n errors: [],\r\n };\r\n}\r\n\r\n/**\r\n * Batch parse multiple fields\r\n */\r\nexport function parseBatch(\r\n fields: ValidationField[],\r\n values: any,\r\n options: { abortEarly?: boolean; abortEarlyOnEachField?: boolean } = {}\r\n): ParseResult {\r\n const { abortEarly = false, abortEarlyOnEachField = true } = options;\r\n const allErrors: ValidationError[] = [];\r\n const transformedData = deepClone(values);\r\n\r\n const fieldsForParseLength = fields.length;\r\n for (let i = 0; i < fieldsForParseLength; i++) {\r\n const field = fields[i];\r\n const fieldValue = getFieldValue(values, field.path);\r\n const context: ValidationContext = {\r\n originalValue: fieldValue,\r\n currentValue: fieldValue,\r\n allValues: values,\r\n path: field.path,\r\n };\r\n\r\n const result = parseField(field, fieldValue, context, {\r\n abortEarly: abortEarlyOnEachField,\r\n });\r\n\r\n if (!result.valid) {\r\n allErrors.push(...result.errors);\r\n\r\n if (abortEarly) {\r\n break;\r\n }\r\n } else if (result.data !== undefined) {\r\n setFieldValue(transformedData, field.path, result.data);\r\n }\r\n }\r\n\r\n return {\r\n valid: allErrors.length === 0,\r\n data: allErrors.length === 0 ? transformedData : undefined,\r\n errors: allErrors,\r\n };\r\n}\r\n\r\n/**\r\n * Apply transform (logic duplicated across all files)\r\n */\r\nexport function applyTransforms(\r\n transforms: TransformFunction[],\r\n value: any,\r\n context: ValidationContext\r\n): any {\r\n let currentValue = value;\r\n\r\n // V8 Optimization: Traditional for loop instead of for...of\r\n const transformsLength = transforms.length;\r\n for (let i = 0; i < transformsLength; i++) {\r\n // Transform function normalization (duplicated logic)\r\n const transformFn = normalizeTransformFunction(transforms[i]);\r\n currentValue = transformFn(currentValue, context);\r\n }\r\n\r\n return currentValue;\r\n}\r\n\r\n/**\r\n * Hoisted validation (for high-speed validation)\r\n */\r\nexport function validateHoisted(\r\n field: ValidationField,\r\n value: any,\r\n allValues: any,\r\n abortEarlyOnEachField: boolean = true,\r\n arrayContext?: import(\"../../plugin/types\").ArrayContext\r\n): {\r\n valid: boolean;\r\n errorIndices?: number[];\r\n} {\r\n const validatorsLength = field.validators.length;\r\n\r\n // Fast path: no validators\r\n if (validatorsLength === 0) {\r\n return { valid: true };\r\n }\r\n\r\n // Fast path: single validator\r\n if (validatorsLength === 1) {\r\n const checkFn = field.validators[0].check;\r\n if (typeof checkFn !== \"function\") {\r\n return { valid: false, errorIndices: [0] };\r\n }\r\n\r\n try {\r\n const isValid = checkFn(value, allValues, arrayContext);\r\n return isValid ? { valid: true } : { valid: false, errorIndices: [0] };\r\n } catch (error) {\r\n return { valid: false, errorIndices: [0] };\r\n }\r\n }\r\n\r\n // Multiple validators - optimize for abort early case\r\n if (abortEarlyOnEachField) {\r\n for (let i = 0; i < validatorsLength; i++) {\r\n const checkFn = field.validators[i].check;\r\n if (typeof checkFn !== \"function\") {\r\n return { valid: false, errorIndices: [i] };\r\n }\r\n\r\n let isValid = false;\r\n try {\r\n isValid = checkFn(value, allValues, arrayContext);\r\n } catch (error) {\r\n isValid = false;\r\n }\r\n\r\n if (!isValid) {\r\n return { valid: false, errorIndices: [i] };\r\n }\r\n }\r\n return { valid: true };\r\n }\r\n\r\n // Collect all errors\r\n const errorIndices: number[] = [];\r\n for (let i = 0; i < validatorsLength; i++) {\r\n const checkFn = field.validators[i].check;\r\n if (typeof checkFn !== \"function\") {\r\n errorIndices.push(i);\r\n continue;\r\n }\r\n\r\n let isValid = false;\r\n try {\r\n isValid = checkFn(value, allValues, arrayContext);\r\n } catch (error) {\r\n isValid = false;\r\n }\r\n\r\n if (!isValid) {\r\n errorIndices.push(i);\r\n }\r\n }\r\n\r\n return errorIndices.length === 0\r\n ? { valid: true }\r\n : { valid: false, errorIndices };\r\n}\r\n\r\n/**\r\n * Rebuild errors (for hoisted validation)\r\n */\r\nexport function reconstructErrors(\r\n field: ValidationField,\r\n errorIndices: number[],\r\n value: any,\r\n allValues: any,\r\n arrayContext?: import(\"../../plugin/types\").ArrayContext\r\n): ValidationError[] {\r\n const context: ValidationContext = {\r\n originalValue: value,\r\n currentValue: value,\r\n allValues,\r\n path: field.path,\r\n arrayContext,\r\n };\r\n\r\n return errorIndices\r\n .filter((index) => index < field.validators.length)\r\n .map((index) => {\r\n const validator = field.validators[index];\r\n return createValidationError(validator, value, context);\r\n });\r\n}\r\n\r\n/**\r\n * ValidationEngine interface for compatibility\r\n */\r\nexport interface ValidationEngine {\r\n validateField: typeof validateField;\r\n validateBatch: typeof validateBatch;\r\n parseField: typeof parseField;\r\n parseBatch: typeof parseBatch;\r\n applyTransforms: typeof applyTransforms;\r\n validateHoisted: typeof validateHoisted;\r\n reconstructErrors: typeof reconstructErrors;\r\n}\r\n\r\n/**\r\n * Create a ValidationEngine object with all functions\r\n */\r\nfunction createEngine(): ValidationEngine {\r\n // Create engine-scoped caches to prevent memory leaks\r\n const localSetterCache = new Map<string, (obj: any, value: any) => void>();\r\n\r\n // Closure-based setter factory scoped to this engine\r\n const createScopedFieldSetter = (\r\n path: string\r\n ): ((obj: any, value: any) => void) => {\r\n let setter = localSetterCache.get(path);\r\n if (!setter) {\r\n if (!path.includes(\".\")) {\r\n setter = (obj: any, value: any) => {\r\n if (obj != null) obj[path] = value;\r\n };\r\n } else {\r\n const segments = path.split(\".\");\r\n const lastIndex = segments.length - 1;\r\n setter = (obj: any, value: any) => {\r\n let current = obj;\r\n for (let i = 0; i < lastIndex; i++) {\r\n const segment = segments[i];\r\n if (!current[segment]) {\r\n current[segment] = {};\r\n }\r\n current = current[segment];\r\n }\r\n current[segments[lastIndex]] = value;\r\n };\r\n }\r\n localSetterCache.set(path, setter);\r\n }\r\n return setter;\r\n };\r\n\r\n // Scoped field value setter using engine-scoped cache\r\n const setScopedFieldValue = (obj: any, path: string, value: any): void => {\r\n if (!path.includes(\".\")) {\r\n if (obj != null) obj[path] = value;\r\n return;\r\n }\r\n\r\n const setter = createScopedFieldSetter(path);\r\n setter(obj, value);\r\n };\r\n\r\n // Create scoped versions of validation functions\r\n const scopedParseBatch = (\r\n fields: ValidationField[],\r\n values: any,\r\n options: { abortEarly?: boolean; abortEarlyOnEachField?: boolean } = {}\r\n ): ParseResult => {\r\n const { abortEarly = false, abortEarlyOnEachField = true } = options;\r\n const allErrors: ValidationError[] = [];\r\n const transformedData = deepClone(values);\r\n\r\n const fieldsForParseLength = fields.length;\r\n for (let i = 0; i < fieldsForParseLength; i++) {\r\n const field = fields[i];\r\n const fieldValue = getFieldValue(values, field.path);\r\n const context: ValidationContext = {\r\n originalValue: fieldValue,\r\n currentValue: fieldValue,\r\n allValues: values,\r\n path: field.path,\r\n };\r\n\r\n const result = parseField(field, fieldValue, context, {\r\n abortEarly: abortEarlyOnEachField,\r\n });\r\n\r\n if (!result.valid) {\r\n allErrors.push(...result.errors);\r\n\r\n if (abortEarly) {\r\n break;\r\n }\r\n } else if (result.data !== undefined) {\r\n setScopedFieldValue(transformedData, field.path, result.data);\r\n }\r\n }\r\n\r\n return {\r\n valid: allErrors.length === 0,\r\n data: allErrors.length === 0 ? transformedData : undefined,\r\n errors: allErrors,\r\n };\r\n };\r\n\r\n return {\r\n validateField,\r\n validateBatch,\r\n parseField,\r\n parseBatch: scopedParseBatch, // Use scoped version\r\n applyTransforms,\r\n validateHoisted,\r\n reconstructErrors,\r\n };\r\n}\r\n\r\n/**\r\n * \u30B7\u30F3\u30B0\u30EB\u30C8\u30F3\u30A8\u30F3\u30B8\u30F3\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\r\n */\r\nlet engineInstance: ValidationEngine | null = null;\r\n\r\n/**\r\n * \u5171\u6709\u30A8\u30F3\u30B8\u30F3\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u53D6\u5F97\r\n */\r\nexport function getValidationEngine(): ValidationEngine {\r\n if (!engineInstance) {\r\n engineInstance = createEngine();\r\n }\r\n return engineInstance;\r\n}\r\n\r\n/**\r\n * Create new engine instance (for testing)\r\n */\r\nexport function createValidationEngine(): ValidationEngine {\r\n return createEngine();\r\n}\r\n", "/**\r\n * Strategy Pattern Implementation\r\n * Validation strategy integration and factory pattern\r\n */\r\n\r\nimport {\r\n ValidationEngine,\r\n getValidationEngine,\r\n ValidationField,\r\n ValidationResult,\r\n ParseResult,\r\n ValidationContext,\r\n} from \"./validation-engine\";\r\nimport { FieldUtils, createFieldAccessor } from \"./field-utils\";\r\n\r\nexport enum ValidationStrategy {\r\n FAST_SEPARATED = \"fast_separated\",\r\n DEFINITION_ORDER = \"definition_order\",\r\n ARRAY_BATCH = \"array_batch\",\r\n HOISTED_OPTIMIZED = \"hoisted_optimized\",\r\n}\r\n\r\nexport interface StrategyValidationOptions {\r\n abortEarly?: boolean;\r\n abortEarlyOnEachField?: boolean;\r\n}\r\n\r\nexport interface StrategyAnalysis {\r\n strategy: ValidationStrategy;\r\n reason: string;\r\n canOptimize: boolean;\r\n hasTransforms: boolean;\r\n hasArrayFields: boolean;\r\n fieldCount: number;\r\n}\r\n\r\n/**\r\n * Unified validation strategy interface\r\n */\r\nexport interface IValidationStrategy {\r\n readonly strategyType: ValidationStrategy;\r\n\r\n validate(\r\n value: any,\r\n rootData: any,\r\n options?: StrategyValidationOptions\r\n ): ValidationResult;\r\n\r\n parse(\r\n value: any,\r\n rootData: any,\r\n options?: StrategyValidationOptions\r\n ): ParseResult;\r\n\r\n // Hoisted optimization support\r\n validateHoisted?(\r\n value: any,\r\n rootData: any,\r\n abortEarlyOnEachField?: boolean\r\n ): {\r\n valid: boolean;\r\n errorIndices?: number[];\r\n };\r\n\r\n reconstructErrors?(\r\n errorIndices: number[],\r\n value: any,\r\n rootData: any,\r\n abortEarlyOnEachField?: boolean\r\n ): Array<{ path: string; code: string; message: string }>;\r\n}\r\n\r\n/**\r\n * Fast Separated Strategy\r\n * Execute in order: Validators \u2192 Transforms (optimized)\r\n */\r\nexport function createFastSeparatedStrategy(\r\n field: ValidationField,\r\n engine: ValidationEngine = getValidationEngine()\r\n): IValidationStrategy {\r\n return {\r\n strategyType: ValidationStrategy.FAST_SEPARATED,\r\n\r\n validate(\r\n value: any,\r\n rootData: any,\r\n options: StrategyValidationOptions = {}\r\n ): ValidationResult {\r\n const context: ValidationContext = {\r\n originalValue: value,\r\n currentValue: value,\r\n allValues: rootData,\r\n path: field.path,\r\n };\r\n\r\n return engine.validateField(field, value, context, {\r\n abortEarly: options.abortEarlyOnEachField !== false,\r\n });\r\n },\r\n\r\n parse(\r\n value: any,\r\n rootData: any,\r\n options: StrategyValidationOptions = {}\r\n ): ParseResult {\r\n const context: ValidationContext = {\r\n originalValue: value,\r\n currentValue: value,\r\n allValues: rootData,\r\n path: field.path,\r\n };\r\n\r\n return engine.parseField(field, value, context, {\r\n abortEarly: options.abortEarlyOnEachField !== false,\r\n });\r\n },\r\n\r\n validateHoisted(\r\n value: any,\r\n rootData: any,\r\n abortEarlyOnEachField: boolean = true\r\n ): {\r\n valid: boolean;\r\n errorIndices?: number[];\r\n } {\r\n return engine.validateHoisted(\r\n field,\r\n value,\r\n rootData,\r\n abortEarlyOnEachField\r\n );\r\n },\r\n\r\n reconstructErrors(\r\n errorIndices: number[],\r\n value: any,\r\n rootData: any,\r\n abortEarlyOnEachField: boolean = true\r\n ): Array<{ path: string; code: string; message: string }> {\r\n return engine.reconstructErrors(field, errorIndices, value, rootData);\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Definition Order Strategy\r\n * Execute in definition order (including transforms)\r\n */\r\nexport function createDefinitionOrderStrategy(\r\n field: ValidationField,\r\n engine: ValidationEngine = getValidationEngine()\r\n): IValidationStrategy {\r\n const strategy: IValidationStrategy = {\r\n strategyType: ValidationStrategy.DEFINITION_ORDER,\r\n\r\n validate(\r\n value: any,\r\n rootData: any,\r\n options: StrategyValidationOptions = {}\r\n ): ValidationResult {\r\n // Definition order strategy uses parse for validation to maintain order\r\n const parseResult = strategy.parse(value, rootData, options);\r\n return {\r\n valid: parseResult.valid,\r\n errors: parseResult.errors,\r\n };\r\n },\r\n\r\n parse(\r\n value: any,\r\n rootData: any,\r\n options: StrategyValidationOptions = {}\r\n ): ParseResult {\r\n const context: ValidationContext = {\r\n originalValue: value,\r\n currentValue: value,\r\n allValues: rootData,\r\n path: field.path,\r\n };\r\n\r\n return engine.parseField(field, value, context, {\r\n abortEarly: options.abortEarlyOnEachField !== false,\r\n });\r\n },\r\n\r\n validateHoisted(\r\n value: any,\r\n rootData: any,\r\n abortEarlyOnEachField: boolean = true\r\n ): {\r\n valid: boolean;\r\n errorIndices?: number[];\r\n } {\r\n // For definition order, hoisting is less beneficial but still supported\r\n return engine.validateHoisted(\r\n field,\r\n value,\r\n rootData,\r\n abortEarlyOnEachField\r\n );\r\n },\r\n\r\n reconstructErrors(\r\n errorIndices: number[],\r\n value: any,\r\n rootData: any,\r\n abortEarlyOnEachField: boolean = true\r\n ): Array<{ path: string; code: string; message: string }> {\r\n return engine.reconstructErrors(field, errorIndices, value, rootData);\r\n },\r\n };\r\n\r\n return strategy;\r\n}\r\n\r\n/**\r\n * Array Batch Strategy\r\n * Batch processing of array elements (optimized)\r\n */\r\nexport function createArrayBatchStrategy(\r\n arrayPath: string,\r\n elementFields: ValidationField[],\r\n engine: ValidationEngine = getValidationEngine()\r\n): IValidationStrategy {\r\n // Pre-compile accessors for performance\r\n const arrayAccessor = FieldUtils.createArrayAccessor(arrayPath);\r\n const elementAccessors = elementFields.map((field) => {\r\n // Pre-compute the element key to avoid repeated replace operations\r\n const elementKey = field.path.replace(`${arrayPath}.`, \"\");\r\n return {\r\n fieldName: field.path,\r\n elementKey,\r\n accessor: createFieldAccessor(elementKey),\r\n setter: FieldUtils.createFieldSetter(elementKey),\r\n };\r\n });\r\n\r\n return {\r\n strategyType: ValidationStrategy.ARRAY_BATCH,\r\n\r\n validate(\r\n value: any,\r\n rootData: any,\r\n options: StrategyValidationOptions = {}\r\n ): ValidationResult {\r\n const { abortEarly = false } = options;\r\n const abortEarlyOnEachField = options.abortEarlyOnEachField !== false;\r\n const arrayValue = arrayAccessor(rootData);\r\n\r\n if (!Array.isArray(arrayValue)) {\r\n return { valid: true, errors: [] };\r\n }\r\n\r\n // Skip validation for empty arrays\r\n if (arrayValue.length === 0) {\r\n return { valid: true, errors: [] };\r\n }\r\n\r\n const allErrors: Array<{ path: string; code: string; message: string }> =\r\n [];\r\n\r\n // Batch validate all elements\r\n for (let i = 0; i < arrayValue.length; i++) {\r\n const element = arrayValue[i];\r\n\r\n for (let j = 0; j < elementFields.length; j++) {\r\n const field = elementFields[j];\r\n const accessorInfo = elementAccessors[j];\r\n const elementValue = accessorInfo.accessor(element);\r\n const elementPath = `${arrayPath}[${i}].${accessorInfo.elementKey}`;\r\n\r\n const context: ValidationContext = {\r\n originalValue: elementValue,\r\n currentValue: elementValue,\r\n allValues: rootData,\r\n path: elementPath,\r\n };\r\n\r\n const result = engine.validateField(field, elementValue, context, {\r\n abortEarly: abortEarlyOnEachField,\r\n });\r\n\r\n if (!result.valid) {\r\n allErrors.push(...result.errors);\r\n\r\n if (abortEarly) {\r\n return { valid: false, errors: allErrors };\r\n }\r\n }\r\n }\r\n }\r\n\r\n return {\r\n valid: allErrors.length === 0,\r\n errors: allErrors,\r\n };\r\n },\r\n\r\n parse(\r\n value: any,\r\n rootData: any,\r\n options: StrategyValidationOptions = {}\r\n ): ParseResult {\r\n const { abortEarly = false } = options;\r\n const arrayValue = arrayAccessor(rootData);\r\n\r\n if (!Array.isArray(arrayValue)) {\r\n return { valid: true, data: rootData, errors: [] };\r\n }\r\n\r\n // Skip validation for empty arrays\r\n if (arrayValue.length === 0) {\r\n return { valid: true, data: rootData, errors: [] };\r\n }\r\n\r\n const transformedData = engine.applyTransforms([], rootData, {\r\n originalValue: rootData,\r\n currentValue: rootData,\r\n allValues: rootData,\r\n path: \"\",\r\n }); // Deep clone logic is in engine\r\n\r\n const allErrors: Array<{ path: string; code: string; message: string }> =\r\n [];\r\n const transformedArray = arrayAccessor(transformedData);\r\n\r\n // Batch parse all elements\r\n for (let i = 0; i < arrayValue.length; i++) {\r\n const element = arrayValue[i];\r\n\r\n for (let j = 0; j < elementFields.length; j++) {\r\n const field = elementFields[j];\r\n const accessorInfo = elementAccessors[j];\r\n const elementValue = accessorInfo.accessor(element);\r\n const elementPath = `${arrayPath}[${i}].${accessorInfo.elementKey}`;\r\n\r\n const context: ValidationContext = {\r\n originalValue: elementValue,\r\n currentValue: elementValue,\r\n allValues: rootData,\r\n path: elementPath,\r\n };\r\n\r\n const result = engine.parseField(field, elementValue, context, {\r\n abortEarly: options.abortEarlyOnEachField !== false,\r\n });\r\n\r\n if (!result.valid) {\r\n allErrors.push(...result.errors);\r\n\r\n if (abortEarly) {\r\n return { valid: false, errors: allErrors };\r\n }\r\n } else if (result.data !== undefined) {\r\n // Set transformed value using pre-compiled setter\r\n accessorInfo.setter(transformedArray[i], result.data);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n valid: allErrors.length === 0,\r\n data: allErrors.length === 0 ? transformedData : undefined,\r\n errors: allErrors,\r\n };\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Multi-Field Strategy\r\n * Integrated processing of multiple fields\r\n */\r\nexport function createMultiFieldStrategy(\r\n fields: ValidationField[],\r\n engine: ValidationEngine = getValidationEngine()\r\n): IValidationStrategy {\r\n return {\r\n strategyType: ValidationStrategy.FAST_SEPARATED, // Base type\r\n\r\n validate(\r\n value: any,\r\n rootData: any,\r\n options: StrategyValidationOptions = {}\r\n ): ValidationResult {\r\n return engine.validateBatch(fields, rootData, {\r\n abortEarly: options.abortEarly,\r\n abortEarlyOnEachField: options.abortEarlyOnEachField,\r\n });\r\n },\r\n\r\n parse(\r\n value: any,\r\n rootData: any,\r\n options: StrategyValidationOptions = {}\r\n ): ParseResult {\r\n return engine.parseBatch(fields, rootData, {\r\n abortEarly: options.abortEarly,\r\n abortEarlyOnEachField: options.abortEarlyOnEachField,\r\n });\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Strategy Factory\r\n * Automatically select optimal strategy\r\n */\r\nconst strategyEngine = getValidationEngine();\r\n\r\n/**\r\n * Analyze field definitions to determine optimal strategy\r\n */\r\nexport function analyzeFields(\r\n fieldDefinitions: Array<{ path: string; builderFunction: Function }>,\r\n plugins: Record<string, any>\r\n): StrategyAnalysis {\r\n const fieldCount = fieldDefinitions.length;\r\n let hasTransforms = false;\r\n let hasArrayFields = false;\r\n\r\n // Analyze each field\r\n for (const fieldDef of fieldDefinitions) {\r\n const pluginCalls = extractPluginCalls(fieldDef.builderFunction);\r\n\r\n // Check for transforms\r\n if (pluginCalls.some((call) => isTransformPlugin(call, plugins))) {\r\n hasTransforms = true;\r\n }\r\n\r\n // Check for array fields\r\n if (FieldUtils.parseFieldPath(fieldDef.path).isArrayElement) {\r\n hasArrayFields = true;\r\n }\r\n }\r\n\r\n // Determine optimal strategy\r\n let strategy: ValidationStrategy;\r\n let reason: string;\r\n let canOptimize: boolean;\r\n\r\n if (hasArrayFields) {\r\n strategy = ValidationStrategy.ARRAY_BATCH;\r\n reason = \"Array fields detected - using batch processing\";\r\n canOptimize = true;\r\n } else if (hasTransforms) {\r\n strategy = ValidationStrategy.DEFINITION_ORDER;\r\n reason = \"Transforms detected - using definition order\";\r\n canOptimize = false;\r\n } else {\r\n strategy = ValidationStrategy.FAST_SEPARATED;\r\n reason = \"No transforms or arrays - using fast separated execution\";\r\n canOptimize = true;\r\n }\r\n\r\n return {\r\n strategy,\r\n reason,\r\n canOptimize,\r\n hasTransforms,\r\n hasArrayFields,\r\n fieldCount,\r\n };\r\n}\r\n\r\n/**\r\n * Create strategy instance\r\n */\r\nexport function createStrategy(\r\n analysis: StrategyAnalysis,\r\n fieldDefinitions: Array<{\r\n path: string;\r\n builderFunction: Function;\r\n validators?: any[];\r\n transforms?: any[];\r\n }>,\r\n plugins: Record<string, any>\r\n): IValidationStrategy {\r\n // Convert field definitions to ValidationField format\r\n const fields = fieldDefinitions.map((fieldDef) => ({\r\n path: fieldDef.path,\r\n validators: fieldDef.validators || [],\r\n transforms: fieldDef.transforms || [],\r\n }));\r\n\r\n switch (analysis.strategy) {\r\n case ValidationStrategy.ARRAY_BATCH:\r\n return createArrayBatchStrategyFromFields(fields);\r\n\r\n case ValidationStrategy.DEFINITION_ORDER:\r\n return createMultiFieldStrategy(fields, strategyEngine);\r\n\r\n case ValidationStrategy.FAST_SEPARATED:\r\n default:\r\n return createMultiFieldStrategy(fields, strategyEngine);\r\n }\r\n}\r\n\r\n/**\r\n * Create array batch strategy\r\n */\r\nfunction createArrayBatchStrategyFromFields(\r\n fields: ValidationField[]\r\n): IValidationStrategy {\r\n const arrayGroups = FieldUtils.groupArrayFields(fields.map((f) => f.path));\r\n\r\n // For now, take the first array group\r\n // TODO: Support multiple array groups\r\n const firstGroup = arrayGroups.values().next().value;\r\n\r\n if (firstGroup) {\r\n const elementFields = fields.filter((f) =>\r\n firstGroup.elementFields.some((ef) => f.path.endsWith(ef))\r\n );\r\n\r\n return createArrayBatchStrategy(\r\n firstGroup.arrayPath,\r\n elementFields,\r\n strategyEngine\r\n );\r\n }\r\n\r\n // Fallback to multi-field strategy\r\n return createMultiFieldStrategy(fields, strategyEngine);\r\n}\r\n\r\n/**\r\n * Plugin calls extraction (simplified)\r\n */\r\nfunction extractPluginCalls(builderFunction: Function): string[] {\r\n const funcString = builderFunction.toString();\r\n const methodCallPattern = /\\.(\\w+)\\(/g;\r\n const calls: string[] = [];\r\n let match;\r\n\r\n while ((match = methodCallPattern.exec(funcString)) !== null) {\r\n calls.push(match[1]);\r\n }\r\n\r\n return calls;\r\n}\r\n\r\n/**\r\n * Transform plugin detection\r\n */\r\nfunction isTransformPlugin(\r\n methodName: string,\r\n plugins: Record<string, any>\r\n): boolean {\r\n const plugin = Object.values(plugins).find(\r\n (p: any) => p?.methodName === methodName\r\n );\r\n return (\r\n plugin?.category === \"transform\" ||\r\n methodName === \"transform\" ||\r\n methodName.startsWith(\"to\")\r\n );\r\n}\r\n\r\n// Export utility functions\r\nexport function createOptimalStrategy(\r\n fieldDefinitions: Array<{ path: string; builderFunction: Function }>,\r\n plugins: Record<string, any>\r\n): { strategy: IValidationStrategy; analysis: StrategyAnalysis } {\r\n const analysis = analyzeFields(fieldDefinitions, plugins);\r\n const strategy = createStrategy(analysis, fieldDefinitions, plugins);\r\n\r\n return { strategy, analysis };\r\n}\r\n\r\nexport function createSingleFieldStrategy(\r\n path: string,\r\n validators: any[],\r\n transforms: any[] = []\r\n): IValidationStrategy {\r\n const field: ValidationField = { path, validators, transforms };\r\n\r\n if (transforms.length > 0) {\r\n return createDefinitionOrderStrategy(field);\r\n } else {\r\n return createFastSeparatedStrategy(field);\r\n }\r\n}\r\n", "/**\r\n * Execution Strategy Selector (Refactored)\r\n * Uses integrated StrategyFactory - eliminates duplicate logic\r\n * \r\n * Before: 84 lines with strategy analysis duplication\r\n * After: ~25 lines using unified core systems\r\n */\r\n\r\nimport { \r\n analyzeFields,\r\n StrategyAnalysis,\r\n ValidationStrategy\r\n} from './core/strategy-factory';\r\n\r\n/**\r\n * Determine execution strategy for all fields (simplified)\r\n * Delegates duplicated strategy analysis logic to StrategyFactory\r\n */\r\nexport function selectOptimalStrategies(\r\n fieldDefinitions: Array<{\r\n path: string;\r\n builderFunction: Function;\r\n }>,\r\n plugins: Record<string, any>\r\n): Map<string, StrategyAnalysis> {\r\n \r\n // Use unified strategy factory for analysis\r\n const overallAnalysis = analyzeFields(fieldDefinitions, plugins);\r\n \r\n // Create analysis map for backward compatibility\r\n const strategies = new Map<string, StrategyAnalysis>();\r\n \r\n // For now, assign the same strategy to all fields\r\n // TODO: Support per-field strategy analysis\r\n for (const fieldDef of fieldDefinitions) {\r\n strategies.set(fieldDef.path, overallAnalysis);\r\n }\r\n\r\n // Output overall optimization statistics (optional)\r\n logOptimizationStats(strategies);\r\n\r\n return strategies;\r\n}\r\n\r\n/**\r\n * Group fields by strategy (simplified)\r\n */\r\nexport function groupByStrategy(strategies: Map<string, StrategyAnalysis>): {\r\n fastFields: string[];\r\n slowFields: string[];\r\n} {\r\n const fastFields: string[] = [];\r\n const slowFields: string[] = [];\r\n\r\n strategies.forEach((analysis, fieldPath) => {\r\n if (analysis.strategy === ValidationStrategy.FAST_SEPARATED) {\r\n fastFields.push(fieldPath);\r\n } else {\r\n slowFields.push(fieldPath);\r\n }\r\n });\r\n\r\n return { fastFields, slowFields };\r\n}\r\n\r\n/**\r\n * Display percentage of optimizable fields (optional)\r\n */\r\nfunction logOptimizationStats(\r\n strategies: Map<string, StrategyAnalysis>\r\n): void {\r\n // Production builds should not include debug logs\r\n // These logs are removed to reduce bundle size\r\n // Uncomment for development debugging:\r\n /*\r\n const total = strategies.size;\r\n const optimizable = Array.from(strategies.values()).filter(s => s.canOptimize).length;\r\n \r\n if (total > 0) {\r\n console.log(`[LUQ Optimization] ${optimizable}/${total} fields can use fast execution (${Math.round(optimizable/total*100)}%)`);\r\n }\r\n */\r\n}", "/**\r\n * Essential constants - optimized for minimal bundle size\r\n * Only contains constants that are actively used in the codebase\r\n */\r\n\r\n// Common separators - used in field path navigation\r\nexport const DOT = \".\";\r\n\r\n// Validation modes - used throughout validation engine\r\nexport const VALIDATE_MODE = \"validate\" as const;\r\nexport const PARSE_MODE = \"parse\" as const;\r\nexport type ValidationMode = typeof VALIDATE_MODE | typeof PARSE_MODE;\r\n\r\n/**\r\n * Base message parameters for validation errors\r\n */\r\nexport interface BaseMessageParams {\r\n path: string;\r\n value?: any;\r\n}\r\n\r\n/**\r\n * Extended message parameters with validation-specific properties\r\n */\r\nexport interface ValidationMessageParams extends BaseMessageParams {\r\n expected?: any;\r\n actual?: any;\r\n min?: number;\r\n max?: number;\r\n pattern?: string;\r\n code?: string;\r\n [key: string]: any;\r\n}\r\n", "/**\r\n * Unified Validator - Integrates meaningless Fast/Slow separation\r\n *\r\n * User feedback: validateFast and validateSlow don't need separate function names\r\n * Since the caller uses the same interface, they should be unified\r\n *\r\n * Before: FastValidator + SlowValidator = 519 lines\r\n * After: UnifiedValidator = ~80 lines (85% reduction)\r\n */\r\n\r\nimport { createFieldContext } from \"../builder/context/field-context\";\r\nimport { ValidationMode, VALIDATE_MODE, PARSE_MODE } from \"../../constants\";\r\n\r\n// V8 optimization: Unified Hidden Class + lazy evaluation\r\ninterface ValidationResult {\r\n readonly valid: boolean;\r\n readonly errors: Array<{\r\n readonly path: string;\r\n readonly code: string;\r\n readonly message: string;\r\n }>;\r\n}\r\n\r\ninterface ParseResult {\r\n readonly valid: boolean;\r\n readonly data?: any; // V8 optimization: Optional because it can be undefined\r\n readonly errors: Array<{\r\n readonly path: string;\r\n readonly code: string;\r\n readonly message: string;\r\n }>;\r\n}\r\n\r\n// Unified interface\r\nexport interface UnifiedValidator {\r\n validate(\r\n value: any,\r\n rootData: any,\r\n options?: { abortEarlyOnEachField?: boolean }\r\n ): ValidationResult;\r\n\r\n parse(\r\n value: any,\r\n rootData: any,\r\n options?: { abortEarlyOnEachField?: boolean }\r\n ): ParseResult;\r\n\r\n // Pre-compiled field accessor for performance\r\n accessor?: (obj: any) => any;\r\n}\r\n\r\n// Internal execution strategy (not exposed externally)\r\ntype ExecutionStrategy = \"definition_order\" | \"fast_separated\";\r\n\r\n/**\r\n * Create unified validator\r\n * Fast/Slow differences are internal implementation only, external interface is unified\r\n */\r\nexport function createUnifiedValidator(\r\n fieldDef: { path: string; builderFunction: Function },\r\n plugins: Record<string, any>,\r\n strategy: ExecutionStrategy = \"fast_separated\",\r\n accessor?: (obj: any) => any\r\n): UnifiedValidator {\r\n // Create field context (common processing)\r\n const context = createFieldContext(fieldDef.path, plugins);\r\n let builtField = fieldDef.builderFunction(context);\r\n\r\n // Check if the result needs to be built (composable plugins return a composer)\r\n if (builtField && typeof builtField.build === \"function\") {\r\n builtField = builtField.build();\r\n }\r\n\r\n // Extract validators and transforms (common processing)\r\n const validators = builtField._validators || [];\r\n const transforms = builtField._transforms || [];\r\n const path = fieldDef.path;\r\n\r\n // V8 optimization: Ultra-fast path for simple validations (no skip plugins, no transforms)\r\n const hasSkipPlugins = validators.some(\r\n (v: any) => v.shouldSkipAllValidation || v.shouldSkipValidation\r\n );\r\n const hasTransforms = transforms.length > 0;\r\n // Increased validator limit from 3 to 10 for realistic use cases\r\n const isSimpleValidation =\r\n !hasSkipPlugins &&\r\n !hasTransforms &&\r\n validators.length <= 10 &&\r\n strategy === \"fast_separated\";\r\n\r\n if (isSimpleValidation) {\r\n // V8 optimization: Compiled ultra-fast validator - eliminate all abstraction overhead\r\n return createUltraFastValidator(validators, path);\r\n }\r\n\r\n // V8 optimization: Optimized path for simple validators with transforms\r\n const isSimpleWithTransforms =\r\n !hasSkipPlugins &&\r\n hasTransforms &&\r\n validators.length <= 10 &&\r\n transforms.length <= 5 &&\r\n strategy === \"fast_separated\";\r\n if (isSimpleWithTransforms) {\r\n return createOptimizedTransformValidator(validators, transforms, path);\r\n }\r\n\r\n // Determine execution order based on strategy (internal implementation differences only)\r\n // Only use definition order if explicitly requested or has complex skip logic\r\n const executeInDefinitionOrder =\r\n strategy === \"definition_order\" || hasSkipPlugins;\r\n\r\n // V8 optimization: Always return the same shape for unified Hidden Class\r\n const definitionOrderValidator = (\r\n value: any,\r\n rootData: any,\r\n options: any\r\n ): ValidationResult => {\r\n const abortEarlyOnEachField = options?.abortEarlyOnEachField !== false;\r\n // Call executeDefinitionOrder in Validate mode (skip Transform)\r\n const result = executeDefinitionOrder(\r\n value,\r\n rootData,\r\n validators,\r\n transforms,\r\n path,\r\n abortEarlyOnEachField,\r\n VALIDATE_MODE\r\n );\r\n // Unified Hidden Class: always return in valid, errors order\r\n return {\r\n valid: result.valid,\r\n errors: result.errors,\r\n };\r\n };\r\n\r\n const fastValidatorForValidate = (\r\n value: any,\r\n rootData: any,\r\n options: { abortEarlyOnEachField?: boolean } = {}\r\n ): ValidationResult => {\r\n const abortEarlyOnEachField = options.abortEarlyOnEachField !== false;\r\n // Call executeFastSeparated in Validate mode (skip Transform)\r\n return executeFastSeparated(\r\n value,\r\n rootData,\r\n validators,\r\n transforms,\r\n path,\r\n abortEarlyOnEachField,\r\n VALIDATE_MODE\r\n );\r\n };\r\n\r\n const validate = executeInDefinitionOrder\r\n ? definitionOrderValidator\r\n : fastValidatorForValidate;\r\n\r\n const parseDefinitionOrder = (value: any, rootData: any, options: any) => {\r\n const abortEarlyOnEachField = options?.abortEarlyOnEachField !== false;\r\n // Call executeDefinitionOrder in Parse mode (execute Transform)\r\n const result = executeDefinitionOrder(\r\n value,\r\n rootData,\r\n validators,\r\n transforms,\r\n path,\r\n abortEarlyOnEachField,\r\n PARSE_MODE\r\n );\r\n return result;\r\n };\r\n const fastValidatorForParse = (\r\n value: any,\r\n rootData: any,\r\n options: { abortEarlyOnEachField?: boolean } = {}\r\n ) => {\r\n const abortEarlyOnEachField = options.abortEarlyOnEachField !== false;\r\n // Call executeFastSeparated in Parse mode (execute Transform)\r\n return executeFastSeparated(\r\n value,\r\n rootData,\r\n validators,\r\n transforms,\r\n path,\r\n abortEarlyOnEachField,\r\n PARSE_MODE\r\n );\r\n };\r\n const parse = executeInDefinitionOrder\r\n ? parseDefinitionOrder\r\n : fastValidatorForParse;\r\n\r\n return {\r\n validate,\r\n parse,\r\n accessor,\r\n };\r\n}\r\n\r\n/**\r\n * Lightweight Execution Context for Definition Order\r\n * Maintain CurrentValue and achieve true definition order execution\r\n */\r\ninterface LightweightExecutionContext {\r\n currentValue: any;\r\n originalValue: any;\r\n rootData: any;\r\n path: string;\r\n errorIndices: number[];\r\n transformErrors: Array<{ path: string; code: string; message: string }>;\r\n abortEarlyOnEachField: boolean;\r\n}\r\n\r\n/**\r\n * Definition order execution (true definition order execution)\r\n * Optimized for mixed validators and transforms\r\n */\r\nfunction executeDefinitionOrder(\r\n value: any,\r\n rootData: any,\r\n validators: any[],\r\n transforms: any[],\r\n path: string,\r\n abortEarlyOnEachField: boolean,\r\n mode: ValidationMode = PARSE_MODE\r\n) {\r\n // V8 optimization: Direct error array\r\n const errors: Array<{ path: string; code: string; message: string }> = [];\r\n let currentValue = value;\r\n\r\n // Check if we should skip validation for null/undefined values\r\n const hasSkipForNull = validators.some(v => v.skipForNull === true);\r\n const hasSkipForUndefined = validators.some(v => v.skipForUndefined === true);\r\n \r\n if ((value === null && hasSkipForNull) || (value === undefined && hasSkipForUndefined)) {\r\n // Skip both validation AND transforms for null/undefined when appropriate validators are present\r\n if (mode === PARSE_MODE) {\r\n // In parse mode, return original value without transforms\r\n return {\r\n valid: true,\r\n data: value,\r\n errors: [],\r\n };\r\n } else {\r\n // In validate mode, just return valid\r\n return {\r\n valid: true,\r\n data: undefined,\r\n errors: [],\r\n };\r\n }\r\n }\r\n\r\n // Phase 1: Fast validation\r\n const validatorsLength = validators.length;\r\n for (let i = 0; i < validatorsLength; i++) {\r\n const validator = validators[i];\r\n\r\n // Skip check\r\n if (\r\n validator.shouldSkipAllValidation &&\r\n typeof validator.shouldSkipAllValidation === \"function\"\r\n ) {\r\n if (validator.shouldSkipAllValidation(currentValue, rootData)) {\r\n // Skip all validations from this point forward\r\n break; // Exit the validation loop\r\n }\r\n }\r\n\r\n // Direct validation\r\n const checkFn = validator.check || validator;\r\n if (typeof checkFn === \"function\" && !checkFn(currentValue, rootData)) {\r\n const error = {\r\n path: path,\r\n code: validator.code || validator.pluginName || \"VALIDATION_ERROR\",\r\n message: computeErrorMessage(validator, currentValue, path, rootData),\r\n };\r\n\r\n if (abortEarlyOnEachField) {\r\n return {\r\n valid: false,\r\n data: undefined,\r\n errors: [error],\r\n };\r\n }\r\n\r\n errors.push(error);\r\n }\r\n }\r\n\r\n // Check validation errors\r\n if (errors.length > 0) {\r\n return {\r\n valid: false,\r\n data: undefined,\r\n errors: errors,\r\n };\r\n }\r\n\r\n // Phase 2: Transform (only for parse mode)\r\n if (mode === PARSE_MODE && transforms.length > 0) {\r\n // Pre-compile transforms\r\n const validTransforms: Array<(v: any) => any> = [];\r\n for (let i = 0; i < transforms.length; i++) {\r\n const transform = transforms[i];\r\n if (typeof transform === \"function\") {\r\n validTransforms.push(transform);\r\n } else if (transform && typeof transform.apply === \"function\") {\r\n validTransforms.push(transform.apply);\r\n }\r\n }\r\n\r\n const validTransformCount = validTransforms.length;\r\n\r\n // Execute transforms\r\n if (validTransformCount === 1) {\r\n currentValue = validTransforms[0](currentValue);\r\n } else if (validTransformCount === 2) {\r\n currentValue = validTransforms[0](currentValue);\r\n currentValue = validTransforms[1](currentValue);\r\n } else if (validTransformCount > 0) {\r\n for (let i = 0; i < validTransformCount; i++) {\r\n currentValue = validTransforms[i](currentValue);\r\n }\r\n }\r\n }\r\n\r\n // Return success\r\n if (mode === VALIDATE_MODE) {\r\n return ULTRA_FAST_VALID_RESULT;\r\n }\r\n\r\n return {\r\n valid: true,\r\n data: currentValue,\r\n errors: [],\r\n };\r\n}\r\n\r\n/**\r\n * V8 optimization: Execute validation phase (loop optimization)\r\n */\r\nfunction executeValidationPhase(\r\n context: LightweightExecutionContext,\r\n validators: any[]\r\n): boolean {\r\n const validatorsLength = validators.length;\r\n\r\n // V8 optimization: Speed up access with local variables\r\n const currentValue = context.currentValue;\r\n const rootData = context.rootData;\r\n const abortEarly = context.abortEarlyOnEachField;\r\n\r\n // V8 optimization: Execute validators in definition order\r\n for (let i = 0; i < validatorsLength; i++) {\r\n const validator = validators[i];\r\n\r\n // Skip check\r\n if (\r\n validator.shouldSkipAllValidation &&\r\n typeof validator.shouldSkipAllValidation === \"function\"\r\n ) {\r\n const shouldSkip = validator.shouldSkipAllValidation(\r\n currentValue,\r\n rootData\r\n );\r\n if (shouldSkip) {\r\n // Skip all validations from this point forward\r\n return true; // Exit validation phase successfully\r\n }\r\n }\r\n\r\n // V8 optimization: reduce property access by extracting checkFn\r\n const checkFn = validator.check || validator;\r\n\r\n if (typeof checkFn === \"function\") {\r\n // V8 optimization: monomorphic call\r\n const isValid = checkFn(currentValue, rootData);\r\n if (!isValid) {\r\n context.errorIndices.push(i);\r\n\r\n // V8 optimization: minimize early termination checks\r\n if (abortEarly) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return true; // Can continue\r\n}\r\n\r\n/**\r\n * V8 optimization: Execute transform phase (loop optimization)\r\n */\r\nfunction executeTransformPhase(\r\n context: LightweightExecutionContext,\r\n transforms: any[]\r\n): boolean {\r\n const transformsLength = transforms.length;\r\n\r\n // V8 optimization: faster access with local variables\r\n let currentValue = context.currentValue;\r\n const path = context.path;\r\n\r\n // V8 optimization: Pre-validate transforms outside hot loop\r\n const validTransforms: Array<(v: any) => any> = [];\r\n for (let i = 0; i < transformsLength; i++) {\r\n const transform = transforms[i];\r\n if (typeof transform === \"function\") {\r\n validTransforms.push(transform);\r\n } else if (transform && typeof transform.apply === \"function\") {\r\n validTransforms.push(transform.apply);\r\n }\r\n }\r\n\r\n const validTransformCount = validTransforms.length;\r\n\r\n // V8 optimization: Optimized transform execution without try-catch in hot path\r\n if (validTransformCount === 1) {\r\n // Single transform optimization\r\n currentValue = validTransforms[0](currentValue);\r\n } else if (validTransformCount === 2) {\r\n // Two transforms optimization\r\n currentValue = validTransforms[0](currentValue);\r\n currentValue = validTransforms[1](currentValue);\r\n } else {\r\n // Multiple transforms\r\n for (let i = 0; i < validTransformCount; i++) {\r\n currentValue = validTransforms[i](currentValue);\r\n }\r\n }\r\n\r\n // V8 optimization: update context at the end\r\n context.currentValue = currentValue;\r\n return true;\r\n}\r\n\r\n/**\r\n * V8 optimization: Create error result (lazy generation + Hidden Class unification)\r\n * Control data field according to mode\r\n */\r\nfunction createErrorResult(\r\n context: LightweightExecutionContext,\r\n validators: any[],\r\n mode: ValidationMode = PARSE_MODE\r\n) {\r\n const hasErrors =\r\n context.errorIndices.length > 0 || context.transformErrors.length > 0;\r\n\r\n if (!hasErrors) {\r\n // V8 optimization: Hidden Class unification (always valid, data, errors order)\r\n return {\r\n valid: true,\r\n data: mode === PARSE_MODE ? context.currentValue : undefined,\r\n errors: [],\r\n };\r\n }\r\n\r\n // V8 optimization: Unified Hidden Class + lazy evaluation\r\n return {\r\n valid: false,\r\n data: undefined,\r\n get errors() {\r\n const errors: Array<{ path: string; code: string; message: string }> = [];\r\n const indices = context.abortEarlyOnEachField\r\n ? [context.errorIndices[0]]\r\n : context.errorIndices;\r\n const indicesLength = indices.length;\r\n const validatorsLength = validators.length;\r\n\r\n // V8 optimization: loop optimization with for statement\r\n for (let i = 0; i < indicesLength; i++) {\r\n const idx = indices[i];\r\n if (idx < validatorsLength) {\r\n errors.push(\r\n createValidationError(\r\n validators[idx],\r\n context.currentValue,\r\n context.path,\r\n context.rootData\r\n )\r\n );\r\n }\r\n }\r\n\r\n // V8 optimization: remove spread operator, add transform errors only in Parse mode\r\n if (mode === PARSE_MODE) {\r\n const transformErrorsLength = context.transformErrors.length;\r\n for (let i = 0; i < transformErrorsLength; i++) {\r\n errors.push(context.transformErrors[i]);\r\n }\r\n }\r\n\r\n return errors;\r\n },\r\n };\r\n}\r\n\r\n// V8 optimization: Function to create parse success result\r\nfunction createParseSuccessResult(data: any): ParseResult {\r\n return {\r\n valid: true,\r\n data: data,\r\n errors: [],\r\n };\r\n}\r\n\r\n/**\r\n * V8 optimization: Fast separated execution (loop + Hidden Class optimization)\r\n * Validation first, then Transform (separate execution)\r\n * mode: 'validate' | 'parse' controls Transform execution\r\n */\r\nfunction executeFastSeparated(\r\n value: any,\r\n rootData: any,\r\n validators: any[],\r\n transforms: any[],\r\n path: string,\r\n abortEarlyOnEachField: boolean,\r\n mode: ValidationMode = PARSE_MODE\r\n) {\r\n // V8 optimization: Pre-allocate error arrays\r\n const errors: Array<{ path: string; code: string; message: string }> = [];\r\n\r\n // V8 optimization: Execute validators in definition order\r\n const validatorsLength = validators.length;\r\n\r\n // Check if we should skip validation for null/undefined values\r\n const hasSkipForNull = validators.some(v => v.skipForNull === true);\r\n const hasSkipForUndefined = validators.some(v => v.skipForUndefined === true);\r\n \r\n if ((value === null && hasSkipForNull) || (value === undefined && hasSkipForUndefined)) {\r\n // Skip both validation AND transforms for null/undefined when appropriate validators are present\r\n if (mode === PARSE_MODE) {\r\n // In parse mode, return original value without transforms\r\n return {\r\n valid: true,\r\n data: value,\r\n errors: [],\r\n };\r\n } else {\r\n // In validate mode, just return valid\r\n return {\r\n valid: true,\r\n data: undefined,\r\n errors: [],\r\n };\r\n }\r\n }\r\n\r\n for (let i = 0; i < validatorsLength; i++) {\r\n const validator = validators[i];\r\n\r\n // Check if this is a skip plugin\r\n if (\r\n validator.shouldSkipAllValidation &&\r\n typeof validator.shouldSkipAllValidation === \"function\"\r\n ) {\r\n const shouldSkip = validator.shouldSkipAllValidation(value, rootData);\r\n if (shouldSkip) {\r\n // Skip all validations from this point forward\r\n break; // Exit the validation loop\r\n }\r\n }\r\n\r\n // V8 optimization: Direct validation check\r\n const checkFn = validator.check || validator;\r\n if (typeof checkFn === \"function\" && !checkFn(value, rootData)) {\r\n // Validation failed\r\n if (abortEarlyOnEachField) {\r\n // V8 optimization: Direct error creation for abort early\r\n const error = {\r\n path: path,\r\n code: validator.code || validator.pluginName || \"VALIDATION_ERROR\",\r\n message: computeErrorMessage(validator, value, path, rootData),\r\n };\r\n return {\r\n valid: false,\r\n data: undefined,\r\n errors: [error],\r\n };\r\n }\r\n\r\n // Collect error for non-abort early\r\n errors.push({\r\n path: path,\r\n code: validator.code || validator.pluginName || \"VALIDATION_ERROR\",\r\n message: computeErrorMessage(validator, value, path, rootData),\r\n });\r\n }\r\n }\r\n\r\n // V8 optimization: Skip transforms in Validate mode (optimization)\r\n if (mode === VALIDATE_MODE) {\r\n if (errors.length === 0) {\r\n return ULTRA_FAST_VALID_RESULT;\r\n }\r\n return {\r\n valid: false,\r\n errors: errors,\r\n };\r\n }\r\n\r\n // V8 optimization: Check for validation errors before transform\r\n if (errors.length > 0) {\r\n return {\r\n valid: false,\r\n data: undefined,\r\n errors: errors,\r\n };\r\n }\r\n\r\n // V8 optimization: 2. Transform phase for parse mode\r\n let transformedValue = value;\r\n const transformsLength = transforms.length;\r\n\r\n // V8 optimization: Pre-compile transform functions\r\n if (transformsLength > 0) {\r\n // Pre-validate transform functions\r\n const validTransforms: Array<(v: any) => any> = [];\r\n for (let i = 0; i < transformsLength; i++) {\r\n const transform = transforms[i];\r\n if (typeof transform === \"function\") {\r\n validTransforms.push(transform);\r\n } else if (transform && typeof transform.apply === \"function\") {\r\n validTransforms.push(transform.apply);\r\n }\r\n }\r\n\r\n const validTransformCount = validTransforms.length;\r\n\r\n // V8 optimization: Optimized transform execution\r\n if (validTransformCount === 1) {\r\n // Single transform\r\n transformedValue = validTransforms[0](transformedValue);\r\n } else if (validTransformCount === 2) {\r\n // Two transforms\r\n transformedValue = validTransforms[0](transformedValue);\r\n transformedValue = validTransforms[1](transformedValue);\r\n } else if (validTransformCount > 0) {\r\n // Multiple transforms\r\n for (let i = 0; i < validTransformCount; i++) {\r\n transformedValue = validTransforms[i](transformedValue);\r\n }\r\n }\r\n }\r\n\r\n // V8 optimization: Return success with transformed data\r\n return {\r\n valid: true,\r\n data: transformedValue,\r\n errors: [],\r\n };\r\n}\r\n\r\n/**\r\n * V8 optimization: Ultra-fast validator for simple cases - eliminates ALL abstraction overhead\r\n * Generates inline validation code for maximum performance\r\n */\r\nfunction createUltraFastValidator(\r\n validators: any[],\r\n path: string,\r\n accessor?: (obj: any) => any\r\n): UnifiedValidator {\r\n // Pre-extract validation functions and eliminate runtime checks\r\n const validationChecks: Array<(value: any, rootData: any) => boolean> = [];\r\n const errorCodes: string[] = [];\r\n const errorMessages: string[] = [];\r\n const isDynamic: boolean[] = []; // Track which messages are dynamic\r\n\r\n // Pre-compile all validators and cache error data\r\n const validatorsLength = validators.length;\r\n for (let i = 0; i < validatorsLength; i++) {\r\n const validator = validators[i];\r\n\r\n validationChecks.push(validator.check || validator);\r\n errorCodes.push(\r\n validator.code || validator.pluginName || \"VALIDATION_ERROR\"\r\n );\r\n\r\n // Pre-compute static error messages where possible\r\n if (\r\n validator.getErrorMessage &&\r\n typeof validator.getErrorMessage === \"function\"\r\n ) {\r\n errorMessages.push(\"\"); // Dynamic - will compute at runtime\r\n isDynamic.push(true);\r\n } else if (validator.messageFactory) {\r\n errorMessages.push(\"\"); // Dynamic - will compute at runtime\r\n isDynamic.push(true);\r\n } else {\r\n errorMessages.push(`Validation failed for ${path}`);\r\n isDynamic.push(false);\r\n }\r\n }\r\n\r\n const validationChecksLength = validationChecks.length;\r\n\r\n // V8 optimization: Pre-allocated error object for single-error case\r\n const singleError = { path: path, code: \"\", message: \"\" };\r\n \r\n // V8 optimization: Generate specialized validators based on count\r\n let validate: (value: any, rootData: any, options: any) => ValidationResult;\r\n \r\n if (validationChecksLength === 1) {\r\n // Ultra-optimized single validator path\r\n const check0 = validationChecks[0];\r\n const code0 = errorCodes[0];\r\n const msg0 = errorMessages[0];\r\n const dynamic0 = isDynamic[0];\r\n \r\n validate = (value: any, rootData: any, options: any): ValidationResult => {\r\n if (check0(value, rootData)) {\r\n return ULTRA_FAST_VALID_RESULT;\r\n }\r\n \r\n singleError.code = code0;\r\n singleError.message = dynamic0 \r\n ? computeErrorMessage(validators[0], value, path, rootData)\r\n : msg0;\r\n \r\n return {\r\n valid: false,\r\n errors: [{ path: singleError.path, code: singleError.code, message: singleError.message }]\r\n };\r\n };\r\n } else if (validationChecksLength === 2) {\r\n // Optimized two-validator path\r\n const check0 = validationChecks[0];\r\n const check1 = validationChecks[1];\r\n const code0 = errorCodes[0];\r\n const code1 = errorCodes[1];\r\n const msg0 = errorMessages[0];\r\n const msg1 = errorMessages[1];\r\n const dynamic0 = isDynamic[0];\r\n const dynamic1 = isDynamic[1];\r\n \r\n validate = (value: any, rootData: any, options: any): ValidationResult => {\r\n if (!check0(value, rootData)) {\r\n if (options?.abortEarlyOnEachField !== false) {\r\n singleError.code = code0;\r\n singleError.message = dynamic0 \r\n ? computeErrorMessage(validators[0], value, path, rootData)\r\n : msg0;\r\n return {\r\n valid: false,\r\n errors: [{ path: singleError.path, code: singleError.code, message: singleError.message }]\r\n };\r\n }\r\n \r\n // Collect all errors\r\n const errors = [{\r\n path: path,\r\n code: code0,\r\n message: dynamic0 \r\n ? computeErrorMessage(validators[0], value, path, rootData)\r\n : msg0\r\n }];\r\n \r\n if (!check1(value, rootData)) {\r\n errors.push({\r\n path: path,\r\n code: code1,\r\n message: dynamic1 \r\n ? computeErrorMessage(validators[1], value, path, rootData)\r\n : msg1\r\n });\r\n }\r\n \r\n return { valid: false, errors };\r\n }\r\n \r\n if (!check1(value, rootData)) {\r\n singleError.code = code1;\r\n singleError.message = dynamic1 \r\n ? computeErrorMessage(validators[1], value, path, rootData)\r\n : msg1;\r\n return {\r\n valid: false,\r\n errors: [{ path: singleError.path, code: singleError.code, message: singleError.message }]\r\n };\r\n }\r\n \r\n return ULTRA_FAST_VALID_RESULT;\r\n };\r\n } else {\r\n // General case for multiple validators\r\n validate = (value: any, rootData: any, options: any): ValidationResult => {\r\n // V8 optimization: Hot path - inline validation with zero allocations on success\r\n for (let i = 0; i < validationChecksLength; i++) {\r\n if (!validationChecks[i](value, rootData)) {\r\n // Fast path: immediate error return for abort early (most common case)\r\n if (options?.abortEarlyOnEachField !== false) {\r\n singleError.code = errorCodes[i];\r\n singleError.message = isDynamic[i]\r\n ? computeErrorMessage(validators[i], value, path, rootData)\r\n : errorMessages[i];\r\n\r\n return {\r\n valid: false,\r\n errors: [{ path: singleError.path, code: singleError.code, message: singleError.message }]\r\n };\r\n }\r\n\r\n // Slow path: collect all errors (rare case)\r\n const errors: Array<{ path: string; code: string; message: string }> = [];\r\n errors.push({\r\n path: path,\r\n code: errorCodes[i],\r\n message: isDynamic[i]\r\n ? computeErrorMessage(validators[i], value, path, rootData)\r\n : errorMessages[i]\r\n });\r\n\r\n // Continue checking remaining validators\r\n for (let j = i + 1; j < validationChecksLength; j++) {\r\n if (!validationChecks[j](value, rootData)) {\r\n errors.push({\r\n path: path,\r\n code: errorCodes[j],\r\n message: isDynamic[j]\r\n ? computeErrorMessage(validators[j], value, path, rootData)\r\n : errorMessages[j]\r\n });\r\n }\r\n }\r\n\r\n return {\r\n valid: false,\r\n errors: errors\r\n };\r\n }\r\n }\r\n\r\n // V8 optimization: Success path - return pre-allocated constant\r\n return ULTRA_FAST_VALID_RESULT;\r\n };\r\n }\r\n\r\n // V8 optimization: Parse is identical to validate for simple cases (no transforms)\r\n const parse = (\r\n value: any,\r\n rootData: any,\r\n options: { abortEarlyOnEachField?: boolean } = {}\r\n ): ParseResult => {\r\n // First validate\r\n const validationResult = validate(value, rootData, options);\r\n if (!validationResult.valid) {\r\n return {\r\n valid: false,\r\n data: undefined,\r\n errors: validationResult.errors,\r\n };\r\n }\r\n\r\n // No transforms, just return the original value\r\n return {\r\n valid: true,\r\n data: value,\r\n errors: [],\r\n };\r\n };\r\n\r\n return { validate, parse, accessor };\r\n}\r\n\r\n// V8 optimization: Pre-allocated success result to avoid object creation\r\nconst ULTRA_FAST_VALID_RESULT: ValidationResult = Object.freeze({\r\n valid: true,\r\n errors: [] as Array<{\r\n readonly path: string;\r\n readonly code: string;\r\n readonly message: string;\r\n }>,\r\n});\r\n\r\n/**\r\n * V8 optimization: Compute error message only when needed\r\n */\r\nfunction computeErrorMessage(\r\n validator: any,\r\n value: any,\r\n path: string,\r\n rootData: any\r\n): string {\r\n if (validator.getErrorMessage) {\r\n try {\r\n return validator.getErrorMessage(value, path, rootData);\r\n } catch (e) {\r\n return `Validation failed for ${path}`;\r\n }\r\n } else if (validator.messageFactory) {\r\n try {\r\n const issueContext = {\r\n path: path,\r\n value: value,\r\n code: validator.code || validator.pluginName || \"VALIDATION_ERROR\",\r\n };\r\n return validator.messageFactory(issueContext);\r\n } catch (e) {\r\n return `Validation failed for ${path}`;\r\n }\r\n }\r\n return `Validation failed for ${path}`;\r\n}\r\n\r\n/**\r\n * V8 optimization: Optimized validator for simple cases with transforms\r\n * Pre-compiles validation and transform pipelines for maximum performance\r\n */\r\nfunction createOptimizedTransformValidator(\r\n validators: any[],\r\n transforms: any[],\r\n path: string,\r\n accessor?: (obj: any) => any\r\n): UnifiedValidator {\r\n // V8 optimization: Pre-compile everything outside the hot path\r\n const validatorCount = validators.length;\r\n const transformCount = transforms.length;\r\n\r\n // Pre-compile validation checks and error data\r\n const validationChecks: Array<(value: any, rootData: any) => boolean> =\r\n new Array(validatorCount);\r\n const errorCodes: string[] = new Array(validatorCount);\r\n\r\n for (let i = 0; i < validatorCount; i++) {\r\n const validator = validators[i];\r\n validationChecks[i] = validator.check || validator;\r\n errorCodes[i] =\r\n validator.code || validator.pluginName || \"VALIDATION_ERROR\";\r\n }\r\n\r\n // Pre-compile transform functions\r\n const transformFunctions: Array<(value: any) => any> = new Array(\r\n transformCount\r\n );\r\n let actualTransformCount = 0;\r\n\r\n for (let i = 0; i < transformCount; i++) {\r\n const transform = transforms[i];\r\n if (typeof transform === \"function\") {\r\n transformFunctions[actualTransformCount++] = transform;\r\n } else if (transform && typeof transform.apply === \"function\") {\r\n transformFunctions[actualTransformCount++] = transform.apply;\r\n }\r\n }\r\n\r\n // V8 optimization: Generate specialized functions based on validator/transform count\r\n // This eliminates loop overhead for common cases\r\n\r\n // Create specialized validators for common cases\r\n if (validatorCount === 1 && actualTransformCount === 1) {\r\n // MOST COMMON CASE: 1 validator, 1 transform\r\n const check = validationChecks[0];\r\n const errorCode = errorCodes[0];\r\n const transform = transformFunctions[0];\r\n const validator = validators[0];\r\n\r\n // V8 optimization: Pre-allocate error structures\r\n const validateError = {\r\n valid: false,\r\n errors: [{ path: path, code: errorCode, message: \"\" }],\r\n };\r\n\r\n const parseError = {\r\n valid: false,\r\n data: undefined,\r\n errors: [{ path: path, code: errorCode, message: \"\" }],\r\n };\r\n\r\n // V8 optimization: Pre-allocate success result\r\n const parseSuccess = {\r\n valid: true,\r\n data: null,\r\n errors: [],\r\n };\r\n\r\n return {\r\n validate: (\r\n value: any,\r\n rootData: any,\r\n options?: any\r\n ): ValidationResult => {\r\n if (!check(value, rootData)) {\r\n // V8 optimization: Lazy error message computation\r\n validateError.errors[0].message = computeErrorMessage(\r\n validator,\r\n value,\r\n path,\r\n rootData\r\n );\r\n return validateError;\r\n }\r\n return ULTRA_FAST_VALID_RESULT;\r\n },\r\n\r\n parse: (value: any, rootData: any, options?: any): ParseResult => {\r\n if (!check(value, rootData)) {\r\n // V8 optimization: Lazy error message computation\r\n parseError.errors[0].message = computeErrorMessage(\r\n validator,\r\n value,\r\n path,\r\n rootData\r\n );\r\n return parseError;\r\n }\r\n\r\n // V8 optimization: Direct transform and reuse success object\r\n parseSuccess.data = transform(value);\r\n return parseSuccess;\r\n },\r\n };\r\n }\r\n\r\n if (validatorCount === 2 && actualTransformCount === 1) {\r\n // COMMON CASE: 2 validators (e.g., required + min), 1 transform\r\n const check1 = validationChecks[0];\r\n const check2 = validationChecks[1];\r\n const errorCode1 = errorCodes[0];\r\n const errorCode2 = errorCodes[1];\r\n const transform = transformFunctions[0];\r\n const validator1 = validators[0];\r\n const validator2 = validators[1];\r\n\r\n // V8 optimization: Pre-allocate error structures\r\n const validateError1 = {\r\n valid: false,\r\n errors: [{ path: path, code: errorCode1, message: \"\" }],\r\n };\r\n\r\n const validateError2 = {\r\n valid: false,\r\n errors: [{ path: path, code: errorCode2, message: \"\" }],\r\n };\r\n\r\n const parseError1 = {\r\n valid: false,\r\n data: undefined,\r\n errors: [{ path: path, code: errorCode1, message: \"\" }],\r\n };\r\n\r\n const parseError2 = {\r\n valid: false,\r\n data: undefined,\r\n errors: [{ path: path, code: errorCode2, message: \"\" }],\r\n };\r\n\r\n const parseSuccess = {\r\n valid: true,\r\n data: null,\r\n errors: [],\r\n };\r\n\r\n return {\r\n validate: (\r\n value: any,\r\n rootData: any,\r\n options?: any\r\n ): ValidationResult => {\r\n if (!check1(value, rootData)) {\r\n validateError1.errors[0].message = computeErrorMessage(\r\n validator1,\r\n value,\r\n path,\r\n rootData\r\n );\r\n return validateError1;\r\n }\r\n\r\n if (!check2(value, rootData)) {\r\n validateError2.errors[0].message = computeErrorMessage(\r\n validator2,\r\n value,\r\n path,\r\n rootData\r\n );\r\n return validateError2;\r\n }\r\n\r\n return ULTRA_FAST_VALID_RESULT;\r\n },\r\n\r\n parse: (value: any, rootData: any, options?: any): ParseResult => {\r\n if (!check1(value, rootData)) {\r\n parseError1.errors[0].message = computeErrorMessage(\r\n validator1,\r\n value,\r\n path,\r\n rootData\r\n );\r\n return parseError1;\r\n }\r\n\r\n if (!check2(value, rootData)) {\r\n parseError2.errors[0].message = computeErrorMessage(\r\n validator2,\r\n value,\r\n path,\r\n rootData\r\n );\r\n return parseError2;\r\n }\r\n\r\n parseSuccess.data = transform(value);\r\n return parseSuccess;\r\n },\r\n };\r\n }\r\n\r\n // Fall back to general case\r\n // V8 optimization: Pre-allocated error structure\r\n const singleError = { path: path, code: \"\", message: \"\" };\r\n\r\n // V8 optimization: Optimized validate function (skip transforms)\r\n const validate = (\r\n value: any,\r\n rootData: any,\r\n options: { abortEarlyOnEachField?: boolean } = {}\r\n ): ValidationResult => {\r\n // Fast validation loop\r\n for (let i = 0; i < validatorCount; i++) {\r\n if (!validationChecks[i](value, rootData)) {\r\n if (options.abortEarlyOnEachField !== false) {\r\n singleError.code =\r\n validators[i].code ||\r\n validators[i].pluginName ||\r\n \"VALIDATION_ERROR\";\r\n singleError.message = computeErrorMessage(\r\n validators[i],\r\n value,\r\n path,\r\n rootData\r\n );\r\n return {\r\n valid: false,\r\n errors: [{ ...singleError }],\r\n };\r\n }\r\n\r\n // Collect all errors - slow path\r\n const errors: Array<{ path: string; code: string; message: string }> =\r\n [];\r\n errors.push({\r\n path: path,\r\n code:\r\n validators[i].code ||\r\n validators[i].pluginName ||\r\n \"VALIDATION_ERROR\",\r\n message: computeErrorMessage(validators[i], value, path, rootData),\r\n });\r\n\r\n for (let j = i + 1; j < validatorCount; j++) {\r\n if (!validationChecks[j](value, rootData)) {\r\n errors.push({\r\n path: path,\r\n code:\r\n validators[j].code ||\r\n validators[j].pluginName ||\r\n \"VALIDATION_ERROR\",\r\n message: computeErrorMessage(\r\n validators[j],\r\n value,\r\n path,\r\n rootData\r\n ),\r\n });\r\n }\r\n }\r\n\r\n return { valid: false, errors: errors };\r\n }\r\n }\r\n\r\n return ULTRA_FAST_VALID_RESULT;\r\n };\r\n\r\n // V8 optimization: Optimized parse function (validate + transform)\r\n const parse = (\r\n value: any,\r\n rootData: any,\r\n options: { abortEarlyOnEachField?: boolean } = {}\r\n ): ParseResult => {\r\n // Check if we should skip validation for null/undefined values\r\n const hasSkipForNull = validators.some(v => v.skipForNull === true);\r\n const hasSkipForUndefined = validators.some(v => v.skipForUndefined === true);\r\n \r\n if ((value === null && hasSkipForNull) || (value === undefined && hasSkipForUndefined)) {\r\n // Skip both validation AND transforms for null/undefined when appropriate validators are present\r\n // Return the original value without any transformation\r\n return {\r\n valid: true,\r\n data: value,\r\n errors: [],\r\n };\r\n }\r\n \r\n // Phase 1: Fast validation\r\n for (let i = 0; i < validatorCount; i++) {\r\n if (!validationChecks[i](value, rootData)) {\r\n if (options.abortEarlyOnEachField !== false) {\r\n singleError.code =\r\n validators[i].code ||\r\n validators[i].pluginName ||\r\n \"VALIDATION_ERROR\";\r\n singleError.message = computeErrorMessage(\r\n validators[i],\r\n value,\r\n path,\r\n rootData\r\n );\r\n return {\r\n valid: false,\r\n data: undefined,\r\n errors: [{ ...singleError }],\r\n };\r\n }\r\n\r\n // Collect all validation errors\r\n const errors: Array<{ path: string; code: string; message: string }> =\r\n [];\r\n errors.push({\r\n path: path,\r\n code:\r\n validators[i].code ||\r\n validators[i].pluginName ||\r\n \"VALIDATION_ERROR\",\r\n message: computeErrorMessage(validators[i], value, path, rootData),\r\n });\r\n\r\n for (let j = i + 1; j < validatorCount; j++) {\r\n if (!validationChecks[j](value, rootData)) {\r\n errors.push({\r\n path: path,\r\n code:\r\n validators[j].code ||\r\n validators[j].pluginName ||\r\n \"VALIDATION_ERROR\",\r\n message: computeErrorMessage(\r\n validators[j],\r\n value,\r\n path,\r\n rootData\r\n ),\r\n });\r\n }\r\n }\r\n\r\n return { valid: false, data: undefined, errors: errors };\r\n }\r\n }\r\n\r\n // Phase 2: Fast transform pipeline (only if validation passed)\r\n let transformedValue = value;\r\n\r\n // V8 optimization: Unrolled transform loop for common cases\r\n if (actualTransformCount === 1) {\r\n // Most common case: single transform\r\n transformedValue = transformFunctions[0](transformedValue);\r\n } else if (actualTransformCount === 2) {\r\n // Common case: two transforms\r\n transformedValue = transformFunctions[0](transformedValue);\r\n transformedValue = transformFunctions[1](transformedValue);\r\n } else if (actualTransformCount > 0) {\r\n // General case: multiple transforms\r\n for (let i = 0; i < actualTransformCount; i++) {\r\n transformedValue = transformFunctions[i](transformedValue);\r\n }\r\n }\r\n\r\n return {\r\n valid: true,\r\n data: transformedValue,\r\n errors: [],\r\n };\r\n };\r\n\r\n return { validate, parse, accessor };\r\n}\r\n\r\n/**\r\n * V8 optimization: Error message creation (Hidden Class unification)\r\n */\r\nfunction createValidationError(\r\n validator: any,\r\n value: any,\r\n path: string,\r\n rootData?: any\r\n): { path: string; code: string; message: string; context?: any } {\r\n // V8 optimization: \u30D7\u30ED\u30D1\u30C6\u30A3\u30A2\u30AF\u30BB\u30B9\u6700\u5C0F\u5316\r\n const code = validator.code || validator.pluginName || \"VALIDATION_ERROR\";\r\n let message = \"Validation failed\";\r\n let context: any = undefined;\r\n\r\n // Extract plugin-specific context from validator params\r\n if (validator.params && Array.isArray(validator.params)) {\r\n const [firstParam] = validator.params;\r\n if (\r\n validator.pluginName === \"stringStartsWith\" &&\r\n typeof firstParam === \"string\"\r\n ) {\r\n context = { prefix: firstParam };\r\n } else if (\r\n validator.pluginName === \"stringEndsWith\" &&\r\n typeof firstParam === \"string\"\r\n ) {\r\n context = { suffix: firstParam };\r\n } else if (\r\n validator.pluginName === \"stringMin\" &&\r\n typeof firstParam === \"number\"\r\n ) {\r\n context = { min: firstParam };\r\n } else if (\r\n validator.pluginName === \"stringMax\" &&\r\n typeof firstParam === \"number\"\r\n ) {\r\n context = { max: firstParam };\r\n } else if (\r\n validator.pluginName === \"arrayMaxLength\" &&\r\n typeof firstParam === \"number\"\r\n ) {\r\n context = { max: firstParam };\r\n } else if (\r\n validator.pluginName === \"arrayMinLength\" &&\r\n typeof firstParam === \"number\"\r\n ) {\r\n context = { min: firstParam };\r\n }\r\n }\r\n\r\n // V8 optimization: function existence check first\r\n if (validator.getErrorMessage) {\r\n try {\r\n message = validator.getErrorMessage(value, path, rootData);\r\n } catch (e) {\r\n message = `Validation failed for ${path}`;\r\n }\r\n } else if (validator.messageFactory) {\r\n try {\r\n // V8 optimization: Fixed object structure for Hidden Class unification\r\n const issueContext = { path: path, value: value, code: code, ...context };\r\n message = validator.messageFactory(issueContext);\r\n } catch (e) {\r\n message = `Validation failed for ${path}`;\r\n }\r\n }\r\n\r\n // V8 optimization: Hidden Class\u7D71\u4E00 - context is optional\r\n const errorObj: {\r\n path: string;\r\n code: string;\r\n message: string;\r\n context?: any;\r\n } = {\r\n path: path,\r\n code: code,\r\n message: message,\r\n };\r\n\r\n if (context) {\r\n errorObj.context = context;\r\n }\r\n\r\n return errorObj;\r\n}\r\n", "/**\r\n * Field Accessor Utilities\r\n *\r\n * Optimized field value access with pre-created accessor functions.\r\n * V8 Optimization: Direct property access chains for better performance.\r\n */\r\n\r\nimport { DOT } from \"../../../constants\";\r\n\r\n/**\r\n * Create optimized accessor function for a nested field path\r\n * V8 Optimization: Generate direct property access code for common depths\r\n *\r\n * @param pathSegments - Array of property keys to traverse\r\n * @returns Optimized accessor function\r\n */\r\nexport function createAccessor(pathSegments: string[]): (obj: any) => any {\r\n if (pathSegments.length === 0) {\r\n return (obj) => obj;\r\n }\r\n\r\n if (pathSegments.length === 1) {\r\n const key = pathSegments[0];\r\n return (obj) => obj?.[key];\r\n }\r\n\r\n if (pathSegments.length === 2) {\r\n const [key1, key2] = pathSegments;\r\n return (obj) => obj?.[key1]?.[key2];\r\n }\r\n\r\n if (pathSegments.length === 3) {\r\n const [key1, key2, key3] = pathSegments;\r\n return (obj) => obj?.[key1]?.[key2]?.[key3];\r\n }\r\n\r\n if (pathSegments.length === 4) {\r\n const [key1, key2, key3, key4] = pathSegments;\r\n return (obj) => obj?.[key1]?.[key2]?.[key3]?.[key4];\r\n }\r\n\r\n if (pathSegments.length === 5) {\r\n const [key1, key2, key3, key4, key5] = pathSegments;\r\n return (obj) => obj?.[key1]?.[key2]?.[key3]?.[key4]?.[key5];\r\n }\r\n\r\n // For deeper paths, fall back to loop (removed for...of, index-based)\r\n return (obj) => {\r\n let result = obj;\r\n const pathSegmentsLength = pathSegments.length;\r\n for (let i = 0; i < pathSegmentsLength; i++) {\r\n const key = pathSegments[i];\r\n result = result?.[key];\r\n if (result === undefined) return undefined;\r\n }\r\n return result;\r\n };\r\n}\r\n\r\n/**\r\n * Create accessor from dot-notation field path\r\n *\r\n * @param fieldPath - Field path in dot notation (e.g., \"user.profile.name\")\r\n * @returns Optimized accessor function\r\n */\r\nexport function createFieldAccessor(fieldPath: string): (obj: any) => any {\r\n return createAccessor(fieldPath.split(DOT));\r\n}\r\n\r\n/**\r\n * Get cached accessor or create new one\r\n * NOTE: Cache should be managed by the caller (e.g., validator factory)\r\n * to avoid global state and memory leaks\r\n *\r\n * @param fieldPath - Field path in dot notation\r\n * @param cache - Cache map provided by the caller\r\n * @returns Cached or newly created accessor function\r\n */\r\nexport function getCachedAccessor(\r\n fieldPath: string,\r\n cache: Map<string, (obj: any) => any>\r\n): (obj: any) => any {\r\n if (!cache.has(fieldPath)) {\r\n cache.set(fieldPath, createFieldAccessor(fieldPath));\r\n }\r\n return cache.get(fieldPath)!;\r\n}\r\n\r\n/**\r\n * Create accessor cache factory\r\n * Returns a function that manages its own cache scope\r\n * \r\n * @returns Function to get cached accessors with local cache\r\n */\r\nexport function createAccessorCacheFactory(): (fieldPath: string) => (obj: any) => any {\r\n const cache = new Map<string, (obj: any) => any>();\r\n \r\n return (fieldPath: string) => {\r\n if (!cache.has(fieldPath)) {\r\n cache.set(fieldPath, createFieldAccessor(fieldPath));\r\n }\r\n return cache.get(fieldPath)!;\r\n };\r\n}\r\n\r\n/**\r\n * Batch create accessors for multiple field paths\r\n * Useful for plugins that need to access multiple fields\r\n *\r\n * @param fieldPaths - Array of field paths in dot notation\r\n * @returns Array of accessor objects with fieldName and accessor function\r\n */\r\nexport function createBatchAccessors(fieldPaths: string[]): Array<{\r\n fieldName: string;\r\n accessor: (obj: any) => any;\r\n}> {\r\n return fieldPaths.map((fieldPath) => ({\r\n fieldName: fieldPath,\r\n accessor: createFieldAccessor(fieldPath),\r\n }));\r\n}\r\n\r\n/**\r\n * Create field value getter that returns values for multiple fields\r\n *\r\n * @param fieldPaths - Array of field paths to access\r\n * @returns Function that extracts values for all specified fields\r\n */\r\nexport function createMultiFieldGetter(\r\n fieldPaths: string[]\r\n): (obj: any) => Record<string, any> {\r\n const accessors = createBatchAccessors(fieldPaths);\r\n\r\n return (obj: any) => {\r\n const result: Record<string, any> = {};\r\n for (let i = 0; i < accessors.length; i++) {\r\n const { fieldName, accessor } = accessors[i];\r\n result[fieldName] = accessor(obj);\r\n }\r\n return result;\r\n };\r\n}\r\n\r\n/**\r\n * Optimized field existence checker\r\n *\r\n * @param fieldPath - Field path in dot notation\r\n * @returns Function that checks if field exists (not undefined)\r\n */\r\nexport function createFieldExistenceChecker(\r\n fieldPath: string\r\n): (obj: any) => boolean {\r\n const accessor = createFieldAccessor(fieldPath);\r\n return (obj: any) => accessor(obj) !== undefined;\r\n}\r\n\r\n/**\r\n * Create field setter for nested paths\r\n * V8 Optimization: Direct property assignment for common depths\r\n *\r\n * @param fieldPath - Field path in dot notation\r\n * @returns Function that sets the field value\r\n */\r\nexport function createFieldSetter(\r\n fieldPath: string\r\n): (obj: any, value: any) => void {\r\n const pathSegments = fieldPath.split(DOT);\r\n\r\n if (pathSegments.length === 1) {\r\n const key = pathSegments[0];\r\n return (obj, value) => {\r\n obj[key] = value;\r\n };\r\n }\r\n\r\n if (pathSegments.length === 2) {\r\n const [key1, key2] = pathSegments;\r\n return (obj, value) => {\r\n if (!obj[key1]) obj[key1] = {};\r\n obj[key1][key2] = value;\r\n };\r\n }\r\n\r\n if (pathSegments.length === 3) {\r\n const [key1, key2, key3] = pathSegments;\r\n return (obj, value) => {\r\n if (!obj[key1]) obj[key1] = {};\r\n if (!obj[key1][key2]) obj[key1][key2] = {};\r\n obj[key1][key2][key3] = value;\r\n };\r\n }\r\n\r\n // For deeper paths, use generic approach\r\n return (obj, value) => {\r\n let current = obj;\r\n for (let i = 0; i < pathSegments.length - 1; i++) {\r\n const key = pathSegments[i];\r\n if (!current[key]) current[key] = {};\r\n current = current[key];\r\n }\r\n current[pathSegments[pathSegments.length - 1]] = value;\r\n };\r\n}\r\n\r\n/**\r\n * Create optimized nested value accessor with array support\r\n * Handles array element validation patterns and standard nested access\r\n * V8 Optimization: Fast paths for common access patterns\r\n *\r\n * @param fieldPath - Field path in dot notation\r\n * @returns Function that gets nested values with array support\r\n */\r\nexport function createNestedValueAccessor(\r\n fieldPath: string\r\n): (obj: Record<string, unknown>) => unknown {\r\n // Fast path for simple property access\r\n if (!fieldPath.includes(DOT)) {\r\n return (obj) => obj[fieldPath];\r\n }\r\n\r\n const parts = fieldPath.split(DOT);\r\n const partsLength = parts.length;\r\n\r\n // Fast path for two-level access\r\n if (partsLength === 2) {\r\n const [key1, key2] = parts;\r\n return (obj) => {\r\n const firstValue = obj[key1];\r\n\r\n // Array element validation case\r\n if (Array.isArray(firstValue)) {\r\n return firstValue;\r\n }\r\n\r\n // Standard nested access\r\n return firstValue != null && typeof firstValue === \"object\"\r\n ? (firstValue as Record<string, unknown>)[key2]\r\n : undefined;\r\n };\r\n }\r\n\r\n // General case for deeper nesting\r\n return (obj) => {\r\n let current = obj;\r\n for (let i = 0; i < partsLength; i++) {\r\n if (current == null || typeof current !== \"object\") {\r\n return undefined;\r\n }\r\n\r\n const part = parts[i];\r\n const value = (current as Record<string, unknown>)[part];\r\n\r\n // Check if this is an array that needs element validation\r\n if (Array.isArray(value) && i < partsLength - 1) {\r\n // Array element field access: extract property from each element\r\n const remainingPath = parts.slice(i + 1).join('.');\r\n const elementValues = value.map(element => {\r\n if (element == null || typeof element !== \"object\") {\r\n return undefined;\r\n }\r\n \r\n // For simple property access on element\r\n if (remainingPath.indexOf('.') === -1) {\r\n return (element as Record<string, unknown>)[remainingPath];\r\n }\r\n \r\n // For nested property access on element\r\n let elementCurrent = element;\r\n const remainingParts = parts.slice(i + 1);\r\n \r\n const remainingLength = remainingParts.length;\r\n for (let j = 0; j < remainingLength; j++) {\r\n if (elementCurrent == null || typeof elementCurrent !== \"object\") {\r\n return undefined;\r\n }\r\n elementCurrent = (elementCurrent as Record<string, unknown>)[remainingParts[j]];\r\n }\r\n \r\n return elementCurrent;\r\n });\r\n \r\n // Return special array marker for validation system\r\n return { __isArrayElementField: true, values: elementValues, arrayPath: parts.slice(0, i + 1).join('.') };\r\n }\r\n\r\n current = value as Record<string, unknown>;\r\n }\r\n\r\n return current;\r\n };\r\n}\r\n\r\n/**\r\n * Parse field path and detect array element notation [*]\r\n * \r\n * @param fieldPath - Field path that may contain [*] notation\r\n * @returns Object describing the path structure\r\n */\r\nexport function parseFieldPath(fieldPath: string): {\r\n hasArrayElements: boolean;\r\n segments: Array<{ name: string; isArrayElement: boolean }>;\r\n baseArrayPath?: string;\r\n elementPath?: string;\r\n} {\r\n const hasArrayElements = fieldPath.includes('[*]');\r\n \r\n if (!hasArrayElements) {\r\n return {\r\n hasArrayElements: false,\r\n segments: fieldPath.split(DOT).map(name => ({ name, isArrayElement: false }))\r\n };\r\n }\r\n \r\n // Parse path with [*] notation like \"categories[*]\" or \"categories[*].subcategories[*]\"\r\n const parts = fieldPath.split(DOT);\r\n const segments: Array<{ name: string; isArrayElement: boolean }> = [];\r\n \r\n for (const part of parts) {\r\n if (part.endsWith('[*]')) {\r\n const baseName = part.slice(0, -3); // Remove [*]\r\n segments.push({ name: baseName, isArrayElement: true });\r\n } else {\r\n segments.push({ name: part, isArrayElement: false });\r\n }\r\n }\r\n \r\n // Find first array element to determine base array path and element path\r\n const firstArrayIndex = segments.findIndex(s => s.isArrayElement);\r\n if (firstArrayIndex !== -1) {\r\n const baseArrayPath = segments.slice(0, firstArrayIndex + 1)\r\n .map(s => s.name)\r\n .join(DOT);\r\n const elementPath = segments.slice(firstArrayIndex + 1)\r\n .map(s => s.name)\r\n .join(DOT);\r\n \r\n return {\r\n hasArrayElements: true,\r\n segments,\r\n baseArrayPath,\r\n elementPath: elementPath || ''\r\n };\r\n }\r\n \r\n return {\r\n hasArrayElements: true,\r\n segments\r\n };\r\n}\r\n\r\n/**\r\n * Create accessor for array element fields with [*] notation\r\n * Returns array of values that should be validated individually\r\n * \r\n * @param fieldPath - Field path with [*] notation (e.g., \"categories[*]\", \"categories[*].name\")\r\n * @returns Function that returns array element values for validation\r\n */\r\nexport function createArrayElementAccessor(\r\n fieldPath: string\r\n): (obj: any) => { elements: any[]; basePath: string; elementPath: string } | null {\r\n const parsed = parseFieldPath(fieldPath);\r\n \r\n if (!parsed.hasArrayElements || !parsed.baseArrayPath) {\r\n return () => null;\r\n }\r\n \r\n const baseArrayAccessor = createFieldAccessor(parsed.baseArrayPath);\r\n const elementPath = parsed.elementPath || '';\r\n \r\n return (obj: any) => {\r\n const arrayValue = baseArrayAccessor(obj);\r\n \r\n if (!Array.isArray(arrayValue)) {\r\n return null;\r\n }\r\n \r\n let elements: any[];\r\n \r\n if (elementPath === '') {\r\n // Direct array elements: \"categories[*]\"\r\n elements = arrayValue;\r\n } else {\r\n // Nested property from array elements: \"categories[*].name\"\r\n const elementAccessor = createFieldAccessor(elementPath);\r\n elements = arrayValue.map(element => elementAccessor(element));\r\n }\r\n \r\n return {\r\n elements,\r\n basePath: parsed.baseArrayPath!,\r\n elementPath\r\n };\r\n };\r\n}\r\n", "/**\r\n * Enhanced Nested Array Processor\r\n *\r\n * Supports complete nested array validation with accurate error paths.\r\n * This module handles arrays at any depth level with proper index tracking.\r\n */\r\n\r\nimport { ValidationMode, VALIDATE_MODE, PARSE_MODE } from \"../../constants\";\r\nimport {\r\n createAccessor as createFieldAccessor,\r\n createFieldSetter,\r\n} from \"../plugin/utils/field-accessor\";\r\n\r\n/**\r\n * Parse array element path pattern and extract array path and element field\r\n * Examples:\r\n * - \"items[*].name\" => { arrayPath: \"items\", elementField: \"name\" }\r\n * - \"items.*.name\" => { arrayPath: \"items\", elementField: \"name\" }\r\n * - \"users[*].addresses[*].street\" => { arrayPath: \"users\", elementField: \"addresses[*].street\" }\r\n */\r\nexport function parseArrayElementPath(path: string): {\r\n isArrayElementPath: boolean;\r\n arrayPath?: string;\r\n elementField?: string;\r\n} {\r\n // Check for multi-dimensional array patterns (consecutive [*] without dots)\r\n // Pattern: matrix[*][*][*] -> arrayPath: \"matrix[*][*]\", elementField: \"\"\r\n const multiDimMatch = path.match(/^(.+\\[\\*\\])\\[\\*\\]$/);\r\n if (multiDimMatch) {\r\n return {\r\n isArrayElementPath: true,\r\n arrayPath: multiDimMatch[1],\r\n elementField: \"\",\r\n };\r\n }\r\n\r\n // Check for complex nested array patterns with arbitrary depth\r\n // Pattern: any number of [*]. segments followed by optional final field\r\n // Examples: \"orders[*].items[*].productId\", \"departments[*].teams[*].projects[*].title\"\r\n const complexNestedMatch = path.match(/^(.+?)(\\[\\*\\]\\.(.+))?$/);\r\n if (complexNestedMatch && path.includes('[*].')) {\r\n // Split the path into segments at [*]. boundaries\r\n const segments = path.split(/\\[\\*\\]\\./);\r\n \r\n if (segments.length >= 2) {\r\n // The last segment is the final field (or empty for direct array access)\r\n const finalSegment = segments[segments.length - 1];\r\n \r\n // Check if the final segment itself contains [*] (for direct array access patterns)\r\n if (finalSegment.includes('[*]')) {\r\n // This is a direct array access pattern like \"departments[*].teams[*]\"\r\n // Remove the [*] from the final segment to build the array path\r\n const cleanFinalSegment = finalSegment.replace(/\\[\\*\\]$/, '');\r\n const arrayPathSegments = segments.slice(0, -1).concat(cleanFinalSegment);\r\n \r\n return {\r\n isArrayElementPath: true,\r\n arrayPath: arrayPathSegments.join('.'),\r\n elementField: \"\",\r\n };\r\n } else {\r\n // This is a field access pattern like \"departments[*].teams[*].projects[*].title\"\r\n // Build the array path from all segments except the last one\r\n const arrayPathSegments = segments.slice(0, -1);\r\n \r\n return {\r\n isArrayElementPath: true,\r\n arrayPath: arrayPathSegments.join('.'),\r\n elementField: finalSegment,\r\n };\r\n }\r\n }\r\n }\r\n\r\n // Check for [*] pattern with field\r\n const bracketMatch = path.match(/^([^\\[]+)\\[\\*\\]\\.(.+)$/);\r\n if (bracketMatch) {\r\n return {\r\n isArrayElementPath: true,\r\n arrayPath: bracketMatch[1],\r\n elementField: bracketMatch[2],\r\n };\r\n }\r\n\r\n // Check for direct [*] pattern (no field after)\r\n const directBracketMatch = path.match(/^([^\\[]+)\\[\\*\\]$/);\r\n if (directBracketMatch) {\r\n return {\r\n isArrayElementPath: true,\r\n arrayPath: directBracketMatch[1],\r\n elementField: \"\",\r\n };\r\n }\r\n\r\n // Check for .* pattern\r\n const dotMatch = path.match(/^([^\\.]+)\\.\\*\\.(.+)$/);\r\n if (dotMatch) {\r\n return {\r\n isArrayElementPath: true,\r\n arrayPath: dotMatch[1],\r\n elementField: dotMatch[2],\r\n };\r\n }\r\n\r\n return { isArrayElementPath: false };\r\n}\r\n\r\nexport interface NestedArrayBatchInfo {\r\n arrayPath: string; // e.g., \"departments\", \"departments.teams\"\r\n elementFields: string[]; // Direct element fields only, e.g., [\"name\", \"id\"]\r\n fullFieldPaths: string[]; // All paths including nested, e.g., [\"departments.name\", \"departments.teams.name\"]\r\n validators: Map<string, any>; // validators for each full field path\r\n accessors: Map<string, (obj: any) => any>; // element field -> accessor function\r\n childArrays: Map<string, NestedArrayBatchInfo>; // nested arrays within this array\r\n depth: number; // nesting depth (0 = top level)\r\n parentPath?: string; // parent array path if this is nested\r\n}\r\n\r\n/**\r\n * Build hierarchical array structure from field definitions\r\n */\r\nexport function buildNestedArrayHierarchy(\r\n fieldDefinitions: Array<{\r\n path: string;\r\n isArrayField?: boolean;\r\n builderFunction?: (context: any) => any;\r\n }>\r\n): Map<string, NestedArrayBatchInfo> {\r\n // First, process array element paths and convert them to array field markers\r\n const processedDefinitions: Array<{\r\n path: string;\r\n isArrayField?: boolean;\r\n originalPath?: string;\r\n builderFunction?: (context: any) => any;\r\n }> = [];\r\n\r\n const arrayPaths = new Set<string>();\r\n\r\n // Identify array paths from element paths\r\n for (const fd of fieldDefinitions) {\r\n const parsed = parseArrayElementPath(fd.path);\r\n if (parsed.isArrayElementPath && parsed.arrayPath) {\r\n arrayPaths.add(parsed.arrayPath);\r\n \r\n // Check if the elementField contains nested array patterns\r\n if (parsed.elementField && parsed.elementField.includes('[*]')) {\r\n // This is a nested array pattern like \"items[*].productId\"\r\n // We need to create an additional array field for the nested array\r\n const nestedArrayPath = `${parsed.arrayPath}.${parsed.elementField.split('[*]')[0]}`;\r\n arrayPaths.add(nestedArrayPath);\r\n }\r\n \r\n processedDefinitions.push({\r\n ...fd,\r\n originalPath: fd.path,\r\n });\r\n } else {\r\n processedDefinitions.push(fd);\r\n }\r\n }\r\n\r\n // Add array field markers for identified array paths\r\n for (const arrayPath of arrayPaths) {\r\n if (\r\n !processedDefinitions.some(\r\n (fd) => fd.path === arrayPath && fd.isArrayField\r\n )\r\n ) {\r\n processedDefinitions.push({\r\n path: arrayPath,\r\n isArrayField: true,\r\n });\r\n }\r\n }\r\n\r\n // Additional processing: ensure nested arrays are properly marked\r\n // Look for array patterns in element fields and create explicit array field markers\r\n const additionalNestedArrays = new Set<string>();\r\n for (const fd of processedDefinitions) {\r\n if (fd.originalPath) {\r\n const parsed = parseArrayElementPath(fd.originalPath);\r\n if (parsed.isArrayElementPath && parsed.elementField && parsed.elementField.includes('[*]')) {\r\n // This elementField contains a nested array pattern\r\n const baseElementField = parsed.elementField.split('[*]')[0];\r\n const nestedArrayFullPath = `${parsed.arrayPath}.${baseElementField}`;\r\n if (!additionalNestedArrays.has(nestedArrayFullPath) && \r\n !processedDefinitions.some(d => d.path === nestedArrayFullPath && d.isArrayField)) {\r\n additionalNestedArrays.add(nestedArrayFullPath);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Add the additional nested arrays as explicit array fields\r\n for (const nestedArrayPath of additionalNestedArrays) {\r\n processedDefinitions.push({\r\n path: nestedArrayPath,\r\n isArrayField: true,\r\n });\r\n }\r\n\r\n // Find all array fields (but exclude array element patterns like \"orders[*].items\")\r\n const arrayFields = processedDefinitions.filter((fd) => {\r\n if (!fd.isArrayField) return false;\r\n \r\n // For multi-dimensional arrays, we need to distinguish between:\r\n // 1. Array field paths like \"matrix[*]\" (represent sub-arrays - KEEP)\r\n // 2. Array element validation paths like \"matrix[*][*]\" or \"orders[*].name\" (validate elements - EXCLUDE)\r\n \r\n // If path contains [*], check if it's a multi-dimensional array field vs element validation\r\n if (fd.path.includes('[*]')) {\r\n // Check if this is a direct multi-dimensional array pattern (ends with [*])\r\n if (fd.path.match(/\\[\\*\\]$/)) {\r\n // This is a multi-dimensional array field like \"matrix[*]\" or \"cube[*][*]\"\r\n // These should be included as array fields\r\n return true;\r\n }\r\n \r\n // This is an element validation pattern like \"orders[*].name\" - exclude\r\n return false;\r\n }\r\n \r\n return true;\r\n });\r\n\r\n // Sort by depth to process from top level down\r\n arrayFields.sort((a, b) => {\r\n const depthA = a.path.split(\".\").length;\r\n const depthB = b.path.split(\".\").length;\r\n return depthA - depthB; // Shallowest first\r\n });\r\n\r\n const arrayHierarchy = new Map<string, NestedArrayBatchInfo>();\r\n\r\n // Build hierarchy\r\n for (const arrayField of arrayFields) {\r\n const arrayPath = arrayField.path;\r\n const depth = arrayPath.split(\".\").length - 1;\r\n\r\n // Find parent array if this is nested\r\n let parentPath: string | undefined;\r\n for (const existingPath of arrayHierarchy.keys()) {\r\n // Handle regular nested paths with dots (like \"orders.items\")\r\n if (arrayPath.startsWith(existingPath + \".\")) {\r\n if (!parentPath || existingPath.length > parentPath.length) {\r\n parentPath = existingPath;\r\n }\r\n }\r\n // Handle multi-dimensional array paths (like \"matrix[*]\" having parent \"matrix\")\r\n else if (arrayPath.startsWith(existingPath + \"[*]\") && existingPath !== arrayPath) {\r\n if (!parentPath || existingPath.length > parentPath.length) {\r\n parentPath = existingPath;\r\n }\r\n }\r\n }\r\n\r\n // Find all fields that belong to this array\r\n const allRelatedFields = processedDefinitions.filter((fd) => {\r\n // Check original path if it exists (for array element paths)\r\n const pathToCheck = fd.originalPath || fd.path;\r\n const parsed = parseArrayElementPath(pathToCheck);\r\n if (parsed.isArrayElementPath && parsed.arrayPath === arrayPath) {\r\n return true;\r\n }\r\n return pathToCheck.startsWith(arrayPath + \".\");\r\n });\r\n\r\n // Skip array fields that have no related element fields\r\n // These should be processed as regular fields, not through array batching\r\n if (allRelatedFields.length === 0) {\r\n continue;\r\n }\r\n\r\n // Separate direct element fields from nested array fields\r\n const elementFields: string[] = [];\r\n const fullFieldPaths: string[] = [];\r\n\r\n for (const field of allRelatedFields) {\r\n const pathToCheck = field.originalPath || field.path;\r\n const parsed = parseArrayElementPath(pathToCheck);\r\n\r\n let relativePath: string;\r\n if (\r\n parsed.isArrayElementPath &&\r\n parsed.arrayPath === arrayPath &&\r\n parsed.elementField !== undefined\r\n ) {\r\n relativePath = parsed.elementField;\r\n } else {\r\n relativePath = pathToCheck.substring(arrayPath.length + 1);\r\n }\r\n\r\n // Check if this field belongs to a nested array\r\n const belongsToNestedArray = arrayFields.some(\r\n (af) =>\r\n af.path !== arrayPath &&\r\n af.path.startsWith(arrayPath + \".\") &&\r\n field.path.startsWith(af.path + \".\")\r\n );\r\n\r\n if (!belongsToNestedArray) {\r\n // This is a direct element field\r\n elementFields.push(relativePath);\r\n }\r\n\r\n // Only add to fullFieldPaths if this field has a validator (not array field markers)\r\n if (!field.isArrayField) {\r\n fullFieldPaths.push(field.originalPath || field.path);\r\n }\r\n }\r\n\r\n // Create accessors for direct element fields\r\n const accessors = new Map<string, (obj: any) => any>();\r\n for (const elementField of elementFields) {\r\n const segments = elementField.split(\".\");\r\n accessors.set(elementField, createFieldAccessor(segments));\r\n }\r\n\r\n const batchInfo: NestedArrayBatchInfo = {\r\n arrayPath,\r\n elementFields,\r\n fullFieldPaths,\r\n validators: new Map(),\r\n accessors,\r\n childArrays: new Map(),\r\n depth,\r\n parentPath,\r\n };\r\n\r\n arrayHierarchy.set(arrayPath, batchInfo);\r\n }\r\n\r\n // Link child arrays to their parents\r\n for (const [arrayPath, batchInfo] of arrayHierarchy) {\r\n if (batchInfo.parentPath) {\r\n const parent = arrayHierarchy.get(batchInfo.parentPath);\r\n if (parent) {\r\n // Calculate child key properly for both dot-separated and multi-dimensional arrays\r\n let childKey: string;\r\n if (arrayPath.startsWith(batchInfo.parentPath + \".\")) {\r\n // Regular nested path like \"orders.items\" -> child key is \"items\"\r\n childKey = arrayPath.substring(batchInfo.parentPath.length + 1);\r\n } else if (arrayPath.startsWith(batchInfo.parentPath + \"[*]\")) {\r\n // Multi-dimensional array like \"matrix[*]\" -> child key is \"[*]\"\r\n childKey = arrayPath.substring(batchInfo.parentPath.length);\r\n } else {\r\n // Fallback\r\n childKey = arrayPath.substring(batchInfo.parentPath.length + 1);\r\n }\r\n parent.childArrays.set(childKey, batchInfo);\r\n }\r\n }\r\n }\r\n\r\n return arrayHierarchy;\r\n}\r\n\r\n/**\r\n * Create hierarchical nested array validator\r\n */\r\nexport function createNestedArrayValidator(\r\n nestedBatchInfo: NestedArrayBatchInfo,\r\n fieldValidators: Map<string, any>\r\n): (\r\n arrayData: any[],\r\n rootData: any,\r\n abortEarly: boolean,\r\n abortEarlyOnEachField: boolean,\r\n mode: ValidationMode,\r\n parentPath?: string\r\n) => NestedValidationResult {\r\n // Populate validators map for this level (if not already pre-populated)\r\n // The array batch optimizer may have already populated this with all collected validators\r\n if (nestedBatchInfo.validators.size === 0) {\r\n for (const fullPath of nestedBatchInfo.fullFieldPaths) {\r\n const validator = fieldValidators.get(fullPath);\r\n if (validator) {\r\n nestedBatchInfo.validators.set(fullPath, validator);\r\n }\r\n }\r\n }\r\n\r\n return function processNestedArray(\r\n arrayData: any[],\r\n rootData: any,\r\n abortEarly: boolean,\r\n abortEarlyOnEachField: boolean = true,\r\n mode: ValidationMode = VALIDATE_MODE,\r\n parentPath: string = \"\"\r\n ): NestedValidationResult {\r\n const errors: NestedError[] = [];\r\n const transformedArray = mode === PARSE_MODE ? [...arrayData] : undefined;\r\n const effectiveAbortEarlyOnEachField = false; // Always validate all fields in array elements\r\n\r\n if (!Array.isArray(arrayData)) {\r\n return { errors, transformedData: transformedArray };\r\n }\r\n\r\n // Process each array element\r\n for (\r\n let elementIndex = 0;\r\n elementIndex < arrayData.length;\r\n elementIndex++\r\n ) {\r\n const element = arrayData[elementIndex];\r\n let transformedElement = mode === PARSE_MODE ? (typeof element === 'object' && element !== null ? { ...element } : element) : undefined;\r\n let elementHasError = false;\r\n\r\n // Build current element path\r\n const currentElementPath = parentPath\r\n ? `${parentPath}[${elementIndex}]`\r\n : `${nestedBatchInfo.arrayPath}[${elementIndex}]`;\r\n\r\n // Validate direct element fields\r\n for (const elementField of nestedBatchInfo.elementFields) {\r\n // Handle special case where elementField is empty (direct array element validation)\r\n if (elementField === \"\") {\r\n // Direct element validation (e.g., matrix[*] validates each element)\r\n // For nested arrays, we need to find the validator by checking the full field paths\r\n // since the validator is stored with the original pattern (e.g., \"users[*].tags[*]\")\r\n // not the derived pattern (e.g., \"users.tags[*]\")\r\n let validator = null;\r\n \r\n // Try the constructed path first (works for multi-dimensional arrays)\r\n const arrayElementPath = `${nestedBatchInfo.arrayPath}[*]`;\r\n validator = nestedBatchInfo.validators.get(arrayElementPath);\r\n \r\n // If not found, look for validators in fullFieldPaths (works for nested object arrays)\r\n if (!validator) {\r\n for (const fullPath of nestedBatchInfo.fullFieldPaths) {\r\n const candidateValidator = nestedBatchInfo.validators.get(fullPath);\r\n if (candidateValidator) {\r\n validator = candidateValidator;\r\n break; // Use the first validator found\r\n }\r\n }\r\n }\r\n \r\n if (!validator) continue;\r\n\r\n const elementValue = transformedElement || element;\r\n const elementFieldPath = currentElementPath;\r\n\r\n // Validate the array element itself\r\n let result: any;\r\n if (mode === VALIDATE_MODE) {\r\n if (validator.validate) {\r\n result = validator.validate(elementValue, rootData, {\r\n abortEarlyOnEachField: effectiveAbortEarlyOnEachField,\r\n });\r\n } else if (validator.validateSlow) {\r\n result = validator.validateSlow(elementValue, rootData, {\r\n abortEarlyOnEachField: effectiveAbortEarlyOnEachField,\r\n });\r\n } else if (validator.validateFast) {\r\n result = validator.validateFast(elementValue, rootData);\r\n } else {\r\n continue;\r\n }\r\n } else if (mode === PARSE_MODE) {\r\n if (validator.parse) {\r\n result = validator.parse(elementValue, rootData, {\r\n abortEarlyOnEachField: effectiveAbortEarlyOnEachField,\r\n });\r\n } else if (validator.parseSlow) {\r\n result = validator.parseSlow(elementValue, rootData, {\r\n abortEarlyOnEachField: effectiveAbortEarlyOnEachField,\r\n });\r\n } else if (validator.parseFast) {\r\n result = validator.parseFast(elementValue, rootData);\r\n } else {\r\n continue;\r\n }\r\n } else {\r\n continue;\r\n }\r\n\r\n if (!result.valid) {\r\n elementHasError = true;\r\n if (result.errors && result.errors.length > 0) {\r\n for (const error of result.errors) {\r\n errors.push({\r\n path: elementFieldPath,\r\n code:\r\n error.code ||\r\n (mode === PARSE_MODE ? \"PARSE_ERROR\" : \"VALIDATION_ERROR\"),\r\n message:\r\n error.message ||\r\n (mode === PARSE_MODE ? \"Parse failed\" : \"Validation failed\"),\r\n paths: () => [elementFieldPath],\r\n });\r\n }\r\n } else {\r\n errors.push({\r\n path: elementFieldPath,\r\n code: mode === PARSE_MODE ? \"PARSE_ERROR\" : \"VALIDATION_ERROR\",\r\n message:\r\n mode === PARSE_MODE ? \"Parse failed\" : \"Validation failed\",\r\n paths: () => [elementFieldPath],\r\n });\r\n }\r\n\r\n if (effectiveAbortEarlyOnEachField) {\r\n break;\r\n }\r\n } else if (\r\n mode === PARSE_MODE &&\r\n result.data !== undefined\r\n ) {\r\n // For direct element validation, replace the entire element\r\n if (transformedArray) {\r\n transformedArray[elementIndex] = result.data;\r\n }\r\n }\r\n continue; // Skip the regular field validation logic below\r\n }\r\n\r\n // Regular field validation within elements\r\n const fullFieldPath = `${nestedBatchInfo.arrayPath}.${elementField}`;\r\n\r\n // Check if we have a validator for the array element path pattern\r\n const arrayElementPath = `${nestedBatchInfo.arrayPath}[*].${elementField}`;\r\n const dotArrayElementPath = `${nestedBatchInfo.arrayPath}.*.${elementField}`;\r\n\r\n let validator = nestedBatchInfo.validators.get(fullFieldPath);\r\n if (!validator) {\r\n validator = nestedBatchInfo.validators.get(arrayElementPath);\r\n }\r\n if (!validator) {\r\n validator = nestedBatchInfo.validators.get(dotArrayElementPath);\r\n }\r\n \r\n // If still not found, search through fullFieldPaths (for nested object arrays)\r\n if (!validator) {\r\n for (const fullPath of nestedBatchInfo.fullFieldPaths) {\r\n // Check if this fullPath matches the current elementField\r\n const candidateValidator = nestedBatchInfo.validators.get(fullPath);\r\n if (candidateValidator && fullPath.includes(elementField)) {\r\n validator = candidateValidator;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!validator) continue;\r\n\r\n // Use pre-compiled accessor\r\n const accessor = nestedBatchInfo.accessors.get(elementField);\r\n const elementValue = accessor\r\n ? accessor(transformedElement || element)\r\n : undefined;\r\n const elementFieldPath = `${currentElementPath}.${elementField}`;\r\n\r\n // Validate the field\r\n let result: any;\r\n if (mode === VALIDATE_MODE) {\r\n if (validator.validate) {\r\n // Use unified validator interface\r\n result = validator.validate(elementValue, rootData, {\r\n abortEarlyOnEachField: effectiveAbortEarlyOnEachField,\r\n });\r\n } else if (validator.validateSlow) {\r\n result = validator.validateSlow(elementValue, rootData, {\r\n abortEarlyOnEachField: effectiveAbortEarlyOnEachField,\r\n });\r\n } else if (validator.validateFast) {\r\n result = validator.validateFast(elementValue, rootData);\r\n } else {\r\n continue;\r\n }\r\n } else if (mode === PARSE_MODE) {\r\n if (validator.parse) {\r\n // Use unified validator interface\r\n result = validator.parse(elementValue, rootData, {\r\n abortEarlyOnEachField: effectiveAbortEarlyOnEachField,\r\n });\r\n } else if (validator.parseSlow) {\r\n result = validator.parseSlow(elementValue, rootData, {\r\n abortEarlyOnEachField: effectiveAbortEarlyOnEachField,\r\n });\r\n } else if (validator.parseFast) {\r\n result = validator.parseFast(elementValue, rootData);\r\n } else {\r\n continue;\r\n }\r\n } else {\r\n continue;\r\n }\r\n\r\n if (!result.valid) {\r\n elementHasError = true;\r\n if (result.errors && result.errors.length > 0) {\r\n for (const error of result.errors) {\r\n errors.push({\r\n path: elementFieldPath,\r\n code:\r\n error.code ||\r\n (mode === PARSE_MODE ? \"PARSE_ERROR\" : \"VALIDATION_ERROR\"),\r\n message:\r\n error.message ||\r\n (mode === PARSE_MODE ? \"Parse failed\" : \"Validation failed\"),\r\n paths: () => [elementFieldPath],\r\n });\r\n }\r\n } else {\r\n errors.push({\r\n path: elementFieldPath,\r\n code: mode === PARSE_MODE ? \"PARSE_ERROR\" : \"VALIDATION_ERROR\",\r\n message:\r\n mode === PARSE_MODE ? \"Parse failed\" : \"Validation failed\",\r\n paths: () => [elementFieldPath],\r\n });\r\n }\r\n\r\n if (effectiveAbortEarlyOnEachField) {\r\n break;\r\n }\r\n } else if (\r\n mode === PARSE_MODE &&\r\n result.data !== undefined &&\r\n transformedElement\r\n ) {\r\n setNestedValue(transformedElement, elementField, result.data);\r\n }\r\n }\r\n\r\n // Process nested arrays within this element\r\n for (const [\r\n childArrayKey,\r\n childBatchInfo,\r\n ] of nestedBatchInfo.childArrays) {\r\n let childArrayData: any;\r\n let childPath: string;\r\n \r\n // Handle multi-dimensional array patterns vs nested object arrays\r\n if (childArrayKey.startsWith(\"[*]\")) {\r\n // Multi-dimensional array: the element itself is the child array\r\n // e.g., for matrix[*], each element is a sub-array like [1, 2, 3]\r\n childArrayData = transformedElement || element;\r\n childPath = currentElementPath; // Use current element path directly\r\n } else {\r\n // Regular nested object array: access the child array as a property\r\n // e.g., for users[*].addresses, access element.addresses\r\n childArrayData = transformedElement?.[childArrayKey] || element[childArrayKey];\r\n childPath = `${currentElementPath}.${childArrayKey}`;\r\n }\r\n\r\n if (Array.isArray(childArrayData)) {\r\n const childValidator = createNestedArrayValidator(\r\n childBatchInfo,\r\n fieldValidators\r\n );\r\n const childResult = childValidator(\r\n childArrayData,\r\n rootData,\r\n abortEarly,\r\n abortEarlyOnEachField,\r\n mode,\r\n childPath\r\n );\r\n\r\n if (childResult.errors.length > 0) {\r\n errors.push(...childResult.errors);\r\n elementHasError = true;\r\n }\r\n\r\n if (\r\n mode === PARSE_MODE &&\r\n childResult.transformedData &&\r\n transformedElement\r\n ) {\r\n transformedElement[childArrayKey] = childResult.transformedData;\r\n }\r\n }\r\n }\r\n\r\n // Only update the transformed array if we haven't already set it via direct element validation\r\n if (mode === PARSE_MODE && transformedArray && transformedElement && typeof transformedElement === 'object') {\r\n transformedArray[elementIndex] = transformedElement;\r\n }\r\n\r\n // If we found errors in this element and abortEarly is true, stop processing more elements\r\n if (elementHasError && abortEarly) {\r\n return { errors, transformedData: transformedArray };\r\n }\r\n }\r\n\r\n return { errors, transformedData: transformedArray };\r\n };\r\n}\r\n\r\n/**\r\n * Set nested value using field-accessor utility\r\n */\r\nfunction setNestedValue(obj: any, path: string, value: any): void {\r\n const setter = createFieldSetter(path);\r\n setter(obj, value);\r\n}\r\n\r\n// Type definitions\r\ninterface NestedError {\r\n path: string;\r\n code: string;\r\n message: string;\r\n paths: () => string[];\r\n}\r\n\r\ninterface NestedValidationResult {\r\n errors: NestedError[];\r\n transformedData?: any[];\r\n}\r\n", "/**\r\n * Array Batch Processing Optimizer\r\n *\r\n * Optimizes validation by batching array element fields:\r\n * Instead of accessing the same array multiple times for different element properties,\r\n * we access the array once and validate all element properties in batch.\r\n *\r\n * Example:\r\n * - customer.addresses.type\r\n * - customer.addresses.name\r\n * - customer.addresses.street\r\n *\r\n * Instead of 3 separate array accesses, we do:\r\n * 1. Get customer.addresses array once\r\n * 2. For each address element, validate type, name, street together\r\n */\r\n\r\nimport { ValidationMode, VALIDATE_MODE, PARSE_MODE } from \"../../constants\";\r\nimport { createFieldSetter } from \"../plugin/utils/field-accessor\";\r\nimport { ArrayStructureInfo } from \"../../types/array-type-analysis\";\r\nimport {\r\n buildNestedArrayHierarchy,\r\n createNestedArrayValidator,\r\n NestedArrayBatchInfo,\r\n} from \"./nested-array-processor\";\r\n\r\nexport interface ArrayBatchInfo {\r\n arrayPath: string; // e.g., \"customer.addresses\"\r\n elementFields: string[]; // e.g., [\"type\", \"name\", \"street\"]\r\n fullFieldPaths: string[]; // e.g., [\"customer.addresses.type\", \"customer.addresses.name\", \"customer.addresses.street\"]\r\n validators: Map<string, any>; // validators for each full field path\r\n // Pre-compiled accessors for performance\r\n accessors: Map<string, (obj: any) => any>; // element field -> accessor function\r\n // Multi-dimensional array support\r\n arrayStructure?: ArrayStructureInfo; // Build-time analyzed array structure\r\n optimizedValidator?: (\r\n array: any,\r\n rootData: any,\r\n options: any\r\n ) => ValidationResult; // Generated validator for deep arrays\r\n // Enhanced nested array support\r\n _nestedInfo?: NestedArrayBatchInfo; // Internal: enhanced nested processing info\r\n}\r\n\r\n// Validation result for multi-dimensional arrays\r\ninterface ValidationResult {\r\n valid: boolean;\r\n errors: Array<{\r\n path: string;\r\n code: string;\r\n message: string;\r\n paths: () => string[];\r\n }>;\r\n transformedData?: any;\r\n}\r\n\r\n/**\r\n * Enhanced nested array processing using new hierarchical approach\r\n * Converts legacy ArrayBatchInfo to new NestedArrayBatchInfo format\r\n */\r\nfunction findNestedArrays(\r\n fieldDefinitions: FieldDefinitionWithArray[]\r\n): Map<string, ArrayBatchInfo> {\r\n // Use the new hierarchical approach\r\n const nestedHierarchy = buildNestedArrayHierarchy(fieldDefinitions);\r\n\r\n // Convert to legacy format for backward compatibility\r\n // Only include top-level arrays to avoid duplicates\r\n const arrayBatches = new Map<string, ArrayBatchInfo>();\r\n\r\n for (const [arrayPath, nestedInfo] of nestedHierarchy) {\r\n // Only include top-level arrays (no parent)\r\n if (!nestedInfo.parentPath) {\r\n // Collect ALL validators from the entire hierarchy tree (parent + all children)\r\n const allValidatorPaths = collectAllValidatorPaths(nestedInfo, nestedHierarchy);\r\n \r\n // Convert NestedArrayBatchInfo to ArrayBatchInfo\r\n const legacyBatchInfo: ArrayBatchInfo = {\r\n arrayPath: nestedInfo.arrayPath,\r\n elementFields: nestedInfo.elementFields,\r\n fullFieldPaths: allValidatorPaths, // Include all validators from hierarchy\r\n validators: nestedInfo.validators,\r\n accessors: nestedInfo.accessors,\r\n // Store the nested info for enhanced processing\r\n _nestedInfo: nestedInfo,\r\n };\r\n\r\n arrayBatches.set(arrayPath, legacyBatchInfo);\r\n }\r\n }\r\n\r\n return arrayBatches;\r\n}\r\n\r\n/**\r\n * Recursively collect all validator paths from nested array hierarchy\r\n */\r\nfunction collectAllValidatorPaths(\r\n rootInfo: NestedArrayBatchInfo,\r\n hierarchy: Map<string, NestedArrayBatchInfo>\r\n): string[] {\r\n const allPaths: string[] = [];\r\n \r\n // Add this level's validator paths\r\n allPaths.push(...rootInfo.fullFieldPaths);\r\n \r\n // Recursively add child validator paths\r\n for (const [childKey, childInfo] of rootInfo.childArrays) {\r\n const childPaths = collectAllValidatorPaths(childInfo, hierarchy);\r\n allPaths.push(...childPaths);\r\n }\r\n \r\n return allPaths;\r\n}\r\n\r\n// This function is no longer needed since we now use explicit isArrayField marking\r\n// instead of heuristic-based detection\r\n\r\n/**\r\n * Field definition with array information\r\n */\r\ninterface FieldDefinitionWithArray {\r\n path: string;\r\n builderFunction?: (context: any) => any;\r\n inferredType?: string;\r\n isArrayField?: boolean;\r\n}\r\n\r\n/**\r\n * Analyze field paths to identify array batching opportunities\r\n * Now uses field definitions with array field information\r\n */\r\nexport function analyzeArrayBatching(\r\n fieldDefinitions: FieldDefinitionWithArray[]\r\n): Map<string, ArrayBatchInfo> {\r\n // Use the new approach based on explicit isArrayField marking\r\n return findNestedArrays(fieldDefinitions);\r\n}\r\n\r\n/**\r\n * Create optimized batch validator for array processing\r\n */\r\nexport function createArrayBatchValidator(\r\n batchInfo: ArrayBatchInfo,\r\n fieldValidators: Map<string, any>\r\n): (\r\n arrayData: any[],\r\n rootData: any,\r\n abortEarly: boolean,\r\n abortEarlyOnEachField: boolean,\r\n mode?: ValidationMode\r\n) => {\r\n errors: Array<{\r\n path: string;\r\n code: string;\r\n message: string;\r\n paths: () => string[];\r\n }>;\r\n transformedData?: any[];\r\n} {\r\n // Check if we have enhanced nested info\r\n if (batchInfo._nestedInfo) {\r\n // CRITICAL FIX: Pre-populate the nested info validators with all collected validators\r\n // The _nestedInfo.fullFieldPaths only contains direct fields, but we need ALL validators\r\n // including those from child arrays (collected in batchInfo.fullFieldPaths)\r\n for (const fullPath of batchInfo.fullFieldPaths) {\r\n const validator = fieldValidators.get(fullPath);\r\n if (validator) {\r\n batchInfo._nestedInfo.validators.set(fullPath, validator);\r\n }\r\n }\r\n \r\n // Use the new nested array processor\r\n const nestedValidator = createNestedArrayValidator(\r\n batchInfo._nestedInfo,\r\n fieldValidators\r\n );\r\n\r\n return function enhancedBatchProcess(\r\n arrayData: any[],\r\n rootData: any,\r\n abortEarly: boolean,\r\n abortEarlyOnEachField: boolean = true,\r\n mode: ValidationMode = VALIDATE_MODE\r\n ): {\r\n errors: Array<{\r\n path: string;\r\n code: string;\r\n message: string;\r\n paths: () => string[];\r\n }>;\r\n transformedData?: any[];\r\n } {\r\n const result = nestedValidator(\r\n arrayData,\r\n rootData,\r\n abortEarly,\r\n abortEarlyOnEachField,\r\n mode\r\n );\r\n\r\n return {\r\n errors: result.errors,\r\n transformedData: result.transformedData,\r\n };\r\n };\r\n }\r\n\r\n // Fall back to legacy processing for backwards compatibility\r\n // Populate validators map\r\n for (const fullPath of batchInfo.fullFieldPaths) {\r\n const validator = fieldValidators.get(fullPath);\r\n if (validator) {\r\n batchInfo.validators.set(fullPath, validator);\r\n }\r\n }\r\n\r\n return function legacyBatchProcess(\r\n arrayData: any[],\r\n rootData: any,\r\n abortEarly: boolean,\r\n abortEarlyOnEachField: boolean = true,\r\n mode: ValidationMode = VALIDATE_MODE\r\n ): {\r\n errors: Array<{\r\n path: string;\r\n code: string;\r\n message: string;\r\n paths: () => string[];\r\n }>;\r\n transformedData?: any[];\r\n } {\r\n // For array element validation, we want to check all fields of each element\r\n // Override abortEarlyOnEachField to false for array batch processing\r\n const effectiveAbortEarlyOnEachField = false;\r\n\r\n // Use optimized multi-dimensional validator if available\r\n if (batchInfo.optimizedValidator && (batchInfo.arrayStructure?.depth ?? 0) > 1) {\r\n const result = batchInfo.optimizedValidator(arrayData, rootData, {\r\n abortEarly,\r\n abortEarlyOnEachField,\r\n mode,\r\n });\r\n return {\r\n errors: result.errors,\r\n transformedData: result.transformedData,\r\n };\r\n }\r\n\r\n // Fall back to traditional single-level array processing\r\n const errors: Array<{\r\n path: string;\r\n code: string;\r\n message: string;\r\n paths: () => string[];\r\n }> = [];\r\n\r\n if (!Array.isArray(arrayData)) {\r\n return { errors }; // Not an array, skip\r\n }\r\n\r\n // Skip element validation if array is empty\r\n // Only the array-level validators (like minLength) should run\r\n if (arrayData.length === 0) {\r\n return { errors };\r\n }\r\n\r\n const transformedArray = mode === PARSE_MODE ? [...arrayData] : undefined;\r\n\r\n // Process each array element\r\n for (\r\n let elementIndex = 0;\r\n elementIndex < arrayData.length;\r\n elementIndex++\r\n ) {\r\n const element = arrayData[elementIndex];\r\n let transformedElement = mode === PARSE_MODE ? { ...element } : undefined;\r\n let elementHasError = false;\r\n\r\n // Validate all element properties in batch\r\n for (const elementField of batchInfo.elementFields) {\r\n const fullFieldPath = `${batchInfo.arrayPath}.${elementField}`;\r\n const validator = batchInfo.validators.get(fullFieldPath);\r\n\r\n if (!validator) {\r\n continue;\r\n }\r\n\r\n // Use pre-compiled accessor\r\n const accessor = batchInfo.accessors.get(elementField);\r\n const elementValue = accessor\r\n ? accessor(transformedElement || element)\r\n : undefined;\r\n const elementPath = `${batchInfo.arrayPath}[${elementIndex}].${elementField}`;\r\n\r\n // V8 optimization: Use unified validator interface directly\r\n let result: any;\r\n if (mode === VALIDATE_MODE) {\r\n // Unified validators always have validate method\r\n result = validator.validate(elementValue, rootData, {\r\n abortEarlyOnEachField: effectiveAbortEarlyOnEachField,\r\n });\r\n } else if (mode === PARSE_MODE) {\r\n // Unified validators always have parse method\r\n result = validator.parse(elementValue, rootData, {\r\n abortEarlyOnEachField: effectiveAbortEarlyOnEachField,\r\n });\r\n } else {\r\n continue;\r\n }\r\n\r\n if (!result.isValid()) {\r\n elementHasError = true;\r\n if (result.errors && result.errors.length > 0) {\r\n for (const error of result.errors) {\r\n errors.push({\r\n path: elementPath,\r\n code:\r\n error.code ||\r\n (mode === PARSE_MODE ? \"PARSE_ERROR\" : \"VALIDATION_ERROR\"),\r\n message:\r\n error.message ||\r\n (mode === PARSE_MODE ? \"Parse failed\" : \"Validation failed\"),\r\n paths: () => [elementPath],\r\n });\r\n }\r\n } else {\r\n errors.push({\r\n path: elementPath,\r\n code: mode === PARSE_MODE ? \"PARSE_ERROR\" : \"VALIDATION_ERROR\",\r\n message:\r\n mode === PARSE_MODE ? \"Parse failed\" : \"Validation failed\",\r\n paths: () => [elementPath],\r\n });\r\n }\r\n\r\n // Only abort if abortEarlyOnEachField is true\r\n // This allows us to validate all fields of the current element\r\n if (effectiveAbortEarlyOnEachField) {\r\n break; // Break inner loop, but continue with next element\r\n }\r\n } else if (\r\n mode === PARSE_MODE &&\r\n result.data !== undefined &&\r\n transformedElement\r\n ) {\r\n // Apply transformation using pre-compiled setter\r\n setNestedValue(transformedElement, elementField, result.data);\r\n }\r\n }\r\n\r\n if (mode === PARSE_MODE && transformedArray && transformedElement) {\r\n transformedArray[elementIndex] = transformedElement;\r\n }\r\n\r\n // If we found errors in this element and abortEarly is true, stop processing more elements\r\n if (elementHasError && abortEarly) {\r\n return { errors, transformedData: transformedArray };\r\n }\r\n }\r\n\r\n return { errors, transformedData: transformedArray };\r\n };\r\n}\r\n\r\n/**\r\n * Set nested value using field-accessor utility\r\n */\r\nfunction setNestedValue(obj: any, path: string, value: any): void {\r\n const setter = createFieldSetter(path);\r\n setter(obj, value);\r\n}\r\n", "/**\r\n * Optimized Field Accessor Utilities\r\n * \r\n * High-performance field access with:\r\n * - Pre-split path segments cached at build time\r\n * - No runtime string splitting\r\n * - Direct property access for common depths\r\n * - Minimal object allocations\r\n */\r\n\r\nimport { DOT } from \"../../../constants\";\r\n\r\n// NOTE: Global caches removed to prevent memory leaks in server environments\r\n// Validators should pre-compile accessors at build time and store them locally\r\n\r\n/**\r\n * Get or cache path segments to avoid runtime splitting\r\n */\r\nexport function getPathSegments(fieldPath: string): readonly string[] {\r\n // Direct computation without caching\r\n return Object.freeze(fieldPath.split(DOT));\r\n}\r\n\r\n/**\r\n * Create optimized accessor function for a nested field path\r\n * V8 Optimization: Generate direct property access code for common depths\r\n */\r\nexport function createAccessor(pathSegments: readonly string[]): (obj: any) => any {\r\n const length = pathSegments.length;\r\n \r\n // Direct returns for common cases\r\n switch (length) {\r\n case 0:\r\n return (obj) => obj;\r\n case 1:\r\n const key0 = pathSegments[0];\r\n return (obj) => obj?.[key0];\r\n case 2:\r\n const key1 = pathSegments[0];\r\n const key2 = pathSegments[1];\r\n return (obj) => obj?.[key1]?.[key2];\r\n case 3:\r\n const k1 = pathSegments[0];\r\n const k2 = pathSegments[1];\r\n const k3 = pathSegments[2];\r\n return (obj) => obj?.[k1]?.[k2]?.[k3];\r\n case 4:\r\n const k4_1 = pathSegments[0];\r\n const k4_2 = pathSegments[1];\r\n const k4_3 = pathSegments[2];\r\n const k4_4 = pathSegments[3];\r\n return (obj) => obj?.[k4_1]?.[k4_2]?.[k4_3]?.[k4_4];\r\n case 5:\r\n const k5_1 = pathSegments[0];\r\n const k5_2 = pathSegments[1];\r\n const k5_3 = pathSegments[2];\r\n const k5_4 = pathSegments[3];\r\n const k5_5 = pathSegments[4];\r\n return (obj) => obj?.[k5_1]?.[k5_2]?.[k5_3]?.[k5_4]?.[k5_5];\r\n default:\r\n // For deeper paths, use optimized loop\r\n return (obj) => {\r\n let result = obj;\r\n for (let i = 0; i < length; i++) {\r\n result = result?.[pathSegments[i]];\r\n if (result === undefined) return undefined;\r\n }\r\n return result;\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Create accessor from dot-notation field path with caching\r\n */\r\nexport function createFieldAccessor(fieldPath: string): (obj: any) => any {\r\n // Direct creation without caching\r\n const segments = getPathSegments(fieldPath);\r\n return createAccessor(segments);\r\n}\r\n\r\n/**\r\n * Batch create accessors for multiple field paths\r\n * Pre-allocates array for better performance\r\n */\r\nexport function createBatchAccessors(fieldPaths: readonly string[]): Array<{\r\n fieldName: string;\r\n accessor: (obj: any) => any;\r\n}> {\r\n const length = fieldPaths.length;\r\n const result = new Array(length);\r\n \r\n for (let i = 0; i < length; i++) {\r\n const fieldPath = fieldPaths[i];\r\n result[i] = {\r\n fieldName: fieldPath,\r\n accessor: createFieldAccessor(fieldPath)\r\n };\r\n }\r\n \r\n return result;\r\n}\r\n\r\n/**\r\n * Create field setter with caching\r\n * V8 Optimization: Direct property assignment for common depths\r\n */\r\nexport function createFieldSetter(fieldPath: string): (obj: any, value: any) => void {\r\n // Direct creation without caching\r\n const segments = getPathSegments(fieldPath);\r\n const length = segments.length;\r\n \r\n let setter: (obj: any, value: any) => void;\r\n \r\n switch (length) {\r\n case 1:\r\n const key = segments[0];\r\n setter = (obj, value) => {\r\n obj[key] = value;\r\n };\r\n break;\r\n case 2:\r\n const k1 = segments[0];\r\n const k2 = segments[1];\r\n setter = (obj, value) => {\r\n if (!obj[k1]) obj[k1] = {};\r\n obj[k1][k2] = value;\r\n };\r\n break;\r\n case 3:\r\n const k3_1 = segments[0];\r\n const k3_2 = segments[1];\r\n const k3_3 = segments[2];\r\n setter = (obj, value) => {\r\n if (!obj[k3_1]) obj[k3_1] = {};\r\n if (!obj[k3_1][k3_2]) obj[k3_1][k3_2] = {};\r\n obj[k3_1][k3_2][k3_3] = value;\r\n };\r\n break;\r\n default:\r\n // For deeper paths\r\n setter = (obj, value) => {\r\n let current = obj;\r\n for (let i = 0; i < length - 1; i++) {\r\n const key = segments[i];\r\n if (!current[key]) current[key] = {};\r\n current = current[key];\r\n }\r\n current[segments[length - 1]] = value;\r\n };\r\n }\r\n \r\n return setter;\r\n}\r\n\r\n/**\r\n * Optimized nested value accessor with array support\r\n * Pre-compiles access patterns for better performance\r\n */\r\nexport function createNestedValueAccessor(\r\n fieldPath: string\r\n): (obj: Record<string, unknown>) => unknown {\r\n // Fast path for simple property access\r\n if (!fieldPath.includes(DOT)) {\r\n return (obj) => obj[fieldPath];\r\n }\r\n\r\n const segments = getPathSegments(fieldPath);\r\n const length = segments.length;\r\n\r\n // Fast path for two-level access\r\n if (length === 2) {\r\n const key1 = segments[0];\r\n const key2 = segments[1];\r\n return (obj) => {\r\n const firstValue = obj[key1];\r\n\r\n // Array element validation case\r\n if (Array.isArray(firstValue)) {\r\n return firstValue;\r\n }\r\n\r\n // Standard nested access\r\n return firstValue != null && typeof firstValue === \"object\"\r\n ? (firstValue as Record<string, unknown>)[key2]\r\n : undefined;\r\n };\r\n }\r\n\r\n // Pre-compile for general case\r\n return (obj) => {\r\n let current = obj;\r\n for (let i = 0; i < length; i++) {\r\n if (current == null || typeof current !== \"object\") {\r\n return undefined;\r\n }\r\n\r\n const part = segments[i];\r\n const value = (current as Record<string, unknown>)[part];\r\n\r\n // Check if this is an array that needs element validation\r\n if (Array.isArray(value) && i < length - 1) {\r\n // Pre-compiled remaining path access\r\n const remainingSegments = segments.slice(i + 1);\r\n const remainingLength = remainingSegments.length;\r\n \r\n const elementValues = value.map(element => {\r\n if (element == null || typeof element !== \"object\") {\r\n return undefined;\r\n }\r\n \r\n // Fast path for single property\r\n if (remainingLength === 1) {\r\n return (element as Record<string, unknown>)[remainingSegments[0]];\r\n }\r\n \r\n // Multiple properties\r\n let elementCurrent = element;\r\n for (let j = 0; j < remainingLength; j++) {\r\n if (elementCurrent == null || typeof elementCurrent !== \"object\") {\r\n return undefined;\r\n }\r\n elementCurrent = (elementCurrent as Record<string, unknown>)[remainingSegments[j]];\r\n }\r\n \r\n return elementCurrent;\r\n });\r\n \r\n // Return special array marker for validation system\r\n const arrayPath = segments.slice(0, i + 1).join(DOT);\r\n return { __isArrayElementField: true, values: elementValues, arrayPath };\r\n }\r\n\r\n current = value as Record<string, unknown>;\r\n }\r\n\r\n return current;\r\n };\r\n}\r\n\r\n/**\r\n * Pre-warm the cache with common field paths\r\n * @deprecated Caches have been removed to prevent memory leaks\r\n */\r\nexport function prewarmCache(commonPaths: string[]): void {\r\n // No-op: caches have been removed\r\n // Validators should pre-compile accessors at build time\r\n}\r\n\r\n/**\r\n * Clear all caches (useful for testing)\r\n * @deprecated Caches have been removed to prevent memory leaks\r\n */\r\nexport function clearAllCaches(): void {\r\n // No-op: caches have been removed\r\n}", "/**\r\n * Raw validator interface that completely bypasses Result wrapper\r\n * For maximum performance (1M+ ops/sec)\r\n */\r\n\r\nimport { UnifiedValidator } from \"../optimization/unified-validator\";\r\nimport { Result } from \"../../types/result\";\r\nimport { ValidationOptions, ParseOptions } from \"./plugins/plugin-types\";\r\nimport {\r\n createFieldAccessor,\r\n createFieldSetter,\r\n} from \"../plugin/utils/field-accessor-optimized\";\r\n\r\nexport interface RawParseResult<T> {\r\n valid: boolean;\r\n data?: T;\r\n error?: any;\r\n}\r\n\r\nexport interface RawValidator<T> {\r\n validateRaw(value: T, options?: ValidationOptions): boolean;\r\n parseRaw(value: T, options?: ParseOptions): RawParseResult<T>;\r\n // Compatibility methods that wrap with Result\r\n validate(value: T, options?: ValidationOptions): Result<T>;\r\n parse(value: T, options?: ParseOptions): Result<T>;\r\n}\r\n\r\n/**\r\n * Create raw validator that bypasses Result wrapper completely\r\n */\r\nexport function createRawValidator<T extends Record<string, any>>(\r\n validators: Map<string, UnifiedValidator>\r\n): RawValidator<T> {\r\n const entries = Array.from(validators);\r\n const count = entries.length;\r\n\r\n if (count === 0) {\r\n return {\r\n validateRaw: () => true,\r\n parseRaw: (value) => ({ valid: true, data: value }),\r\n validate: (value) => Result.ok(value),\r\n parse: (value) => Result.ok(value),\r\n };\r\n }\r\n\r\n if (count === 1) {\r\n // Single field - ultra optimized\r\n const [fieldPath, validator] = entries[0];\r\n const isSimplePath = !fieldPath.includes(\".\");\r\n\r\n // Pre-compile accessor and setter even for single field\r\n const accessor = isSimplePath ? null : createFieldAccessor(fieldPath);\r\n const setter = isSimplePath ? null : createFieldSetter(fieldPath);\r\n\r\n return {\r\n validateRaw: (value: T, options?: ValidationOptions) => {\r\n if (!value) return false;\r\n const fieldValue = isSimplePath\r\n ? (value as any)[fieldPath]\r\n : accessor!(value);\r\n const result = validator.validate(fieldValue, value, options);\r\n return result.valid;\r\n },\r\n\r\n parseRaw: (value: T, options?: ParseOptions) => {\r\n if (!value) return { valid: false, error: \"Value required\" };\r\n\r\n const fieldValue = isSimplePath\r\n ? (value as any)[fieldPath]\r\n : accessor!(value);\r\n const result = validator.parse(fieldValue, value, options);\r\n\r\n if (!result.valid) {\r\n return { valid: false, error: result.errors[0] };\r\n }\r\n\r\n if (result.data !== undefined && result.data !== fieldValue) {\r\n // Always create new object for immutability\r\n const transformed = { ...value };\r\n if (isSimplePath) {\r\n (transformed as any)[fieldPath] = result.data;\r\n } else {\r\n setter!(transformed, result.data);\r\n }\r\n return { valid: true, data: transformed };\r\n }\r\n\r\n return { valid: true, data: value };\r\n },\r\n\r\n validate: (value: T, options?: ValidationOptions) => {\r\n if (!value)\r\n return Result.error([\r\n {\r\n path: \"\",\r\n message: \"Value required\",\r\n code: \"REQUIRED\",\r\n paths: () => [\"\"],\r\n },\r\n ]);\r\n\r\n const fieldValue = isSimplePath\r\n ? (value as any)[fieldPath]\r\n : accessor!(value);\r\n const result = validator.validate(fieldValue, value, options);\r\n\r\n if (!result.valid) {\r\n const errors = result.errors.map((e) => ({\r\n path: e.path,\r\n code: e.code,\r\n message: e.message,\r\n paths: () => [e.path],\r\n }));\r\n return Result.error(errors);\r\n }\r\n\r\n return Result.ok(value);\r\n },\r\n\r\n parse: function (value: T, options?: ParseOptions): Result<T> {\r\n const rawResult = this.parseRaw(value, options);\r\n if (!rawResult.valid) {\r\n return Result.error([rawResult.error]);\r\n }\r\n return Result.ok(rawResult.data);\r\n },\r\n };\r\n }\r\n\r\n // Multiple fields\r\n if (count <= 3) {\r\n // Optimize for 2-3 fields\r\n return createOptimizedMultiFieldRawValidator<T>(entries);\r\n }\r\n\r\n // General case\r\n return createGeneralRawValidator<T>(entries);\r\n}\r\n\r\n/**\r\n * Optimized validator for 2-3 fields\r\n */\r\nfunction createOptimizedMultiFieldRawValidator<T>(\r\n entries: Array<[string, UnifiedValidator]>\r\n): RawValidator<T> {\r\n // Pre-compute accessors AND setters during validator creation (build-time)\r\n const fields = entries.map(([path, validator]) => ({\r\n path,\r\n isSimple: !path.includes(\".\"),\r\n accessor: !path.includes(\".\") ? null : createFieldAccessor(path), // Pre-computed accessor\r\n setter: !path.includes(\".\") ? null : createFieldSetter(path), // Pre-computed setter\r\n validator,\r\n }));\r\n\r\n // Sort fields: simple paths first for better early exit opportunities\r\n fields.sort((a, b) => {\r\n if (a.isSimple && !b.isSimple) return -1;\r\n if (!a.isSimple && b.isSimple) return 1;\r\n return 0;\r\n });\r\n\r\n return {\r\n validateRaw: (value: T) => {\r\n if (!value) return false;\r\n\r\n // Manually unrolled for 2-3 fields for maximum performance\r\n if (fields.length === 2) {\r\n const field0 = fields[0];\r\n const field1 = fields[1];\r\n\r\n const value0 = field0.isSimple\r\n ? (value as any)[field0.path]\r\n : field0.accessor!(value);\r\n if (!field0.validator.validate(value0, value).valid) return false;\r\n\r\n const value1 = field1.isSimple\r\n ? (value as any)[field1.path]\r\n : field1.accessor!(value);\r\n if (!field1.validator.validate(value1, value).valid) return false;\r\n\r\n return true;\r\n } else if (fields.length === 3) {\r\n const field0 = fields[0];\r\n const field1 = fields[1];\r\n const field2 = fields[2];\r\n\r\n const value0 = field0.isSimple\r\n ? (value as any)[field0.path]\r\n : field0.accessor!(value);\r\n if (!field0.validator.validate(value0, value).valid) return false;\r\n\r\n const value1 = field1.isSimple\r\n ? (value as any)[field1.path]\r\n : field1.accessor!(value);\r\n if (!field1.validator.validate(value1, value).valid) return false;\r\n\r\n const value2 = field2.isSimple\r\n ? (value as any)[field2.path]\r\n : field2.accessor!(value);\r\n if (!field2.validator.validate(value2, value).valid) return false;\r\n\r\n return true;\r\n }\r\n\r\n // Fallback for edge cases - use traditional for loop\r\n const len = fields.length;\r\n for (let i = 0; i < len; i++) {\r\n const field = fields[i];\r\n const fieldValue = field.isSimple\r\n ? (value as any)[field.path]\r\n : field.accessor!(value);\r\n if (!field.validator.validate(fieldValue, value).valid) return false;\r\n }\r\n\r\n return true;\r\n },\r\n\r\n parseRaw: (value: T) => {\r\n if (!value) return { valid: false, error: \"Value required\" };\r\n\r\n let hasTransform = false;\r\n let transformed = value;\r\n\r\n // Manually unrolled for 2-3 fields for maximum performance\r\n if (fields.length === 2) {\r\n const field0 = fields[0];\r\n const field1 = fields[1];\r\n\r\n const value0 = field0.isSimple\r\n ? (transformed as any)[field0.path]\r\n : field0.accessor!(transformed);\r\n const result0 = field0.validator.parse(value0, transformed);\r\n if (!result0.valid) return { valid: false, error: result0.errors[0] };\r\n\r\n if (result0.data !== undefined && result0.data !== value0) {\r\n if (!hasTransform) {\r\n transformed = { ...value };\r\n hasTransform = true;\r\n }\r\n if (field0.isSimple) {\r\n (transformed as any)[field0.path] = result0.data;\r\n } else {\r\n field0.setter!(transformed, result0.data);\r\n }\r\n }\r\n\r\n const value1 = field1.isSimple\r\n ? (transformed as any)[field1.path]\r\n : field1.accessor!(transformed);\r\n const result1 = field1.validator.parse(value1, transformed);\r\n if (!result1.valid) return { valid: false, error: result1.errors[0] };\r\n\r\n if (result1.data !== undefined && result1.data !== value1) {\r\n if (!hasTransform) {\r\n transformed = { ...value };\r\n hasTransform = true;\r\n }\r\n if (field1.isSimple) {\r\n (transformed as any)[field1.path] = result1.data;\r\n } else {\r\n field1.setter!(transformed, result1.data);\r\n }\r\n }\r\n } else if (fields.length === 3) {\r\n const field0 = fields[0];\r\n const field1 = fields[1];\r\n const field2 = fields[2];\r\n\r\n const value0 = field0.isSimple\r\n ? (transformed as any)[field0.path]\r\n : field0.accessor!(transformed);\r\n const result0 = field0.validator.parse(value0, transformed);\r\n if (!result0.valid) return { valid: false, error: result0.errors[0] };\r\n\r\n if (result0.data !== undefined && result0.data !== value0) {\r\n if (!hasTransform) {\r\n transformed = { ...value };\r\n hasTransform = true;\r\n }\r\n if (field0.isSimple) {\r\n (transformed as any)[field0.path] = result0.data;\r\n } else {\r\n field0.setter!(transformed, result0.data);\r\n }\r\n }\r\n\r\n const value1 = field1.isSimple\r\n ? (transformed as any)[field1.path]\r\n : field1.accessor!(transformed);\r\n const result1 = field1.validator.parse(value1, transformed);\r\n if (!result1.valid) return { valid: false, error: result1.errors[0] };\r\n\r\n if (result1.data !== undefined && result1.data !== value1) {\r\n if (!hasTransform) {\r\n transformed = { ...value };\r\n hasTransform = true;\r\n }\r\n if (field1.isSimple) {\r\n (transformed as any)[field1.path] = result1.data;\r\n } else {\r\n field1.setter!(transformed, result1.data);\r\n }\r\n }\r\n\r\n const value2 = field2.isSimple\r\n ? (transformed as any)[field2.path]\r\n : field2.accessor!(transformed);\r\n const result2 = field2.validator.parse(value2, transformed);\r\n if (!result2.valid) return { valid: false, error: result2.errors[0] };\r\n\r\n if (result2.data !== undefined && result2.data !== value2) {\r\n if (!hasTransform) {\r\n transformed = { ...value };\r\n hasTransform = true;\r\n }\r\n if (field2.isSimple) {\r\n (transformed as any)[field2.path] = result2.data;\r\n } else {\r\n field2.setter!(transformed, result2.data);\r\n }\r\n }\r\n } else {\r\n // Fallback for edge cases - use traditional for loop\r\n const len = fields.length;\r\n for (let i = 0; i < len; i++) {\r\n const field = fields[i];\r\n const fieldValue = field.isSimple\r\n ? (transformed as any)[field.path]\r\n : field.accessor!(transformed);\r\n\r\n const result = field.validator.parse(fieldValue, transformed);\r\n\r\n if (!result.valid) {\r\n return { valid: false, error: result.errors[0] };\r\n }\r\n\r\n if (result.data !== undefined && result.data !== fieldValue) {\r\n if (!hasTransform) {\r\n transformed = { ...value };\r\n hasTransform = true;\r\n }\r\n\r\n if (field.isSimple) {\r\n (transformed as any)[field.path] = result.data;\r\n } else {\r\n field.setter!(transformed, result.data);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return { valid: true, data: transformed };\r\n },\r\n\r\n validate: function (value: T) {\r\n if (!this.validateRaw(value)) {\r\n // Simplified error for speed\r\n return Result.error([\r\n {\r\n path: \"\",\r\n code: \"VALIDATION_ERROR\",\r\n message: \"Validation failed\",\r\n paths: () => [\"\"],\r\n },\r\n ]);\r\n }\r\n return Result.ok(value);\r\n },\r\n\r\n parse: function (value: T) {\r\n const rawResult = this.parseRaw(value);\r\n if (!rawResult.valid) {\r\n return Result.error([rawResult.error]);\r\n }\r\n return Result.ok(rawResult.data!);\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * General validator for many fields\r\n */\r\nfunction createGeneralRawValidator<T>(\r\n entries: Array<[string, UnifiedValidator]>\r\n): RawValidator<T> {\r\n // Pre-compute accessors AND setters during validator creation (build-time)\r\n const fields = entries.map(([path, validator]) => ({\r\n path,\r\n isSimple: !path.includes(\".\"),\r\n accessor: !path.includes(\".\") ? null : createFieldAccessor(path), // Pre-computed accessor\r\n setter: !path.includes(\".\") ? null : createFieldSetter(path), // Pre-computed setter\r\n validator,\r\n }));\r\n\r\n // Sort fields: simple paths first for better cache locality and early exits\r\n fields.sort((a, b) => {\r\n if (a.isSimple && !b.isSimple) return -1;\r\n if (!a.isSimple && b.isSimple) return 1;\r\n return 0;\r\n });\r\n\r\n return {\r\n validateRaw: (value: T) => {\r\n if (!value) return false;\r\n\r\n // Traditional for loop is faster than for...of in V8\r\n const len = fields.length;\r\n for (let i = 0; i < len; i++) {\r\n const field = fields[i];\r\n const fieldValue = field.isSimple\r\n ? (value as any)[field.path]\r\n : field.accessor!(value);\r\n const result = field.validator.validate(fieldValue, value);\r\n if (!result.valid) return false;\r\n }\r\n\r\n return true;\r\n },\r\n\r\n parseRaw: (value: T) => {\r\n if (!value) return { valid: false, error: \"Value required\" };\r\n\r\n let transformed = value;\r\n let hasTransform = false;\r\n\r\n // Traditional for loop is faster than for...of in V8\r\n const len = fields.length;\r\n for (let i = 0; i < len; i++) {\r\n const field = fields[i];\r\n const fieldValue = field.isSimple\r\n ? (transformed as any)[field.path]\r\n : field.accessor!(transformed);\r\n const result = field.validator.parse(fieldValue, transformed);\r\n\r\n if (!result.valid) {\r\n return { valid: false, error: result.errors[0] };\r\n }\r\n\r\n if (result.data !== undefined && result.data !== fieldValue) {\r\n if (!hasTransform) {\r\n transformed = { ...value };\r\n hasTransform = true;\r\n }\r\n\r\n if (field.isSimple) {\r\n (transformed as any)[field.path] = result.data;\r\n } else {\r\n field.setter!(transformed, result.data);\r\n }\r\n }\r\n }\r\n\r\n return { valid: true, data: transformed };\r\n },\r\n\r\n validate: function (value: T) {\r\n return this.validateRaw(value)\r\n ? Result.ok(value)\r\n : Result.error([\r\n {\r\n path: \"\",\r\n code: \"VALIDATION_ERROR\",\r\n message: \"Validation failed\",\r\n paths: () => [\"\"],\r\n },\r\n ]);\r\n },\r\n\r\n parse: function (value: T) {\r\n const rawResult = this.parseRaw(value);\r\n return rawResult.valid\r\n ? Result.ok(rawResult.data!)\r\n : Result.error([rawResult.error]);\r\n },\r\n };\r\n}\r\n", "/**\r\n * Validator Factory - Separated validator construction responsibility\r\n * Responsible for generating performance-optimized validators\r\n */\r\n\r\nimport { NestedKeyOf, TypeOfPath } from \"../../types/util\";\r\nimport { Result } from \"../../types/result\";\r\nimport { applyDefault } from \"../builder/types/field-options\";\r\nimport { createFieldContext } from \"./context/field-context\";\r\nimport type {\r\n FieldBuilderContext,\r\n ApplyFieldTransforms as ApplyNestedTransforms,\r\n FieldValidator,\r\n TransformAwareValidator,\r\n ParseOptions,\r\n ValidationOptions,\r\n ValidationResult,\r\n} from \"./plugins/plugin-types\";\r\nimport {\r\n selectOptimalStrategies,\r\n groupByStrategy,\r\n} from \"../optimization/execution-strategy-selector\";\r\nimport {\r\n createUnifiedValidator,\r\n UnifiedValidator,\r\n} from \"../optimization/unified-validator\";\r\nimport {\r\n createNestedValueAccessor,\r\n createFieldExistenceChecker,\r\n parseFieldPath,\r\n createArrayElementAccessor,\r\n} from \"../plugin/utils/field-accessor\";\r\n\r\n// Note: Accessor cache is now managed locally within each validator factory to avoid memory leaks\r\nimport {\r\n DOT,\r\n ValidationMode,\r\n VALIDATE_MODE,\r\n PARSE_MODE,\r\n} from \"../../constants\";\r\nimport {\r\n analyzeArrayBatching,\r\n createArrayBatchValidator,\r\n ArrayBatchInfo,\r\n} from \"./array-batch-optimizer\";\r\nimport { ArrayStructureInfo } from \"../../types/array-type-analysis\";\r\nimport {\r\n createUltraFastSingleFieldValidator,\r\n createUltraFastMultiFieldValidator,\r\n} from \"./ultra-fast-validator\";\r\nimport { createRawValidator } from \"./raw-validator\";\r\n\r\n// Pre-allocated objects for performance\r\nconst EMPTY_ERRORS: any[] = [];\r\nconst VALID_RESPONSE = Object.freeze({\r\n valid: true,\r\n value: null,\r\n errors: EMPTY_ERRORS,\r\n});\r\n\r\n/**\r\n * Field definition interface\r\n */\r\nexport interface FieldDefinition {\r\n path: string;\r\n builderFunction?: (context: FieldBuilderContext<any, any, any>) => any;\r\n rules?: any[]; // For pre-built validators\r\n metadata?: {\r\n inferredType?: string;\r\n hasTransforms?: boolean;\r\n fieldOptions?: import(\"../builder/types/field-options\").FieldOptions<any>;\r\n };\r\n fieldType?: string;\r\n isArrayField?: boolean; // Indicates if this field was declared with b.array\r\n arrayStructure?: ArrayStructureInfo; // Build-time analyzed array structure for multi-dimensional arrays\r\n isOptional?: boolean; // Indicates if this field was marked as optional\r\n}\r\n\r\n/**\r\n * ValidatorFactory - Responsible for building high-performance validators\r\n */\r\nexport function createValidatorFactory<TObject extends object, TMap = {}>(\r\n plugins: Record<string, any>\r\n) {\r\n /**\r\n * Build optimized validator\r\n */\r\n function buildOptimizedValidator(\r\n fieldDefinitions: Array<FieldDefinition>\r\n ): TransformAwareValidator<TObject, ApplyNestedTransforms<TObject, TMap>> {\r\n if (fieldDefinitions.length === 0) {\r\n return buildEmptyValidator<TObject, TMap>(plugins);\r\n }\r\n\r\n // Convert field definitions to the format expected by selectOptimalStrategies\r\n const fieldsWithBuilders = fieldDefinitions.map((def) => {\r\n // Detect if field is optional or has required plugin by building it and checking validators\r\n let isOptional = false;\r\n let hasRequired = false;\r\n if (def.builderFunction) {\r\n try {\r\n const context = createFieldContext(def.path, plugins);\r\n const built = def.builderFunction(context);\r\n if (built?._validators) {\r\n isOptional = built._validators.some(\r\n (v: any) => v.name === \"optional\"\r\n );\r\n hasRequired = built._validators.some(\r\n (v: any) => v.name === \"required\"\r\n );\r\n }\r\n } catch (e) {\r\n // If building fails, assume not optional and no required\r\n isOptional = false;\r\n hasRequired = false;\r\n }\r\n }\r\n\r\n return {\r\n path: def.path,\r\n builderFunction:\r\n def.builderFunction ||\r\n (() => {\r\n // Fallback for field definitions using the object form\r\n throw new Error(`Field ${def.path} uses object definition form`);\r\n }),\r\n isOptional: isOptional,\r\n hasRequired: hasRequired,\r\n };\r\n });\r\n\r\n // Determine execution strategy for each field at build time\r\n const executionStrategies = selectOptimalStrategies(\r\n fieldsWithBuilders,\r\n plugins\r\n );\r\n\r\n // Group fields by strategy\r\n const { fastFields, slowFields } = groupByStrategy(executionStrategies);\r\n\r\n // OPTIMIZATION: Analyze array batching opportunities\r\n // Pass field definitions with array field information\r\n const arrayBatches = analyzeArrayBatching(fieldDefinitions);\r\n\r\n // Remove array batch fields from regular processing\r\n const batchFieldPaths = new Set<string>();\r\n const enhancedArrayBatches = new Map<string, any>();\r\n const legacyArrayBatches = new Map<string, any>();\r\n\r\n for (const [arrayPath, batchInfo] of arrayBatches) {\r\n if (batchInfo._nestedInfo) {\r\n // Use enhanced nested array processing\r\n enhancedArrayBatches.set(arrayPath, batchInfo);\r\n // Remove ALL related fields from regular processing to avoid duplicates\r\n for (const fieldPath of batchInfo.fullFieldPaths) {\r\n batchFieldPaths.add(fieldPath);\r\n }\r\n // Also add the array path itself\r\n batchFieldPaths.add(arrayPath);\r\n } else {\r\n // Use legacy processing\r\n legacyArrayBatches.set(arrayPath, batchInfo);\r\n for (const fieldPath of batchInfo.fullFieldPaths) {\r\n batchFieldPaths.add(fieldPath);\r\n }\r\n }\r\n }\r\n\r\n const regularFastFields = fastFields.filter(\r\n (fp) => !batchFieldPaths.has(fp)\r\n );\r\n const regularSlowFields = slowFields.filter(\r\n (fp) => !batchFieldPaths.has(fp)\r\n );\r\n\r\n // Build unified validators for regular fields (excluding batched fields)\r\n // V8 optimization: Fast/Slow integration completed\r\n const slowValidators = buildUnifiedValidators(\r\n regularSlowFields,\r\n fieldDefinitions.filter((fd) => !batchFieldPaths.has(fd.path)),\r\n plugins\r\n );\r\n\r\n const fastValidators = buildUnifiedValidators(\r\n regularFastFields,\r\n fieldDefinitions.filter((fd) => !batchFieldPaths.has(fd.path)),\r\n plugins\r\n );\r\n\r\n // Build validators for all fields (needed for batch processing)\r\n const allValidators = new Map<string, any>();\r\n\r\n // Add all validators (unified)\r\n // Include ALL field paths, not just those in fast/slow fields\r\n const allFieldPaths = fieldDefinitions.map((fd) => fd.path);\r\n const allUnifiedValidators = buildUnifiedValidators(\r\n allFieldPaths,\r\n fieldDefinitions,\r\n plugins\r\n );\r\n for (const [path, validator] of allUnifiedValidators) {\r\n allValidators.set(path, validator);\r\n }\r\n\r\n // Create optional and required fields maps for executor\r\n const optionalFields = new Map<string, boolean>();\r\n const requiredFields = new Map<string, boolean>();\r\n const fieldOptionsMap = new Map<\r\n string,\r\n import(\"../builder/types/field-options\").FieldOptions\r\n >();\r\n\r\n for (const field of fieldsWithBuilders) {\r\n if (field.isOptional) {\r\n optionalFields.set(field.path, true);\r\n }\r\n if (field.hasRequired) {\r\n requiredFields.set(field.path, true);\r\n }\r\n }\r\n\r\n // Extract field options from fieldDefinitions\r\n for (const fieldDef of fieldDefinitions) {\r\n if (fieldDef.metadata?.fieldOptions) {\r\n fieldOptionsMap.set(fieldDef.path, fieldDef.metadata.fieldOptions);\r\n }\r\n }\r\n\r\n // Update fast and slow validators with corrected array element recursive validators from allValidators\r\n for (const [path, validator] of allValidators) {\r\n if (path.includes(\"[*]\")) {\r\n // If this is an array element validator, update it in fast/slow maps\r\n if (fastValidators.has(path)) {\r\n fastValidators.set(path, validator);\r\n }\r\n if (slowValidators.has(path)) {\r\n slowValidators.set(path, validator);\r\n }\r\n }\r\n }\r\n\r\n return createExecutorValidator<TObject, TMap>(\r\n slowValidators,\r\n fastValidators,\r\n fieldDefinitions,\r\n plugins,\r\n enhancedArrayBatches,\r\n allValidators,\r\n optionalFields,\r\n requiredFields,\r\n fieldOptionsMap\r\n );\r\n }\r\n\r\n return {\r\n buildOptimizedValidator,\r\n };\r\n}\r\n\r\n/**\r\n * Build empty validator\r\n */\r\nfunction buildEmptyValidator<TObject extends object, TMap = {}>(\r\n plugins: Record<string, any>\r\n): TransformAwareValidator<TObject, ApplyNestedTransforms<TObject, TMap>> {\r\n const pickValidator = createPickValidatorFactory<TObject>([], plugins);\r\n\r\n return {\r\n validate: (): Result<TObject> => Result.ok({} as TObject),\r\n parse: (\r\n value: Partial<TObject> | unknown,\r\n options?: ParseOptions\r\n ): Result<ApplyNestedTransforms<TObject, TMap>> =>\r\n Result.ok(value as ApplyNestedTransforms<TObject, TMap>),\r\n pick: <K extends NestedKeyOf<TObject>>(\r\n key: K\r\n ): FieldValidator<TObject, TypeOfPath<TObject, K>> => {\r\n return pickValidator.createPickedValidator(key);\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Build unified validators (V8 optimized, Fast/Slow integration)\r\n */\r\nfunction buildUnifiedValidators(\r\n fields: string[],\r\n fieldDefinitions: Array<FieldDefinition>,\r\n plugins: Record<string, any>\r\n): Map<string, UnifiedValidator> {\r\n const validators = new Map<string, UnifiedValidator>();\r\n const recursiveFieldsMap = new Map<\r\n string,\r\n { targetFieldPath: string; maxDepth: number }\r\n >();\r\n const arrayElementRecursiveFields = new Map<\r\n string,\r\n { targetFieldPath: string; maxDepth: number }\r\n >();\r\n\r\n // First pass: Build all validators and identify recursive fields\r\n for (const fieldPath of fields) {\r\n const fieldDef = fieldDefinitions.find((f) => f.path === fieldPath);\r\n\r\n if (fieldDef && fieldDef.builderFunction) {\r\n // Pre-compile field accessor for performance\r\n const accessor = createNestedValueAccessor(fieldPath);\r\n\r\n // Build the field to check for recursive marker\r\n const context = createFieldContext(fieldPath, plugins);\r\n let builtField = fieldDef.builderFunction(context);\r\n\r\n // Check if the result needs to be built (composable plugins)\r\n if (builtField && typeof builtField.build === \"function\") {\r\n builtField = builtField.build();\r\n }\r\n\r\n // Check for recursive marker\r\n const hasRecursiveMarker = builtField._validators?.some?.(\r\n (v: any) => v.__isRecursive === true\r\n );\r\n\r\n if (hasRecursiveMarker) {\r\n // Find the recursive validator\r\n const recursiveValidator = builtField._validators.find(\r\n (v: any) => v.__isRecursive === true\r\n );\r\n if (recursiveValidator?.recursive) {\r\n const recursiveInfo = {\r\n targetFieldPath: recursiveValidator.recursive.targetFieldPath,\r\n maxDepth: recursiveValidator.recursive.maxDepth || 10,\r\n };\r\n\r\n // Separate array element recursive fields for later processing\r\n if (fieldPath.includes(\"[*]\")) {\r\n arrayElementRecursiveFields.set(fieldPath, recursiveInfo);\r\n } else {\r\n recursiveFieldsMap.set(fieldPath, recursiveInfo);\r\n }\r\n }\r\n }\r\n\r\n // unified-validator automatically selects optimal strategy\r\n const unifiedValidator = createUnifiedValidator(\r\n {\r\n path: fieldDef.path,\r\n builderFunction: fieldDef.builderFunction || (() => ({})),\r\n },\r\n plugins,\r\n \"fast_separated\",\r\n accessor\r\n );\r\n validators.set(fieldPath, unifiedValidator);\r\n }\r\n }\r\n\r\n // Second pass: Enhance regular recursive validators with target field validators\r\n for (const [fieldPath, recursiveInfo] of recursiveFieldsMap) {\r\n const originalValidator = validators.get(fieldPath)!;\r\n\r\n let targetValidator: UnifiedValidator | null = null;\r\n\r\n // Handle special keywords\r\n if (recursiveInfo.targetFieldPath === \"__Self\") {\r\n // For __Self, we need to apply all validators from the root object\r\n targetValidator = null; // Signal to use all field validators\r\n } else if (recursiveInfo.targetFieldPath === \"__Element\") {\r\n // For __Element in array context, use all validators\r\n targetValidator = null; // Signal to use all field validators for array elements\r\n } else {\r\n // Regular field path\r\n const targetFieldDef = fieldDefinitions.find(\r\n (f) => f.path === recursiveInfo.targetFieldPath\r\n );\r\n if (targetFieldDef && targetFieldDef.builderFunction) {\r\n targetValidator = validators.get(recursiveInfo.targetFieldPath) || null;\r\n }\r\n }\r\n\r\n // Create recursive wrapper\r\n const recursiveValidator = createRecursiveValidator(\r\n originalValidator,\r\n targetValidator,\r\n fieldPath,\r\n recursiveInfo.targetFieldPath,\r\n recursiveInfo.maxDepth,\r\n fieldDefinitions\r\n .filter((fd) => fd.builderFunction)\r\n .map((fd) => ({\r\n path: fd.path,\r\n builderFunction: fd.builderFunction!,\r\n })),\r\n plugins,\r\n validators\r\n );\r\n validators.set(fieldPath, recursiveValidator);\r\n }\r\n\r\n // Third pass: Create array element recursive validators with access to ALL validators\r\n for (const [fieldPath, recursiveInfo] of arrayElementRecursiveFields) {\r\n const originalValidator = validators.get(fieldPath)!;\r\n\r\n // Check if we have all the related validators for this array pattern\r\n const parseResult = parseFieldPath(fieldPath);\r\n const arrayPattern = parseResult.baseArrayPath + \"[*]\";\r\n\r\n // Find all validators that match this array pattern\r\n const relatedValidators = Array.from(validators.keys()).filter(\r\n (path) => path.startsWith(arrayPattern) && path !== fieldPath\r\n );\r\n\r\n // Only create the recursive validator if we have related validators\r\n if (relatedValidators.length > 0) {\r\n const arrayElementRecursiveValidator =\r\n createArrayElementRecursiveValidator(\r\n originalValidator,\r\n fieldPath,\r\n recursiveInfo.targetFieldPath,\r\n recursiveInfo.maxDepth,\r\n fieldDefinitions\r\n .filter((fd) => fd.builderFunction)\r\n .map((fd) => ({\r\n path: fd.path,\r\n builderFunction: fd.builderFunction!,\r\n })),\r\n plugins,\r\n validators // Now this contains ALL validators\r\n );\r\n validators.set(fieldPath, arrayElementRecursiveValidator);\r\n } else {\r\n }\r\n }\r\n\r\n return validators;\r\n}\r\n\r\n/**\r\n * Create validator with execution logic (V8 optimization: Using Unified Validator)\r\n */\r\nfunction createExecutorValidator<TObject extends object, TMap = {}>(\r\n slowValidators: Map<string, UnifiedValidator>,\r\n fastValidators: Map<string, UnifiedValidator>,\r\n originalFieldDefinitions: Array<FieldDefinition>,\r\n plugins: Record<string, any>,\r\n arrayBatches: Map<string, ArrayBatchInfo>,\r\n allValidators: Map<string, any>,\r\n optionalFields: Map<string, boolean>,\r\n requiredFields: Map<string, boolean>,\r\n fieldOptionsMap?: Map<\r\n string,\r\n import(\"../builder/types/field-options\").FieldOptions\r\n >\r\n): TransformAwareValidator<TObject, ApplyNestedTransforms<TObject, TMap>> {\r\n // V8 optimization: Ultra-fast path for simple validators\r\n const hasArrayBatches = arrayBatches.size > 0;\r\n const hasSlowFields = slowValidators.size > 0;\r\n const totalValidators = fastValidators.size + slowValidators.size;\r\n const isSimpleValidator =\r\n !hasArrayBatches && !hasSlowFields && fastValidators.size <= 10;\r\n\r\n // V8 optimization: Check for ultra-fast mode first\r\n const useUltraFastMode =\r\n process.env.LUQ_ULTRA_FAST === \"true\" ||\r\n (global as any).__LUQ_ULTRA_FAST__ === true;\r\n\r\n // In ultra-fast mode, allow more complex validators\r\n // V8 optimization: Increased limit from 10 to 50 for complex schemas\r\n const canUseUltraFast =\r\n useUltraFastMode && !hasArrayBatches && totalValidators <= 50;\r\n\r\n if (canUseUltraFast) {\r\n // Ultra-fast path using raw validator\r\n // Combine fast and slow validators for ultra-fast mode\r\n const allValidatorsMap = new Map([...fastValidators, ...slowValidators]);\r\n const rawValidator = createRawValidator<TObject>(allValidatorsMap);\r\n\r\n const pickValidatorInstance = createPickValidatorFactory<TObject>(\r\n originalFieldDefinitions.map((d) => ({\r\n path: d.path,\r\n builderFunction:\r\n d.builderFunction ||\r\n ((() => ({})) as (\r\n context: FieldBuilderContext<any, any, any>\r\n ) => any),\r\n fieldType: d.fieldType || \"unknown\",\r\n })),\r\n plugins\r\n );\r\n\r\n // Create wrapper functions that handle field options\r\n const validateWithDefaults = (\r\n value: Partial<TObject> | unknown,\r\n options?: any\r\n ): Result<TObject> => {\r\n if (value == null) {\r\n return Result.error([\r\n {\r\n path: \"\",\r\n message: \"Value is required\",\r\n code: \"REQUIRED\",\r\n paths: () => [\"\"],\r\n },\r\n ]);\r\n }\r\n\r\n let obj = value as Record<string, unknown>;\r\n\r\n // Apply default values from field options for validation\r\n if (fieldOptionsMap && fieldOptionsMap.size > 0) {\r\n const objWithDefaults = { ...obj };\r\n for (const [fieldPath, fieldOpts] of fieldOptionsMap) {\r\n const currentValue = getNestedValue(objWithDefaults, fieldPath);\r\n const defaultApplied = applyDefault(currentValue, fieldOpts, {\r\n allValues: objWithDefaults,\r\n });\r\n if (defaultApplied !== currentValue) {\r\n setNestedValue(objWithDefaults, fieldPath, defaultApplied);\r\n }\r\n }\r\n obj = objWithDefaults;\r\n }\r\n\r\n return rawValidator.validate(obj as TObject, options);\r\n };\r\n\r\n const parseWithDefaults = (\r\n value: Partial<TObject> | unknown,\r\n options?: ParseOptions\r\n ): Result<ApplyNestedTransforms<TObject, TMap>> => {\r\n if (value == null) {\r\n return Result.error([\r\n {\r\n path: \"\",\r\n message: \"Value is required\",\r\n code: \"REQUIRED\",\r\n paths: () => [\"\"],\r\n },\r\n ]);\r\n }\r\n\r\n const obj = value as Record<string, unknown>;\r\n let transformedData = { ...obj };\r\n\r\n // Apply default values from field options\r\n if (fieldOptionsMap && fieldOptionsMap.size > 0) {\r\n for (const [fieldPath, fieldOpts] of fieldOptionsMap) {\r\n const currentValue = getNestedValue(transformedData, fieldPath);\r\n const defaultApplied = applyDefault(currentValue, fieldOpts, {\r\n allValues: transformedData,\r\n });\r\n if (defaultApplied !== currentValue) {\r\n setNestedValue(transformedData, fieldPath, defaultApplied);\r\n }\r\n }\r\n }\r\n\r\n return rawValidator.parse(transformedData as TObject, options) as Result<\r\n ApplyNestedTransforms<TObject, TMap>\r\n >;\r\n };\r\n\r\n return {\r\n validate: validateWithDefaults,\r\n parse: parseWithDefaults,\r\n pick: <K extends NestedKeyOf<TObject>>(\r\n key: K\r\n ): FieldValidator<TObject, TypeOfPath<TObject, K>> => {\r\n return pickValidatorInstance.createPickedValidator(key);\r\n },\r\n // Expose raw methods for maximum performance\r\n validateRaw: rawValidator.validateRaw.bind(rawValidator),\r\n parseRaw: rawValidator.parseRaw.bind(rawValidator) as (\r\n value: TObject,\r\n options?: ParseOptions\r\n ) => {\r\n valid: boolean;\r\n data?: ApplyNestedTransforms<TObject, TMap>;\r\n error?: any;\r\n },\r\n };\r\n }\r\n\r\n if (isSimpleValidator) {\r\n // Create ultra-fast executor for simple cases\r\n return createUltraFastExecutorValidator<TObject, TMap>(\r\n fastValidators,\r\n originalFieldDefinitions.map((d) => ({\r\n path: d.path,\r\n builderFunction: d.builderFunction || (() => ({})),\r\n })),\r\n plugins,\r\n fieldOptionsMap // Pass field options\r\n );\r\n }\r\n\r\n // Regular path for complex validators\r\n const executor = createValidatorExecutor<TObject, TMap>(\r\n slowValidators,\r\n fastValidators,\r\n arrayBatches,\r\n allValidators,\r\n optionalFields,\r\n requiredFields,\r\n fieldOptionsMap\r\n );\r\n const fieldDefinitions: FieldDefinition[] = originalFieldDefinitions.map(\r\n (def) => ({\r\n path: def.path,\r\n builderFunction: (def.builderFunction || (() => ({}))) as (\r\n context: FieldBuilderContext<any, any, any>\r\n ) => any,\r\n fieldType: def.fieldType || \"unknown\",\r\n })\r\n );\r\n \r\n // Create the validator object first\r\n const validatorObject = {\r\n validate: (\r\n value: Partial<TObject> | unknown,\r\n options?: any\r\n ): Result<TObject> => {\r\n return executor.executeValidate(value, options);\r\n },\r\n\r\n parse: (\r\n value: Partial<TObject> | unknown,\r\n options?: ParseOptions\r\n ): Result<ApplyNestedTransforms<TObject, TMap>> => {\r\n return executor.executeParse(value, options);\r\n },\r\n\r\n pick: null as any, // Will be set after pickValidator is created\r\n };\r\n\r\n // Create the pick validator with the original validator\r\n const pickValidator = createPickValidatorFactory<TObject>(\r\n fieldDefinitions,\r\n plugins,\r\n undefined, // buildValidators\r\n validatorObject // Pass the original validator\r\n );\r\n\r\n // Set the pick method\r\n validatorObject.pick = <K extends NestedKeyOf<TObject>>(\r\n key: K\r\n ): FieldValidator<TObject, TypeOfPath<TObject, K>> => {\r\n return pickValidator.createPickedValidator(key);\r\n };\r\n\r\n return validatorObject;\r\n}\r\n\r\n/**\r\n * V8 optimization: Ultra-fast executor for simple validators\r\n * Eliminates all unnecessary checks and iterations\r\n */\r\nfunction createUltraFastExecutorValidator<TObject extends object, TMap = {}>(\r\n fastValidators: Map<string, UnifiedValidator>,\r\n originalFieldDefinitions: Array<{\r\n path: string;\r\n builderFunction: Function;\r\n fieldType?: string;\r\n }>,\r\n plugins: Record<string, any>,\r\n fieldOptions?: Map<\r\n string,\r\n import(\"../builder/types/field-options\").FieldOptions\r\n >\r\n): TransformAwareValidator<TObject, ApplyNestedTransforms<TObject, TMap>> {\r\n // Pre-compile validator array for ultra-fast access\r\n const validatorEntries = Array.from(fastValidators);\r\n const validatorCount = validatorEntries.length;\r\n\r\n // Pre-compile field accessors for direct access\r\n const fieldAccessors: Array<{\r\n path: string;\r\n accessor: (obj: any) => any;\r\n validator: UnifiedValidator;\r\n }> = [];\r\n for (let i = 0; i < validatorCount; i++) {\r\n const [path, validator] = validatorEntries[i];\r\n fieldAccessors.push({\r\n path,\r\n // V8 optimization: Use pre-compiled accessor from validator if available\r\n accessor: validator.accessor || createNestedValueAccessor(path),\r\n validator,\r\n });\r\n }\r\n\r\n const fieldDefinitions: FieldDefinition[] = originalFieldDefinitions.map(\r\n (def) => ({\r\n path: def.path,\r\n builderFunction: (def.builderFunction || (() => ({}))) as (\r\n context: FieldBuilderContext<any, any, any>\r\n ) => any,\r\n fieldType: def.fieldType || \"unknown\",\r\n })\r\n );\r\n const pickValidator = createPickValidatorFactory<TObject>(\r\n fieldDefinitions,\r\n plugins\r\n );\r\n\r\n // V8 optimization: Pre-allocated arrays and results\r\n const errors: any[] = [];\r\n const OK_RESULT = Result.ok({} as TObject);\r\n\r\n // V8 optimization: Generate specialized validator based on field count\r\n if (validatorCount === 1) {\r\n // Special case: single field validator\r\n const { path, accessor, validator } = fieldAccessors[0];\r\n\r\n return {\r\n validate: (\r\n value: Partial<TObject> | unknown,\r\n options?: any\r\n ): Result<TObject> => {\r\n if (value == null) {\r\n return Result.error([\r\n {\r\n path: \"\",\r\n message: \"Value is required\",\r\n code: \"REQUIRED\",\r\n paths: () => [\"\"],\r\n },\r\n ]);\r\n }\r\n\r\n let obj = value as Record<string, unknown>;\r\n\r\n // Apply default values from field options for validation\r\n if (fieldOptions && fieldOptions.size > 0) {\r\n const objWithDefaults = { ...obj };\r\n for (const [fieldPath, fieldOpts] of fieldOptions) {\r\n const currentValue = getNestedValue(objWithDefaults, fieldPath);\r\n const defaultApplied = applyDefault(currentValue, fieldOpts, {\r\n allValues: objWithDefaults,\r\n });\r\n if (defaultApplied !== currentValue) {\r\n setNestedValue(objWithDefaults, fieldPath, defaultApplied);\r\n }\r\n }\r\n obj = objWithDefaults;\r\n }\r\n\r\n const fieldValue = accessor(obj);\r\n\r\n const result = validator.validate(fieldValue, obj, options);\r\n if (!result.valid) {\r\n // Convert error format\r\n const errors = result.errors.map((e) => ({\r\n path: e.path,\r\n code: e.code,\r\n message: e.message,\r\n paths: () => [e.path],\r\n }));\r\n return Result.error(errors);\r\n }\r\n\r\n return Result.ok(value as TObject);\r\n },\r\n\r\n parse: (\r\n value: Partial<TObject> | unknown,\r\n options?: ParseOptions\r\n ): Result<ApplyNestedTransforms<TObject, TMap>> => {\r\n if (value == null) {\r\n return Result.error([\r\n {\r\n path: \"\",\r\n message: \"Value is required\",\r\n code: \"REQUIRED\",\r\n paths: () => [\"\"],\r\n },\r\n ]);\r\n }\r\n\r\n let obj = value as Record<string, unknown>;\r\n let transformedData = { ...obj };\r\n\r\n // Apply default values from field options\r\n if (fieldOptions && fieldOptions.size > 0) {\r\n for (const [fieldPath, fieldOpts] of fieldOptions) {\r\n const currentValue = getNestedValue(transformedData, fieldPath);\r\n const defaultApplied = applyDefault(currentValue, fieldOpts, {\r\n allValues: transformedData,\r\n });\r\n if (defaultApplied !== currentValue) {\r\n setNestedValue(transformedData, fieldPath, defaultApplied);\r\n }\r\n }\r\n }\r\n\r\n const fieldValue = accessor(transformedData);\r\n\r\n const result = validator.parse(fieldValue, obj, options);\r\n if (!result.valid) {\r\n // Convert error format\r\n const errors = result.errors.map((e) => ({\r\n path: e.path,\r\n code: e.code,\r\n message: e.message,\r\n paths: () => [e.path],\r\n }));\r\n return Result.error(errors);\r\n }\r\n\r\n // V8 optimization: Direct property set for single field\r\n if (result.data !== undefined && result.data !== fieldValue) {\r\n setNestedValue(transformedData, path, result.data);\r\n return Result.ok(\r\n transformedData as ApplyNestedTransforms<TObject, TMap>\r\n );\r\n }\r\n\r\n return Result.ok(\r\n transformedData as ApplyNestedTransforms<TObject, TMap>\r\n );\r\n },\r\n\r\n pick: <K extends NestedKeyOf<TObject>>(\r\n key: K\r\n ): FieldValidator<TObject, TypeOfPath<TObject, K>> => {\r\n return pickValidator.createPickedValidator(key);\r\n },\r\n };\r\n }\r\n\r\n // General case: multiple fields\r\n return {\r\n validate: (\r\n value: Partial<TObject> | unknown,\r\n options?: any\r\n ): Result<TObject> => {\r\n if (value == null) {\r\n return Result.error([\r\n {\r\n path: \"\",\r\n message: \"Value is required\",\r\n code: \"REQUIRED\",\r\n paths: () => [\"\"],\r\n },\r\n ]);\r\n }\r\n\r\n let obj = value as Record<string, unknown>;\r\n\r\n // Apply default values from field options for validation\r\n if (fieldOptions && fieldOptions.size > 0) {\r\n const objWithDefaults = { ...obj };\r\n for (const [fieldPath, fieldOpts] of fieldOptions) {\r\n const currentValue = getNestedValue(objWithDefaults, fieldPath);\r\n const defaultApplied = applyDefault(currentValue, fieldOpts, {\r\n allValues: objWithDefaults,\r\n });\r\n if (defaultApplied !== currentValue) {\r\n setNestedValue(objWithDefaults, fieldPath, defaultApplied);\r\n }\r\n }\r\n obj = objWithDefaults;\r\n }\r\n const abortEarly = options?.abortEarly !== false; // Default to true\r\n const abortEarlyOnEachField = options?.abortEarlyOnEachField !== false;\r\n\r\n // V8 optimization: Reset errors array instead of creating new one\r\n errors.length = 0;\r\n\r\n // V8 optimization: Direct field validation loop with pre-compiled accessors\r\n for (let i = 0; i < validatorCount; i++) {\r\n const { path, accessor, validator } = fieldAccessors[i];\r\n const fieldValue = accessor(obj);\r\n\r\n const result = validator.validate(fieldValue, obj, {\r\n abortEarlyOnEachField,\r\n });\r\n if (!result.valid) {\r\n const resultErrors = result.errors;\r\n for (let j = 0; j < resultErrors.length; j++) {\r\n const e = resultErrors[j];\r\n errors.push({\r\n path: e.path,\r\n code: e.code,\r\n message: e.message,\r\n paths: () => [e.path],\r\n });\r\n }\r\n if (abortEarly) {\r\n return Result.error(errors.slice()); // Clone to prevent mutation\r\n }\r\n }\r\n }\r\n\r\n if (errors.length > 0) {\r\n return Result.error(errors.slice()); // Clone to prevent mutation\r\n }\r\n\r\n return Result.ok(value as TObject);\r\n },\r\n\r\n parse: (\r\n value: Partial<TObject> | unknown,\r\n options?: ParseOptions\r\n ): Result<ApplyNestedTransforms<TObject, TMap>> => {\r\n if (value == null) {\r\n return Result.error([\r\n {\r\n path: \"\",\r\n message: \"Value is required\",\r\n code: \"REQUIRED\",\r\n paths: () => [\"\"],\r\n },\r\n ]);\r\n }\r\n\r\n const obj = value as Record<string, unknown>;\r\n let transformedData = { ...obj };\r\n\r\n // Apply default values from field options\r\n if (fieldOptions && fieldOptions.size > 0) {\r\n for (const [fieldPath, fieldOpts] of fieldOptions) {\r\n const currentValue = getNestedValue(transformedData, fieldPath);\r\n const defaultApplied = applyDefault(currentValue, fieldOpts, {\r\n allValues: transformedData,\r\n });\r\n if (defaultApplied !== currentValue) {\r\n setNestedValue(transformedData, fieldPath, defaultApplied);\r\n }\r\n }\r\n }\r\n const abortEarly = options?.abortEarly !== false; // Default to true\r\n const abortEarlyOnEachField = options?.abortEarlyOnEachField !== false;\r\n\r\n // V8 optimization: Reset errors array\r\n errors.length = 0;\r\n\r\n // V8 optimization: Direct field parse loop\r\n for (let i = 0; i < validatorCount; i++) {\r\n const { path, accessor, validator } = fieldAccessors[i];\r\n const fieldValue = accessor(transformedData);\r\n\r\n const result = validator.parse(fieldValue, transformedData, {\r\n abortEarlyOnEachField,\r\n });\r\n if (!result.valid) {\r\n const resultErrors = result.errors;\r\n for (let j = 0; j < resultErrors.length; j++) {\r\n const e = resultErrors[j];\r\n errors.push({\r\n path: e.path,\r\n code: e.code,\r\n message: e.message,\r\n paths: () => [e.path],\r\n });\r\n }\r\n if (abortEarly) {\r\n return Result.error(errors.slice());\r\n }\r\n } else if (result.data !== undefined) {\r\n setNestedValue(transformedData, path, result.data);\r\n }\r\n }\r\n\r\n if (errors.length > 0) {\r\n return Result.error(errors.slice());\r\n }\r\n\r\n return Result.ok(transformedData as ApplyNestedTransforms<TObject, TMap>);\r\n },\r\n\r\n pick: <K extends NestedKeyOf<TObject>>(\r\n key: K\r\n ): FieldValidator<TObject, TypeOfPath<TObject, K>> => {\r\n return pickValidator.createPickedValidator(key);\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * ValidatorExecutor - V8 optimized using Unified Validator\r\n */\r\nfunction createValidatorExecutor<TObject extends object, TMap = {}>(\r\n slowValidators: Map<string, UnifiedValidator>,\r\n fastValidators: Map<string, UnifiedValidator>,\r\n arrayBatches: Map<string, ArrayBatchInfo>,\r\n allValidators: Map<string, any>,\r\n optionalFields: Map<string, boolean>,\r\n requiredFields: Map<string, boolean>,\r\n fieldOptions?: Map<\r\n string,\r\n import(\"../builder/types/field-options\").FieldOptions\r\n >\r\n) {\r\n // V8 optimization: Pre-compile all field accessors to avoid repeated createNestedValueAccessor calls\r\n const fieldAccessorCache = new Map<string, (obj: any) => any>();\r\n const fieldExistenceCache = new Map<string, (obj: any) => boolean>();\r\n\r\n // Pre-compile accessors and existence checkers for all validators\r\n for (const [fieldPath, validator] of fastValidators) {\r\n if (!fieldAccessorCache.has(fieldPath)) {\r\n fieldAccessorCache.set(\r\n fieldPath,\r\n validator.accessor || createNestedValueAccessor(fieldPath)\r\n );\r\n fieldExistenceCache.set(\r\n fieldPath,\r\n createFieldExistenceChecker(fieldPath)\r\n );\r\n }\r\n }\r\n for (const [fieldPath, validator] of slowValidators) {\r\n if (!fieldAccessorCache.has(fieldPath)) {\r\n fieldAccessorCache.set(\r\n fieldPath,\r\n validator.accessor || createNestedValueAccessor(fieldPath)\r\n );\r\n fieldExistenceCache.set(\r\n fieldPath,\r\n createFieldExistenceChecker(fieldPath)\r\n );\r\n }\r\n }\r\n /**\r\n * Execute validate - Skip Transform after last validator\r\n */\r\n function executeValidate(\r\n value: Partial<TObject> | unknown,\r\n options?: ValidationOptions\r\n ): Result<TObject> {\r\n if (value == null) {\r\n return Result.error([\r\n {\r\n path: \"\",\r\n message: \"Value is required\",\r\n code: \"REQUIRED\",\r\n paths: () => [\"\"],\r\n },\r\n ]);\r\n }\r\n\r\n const errors: any[] = [];\r\n let obj = value as Record<string, unknown>;\r\n\r\n // Apply default values from field options for validation\r\n if (fieldOptions && fieldOptions.size > 0) {\r\n // Create a copy to apply defaults for validation\r\n const objWithDefaults = { ...obj };\r\n for (const [fieldPath, fieldOpts] of fieldOptions) {\r\n const currentValue = getNestedValue(objWithDefaults, fieldPath);\r\n const defaultApplied = applyDefault(currentValue, fieldOpts, {\r\n allValues: objWithDefaults,\r\n });\r\n if (defaultApplied !== currentValue) {\r\n setNestedValue(objWithDefaults, fieldPath, defaultApplied);\r\n }\r\n }\r\n obj = objWithDefaults;\r\n }\r\n\r\n // V8 optimization: Default is false for backward compatibility\r\n const abortEarly = options?.abortEarly !== false; // Default to true\r\n // Default to true for abortEarlyOnEachField\r\n const abortEarlyOnEachField = options?.abortEarlyOnEachField !== false;\r\n\r\n // STEP 1: Process array batches first (eliminates duplicate array access)\r\n for (const [arrayPath, batchInfo] of arrayBatches) {\r\n // V8 optimization: Use cached accessor for array path\r\n const arrayAccessor =\r\n fieldAccessorCache.get(arrayPath) ||\r\n createNestedValueAccessor(arrayPath);\r\n if (!fieldAccessorCache.has(arrayPath)) {\r\n fieldAccessorCache.set(arrayPath, arrayAccessor);\r\n }\r\n const arrayData = arrayAccessor(obj);\r\n\r\n // First, validate the array field itself (e.g., required, type checks)\r\n const arrayFieldValidator = allValidators.get(arrayPath);\r\n if (arrayFieldValidator) {\r\n let arrayFieldResult: any;\r\n if (arrayFieldValidator.validate) {\r\n arrayFieldResult = arrayFieldValidator.validate(arrayData, obj, {\r\n abortEarlyOnEachField,\r\n });\r\n } else if (arrayFieldValidator.validateSlow) {\r\n arrayFieldResult = arrayFieldValidator.validateSlow(arrayData, obj, {\r\n abortEarlyOnEachField,\r\n });\r\n } else if (arrayFieldValidator.validateFast) {\r\n arrayFieldResult = arrayFieldValidator.validateFast(arrayData, obj);\r\n }\r\n\r\n if (arrayFieldResult && !arrayFieldResult.valid) {\r\n if (arrayFieldResult.errors && arrayFieldResult.errors.length > 0) {\r\n errors.push(...arrayFieldResult.errors);\r\n } else {\r\n errors.push({\r\n path: arrayPath,\r\n code: \"VALIDATION_ERROR\",\r\n message: \"Array field validation failed\",\r\n paths: () => [arrayPath],\r\n });\r\n }\r\n if (abortEarly) {\r\n return Result.error(errors);\r\n }\r\n // If array field validation fails, skip element validation\r\n continue;\r\n }\r\n }\r\n\r\n // Then, validate array elements if it's an array\r\n if (Array.isArray(arrayData)) {\r\n const batchValidator = createArrayBatchValidator(\r\n batchInfo,\r\n allValidators\r\n );\r\n const batchResult = batchValidator(\r\n arrayData,\r\n obj,\r\n abortEarly,\r\n abortEarlyOnEachField,\r\n VALIDATE_MODE\r\n );\r\n\r\n if (batchResult.errors.length > 0) {\r\n errors.push(...batchResult.errors);\r\n if (abortEarly) {\r\n return Result.error(errors);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // V8 optimization: Fast path optimization - use direct iterator without Array.from\r\n // STEP 2: Validate regular fast fields (array batch fields already processed)\r\n for (const [fieldPath, validator] of fastValidators) {\r\n // Skip array element field if parent array is empty\r\n if (fieldPath.includes(\".\") && !fieldPath.includes(\"[\") && !fieldPath.includes(\"*\")) {\r\n const parts = fieldPath.split(\".\");\r\n if (parts.length > 1) {\r\n // Check if any parent in the path is an empty array\r\n let skipDueToEmptyArray = false;\r\n for (let i = 0; i < parts.length - 1; i++) {\r\n const parentPath = parts.slice(0, i + 1).join(\".\");\r\n const parentValue = getNestedValue(obj, parentPath);\r\n if (Array.isArray(parentValue) && parentValue.length === 0) {\r\n skipDueToEmptyArray = true;\r\n break;\r\n }\r\n }\r\n if (skipDueToEmptyArray) {\r\n continue; // Skip this field validation\r\n }\r\n }\r\n }\r\n \r\n // V8 optimization: Skip array element path check for simple paths (most common)\r\n if (!fieldPath.includes(\"[\") && !fieldPath.includes(\"*\")) {\r\n // Fast path for simple field names\r\n // V8 optimization: Use pre-compiled accessor from cache\r\n const accessor = fieldAccessorCache.get(fieldPath);\r\n const fieldValue = accessor\r\n ? accessor(obj)\r\n : getNestedValue(obj, fieldPath);\r\n\r\n // V8 optimization: Direct validation without existence checks for fast path\r\n const result = validator.validate(fieldValue, obj, {\r\n abortEarlyOnEachField,\r\n });\r\n if (!result.valid) {\r\n // V8 optimization: Direct array push without spread - reuse error objects\r\n if (result.errors && result.errors.length > 0) {\r\n for (let j = 0; j < result.errors.length; j++) {\r\n errors.push(result.errors[j]);\r\n }\r\n }\r\n if (abortEarly) {\r\n return Result.error(errors);\r\n }\r\n }\r\n } else {\r\n // Slow path: array element patterns\r\n const isArrayElementPath =\r\n fieldPath.includes(\"[*]\") || fieldPath.includes(\".*\");\r\n\r\n if (isArrayElementPath) {\r\n const arrayElementErrors = validateArrayElementPath(\r\n fieldPath,\r\n validator,\r\n obj,\r\n obj,\r\n abortEarly,\r\n abortEarlyOnEachField\r\n );\r\n if (arrayElementErrors.length > 0) {\r\n errors.push(...arrayElementErrors);\r\n if (abortEarly) {\r\n return Result.error(errors);\r\n }\r\n }\r\n continue;\r\n }\r\n\r\n // Regular field with brackets (rare case)\r\n const accessor = fieldAccessorCache.get(fieldPath);\r\n const fieldValue = accessor\r\n ? accessor(obj)\r\n : getNestedValue(obj, fieldPath);\r\n const result = validator.validate(fieldValue, obj, {\r\n abortEarlyOnEachField,\r\n });\r\n if (!result.valid) {\r\n if (result.errors && result.errors.length > 0) {\r\n for (let j = 0; j < result.errors.length; j++) {\r\n errors.push(result.errors[j]);\r\n }\r\n }\r\n if (abortEarly) {\r\n return Result.error(errors);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // STEP 3: Validate regular slow fields (array batch fields already processed)\r\n for (const [fieldPath, validator] of slowValidators) {\r\n // Skip array element field if parent array is empty\r\n if (fieldPath.includes(\".\") && !fieldPath.includes(\"[\") && !fieldPath.includes(\"*\")) {\r\n const parts = fieldPath.split(\".\");\r\n if (parts.length > 1) {\r\n // Check if any parent in the path is an empty array\r\n let skipDueToEmptyArray = false;\r\n for (let i = 0; i < parts.length - 1; i++) {\r\n const parentPath = parts.slice(0, i + 1).join(\".\");\r\n const parentValue = getNestedValue(obj, parentPath);\r\n if (Array.isArray(parentValue) && parentValue.length === 0) {\r\n skipDueToEmptyArray = true;\r\n break;\r\n }\r\n }\r\n if (skipDueToEmptyArray) {\r\n continue; // Skip this field validation\r\n }\r\n }\r\n }\r\n \r\n // Check if this is an array element path pattern\r\n const isArrayElementPath =\r\n fieldPath.includes(\"[*]\") || fieldPath.includes(\".*\");\r\n\r\n if (isArrayElementPath) {\r\n // Handle array element path validation\r\n const arrayElementErrors = validateArrayElementPath(\r\n fieldPath,\r\n validator,\r\n obj,\r\n obj,\r\n abortEarly,\r\n abortEarlyOnEachField\r\n );\r\n if (arrayElementErrors.length > 0) {\r\n errors.push(...arrayElementErrors);\r\n if (abortEarly) {\r\n return Result.error(errors);\r\n }\r\n }\r\n continue;\r\n }\r\n\r\n // Check if field is present in input object\r\n // V8 optimization: Use pre-compiled existence checker\r\n const existenceChecker = fieldExistenceCache.get(fieldPath);\r\n const fieldExists = existenceChecker\r\n ? existenceChecker(obj)\r\n : hasNestedField(obj, fieldPath);\r\n const isOptional = optionalFields.get(fieldPath) || false;\r\n const hasRequiredPlugin = requiredFields.get(fieldPath) || false;\r\n\r\n // If field is missing and optional, skip validation entirely\r\n if (!fieldExists && isOptional) {\r\n continue;\r\n }\r\n\r\n // If field is missing, not optional, and has no explicit required plugin, add default required error\r\n if (!fieldExists && !isOptional && !hasRequiredPlugin) {\r\n errors.push({\r\n path: fieldPath,\r\n code: \"REQUIRED\",\r\n message: `Field '${fieldPath}' is required`,\r\n paths: () => [fieldPath],\r\n });\r\n if (abortEarly) {\r\n return Result.error(errors);\r\n }\r\n continue;\r\n }\r\n\r\n // For fields with explicit required plugin, let the plugin handle missing fields with custom messages\r\n // For present fields, continue with normal validation\r\n\r\n // V8 optimization: Use pre-compiled accessor from cache\r\n const accessor = fieldAccessorCache.get(fieldPath);\r\n const fieldValue = accessor\r\n ? accessor(obj)\r\n : getNestedValue(obj, fieldPath);\r\n\r\n // V8 optimization: Unified validator interface\r\n const result = validator.validate(fieldValue, obj, {\r\n abortEarlyOnEachField,\r\n });\r\n if (!result.valid) {\r\n if (result.errors && result.errors.length > 0) {\r\n for (let j = 0; j < result.errors.length; j++) {\r\n errors.push(result.errors[j]);\r\n }\r\n }\r\n if (abortEarly) {\r\n return Result.error(errors);\r\n }\r\n }\r\n }\r\n\r\n if (errors.length > 0) {\r\n return Result.error(errors);\r\n }\r\n\r\n return Result.ok(value as TObject);\r\n }\r\n\r\n /**\r\n * Execute parse - Execute all steps\r\n */\r\n function executeParse(\r\n value: Partial<TObject> | unknown,\r\n options?: ParseOptions\r\n ): Result<ApplyNestedTransforms<TObject, TMap>> {\r\n if (value == null) {\r\n return Result.error([\r\n {\r\n path: \"\",\r\n message: \"Value is required\",\r\n code: \"REQUIRED\",\r\n paths: () => [\"\"],\r\n },\r\n ]);\r\n }\r\n\r\n const errors: any[] = [];\r\n const obj = value as Record<string, unknown>;\r\n let transformedData = { ...obj };\r\n\r\n // Apply default values from field options\r\n if (fieldOptions && fieldOptions.size > 0) {\r\n for (const [fieldPath, fieldOpts] of fieldOptions) {\r\n const currentValue = getNestedValue(transformedData, fieldPath);\r\n const defaultApplied = applyDefault(currentValue, fieldOpts, {\r\n allValues: transformedData,\r\n });\r\n if (defaultApplied !== currentValue) {\r\n setNestedValue(transformedData, fieldPath, defaultApplied);\r\n }\r\n }\r\n }\r\n\r\n // V8 optimization: Default is false for backward compatibility\r\n const abortEarly = options?.abortEarly !== false; // Default to true\r\n // Default to true for abortEarlyOnEachField\r\n const abortEarlyOnEachField = options?.abortEarlyOnEachField !== false;\r\n\r\n // STEP 1: Process array batches first (eliminates duplicate array access)\r\n for (const [arrayPath, batchInfo] of arrayBatches) {\r\n // V8 optimization: Use cached accessor for array path\r\n const arrayAccessor =\r\n fieldAccessorCache.get(arrayPath) ||\r\n createNestedValueAccessor(arrayPath);\r\n if (!fieldAccessorCache.has(arrayPath)) {\r\n fieldAccessorCache.set(arrayPath, arrayAccessor);\r\n }\r\n const arrayData = arrayAccessor(transformedData);\r\n\r\n // First, validate the array field itself (e.g., required, type checks)\r\n const arrayFieldValidator = allValidators.get(arrayPath);\r\n if (arrayFieldValidator) {\r\n let arrayFieldResult: any;\r\n if (arrayFieldValidator.parse) {\r\n arrayFieldResult = arrayFieldValidator.parse(arrayData, transformedData, {\r\n abortEarlyOnEachField,\r\n });\r\n } else if (arrayFieldValidator.parseSlow) {\r\n arrayFieldResult = arrayFieldValidator.parseSlow(arrayData, transformedData, {\r\n abortEarlyOnEachField,\r\n });\r\n } else if (arrayFieldValidator.parseFast) {\r\n arrayFieldResult = arrayFieldValidator.parseFast(arrayData, transformedData);\r\n }\r\n\r\n if (arrayFieldResult && !arrayFieldResult.valid) {\r\n if (arrayFieldResult.errors && arrayFieldResult.errors.length > 0) {\r\n errors.push(...arrayFieldResult.errors);\r\n } else {\r\n errors.push({\r\n path: arrayPath,\r\n code: \"PARSE_ERROR\",\r\n message: \"Array field parsing failed\",\r\n paths: () => [arrayPath],\r\n });\r\n }\r\n if (abortEarly) {\r\n return Result.error(errors);\r\n }\r\n // If array field validation fails, skip element processing\r\n continue;\r\n } else if (arrayFieldResult && arrayFieldResult.data !== undefined) {\r\n // Apply any transforms to the array field itself\r\n setNestedValue(transformedData, arrayPath, arrayFieldResult.data);\r\n // Update arrayData for element processing\r\n const updatedArrayData = arrayAccessor(transformedData);\r\n if (Array.isArray(updatedArrayData)) {\r\n // Process array elements with updated data\r\n const batchProcessor = createArrayBatchValidator(\r\n batchInfo,\r\n allValidators\r\n );\r\n const parseResult = batchProcessor(\r\n updatedArrayData,\r\n transformedData,\r\n abortEarly,\r\n abortEarlyOnEachField,\r\n PARSE_MODE\r\n );\r\n\r\n if (parseResult.errors.length > 0) {\r\n errors.push(...parseResult.errors);\r\n if (abortEarly) {\r\n return Result.error(errors);\r\n }\r\n }\r\n\r\n // Apply transformed array data\r\n if (parseResult.transformedData) {\r\n setNestedValue(\r\n transformedData,\r\n arrayPath,\r\n parseResult.transformedData\r\n );\r\n }\r\n }\r\n continue;\r\n }\r\n }\r\n\r\n // Then, validate array elements if it's an array\r\n if (Array.isArray(arrayData)) {\r\n const batchProcessor = createArrayBatchValidator(\r\n batchInfo,\r\n allValidators\r\n );\r\n const parseResult = batchProcessor(\r\n arrayData,\r\n transformedData,\r\n abortEarly,\r\n abortEarlyOnEachField,\r\n PARSE_MODE\r\n );\r\n\r\n if (parseResult.errors.length > 0) {\r\n errors.push(...parseResult.errors);\r\n if (abortEarly) {\r\n return Result.error(errors);\r\n }\r\n }\r\n\r\n // Apply transformed array data\r\n if (parseResult.transformedData) {\r\n setNestedValue(\r\n transformedData,\r\n arrayPath,\r\n parseResult.transformedData\r\n );\r\n }\r\n }\r\n }\r\n\r\n // STEP 2: Execute regular fast fields (array batch fields already processed)\r\n for (const [fieldPath, validator] of fastValidators) {\r\n // V8 optimization: Use pre-compiled accessor from cache\r\n const accessor = fieldAccessorCache.get(fieldPath);\r\n const fieldValue = accessor\r\n ? accessor(transformedData)\r\n : getNestedValue(transformedData, fieldPath);\r\n\r\n // V8 optimization: Unified validator parse\r\n const result = validator.parse(fieldValue, transformedData, {\r\n abortEarlyOnEachField,\r\n });\r\n\r\n if (!result.valid) {\r\n if (result.errors && result.errors.length > 0) {\r\n for (let j = 0; j < result.errors.length; j++) {\r\n errors.push(result.errors[j]);\r\n }\r\n }\r\n // If abortEarly: true (default), return immediately\r\n if (abortEarly) {\r\n return Result.error(errors);\r\n }\r\n } else if (result.data !== undefined) {\r\n setNestedValue(transformedData, fieldPath, result.data);\r\n }\r\n }\r\n\r\n // STEP 3: Execute regular slow fields (array batch fields already processed)\r\n for (const [fieldPath, validator] of slowValidators) {\r\n // Check if field is present in input object\r\n // V8 optimization: Use pre-compiled existence checker\r\n const existenceChecker = fieldExistenceCache.get(fieldPath);\r\n const fieldExists = existenceChecker\r\n ? existenceChecker(transformedData)\r\n : hasNestedField(transformedData, fieldPath);\r\n const isOptional = optionalFields.get(fieldPath) || false;\r\n const hasRequiredPlugin = requiredFields.get(fieldPath) || false;\r\n\r\n // If field is missing and optional, skip validation entirely\r\n if (!fieldExists && isOptional) {\r\n continue;\r\n }\r\n\r\n // If field is missing, not optional, and has no explicit required plugin, add default required error\r\n if (!fieldExists && !isOptional && !hasRequiredPlugin) {\r\n errors.push({\r\n path: fieldPath,\r\n code: \"REQUIRED\",\r\n message: `Field '${fieldPath}' is required`,\r\n paths: () => [fieldPath],\r\n });\r\n if (abortEarly) {\r\n return Result.error(errors);\r\n }\r\n continue;\r\n }\r\n\r\n // For fields with explicit required plugin, let the plugin handle missing fields with custom messages\r\n // For present fields, continue with normal validation\r\n\r\n // V8 optimization: Use pre-compiled accessor from cache\r\n const accessor = fieldAccessorCache.get(fieldPath);\r\n const fieldValue = accessor\r\n ? accessor(transformedData)\r\n : getNestedValue(transformedData, fieldPath);\r\n\r\n // V8 optimization: Unified validator parse\r\n const result = validator.parse(fieldValue, transformedData, {\r\n abortEarlyOnEachField,\r\n });\r\n\r\n if (!result.valid) {\r\n if (result.errors && result.errors.length > 0) {\r\n for (let j = 0; j < result.errors.length; j++) {\r\n errors.push(result.errors[j]);\r\n }\r\n }\r\n // If abortEarly: true (default), return immediately\r\n if (abortEarly) {\r\n return Result.error(errors);\r\n }\r\n } else if (result.data !== undefined) {\r\n setNestedValue(transformedData, fieldPath, result.data);\r\n }\r\n }\r\n\r\n if (errors.length > 0) {\r\n return Result.error(errors);\r\n }\r\n\r\n return Result.ok(transformedData as ApplyNestedTransforms<TObject, TMap>);\r\n }\r\n\r\n return {\r\n executeValidate,\r\n executeParse,\r\n };\r\n}\r\n\r\n/**\r\n * Validate array element field\r\n */\r\nfunction validateArrayElementField(\r\n arrayFieldInfo: { values: any[]; arrayPath: string },\r\n fieldPath: string,\r\n validator: any,\r\n rootData: any,\r\n abortEarly: boolean\r\n): Array<{\r\n path: string;\r\n code: string;\r\n message: string;\r\n paths: () => string[];\r\n}> {\r\n const errors: Array<{\r\n path: string;\r\n code: string;\r\n message: string;\r\n paths: () => string[];\r\n }> = [];\r\n const { values, arrayPath } = arrayFieldInfo;\r\n\r\n // Skip element validation if array is empty\r\n if (!values || values.length === 0) {\r\n return errors;\r\n }\r\n\r\n // Validate each element's value\r\n for (let i = 0; i < values.length; i++) {\r\n const elementValue = values[i];\r\n const elementPath = `${arrayPath}[${i}].${fieldPath.replace(arrayPath + \".\", \"\")}`;\r\n\r\n let elementResult: any;\r\n\r\n // V8 optimization: Unified validator\r\n if (validator.validate) {\r\n elementResult = validator.validate(elementValue, rootData);\r\n } else {\r\n // Fallback - shouldn't happen\r\n continue;\r\n }\r\n\r\n if (!elementResult.valid) {\r\n // Map errors to correct element path\r\n if (elementResult.errors && elementResult.errors.length > 0) {\r\n for (const error of elementResult.errors) {\r\n errors.push({\r\n path: elementPath,\r\n code: error.code || \"VALIDATION_ERROR\",\r\n message: error.message || \"Validation failed\",\r\n paths: () => [elementPath],\r\n });\r\n }\r\n } else {\r\n errors.push({\r\n path: elementPath,\r\n code: \"VALIDATION_ERROR\",\r\n message: \"Validation failed\",\r\n paths: () => [elementPath],\r\n });\r\n }\r\n\r\n if (abortEarly) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return errors;\r\n}\r\n\r\n/**\r\n * Parse array element field (validate + transform)\r\n */\r\nfunction parseArrayElementField(\r\n arrayFieldInfo: { values: any[]; arrayPath: string },\r\n fieldPath: string,\r\n validator: any,\r\n transformedData: any,\r\n abortEarly: boolean\r\n): Array<{\r\n path: string;\r\n code: string;\r\n message: string;\r\n paths: () => string[];\r\n}> {\r\n const errors: Array<{\r\n path: string;\r\n code: string;\r\n message: string;\r\n paths: () => string[];\r\n }> = [];\r\n const { values, arrayPath } = arrayFieldInfo;\r\n\r\n // Skip element validation if array is empty\r\n if (!values || values.length === 0) {\r\n return errors;\r\n }\r\n\r\n // Get the array from transformed data to update it\r\n const arrayAccessor = createNestedValueAccessor(arrayPath);\r\n const transformedArray = arrayAccessor(transformedData);\r\n\r\n if (!Array.isArray(transformedArray)) {\r\n return errors; // Skip if not an array\r\n }\r\n\r\n // Parse each element's value\r\n for (let i = 0; i < values.length && i < transformedArray.length; i++) {\r\n const elementValue = values[i];\r\n const elementPath = `${arrayPath}[${i}].${fieldPath.replace(arrayPath + \".\", \"\")}`;\r\n\r\n let elementResult: any;\r\n\r\n // V8 optimization: Unified validator\r\n if (validator.parse) {\r\n elementResult = validator.parse(elementValue, transformedData);\r\n } else {\r\n // Fallback - shouldn't happen\r\n continue;\r\n }\r\n\r\n if (!elementResult.valid) {\r\n // Map errors to correct element path\r\n if (elementResult.errors && elementResult.errors.length > 0) {\r\n for (const error of elementResult.errors) {\r\n errors.push({\r\n path: elementPath,\r\n code: error.code || \"VALIDATION_ERROR\",\r\n message: error.message || \"Validation failed\",\r\n paths: () => [elementPath],\r\n });\r\n }\r\n } else {\r\n errors.push({\r\n path: elementPath,\r\n code: \"VALIDATION_ERROR\",\r\n message: \"Validation failed\",\r\n paths: () => [elementPath],\r\n });\r\n }\r\n\r\n if (abortEarly) {\r\n break;\r\n }\r\n } else if (elementResult.data !== undefined) {\r\n // Apply transformation to the element\r\n const elementPropertyPath = fieldPath.replace(arrayPath + \".\", \"\");\r\n setNestedValueInArrayElement(\r\n transformedArray,\r\n i,\r\n elementPropertyPath,\r\n elementResult.data\r\n );\r\n }\r\n }\r\n\r\n return errors;\r\n}\r\n\r\n// NOTE: Array element setter creation moved to validator factory local cache to avoid memory leaks\r\nfunction createArrayElementSetter(\r\n propertyPath: string\r\n): (array: any[], index: number, value: any) => void {\r\n // Create setter without global caching - should be managed by validator factory\r\n if (!propertyPath.includes(\".\")) {\r\n return (array: any[], index: number, value: any) => {\r\n if (!array[index]) {\r\n array[index] = {};\r\n }\r\n array[index][propertyPath] = value;\r\n };\r\n } else {\r\n const segments = propertyPath.split(\".\");\r\n const lastIndex = segments.length - 1;\r\n return (array: any[], index: number, value: any) => {\r\n if (!array[index]) {\r\n array[index] = {};\r\n }\r\n let current = array[index];\r\n for (let i = 0; i < lastIndex; i++) {\r\n const segment = segments[i];\r\n if (!current[segment]) current[segment] = {};\r\n current = current[segment];\r\n }\r\n current[segments[lastIndex]] = value;\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Set nested value in array element\r\n */\r\nfunction setNestedValueInArrayElement(\r\n array: any[],\r\n index: number,\r\n propertyPath: string,\r\n value: any\r\n): void {\r\n const setter = createArrayElementSetter(propertyPath);\r\n setter(array, index, value);\r\n}\r\n\r\n/**\r\n * Get nested value from object using dot notation\r\n * NOTE: This should only be used for paths where we don't have pre-compiled accessors\r\n */\r\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\r\n // NOTE: This should only be used as fallback when pre-compiled accessors aren't available\r\n // For optimal performance, use pre-compiled accessors from the validator factory cache\r\n const accessor = createNestedValueAccessor(path);\r\n return accessor(obj);\r\n}\r\n\r\n// NOTE: Existence checker creation moved to validator factory local cache to avoid memory leaks\r\nfunction createExistenceChecker(path: string): (obj: any) => boolean {\r\n // Create existence checker without global caching - should be managed by validator factory\r\n if (!path.includes(DOT)) {\r\n return (obj: any) => path in obj;\r\n } else {\r\n const parts = path.split(DOT);\r\n const lastIndex = parts.length - 1;\r\n return (obj: any) => {\r\n let current = obj;\r\n for (let i = 0; i < lastIndex; i++) {\r\n const part = parts[i];\r\n if (\r\n !(part in current) ||\r\n current[part] == null ||\r\n typeof current[part] !== \"object\"\r\n ) {\r\n return false;\r\n }\r\n current = current[part];\r\n }\r\n const finalPart = parts[lastIndex];\r\n return finalPart in current;\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Check if a field path exists in the object (not just returns undefined)\r\n */\r\nfunction hasNestedField(obj: Record<string, unknown>, path: string): boolean {\r\n const checker = createExistenceChecker(path);\r\n return checker(obj);\r\n}\r\n\r\n/**\r\n * Check if a validator set contains the optional plugin\r\n */\r\nfunction hasOptionalValidator(\r\n allValidators: Map<string, any>,\r\n fieldPath: string\r\n): boolean {\r\n const validator = allValidators.get(fieldPath);\r\n if (!validator) {\r\n // console.log(`DEBUG: No validator found for ${fieldPath}`);\r\n return false;\r\n }\r\n\r\n // console.log(`DEBUG: Checking ${fieldPath}, validator:`, Object.keys(validator));\r\n\r\n // Check if any validator in the set has name 'optional'\r\n const checkValidatorSet = (validatorSet: any) => {\r\n if (validatorSet?._validators) {\r\n // console.log(`DEBUG: Found _validators:`, validatorSet._validators.map((v: any) => v.name));\r\n return validatorSet._validators.some((v: any) => v.name === \"optional\");\r\n }\r\n if (validatorSet?.validators) {\r\n // console.log(`DEBUG: Found validators:`, validatorSet.validators.map((v: any) => v.name));\r\n return validatorSet.validators.some((v: any) => v.name === \"optional\");\r\n }\r\n if (validatorSet?.validate) {\r\n // Check if this is a unified validator with internal structure\r\n // console.log(`DEBUG: Found unified validator for ${fieldPath}`);\r\n return false; // For now, assume unified validators don't expose this info easily\r\n }\r\n // console.log(`DEBUG: Unknown validator structure for ${fieldPath}:`, Object.keys(validatorSet));\r\n return false;\r\n };\r\n\r\n return checkValidatorSet(validator);\r\n}\r\n\r\n// NOTE: Setter creation moved to validator factory local cache to avoid memory leaks\r\nfunction createGlobalSetter(path: string): (obj: any, value: any) => void {\r\n // Create setter without global caching - should be managed by validator factory\r\n if (!path.includes(DOT)) {\r\n return (obj: any, value: any) => {\r\n obj[path] = value;\r\n };\r\n } else {\r\n const parts = path.split(DOT);\r\n const lastIndex = parts.length - 1;\r\n return (obj: any, value: any) => {\r\n let current = obj;\r\n for (let i = 0; i < lastIndex; i++) {\r\n const part = parts[i];\r\n if (!(part in current) || typeof current[part] !== \"object\") {\r\n current[part] = {};\r\n }\r\n current = current[part];\r\n }\r\n current[parts[lastIndex]] = value;\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Set nested value in object using dot notation\r\n */\r\nfunction setNestedValue(\r\n obj: Record<string, any>,\r\n path: string,\r\n value: any\r\n): void {\r\n const setter = createGlobalSetter(path);\r\n setter(obj, value);\r\n}\r\n\r\n/**\r\n * Validate array element path (e.g., items[*].name)\r\n */\r\nfunction validateArrayElementPath(\r\n fieldPath: string,\r\n validator: any,\r\n obj: Record<string, unknown>,\r\n rootData: any,\r\n abortEarly: boolean,\r\n abortEarlyOnEachField: boolean\r\n): Array<{\r\n path: string;\r\n code: string;\r\n message: string;\r\n paths: () => string[];\r\n}> {\r\n const errors: Array<{\r\n path: string;\r\n code: string;\r\n message: string;\r\n paths: () => string[];\r\n }> = [];\r\n\r\n // Parse the array element path\r\n let arrayPath: string;\r\n let elementField: string;\r\n\r\n const bracketMatch = fieldPath.match(/^([^\\[]+)\\[\\*\\]\\.(.+)$/);\r\n if (bracketMatch) {\r\n arrayPath = bracketMatch[1];\r\n elementField = bracketMatch[2];\r\n } else {\r\n const dotMatch = fieldPath.match(/^([^\\.]+)\\.\\*\\.(.+)$/);\r\n if (dotMatch) {\r\n arrayPath = dotMatch[1];\r\n elementField = dotMatch[2];\r\n } else {\r\n // Check if this is a direct array element path like \"categories[*]\"\r\n const directBracketMatch = fieldPath.match(/^([^\\[]+)\\[\\*\\]$/);\r\n if (directBracketMatch) {\r\n arrayPath = directBracketMatch[1];\r\n elementField = \"\"; // No specific field, validate the whole element\r\n } else {\r\n return errors;\r\n }\r\n }\r\n }\r\n\r\n // Get the array\r\n const arrayData = getNestedValue(obj, arrayPath);\r\n if (!Array.isArray(arrayData)) {\r\n // Not an array, skip validation\r\n return errors;\r\n }\r\n\r\n // Special handling for direct array element validation (e.g., \"matrix[*]\")\r\n if (elementField === \"\") {\r\n // Validate each element individually\r\n for (let i = 0; i < arrayData.length; i++) {\r\n const element = arrayData[i];\r\n const elementPath = `${arrayPath}[${i}]`;\r\n \r\n const result = validator.validate(element, rootData, {\r\n abortEarlyOnEachField,\r\n });\r\n \r\n if (!result.valid) {\r\n if (result.errors && result.errors.length > 0) {\r\n for (const error of result.errors) {\r\n errors.push({\r\n path: error.path ? `${elementPath}.${error.path}` : elementPath,\r\n code: error.code || \"VALIDATION_ERROR\",\r\n message: error.message || \"Validation failed\",\r\n paths: () => [error.path ? `${elementPath}.${error.path}` : elementPath],\r\n });\r\n }\r\n } else {\r\n errors.push({\r\n path: elementPath,\r\n code: \"VALIDATION_ERROR\",\r\n message: \"Validation failed\",\r\n paths: () => [elementPath],\r\n });\r\n }\r\n \r\n if (abortEarly) {\r\n break;\r\n }\r\n }\r\n }\r\n return errors;\r\n }\r\n\r\n // Skip element validation if array is empty\r\n if (arrayData.length === 0) {\r\n return errors;\r\n }\r\n\r\n // Regular field validation for each element\r\n for (let i = 0; i < arrayData.length; i++) {\r\n const element = arrayData[i];\r\n\r\n // Specific field validation (e.g., \"categories[*].name\")\r\n if (!element || typeof element !== \"object\") {\r\n continue;\r\n }\r\n\r\n const elementValue = getNestedValue(element, elementField);\r\n const elementPath = `${arrayPath}[${i}].${elementField}`;\r\n\r\n const result = validator.validate(elementValue, rootData, {\r\n abortEarlyOnEachField,\r\n });\r\n\r\n if (!result.valid) {\r\n if (result.errors && result.errors.length > 0) {\r\n for (const error of result.errors) {\r\n errors.push({\r\n path: error.path || elementPath,\r\n code: error.code || \"VALIDATION_ERROR\",\r\n message: error.message || \"Validation failed\",\r\n paths: () => [error.path || elementPath],\r\n });\r\n }\r\n } else {\r\n errors.push({\r\n path: elementPath,\r\n code: \"VALIDATION_ERROR\",\r\n message: \"Validation failed\",\r\n paths: () => [elementPath],\r\n });\r\n }\r\n\r\n if (abortEarly) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return errors;\r\n}\r\n\r\n/**\r\n * Create recursive validator wrapper\r\n */\r\nfunction createRecursiveValidator(\r\n originalValidator: UnifiedValidator,\r\n targetValidator: UnifiedValidator | null,\r\n fieldPath: string,\r\n targetFieldPath: string,\r\n maxDepth: number,\r\n fieldDefinitions: Array<{ path: string; builderFunction: Function }>,\r\n plugins: Record<string, any>,\r\n allFieldValidators?: Map<string, UnifiedValidator>\r\n): UnifiedValidator {\r\n const validateRecursive = (\r\n value: any,\r\n rootData: any,\r\n currentDepth: number,\r\n currentPath: string,\r\n visitedSet: WeakSet<object>,\r\n options?: { abortEarlyOnEachField?: boolean }\r\n ): { valid: boolean; errors: any[] } => {\r\n // Check max depth\r\n if (currentDepth > maxDepth) {\r\n return { valid: true, errors: [] };\r\n }\r\n\r\n // Check for circular reference\r\n if (value && typeof value === \"object\" && visitedSet.has(value)) {\r\n return { valid: true, errors: [] };\r\n }\r\n\r\n if (value && typeof value === \"object\") {\r\n visitedSet.add(value);\r\n }\r\n\r\n // Handle null/undefined values properly for nullable/optional fields\r\n if (value === null || value === undefined) {\r\n // For null/undefined values, only validate with the original validator\r\n // The original validator should handle nullable/optional logic properly\r\n const originalResult = originalValidator.validate(\r\n value,\r\n rootData,\r\n options\r\n );\r\n if (!originalResult.valid) {\r\n // Map errors to correct path\r\n const mappedErrors = originalResult.errors.map((e) => ({\r\n ...e,\r\n path: currentPath,\r\n }));\r\n return { valid: false, errors: mappedErrors };\r\n }\r\n // If null/undefined is valid, don't proceed with recursive validation\r\n return { valid: true, errors: [] };\r\n }\r\n\r\n // First validate the current field with original validators\r\n const originalResult = originalValidator.validate(value, rootData, options);\r\n if (!originalResult.valid) {\r\n // Map errors to correct path\r\n const mappedErrors = originalResult.errors.map((e) => ({\r\n ...e,\r\n path: currentPath,\r\n }));\r\n return { valid: false, errors: mappedErrors };\r\n }\r\n\r\n // Handle special keywords\r\n if (targetFieldPath === \"__Self\") {\r\n // Apply all field validators from the root type\r\n if (value && typeof value === \"object\" && allFieldValidators) {\r\n const errors: any[] = [];\r\n // For recursive validation, don't abort early between fields - validate all fields in the nested object\r\n\r\n // Apply all validators to the nested object, except the current recursive field to prevent infinite recursion\r\n for (const [validatorFieldPath, validator] of allFieldValidators) {\r\n // Skip the current recursive field to prevent infinite recursion\r\n if (validatorFieldPath === fieldPath) continue;\r\n\r\n // Handle array element validators with [*] notation\r\n if (validatorFieldPath.includes(\"[*]\")) {\r\n const arrayElementAccessor =\r\n createArrayElementAccessor(validatorFieldPath);\r\n const arrayResult = arrayElementAccessor(value);\r\n\r\n if (arrayResult) {\r\n const { elements, basePath, elementPath } = arrayResult;\r\n\r\n // Validate each array element\r\n elements.forEach((element, index) => {\r\n const elementResult = validator.validate(\r\n element,\r\n rootData,\r\n options\r\n );\r\n\r\n if (!elementResult.valid) {\r\n // Map errors to correct array element path\r\n for (const error of elementResult.errors) {\r\n const elementErrorPath = elementPath\r\n ? `${currentPath}.${basePath}[${index}].${elementPath}`\r\n : `${currentPath}.${basePath}[${index}]`;\r\n errors.push({\r\n ...error,\r\n path: elementErrorPath,\r\n });\r\n }\r\n }\r\n });\r\n }\r\n continue;\r\n }\r\n\r\n // Get field value from nested object\r\n const fieldAccessor = createNestedValueAccessor(validatorFieldPath);\r\n const fieldValue = fieldAccessor(value);\r\n\r\n // Validate field\r\n const fieldResult = validator.validate(fieldValue, rootData, options);\r\n if (!fieldResult.valid) {\r\n // Map errors to nested path\r\n for (const error of fieldResult.errors) {\r\n errors.push({\r\n ...error,\r\n path: `${currentPath}.${error.path}`,\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Recursively check nested self-referential fields\r\n for (const [validatorFieldPath, validator] of allFieldValidators) {\r\n // Skip the current recursive field to prevent infinite recursion\r\n if (validatorFieldPath === fieldPath) continue;\r\n\r\n // Handle array element recursive validation\r\n if (validatorFieldPath.includes(\"[*]\")) {\r\n const arrayElementAccessor =\r\n createArrayElementAccessor(validatorFieldPath);\r\n const arrayResult = arrayElementAccessor(value);\r\n\r\n if (arrayResult) {\r\n const { elements, basePath, elementPath } = arrayResult;\r\n\r\n // Check if each array element should be recursively validated\r\n elements.forEach((element, index) => {\r\n if (element && typeof element === \"object\") {\r\n // Check if this field has recursive marker\r\n const fieldDef = fieldDefinitions.find(\r\n (fd) => fd.path === validatorFieldPath\r\n );\r\n if (fieldDef?.builderFunction) {\r\n const fieldContext = createFieldContext(\r\n validatorFieldPath,\r\n plugins\r\n );\r\n let fieldBuilt = fieldDef.builderFunction(fieldContext);\r\n if (fieldBuilt?.build) fieldBuilt = fieldBuilt.build();\r\n\r\n const hasRecursive = fieldBuilt?._validators?.some?.(\r\n (v: any) => v.__isRecursive === true\r\n );\r\n if (hasRecursive) {\r\n const elementCurrentPath = elementPath\r\n ? `${currentPath}.${basePath}[${index}].${elementPath}`\r\n : `${currentPath}.${basePath}[${index}]`;\r\n\r\n const recursiveResult = validateRecursive(\r\n element,\r\n rootData,\r\n currentDepth + 1,\r\n elementCurrentPath,\r\n visitedSet,\r\n options\r\n );\r\n if (!recursiveResult.valid) {\r\n errors.push(...recursiveResult.errors);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n continue;\r\n }\r\n\r\n // Check if this field is also marked as recursive\r\n const fieldValue =\r\n createNestedValueAccessor(validatorFieldPath)(value);\r\n if (fieldValue && typeof fieldValue === \"object\") {\r\n // Check if this field has recursive marker\r\n const fieldDef = fieldDefinitions.find(\r\n (fd) => fd.path === validatorFieldPath\r\n );\r\n let fieldBuilt = null;\r\n if (fieldDef?.builderFunction) {\r\n const fieldContext = createFieldContext(\r\n validatorFieldPath,\r\n plugins\r\n );\r\n fieldBuilt = fieldDef.builderFunction(fieldContext);\r\n if (fieldBuilt?.build) fieldBuilt = fieldBuilt.build();\r\n }\r\n\r\n const hasRecursive = fieldBuilt?._validators?.some?.(\r\n (v: any) => v.__isRecursive === true\r\n );\r\n if (hasRecursive) {\r\n const recursiveResult = validateRecursive(\r\n fieldValue,\r\n rootData,\r\n currentDepth + 1,\r\n `${currentPath}.${validatorFieldPath}`,\r\n visitedSet,\r\n options\r\n );\r\n if (!recursiveResult.valid) {\r\n errors.push(...recursiveResult.errors);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (errors.length > 0) {\r\n return { valid: false, errors };\r\n }\r\n }\r\n } else if (targetFieldPath === \"__Element\") {\r\n // For array elements, apply all validators\r\n if (Array.isArray(value)) {\r\n const errors: any[] = [];\r\n // For array element validation, don't abort early between fields - validate all fields in each element\r\n\r\n for (let i = 0; i < value.length; i++) {\r\n const element = value[i];\r\n if (element && typeof element === \"object\" && allFieldValidators) {\r\n // Apply all validators to each element\r\n for (const [validatorFieldPath, validator] of allFieldValidators) {\r\n // Skip array element validators\r\n if (validatorFieldPath.includes(\"[*]\")) continue;\r\n\r\n // Get field value from element\r\n const fieldAccessor =\r\n createNestedValueAccessor(validatorFieldPath);\r\n const fieldValue = fieldAccessor(element);\r\n\r\n // Validate field\r\n const fieldResult = validator.validate(\r\n fieldValue,\r\n rootData,\r\n options\r\n );\r\n if (!fieldResult.valid) {\r\n // Map errors to element path\r\n for (const error of fieldResult.errors) {\r\n errors.push({\r\n ...error,\r\n path: `${currentPath}[${i}].${error.path}`,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (errors.length > 0) {\r\n return { valid: false, errors };\r\n }\r\n }\r\n } else if (targetValidator) {\r\n // Regular field path - apply specific field validators\r\n if (value && typeof value === \"object\") {\r\n const errors: any[] = [];\r\n const abortEarly = options?.abortEarlyOnEachField !== false;\r\n\r\n // Get the target field path pattern\r\n const targetPathParts = targetFieldPath.split(\".\");\r\n const fieldName = targetPathParts[targetPathParts.length - 1];\r\n\r\n // Handle arrays\r\n if (Array.isArray(value)) {\r\n for (let i = 0; i < value.length; i++) {\r\n const element = value[i];\r\n if (element && typeof element === \"object\") {\r\n // Check if element has the target field\r\n if (fieldName in element) {\r\n const elementFieldValue = element[fieldName];\r\n const elementPath = `${currentPath}[${i}].${fieldName}`;\r\n\r\n // Recursively validate\r\n const elementResult = validateRecursive(\r\n elementFieldValue,\r\n rootData,\r\n currentDepth + 1,\r\n elementPath,\r\n visitedSet,\r\n options\r\n );\r\n\r\n if (!elementResult.valid) {\r\n errors.push(...elementResult.errors);\r\n if (abortEarly) {\r\n return { valid: false, errors };\r\n }\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n // Handle objects\r\n if (fieldName in value) {\r\n const nestedFieldValue = value[fieldName];\r\n const nestedPath = `${currentPath}.${fieldName}`;\r\n\r\n // Recursively validate\r\n const nestedResult = validateRecursive(\r\n nestedFieldValue,\r\n rootData,\r\n currentDepth + 1,\r\n nestedPath,\r\n visitedSet,\r\n options\r\n );\r\n\r\n if (!nestedResult.valid) {\r\n errors.push(...nestedResult.errors);\r\n if (abortEarly) {\r\n return { valid: false, errors };\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (errors.length > 0) {\r\n return { valid: false, errors };\r\n }\r\n }\r\n }\r\n\r\n // Clean up visited set\r\n if (value && typeof value === \"object\") {\r\n visitedSet.delete(value);\r\n }\r\n\r\n return { valid: true, errors: [] };\r\n };\r\n\r\n return {\r\n validate: (\r\n value: any,\r\n rootData: any,\r\n options?: { abortEarlyOnEachField?: boolean }\r\n ) => {\r\n const visitedSet = new WeakSet<object>();\r\n return validateRecursive(\r\n value,\r\n rootData,\r\n 0,\r\n fieldPath,\r\n visitedSet,\r\n options\r\n );\r\n },\r\n\r\n parse: (\r\n value: any,\r\n rootData: any,\r\n options?: { abortEarlyOnEachField?: boolean }\r\n ) => {\r\n const visitedSet = new WeakSet<object>();\r\n // For now, parse behaves the same as validate\r\n // In the future, we might want to handle transforms recursively\r\n const result = validateRecursive(\r\n value,\r\n rootData,\r\n 0,\r\n fieldPath,\r\n visitedSet,\r\n options\r\n );\r\n if (!result.valid) {\r\n return { ...result, data: undefined };\r\n }\r\n return { valid: true, data: value, errors: [] };\r\n },\r\n\r\n accessor: originalValidator.accessor,\r\n };\r\n}\r\n\r\n/**\r\n * Create array element recursive validator wrapper\r\n * Specialized for handling array element recursive validation with [*] notation\r\n */\r\nfunction createArrayElementRecursiveValidator(\r\n originalValidator: UnifiedValidator,\r\n fieldPath: string,\r\n targetFieldPath: string,\r\n maxDepth: number,\r\n fieldDefinitions: Array<{ path: string; builderFunction: Function }>,\r\n plugins: Record<string, any>,\r\n allFieldValidators?: Map<string, UnifiedValidator>\r\n): UnifiedValidator {\r\n const parseResult = parseFieldPath(fieldPath);\r\n\r\n return {\r\n validate: (arrayValue: any, rootData: any, options?: ValidationOptions) => {\r\n // Handle null/undefined arrays\r\n if (arrayValue === null || arrayValue === undefined) {\r\n return originalValidator.validate(arrayValue, rootData, options);\r\n }\r\n\r\n // Must be an array for array element validation\r\n if (!Array.isArray(arrayValue)) {\r\n return originalValidator.validate(arrayValue, rootData, options);\r\n }\r\n\r\n const errors: any[] = [];\r\n const visitedSet = new WeakSet<object>();\r\n\r\n // Apply recursive validation to each array element\r\n arrayValue.forEach((element, index) => {\r\n if (element && typeof element === \"object\") {\r\n // Apply all field validators to each element with __Self logic\r\n if (targetFieldPath === \"__Self\" && allFieldValidators) {\r\n for (const [validatorFieldPath, validator] of allFieldValidators) {\r\n // For recursive array element validation, we want to apply validators that match our array pattern\r\n if (validatorFieldPath.includes(\"[*]\")) {\r\n // Check if this validator is for the same array pattern\r\n const currentArrayPattern = parseResult.baseArrayPath + \"[*]\";\r\n if (validatorFieldPath.startsWith(currentArrayPattern)) {\r\n // Extract the field path after the array pattern\r\n const fieldPathAfterArray = validatorFieldPath.slice(\r\n currentArrayPattern.length\r\n );\r\n\r\n let fieldValue: any;\r\n let targetPath: string;\r\n let elementFieldPath: string;\r\n\r\n if (fieldPathAfterArray === \"\") {\r\n // This is the array element validator itself (categories[*])\r\n // Skip to avoid infinite recursion\r\n continue;\r\n } else if (fieldPathAfterArray.startsWith(\".\")) {\r\n // This is a field of the array element (categories[*].id)\r\n elementFieldPath = fieldPathAfterArray.slice(1); // Remove leading dot\r\n fieldValue =\r\n createNestedValueAccessor(elementFieldPath)(element);\r\n targetPath = parseResult.baseArrayPath\r\n ? `${parseResult.baseArrayPath}[${index}].${elementFieldPath}`\r\n : `[${index}].${elementFieldPath}`;\r\n } else {\r\n continue;\r\n }\r\n\r\n // Validate field\r\n const fieldResult = validator.validate(\r\n fieldValue,\r\n rootData,\r\n options\r\n );\r\n if (!fieldResult.valid) {\r\n // Map errors to array element path\r\n for (const error of fieldResult.errors) {\r\n errors.push({\r\n ...error,\r\n path: targetPath,\r\n });\r\n }\r\n }\r\n }\r\n continue;\r\n }\r\n\r\n // Skip validators that don't apply to our array\r\n // (These would be validators for other fields)\r\n continue;\r\n }\r\n\r\n // For each element that has recursive fields (like subcategories), apply recursive validation\r\n for (const [validatorFieldPath, validator] of allFieldValidators) {\r\n if (validatorFieldPath.includes(\"[*]\")) {\r\n const currentArrayPattern = parseResult.baseArrayPath + \"[*]\";\r\n if (validatorFieldPath.startsWith(currentArrayPattern)) {\r\n const fieldPathAfterArray = validatorFieldPath.slice(\r\n currentArrayPattern.length\r\n );\r\n\r\n if (fieldPathAfterArray.startsWith(\".\")) {\r\n const elementFieldPath = fieldPathAfterArray.slice(1);\r\n\r\n // Check if this field itself is an array that needs recursive validation\r\n const elementFieldValue =\r\n createNestedValueAccessor(elementFieldPath)(element);\r\n if (Array.isArray(elementFieldValue)) {\r\n // This is a nested array field (like subcategories)\r\n // Apply recursive validation to it\r\n\r\n // Recursively validate each element in the nested array\r\n elementFieldValue.forEach(\r\n (nestedElement, nestedIndex) => {\r\n if (\r\n nestedElement &&\r\n typeof nestedElement === \"object\"\r\n ) {\r\n // Apply all same-pattern validators to nested elements\r\n for (const [\r\n nestedValidatorPath,\r\n nestedValidator,\r\n ] of allFieldValidators) {\r\n if (\r\n nestedValidatorPath.includes(\"[*]\") &&\r\n nestedValidatorPath.startsWith(\r\n currentArrayPattern\r\n )\r\n ) {\r\n const nestedFieldAfterArray =\r\n nestedValidatorPath.slice(\r\n currentArrayPattern.length\r\n );\r\n if (\r\n nestedFieldAfterArray.startsWith(\".\") &&\r\n nestedFieldAfterArray !==\r\n \".\" + elementFieldPath\r\n ) {\r\n // This is a validator for a field in the nested object\r\n const nestedFieldPath =\r\n nestedFieldAfterArray.slice(1);\r\n const nestedFieldValue =\r\n createNestedValueAccessor(nestedFieldPath)(\r\n nestedElement\r\n );\r\n const nestedTargetPath = `${parseResult.baseArrayPath}[${index}].${elementFieldPath}[${nestedIndex}].${nestedFieldPath}`;\r\n\r\n const nestedResult = nestedValidator.validate(\r\n nestedFieldValue,\r\n rootData,\r\n options\r\n );\r\n if (!nestedResult.valid) {\r\n for (const error of nestedResult.errors) {\r\n errors.push({\r\n ...error,\r\n path: nestedTargetPath,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors: errors,\r\n };\r\n },\r\n\r\n parse: (arrayValue: any, rootData: any, options?: any) => {\r\n // For array element recursive validation, we delegate to the original validator\r\n // since parsing is handled at the array level, not element level\r\n return originalValidator.parse(arrayValue, rootData, options);\r\n },\r\n\r\n accessor: originalValidator.accessor,\r\n };\r\n}\r\n\r\n/**\r\n * Check if an actual field path matches a pattern with wildcards\r\n * e.g., \"users[0].profile.tags\" matches \"users[*].profile.tags\"\r\n */\r\nfunction matchesFieldPattern(actualPath: string, patternPath: string): boolean {\r\n // Convert pattern path to regex by replacing [*] with [number]\r\n const regexPattern = \"^\" + patternPath.replace(/\\[\\*\\]/g, \"\\\\[\\\\d+\\\\]\") + \"$\";\r\n const regex = new RegExp(regexPattern);\r\n return regex.test(actualPath);\r\n}\r\n\r\n/**\r\n * PickValidatorFactory - Factory dedicated to pick functionality\r\n */\r\nfunction createPickValidatorFactory<TObject extends object>(\r\n fieldDefinitions: FieldDefinition[],\r\n plugins: Record<string, any>,\r\n buildValidators?: any, // Pass the buildValidators function for re-use\r\n originalValidator?: any // Pass the original validator for error filtering\r\n) {\r\n /**\r\n * Create a picked validator for a specific field\r\n */\r\n function createPickedValidator<K extends NestedKeyOf<TObject>>(\r\n key: K\r\n ): FieldValidator<TObject, TypeOfPath<TObject, K>> {\r\n const keyPath = key as string;\r\n const targetFieldDef = fieldDefinitions.find((fd) => fd.path === keyPath);\r\n \r\n // Find related field definitions (array elements, nested fields, etc.)\r\n const relatedFieldDefs = fieldDefinitions.filter((fd) => {\r\n // Include the main field\r\n if (fd.path === keyPath) return true;\r\n \r\n // Include array element patterns like \"field[*]\", \"field[*].subfield\"\r\n if (fd.path.startsWith(keyPath + \"[*]\")) return true;\r\n \r\n // Include dot-star patterns like \"field.*.subfield\" \r\n if (fd.path.startsWith(keyPath + \".*\")) return true;\r\n \r\n // Include nested dot patterns like \"field.subfield\"\r\n if (fd.path.startsWith(keyPath + \".\")) return true;\r\n \r\n return false;\r\n });\r\n\r\n\r\n if (!targetFieldDef && relatedFieldDefs.length === 0) {\r\n // Return a validator that always passes if field not found\r\n return {\r\n validate: () => ({\r\n valid: true,\r\n value: undefined as any,\r\n errors: [],\r\n }),\r\n parse: () => ({\r\n valid: true,\r\n value: undefined as any,\r\n errors: [],\r\n }),\r\n };\r\n }\r\n\r\n // If we have related field definitions (like array elements), create a comprehensive validator\r\n if (relatedFieldDefs.length > 1) {\r\n // Get the related field paths for filtering\r\n const relatedPaths = new Set(relatedFieldDefs.map(fd => fd.path));\r\n \r\n return {\r\n validate: (value: TypeOfPath<TObject, K> | null, allValues?: Partial<TObject>, options?: ValidationOptions): ValidationResult<TypeOfPath<TObject, K>> => {\r\n // If we have the original validator, use it with error filtering (best approach)\r\n if (originalValidator) {\r\n // Create temporary object with the picked value at the original key path\r\n const tempObject = { [keyPath]: value };\r\n \r\n // Validate using the original validator\r\n const result = originalValidator.validate(tempObject, options);\r\n \r\n // Filter errors to only include the related field paths using pattern matching\r\n const filteredErrors = result.valid ? [] : (result.errors || []).filter((error: any) => {\r\n // Check if the error path matches any of the related patterns\r\n for (const relatedPath of relatedPaths) {\r\n if (matchesFieldPattern(error.path, relatedPath)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n \r\n return {\r\n valid: filteredErrors.length === 0,\r\n value: filteredErrors.length === 0 ? value : null,\r\n errors: filteredErrors,\r\n };\r\n }\r\n \r\n // Fallback: create individual field validators (if original validator not available)\r\n const allErrors: any[] = [];\r\n \r\n for (const fieldDef of relatedFieldDefs) {\r\n const validator = createUnifiedValidator(fieldDef as any, plugins);\r\n const fieldResult = validator.validate({ [keyPath]: value }, { [keyPath]: value }, options);\r\n if (!fieldResult.valid && fieldResult.errors) {\r\n allErrors.push(...fieldResult.errors);\r\n }\r\n }\r\n \r\n return {\r\n valid: allErrors.length === 0,\r\n value: allErrors.length === 0 ? value : null,\r\n errors: allErrors,\r\n };\r\n },\r\n parse: (value: TypeOfPath<TObject, K> | null, allValues?: Partial<TObject>, options?: ValidationOptions): ValidationResult<TypeOfPath<TObject, K>> => {\r\n // If we have the original validator, use it with error filtering\r\n if (originalValidator) {\r\n // Create temporary object with the picked value at the original key path\r\n const tempObject = { [keyPath]: value };\r\n \r\n // Parse using the original validator\r\n const result = originalValidator.parse(tempObject, options);\r\n \r\n // Filter errors if validation failed using pattern matching\r\n if (!result.valid) {\r\n const filteredErrors = (result.errors || []).filter((error: any) => {\r\n // Check if the error path matches any of the related patterns\r\n for (const relatedPath of relatedPaths) {\r\n if (matchesFieldPattern(error.path, relatedPath)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n \r\n if (filteredErrors.length > 0) {\r\n return {\r\n valid: false,\r\n value: undefined as any,\r\n errors: filteredErrors,\r\n };\r\n }\r\n }\r\n \r\n // If validation passed or no related errors, extract the parsed value\r\n const parsedData = result.valid ? result.value : tempObject;\r\n const extractedValue = parsedData && parsedData[keyPath] !== undefined ? parsedData[keyPath] : value;\r\n return {\r\n valid: true,\r\n value: extractedValue as TypeOfPath<TObject, K>,\r\n errors: [],\r\n };\r\n }\r\n \r\n // Fallback: simple validation using individual validators\r\n const allErrors: any[] = [];\r\n \r\n for (const fieldDef of relatedFieldDefs) {\r\n const validator = createUnifiedValidator(fieldDef as any, plugins);\r\n const fieldResult = validator.validate({ [keyPath]: value }, { [keyPath]: value }, options);\r\n if (!fieldResult.valid && fieldResult.errors) {\r\n allErrors.push(...fieldResult.errors);\r\n }\r\n }\r\n \r\n return {\r\n valid: allErrors.length === 0,\r\n value: allErrors.length === 0 ? value as TypeOfPath<TObject, K> : null as any,\r\n errors: allErrors,\r\n };\r\n },\r\n };\r\n }\r\n\r\n // Fallback to single field validation\r\n if (!targetFieldDef) {\r\n return {\r\n validate: () => ({ valid: true, value: undefined as any, errors: [] }),\r\n parse: () => ({ valid: true, value: undefined as any, errors: [] }),\r\n };\r\n }\r\n\r\n // Build individual field validator\r\n const context = createFieldContext(targetFieldDef.path, plugins);\r\n if (!targetFieldDef.builderFunction) {\r\n throw new Error(`Field definition for path '${targetFieldDef.path}' is missing builderFunction`);\r\n }\r\n const builtField = targetFieldDef.builderFunction(context);\r\n\r\n // Use the same optimization strategy detection\r\n const fieldWithBuilder = {\r\n path: targetFieldDef.path,\r\n builderFunction:\r\n targetFieldDef.builderFunction ||\r\n (() => {\r\n throw new Error(\r\n `Field ${targetFieldDef.path} uses object definition form`\r\n );\r\n }),\r\n };\r\n const strategies = selectOptimalStrategies([fieldWithBuilder], plugins);\r\n const fieldStrategy = strategies.get(targetFieldDef.path);\r\n\r\n let fieldValidator: any;\r\n\r\n // V8 optimization: Using Unified validator\r\n fieldValidator = createUnifiedValidator(targetFieldDef as any, plugins);\r\n\r\n return {\r\n validate: (\r\n value?: TypeOfPath<TObject, K> | null,\r\n allValues?: Partial<TObject>,\r\n options?: any\r\n ): ValidationResult<TypeOfPath<TObject, K>> => {\r\n // Create a mock object with just this field for validation context\r\n const mockObject = { ...allValues } as Record<string, unknown>;\r\n setNestedValue(mockObject, key as string, value);\r\n\r\n const fieldValue = getNestedValue(mockObject, key as string);\r\n\r\n // V8 optimization: Unified validator interface\r\n const result = fieldValidator.validate(fieldValue, mockObject, options);\r\n\r\n return {\r\n valid: result.valid,\r\n value: result.valid ? (value ?? null) : null,\r\n errors: result.errors || [],\r\n };\r\n },\r\n \r\n parse: (\r\n value?: TypeOfPath<TObject, K> | null,\r\n allValues?: Partial<TObject>,\r\n options?: any\r\n ) => {\r\n // Create a mock object with just this field for parse context\r\n const mockObject = { ...allValues } as Record<string, unknown>;\r\n setNestedValue(mockObject, key as string, value);\r\n\r\n const fieldValue = getNestedValue(mockObject, key as string);\r\n\r\n // V8 optimization: Unified validator interface for parse\r\n const result = fieldValidator.parse(fieldValue, mockObject, options);\r\n\r\n return {\r\n valid: result.valid,\r\n value: result.valid ? (result.data !== undefined ? result.data : value) : null,\r\n errors: result.errors || [],\r\n };\r\n },\r\n };\r\n }\r\n\r\n return {\r\n createPickedValidator,\r\n };\r\n}\r\n", "/**\r\n * Refactored Field Builder - Streamlined through separation of concerns\r\n * Focused on core builder logic\r\n */\r\n\r\nimport { NestedKeyOf, TypeOfPath } from \"../../../types/util\";\r\nimport type {\r\n FieldBuilder,\r\n FieldBuilderContext,\r\n AddFieldTransform,\r\n ExtractFieldType,\r\n ApplyFieldTransforms as ApplyNestedTransforms,\r\n TransformAwareValidator,\r\n MissingFields,\r\n FieldDefinition as FieldDefinitionType,\r\n} from \"../plugins/plugin-types\";\r\nimport type { FieldConfig, FieldOptions } from \"../types/field-options\";\r\nimport { normalizeFieldConfig } from \"../types/field-options\";\r\nimport type { FieldRule } from \"../../registry/plugin-registry\";\r\nimport { FieldBuilderDefinition } from \"../types/types\";\r\nimport { createValidatorFactory, FieldDefinition } from \"../validator-factory\";\r\nimport { DOT } from \"../../../constants\";\r\nimport { createFieldContext } from \"../context/field-context\";\r\n\r\n// Re-export types from plugin-types\r\nexport type { FieldBuilder } from \"../plugins/plugin-types\";\r\nexport type { FieldBuilderDefinition } from \"../types/types\";\r\n\r\n/**\r\n * Streamlined FieldBuilder implementation focused on core building logic\r\n */\r\nexport function createFieldBuilderImpl<\r\n TObject extends object,\r\n TMap = {},\r\n TPlugins = {},\r\n TDeclaredFields extends string = never,\r\n>(\r\n plugins: TPlugins,\r\n chainableBuilder: any,\r\n fieldDefinitions: Array<FieldBuilderDefinition> = [],\r\n isStrict: boolean = false\r\n): FieldBuilder<TObject, TMap, TPlugins, TDeclaredFields> {\r\n // Store field definitions for deferred building with type safety\r\n const _fieldDefinitions = [...fieldDefinitions];\r\n const _isStrict = isStrict;\r\n\r\n // Cached validator factory for performance\r\n let _validatorFactory:\r\n | ReturnType<typeof createValidatorFactory<TObject, TMap>>\r\n | undefined;\r\n\r\n /**\r\n * Infer field type from path at compile time\r\n */\r\n const inferFieldType = <Key extends string>(path: Key): string => {\r\n // Basic inference - can be enhanced with more sophisticated type checking\r\n if (path.includes(DOT)) return \"nested\";\r\n return \"scalar\";\r\n };\r\n\r\n /**\r\n * @deprecated Use `v` method instead. This method will be removed in a future version.\r\n * Add a field with type-safe validation and optional field configuration\r\n * Ensures path exists in TObject at compile time\r\n * WIP: Does not validate unknown properties by default\r\n */\r\n const field = <Key extends NestedKeyOf<TObject> & string, TFieldBuilder>(\r\n path: Key,\r\n definition: FieldDefinitionType<\r\n TObject,\r\n TPlugins,\r\n TypeOfPath<TObject, Key>,\r\n TFieldBuilder\r\n >,\r\n fieldOptions?: FieldConfig<TypeOfPath<TObject, Key>>\r\n ): FieldBuilder<\r\n TObject,\r\n AddFieldTransform<\r\n TMap,\r\n Key,\r\n TypeOfPath<TObject, Key>,\r\n ExtractFieldType<TFieldBuilder>\r\n >,\r\n TPlugins,\r\n TDeclaredFields | Key\r\n > => {\r\n // Normalize field options\r\n const normalizedOptions = fieldOptions !== undefined ? \r\n normalizeFieldConfig(fieldOptions) : \r\n undefined;\r\n\r\n // Store field definition with type information and options preserved\r\n const fieldDefinition: FieldBuilderDefinition = {\r\n path,\r\n inferredType: inferFieldType<Key>(path),\r\n builderFunction: definition as any,\r\n fieldOptions: normalizedOptions, // Store the field options\r\n };\r\n\r\n // Return new instance with type safety maintained\r\n return createFieldBuilderImpl<\r\n TObject,\r\n AddFieldTransform<\r\n TMap,\r\n Key,\r\n TypeOfPath<TObject, Key>,\r\n ExtractFieldType<TFieldBuilder>\r\n >,\r\n TPlugins,\r\n TDeclaredFields | Key\r\n >(\r\n plugins,\r\n chainableBuilder,\r\n [..._fieldDefinitions, fieldDefinition],\r\n _isStrict\r\n );\r\n };\r\n\r\n /**\r\n * Alias for field() with same signature and field options support\r\n * WIP: Does not validate unknown properties by default\r\n */\r\n const v = field;\r\n\r\n /**\r\n * Register a pre-built field rule with type-safe path checking\r\n * Tip: Use PluginRegistry to create type-safe field rules\r\n * @example\r\n * ```typescript\r\n * const registry = createPluginRegistry().use(requiredPlugin);\r\n * const rules = registry.createFieldRules();\r\n * builder.useField(\"name\", rules.string.required());\r\n * ```\r\n */\r\n const useField = <Key extends NestedKeyOf<TObject> & string>(\r\n path: Key,\r\n fieldRule: FieldRule<TypeOfPath<TObject, Key>>\r\n ): FieldBuilder<TObject, TMap, TPlugins, TDeclaredFields | Key> => {\r\n const fieldDefinition: FieldBuilderDefinition = {\r\n path,\r\n inferredType: inferFieldType<Key>(path),\r\n builderFunction: () => fieldRule,\r\n fieldOptions: fieldRule.fieldOptions, // Extract field options from the field rule\r\n };\r\n\r\n return createFieldBuilderImpl<TObject, TMap, TPlugins, TDeclaredFields | Key>(\r\n plugins,\r\n chainableBuilder,\r\n [..._fieldDefinitions, fieldDefinition],\r\n _isStrict\r\n );\r\n };\r\n\r\n /**\r\n * WIP: Enable strict mode ensuring all fields are declared\r\n * Returns type error at compile time if fields are missing\r\n * @deprecated This is a work in progress and may change in future versions\r\n */\r\n const strict = (): MissingFields<TObject, TDeclaredFields> extends never\r\n ? FieldBuilder<TObject, TMap, TPlugins, TDeclaredFields>\r\n : {\r\n _error: `Missing field declarations in strict mode: ${MissingFields<\r\n TObject,\r\n TDeclaredFields\r\n > &\r\n string}`;\r\n _missingFields: MissingFields<TObject, TDeclaredFields>;\r\n } => {\r\n return createFieldBuilderImpl<TObject, TMap, TPlugins, TDeclaredFields>(\r\n plugins,\r\n chainableBuilder,\r\n _fieldDefinitions,\r\n true\r\n ) as any;\r\n };\r\n\r\n /**\r\n * WIP: Alias for strict mode with editor-specific naming\r\n * Provides better IDE integration and error messages\r\n * @deprecated This is a work in progress and may change in future versions\r\n */\r\n const strictOnEditor = strict;\r\n\r\n /**\r\n * Build the final validator with optimizations\r\n * Generates efficient validation function with type transformations\r\n * WIP: The built validator does not validate unknown properties by default.\r\n * Use objectAdditionalProperties plugin for strict property validation.\r\n */\r\n const build = (): TransformAwareValidator<\r\n TObject,\r\n ApplyNestedTransforms<TObject, TMap>\r\n > => {\r\n // Use cached factory or create new one for performance\r\n if (!_validatorFactory) {\r\n _validatorFactory = createValidatorFactory<TObject, TMap>(plugins as Record<string, any>);\r\n }\r\n\r\n // Process field definitions with context creation\r\n const processedDefinitions = _fieldDefinitions.map((def) => {\r\n const context = createFieldContext<TObject, TPlugins, any>(\r\n def.path,\r\n plugins\r\n );\r\n\r\n const result = def.builderFunction(context);\r\n \r\n // Ensure FieldDefinition type compliance\r\n const fieldDef: FieldDefinition = {\r\n path: def.path,\r\n builderFunction: def.builderFunction,\r\n rules: Array.isArray(result) ? result : [result],\r\n metadata: {\r\n inferredType: def.inferredType,\r\n hasTransforms: false,\r\n fieldOptions: def.fieldOptions, // Pass field options to metadata\r\n },\r\n fieldType: def.inferredType || \"unknown\",\r\n };\r\n\r\n return fieldDef;\r\n });\r\n\r\n // Generate optimized validator with type safety\r\n return _validatorFactory.buildOptimizedValidator(processedDefinitions);\r\n };\r\n\r\n // Return the builder interface with all methods\r\n return {\r\n field,\r\n v,\r\n useField,\r\n strict,\r\n strictOnEditor,\r\n build,\r\n };\r\n}\r\n\r\n// For backward compatibility, export FieldBuilderImpl as an alias\r\nexport const FieldBuilderImpl = createFieldBuilderImpl as any;\r\n", "/**\r\n * Enhanced integration with better type inference\r\n */\r\n\r\nimport { FieldBuilder, createFieldBuilderImpl } from \"./field-builder\";\r\nimport { IChainableBuilder, BuilderExtensions } from \"../types/types\";\r\n\r\n// Re-export types from types.ts\r\nexport type {\r\n ChainableBuilder,\r\n IChainableBuilder,\r\n PluginMapFromArray,\r\n BuilderExtensions,\r\n} from \"../types/types\";\r\n\r\n/**\r\n * Alternative implementation with better type inference\r\n */\r\nfunction createChainableBuilder<\r\n TInput,\r\n TPlugins = {},\r\n TExtensions extends object = {},\r\n>(): IChainableBuilder<TInput, TPlugins, TExtensions> & TExtensions {\r\n const pluginMethods: Record<string, any> = {};\r\n\r\n const builder: any = {\r\n for<TInputType extends object>(): FieldBuilder<\r\n TInputType,\r\n unknown,\r\n TPlugins,\r\n never\r\n > {\r\n return createFieldBuilderImpl<TInputType, unknown, TPlugins, never>(\r\n pluginMethods as TPlugins,\r\n builder as any,\r\n undefined,\r\n false\r\n ) as any;\r\n },\r\n\r\n use(...args: any[]): any {\r\n // Handle both single and multiple plugins\r\n if (args.length === 0) {\r\n return builder;\r\n }\r\n\r\n // Process each plugin\r\n for (let i = 0; i < args.length; i++) {\r\n const plugin = args[i];\r\n\r\n // Skip null/undefined\r\n if (!plugin) {\r\n continue;\r\n }\r\n\r\n // Validate plugin structure\r\n if (typeof plugin !== \"object\" || !plugin.name) {\r\n console.error(\"Invalid plugin:\", plugin);\r\n throw new Error(\r\n `Invalid plugin at index ${i}: plugin must be an object with a 'name' property`\r\n );\r\n }\r\n\r\n // Store the plugin with a unique key\r\n const key = plugin.name;\r\n if (pluginMethods[key]) {\r\n // Skip if already added (avoid duplicates)\r\n continue;\r\n }\r\n pluginMethods[key] = plugin;\r\n\r\n // Check if this is a builder extension plugin\r\n if (\r\n plugin.category === \"builder-extension\" &&\r\n plugin.extendBuilder &&\r\n typeof plugin.extendBuilder === \"function\"\r\n ) {\r\n // Add the method using methodName and impl\r\n if (plugin.methodName && plugin.impl) {\r\n (builder as any)[plugin.methodName] = plugin.impl;\r\n }\r\n \r\n // Apply any additional extensions\r\n plugin.extendBuilder(builder);\r\n\r\n // Verify the method was added\r\n if (\r\n plugin.methodName &&\r\n !(builder as any)[plugin.methodName]\r\n ) {\r\n console.warn(\r\n `BuilderExtensionPlugin ${plugin.name} did not add ${plugin.methodName} method`\r\n );\r\n }\r\n }\r\n }\r\n\r\n // Return builder with accumulated extensions\r\n // The type system should recognize this through the interface definition\r\n return builder;\r\n },\r\n };\r\n\r\n return builder as IChainableBuilder<TInput, TPlugins, TExtensions> &\r\n TExtensions;\r\n}\r\n\r\n/**\r\n * Factory function with better type inference\r\n */\r\nfunction createBuilder<TInput = any>(): IChainableBuilder<TInput, {}, {}> {\r\n return createChainableBuilder<TInput, {}, {}>();\r\n}\r\n\r\nexport const Builder = createBuilder;\r\n", "/**\r\n * Plugin Registry - Shared plugin management for reusable field rules\r\n *\r\n * Enables:\r\n * 1. Pre-defining field validation rules with plugins\r\n * 2. Individual field validation before integration\r\n * 3. Shared plugin pools for team consistency\r\n */\r\n\r\nimport { Result } from \"../../types/result\";\r\nimport { ValidationOptions, ParseOptions } from \"../../types\";\r\nimport type {\r\n TypedPlugin,\r\n FieldBuilderContext,\r\n ChainableFieldBuilder,\r\n PluginCategory,\r\n TypeName,\r\n PluginType,\r\n} from \"../builder/plugins/plugin-types\";\r\nimport {\r\n normalizeFieldConfig,\r\n applyDefault,\r\n} from \"../builder/types/field-options\";\r\nimport { createFieldContext } from \"../builder/context/field-context\";\r\nimport { Builder, IChainableBuilder } from \"../builder/core/builder\";\r\nimport type { NestedKeyOf, TypeOfPath } from \"../../types/util\";\r\n\r\n/**\r\n * Field Rule - Individual field validation rule with plugin support\r\n */\r\nexport interface FieldRule<T> {\r\n readonly _phantomType: T; // phantom type for type safety\r\n readonly name?: string;\r\n readonly description?: string;\r\n readonly fieldOptions?: import(\"../builder/types/field-options\").FieldOptions<T>;\r\n\r\n /**\r\n * Validate single field value\r\n */\r\n validate(value: T | unknown, options?: ValidationOptions): Result<T>;\r\n\r\n /**\r\n * Parse single field value (with transformations)\r\n */\r\n parse(value: T | unknown, options?: ParseOptions): Result<T>;\r\n\r\n /**\r\n * Get the plugin registry used by this rule\r\n */\r\n getPluginRegistry(): PluginRegistry<any>;\r\n\r\n /**\r\n * Internal: Get validators and transforms for integration\r\n * @internal\r\n */\r\n _getInternalValidators?: () => {\r\n validators: any[];\r\n transforms: any[];\r\n executionPlan: any;\r\n };\r\n}\r\n\r\n/**\r\n * Plugin Registry - Manages shared plugins for field rules with type accumulation\r\n */\r\nexport interface PluginRegistry<TPlugins = {}> {\r\n /**\r\n * Add a plugin to the registry with type accumulation\r\n */\r\n use<\r\n TName extends string,\r\n TMethodName extends string,\r\n TMethod extends Function,\r\n TAllowedTypes extends readonly TypeName[] | undefined,\r\n TPluginType extends PluginType = PluginType,\r\n TCategory extends PluginCategory = PluginCategory,\r\n >(\r\n plugin: TypedPlugin<\r\n TName,\r\n TMethodName,\r\n TMethod,\r\n TAllowedTypes,\r\n TPluginType,\r\n TCategory\r\n >\r\n ): PluginRegistry<\r\n TPlugins & {\r\n [K in TName]: TypedPlugin<\r\n TName,\r\n TMethodName,\r\n TMethod,\r\n TAllowedTypes,\r\n TPluginType,\r\n TCategory\r\n >;\r\n }\r\n > &\r\n TPlugins & { [K in TMethodName]: TMethod };\r\n\r\n /**\r\n * Create a field rule using registered plugins with practical type inference\r\n */\r\n createFieldRule<T>(\r\n definition: (\r\n context: FieldBuilderContext<any, TPlugins, T>\r\n ) => ChainableFieldBuilder<any, TPlugins, any, T>,\r\n options?:\r\n | {\r\n name?: string;\r\n description?: string;\r\n fieldOptions?: import(\"../builder/types/field-options\").FieldOptions<T>;\r\n }\r\n | import(\"../builder/types/field-options\").FieldConfig<T>\r\n ): FieldRule<T>;\r\n\r\n /**\r\n * Create a builder instance using this registry's plugins\r\n */\r\n toBuilder(): IChainableBuilder<\r\n any,\r\n TPlugins & {\r\n [K in keyof TPlugins]: TPlugins[K] extends TypedPlugin<\r\n any,\r\n any,\r\n any,\r\n any,\r\n any,\r\n any\r\n >\r\n ? TPlugins[K]\r\n : never;\r\n }\r\n >;\r\n\r\n /**\r\n * Get all registered plugins\r\n */\r\n getPlugins(): Record<string, TypedPlugin<any, any, any, any, any, any>>;\r\n\r\n /**\r\n * Set the target type for type-safe field rule creation\r\n */\r\n for<TObject extends object>(): TypedPluginRegistry<TObject, TPlugins>;\r\n}\r\n\r\n/**\r\n * Type-safe Plugin Registry with target type specified\r\n */\r\nexport interface TypedPluginRegistry<TObject extends object, TPlugins = {}>\r\n extends Omit<PluginRegistry<TPlugins>, \"createFieldRule\" | \"for\"> {\r\n /**\r\n * Create a field rule with type-safe field names and automatic type inference\r\n */\r\n createFieldRule<\r\n TName extends NestedKeyOf<TObject> & string,\r\n TExplicitType = TypeOfPath<TObject, TName>,\r\n >(\r\n definition: (\r\n context: FieldBuilderContext<TObject, TPlugins, TExplicitType>\r\n ) => ChainableFieldBuilder<TObject, TPlugins, any, TExplicitType>,\r\n options: {\r\n name: TName;\r\n description?: string;\r\n fieldOptions?: import(\"../builder/types/field-options\").FieldOptions<TExplicitType>;\r\n }\r\n ): FieldRule<TExplicitType>;\r\n\r\n /**\r\n * Create a field rule with explicit type override\r\n */\r\n createFieldRule<T>(\r\n definition: (\r\n context: FieldBuilderContext<any, TPlugins, T>\r\n ) => ChainableFieldBuilder<any, TPlugins, any, T>,\r\n options: {\r\n name: NestedKeyOf<TObject> & string;\r\n description?: string;\r\n fieldOptions?: import(\"../builder/types/field-options\").FieldOptions<T>;\r\n }\r\n ): FieldRule<T>;\r\n\r\n /**\r\n * Change the target type\r\n */\r\n for<TNewObject extends object>(): TypedPluginRegistry<TNewObject, TPlugins>;\r\n}\r\n\r\n/**\r\n * Internal implementation of PluginRegistry with proper type tracking\r\n */\r\ninterface PluginRegistryInternalState<TPlugins> {\r\n plugins: Map<string, TypedPlugin<any, any, any, any, any, any>>;\r\n pluginsObject: TPlugins; // Store the actual plugins object with proper types\r\n _typeMarker?: TPlugins;\r\n}\r\n\r\nfunction createPluginRegistryImpl<TPlugins = {}>(\r\n existingPlugins?: Map<string, TypedPlugin<any, any, any, any, any, any>>,\r\n existingPluginsObject?: TPlugins\r\n): PluginRegistry<TPlugins> {\r\n const state: PluginRegistryInternalState<TPlugins> = {\r\n plugins: existingPlugins ? new Map(existingPlugins) : new Map(),\r\n pluginsObject: existingPluginsObject || ({} as TPlugins),\r\n };\r\n\r\n const registry: PluginRegistry<TPlugins> = {\r\n use<\r\n TName extends string,\r\n TMethodName extends string,\r\n TMethod extends Function,\r\n TAllowedTypes extends readonly TypeName[] | undefined,\r\n TPluginType extends PluginType = PluginType,\r\n TCategory extends PluginCategory = PluginCategory,\r\n >(\r\n plugin: TypedPlugin<\r\n TName,\r\n TMethodName,\r\n TMethod,\r\n TAllowedTypes,\r\n TPluginType,\r\n TCategory\r\n >\r\n ): PluginRegistry<\r\n TPlugins & {\r\n [K in TName]: TypedPlugin<\r\n TName,\r\n TMethodName,\r\n TMethod,\r\n TAllowedTypes,\r\n TPluginType,\r\n TCategory\r\n >;\r\n }\r\n > &\r\n TPlugins & { [K in TMethodName]: TMethod } {\r\n state.plugins.set(plugin.name, plugin);\r\n\r\n // Create new plugins object with the added plugin - store by NAME not methodName\r\n const newPluginsObject = {\r\n ...state.pluginsObject,\r\n [plugin.name]: plugin, // Changed from plugin.methodName to plugin.name\r\n } as TPlugins & {\r\n [K in TName]: TypedPlugin<\r\n TName,\r\n TMethodName,\r\n TMethod,\r\n TAllowedTypes,\r\n TPluginType,\r\n TCategory\r\n >;\r\n };\r\n\r\n const newRegistry = createPluginRegistryImpl<\r\n TPlugins & {\r\n [K in TName]: TypedPlugin<\r\n TName,\r\n TMethodName,\r\n TMethod,\r\n TAllowedTypes,\r\n TPluginType,\r\n TCategory\r\n >;\r\n }\r\n >(state.plugins, newPluginsObject);\r\n\r\n // Cast to match the expected return type with intersection\r\n return newRegistry as any;\r\n },\r\n\r\n createFieldRule<T>(\r\n definition: (\r\n context: FieldBuilderContext<any, TPlugins, T>\r\n ) => ChainableFieldBuilder<any, TPlugins, any, T>,\r\n options?:\r\n | {\r\n name?: string;\r\n description?: string;\r\n fieldOptions?: import(\"../builder/types/field-options\").FieldOptions<T>;\r\n }\r\n | import(\"../builder/types/field-options\").FieldConfig<T>\r\n ): FieldRule<T> {\r\n return createFieldRuleImpl<T, TPlugins>(\r\n registry,\r\n state.pluginsObject,\r\n definition,\r\n options\r\n );\r\n },\r\n\r\n toBuilder(): IChainableBuilder<\r\n any,\r\n TPlugins & {\r\n [K in keyof TPlugins]: TPlugins[K] extends TypedPlugin<\r\n any,\r\n any,\r\n any,\r\n any,\r\n any,\r\n any\r\n >\r\n ? TPlugins[K]\r\n : never;\r\n }\r\n > {\r\n let builder = Builder() as any;\r\n\r\n // Add all registered plugins to the builder (removed for...of, index-based)\r\n const pluginValues = Array.from(state.plugins.values());\r\n const pluginValuesLength = pluginValues.length;\r\n for (let i = 0; i < pluginValuesLength; i++) {\r\n const plugin = pluginValues[i];\r\n builder = builder.use(plugin);\r\n }\r\n\r\n return builder;\r\n },\r\n\r\n getPlugins(): Record<string, TypedPlugin<any, any, any, any, any, any>> {\r\n const result: Record<\r\n string,\r\n TypedPlugin<any, any, any, any, any, any>\r\n > = {};\r\n const pluginEntries = Array.from(state.plugins.entries());\r\n const pluginEntriesLength = pluginEntries.length;\r\n for (let i = 0; i < pluginEntriesLength; i++) {\r\n const [name, plugin] = pluginEntries[i];\r\n result[name] = plugin;\r\n }\r\n return result;\r\n },\r\n\r\n for<TObject extends object>(): TypedPluginRegistry<TObject, TPlugins> {\r\n return createTypedPluginRegistry<TObject, TPlugins>(\r\n state.plugins,\r\n state.pluginsObject,\r\n registry\r\n );\r\n },\r\n };\r\n\r\n return registry;\r\n}\r\n\r\n/**\r\n * Create a typed plugin registry with target type\r\n */\r\nfunction createTypedPluginRegistry<TObject extends object, TPlugins = {}>(\r\n plugins: Map<string, TypedPlugin<any, any, any, any, any, any>>,\r\n pluginsObject: TPlugins,\r\n baseRegistry: PluginRegistry<TPlugins>\r\n): TypedPluginRegistry<TObject, TPlugins> {\r\n const typedRegistry: TypedPluginRegistry<TObject, TPlugins> = {\r\n // Delegate non-overridden methods to base registry\r\n use: baseRegistry.use as any,\r\n toBuilder: baseRegistry.toBuilder,\r\n getPlugins: baseRegistry.getPlugins,\r\n\r\n // Type-safe createFieldRule with automatic type inference\r\n createFieldRule<\r\n TName extends NestedKeyOf<TObject> & string,\r\n TExplicitType = TypeOfPath<TObject, TName>,\r\n >(\r\n definition: (\r\n context: FieldBuilderContext<TObject, TPlugins, TExplicitType>\r\n ) => ChainableFieldBuilder<TObject, TPlugins, any, TExplicitType>,\r\n options: {\r\n name: TName;\r\n description?: string;\r\n fieldOptions?: import(\"../builder/types/field-options\").FieldOptions<TExplicitType>;\r\n }\r\n ): FieldRule<TExplicitType> {\r\n // Use the base implementation with proper types\r\n return createFieldRuleImpl<TExplicitType, TPlugins>(\r\n baseRegistry,\r\n pluginsObject,\r\n definition as any,\r\n options\r\n );\r\n },\r\n\r\n // Allow changing the target type\r\n for<TNewObject extends object>(): TypedPluginRegistry<\r\n TNewObject,\r\n TPlugins\r\n > {\r\n return createTypedPluginRegistry<TNewObject, TPlugins>(\r\n plugins,\r\n pluginsObject,\r\n baseRegistry\r\n );\r\n },\r\n };\r\n\r\n return typedRegistry;\r\n}\r\n\r\n/**\r\n * Internal implementation of FieldRule\r\n */\r\nfunction createFieldRuleImpl<T, TPlugins = any>(\r\n registry: PluginRegistry<TPlugins>,\r\n pluginsObject: TPlugins,\r\n definition: (\r\n context: FieldBuilderContext<any, TPlugins, T>\r\n ) => ChainableFieldBuilder<any, TPlugins, any, T>,\r\n options?:\r\n | {\r\n name?: string;\r\n description?: string;\r\n fieldOptions?: import(\"../builder/types/field-options\").FieldOptions<T>;\r\n }\r\n | import(\"../builder/types/field-options\").FieldConfig<T>\r\n): FieldRule<T> {\r\n // Helper functions for field options are now imported at the top\r\n\r\n // Normalize options to handle both object and simple value formats\r\n let normalizedOptions: {\r\n name?: string;\r\n description?: string;\r\n fieldOptions?: import(\"../builder/types/field-options\").FieldOptions<T>;\r\n } = {};\r\n\r\n if (options !== undefined) {\r\n if (\r\n typeof options === \"object\" &&\r\n options !== null &&\r\n (\"name\" in options ||\r\n \"description\" in options ||\r\n \"fieldOptions\" in options)\r\n ) {\r\n // It's the options object format\r\n normalizedOptions = options as any;\r\n } else {\r\n // It's a simple field config (default value or FieldOptions)\r\n const fieldConfig = normalizeFieldConfig(\r\n options as import(\"../builder/types/field-options\").FieldConfig<T>\r\n );\r\n normalizedOptions = {\r\n fieldOptions: fieldConfig,\r\n };\r\n }\r\n }\r\n\r\n const createSingleFieldValidator = () => {\r\n // Use a unique path that includes the rule name to avoid any potential sharing\r\n const uniquePath = `__standalone__${normalizedOptions?.name || Math.random()}`;\r\n // Pass the pluginsObject with proper type information\r\n const fieldContext = createFieldContext(uniquePath, pluginsObject);\r\n\r\n // Execute the rule definition to get the field builder\r\n // We need to cast because of union type handling differences\r\n const fieldBuilder = definition(\r\n fieldContext as FieldBuilderContext<any, TPlugins, T>\r\n );\r\n\r\n // Build the validator from the field builder\r\n const builtValidator = fieldBuilder.build() as any;\r\n\r\n // Create a simple validate function using the validators and transforms\r\n return {\r\n validate: (value: any, context?: any, options?: any) => {\r\n // Apply default value if needed\r\n let processedValue = value;\r\n if (normalizedOptions?.fieldOptions) {\r\n processedValue = applyDefault(value, normalizedOptions.fieldOptions, {\r\n allValues: context || {},\r\n });\r\n }\r\n\r\n const validators = builtValidator._validators || [];\r\n const transforms = builtValidator._transforms || [];\r\n\r\n // Run validators\r\n for (const validator of validators) {\r\n if (\r\n validator.check &&\r\n !validator.check(processedValue, context || {})\r\n ) {\r\n const message =\r\n typeof validator.messageFactory === \"function\"\r\n ? validator.messageFactory({\r\n path: uniquePath,\r\n value: processedValue,\r\n context: context || {},\r\n })\r\n : \"Validation failed\";\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n path: uniquePath,\r\n message,\r\n code: validator.name || \"VALIDATION_ERROR\",\r\n paths: () => [uniquePath],\r\n },\r\n ],\r\n data: processedValue,\r\n };\r\n }\r\n }\r\n\r\n // Apply transforms if validation passed\r\n let transformedValue = processedValue;\r\n for (const transform of transforms) {\r\n if (typeof transform === \"function\") {\r\n transformedValue = transform(transformedValue);\r\n } else if (transform && typeof transform.transformFn === \"function\") {\r\n // Handle transform objects with transformFn\r\n transformedValue = transform.transformFn(transformedValue);\r\n }\r\n }\r\n\r\n return {\r\n valid: true,\r\n data: transformedValue,\r\n errors: [],\r\n };\r\n },\r\n _executionPlan: builtValidator._executionPlan,\r\n _validators: builtValidator._validators,\r\n _transforms: builtValidator._transforms,\r\n };\r\n };\r\n\r\n const fieldRule: FieldRule<T> = {\r\n _phantomType: undefined as any as T,\r\n name: normalizedOptions?.name,\r\n description: normalizedOptions?.description,\r\n fieldOptions: normalizedOptions?.fieldOptions,\r\n // Expose internal validators and transforms for integration\r\n _getInternalValidators: () => {\r\n const validator = createSingleFieldValidator();\r\n return {\r\n validators: validator._validators || [],\r\n transforms: validator._transforms || [],\r\n executionPlan: validator._executionPlan,\r\n };\r\n },\r\n\r\n validate(\r\n value: T | unknown,\r\n validateOptions?: ValidationOptions\r\n ): Result<T> {\r\n try {\r\n // Create a temporary single-field validator using the registry's plugins\r\n const fieldValidator = createSingleFieldValidator();\r\n const legacyResult = fieldValidator.validate(\r\n value as any,\r\n {},\r\n validateOptions\r\n );\r\n\r\n // Convert legacy ValidationResult to Result\r\n if (legacyResult.valid) {\r\n return Result.ok(legacyResult.data as T);\r\n } else {\r\n return Result.error(legacyResult.errors || []);\r\n }\r\n } catch (error) {\r\n return Result.error([\r\n {\r\n path: \"\",\r\n message:\r\n error instanceof Error ? error.message : \"Validation failed\",\r\n code: \"FIELD_RULE_ERROR\",\r\n paths: () => [\"\"],\r\n },\r\n ]);\r\n }\r\n },\r\n\r\n parse(value: T | unknown, parseOptions?: ParseOptions): Result<T> {\r\n try {\r\n // Apply default value first\r\n let processedValue = value;\r\n if (normalizedOptions?.fieldOptions) {\r\n processedValue = applyDefault(value, normalizedOptions.fieldOptions, {\r\n allValues: {},\r\n });\r\n }\r\n\r\n // For parsing, we need to execute the full pipeline including transforms\r\n const fieldValidator = createSingleFieldValidator();\r\n\r\n // Use ExecutionPlan if available to execute validation and transforms in correct order\r\n if (\r\n fieldValidator._executionPlan &&\r\n typeof fieldValidator._executionPlan.execute === \"function\"\r\n ) {\r\n const context = {\r\n originalValue: processedValue,\r\n currentValue: processedValue,\r\n allValues: {},\r\n path: normalizedOptions?.name || \"field\",\r\n reporter: { report: () => {}, getReports: () => [] },\r\n };\r\n\r\n const result = fieldValidator._executionPlan.execute(\r\n processedValue,\r\n context\r\n );\r\n\r\n if (result.valid) {\r\n return Result.ok(result.finalValue as T);\r\n } else {\r\n return Result.error(result.errors || []);\r\n }\r\n } else {\r\n // Fallback: manually handle transforms and then validation\r\n let currentValue = processedValue;\r\n\r\n // Apply all transforms first (including defaults)\r\n if (fieldValidator._transforms) {\r\n for (const transform of fieldValidator._transforms) {\r\n if (typeof transform === \"function\") {\r\n currentValue = transform(currentValue);\r\n }\r\n }\r\n }\r\n\r\n // Now validate the transformed value\r\n const validators = fieldValidator._validators || [];\r\n const path = normalizedOptions?.name || \"field\";\r\n for (const validator of validators) {\r\n if (validator.check && !validator.check(currentValue, {})) {\r\n const message =\r\n typeof validator.messageFactory === \"function\"\r\n ? validator.messageFactory({\r\n path,\r\n value: currentValue,\r\n context: {},\r\n })\r\n : \"Validation failed\";\r\n return Result.error([\r\n {\r\n path,\r\n message,\r\n code: validator.name || \"VALIDATION_ERROR\",\r\n paths: () => [path],\r\n },\r\n ]);\r\n }\r\n }\r\n\r\n return Result.ok(currentValue as T);\r\n }\r\n } catch (error) {\r\n return Result.error([\r\n {\r\n path: \"\",\r\n message: error instanceof Error ? error.message : \"Parse failed\",\r\n code: \"FIELD_RULE_PARSE_ERROR\",\r\n paths: () => [\"\"],\r\n },\r\n ]);\r\n }\r\n },\r\n\r\n getPluginRegistry(): PluginRegistry<any> {\r\n return registry;\r\n },\r\n };\r\n\r\n return fieldRule;\r\n}\r\n\r\n/**\r\n * Create a new plugin registry with empty plugin set\r\n * Generic type parameter allows TypeScript to properly track plugin accumulation\r\n */\r\nexport function createPluginRegistry<\r\n TPlugins = {},\r\n>(): PluginRegistry<TPlugins> {\r\n return createPluginRegistryImpl<TPlugins>();\r\n}\r\n\r\n/**\r\n * Type helper to extract the field type from a FieldRule\r\n */\r\nexport type ExtractFieldRuleType<T> = T extends FieldRule<infer U> ? U : never;\r\n\r\n/**\r\n * Type helper for field rule definitions\r\n */\r\nexport type FieldRuleDefinition<T, TPlugins = {}> = (\r\n context: FieldBuilderContext<{}, TPlugins, T>\r\n) => ChainableFieldBuilder<{}, TPlugins, any, T>;\r\n", "import { TypedPlugin, TypeName, PluginCategory, BuilderExtensionPlugin, BuilderExtensionMethod } from \"../plugins/plugin-types\";\r\nimport { PluginImplementation } from \"../types/types\";\r\nimport {\r\n PredefinedTransformImplementation,\r\n ConfigurableTransformImplementation,\r\n} from \"../plugins/plugin-interfaces\";\r\n\r\n/**\r\n * Plugin Creator with Type-Safe Interfaces (Optimized)\r\n *\r\n * This module provides an intuitive API for creating plugins\r\n * with proper type guidance and IntelliSense support.\r\n * Optimized for smaller bundle size while maintaining the same interface.\r\n */\r\n\r\n// Re-export types from types.ts\r\nexport type { PluginImplementation, PluginDefinition } from \"../types/types\";\r\n\r\n/**\r\n * Chain method creator based on category\r\n */\r\n/**\r\n * Helper type to inject pluginName into ValidatorFormat\r\n */\r\ntype WithPluginName<T> = T extends (...args: any[]) => infer R\r\n ? R extends { check: any; code: string }\r\n ? (...args: Parameters<T>) => R & { pluginName: string }\r\n : T\r\n : T;\r\nconst createImpl = <TCategory extends PluginCategory, TImpl extends Function>(\r\n category: TCategory,\r\n methodName: string,\r\n impl: TImpl,\r\n pluginName: string\r\n): WithPluginName<TImpl> => {\r\n // Create a wrapper that automatically injects pluginName into the returned validation object\r\n const wrapImpl = (originalImpl: TImpl): TImpl => {\r\n return ((...args: any[]) => {\r\n const result = originalImpl(...args);\r\n // If the result is an object with validation properties, inject pluginName\r\n if (result && typeof result === \"object\" && \"check\" in result) {\r\n return {\r\n ...result,\r\n pluginName,\r\n };\r\n }\r\n return result;\r\n }) as unknown as WithPluginName<TImpl>;\r\n };\r\n\r\n const wrappedImpl = wrapImpl(impl);\r\n\r\n switch (category) {\r\n case \"conditional\":\r\n return ((\r\n condition: (allValues: any, arrayContext?: any) => boolean,\r\n ...args: any[]\r\n ) => wrappedImpl(condition, ...args)) as unknown as WithPluginName<TImpl>;\r\n case \"fieldReference\":\r\n return ((fieldPath: string, ...args: any[]) =>\r\n wrappedImpl(fieldPath, ...args)) as unknown as WithPluginName<TImpl>;\r\n case \"multiFieldReference\":\r\n // Preserve generic type parameters for multiFieldReference\r\n return wrappedImpl as WithPluginName<TImpl>;\r\n case \"transform\":\r\n return ((transformFn: (value: any) => any) =>\r\n wrappedImpl(transformFn)) as unknown as WithPluginName<TImpl>;\r\n case \"arrayElement\":\r\n return ((element: any, ...args: any[]) =>\r\n wrappedImpl(element, ...args)) as unknown as WithPluginName<TImpl>;\r\n case \"context\":\r\n return ((contextOptions: any) =>\r\n wrappedImpl(contextOptions)) as unknown as WithPluginName<TImpl>;\r\n default: // standard\r\n return wrappedImpl as WithPluginName<TImpl>;\r\n }\r\n};\r\n\r\nexport function plugin<\r\n TPluginName extends string,\r\n TMethodName extends string,\r\n TTypes extends readonly TypeName[],\r\n TCategory extends PluginCategory,\r\n TImpl extends PluginImplementation<TCategory, TTypes>,\r\n>(args: {\r\n name: TPluginName;\r\n methodName: TMethodName;\r\n allowedTypes: TTypes;\r\n category: TCategory;\r\n impl: TImpl;\r\n}): TypedPlugin<\r\n TPluginName,\r\n TMethodName,\r\n TImpl,\r\n TTypes,\r\n \"validator\",\r\n TCategory\r\n> {\r\n const { name, methodName, allowedTypes, category, impl } = args;\r\n return {\r\n name,\r\n methodName,\r\n allowedTypes,\r\n category,\r\n create: () => createImpl(category, methodName, impl, name), // Pass plugin name\r\n };\r\n}\r\n\r\nexport function pluginPredefinedTransform<\r\n TName extends string,\r\n TTypes extends readonly TypeName[],\r\n TInput,\r\n TOutput,\r\n>(args: {\r\n name: TName;\r\n allowedTypes: TTypes;\r\n impl: PredefinedTransformImplementation<TInput, TOutput>;\r\n}): TypedPlugin<TName, TName, () => any, TTypes, \"transform\", \"transform\"> {\r\n const { name, allowedTypes, impl } = args;\r\n const fn = () => impl();\r\n return {\r\n name,\r\n methodName: name,\r\n allowedTypes,\r\n category: \"transform\",\r\n create: () => fn,\r\n };\r\n}\r\n\r\nexport function pluginConfigurableTransform<\r\n TName extends string,\r\n TTypes extends readonly TypeName[],\r\n TConfig extends any[],\r\n TInput,\r\n TOutput,\r\n>(args: {\r\n name: TName;\r\n allowedTypes: TTypes;\r\n impl: ConfigurableTransformImplementation<TConfig, TInput, TOutput>;\r\n}): TypedPlugin<\r\n TName,\r\n TName,\r\n (...args: TConfig) => any,\r\n TTypes,\r\n \"transform\",\r\n \"transform\"\r\n> {\r\n const { name, allowedTypes, impl } = args;\r\n const fn = (...config: TConfig) => impl(...config);\r\n return {\r\n name,\r\n methodName: name,\r\n allowedTypes,\r\n category: \"transform\",\r\n create: () => fn,\r\n };\r\n}\r\n\r\n/**\r\n * Builder extension plugin factory function\r\n * Creates a plugin that extends the builder with additional methods\r\n */\r\nexport function pluginBuilderExtension<\r\n TName extends string,\r\n TMethodName extends string,\r\n TMethodSignature extends BuilderExtensionMethod = BuilderExtensionMethod,\r\n>(args: {\r\n name: TName;\r\n methodName: TMethodName;\r\n impl: () => TMethodSignature;\r\n extendBuilder: (builderInstance: any) => void;\r\n}): BuilderExtensionPlugin<TName, TMethodName, TMethodSignature> {\r\n const { name, methodName, impl, extendBuilder } = args;\r\n return {\r\n name,\r\n methodName,\r\n category: \"builder-extension\" as const,\r\n impl: impl(),\r\n extendBuilder,\r\n };\r\n}\r\n", "export interface GlobalConfig {\r\n messageKeyPrefix?: string;\r\n toBooleanTruthyValues?: string[];\r\n numberFormat?: {\r\n decimalSeparator?: string;\r\n thousandSeparator?: string;\r\n };\r\n dateFormat?: string;\r\n trimStrings?: boolean;\r\n caseSensitive?: boolean;\r\n customTransforms?: Record<string, (value: any) => any>;\r\n}\r\n\r\n// Default configuration\r\nconst defaultConfig: GlobalConfig = {\r\n messageKeyPrefix: \"\",\r\n toBooleanTruthyValues: [\"true\", \"1\", \"yes\", \"on\"],\r\n numberFormat: {\r\n decimalSeparator: \".\",\r\n thousandSeparator: \",\",\r\n },\r\n dateFormat: \"YYYY-MM-DD\",\r\n trimStrings: false,\r\n caseSensitive: true,\r\n customTransforms: {},\r\n};\r\n\r\n// Current configuration state\r\nlet currentConfig: GlobalConfig = { ...defaultConfig };\r\n\r\n// Global config object with getter properties\r\nexport const globalConfig = {\r\n setConfig(config: Partial<GlobalConfig>): void {\r\n currentConfig = {\r\n ...currentConfig,\r\n ...config,\r\n numberFormat: config.numberFormat\r\n ? {\r\n ...currentConfig.numberFormat,\r\n ...config.numberFormat,\r\n }\r\n : currentConfig.numberFormat,\r\n };\r\n },\r\n\r\n getConfig(): GlobalConfig {\r\n return { ...currentConfig };\r\n },\r\n\r\n get messageKeyPrefix(): string {\r\n return currentConfig.messageKeyPrefix || \"\";\r\n },\r\n\r\n get toBooleanTruthyValues(): string[] {\r\n return [...(currentConfig.toBooleanTruthyValues || [])];\r\n },\r\n\r\n get numberFormat(): NonNullable<GlobalConfig[\"numberFormat\"]> {\r\n return { ...currentConfig.numberFormat! };\r\n },\r\n\r\n get dateFormat(): string {\r\n return currentConfig.dateFormat || \"YYYY-MM-DD\";\r\n },\r\n\r\n get trimStrings(): boolean {\r\n return currentConfig.trimStrings || false;\r\n },\r\n\r\n get caseSensitive(): boolean {\r\n return currentConfig.caseSensitive !== false;\r\n },\r\n\r\n get customTransforms(): Record<string, (value: any) => any> {\r\n return { ...currentConfig.customTransforms! };\r\n },\r\n\r\n reset(): void {\r\n currentConfig = {\r\n ...defaultConfig,\r\n numberFormat: { ...defaultConfig.numberFormat! },\r\n toBooleanTruthyValues: [...defaultConfig.toBooleanTruthyValues!],\r\n customTransforms: { ...defaultConfig.customTransforms! },\r\n };\r\n }\r\n};\r\n\r\nexport function setGlobalConfig(config: Partial<GlobalConfig>): void {\r\n globalConfig.setConfig(config);\r\n}\r\n\r\nexport function getGlobalConfig(): GlobalConfig {\r\n return globalConfig.getConfig();\r\n}\r\n\r\nexport function resetGlobalConfig(): void {\r\n globalConfig.reset();\r\n}\r\n"],
5
+ "mappings": "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",
6
+ "names": ["core_entry_exports", "__export", "Builder", "Result", "createPluginRegistry", "getGlobalConfig", "globalConfig", "plugin", "pluginBuilderExtension", "pluginConfigurableTransform", "pluginPredefinedTransform", "resetGlobalConfig", "setGlobalConfig", "__toCommonJS", "normalizeFieldConfig", "config", "applyDefault", "value", "options", "context", "defaultValue", "createLuqValidationException", "message", "errors", "successProto", "defaultValue", "fn", "Result", "data", "result", "errors", "createResult", "state", "createLuqValidationException", "ResultUtils", "all", "results", "resultsLength", "any", "allErrors", "partition", "valid", "invalid", "i", "VALID_RESULT", "INVALID_RESULT", "attachComposablePlugin", "builder", "plugin", "fieldPath", "plugins", "methodName", "composer", "composerResult", "args", "executionPlan", "validator", "value", "context", "valid", "getTypeValidator", "type", "value", "createOptimizedTypeBuilder", "fieldPath", "plugins", "existingState", "validators", "typeValidator", "transforms", "builder", "attachPluginMethods", "pluginEntries", "entriesLength", "i", "plugin", "attachComposablePlugin", "methodName", "category", "name", "createFn", "args", "result", "transformFn", "extractTransformFunction", "checkFn", "extractCheckFunction", "validator", "createValidatorMeta", "fallback", "v", "ctx", "currentValue", "originalResult", "createOptimizedFieldContext", "stringBuilder", "numberBuilder", "booleanBuilder", "arrayBuilder", "objectBuilder", "unionBuilder", "tupleBuilder", "dateBuilder", "anyBuilder", "parseFieldPath", "path", "segments", "createFieldAccessor", "parsedPath", "accessor", "key", "obj", "key1", "key2", "key3", "current", "segment", "createFieldSetter", "setter", "value", "getNestedValue", "setNestedValue", "analyzeArrayField", "createArrayAccessor", "arrayPath", "baseAccessor", "groupArrayFields", "fieldPaths", "arrayGroups", "arrayInfo", "elementPath", "createBatchAccessors", "paths", "isValidFieldPath", "normalizeFieldPath", "compareFieldPaths", "path1", "path2", "segments1", "segments2", "clearCache", "getCacheStats", "FieldUtils", "extractIssueParams", "validator", "value", "params", "firstParam", "createValidationError", "context", "code", "message", "issueContext", "normalizeTransformFunction", "transform", "transformObj", "getFieldValue", "obj", "path", "dotIndex", "key1", "key2", "createFieldAccessor", "deepClone", "obj", "len", "cloned", "i", "keys", "keysLen", "key", "validateField", "field", "value", "context", "options", "abortEarly", "validatorsLength", "validator", "checkFn", "createValidationError", "errors", "isValid", "validateBatch", "fields", "values", "abortEarlyOnEachField", "allErrors", "fieldsLength", "fieldValue", "getFieldValue", "result", "parseField", "validationResult", "transformedValue", "applyTransforms", "error", "applyTransforms", "transforms", "value", "context", "currentValue", "transformsLength", "i", "normalizeTransformFunction", "validateHoisted", "field", "allValues", "abortEarlyOnEachField", "arrayContext", "validatorsLength", "checkFn", "isValid", "errorIndices", "reconstructErrors", "index", "validator", "createValidationError", "createEngine", "localSetterCache", "createScopedFieldSetter", "path", "setter", "obj", "segments", "lastIndex", "current", "segment", "setScopedFieldValue", "validateField", "validateBatch", "parseField", "fields", "values", "options", "abortEarly", "allErrors", "transformedData", "deepClone", "fieldsForParseLength", "fieldValue", "getFieldValue", "result", "engineInstance", "getValidationEngine", "strategyEngine", "getValidationEngine", "analyzeFields", "fieldDefinitions", "plugins", "fieldCount", "hasTransforms", "hasArrayFields", "fieldDef", "extractPluginCalls", "call", "isTransformPlugin", "FieldUtils", "strategy", "reason", "canOptimize", "extractPluginCalls", "builderFunction", "funcString", "methodCallPattern", "calls", "match", "isTransformPlugin", "methodName", "plugins", "p", "selectOptimalStrategies", "fieldDefinitions", "plugins", "overallAnalysis", "analyzeFields", "strategies", "fieldDef", "groupByStrategy", "fastFields", "slowFields", "analysis", "fieldPath", "DOT", "VALIDATE_MODE", "PARSE_MODE", "createUnifiedValidator", "fieldDef", "plugins", "strategy", "accessor", "context", "createOptimizedFieldContext", "builtField", "validators", "transforms", "path", "hasSkipPlugins", "v", "hasTransforms", "createUltraFastValidator", "createOptimizedTransformValidator", "executeInDefinitionOrder", "value", "rootData", "options", "abortEarlyOnEachField", "result", "executeDefinitionOrder", "VALIDATE_MODE", "executeFastSeparated", "PARSE_MODE", "mode", "errors", "currentValue", "hasSkipForNull", "hasSkipForUndefined", "validatorsLength", "i", "validator", "checkFn", "error", "computeErrorMessage", "validTransforms", "transform", "validTransformCount", "ULTRA_FAST_VALID_RESULT", "executeFastSeparated", "value", "rootData", "validators", "transforms", "path", "abortEarlyOnEachField", "mode", "PARSE_MODE", "errors", "validatorsLength", "hasSkipForNull", "v", "hasSkipForUndefined", "i", "validator", "checkFn", "computeErrorMessage", "VALIDATE_MODE", "ULTRA_FAST_VALID_RESULT", "transformedValue", "transformsLength", "validTransforms", "transform", "validTransformCount", "createUltraFastValidator", "accessor", "validationChecks", "errorCodes", "errorMessages", "isDynamic", "validationChecksLength", "singleError", "validate", "check0", "code0", "msg0", "dynamic0", "options", "check1", "code1", "msg1", "dynamic1", "j", "validationResult", "issueContext", "createOptimizedTransformValidator", "validatorCount", "transformCount", "transformFunctions", "actualTransformCount", "check", "errorCode", "validateError", "parseError", "parseSuccess", "check2", "errorCode1", "errorCode2", "validator1", "validator2", "validateError1", "validateError2", "parseError1", "parseError2", "createAccessor", "pathSegments", "obj", "key", "key1", "key2", "key3", "key4", "key5", "result", "pathSegmentsLength", "i", "createFieldAccessor", "fieldPath", "DOT", "createFieldExistenceChecker", "fieldPath", "accessor", "createFieldAccessor", "obj", "createFieldSetter", "pathSegments", "DOT", "key", "value", "key1", "key2", "key3", "current", "i", "createNestedValueAccessor", "parts", "partsLength", "firstValue", "part", "remainingPath", "element", "elementCurrent", "remainingParts", "remainingLength", "j", "parseFieldPath", "name", "segments", "baseName", "firstArrayIndex", "baseArrayPath", "s", "elementPath", "createArrayElementAccessor", "parsed", "baseArrayAccessor", "arrayValue", "elements", "elementAccessor", "parseArrayElementPath", "path", "multiDimMatch", "segments", "finalSegment", "cleanFinalSegment", "bracketMatch", "directBracketMatch", "dotMatch", "buildNestedArrayHierarchy", "fieldDefinitions", "processedDefinitions", "arrayPaths", "fd", "parsed", "nestedArrayPath", "arrayPath", "additionalNestedArrays", "baseElementField", "nestedArrayFullPath", "d", "arrayFields", "a", "b", "depthA", "depthB", "arrayHierarchy", "arrayField", "depth", "parentPath", "existingPath", "allRelatedFields", "pathToCheck", "elementFields", "fullFieldPaths", "field", "relativePath", "af", "accessors", "elementField", "createAccessor", "batchInfo", "parent", "childKey", "createNestedArrayValidator", "nestedBatchInfo", "fieldValidators", "fullPath", "validator", "arrayData", "rootData", "abortEarly", "abortEarlyOnEachField", "mode", "VALIDATE_MODE", "errors", "transformedArray", "PARSE_MODE", "effectiveAbortEarlyOnEachField", "elementIndex", "element", "transformedElement", "elementHasError", "currentElementPath", "arrayElementPath", "candidateValidator", "elementValue", "elementFieldPath", "result", "error", "fullFieldPath", "dotArrayElementPath", "accessor", "setNestedValue", "childArrayKey", "childBatchInfo", "childArrayData", "childPath", "childResult", "obj", "value", "createFieldSetter", "findNestedArrays", "fieldDefinitions", "nestedHierarchy", "buildNestedArrayHierarchy", "arrayBatches", "arrayPath", "nestedInfo", "allValidatorPaths", "collectAllValidatorPaths", "legacyBatchInfo", "rootInfo", "hierarchy", "allPaths", "childKey", "childInfo", "childPaths", "analyzeArrayBatching", "createArrayBatchValidator", "batchInfo", "fieldValidators", "fullPath", "validator", "nestedValidator", "createNestedArrayValidator", "arrayData", "rootData", "abortEarly", "abortEarlyOnEachField", "mode", "VALIDATE_MODE", "result", "errors", "transformedArray", "PARSE_MODE", "elementIndex", "element", "transformedElement", "elementHasError", "elementField", "fullFieldPath", "accessor", "elementValue", "elementPath", "setNestedValue", "error", "obj", "path", "value", "createFieldSetter", "getPathSegments", "fieldPath", "DOT", "createAccessor", "pathSegments", "length", "obj", "key0", "key1", "key2", "k1", "k2", "k3", "k4_1", "k4_2", "k4_3", "k4_4", "k5_1", "k5_2", "k5_3", "k5_4", "k5_5", "result", "i", "createFieldAccessor", "segments", "createFieldSetter", "fieldPath", "segments", "getPathSegments", "length", "setter", "key", "obj", "value", "k1", "k2", "k3_1", "k3_2", "k3_3", "current", "i", "createRawValidator", "validators", "entries", "count", "value", "Result", "fieldPath", "validator", "isSimplePath", "accessor", "createFieldAccessor", "setter", "createFieldSetter", "options", "fieldValue", "result", "transformed", "errors", "e", "rawResult", "createOptimizedMultiFieldRawValidator", "createGeneralRawValidator", "fields", "path", "a", "b", "field0", "field1", "value0", "value1", "field2", "value2", "len", "i", "field", "hasTransform", "result0", "result1", "result2", "EMPTY_ERRORS", "VALID_RESPONSE", "createValidatorFactory", "plugins", "buildOptimizedValidator", "fieldDefinitions", "buildEmptyValidator", "fieldsWithBuilders", "def", "isOptional", "hasRequired", "context", "createOptimizedFieldContext", "built", "v", "executionStrategies", "selectOptimalStrategies", "fastFields", "slowFields", "groupByStrategy", "arrayBatches", "analyzeArrayBatching", "batchFieldPaths", "enhancedArrayBatches", "legacyArrayBatches", "arrayPath", "batchInfo", "fieldPath", "regularFastFields", "fp", "regularSlowFields", "slowValidators", "buildUnifiedValidators", "fd", "fastValidators", "allValidators", "allFieldPaths", "allUnifiedValidators", "path", "validator", "optionalFields", "requiredFields", "fieldOptionsMap", "field", "fieldDef", "createExecutorValidator", "pickValidator", "createPickValidatorFactory", "Result", "value", "options", "key", "fields", "validators", "recursiveFieldsMap", "arrayElementRecursiveFields", "f", "accessor", "createNestedValueAccessor", "builtField", "recursiveValidator", "recursiveInfo", "unifiedValidator", "createUnifiedValidator", "originalValidator", "targetValidator", "targetFieldDef", "createRecursiveValidator", "arrayPattern", "parseFieldPath", "arrayElementRecursiveValidator", "createArrayElementRecursiveValidator", "originalFieldDefinitions", "hasArrayBatches", "hasSlowFields", "totalValidators", "isSimpleValidator", "allValidatorsMap", "rawValidator", "createRawValidator", "pickValidatorInstance", "d", "obj", "objWithDefaults", "fieldOpts", "currentValue", "getNestedValue", "defaultApplied", "applyDefault", "setNestedValue", "transformedData", "createUltraFastExecutorValidator", "executor", "createValidatorExecutor", "validatorObject", "fieldOptions", "validatorEntries", "validatorCount", "fieldAccessors", "i", "errors", "OK_RESULT", "fieldValue", "result", "e", "abortEarly", "abortEarlyOnEachField", "resultErrors", "j", "fieldAccessorCache", "fieldExistenceCache", "createFieldExistenceChecker", "executeValidate", "arrayAccessor", "arrayData", "arrayFieldValidator", "arrayFieldResult", "batchResult", "createArrayBatchValidator", "VALIDATE_MODE", "parts", "skipDueToEmptyArray", "parentPath", "parentValue", "arrayElementErrors", "validateArrayElementPath", "existenceChecker", "fieldExists", "hasNestedField", "hasRequiredPlugin", "executeParse", "updatedArrayData", "parseResult", "PARSE_MODE", "getNestedValue", "obj", "path", "createNestedValueAccessor", "createExistenceChecker", "DOT", "parts", "lastIndex", "current", "i", "part", "hasNestedField", "createGlobalSetter", "path", "DOT", "parts", "lastIndex", "obj", "value", "current", "i", "part", "setNestedValue", "validateArrayElementPath", "fieldPath", "validator", "rootData", "abortEarly", "abortEarlyOnEachField", "errors", "arrayPath", "elementField", "bracketMatch", "dotMatch", "directBracketMatch", "arrayData", "getNestedValue", "element", "elementPath", "result", "error", "elementValue", "createRecursiveValidator", "originalValidator", "targetValidator", "targetFieldPath", "maxDepth", "fieldDefinitions", "plugins", "allFieldValidators", "validateRecursive", "currentDepth", "currentPath", "visitedSet", "options", "originalResult", "e", "validatorFieldPath", "arrayResult", "createArrayElementAccessor", "elements", "basePath", "index", "elementResult", "elementErrorPath", "fieldValue", "createNestedValueAccessor", "fieldResult", "fieldDef", "fd", "fieldContext", "createOptimizedFieldContext", "fieldBuilt", "v", "elementCurrentPath", "recursiveResult", "targetPathParts", "fieldName", "elementFieldValue", "nestedFieldValue", "nestedPath", "nestedResult", "createArrayElementRecursiveValidator", "parseResult", "parseFieldPath", "arrayValue", "currentArrayPattern", "fieldPathAfterArray", "targetPath", "elementFieldPath", "nestedElement", "nestedIndex", "nestedValidatorPath", "nestedValidator", "nestedFieldAfterArray", "nestedFieldPath", "nestedTargetPath", "matchesFieldPattern", "actualPath", "patternPath", "regexPattern", "createPickValidatorFactory", "buildValidators", "createPickedValidator", "key", "keyPath", "targetFieldDef", "relatedFieldDefs", "relatedPaths", "allValues", "tempObject", "filteredErrors", "relatedPath", "allErrors", "createUnifiedValidator", "parsedData", "context", "builtField", "fieldWithBuilder", "fieldStrategy", "selectOptimalStrategies", "fieldValidator", "mockObject", "createFieldBuilderImpl", "plugins", "chainableBuilder", "fieldDefinitions", "isStrict", "_fieldDefinitions", "_isStrict", "_validatorFactory", "inferFieldType", "path", "DOT", "field", "definition", "fieldOptions", "normalizedOptions", "normalizeFieldConfig", "fieldDefinition", "v", "useField", "fieldRule", "strict", "createValidatorFactory", "processedDefinitions", "def", "context", "createOptimizedFieldContext", "result", "createChainableBuilder", "pluginMethods", "builder", "createFieldBuilderImpl", "args", "i", "plugin", "key", "createBuilder", "Builder", "createPluginRegistryImpl", "existingPlugins", "existingPluginsObject", "state", "registry", "plugin", "newPluginsObject", "definition", "options", "createFieldRuleImpl", "builder", "Builder", "pluginValues", "pluginValuesLength", "result", "pluginEntries", "pluginEntriesLength", "name", "createTypedPluginRegistry", "plugins", "pluginsObject", "baseRegistry", "normalizedOptions", "normalizeFieldConfig", "createSingleFieldValidator", "uniquePath", "fieldContext", "createOptimizedFieldContext", "builtValidator", "value", "context", "processedValue", "applyDefault", "validators", "transforms", "validator", "message", "transformedValue", "transform", "validateOptions", "legacyResult", "Result", "error", "parseOptions", "fieldValidator", "currentValue", "path", "createPluginRegistry", "createImpl", "category", "methodName", "impl", "pluginName", "wrappedImpl", "originalImpl", "args", "result", "condition", "fieldPath", "transformFn", "element", "contextOptions", "plugin", "name", "allowedTypes", "pluginPredefinedTransform", "fn", "pluginConfigurableTransform", "config", "pluginBuilderExtension", "extendBuilder", "defaultConfig", "currentConfig", "globalConfig", "config", "setGlobalConfig", "getGlobalConfig", "resetGlobalConfig"]
7
+ }