zod-compiler 1.23.0 → 1.23.2

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 (494) hide show
  1. package/README.md +9 -6
  2. package/dist/cli/commands/check.d.ts +10 -7
  3. package/dist/cli/commands/check.d.ts.map +1 -1
  4. package/dist/cli/commands/check.js +125 -148
  5. package/dist/cli/commands/check.js.map +1 -1
  6. package/dist/cli/commands/generate.d.ts +22 -19
  7. package/dist/cli/commands/generate.d.ts.map +1 -1
  8. package/dist/cli/commands/generate.js +102 -133
  9. package/dist/cli/commands/generate.js.map +1 -1
  10. package/dist/cli/commands/watch.d.ts +17 -15
  11. package/dist/cli/commands/watch.d.ts.map +1 -1
  12. package/dist/cli/commands/watch.js +126 -154
  13. package/dist/cli/commands/watch.js.map +1 -1
  14. package/dist/cli/emitter.d.ts +19 -16
  15. package/dist/cli/emitter.d.ts.map +1 -1
  16. package/dist/cli/emitter.js +55 -71
  17. package/dist/cli/emitter.js.map +1 -1
  18. package/dist/cli/errors.d.ts +4 -1
  19. package/dist/cli/errors.d.ts.map +1 -1
  20. package/dist/cli/errors.js +6 -2
  21. package/dist/cli/errors.js.map +1 -1
  22. package/dist/cli/index.d.ts +1 -3
  23. package/dist/cli/index.js +147 -160
  24. package/dist/cli/index.js.map +1 -1
  25. package/dist/cli/logger.d.ts +18 -15
  26. package/dist/cli/logger.d.ts.map +1 -1
  27. package/dist/cli/logger.js +38 -37
  28. package/dist/cli/logger.js.map +1 -1
  29. package/dist/core/codegen/build-path.d.ts +7 -41
  30. package/dist/core/codegen/build-path.d.ts.map +1 -1
  31. package/dist/core/codegen/build-path.js +481 -570
  32. package/dist/core/codegen/build-path.js.map +1 -1
  33. package/dist/core/codegen/context.d.ts +256 -253
  34. package/dist/core/codegen/context.d.ts.map +1 -1
  35. package/dist/core/codegen/context.js +363 -437
  36. package/dist/core/codegen/context.js.map +1 -1
  37. package/dist/core/codegen/dedupe.d.ts +22 -56
  38. package/dist/core/codegen/dedupe.d.ts.map +1 -1
  39. package/dist/core/codegen/dedupe.js +150 -242
  40. package/dist/core/codegen/dedupe.js.map +1 -1
  41. package/dist/core/codegen/emit-issue.d.ts +44 -68
  42. package/dist/core/codegen/emit-issue.d.ts.map +1 -1
  43. package/dist/core/codegen/emit-issue.js +76 -108
  44. package/dist/core/codegen/emit-issue.js.map +1 -1
  45. package/dist/core/codegen/emit.d.ts +4 -1
  46. package/dist/core/codegen/emit.d.ts.map +1 -1
  47. package/dist/core/codegen/emit.js +16 -13
  48. package/dist/core/codegen/emit.js.map +1 -1
  49. package/dist/core/codegen/fast-path.d.ts +7 -12
  50. package/dist/core/codegen/fast-path.d.ts.map +1 -1
  51. package/dist/core/codegen/fast-path.js +116 -145
  52. package/dist/core/codegen/fast-path.js.map +1 -1
  53. package/dist/core/codegen/fast-size.d.ts +12 -26
  54. package/dist/core/codegen/fast-size.d.ts.map +1 -1
  55. package/dist/core/codegen/fast-size.js +169 -244
  56. package/dist/core/codegen/fast-size.js.map +1 -1
  57. package/dist/core/codegen/index.d.ts +25 -23
  58. package/dist/core/codegen/index.d.ts.map +1 -1
  59. package/dist/core/codegen/index.js +239 -405
  60. package/dist/core/codegen/index.js.map +1 -1
  61. package/dist/core/codegen/issue-decls.d.ts +15 -12
  62. package/dist/core/codegen/issue-decls.d.ts.map +1 -1
  63. package/dist/core/codegen/issue-decls.js +131 -162
  64. package/dist/core/codegen/issue-decls.js.map +1 -1
  65. package/dist/core/codegen/regex-unroll.d.ts +4 -1
  66. package/dist/core/codegen/regex-unroll.d.ts.map +1 -1
  67. package/dist/core/codegen/regex-unroll.js +173 -197
  68. package/dist/core/codegen/regex-unroll.js.map +1 -1
  69. package/dist/core/codegen/schemas/any.d.ts +7 -4
  70. package/dist/core/codegen/schemas/any.d.ts.map +1 -1
  71. package/dist/core/codegen/schemas/any.js +8 -4
  72. package/dist/core/codegen/schemas/any.js.map +1 -1
  73. package/dist/core/codegen/schemas/array.d.ts +8 -5
  74. package/dist/core/codegen/schemas/array.d.ts.map +1 -1
  75. package/dist/core/codegen/schemas/array.js +77 -95
  76. package/dist/core/codegen/schemas/array.js.map +1 -1
  77. package/dist/core/codegen/schemas/bigint.d.ts +7 -4
  78. package/dist/core/codegen/schemas/bigint.d.ts.map +1 -1
  79. package/dist/core/codegen/schemas/bigint.js +44 -56
  80. package/dist/core/codegen/schemas/bigint.js.map +1 -1
  81. package/dist/core/codegen/schemas/boolean.d.ts +7 -4
  82. package/dist/core/codegen/schemas/boolean.d.ts.map +1 -1
  83. package/dist/core/codegen/schemas/boolean.js +12 -11
  84. package/dist/core/codegen/schemas/boolean.js.map +1 -1
  85. package/dist/core/codegen/schemas/catch.d.ts +8 -5
  86. package/dist/core/codegen/schemas/catch.d.ts.map +1 -1
  87. package/dist/core/codegen/schemas/catch.js +23 -23
  88. package/dist/core/codegen/schemas/catch.js.map +1 -1
  89. package/dist/core/codegen/schemas/date.d.ts +7 -4
  90. package/dist/core/codegen/schemas/date.d.ts.map +1 -1
  91. package/dist/core/codegen/schemas/date.js +49 -68
  92. package/dist/core/codegen/schemas/date.js.map +1 -1
  93. package/dist/core/codegen/schemas/default.d.ts +9 -6
  94. package/dist/core/codegen/schemas/default.d.ts.map +1 -1
  95. package/dist/core/codegen/schemas/default.js +29 -27
  96. package/dist/core/codegen/schemas/default.js.map +1 -1
  97. package/dist/core/codegen/schemas/discriminated-union.d.ts +12 -10
  98. package/dist/core/codegen/schemas/discriminated-union.d.ts.map +1 -1
  99. package/dist/core/codegen/schemas/discriminated-union.js +153 -178
  100. package/dist/core/codegen/schemas/discriminated-union.js.map +1 -1
  101. package/dist/core/codegen/schemas/effect.d.ts +9 -6
  102. package/dist/core/codegen/schemas/effect.d.ts.map +1 -1
  103. package/dist/core/codegen/schemas/effect.js +54 -67
  104. package/dist/core/codegen/schemas/effect.js.map +1 -1
  105. package/dist/core/codegen/schemas/enum.d.ts +7 -4
  106. package/dist/core/codegen/schemas/enum.d.ts.map +1 -1
  107. package/dist/core/codegen/schemas/enum.js +15 -21
  108. package/dist/core/codegen/schemas/enum.js.map +1 -1
  109. package/dist/core/codegen/schemas/fallback.d.ts +6 -3
  110. package/dist/core/codegen/schemas/fallback.d.ts.map +1 -1
  111. package/dist/core/codegen/schemas/fallback.js +14 -13
  112. package/dist/core/codegen/schemas/fallback.js.map +1 -1
  113. package/dist/core/codegen/schemas/file.d.ts +7 -4
  114. package/dist/core/codegen/schemas/file.d.ts.map +1 -1
  115. package/dist/core/codegen/schemas/file.js +51 -57
  116. package/dist/core/codegen/schemas/file.js.map +1 -1
  117. package/dist/core/codegen/schemas/intersection.d.ts +8 -5
  118. package/dist/core/codegen/schemas/intersection.d.ts.map +1 -1
  119. package/dist/core/codegen/schemas/intersection.js +16 -13
  120. package/dist/core/codegen/schemas/intersection.js.map +1 -1
  121. package/dist/core/codegen/schemas/literal.d.ts +7 -4
  122. package/dist/core/codegen/schemas/literal.d.ts.map +1 -1
  123. package/dist/core/codegen/schemas/literal.js +20 -23
  124. package/dist/core/codegen/schemas/literal.js.map +1 -1
  125. package/dist/core/codegen/schemas/map.d.ts +8 -5
  126. package/dist/core/codegen/schemas/map.d.ts.map +1 -1
  127. package/dist/core/codegen/schemas/map.js +61 -67
  128. package/dist/core/codegen/schemas/map.js.map +1 -1
  129. package/dist/core/codegen/schemas/nan.d.ts +7 -4
  130. package/dist/core/codegen/schemas/nan.d.ts.map +1 -1
  131. package/dist/core/codegen/schemas/nan.js +8 -4
  132. package/dist/core/codegen/schemas/nan.js.map +1 -1
  133. package/dist/core/codegen/schemas/never.d.ts +7 -4
  134. package/dist/core/codegen/schemas/never.d.ts.map +1 -1
  135. package/dist/core/codegen/schemas/never.js +8 -4
  136. package/dist/core/codegen/schemas/never.js.map +1 -1
  137. package/dist/core/codegen/schemas/null.d.ts +7 -4
  138. package/dist/core/codegen/schemas/null.d.ts.map +1 -1
  139. package/dist/core/codegen/schemas/null.js +8 -4
  140. package/dist/core/codegen/schemas/null.js.map +1 -1
  141. package/dist/core/codegen/schemas/nullable.d.ts +8 -5
  142. package/dist/core/codegen/schemas/nullable.d.ts.map +1 -1
  143. package/dist/core/codegen/schemas/nullable.js +8 -5
  144. package/dist/core/codegen/schemas/nullable.js.map +1 -1
  145. package/dist/core/codegen/schemas/number.d.ts +7 -4
  146. package/dist/core/codegen/schemas/number.d.ts.map +1 -1
  147. package/dist/core/codegen/schemas/number.js +120 -176
  148. package/dist/core/codegen/schemas/number.js.map +1 -1
  149. package/dist/core/codegen/schemas/object.d.ts +8 -5
  150. package/dist/core/codegen/schemas/object.d.ts.map +1 -1
  151. package/dist/core/codegen/schemas/object.js +144 -231
  152. package/dist/core/codegen/schemas/object.js.map +1 -1
  153. package/dist/core/codegen/schemas/optional.d.ts +9 -6
  154. package/dist/core/codegen/schemas/optional.d.ts.map +1 -1
  155. package/dist/core/codegen/schemas/optional.js +23 -31
  156. package/dist/core/codegen/schemas/optional.js.map +1 -1
  157. package/dist/core/codegen/schemas/pipe.d.ts +8 -5
  158. package/dist/core/codegen/schemas/pipe.d.ts.map +1 -1
  159. package/dist/core/codegen/schemas/pipe.js +20 -27
  160. package/dist/core/codegen/schemas/pipe.js.map +1 -1
  161. package/dist/core/codegen/schemas/readonly.d.ts +8 -5
  162. package/dist/core/codegen/schemas/readonly.d.ts.map +1 -1
  163. package/dist/core/codegen/schemas/readonly.js +8 -5
  164. package/dist/core/codegen/schemas/readonly.js.map +1 -1
  165. package/dist/core/codegen/schemas/record.d.ts +8 -5
  166. package/dist/core/codegen/schemas/record.d.ts.map +1 -1
  167. package/dist/core/codegen/schemas/record.js +52 -65
  168. package/dist/core/codegen/schemas/record.js.map +1 -1
  169. package/dist/core/codegen/schemas/recursive-ref.d.ts +9 -6
  170. package/dist/core/codegen/schemas/recursive-ref.d.ts.map +1 -1
  171. package/dist/core/codegen/schemas/recursive-ref.js +44 -44
  172. package/dist/core/codegen/schemas/recursive-ref.js.map +1 -1
  173. package/dist/core/codegen/schemas/set.d.ts +8 -5
  174. package/dist/core/codegen/schemas/set.d.ts.map +1 -1
  175. package/dist/core/codegen/schemas/set.js +61 -73
  176. package/dist/core/codegen/schemas/set.js.map +1 -1
  177. package/dist/core/codegen/schemas/string-bool.d.ts +6 -3
  178. package/dist/core/codegen/schemas/string-bool.d.ts.map +1 -1
  179. package/dist/core/codegen/schemas/string-bool.js +22 -23
  180. package/dist/core/codegen/schemas/string-bool.js.map +1 -1
  181. package/dist/core/codegen/schemas/string.d.ts +8 -5
  182. package/dist/core/codegen/schemas/string.d.ts.map +1 -1
  183. package/dist/core/codegen/schemas/string.js +168 -207
  184. package/dist/core/codegen/schemas/string.js.map +1 -1
  185. package/dist/core/codegen/schemas/symbol.d.ts +7 -4
  186. package/dist/core/codegen/schemas/symbol.d.ts.map +1 -1
  187. package/dist/core/codegen/schemas/symbol.js +8 -4
  188. package/dist/core/codegen/schemas/symbol.js.map +1 -1
  189. package/dist/core/codegen/schemas/template-literal.d.ts +7 -4
  190. package/dist/core/codegen/schemas/template-literal.d.ts.map +1 -1
  191. package/dist/core/codegen/schemas/template-literal.js +12 -13
  192. package/dist/core/codegen/schemas/template-literal.js.map +1 -1
  193. package/dist/core/codegen/schemas/tuple.d.ts +8 -5
  194. package/dist/core/codegen/schemas/tuple.d.ts.map +1 -1
  195. package/dist/core/codegen/schemas/tuple.js +84 -94
  196. package/dist/core/codegen/schemas/tuple.js.map +1 -1
  197. package/dist/core/codegen/schemas/undefined.d.ts +7 -4
  198. package/dist/core/codegen/schemas/undefined.d.ts.map +1 -1
  199. package/dist/core/codegen/schemas/undefined.js +8 -4
  200. package/dist/core/codegen/schemas/undefined.js.map +1 -1
  201. package/dist/core/codegen/schemas/union.d.ts +8 -5
  202. package/dist/core/codegen/schemas/union.d.ts.map +1 -1
  203. package/dist/core/codegen/schemas/union.js +49 -69
  204. package/dist/core/codegen/schemas/union.js.map +1 -1
  205. package/dist/core/codegen/schemas/unknown.d.ts +7 -4
  206. package/dist/core/codegen/schemas/unknown.d.ts.map +1 -1
  207. package/dist/core/codegen/schemas/unknown.js +8 -4
  208. package/dist/core/codegen/schemas/unknown.js.map +1 -1
  209. package/dist/core/codegen/schemas/void.d.ts +7 -4
  210. package/dist/core/codegen/schemas/void.d.ts.map +1 -1
  211. package/dist/core/codegen/schemas/void.js +8 -4
  212. package/dist/core/codegen/schemas/void.js.map +1 -1
  213. package/dist/core/codegen/slow-path.d.ts +7 -4
  214. package/dist/core/codegen/slow-path.d.ts.map +1 -1
  215. package/dist/core/codegen/slow-path.js +71 -96
  216. package/dist/core/codegen/slow-path.js.map +1 -1
  217. package/dist/core/codegen/well-known-regex.d.ts +22 -19
  218. package/dist/core/codegen/well-known-regex.d.ts.map +1 -1
  219. package/dist/core/codegen/well-known-regex.js +127 -96
  220. package/dist/core/codegen/well-known-regex.js.map +1 -1
  221. package/dist/core/compile.d.ts +7 -4
  222. package/dist/core/compile.d.ts.map +1 -1
  223. package/dist/core/compile.js +48 -48
  224. package/dist/core/compile.js.map +1 -1
  225. package/dist/core/diagnostic.d.ts +38 -39
  226. package/dist/core/diagnostic.d.ts.map +1 -1
  227. package/dist/core/diagnostic.js +140 -164
  228. package/dist/core/diagnostic.js.map +1 -1
  229. package/dist/core/extract/checks.d.ts +18 -15
  230. package/dist/core/extract/checks.d.ts.map +1 -1
  231. package/dist/core/extract/checks.js +318 -311
  232. package/dist/core/extract/checks.js.map +1 -1
  233. package/dist/core/extract/effects.d.ts +13 -10
  234. package/dist/core/extract/effects.d.ts.map +1 -1
  235. package/dist/core/extract/effects.js +153 -222
  236. package/dist/core/extract/effects.js.map +1 -1
  237. package/dist/core/extract/extractors/any.d.ts +5 -2
  238. package/dist/core/extract/extractors/any.d.ts.map +1 -1
  239. package/dist/core/extract/extractors/any.js +5 -1
  240. package/dist/core/extract/extractors/any.js.map +1 -1
  241. package/dist/core/extract/extractors/array.d.ts +6 -3
  242. package/dist/core/extract/extractors/array.d.ts.map +1 -1
  243. package/dist/core/extract/extractors/array.js +25 -20
  244. package/dist/core/extract/extractors/array.js.map +1 -1
  245. package/dist/core/extract/extractors/bigint.d.ts +6 -3
  246. package/dist/core/extract/extractors/bigint.d.ts.map +1 -1
  247. package/dist/core/extract/extractors/bigint.js +66 -64
  248. package/dist/core/extract/extractors/bigint.js.map +1 -1
  249. package/dist/core/extract/extractors/boolean.d.ts +5 -2
  250. package/dist/core/extract/extractors/boolean.d.ts.map +1 -1
  251. package/dist/core/extract/extractors/boolean.js +7 -3
  252. package/dist/core/extract/extractors/boolean.js.map +1 -1
  253. package/dist/core/extract/extractors/catch.d.ts +6 -3
  254. package/dist/core/extract/extractors/catch.d.ts.map +1 -1
  255. package/dist/core/extract/extractors/catch.js +26 -17
  256. package/dist/core/extract/extractors/catch.js.map +1 -1
  257. package/dist/core/extract/extractors/date.d.ts +6 -3
  258. package/dist/core/extract/extractors/date.d.ts.map +1 -1
  259. package/dist/core/extract/extractors/date.js +42 -46
  260. package/dist/core/extract/extractors/date.js.map +1 -1
  261. package/dist/core/extract/extractors/default.d.ts +6 -3
  262. package/dist/core/extract/extractors/default.d.ts.map +1 -1
  263. package/dist/core/extract/extractors/default.js +20 -14
  264. package/dist/core/extract/extractors/default.js.map +1 -1
  265. package/dist/core/extract/extractors/enum.d.ts +5 -2
  266. package/dist/core/extract/extractors/enum.d.ts.map +1 -1
  267. package/dist/core/extract/extractors/enum.js +12 -13
  268. package/dist/core/extract/extractors/enum.js.map +1 -1
  269. package/dist/core/extract/extractors/file.d.ts +6 -3
  270. package/dist/core/extract/extractors/file.d.ts.map +1 -1
  271. package/dist/core/extract/extractors/file.js +34 -28
  272. package/dist/core/extract/extractors/file.js.map +1 -1
  273. package/dist/core/extract/extractors/intersection.d.ts +5 -2
  274. package/dist/core/extract/extractors/intersection.d.ts.map +1 -1
  275. package/dist/core/extract/extractors/intersection.js +13 -11
  276. package/dist/core/extract/extractors/intersection.js.map +1 -1
  277. package/dist/core/extract/extractors/lazy.d.ts +6 -3
  278. package/dist/core/extract/extractors/lazy.d.ts.map +1 -1
  279. package/dist/core/extract/extractors/lazy.js +21 -30
  280. package/dist/core/extract/extractors/lazy.js.map +1 -1
  281. package/dist/core/extract/extractors/literal.d.ts +5 -2
  282. package/dist/core/extract/extractors/literal.d.ts.map +1 -1
  283. package/dist/core/extract/extractors/literal.js +8 -1
  284. package/dist/core/extract/extractors/literal.js.map +1 -1
  285. package/dist/core/extract/extractors/map.d.ts +6 -3
  286. package/dist/core/extract/extractors/map.d.ts.map +1 -1
  287. package/dist/core/extract/extractors/map.js +10 -4
  288. package/dist/core/extract/extractors/map.js.map +1 -1
  289. package/dist/core/extract/extractors/nan.d.ts +5 -2
  290. package/dist/core/extract/extractors/nan.d.ts.map +1 -1
  291. package/dist/core/extract/extractors/nan.js +5 -1
  292. package/dist/core/extract/extractors/nan.js.map +1 -1
  293. package/dist/core/extract/extractors/never.d.ts +5 -2
  294. package/dist/core/extract/extractors/never.d.ts.map +1 -1
  295. package/dist/core/extract/extractors/never.js +5 -1
  296. package/dist/core/extract/extractors/never.js.map +1 -1
  297. package/dist/core/extract/extractors/null.d.ts +5 -2
  298. package/dist/core/extract/extractors/null.d.ts.map +1 -1
  299. package/dist/core/extract/extractors/null.js +5 -1
  300. package/dist/core/extract/extractors/null.js.map +1 -1
  301. package/dist/core/extract/extractors/nullable.d.ts +5 -2
  302. package/dist/core/extract/extractors/nullable.d.ts.map +1 -1
  303. package/dist/core/extract/extractors/nullable.js +7 -3
  304. package/dist/core/extract/extractors/nullable.js.map +1 -1
  305. package/dist/core/extract/extractors/number.d.ts +6 -3
  306. package/dist/core/extract/extractors/number.d.ts.map +1 -1
  307. package/dist/core/extract/extractors/number.js +35 -35
  308. package/dist/core/extract/extractors/number.js.map +1 -1
  309. package/dist/core/extract/extractors/object.d.ts +6 -3
  310. package/dist/core/extract/extractors/object.d.ts.map +1 -1
  311. package/dist/core/extract/extractors/object.js +49 -76
  312. package/dist/core/extract/extractors/object.js.map +1 -1
  313. package/dist/core/extract/extractors/optional.d.ts +5 -2
  314. package/dist/core/extract/extractors/optional.d.ts.map +1 -1
  315. package/dist/core/extract/extractors/optional.js +10 -12
  316. package/dist/core/extract/extractors/optional.js.map +1 -1
  317. package/dist/core/extract/extractors/pipe.d.ts +6 -3
  318. package/dist/core/extract/extractors/pipe.d.ts.map +1 -1
  319. package/dist/core/extract/extractors/pipe.js +40 -41
  320. package/dist/core/extract/extractors/pipe.js.map +1 -1
  321. package/dist/core/extract/extractors/readonly.d.ts +5 -2
  322. package/dist/core/extract/extractors/readonly.d.ts.map +1 -1
  323. package/dist/core/extract/extractors/readonly.js +10 -6
  324. package/dist/core/extract/extractors/readonly.js.map +1 -1
  325. package/dist/core/extract/extractors/record.d.ts +6 -3
  326. package/dist/core/extract/extractors/record.d.ts.map +1 -1
  327. package/dist/core/extract/extractors/record.js +24 -35
  328. package/dist/core/extract/extractors/record.js.map +1 -1
  329. package/dist/core/extract/extractors/set.d.ts +6 -3
  330. package/dist/core/extract/extractors/set.d.ts.map +1 -1
  331. package/dist/core/extract/extractors/set.js +36 -30
  332. package/dist/core/extract/extractors/set.js.map +1 -1
  333. package/dist/core/extract/extractors/string-bool.d.ts +7 -4
  334. package/dist/core/extract/extractors/string-bool.d.ts.map +1 -1
  335. package/dist/core/extract/extractors/string-bool.js +66 -84
  336. package/dist/core/extract/extractors/string-bool.js.map +1 -1
  337. package/dist/core/extract/extractors/string.d.ts +6 -3
  338. package/dist/core/extract/extractors/string.d.ts.map +1 -1
  339. package/dist/core/extract/extractors/string.js +34 -37
  340. package/dist/core/extract/extractors/string.js.map +1 -1
  341. package/dist/core/extract/extractors/symbol.d.ts +5 -2
  342. package/dist/core/extract/extractors/symbol.d.ts.map +1 -1
  343. package/dist/core/extract/extractors/symbol.js +5 -1
  344. package/dist/core/extract/extractors/symbol.js.map +1 -1
  345. package/dist/core/extract/extractors/template-literal.d.ts +6 -3
  346. package/dist/core/extract/extractors/template-literal.d.ts.map +1 -1
  347. package/dist/core/extract/extractors/template-literal.js +11 -6
  348. package/dist/core/extract/extractors/template-literal.js.map +1 -1
  349. package/dist/core/extract/extractors/tuple.d.ts +6 -3
  350. package/dist/core/extract/extractors/tuple.d.ts.map +1 -1
  351. package/dist/core/extract/extractors/tuple.js +10 -4
  352. package/dist/core/extract/extractors/tuple.js.map +1 -1
  353. package/dist/core/extract/extractors/undefined.d.ts +5 -2
  354. package/dist/core/extract/extractors/undefined.d.ts.map +1 -1
  355. package/dist/core/extract/extractors/undefined.js +5 -1
  356. package/dist/core/extract/extractors/undefined.js.map +1 -1
  357. package/dist/core/extract/extractors/union.d.ts +6 -3
  358. package/dist/core/extract/extractors/union.d.ts.map +1 -1
  359. package/dist/core/extract/extractors/union.js +38 -64
  360. package/dist/core/extract/extractors/union.js.map +1 -1
  361. package/dist/core/extract/extractors/unknown.d.ts +5 -2
  362. package/dist/core/extract/extractors/unknown.d.ts.map +1 -1
  363. package/dist/core/extract/extractors/unknown.js +5 -1
  364. package/dist/core/extract/extractors/unknown.js.map +1 -1
  365. package/dist/core/extract/extractors/void.d.ts +5 -2
  366. package/dist/core/extract/extractors/void.d.ts.map +1 -1
  367. package/dist/core/extract/extractors/void.js +5 -1
  368. package/dist/core/extract/extractors/void.js.map +1 -1
  369. package/dist/core/extract/fallback.d.ts +6 -3
  370. package/dist/core/extract/fallback.d.ts.map +1 -1
  371. package/dist/core/extract/fallback.js +21 -7
  372. package/dist/core/extract/fallback.js.map +1 -1
  373. package/dist/core/extract/index.d.ts +6 -4
  374. package/dist/core/extract/index.d.ts.map +1 -1
  375. package/dist/core/extract/index.js +15 -15
  376. package/dist/core/extract/index.js.map +1 -1
  377. package/dist/core/extract/registry.d.ts +39 -36
  378. package/dist/core/extract/registry.d.ts.map +1 -1
  379. package/dist/core/extract/registry.js +96 -123
  380. package/dist/core/extract/registry.js.map +1 -1
  381. package/dist/core/extract/types.d.ts +124 -120
  382. package/dist/core/extract/types.d.ts.map +1 -1
  383. package/dist/core/extract/types.js +0 -1
  384. package/dist/core/iife.d.ts +14 -15
  385. package/dist/core/iife.d.ts.map +1 -1
  386. package/dist/core/iife.js +182 -206
  387. package/dist/core/iife.js.map +1 -1
  388. package/dist/core/pipeline.d.ts +33 -30
  389. package/dist/core/pipeline.d.ts.map +1 -1
  390. package/dist/core/pipeline.js +67 -74
  391. package/dist/core/pipeline.js.map +1 -1
  392. package/dist/core/types.d.ts +430 -427
  393. package/dist/core/types.d.ts.map +1 -1
  394. package/dist/core/types.js +0 -5
  395. package/dist/discovery.d.ts +8 -5
  396. package/dist/discovery.d.ts.map +1 -1
  397. package/dist/discovery.js +31 -32
  398. package/dist/discovery.js.map +1 -1
  399. package/dist/index.d.ts +4 -4
  400. package/dist/index.js +2 -2
  401. package/dist/jit.d.ts +15 -42
  402. package/dist/jit.d.ts.map +1 -1
  403. package/dist/jit.js +187 -216
  404. package/dist/jit.js.map +1 -1
  405. package/dist/loader.d.ts +14 -11
  406. package/dist/loader.d.ts.map +1 -1
  407. package/dist/loader.js +226 -258
  408. package/dist/loader.js.map +1 -1
  409. package/dist/static-filter.d.ts +4 -1
  410. package/dist/static-filter.d.ts.map +1 -1
  411. package/dist/static-filter.js +240 -367
  412. package/dist/static-filter.js.map +1 -1
  413. package/dist/swc.d.ts +38 -35
  414. package/dist/swc.d.ts.map +1 -1
  415. package/dist/swc.js +83 -76
  416. package/dist/swc.js.map +1 -1
  417. package/dist/unplugin/bun.d.ts +5 -2
  418. package/dist/unplugin/bun.d.ts.map +1 -1
  419. package/dist/unplugin/bun.js +5 -1
  420. package/dist/unplugin/bun.js.map +1 -1
  421. package/dist/unplugin/dep-graph.d.ts +10 -7
  422. package/dist/unplugin/dep-graph.d.ts.map +1 -1
  423. package/dist/unplugin/dep-graph.js +216 -252
  424. package/dist/unplugin/dep-graph.js.map +1 -1
  425. package/dist/unplugin/disk-cache.d.ts +121 -92
  426. package/dist/unplugin/disk-cache.d.ts.map +1 -1
  427. package/dist/unplugin/disk-cache.js +425 -444
  428. package/dist/unplugin/disk-cache.js.map +1 -1
  429. package/dist/unplugin/edits.d.ts +15 -12
  430. package/dist/unplugin/edits.d.ts.map +1 -1
  431. package/dist/unplugin/edits.js +24 -37
  432. package/dist/unplugin/edits.js.map +1 -1
  433. package/dist/unplugin/esbuild.d.ts +5 -2
  434. package/dist/unplugin/esbuild.d.ts.map +1 -1
  435. package/dist/unplugin/esbuild.js +5 -1
  436. package/dist/unplugin/esbuild.js.map +1 -1
  437. package/dist/unplugin/farm.d.ts +5 -2
  438. package/dist/unplugin/farm.d.ts.map +1 -1
  439. package/dist/unplugin/farm.js +5 -1
  440. package/dist/unplugin/farm.js.map +1 -1
  441. package/dist/unplugin/hoist-compile.d.ts +14 -42
  442. package/dist/unplugin/hoist-compile.d.ts.map +1 -1
  443. package/dist/unplugin/hoist-compile.js +67 -112
  444. package/dist/unplugin/hoist-compile.js.map +1 -1
  445. package/dist/unplugin/hoist.d.ts +56 -54
  446. package/dist/unplugin/hoist.d.ts.map +1 -1
  447. package/dist/unplugin/hoist.js +945 -1170
  448. package/dist/unplugin/hoist.js.map +1 -1
  449. package/dist/unplugin/index.d.ts +5 -3
  450. package/dist/unplugin/index.d.ts.map +1 -1
  451. package/dist/unplugin/index.js +175 -250
  452. package/dist/unplugin/index.js.map +1 -1
  453. package/dist/unplugin/rolldown.d.ts +5 -2
  454. package/dist/unplugin/rolldown.d.ts.map +1 -1
  455. package/dist/unplugin/rolldown.js +5 -1
  456. package/dist/unplugin/rolldown.js.map +1 -1
  457. package/dist/unplugin/rollup.d.ts +5 -2
  458. package/dist/unplugin/rollup.d.ts.map +1 -1
  459. package/dist/unplugin/rollup.js +5 -1
  460. package/dist/unplugin/rollup.js.map +1 -1
  461. package/dist/unplugin/rsbuild.d.ts +6 -3
  462. package/dist/unplugin/rsbuild.d.ts.map +1 -1
  463. package/dist/unplugin/rsbuild.js +15 -11
  464. package/dist/unplugin/rsbuild.js.map +1 -1
  465. package/dist/unplugin/rspack.d.ts +5 -2
  466. package/dist/unplugin/rspack.d.ts.map +1 -1
  467. package/dist/unplugin/rspack.js +5 -1
  468. package/dist/unplugin/rspack.js.map +1 -1
  469. package/dist/unplugin/transform.d.ts +30 -27
  470. package/dist/unplugin/transform.d.ts.map +1 -1
  471. package/dist/unplugin/transform.js +433 -620
  472. package/dist/unplugin/transform.js.map +1 -1
  473. package/dist/unplugin/types.d.ts +189 -184
  474. package/dist/unplugin/types.d.ts.map +1 -1
  475. package/dist/unplugin/types.js +22 -18
  476. package/dist/unplugin/types.js.map +1 -1
  477. package/dist/unplugin/virtual.d.ts +11 -8
  478. package/dist/unplugin/virtual.d.ts.map +1 -1
  479. package/dist/unplugin/virtual.js +65 -83
  480. package/dist/unplugin/virtual.js.map +1 -1
  481. package/dist/unplugin/vite.d.ts +5 -2
  482. package/dist/unplugin/vite.d.ts.map +1 -1
  483. package/dist/unplugin/vite.js +5 -1
  484. package/dist/unplugin/vite.js.map +1 -1
  485. package/dist/unplugin/webpack.d.ts +5 -2
  486. package/dist/unplugin/webpack.d.ts.map +1 -1
  487. package/dist/unplugin/webpack.js +5 -1
  488. package/dist/unplugin/webpack.js.map +1 -1
  489. package/package.json +23 -14
  490. package/dist/cli/index.d.ts.map +0 -1
  491. package/dist/core/extract/types.js.map +0 -1
  492. package/dist/core/types.js.map +0 -1
  493. package/dist/index.d.ts.map +0 -1
  494. package/dist/index.js.map +0 -1
@@ -1,278 +1,203 @@
1
+ //#region src/core/codegen/fast-size.ts
1
2
  /**
2
- * Fast-path size estimation, used to bound the size of each emitted fast-check
3
- * function. V8's TurboFan refuses to optimize functions whose bytecode exceeds
4
- * ~60KB and falls back to the weaker Maglev tier — measured ~1.3-1.8x slower on
5
- * deeply-nested schemas whose monolithic fast-check crosses that budget. By
6
- * extracting large, self-contained sub-schemas into their own boolean helpers
7
- * (`generateFast`), each function stays small enough to TurboFan.
8
- *
9
- * `estimateFastCost` is a path-agnostic subtree estimate in approximate
10
- * generated-character units (it can't see the access-path prefix the node will
11
- * be emitted under, since that lives in the call site, not the IR). The actual
12
- * emitted size of an inlined node grows with that prefix length — `input["a"]
13
- * ["b"]["c"]…` repeated per check — so the extraction decision scales the
14
- * estimate by `1 + inputLen/PATH_GROWTH_DIVISOR` (see `predictedInlineSize`).
15
- * The accumulator itself (generateFast) tracks EXACT emitted chars via the
16
- * returned string length, so only the look-ahead prediction is approximate.
17
- */
3
+ * Per-function soft size cap, in emitted characters. Once the fast-check being
4
+ * assembled would exceed this, the next large hoistable sub-schema is split into
5
+ * its own helper. Set below the ~60KB bytecode point where TurboFan bails (chars
6
+ * over-approximate bytecode) with margin for one look-ahead mis-prediction.
7
+ */
8
+ const EXTRACT_CAP = 38e3;
18
9
  /**
19
- * Per-function soft size cap, in emitted characters. Once the fast-check being
20
- * assembled would exceed this, the next large hoistable sub-schema is split into
21
- * its own helper. Set below the ~60KB bytecode point where TurboFan bails (chars
22
- * over-approximate bytecode) with margin for one look-ahead mis-prediction.
23
- */
24
- export const EXTRACT_CAP = 38_000;
25
- /**
26
- * Each nesting level lengthens every access path inside a node (`x["a"]` →
27
- * `x["a"]["b"]`), inflating real emitted chars above the path-agnostic estimate.
28
- * The extraction look-ahead multiplies the estimate by `1 + inputLen/this` so a
29
- * deep subtree is split before it inlines into an over-budget function. Smaller
30
- * ⇒ more eager splitting at depth. Calibrated against deeply-nested fixtures.
31
- */
10
+ * Each nesting level lengthens every access path inside a node (`x["a"]` →
11
+ * `x["a"]["b"]`), inflating real emitted chars above the path-agnostic estimate.
12
+ * The extraction look-ahead multiplies the estimate by `1 + inputLen/this` so a
13
+ * deep subtree is split before it inlines into an over-budget function. Smaller
14
+ * ⇒ more eager splitting at depth. Calibrated against deeply-nested fixtures.
15
+ */
32
16
  const PATH_GROWTH_DIVISOR = 26;
33
17
  /**
34
- * Predicted emitted size of inlining `ir` at a call site whose input expression
35
- * is `inputLen` chars long — the path-agnostic subtree estimate scaled up for
36
- * the access-path prefix that estimate omits. Used only for the extract/inline
37
- * decision; the running total uses exact emitted lengths.
38
- */
39
- export function predictedInlineSize(ir, inputLen, cache) {
40
- return estimateFastCost(ir, cache) * (1 + inputLen / PATH_GROWTH_DIVISOR);
18
+ * Predicted emitted size of inlining `ir` at a call site whose input expression
19
+ * is `inputLen` chars long — the path-agnostic subtree estimate scaled up for
20
+ * the access-path prefix that estimate omits. Used only for the extract/inline
21
+ * decision; the running total uses exact emitted lengths.
22
+ */
23
+ function predictedInlineSize(ir, inputLen, cache) {
24
+ return estimateFastCost(ir, cache) * (1 + inputLen / PATH_GROWTH_DIVISOR);
41
25
  }
42
26
  /**
43
- * Floor for extraction: never hoist a sub-schema smaller than this even when
44
- * the enclosing function is over the cap — a tiny helper trades a real call for
45
- * no optimization benefit. Only sub-schemas big enough to matter are split.
46
- */
47
- export const MIN_EXTRACT = 1_200;
27
+ * Floor for extraction: never hoist a sub-schema smaller than this even when
28
+ * the enclosing function is over the cap — a tiny helper trades a real call for
29
+ * no optimization benefit. Only sub-schemas big enough to matter are split.
30
+ */
31
+ const MIN_EXTRACT = 1200;
48
32
  /** Approximate size contributed to the enclosing function by an extracted call `__fo_N(expr)`. */
49
- export const CALL_COST = 24;
33
+ const CALL_COST = 24;
50
34
  /**
51
- * Node types whose fast-check is a self-contained boolean over a single input
52
- * expression and large enough to be worth hoisting into `function f(p){return …}`.
53
- * Thin wrappers (optional/nullable/default/…) are omitted: their inner schema is
54
- * visited through `generateFast` and gets hoisted on its own when large.
55
- */
56
- export const HOISTABLE = new Set([
57
- "object",
58
- "record",
59
- "tuple",
60
- "discriminatedUnion",
61
- "union",
62
- "intersection",
35
+ * Node types whose fast-check is a self-contained boolean over a single input
36
+ * expression and large enough to be worth hoisting into `function f(p){return …}`.
37
+ * Thin wrappers (optional/nullable/default/…) are omitted: their inner schema is
38
+ * visited through `generateFast` and gets hoisted on its own when large.
39
+ */
40
+ const HOISTABLE = /* @__PURE__ */ new Set([
41
+ "object",
42
+ "record",
43
+ "tuple",
44
+ "discriminatedUnion",
45
+ "union",
46
+ "intersection"
63
47
  ]);
64
48
  /** A node's own contribution to the emitted fast-check, EXCLUDING its children. */
65
49
  function shallowFastCost(ir) {
66
- switch (ir.type) {
67
- case "object":
68
- return 50 + Object.keys(ir.properties).length * 25 + (ir.strict ? 120 : 0);
69
- case "string":
70
- return 20 + ir.checks.length * 35;
71
- case "number":
72
- return 25 + ir.checks.length * 30;
73
- case "bigint":
74
- case "date":
75
- return 25 + (ir.checks?.length ?? 0) * 25;
76
- case "enum":
77
- return 15 + ir.values.length * 12;
78
- case "tuple":
79
- return 40 + ir.items.length * 15;
80
- case "union":
81
- return 12 + ir.options.length * 6;
82
- case "discriminatedUnion":
83
- return 45 + ir.cases.length * 12;
84
- case "array":
85
- case "record":
86
- case "set":
87
- case "map":
88
- return 55;
89
- case "file":
90
- case "templateLiteral":
91
- return 40;
92
- case "literal":
93
- case "optional":
94
- case "nullable":
95
- case "default":
96
- return 22;
97
- case "recursiveRef":
98
- case "recursionTarget":
99
- // Both emit just a call to a hosted helper; the target's `inner` is sized
100
- // independently when its own helper body is generated, so it is NOT
101
- // counted against the enclosing function here (see fastChildren).
102
- return 15;
103
- default:
104
- return 18;
105
- }
50
+ switch (ir.type) {
51
+ case "object": return 50 + Object.keys(ir.properties).length * 25 + (ir.strict ? 120 : 0);
52
+ case "string": return 20 + ir.checks.length * 35;
53
+ case "number": return 25 + ir.checks.length * 30;
54
+ case "bigint":
55
+ case "date": return 25 + (ir.checks?.length ?? 0) * 25;
56
+ case "enum": return 15 + ir.values.length * 12;
57
+ case "tuple": return 40 + ir.items.length * 15;
58
+ case "union": return 12 + ir.options.length * 6;
59
+ case "discriminatedUnion": return 45 + ir.cases.length * 12;
60
+ case "array":
61
+ case "record":
62
+ case "set":
63
+ case "map": return 55;
64
+ case "file":
65
+ case "templateLiteral": return 40;
66
+ case "literal":
67
+ case "optional":
68
+ case "nullable":
69
+ case "default": return 22;
70
+ case "recursiveRef":
71
+ case "recursionTarget": return 15;
72
+ default: return 18;
73
+ }
106
74
  }
107
75
  /** Child IR nodes that the fast generator recurses into (mirrors the fast schema generators). */
108
76
  function fastChildren(ir) {
109
- switch (ir.type) {
110
- case "object":
111
- return Object.values(ir.properties);
112
- case "array":
113
- return [ir.element];
114
- case "tuple":
115
- return ir.rest !== null ? [...ir.items, ir.rest] : ir.items;
116
- case "record":
117
- case "map":
118
- return [ir.keyType, ir.valueType];
119
- case "set":
120
- return [ir.valueType];
121
- case "union":
122
- case "discriminatedUnion":
123
- return ir.options;
124
- case "intersection":
125
- return [ir.left, ir.right];
126
- case "pipe":
127
- return [ir.in, ir.out];
128
- case "optional":
129
- case "nullable":
130
- case "readonly":
131
- case "default":
132
- case "catch":
133
- return [ir.inner];
134
- default:
135
- return [];
136
- }
77
+ switch (ir.type) {
78
+ case "object": return Object.values(ir.properties);
79
+ case "array": return [ir.element];
80
+ case "tuple": return ir.rest !== null ? [...ir.items, ir.rest] : ir.items;
81
+ case "record":
82
+ case "map": return [ir.keyType, ir.valueType];
83
+ case "set": return [ir.valueType];
84
+ case "union":
85
+ case "discriminatedUnion": return ir.options;
86
+ case "intersection": return [ir.left, ir.right];
87
+ case "pipe": return [ir.in, ir.out];
88
+ case "optional":
89
+ case "nullable":
90
+ case "readonly":
91
+ case "default":
92
+ case "catch": return [ir.inner];
93
+ default: return [];
94
+ }
137
95
  }
138
96
  /**
139
- * Estimated total size of a node's fast-check (the node plus everything inlined
140
- * beneath it). Memoized per IR node: schemas dedupe shared sub-trees and the
141
- * estimate is consulted at every nesting level, so without the cache a deep tree
142
- * would be re-walked quadratically.
143
- */
144
- export function estimateFastCost(ir, cache) {
145
- const cached = cache.get(ir);
146
- if (cached !== undefined)
147
- return cached;
148
- // Defensive cycle break (the IR is a tree today; recursiveRef is a leaf).
149
- cache.set(ir, 0);
150
- let total = shallowFastCost(ir);
151
- for (const child of fastChildren(ir))
152
- total += estimateFastCost(child, cache);
153
- cache.set(ir, total);
154
- return total;
97
+ * Estimated total size of a node's fast-check (the node plus everything inlined
98
+ * beneath it). Memoized per IR node: schemas dedupe shared sub-trees and the
99
+ * estimate is consulted at every nesting level, so without the cache a deep tree
100
+ * would be re-walked quadratically.
101
+ */
102
+ function estimateFastCost(ir, cache) {
103
+ const cached = cache.get(ir);
104
+ if (cached !== void 0) return cached;
105
+ cache.set(ir, 0);
106
+ let total = shallowFastCost(ir);
107
+ for (const child of fastChildren(ir)) total += estimateFastCost(child, cache);
108
+ cache.set(ir, total);
109
+ return total;
155
110
  }
156
- // ─── Runtime cost (check ordering) ───────────────────────────────────────────
157
111
  /**
158
- * Assumed element count for unbounded collections, used only to weight a
159
- * container against its siblings when ordering an `&&` chain.
160
- */
112
+ * Assumed element count for unbounded collections, used only to weight a
113
+ * container against its siblings when ordering an `&&` chain.
114
+ */
161
115
  const ASSUMED_ELEMENTS = 4;
162
116
  /** Runtime weight of one check on an already-type-confirmed value. */
163
117
  function checkRuntimeCost(kind) {
164
- switch (kind) {
165
- // A `.test()` call costs ~9 ns of dispatch before it matches a character —
166
- // an order of magnitude above every other check, and the reason ordering
167
- // matters at all.
168
- case "string_format":
169
- return 100;
170
- // Zero-capture user predicate: a real call, cheaper than a regex.
171
- case "refine_effect":
172
- return 20;
173
- case "includes":
174
- case "starts_with":
175
- case "ends_with":
176
- return 6;
177
- case "multiple_of":
178
- case "bigint_multiple_of":
179
- return 4;
180
- default:
181
- // length/size/range comparisons: a load and a compare.
182
- return 1;
183
- }
118
+ switch (kind) {
119
+ case "string_format": return 100;
120
+ case "refine_effect": return 20;
121
+ case "includes":
122
+ case "starts_with":
123
+ case "ends_with": return 6;
124
+ case "multiple_of":
125
+ case "bigint_multiple_of": return 4;
126
+ default: return 1;
127
+ }
184
128
  }
185
129
  /** A node's own runtime weight, EXCLUDING its children. */
186
130
  function shallowRuntimeCost(ir) {
187
- switch (ir.type) {
188
- case "string":
189
- case "number":
190
- return 2 + ir.checks.reduce((sum, c) => sum + checkRuntimeCost(c.kind), 0);
191
- case "bigint":
192
- case "date":
193
- return 3 + (ir.checks?.length ?? 0);
194
- case "file":
195
- return 3 + (ir.checks?.length ?? 0) * 2;
196
- case "enum":
197
- // Inlined `===` chain (or one hashed lookup) — sub-nanosecond either way.
198
- return 1 + Math.min(ir.values.length, 8);
199
- case "object":
200
- // Type guard, plus the strict pass's per-key membership test.
201
- return 3 + (ir.strict === true ? Object.keys(ir.properties).length : 0);
202
- case "array":
203
- case "set":
204
- case "record":
205
- case "map":
206
- case "tuple":
207
- return 3;
208
- case "templateLiteral":
209
- return 100;
210
- case "recursiveRef":
211
- case "recursionTarget":
212
- // A recursive call expands into an unknown amount of work; treat it as
213
- // the most expensive sibling so it is probed last.
214
- return 200;
215
- default:
216
- return 1;
217
- }
131
+ switch (ir.type) {
132
+ case "string":
133
+ case "number": return 2 + ir.checks.reduce((sum, c) => sum + checkRuntimeCost(c.kind), 0);
134
+ case "bigint":
135
+ case "date": return 3 + (ir.checks?.length ?? 0);
136
+ case "file": return 3 + (ir.checks?.length ?? 0) * 2;
137
+ case "enum": return 1 + Math.min(ir.values.length, 8);
138
+ case "object": return 3 + (ir.strict === true ? Object.keys(ir.properties).length : 0);
139
+ case "array":
140
+ case "set":
141
+ case "record":
142
+ case "map":
143
+ case "tuple": return 3;
144
+ case "templateLiteral": return 100;
145
+ case "recursiveRef":
146
+ case "recursionTarget": return 200;
147
+ default: return 1;
148
+ }
218
149
  }
219
150
  /** estimateRuntimeCost against the per-compile memo hanging off the context. */
220
151
  function runtimeCostOf(ir, ctx) {
221
- return estimateRuntimeCost(ir, (ctx.fastRuntimeCostCache ??= new WeakMap()));
152
+ return estimateRuntimeCost(ir, ctx.fastRuntimeCostCache ??= /* @__PURE__ */ new WeakMap());
222
153
  }
223
154
  /**
224
- * Sort a fast-check's sibling conjuncts (or union options) cheapest-first.
225
- * Returns a new array; ties keep source order (Array#sort is stable), so a
226
- * schema whose members all cost the same emits byte-identical output.
227
- */
228
- export function orderByRuntimeCost(items, irOf, ctx) {
229
- if (items.length < 2)
230
- return [...items];
231
- return [...items].sort((a, b) => runtimeCostOf(irOf(a), ctx) - runtimeCostOf(irOf(b), ctx));
155
+ * Sort a fast-check's sibling conjuncts (or union options) cheapest-first.
156
+ * Returns a new array; ties keep source order (Array#sort is stable), so a
157
+ * schema whose members all cost the same emits byte-identical output.
158
+ */
159
+ function orderByRuntimeCost(items, irOf, ctx) {
160
+ if (items.length < 2) return [...items];
161
+ return [...items].sort((a, b) => runtimeCostOf(irOf(a), ctx) - runtimeCostOf(irOf(b), ctx));
232
162
  }
233
163
  /**
234
- * Estimated runtime cost of a node's fast-check, in arbitrary units calibrated
235
- * so a regex format check dominates a handful of type guards. Memoized per IR
236
- * node, like estimateFastCost — the estimate is consulted at every nesting
237
- * level, and shared sub-trees are common.
238
- *
239
- * Used to order the conjuncts of an `&&` chain cheapest-first. Accepting input
240
- * runs every conjunct regardless, so ordering is free there; REJECTING input
241
- * stops at the first false one, which is where a schema pays for probing a
242
- * `z.email()` before the `kind` literal that actually discriminates. Measured
243
- * on a 3-option union of objects that each declare `{email, kind, note}`:
244
- * 102 ns → 39 ns for an input matching the last option, and 102 ns → 6 ns for
245
- * one matching none.
246
- */
164
+ * Estimated runtime cost of a node's fast-check, in arbitrary units calibrated
165
+ * so a regex format check dominates a handful of type guards. Memoized per IR
166
+ * node, like estimateFastCost — the estimate is consulted at every nesting
167
+ * level, and shared sub-trees are common.
168
+ *
169
+ * Used to order the conjuncts of an `&&` chain cheapest-first. Accepting input
170
+ * runs every conjunct regardless, so ordering is free there; REJECTING input
171
+ * stops at the first false one, which is where a schema pays for probing a
172
+ * `z.email()` before the `kind` literal that actually discriminates. Measured
173
+ * on a 3-option union of objects that each declare `{email, kind, note}`:
174
+ * 102 ns → 39 ns for an input matching the last option, and 102 ns → 6 ns for
175
+ * one matching none.
176
+ */
247
177
  function estimateRuntimeCost(ir, cache) {
248
- const cached = cache.get(ir);
249
- if (cached !== undefined)
250
- return cached;
251
- cache.set(ir, 0); // cycle break (mirrors estimateFastCost)
252
- let total = shallowRuntimeCost(ir);
253
- const children = fastChildren(ir);
254
- switch (ir.type) {
255
- case "array":
256
- case "set":
257
- case "record":
258
- case "map":
259
- // Per-element work, repeated for an assumed handful of entries.
260
- for (const child of children)
261
- total += estimateRuntimeCost(child, cache) * ASSUMED_ELEMENTS;
262
- break;
263
- case "discriminatedUnion":
264
- // O(1) switch: only the matched case runs. Charge the priciest option so
265
- // the estimate stays an upper bound.
266
- total += children.reduce((max, c) => Math.max(max, estimateRuntimeCost(c, cache)), 0);
267
- break;
268
- default:
269
- // object/tuple/union/intersection/wrappers: every child is on the path
270
- // (a union probes options until one matches — worst case, all of them).
271
- for (const child of children)
272
- total += estimateRuntimeCost(child, cache);
273
- break;
274
- }
275
- cache.set(ir, total);
276
- return total;
178
+ const cached = cache.get(ir);
179
+ if (cached !== void 0) return cached;
180
+ cache.set(ir, 0);
181
+ let total = shallowRuntimeCost(ir);
182
+ const children = fastChildren(ir);
183
+ switch (ir.type) {
184
+ case "array":
185
+ case "set":
186
+ case "record":
187
+ case "map":
188
+ for (const child of children) total += estimateRuntimeCost(child, cache) * ASSUMED_ELEMENTS;
189
+ break;
190
+ case "discriminatedUnion":
191
+ total += children.reduce((max, c) => Math.max(max, estimateRuntimeCost(c, cache)), 0);
192
+ break;
193
+ default:
194
+ for (const child of children) total += estimateRuntimeCost(child, cache);
195
+ break;
196
+ }
197
+ cache.set(ir, total);
198
+ return total;
277
199
  }
200
+ //#endregion
201
+ export { CALL_COST, EXTRACT_CAP, HOISTABLE, MIN_EXTRACT, estimateFastCost, orderByRuntimeCost, predictedInlineSize };
202
+
278
203
  //# sourceMappingURL=fast-size.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fast-size.js","sourceRoot":"","sources":["../../../src/core/codegen/fast-size.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC;AAElC;;;;;;GAMG;AACH,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,EAAY,EACZ,QAAgB,EAChB,KAAgC;IAEhC,OAAO,gBAAgB,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,GAAG,mBAAmB,CAAC,CAAC;AAC5E,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AAEjC,kGAAkG;AAClG,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAE5B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAkC,IAAI,GAAG,CAAC;IAC9D,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,oBAAoB;IACpB,OAAO;IACP,cAAc;CACf,CAAC,CAAC;AAEH,mFAAmF;AACnF,SAAS,eAAe,CAAC,EAAY;IACnC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,QAAQ;YACX,OAAO,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,KAAK,QAAQ;YACX,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;QACpC,KAAK,QAAQ;YACX,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;QACpC,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM;YACT,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;QAC5C,KAAK,MAAM;YACT,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;QACpC,KAAK,OAAO;YACV,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;QACnC,KAAK,OAAO;YACV,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACpC,KAAK,oBAAoB;YACvB,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;QACnC,KAAK,OAAO,CAAC;QACb,KAAK,QAAQ,CAAC;QACd,KAAK,KAAK,CAAC;QACX,KAAK,KAAK;YACR,OAAO,EAAE,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,iBAAiB;YACpB,OAAO,EAAE,CAAC;QACZ,KAAK,SAAS,CAAC;QACf,KAAK,UAAU,CAAC;QAChB,KAAK,UAAU,CAAC;QAChB,KAAK,SAAS;YACZ,OAAO,EAAE,CAAC;QACZ,KAAK,cAAc,CAAC;QACpB,KAAK,iBAAiB;YACpB,0EAA0E;YAC1E,oEAAoE;YACpE,kEAAkE;YAClE,OAAO,EAAE,CAAC;QACZ;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,iGAAiG;AACjG,SAAS,YAAY,CAAC,EAAY;IAChC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QACtC,KAAK,OAAO;YACV,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QACtB,KAAK,OAAO;YACV,OAAO,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC9D,KAAK,QAAQ,CAAC;QACd,KAAK,KAAK;YACR,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;QACpC,KAAK,KAAK;YACR,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;QACxB,KAAK,OAAO,CAAC;QACb,KAAK,oBAAoB;YACvB,OAAO,EAAE,CAAC,OAAO,CAAC;QACpB,KAAK,cAAc;YACjB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QAC7B,KAAK,MAAM;YACT,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;QACzB,KAAK,UAAU,CAAC;QAChB,KAAK,UAAU,CAAC;QAChB,KAAK,UAAU,CAAC;QAChB,KAAK,SAAS,CAAC;QACf,KAAK,OAAO;YACV,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QACpB;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAY,EAAE,KAAgC;IAC7E,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,0EAA0E;IAC1E,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACjB,IAAI,KAAK,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,YAAY,CAAC,EAAE,CAAC;QAAE,KAAK,IAAI,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC9E,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACrB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,sEAAsE;AACtE,SAAS,gBAAgB,CAAC,IAAY;IACpC,QAAQ,IAAI,EAAE,CAAC;QACb,2EAA2E;QAC3E,yEAAyE;QACzE,kBAAkB;QAClB,KAAK,eAAe;YAClB,OAAO,GAAG,CAAC;QACb,kEAAkE;QAClE,KAAK,eAAe;YAClB,OAAO,EAAE,CAAC;QACZ,KAAK,UAAU,CAAC;QAChB,KAAK,aAAa,CAAC;QACnB,KAAK,WAAW;YACd,OAAO,CAAC,CAAC;QACX,KAAK,aAAa,CAAC;QACnB,KAAK,oBAAoB;YACvB,OAAO,CAAC,CAAC;QACX;YACE,uDAAuD;YACvD,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC;AAED,2DAA2D;AAC3D,SAAS,kBAAkB,CAAC,EAAY;IACtC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ;YACX,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM;YACT,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;QACtC,KAAK,MAAM;YACT,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1C,KAAK,MAAM;YACT,0EAA0E;YAC1E,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC3C,KAAK,QAAQ;YACX,8DAA8D;YAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,KAAK,OAAO,CAAC;QACb,KAAK,KAAK,CAAC;QACX,KAAK,QAAQ,CAAC;QACd,KAAK,KAAK,CAAC;QACX,KAAK,OAAO;YACV,OAAO,CAAC,CAAC;QACX,KAAK,iBAAiB;YACpB,OAAO,GAAG,CAAC;QACb,KAAK,cAAc,CAAC;QACpB,KAAK,iBAAiB;YACpB,uEAAuE;YACvE,mDAAmD;YACnD,OAAO,GAAG,CAAC;QACb;YACE,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,SAAS,aAAa,CAAC,EAAY,EAAE,GAAmB;IACtD,OAAO,mBAAmB,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,oBAAoB,KAAK,IAAI,OAAO,EAAoB,CAAC,CAAC,CAAC;AACjG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAmB,EACnB,IAA2B,EAC3B,GAAmB;IAEnB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,mBAAmB,CAAC,EAAY,EAAE,KAAgC;IACzE,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,yCAAyC;IAC3D,IAAI,KAAK,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;IAClC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,OAAO,CAAC;QACb,KAAK,KAAK,CAAC;QACX,KAAK,QAAQ,CAAC;QACd,KAAK,KAAK;YACR,gEAAgE;YAChE,KAAK,MAAM,KAAK,IAAI,QAAQ;gBAAE,KAAK,IAAI,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,gBAAgB,CAAC;YAC5F,MAAM;QACR,KAAK,oBAAoB;YACvB,yEAAyE;YACzE,qCAAqC;YACrC,KAAK,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACtF,MAAM;QACR;YACE,uEAAuE;YACvE,wEAAwE;YACxE,KAAK,MAAM,KAAK,IAAI,QAAQ;gBAAE,KAAK,IAAI,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACzE,MAAM;IACV,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACrB,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"fast-size.js","names":[],"sources":["../../../src/core/codegen/fast-size.ts"],"sourcesContent":["/**\n * Fast-path size estimation, used to bound the size of each emitted fast-check\n * function. V8's TurboFan refuses to optimize functions whose bytecode exceeds\n * ~60KB and falls back to the weaker Maglev tier — measured ~1.3-1.8x slower on\n * deeply-nested schemas whose monolithic fast-check crosses that budget. By\n * extracting large, self-contained sub-schemas into their own boolean helpers\n * (`generateFast`), each function stays small enough to TurboFan.\n *\n * `estimateFastCost` is a path-agnostic subtree estimate in approximate\n * generated-character units (it can't see the access-path prefix the node will\n * be emitted under, since that lives in the call site, not the IR). The actual\n * emitted size of an inlined node grows with that prefix length — `input[\"a\"]\n * [\"b\"][\"c\"]…` repeated per check — so the extraction decision scales the\n * estimate by `1 + inputLen/PATH_GROWTH_DIVISOR` (see `predictedInlineSize`).\n * The accumulator itself (generateFast) tracks EXACT emitted chars via the\n * returned string length, so only the look-ahead prediction is approximate.\n */\n\nimport type { SchemaIR } from \"../types.js\";\nimport type { CodeGenContext } from \"./context.js\";\n\n/**\n * Per-function soft size cap, in emitted characters. Once the fast-check being\n * assembled would exceed this, the next large hoistable sub-schema is split into\n * its own helper. Set below the ~60KB bytecode point where TurboFan bails (chars\n * over-approximate bytecode) with margin for one look-ahead mis-prediction.\n */\nexport const EXTRACT_CAP = 38_000;\n\n/**\n * Each nesting level lengthens every access path inside a node (`x[\"a\"]` →\n * `x[\"a\"][\"b\"]`), inflating real emitted chars above the path-agnostic estimate.\n * The extraction look-ahead multiplies the estimate by `1 + inputLen/this` so a\n * deep subtree is split before it inlines into an over-budget function. Smaller\n * ⇒ more eager splitting at depth. Calibrated against deeply-nested fixtures.\n */\nconst PATH_GROWTH_DIVISOR = 26;\n\n/**\n * Predicted emitted size of inlining `ir` at a call site whose input expression\n * is `inputLen` chars long — the path-agnostic subtree estimate scaled up for\n * the access-path prefix that estimate omits. Used only for the extract/inline\n * decision; the running total uses exact emitted lengths.\n */\nexport function predictedInlineSize(\n ir: SchemaIR,\n inputLen: number,\n cache: WeakMap<SchemaIR, number>,\n): number {\n return estimateFastCost(ir, cache) * (1 + inputLen / PATH_GROWTH_DIVISOR);\n}\n\n/**\n * Floor for extraction: never hoist a sub-schema smaller than this even when\n * the enclosing function is over the cap — a tiny helper trades a real call for\n * no optimization benefit. Only sub-schemas big enough to matter are split.\n */\nexport const MIN_EXTRACT = 1_200;\n\n/** Approximate size contributed to the enclosing function by an extracted call `__fo_N(expr)`. */\nexport const CALL_COST = 24;\n\n/**\n * Node types whose fast-check is a self-contained boolean over a single input\n * expression and large enough to be worth hoisting into `function f(p){return …}`.\n * Thin wrappers (optional/nullable/default/…) are omitted: their inner schema is\n * visited through `generateFast` and gets hoisted on its own when large.\n */\nexport const HOISTABLE: ReadonlySet<SchemaIR[\"type\"]> = new Set([\n \"object\",\n \"record\",\n \"tuple\",\n \"discriminatedUnion\",\n \"union\",\n \"intersection\",\n]);\n\n/** A node's own contribution to the emitted fast-check, EXCLUDING its children. */\nfunction shallowFastCost(ir: SchemaIR): number {\n switch (ir.type) {\n case \"object\":\n return 50 + Object.keys(ir.properties).length * 25 + (ir.strict ? 120 : 0);\n case \"string\":\n return 20 + ir.checks.length * 35;\n case \"number\":\n return 25 + ir.checks.length * 30;\n case \"bigint\":\n case \"date\":\n return 25 + (ir.checks?.length ?? 0) * 25;\n case \"enum\":\n return 15 + ir.values.length * 12;\n case \"tuple\":\n return 40 + ir.items.length * 15;\n case \"union\":\n return 12 + ir.options.length * 6;\n case \"discriminatedUnion\":\n return 45 + ir.cases.length * 12;\n case \"array\":\n case \"record\":\n case \"set\":\n case \"map\":\n return 55;\n case \"file\":\n case \"templateLiteral\":\n return 40;\n case \"literal\":\n case \"optional\":\n case \"nullable\":\n case \"default\":\n return 22;\n case \"recursiveRef\":\n case \"recursionTarget\":\n // Both emit just a call to a hosted helper; the target's `inner` is sized\n // independently when its own helper body is generated, so it is NOT\n // counted against the enclosing function here (see fastChildren).\n return 15;\n default:\n return 18;\n }\n}\n\n/** Child IR nodes that the fast generator recurses into (mirrors the fast schema generators). */\nfunction fastChildren(ir: SchemaIR): readonly SchemaIR[] {\n switch (ir.type) {\n case \"object\":\n return Object.values(ir.properties);\n case \"array\":\n return [ir.element];\n case \"tuple\":\n return ir.rest !== null ? [...ir.items, ir.rest] : ir.items;\n case \"record\":\n case \"map\":\n return [ir.keyType, ir.valueType];\n case \"set\":\n return [ir.valueType];\n case \"union\":\n case \"discriminatedUnion\":\n return ir.options;\n case \"intersection\":\n return [ir.left, ir.right];\n case \"pipe\":\n return [ir.in, ir.out];\n case \"optional\":\n case \"nullable\":\n case \"readonly\":\n case \"default\":\n case \"catch\":\n return [ir.inner];\n default:\n return [];\n }\n}\n\n/**\n * Estimated total size of a node's fast-check (the node plus everything inlined\n * beneath it). Memoized per IR node: schemas dedupe shared sub-trees and the\n * estimate is consulted at every nesting level, so without the cache a deep tree\n * would be re-walked quadratically.\n */\nexport function estimateFastCost(ir: SchemaIR, cache: WeakMap<SchemaIR, number>): number {\n const cached = cache.get(ir);\n if (cached !== undefined) return cached;\n // Defensive cycle break (the IR is a tree today; recursiveRef is a leaf).\n cache.set(ir, 0);\n let total = shallowFastCost(ir);\n for (const child of fastChildren(ir)) total += estimateFastCost(child, cache);\n cache.set(ir, total);\n return total;\n}\n\n// ─── Runtime cost (check ordering) ───────────────────────────────────────────\n\n/**\n * Assumed element count for unbounded collections, used only to weight a\n * container against its siblings when ordering an `&&` chain.\n */\nconst ASSUMED_ELEMENTS = 4;\n\n/** Runtime weight of one check on an already-type-confirmed value. */\nfunction checkRuntimeCost(kind: string): number {\n switch (kind) {\n // A `.test()` call costs ~9 ns of dispatch before it matches a character —\n // an order of magnitude above every other check, and the reason ordering\n // matters at all.\n case \"string_format\":\n return 100;\n // Zero-capture user predicate: a real call, cheaper than a regex.\n case \"refine_effect\":\n return 20;\n case \"includes\":\n case \"starts_with\":\n case \"ends_with\":\n return 6;\n case \"multiple_of\":\n case \"bigint_multiple_of\":\n return 4;\n default:\n // length/size/range comparisons: a load and a compare.\n return 1;\n }\n}\n\n/** A node's own runtime weight, EXCLUDING its children. */\nfunction shallowRuntimeCost(ir: SchemaIR): number {\n switch (ir.type) {\n case \"string\":\n case \"number\":\n return 2 + ir.checks.reduce((sum, c) => sum + checkRuntimeCost(c.kind), 0);\n case \"bigint\":\n case \"date\":\n return 3 + (ir.checks?.length ?? 0);\n case \"file\":\n return 3 + (ir.checks?.length ?? 0) * 2;\n case \"enum\":\n // Inlined `===` chain (or one hashed lookup) — sub-nanosecond either way.\n return 1 + Math.min(ir.values.length, 8);\n case \"object\":\n // Type guard, plus the strict pass's per-key membership test.\n return 3 + (ir.strict === true ? Object.keys(ir.properties).length : 0);\n case \"array\":\n case \"set\":\n case \"record\":\n case \"map\":\n case \"tuple\":\n return 3;\n case \"templateLiteral\":\n return 100;\n case \"recursiveRef\":\n case \"recursionTarget\":\n // A recursive call expands into an unknown amount of work; treat it as\n // the most expensive sibling so it is probed last.\n return 200;\n default:\n return 1;\n }\n}\n\n/** estimateRuntimeCost against the per-compile memo hanging off the context. */\nfunction runtimeCostOf(ir: SchemaIR, ctx: CodeGenContext): number {\n return estimateRuntimeCost(ir, (ctx.fastRuntimeCostCache ??= new WeakMap<SchemaIR, number>()));\n}\n\n/**\n * Sort a fast-check's sibling conjuncts (or union options) cheapest-first.\n * Returns a new array; ties keep source order (Array#sort is stable), so a\n * schema whose members all cost the same emits byte-identical output.\n */\nexport function orderByRuntimeCost<T>(\n items: readonly T[],\n irOf: (item: T) => SchemaIR,\n ctx: CodeGenContext,\n): T[] {\n if (items.length < 2) return [...items];\n return [...items].sort((a, b) => runtimeCostOf(irOf(a), ctx) - runtimeCostOf(irOf(b), ctx));\n}\n\n/**\n * Estimated runtime cost of a node's fast-check, in arbitrary units calibrated\n * so a regex format check dominates a handful of type guards. Memoized per IR\n * node, like estimateFastCost — the estimate is consulted at every nesting\n * level, and shared sub-trees are common.\n *\n * Used to order the conjuncts of an `&&` chain cheapest-first. Accepting input\n * runs every conjunct regardless, so ordering is free there; REJECTING input\n * stops at the first false one, which is where a schema pays for probing a\n * `z.email()` before the `kind` literal that actually discriminates. Measured\n * on a 3-option union of objects that each declare `{email, kind, note}`:\n * 102 ns → 39 ns for an input matching the last option, and 102 ns → 6 ns for\n * one matching none.\n */\nfunction estimateRuntimeCost(ir: SchemaIR, cache: WeakMap<SchemaIR, number>): number {\n const cached = cache.get(ir);\n if (cached !== undefined) return cached;\n cache.set(ir, 0); // cycle break (mirrors estimateFastCost)\n let total = shallowRuntimeCost(ir);\n const children = fastChildren(ir);\n switch (ir.type) {\n case \"array\":\n case \"set\":\n case \"record\":\n case \"map\":\n // Per-element work, repeated for an assumed handful of entries.\n for (const child of children) total += estimateRuntimeCost(child, cache) * ASSUMED_ELEMENTS;\n break;\n case \"discriminatedUnion\":\n // O(1) switch: only the matched case runs. Charge the priciest option so\n // the estimate stays an upper bound.\n total += children.reduce((max, c) => Math.max(max, estimateRuntimeCost(c, cache)), 0);\n break;\n default:\n // object/tuple/union/intersection/wrappers: every child is on the path\n // (a union probes options until one matches — worst case, all of them).\n for (const child of children) total += estimateRuntimeCost(child, cache);\n break;\n }\n cache.set(ir, total);\n return total;\n}\n"],"mappings":"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"}
@@ -1,25 +1,25 @@
1
- import type { SchemaIR } from "../types.js";
2
- import type { CodeGenResult, CodegenMode } from "./context.js";
3
- import type { SharedSchemaPlan } from "./dedupe.js";
4
- export type { CodeGenResult } from "./context.js";
5
- export interface GenerateValidatorOptions {
6
- refCount?: number;
7
- /** Codegen output mode. Defaults to "inline". */
8
- mode?: CodegenMode;
9
- /**
10
- * File-level shared slow-walk plan (schema deduplication). Applied only to
11
- * mutation-free schemas, so shared walks stay on the deferred cold path.
12
- */
13
- sharedSchemas?: SharedSchemaPlan | undefined;
14
- /**
15
- * Compact mode (`output: "compact"`). Drop the compiled slow walk for
16
- * mutation-free schemas with a TOTAL fast path and delegate the cold error
17
- * path to the retained Zod schema (`__zcFinZ`). The fast (hot) path is
18
- * unchanged; only the bulky error-collecting walk — 64–77% of generated
19
- * bytes — is replaced by a few bytes of zod delegation. See
20
- * {@link CodeGenResult.rootDelegateRefIndex}.
21
- */
22
- compact?: boolean | undefined;
1
+ import { SchemaIR } from "../types.js";
2
+ import { SharedSchemaPlan } from "./dedupe.js";
3
+ import { CodeGenResult, CodegenMode } from "./context.js";
4
+ //#region src/core/codegen/index.d.ts
5
+ interface GenerateValidatorOptions {
6
+ refCount?: number;
7
+ /** Codegen output mode. Defaults to "inline". */
8
+ mode?: CodegenMode;
9
+ /**
10
+ * File-level shared slow-walk plan (schema deduplication). Applied only to
11
+ * mutation-free schemas, so shared walks stay on the deferred cold path.
12
+ */
13
+ sharedSchemas?: SharedSchemaPlan | undefined;
14
+ /**
15
+ * Compact mode (`output: "compact"`). Drop the compiled slow walk for
16
+ * mutation-free schemas with a TOTAL fast path and delegate the cold error
17
+ * path to the retained Zod schema (`__zcFinZ`). The fast (hot) path is
18
+ * unchanged; only the bulky error-collecting walk — 64–77% of generated
19
+ * bytes — is replaced by a few bytes of zod delegation. See
20
+ * {@link CodeGenResult.rootDelegateRefIndex}.
21
+ */
22
+ compact?: boolean | undefined;
23
23
  }
24
24
  /**
25
25
  * Generate optimized validation code from SchemaIR.
@@ -30,5 +30,7 @@ export interface GenerateValidatorOptions {
30
30
  *
31
31
  * Usage: `new Function(code + "\nreturn " + functionDef + ";")()`
32
32
  */
33
- export declare function generateValidator(ir: SchemaIR, name: string, options?: GenerateValidatorOptions): CodeGenResult;
33
+ declare function generateValidator(ir: SchemaIR, name: string, options?: GenerateValidatorOptions): CodeGenResult;
34
+ //#endregion
35
+ export { type CodeGenResult, GenerateValidatorOptions, generateValidator };
34
36
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/codegen/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAkB,aAAa,EAAE,WAAW,EAAgB,MAAM,cAAc,CAAC;AAG7F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB;;;OAGG;IACH,aAAa,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC7C;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,wBAAwB,GACjC,aAAa,CAqYf"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/core/codegen/index.ts"],"mappings":";;;;UAUiB;EACf;;EAEA,OAAO;;;;;EAKP,gBAAgB;;;;;;;;;EAShB;;;;;;;;;;;iBAYc,kBACd,IAAI,UACJ,cACA,UAAU,2BACT"}