@storyshelf/core 0.7.0 → 0.9.0-next-d2cc082

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 (537) hide show
  1. package/dist/adapter/capture-queue.d.mts +0 -2
  2. package/dist/adapter/capture-runner.d.mts +10 -4
  3. package/dist/adapter/capture-runner.mjs +7 -2
  4. package/dist/adapter/database.d.mts +63 -3
  5. package/dist/adapter/database.mjs +4 -3
  6. package/dist/adapter/database.mjs.map +1 -1
  7. package/dist/adapter/design.d.mts +0 -2
  8. package/dist/adapter/design.mjs +1 -2
  9. package/dist/adapter/email-sender.d.mts +0 -2
  10. package/dist/adapter/metadata.d.mts +0 -2
  11. package/dist/adapter/oauth.d.mts +0 -2
  12. package/dist/adapter/setup.d.mts +0 -2
  13. package/dist/adapter/setup.mjs +1 -2
  14. package/dist/adapter/storage.d.mts +1 -3
  15. package/dist/adapter/webhook-events.d.mts +0 -2
  16. package/dist/adapter/webhook-events.mjs +12 -13
  17. package/dist/adapter/webhook-events.mjs.map +1 -1
  18. package/dist/adapters/capture-target-offers.d.mts +0 -2
  19. package/dist/adapters/capture-target-offers.mjs +1 -2
  20. package/dist/adapters/capture-target.d.mts +0 -2
  21. package/dist/adapters/capture-target.mjs +1 -2
  22. package/dist/adapters/notifier/build-comment.d.mts +0 -2
  23. package/dist/adapters/notifier/build-comment.mjs +1 -2
  24. package/dist/adapters/notifier/build-state.d.mts +0 -2
  25. package/dist/adapters/notifier/build-state.mjs +1 -2
  26. package/dist/adapters/notifier/events.d.mts +0 -2
  27. package/dist/adapters/notifier/events.mjs +1 -2
  28. package/dist/adapters/notifier/format.d.mts +0 -2
  29. package/dist/adapters/notifier/format.mjs +1 -2
  30. package/dist/adapters/notifier/provider.d.mts +0 -2
  31. package/dist/adapters/notifier/provider.mjs +1 -2
  32. package/dist/adapters/notifier/state.d.mts +0 -2
  33. package/dist/adapters/notifier/state.mjs +1 -2
  34. package/dist/adapters/notifier/types.d.mts +0 -2
  35. package/dist/adapters/remote-browser.d.mts +120 -31
  36. package/dist/adapters/remote-browser.mjs +134 -34
  37. package/dist/adapters/remote-browser.mjs.map +1 -1
  38. package/dist/adapters/remote-lease-attempt.mjs +39 -0
  39. package/dist/adapters/remote-lease-attempt.mjs.map +1 -0
  40. package/dist/adapters/remote-lease-error.d.mts +25 -0
  41. package/dist/adapters/remote-lease-error.mjs +54 -0
  42. package/dist/adapters/remote-lease-error.mjs.map +1 -0
  43. package/dist/adapters/remote-lease-held.d.mts +15 -0
  44. package/dist/adapters/remote-lease-held.mjs +86 -0
  45. package/dist/adapters/remote-lease-held.mjs.map +1 -0
  46. package/dist/adapters/remote-lease-shutdown.d.mts +12 -0
  47. package/dist/adapters/remote-lease-shutdown.mjs +32 -0
  48. package/dist/adapters/remote-lease-shutdown.mjs.map +1 -0
  49. package/dist/adapters/remote-lease.d.mts +39 -0
  50. package/dist/adapters/remote-lease.mjs +175 -0
  51. package/dist/adapters/remote-lease.mjs.map +1 -0
  52. package/dist/adapters/remote-limiter.mjs +121 -0
  53. package/dist/adapters/remote-limiter.mjs.map +1 -0
  54. package/dist/adapters/remote-pool.d.mts +56 -0
  55. package/dist/adapters/remote-pool.mjs +195 -0
  56. package/dist/adapters/remote-pool.mjs.map +1 -0
  57. package/dist/adapters/remote-sizing.d.mts +44 -0
  58. package/dist/adapters/remote-sizing.mjs +53 -0
  59. package/dist/adapters/remote-sizing.mjs.map +1 -0
  60. package/dist/adapters/render-runs.d.mts +0 -2
  61. package/dist/adapters/render-runs.mjs +1 -2
  62. package/dist/adapters/setup-runner.d.mts +0 -2
  63. package/dist/adapters/setup-runner.mjs +1 -2
  64. package/dist/adapters/sources.d.mts +0 -2
  65. package/dist/adapters/sources.mjs +1 -2
  66. package/dist/adapters/validate.d.mts +0 -2
  67. package/dist/adapters/validate.mjs +2 -2
  68. package/dist/adapters/validate.mjs.map +1 -1
  69. package/dist/ai.d.mts +0 -2
  70. package/dist/ai.mjs +1 -2
  71. package/dist/auth.d.mts +0 -2
  72. package/dist/auth.mjs +1 -2
  73. package/dist/brand-packs.d.mts +0 -2
  74. package/dist/brand-packs.mjs +0 -1
  75. package/dist/capture/a11y/axe-source.d.mts +0 -2
  76. package/dist/capture/a11y/axe-source.mjs +1 -2
  77. package/dist/capture/a11y/in-page.d.mts +1 -3
  78. package/dist/capture/a11y/in-page.mjs +3 -4
  79. package/dist/capture/a11y/in-page.mjs.map +1 -1
  80. package/dist/capture/a11y/map.d.mts +0 -2
  81. package/dist/capture/a11y/map.mjs +1 -2
  82. package/dist/capture/a11y/options.d.mts +0 -2
  83. package/dist/capture/a11y/options.mjs +1 -2
  84. package/dist/capture/adapter.d.mts +5 -2
  85. package/dist/capture/adapter.mjs +1 -2
  86. package/dist/capture/adapter.mjs.map +1 -1
  87. package/dist/capture/affected.d.mts +0 -2
  88. package/dist/capture/affected.mjs +1 -2
  89. package/dist/capture/attempt-logger.mjs +1 -2
  90. package/dist/capture/browsers.d.mts +0 -2
  91. package/dist/capture/browsers.mjs +1 -2
  92. package/dist/capture/build-state/deliver.d.mts +0 -2
  93. package/dist/capture/build-state/deliver.mjs +1 -2
  94. package/dist/capture/build-state/notify-job.d.mts +0 -2
  95. package/dist/capture/build-state/notify-job.mjs +1 -2
  96. package/dist/capture/build-state/publisher.d.mts +0 -2
  97. package/dist/capture/build-state/publisher.mjs +1 -2
  98. package/dist/capture/build-state/resume.d.mts +0 -2
  99. package/dist/capture/build-state/resume.mjs +1 -2
  100. package/dist/capture/build-state/types.d.mts +1 -3
  101. package/dist/capture/catalog/catalogue.d.mts +0 -2
  102. package/dist/capture/catalog/catalogue.mjs +1 -2
  103. package/dist/capture/catalog/components.d.mts +0 -2
  104. package/dist/capture/catalog/components.mjs +1 -2
  105. package/dist/capture/catalog/history.d.mts +0 -2
  106. package/dist/capture/catalog/history.mjs +1 -2
  107. package/dist/capture/catalog/hook.d.mts +0 -2
  108. package/dist/capture/catalog/hook.mjs +1 -2
  109. package/dist/capture/catalog/index.d.mts +2 -2
  110. package/dist/capture/catalog/load.d.mts +0 -2
  111. package/dist/capture/catalog/load.mjs +1 -2
  112. package/dist/capture/catalog/parse.d.mts +0 -2
  113. package/dist/capture/catalog/parse.mjs +1 -2
  114. package/dist/capture/catalog/read.d.mts +6 -3
  115. package/dist/capture/catalog/read.mjs +14 -8
  116. package/dist/capture/catalog/read.mjs.map +1 -1
  117. package/dist/capture/catalog/types.d.mts +0 -2
  118. package/dist/capture/comparison-reference.d.mts +27 -0
  119. package/dist/capture/comparison-reference.mjs +75 -0
  120. package/dist/capture/comparison-reference.mjs.map +1 -0
  121. package/dist/capture/consumer/capture-handler.d.mts +1 -3
  122. package/dist/capture/consumer/capture-handler.mjs +1 -2
  123. package/dist/capture/consumer/idle.d.mts +0 -2
  124. package/dist/capture/consumer/idle.mjs +1 -2
  125. package/dist/capture/consumer/index.d.mts +0 -2
  126. package/dist/capture/consumer/index.mjs +1 -2
  127. package/dist/capture/consumer/loop.mjs +1 -2
  128. package/dist/capture/consumer/metrics.d.mts +0 -2
  129. package/dist/capture/consumer/metrics.mjs +1 -2
  130. package/dist/capture/consumer/retry.d.mts +0 -2
  131. package/dist/capture/consumer/retry.mjs +1 -2
  132. package/dist/capture/consumer/run-job.mjs +1 -2
  133. package/dist/capture/consumer/startup.mjs +1 -2
  134. package/dist/capture/consumer/types.d.mts +0 -2
  135. package/dist/capture/crash-failure.d.mts +0 -2
  136. package/dist/capture/crash-failure.mjs +1 -2
  137. package/dist/capture/db-queue/cadence.d.mts +0 -2
  138. package/dist/capture/db-queue/cadence.mjs +1 -2
  139. package/dist/capture/db-queue/claim.d.mts +0 -2
  140. package/dist/capture/db-queue/claim.mjs +20 -4
  141. package/dist/capture/db-queue/claim.mjs.map +1 -1
  142. package/dist/capture/db-queue/clock.mjs +1 -2
  143. package/dist/capture/db-queue/codec.mjs +1 -2
  144. package/dist/capture/db-queue/index.d.mts +0 -2
  145. package/dist/capture/db-queue/index.mjs +3 -3
  146. package/dist/capture/db-queue/index.mjs.map +1 -1
  147. package/dist/capture/db-queue/keeper.d.mts +0 -2
  148. package/dist/capture/db-queue/keeper.mjs +1 -2
  149. package/dist/capture/db-queue/lease.mjs +1 -2
  150. package/dist/capture/db-queue/lifecycle.mjs +1 -2
  151. package/dist/capture/db-queue/operations.mjs +1 -2
  152. package/dist/capture/db-queue/poll-loop.d.mts +0 -2
  153. package/dist/capture/db-queue/poll-loop.mjs +1 -2
  154. package/dist/capture/db-queue/poll.d.mts +0 -2
  155. package/dist/capture/db-queue/poll.mjs +1 -2
  156. package/dist/capture/db-queue/timers.d.mts +0 -2
  157. package/dist/capture/db-queue/timers.mjs +1 -2
  158. package/dist/capture/db-queue/types.d.mts +0 -2
  159. package/dist/capture/db-queue/types.mjs +1 -2
  160. package/dist/capture/db-queue/types.mjs.map +1 -1
  161. package/dist/capture/db-queue/wake.mjs +1 -2
  162. package/dist/capture/design.mjs +1 -2
  163. package/dist/capture/diff-record.mjs +1 -2
  164. package/dist/capture/dispatch.d.mts +1 -3
  165. package/dist/capture/dispatch.mjs +17 -5
  166. package/dist/capture/dispatch.mjs.map +1 -1
  167. package/dist/capture/enrich.mjs +1 -2
  168. package/dist/capture/failure-sets.mjs +1 -2
  169. package/dist/capture/fingerprint.d.mts +19 -8
  170. package/dist/capture/fingerprint.mjs +43 -14
  171. package/dist/capture/fingerprint.mjs.map +1 -1
  172. package/dist/capture/forked/channel.d.mts +0 -2
  173. package/dist/capture/forked/child.d.mts +0 -2
  174. package/dist/capture/forked/child.mjs +1 -2
  175. package/dist/capture/forked/crash-tracker.mjs +1 -2
  176. package/dist/capture/forked/decision.d.mts +0 -2
  177. package/dist/capture/forked/decision.mjs +1 -2
  178. package/dist/capture/forked/exit.mjs +1 -2
  179. package/dist/capture/forked/fork.d.mts +0 -2
  180. package/dist/capture/forked/fork.mjs +1 -2
  181. package/dist/capture/forked/forked-capture.d.mts +0 -2
  182. package/dist/capture/forked/forked-capture.mjs +1 -2
  183. package/dist/capture/forked/lease-book.mjs +1 -2
  184. package/dist/capture/forked/protocol.d.mts +0 -2
  185. package/dist/capture/forked/protocol.mjs +1 -2
  186. package/dist/capture/forked/runs.mjs +1 -2
  187. package/dist/capture/guards.mjs +1 -2
  188. package/dist/capture/ignore-regions.d.mts +36 -0
  189. package/dist/capture/ignore-regions.mjs +65 -0
  190. package/dist/capture/ignore-regions.mjs.map +1 -0
  191. package/dist/capture/isolate.mjs +1 -2
  192. package/dist/capture/job-lease.d.mts +0 -2
  193. package/dist/capture/job-lease.mjs +1 -2
  194. package/dist/capture/matrix.mjs +4 -4
  195. package/dist/capture/matrix.mjs.map +1 -1
  196. package/dist/capture/modes.d.mts +0 -2
  197. package/dist/capture/modes.mjs +2 -3
  198. package/dist/capture/modes.mjs.map +1 -1
  199. package/dist/capture/orchestrator.d.mts +0 -2
  200. package/dist/capture/orchestrator.mjs +2 -3
  201. package/dist/capture/pipeline.d.mts +0 -2
  202. package/dist/capture/pipeline.mjs +44 -10
  203. package/dist/capture/pipeline.mjs.map +1 -1
  204. package/dist/capture/progress.d.mts +0 -2
  205. package/dist/capture/progress.mjs +1 -2
  206. package/dist/capture/publish/accept.d.mts +0 -2
  207. package/dist/capture/publish/accept.mjs +1 -2
  208. package/dist/capture/publish/complete.d.mts +1 -3
  209. package/dist/capture/publish/complete.mjs +1 -2
  210. package/dist/capture/publish/extract.d.mts +0 -2
  211. package/dist/capture/publish/extract.mjs +6 -5
  212. package/dist/capture/publish/extract.mjs.map +1 -1
  213. package/dist/capture/publish/handler.d.mts +1 -3
  214. package/dist/capture/publish/handler.mjs +1 -2
  215. package/dist/capture/publish/index.d.mts +2 -1
  216. package/dist/capture/publish/invalid-zip.d.mts +8 -0
  217. package/dist/capture/publish/invalid-zip.mjs +11 -0
  218. package/dist/capture/publish/invalid-zip.mjs.map +1 -0
  219. package/dist/capture/publish/limits.d.mts +0 -2
  220. package/dist/capture/publish/limits.mjs +1 -2
  221. package/dist/capture/publish/published.d.mts +0 -2
  222. package/dist/capture/publish/published.mjs +1 -2
  223. package/dist/capture/publish/run.d.mts +1 -3
  224. package/dist/capture/publish/run.mjs +1 -2
  225. package/dist/capture/rediff.d.mts +1 -3
  226. package/dist/capture/rediff.mjs +19 -6
  227. package/dist/capture/rediff.mjs.map +1 -1
  228. package/dist/capture/render.mjs +1 -2
  229. package/dist/capture/render.mjs.map +1 -1
  230. package/dist/capture/scratch.d.mts +0 -2
  231. package/dist/capture/scratch.mjs +2 -4
  232. package/dist/capture/scratch.mjs.map +1 -1
  233. package/dist/capture/shard-plan.mjs +1 -2
  234. package/dist/capture/shards/context.mjs +3 -3
  235. package/dist/capture/shards/context.mjs.map +1 -1
  236. package/dist/capture/shards/execute.mjs +4 -3
  237. package/dist/capture/shards/execute.mjs.map +1 -1
  238. package/dist/capture/shards/fan-out.mjs +1 -2
  239. package/dist/capture/shards/history.mjs +1 -2
  240. package/dist/capture/shards/reduce.mjs +1 -2
  241. package/dist/capture/sizing.d.mts +0 -2
  242. package/dist/capture/sizing.mjs +1 -2
  243. package/dist/capture/skip-checks.mjs +1 -2
  244. package/dist/capture/statics.d.mts +0 -2
  245. package/dist/capture/statics.mjs +2 -4
  246. package/dist/capture/statics.mjs.map +1 -1
  247. package/dist/capture/storybook-urls.d.mts +0 -2
  248. package/dist/capture/storybook-urls.mjs +3 -3
  249. package/dist/capture/storybook-urls.mjs.map +1 -1
  250. package/dist/capture/storybook.d.mts +0 -2
  251. package/dist/capture/storybook.mjs +8 -4
  252. package/dist/capture/storybook.mjs.map +1 -1
  253. package/dist/capture/target.mjs +1 -2
  254. package/dist/capture/targets.d.mts +0 -2
  255. package/dist/capture/targets.mjs +1 -2
  256. package/dist/capture/tests.d.mts +0 -2
  257. package/dist/capture/tests.mjs +13 -3
  258. package/dist/capture/tests.mjs.map +1 -1
  259. package/dist/capture/token-chunks.mjs +24 -7
  260. package/dist/capture/token-chunks.mjs.map +1 -1
  261. package/dist/capture.d.mts +5 -2
  262. package/dist/capture.mjs +5 -2
  263. package/dist/config.d.mts +16 -3
  264. package/dist/config.mjs +6 -3
  265. package/dist/config.mjs.map +1 -1
  266. package/dist/diff.d.mts +0 -2
  267. package/dist/diff.mjs +1 -2
  268. package/dist/index.d.mts +2 -2
  269. package/dist/index.mjs +2 -2
  270. package/dist/insights/budget.d.mts +0 -2
  271. package/dist/insights/budget.mjs +1 -2
  272. package/dist/insights/envelope.d.mts +0 -2
  273. package/dist/insights/envelope.mjs +1 -2
  274. package/dist/insights/evidence-health.d.mts +0 -2
  275. package/dist/insights/evidence-health.mjs +1 -2
  276. package/dist/insights/evidence.d.mts +0 -2
  277. package/dist/insights/evidence.mjs +1 -2
  278. package/dist/insights/hash.d.mts +0 -2
  279. package/dist/insights/hash.mjs +1 -2
  280. package/dist/insights/limits.d.mts +0 -2
  281. package/dist/insights/limits.mjs +1 -2
  282. package/dist/insights/prompts/v1.d.mts +0 -2
  283. package/dist/insights/prompts/v1.mjs +1 -2
  284. package/dist/insights/redact.d.mts +0 -2
  285. package/dist/insights/redact.mjs +1 -2
  286. package/dist/insights/text.mjs +1 -2
  287. package/dist/logger.d.mts +0 -2
  288. package/dist/logger.mjs +1 -2
  289. package/dist/models/ai-budget-alert.d.mts +0 -2
  290. package/dist/models/ai-budget-alert.mjs +1 -2
  291. package/dist/models/ai-usage.d.mts +0 -2
  292. package/dist/models/ai-usage.mjs +1 -2
  293. package/dist/models/baseline-approval.d.mts +18 -0
  294. package/dist/models/baseline-approval.mjs +41 -0
  295. package/dist/models/baseline-approval.mjs.map +1 -0
  296. package/dist/models/baseline-archive.d.mts +0 -2
  297. package/dist/models/baseline-archive.mjs +1 -2
  298. package/dist/models/baseline-atomic.mjs +66 -0
  299. package/dist/models/baseline-atomic.mjs.map +1 -0
  300. package/dist/models/baseline-conflict.d.mts +6 -0
  301. package/dist/models/baseline-conflict.mjs +9 -0
  302. package/dist/models/baseline-conflict.mjs.map +1 -0
  303. package/dist/models/baseline-export.d.mts +0 -2
  304. package/dist/models/baseline-export.mjs +1 -2
  305. package/dist/models/baseline-import.mjs +1 -2
  306. package/dist/models/baseline-origin.d.mts +16 -0
  307. package/dist/models/baseline-origin.mjs +35 -0
  308. package/dist/models/baseline-origin.mjs.map +1 -0
  309. package/dist/models/baseline-status.d.mts +0 -2
  310. package/dist/models/baseline-status.mjs +1 -2
  311. package/dist/models/baseline-transfer.d.mts +1 -2
  312. package/dist/models/baseline-transfer.mjs +30 -2
  313. package/dist/models/baseline-transfer.mjs.map +1 -1
  314. package/dist/models/baseline.d.mts +5 -2
  315. package/dist/models/baseline.mjs +91 -12
  316. package/dist/models/baseline.mjs.map +1 -1
  317. package/dist/models/build-component.d.mts +0 -2
  318. package/dist/models/build-component.mjs +1 -2
  319. package/dist/models/build-review-status.d.mts +0 -2
  320. package/dist/models/build-review-status.mjs +1 -2
  321. package/dist/models/build-review.d.mts +0 -2
  322. package/dist/models/build-review.mjs +1 -2
  323. package/dist/models/build.d.mts +1 -3
  324. package/dist/models/build.mjs +14 -15
  325. package/dist/models/build.mjs.map +1 -1
  326. package/dist/models/capture-attempt.d.mts +0 -2
  327. package/dist/models/capture-attempt.mjs +1 -2
  328. package/dist/models/capture-job.d.mts +0 -2
  329. package/dist/models/capture-job.mjs +1 -2
  330. package/dist/models/capture-log.d.mts +0 -2
  331. package/dist/models/capture-log.mjs +1 -2
  332. package/dist/models/capture-shard.d.mts +0 -2
  333. package/dist/models/capture-shard.mjs +1 -2
  334. package/dist/models/changeset.d.mts +0 -2
  335. package/dist/models/changeset.mjs +1 -2
  336. package/dist/models/columns.mjs +1 -2
  337. package/dist/models/comment.d.mts +0 -2
  338. package/dist/models/comment.mjs +1 -2
  339. package/dist/models/component.d.mts +0 -2
  340. package/dist/models/component.mjs +1 -2
  341. package/dist/models/connections.d.mts +0 -2
  342. package/dist/models/connections.mjs +1 -2
  343. package/dist/models/content-ref.d.mts +0 -2
  344. package/dist/models/content-ref.mjs +1 -2
  345. package/dist/models/credentials.d.mts +0 -2
  346. package/dist/models/credentials.mjs +1 -2
  347. package/dist/models/design-credentials.d.mts +0 -2
  348. package/dist/models/design-credentials.mjs +1 -2
  349. package/dist/models/design-health.d.mts +16 -3
  350. package/dist/models/design-health.mjs +21 -3
  351. package/dist/models/design-health.mjs.map +1 -1
  352. package/dist/models/design-nodes.d.mts +11 -4
  353. package/dist/models/design-nodes.mjs +18 -3
  354. package/dist/models/design-nodes.mjs.map +1 -1
  355. package/dist/models/design-renders.mjs +1 -2
  356. package/dist/models/design-resolve.d.mts +0 -2
  357. package/dist/models/design-resolve.mjs +1 -2
  358. package/dist/models/design.d.mts +0 -2
  359. package/dist/models/design.mjs +1 -2
  360. package/dist/models/inherited-ratio.d.mts +0 -2
  361. package/dist/models/inherited-ratio.mjs +1 -2
  362. package/dist/models/insight.d.mts +0 -2
  363. package/dist/models/insight.mjs +1 -2
  364. package/dist/models/label.d.mts +0 -2
  365. package/dist/models/label.mjs +1 -2
  366. package/dist/models/member.d.mts +0 -2
  367. package/dist/models/member.mjs +1 -2
  368. package/dist/models/notification-channel.d.mts +0 -2
  369. package/dist/models/notification-channel.mjs +1 -2
  370. package/dist/models/notification-subscription.d.mts +0 -2
  371. package/dist/models/notification-subscription.mjs +1 -2
  372. package/dist/models/project-group-mapping.d.mts +0 -2
  373. package/dist/models/project-group-mapping.mjs +1 -2
  374. package/dist/models/project.d.mts +0 -2
  375. package/dist/models/project.mjs +1 -2
  376. package/dist/models/public-origin.d.mts +0 -2
  377. package/dist/models/public-origin.mjs +1 -2
  378. package/dist/models/review-switch-off.d.mts +0 -2
  379. package/dist/models/review-switch-off.mjs +1 -2
  380. package/dist/models/site-settings.d.mts +0 -2
  381. package/dist/models/site-settings.mjs +1 -2
  382. package/dist/models/snapshot.d.mts +3 -2
  383. package/dist/models/snapshot.mjs +4 -2
  384. package/dist/models/snapshot.mjs.map +1 -1
  385. package/dist/models/token.d.mts +0 -2
  386. package/dist/models/token.mjs +1 -2
  387. package/dist/models/usage.d.mts +0 -2
  388. package/dist/models/usage.mjs +1 -2
  389. package/dist/models/user.d.mts +0 -2
  390. package/dist/models/user.mjs +1 -2
  391. package/dist/models/webhook.d.mts +0 -2
  392. package/dist/models/webhook.mjs +1 -2
  393. package/dist/models.d.mts +6 -3
  394. package/dist/models.mjs +6 -3
  395. package/dist/options.d.mts +0 -2
  396. package/dist/options.mjs +2 -4
  397. package/dist/options.mjs.map +1 -1
  398. package/dist/paths.d.mts +3 -3
  399. package/dist/paths.mjs +7 -3
  400. package/dist/paths.mjs.map +1 -1
  401. package/dist/retention/ai.d.mts +1 -3
  402. package/dist/retention/ai.mjs +0 -1
  403. package/dist/retention/pending.mjs +1 -2
  404. package/dist/retention/published-gzip-sweep.mjs +28 -0
  405. package/dist/retention/published-gzip-sweep.mjs.map +1 -0
  406. package/dist/retention/screenshot-sweep.d.mts +0 -2
  407. package/dist/retention/screenshot-sweep.mjs +1 -2
  408. package/dist/retention.d.mts +0 -2
  409. package/dist/retention.mjs +5 -2
  410. package/dist/retention.mjs.map +1 -1
  411. package/dist/schema/baseline.d.mts +2 -2
  412. package/dist/schema/build-component.d.mts +0 -2
  413. package/dist/schema/build-review.d.mts +0 -2
  414. package/dist/schema/build.d.mts +0 -2
  415. package/dist/schema/capture-attempt.d.mts +0 -2
  416. package/dist/schema/capture-job.d.mts +0 -2
  417. package/dist/schema/capture-shard.d.mts +0 -2
  418. package/dist/schema/comment.d.mts +0 -2
  419. package/dist/schema/connection.d.mts +0 -2
  420. package/dist/schema/content-ref.d.mts +0 -2
  421. package/dist/schema/design.d.mts +2 -2
  422. package/dist/schema/insight.d.mts +0 -2
  423. package/dist/schema/label.d.mts +0 -2
  424. package/dist/schema/member.d.mts +0 -2
  425. package/dist/schema/notification.d.mts +0 -2
  426. package/dist/schema/project-group-mapping.d.mts +0 -2
  427. package/dist/schema/project.d.mts +0 -2
  428. package/dist/schema/site-setting.d.mts +0 -2
  429. package/dist/schema/snapshot.d.mts +5 -2
  430. package/dist/schema/token.d.mts +0 -2
  431. package/dist/schema/usage.d.mts +0 -2
  432. package/dist/schema/user.d.mts +0 -2
  433. package/dist/schema/webhook.d.mts +0 -2
  434. package/dist/schema.d.mts +4 -6
  435. package/dist/serverless.d.mts +0 -2
  436. package/dist/serverless.mjs +1 -2
  437. package/dist/test-helpers/build-reference-contract.d.mts +14 -0
  438. package/dist/test-helpers/build-reference-contract.mjs +66 -0
  439. package/dist/test-helpers/build-reference-contract.mjs.map +1 -0
  440. package/dist/test-helpers/create-project.d.mts +0 -2
  441. package/dist/test-helpers/create-project.mjs +1 -2
  442. package/dist/test-helpers/database-contract.d.mts +0 -2
  443. package/dist/test-helpers/database-contract.mjs +37 -2
  444. package/dist/test-helpers/database-contract.mjs.map +1 -1
  445. package/dist/test-helpers/deferred.d.mts +0 -2
  446. package/dist/test-helpers/deferred.mjs +1 -2
  447. package/dist/test-helpers/design-contract.d.mts +0 -2
  448. package/dist/test-helpers/design-contract.mjs +1 -2
  449. package/dist/test-helpers/fake-adapters.d.mts +0 -2
  450. package/dist/test-helpers/fake-adapters.mjs +1 -2
  451. package/dist/test-helpers/fake-database.d.mts +0 -2
  452. package/dist/test-helpers/fake-database.mjs +7 -2
  453. package/dist/test-helpers/fake-database.mjs.map +1 -1
  454. package/dist/test-helpers/fake-design.d.mts +0 -2
  455. package/dist/test-helpers/fake-design.mjs +1 -2
  456. package/dist/test-helpers/fake-notifier.d.mts +0 -2
  457. package/dist/test-helpers/fake-notifier.mjs +1 -2
  458. package/dist/test-helpers/fake-storage.d.mts +0 -2
  459. package/dist/test-helpers/fake-storage.mjs +1 -2
  460. package/dist/test-helpers/fake-tables.mjs +6 -2
  461. package/dist/test-helpers/fake-tables.mjs.map +1 -1
  462. package/dist/test-helpers/manual-clock.d.mts +0 -2
  463. package/dist/test-helpers/manual-clock.mjs +1 -2
  464. package/dist/test-helpers/notifier-contract.d.mts +0 -2
  465. package/dist/test-helpers/notifier-contract.mjs +1 -2
  466. package/dist/test-helpers/queue-contract.d.mts +0 -2
  467. package/dist/test-helpers/queue-contract.mjs +1 -2
  468. package/dist/test-helpers/queue-multi-instance.d.mts +0 -2
  469. package/dist/test-helpers/queue-multi-instance.mjs +1 -2
  470. package/dist/test-helpers/runner-contract.d.mts +0 -2
  471. package/dist/test-helpers/runner-contract.mjs +1 -2
  472. package/dist/test-helpers/sql-chunks.mjs +2 -2
  473. package/dist/test-helpers/sql-chunks.mjs.map +1 -1
  474. package/dist/test-helpers/storage-contract.d.mts +0 -2
  475. package/dist/test-helpers/storage-contract.mjs +1 -2
  476. package/dist/test-helpers.d.mts +2 -1
  477. package/dist/test-helpers.mjs +2 -1
  478. package/dist/tracing.mjs +36 -6
  479. package/dist/tracing.mjs.map +1 -1
  480. package/dist/types.d.mts +0 -2
  481. package/dist/types.mjs +1 -2
  482. package/dist/urls.d.mts +0 -2
  483. package/dist/urls.mjs +1 -2
  484. package/dist/utils/adaptive-concurrency.d.mts +0 -2
  485. package/dist/utils/adaptive-concurrency.mjs +1 -2
  486. package/dist/utils/connect-retry.d.mts +2 -2
  487. package/dist/utils/connect-retry.mjs +2 -3
  488. package/dist/utils/connect-retry.mjs.map +1 -1
  489. package/dist/utils/encrypt.d.mts +0 -2
  490. package/dist/utils/encrypt.mjs +1 -2
  491. package/dist/utils/environment.d.mts +0 -2
  492. package/dist/utils/environment.mjs +1 -2
  493. package/dist/utils/hash.d.mts +0 -2
  494. package/dist/utils/hash.mjs +1 -2
  495. package/dist/utils/http.d.mts +13 -3
  496. package/dist/utils/http.mjs +79 -17
  497. package/dist/utils/http.mjs.map +1 -1
  498. package/dist/utils/map-adaptive.d.mts +0 -2
  499. package/dist/utils/map-adaptive.mjs +1 -2
  500. package/dist/utils/map-limit.d.mts +0 -2
  501. package/dist/utils/map-limit.mjs +1 -2
  502. package/dist/utils/mime.d.mts +0 -2
  503. package/dist/utils/mime.mjs +1 -2
  504. package/dist/utils/page-limiter.d.mts +0 -2
  505. package/dist/utils/page-limiter.mjs +1 -2
  506. package/dist/utils/path-security.d.mts +0 -2
  507. package/dist/utils/path-security.mjs +2 -4
  508. package/dist/utils/path-security.mjs.map +1 -1
  509. package/dist/utils/public-origin.d.mts +0 -2
  510. package/dist/utils/public-origin.mjs +1 -2
  511. package/dist/utils/redact.d.mts +0 -2
  512. package/dist/utils/redact.mjs +1 -2
  513. package/dist/utils/remote-environment.d.mts +40 -3
  514. package/dist/utils/remote-environment.mjs +52 -3
  515. package/dist/utils/remote-environment.mjs.map +1 -1
  516. package/dist/utils/resources.d.mts +0 -2
  517. package/dist/utils/resources.mjs +1 -2
  518. package/dist/utils/screenshot-store.d.mts +0 -2
  519. package/dist/utils/screenshot-store.mjs +1 -2
  520. package/dist/utils/session-gate.d.mts +7 -6
  521. package/dist/utils/session-gate.mjs +28 -12
  522. package/dist/utils/session-gate.mjs.map +1 -1
  523. package/dist/utils/storybook-token.d.mts +11 -3
  524. package/dist/utils/storybook-token.mjs +10 -9
  525. package/dist/utils/storybook-token.mjs.map +1 -1
  526. package/dist/utils/storybook-url.d.mts +0 -2
  527. package/dist/utils/storybook-url.mjs +1 -2
  528. package/dist/utils/timing.d.mts +0 -2
  529. package/dist/utils/timing.mjs +1 -2
  530. package/dist/utils/ulid.d.mts +0 -2
  531. package/dist/utils/ulid.mjs +1 -2
  532. package/dist/utils/zip-read.mjs +1 -2
  533. package/dist/utils/zip-write.d.mts +0 -2
  534. package/dist/utils/zip-write.mjs +1 -2
  535. package/dist/utils.d.mts +5 -5
  536. package/dist/utils.mjs +5 -5
  537. package/package.json +6 -15
@@ -5,7 +5,7 @@ import { clampListLimit } from "../adapter/database.mjs";
5
5
  import { fakeSchema } from "./fake-tables.mjs";
6
6
  import { orderRows, whereMatches } from "./sql-chunks.mjs";
7
7
  import { getTableName } from "drizzle-orm";
8
- //#region src/test-helpers/fake-database.ts
8
+ // src/test-helpers/fake-database.ts
9
9
  function withoutUndefined(values) {
10
10
  return Object.fromEntries(Object.entries(values).filter((pair) => pair[1] !== void 0));
11
11
  }
@@ -96,6 +96,12 @@ function makeDatabase() {
96
96
  tables: fakeSchema,
97
97
  insert: insertRow,
98
98
  update: updateRow,
99
+ updateWhere: async (table, id, values, where) => {
100
+ const current = rowsOf(table).get(id);
101
+ if (!current) return null;
102
+ if (whereMatches(where, current, table)) return await updateRow(table, id, values);
103
+ return current;
104
+ },
99
105
  get: getRow,
100
106
  remove: async (table, id) => {
101
107
  rowsOf(table).delete(id);
@@ -110,7 +116,6 @@ function makeDatabase() {
110
116
  }
111
117
  } };
112
118
  }
113
- //#endregion
114
119
  export { makeDatabase };
115
120
 
116
121
  //# sourceMappingURL=fake-database.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"fake-database.mjs","names":[],"sources":["../../src/test-helpers/fake-database.ts"],"sourcesContent":["import { getTableName } from \"drizzle-orm\";\nimport type { SQL, Table } from \"drizzle-orm\";\nimport type { DatabaseAdapter, ListOptions, TxStore } from \"../adapters/database.ts\";\nimport { clampListLimit } from \"../adapters/database.ts\";\nimport { fakeSchema } from \"./fake-tables.ts\";\nimport { orderRows, whereMatches } from \"./sql-chunks.ts\";\n\nfunction withoutUndefined(values: unknown): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(values as Record<string, unknown>).filter((pair) => pair[1] !== undefined),\n );\n}\n\n/** Column defaults real drivers apply on insert (the fake has no DDL). */\nconst INSERT_DEFAULTS: Record<string, Record<string, unknown>> = {\n snapshots: { browser: \"chromium\" },\n baselines: { browser: \"chromium\" },\n};\n\n// The in-memory fake back-fills Drizzle's inferred row types from raw maps\n// Without a driver, so the casts and await-free `async` methods are unavoidable.\n/* eslint-disable require-await, no-unnecessary-type-assertion, no-unnecessary-type-parameters, non-nullable-type-assertion-style */\n/** Create an in-memory database adapter for capture pipeline tests. */\nexport function makeDatabase(): { db: DatabaseAdapter } {\n const store = new Map<Table, Map<string, unknown>>();\n\n const rowsOf = (table: Table): Map<string, unknown> => {\n let rowMap = store.get(table);\n if (!rowMap) {\n rowMap = new Map();\n store.set(table, rowMap);\n }\n return rowMap;\n };\n\n const insertRow = async <T extends Table>(\n table: T,\n values: T[\"$inferInsert\"],\n ): Promise<T[\"$inferSelect\"]> => {\n const row = { ...INSERT_DEFAULTS[getTableName(table)], ...withoutUndefined(values) };\n const key = (row[\"id\"] ?? row[\"hash\"]) as string;\n if (rowsOf(table).has(key)) {\n throw new Error(`UNIQUE constraint failed: duplicate key ${key}`);\n }\n rowsOf(table).set(key, row);\n return row as T[\"$inferSelect\"];\n };\n\n const updateRow = async <T extends Table>(\n table: T,\n id: string,\n values: Partial<T[\"$inferInsert\"]>,\n ): Promise<T[\"$inferSelect\"]> => {\n const current = rowsOf(table).get(id) as Record<string, unknown> | undefined;\n if (current === undefined) {\n throw new Error(\"row not found\");\n }\n const merged = withoutUndefined({ ...current, ...values });\n rowsOf(table).set(id, merged);\n return merged as T[\"$inferSelect\"];\n };\n\n const getRow = async <T extends Table>(\n table: T,\n id: string,\n ): Promise<T[\"$inferSelect\"] | null> => {\n const found = rowsOf(table).get(id);\n if (found === undefined) {\n return null;\n }\n return found as T[\"$inferSelect\"];\n };\n\n const listRows = async <T extends Table>(\n table: T,\n opts: ListOptions = {},\n ): Promise<T[\"$inferSelect\"][]> => {\n let current = [...rowsOf(table).values()];\n if (opts.where) {\n const { where } = opts;\n current = current.filter((row) => whereMatches(where, row as Record<string, unknown>, table));\n }\n if (opts.orderBy) {\n current = orderRows(current, opts.orderBy, table);\n }\n const start = opts.offset ?? 0;\n if (opts.limit !== undefined) {\n current = current.slice(start, start + (clampListLimit(opts.limit) ?? 0));\n } else if (start > 0) {\n current = current.slice(start);\n }\n return current as T[\"$inferSelect\"][];\n };\n\n const countRows = async (table: Table, where?: SQL): Promise<number> => {\n const matching = await listRows(table, where ? { where } : {});\n return matching.length;\n };\n\n const transactRows = async <R>(fn: (tx: TxStore) => Promise<R>): Promise<R> => {\n const snapshot = new Map<Table, Map<string, unknown>>();\n for (const [table, rows] of store) {\n snapshot.set(\n table,\n new Map([...rows].map(([id, row]) => [id, { ...(row as Record<string, unknown>) }])),\n );\n }\n const tx: TxStore = {\n insert: insertRow,\n update: updateRow,\n get: getRow,\n remove: async (table, id) => {\n rowsOf(table).delete(id);\n },\n list: listRows,\n count: countRows,\n };\n try {\n return await fn(tx);\n } catch (error) {\n store.clear();\n for (const [table, rows] of snapshot) {\n store.set(table, rows);\n }\n throw error;\n }\n };\n\n const db: DatabaseAdapter = {\n metadata: { name: \"Fake Database\", version: \"0.0.0\", kind: \"memory\", category: \"database\" },\n tables: fakeSchema,\n insert: insertRow,\n update: updateRow,\n get: getRow,\n remove: async (table, id) => {\n rowsOf(table).delete(id);\n },\n list: listRows,\n count: countRows,\n transact: transactRows,\n all: async (_query: SQL) => {\n const results: Record<string, unknown>[] = [];\n for (const rows of store.values()) {\n for (const row of rows.values()) {\n results.push(row as Record<string, unknown>);\n }\n }\n return results as never[];\n },\n };\n return { db };\n}\n/* eslint-enable require-await, no-unnecessary-type-assertion, no-unnecessary-type-parameters, non-nullable-type-assertion-style */\n"],"mappings":"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"}
1
+ {"version":3,"file":"fake-database.mjs","names":[],"sources":["../../src/test-helpers/fake-database.ts"],"sourcesContent":["import { getTableName } from \"drizzle-orm\";\nimport type { SQL, Table } from \"drizzle-orm\";\nimport type { DatabaseAdapter, ListOptions, TxStore } from \"../adapters/database.ts\";\nimport { clampListLimit } from \"../adapters/database.ts\";\nimport { fakeSchema } from \"./fake-tables.ts\";\nimport { orderRows, whereMatches } from \"./sql-chunks.ts\";\n\nfunction withoutUndefined(values: unknown): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(values as Record<string, unknown>).filter((pair) => pair[1] !== undefined),\n );\n}\n\n/** Column defaults real drivers apply on insert (the fake has no DDL). */\nconst INSERT_DEFAULTS: Record<string, Record<string, unknown>> = {\n snapshots: { browser: \"chromium\" },\n baselines: { browser: \"chromium\" },\n};\n\n// The in-memory fake back-fills Drizzle's inferred row types from raw maps\n// Without a driver, so the casts and await-free `async` methods are unavoidable.\n/* eslint-disable require-await, no-unnecessary-type-assertion, no-unnecessary-type-parameters, non-nullable-type-assertion-style */\n/** Create an in-memory database adapter for capture pipeline tests. */\nexport function makeDatabase(): { db: DatabaseAdapter } {\n const store = new Map<Table, Map<string, unknown>>();\n\n const rowsOf = (table: Table): Map<string, unknown> => {\n let rowMap = store.get(table);\n if (!rowMap) {\n rowMap = new Map();\n store.set(table, rowMap);\n }\n return rowMap;\n };\n\n const insertRow = async <T extends Table>(\n table: T,\n values: T[\"$inferInsert\"],\n ): Promise<T[\"$inferSelect\"]> => {\n const row = { ...INSERT_DEFAULTS[getTableName(table)], ...withoutUndefined(values) };\n const key = (row[\"id\"] ?? row[\"hash\"]) as string;\n if (rowsOf(table).has(key)) {\n throw new Error(`UNIQUE constraint failed: duplicate key ${key}`);\n }\n rowsOf(table).set(key, row);\n return row as T[\"$inferSelect\"];\n };\n\n const updateRow = async <T extends Table>(\n table: T,\n id: string,\n values: Partial<T[\"$inferInsert\"]>,\n ): Promise<T[\"$inferSelect\"]> => {\n const current = rowsOf(table).get(id) as Record<string, unknown> | undefined;\n if (current === undefined) {\n throw new Error(\"row not found\");\n }\n const merged = withoutUndefined({ ...current, ...values });\n rowsOf(table).set(id, merged);\n return merged as T[\"$inferSelect\"];\n };\n\n const getRow = async <T extends Table>(\n table: T,\n id: string,\n ): Promise<T[\"$inferSelect\"] | null> => {\n const found = rowsOf(table).get(id);\n if (found === undefined) {\n return null;\n }\n return found as T[\"$inferSelect\"];\n };\n\n const listRows = async <T extends Table>(\n table: T,\n opts: ListOptions = {},\n ): Promise<T[\"$inferSelect\"][]> => {\n let current = [...rowsOf(table).values()];\n if (opts.where) {\n const { where } = opts;\n current = current.filter((row) => whereMatches(where, row as Record<string, unknown>, table));\n }\n if (opts.orderBy) {\n current = orderRows(current, opts.orderBy, table);\n }\n const start = opts.offset ?? 0;\n if (opts.limit !== undefined) {\n current = current.slice(start, start + (clampListLimit(opts.limit) ?? 0));\n } else if (start > 0) {\n current = current.slice(start);\n }\n return current as T[\"$inferSelect\"][];\n };\n\n const countRows = async (table: Table, where?: SQL): Promise<number> => {\n const matching = await listRows(table, where ? { where } : {});\n return matching.length;\n };\n\n const transactRows = async <R>(fn: (tx: TxStore) => Promise<R>): Promise<R> => {\n const snapshot = new Map<Table, Map<string, unknown>>();\n for (const [table, rows] of store) {\n snapshot.set(\n table,\n new Map([...rows].map(([id, row]) => [id, { ...(row as Record<string, unknown>) }])),\n );\n }\n const tx: TxStore = {\n insert: insertRow,\n update: updateRow,\n get: getRow,\n remove: async (table, id) => {\n rowsOf(table).delete(id);\n },\n list: listRows,\n count: countRows,\n };\n try {\n return await fn(tx);\n } catch (error) {\n store.clear();\n for (const [table, rows] of snapshot) {\n store.set(table, rows);\n }\n throw error;\n }\n };\n\n const db: DatabaseAdapter = {\n metadata: { name: \"Fake Database\", version: \"0.0.0\", kind: \"memory\", category: \"database\" },\n tables: fakeSchema,\n insert: insertRow,\n update: updateRow,\n updateWhere: async (table, id, values, where) => {\n const current = rowsOf(table).get(id) as Record<string, unknown> | undefined;\n if (!current) return null;\n if (whereMatches(where, current, table)) return await updateRow(table, id, values);\n return current as never;\n },\n get: getRow,\n remove: async (table, id) => {\n rowsOf(table).delete(id);\n },\n list: listRows,\n count: countRows,\n transact: transactRows,\n all: async (_query: SQL) => {\n const results: Record<string, unknown>[] = [];\n for (const rows of store.values()) {\n for (const row of rows.values()) {\n results.push(row as Record<string, unknown>);\n }\n }\n return results as never[];\n },\n };\n return { db };\n}\n/* eslint-enable require-await, no-unnecessary-type-assertion, no-unnecessary-type-parameters, non-nullable-type-assertion-style */\n"],"mappings":"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"}
@@ -2,7 +2,6 @@ import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
3
  import { DesignProvider, DesignState } from "../adapter/design.mjs";
4
4
  import { Buffer } from "node:buffer";
5
- //#region src/test-helpers/fake-design.d.ts
6
5
  declare const FAKE_PNG: Buffer<ArrayBuffer>;
7
6
  /** Mutable behavior and call log of a {@link makeFakeDesign} provider. */
8
7
  interface FakeDesign {
@@ -38,6 +37,5 @@ interface FakeDesign {
38
37
  declare const fakeUrl: (fileKey: string, nodeId?: string) => string;
39
38
  /** Create a fake provider whose behavior the test mutates through the returned object. */
40
39
  declare function makeFakeDesign(kind?: string): FakeDesign;
41
- //#endregion
42
40
  export { FAKE_PNG, FakeDesign, fakeUrl, makeFakeDesign };
43
41
  //# sourceMappingURL=fake-design.d.mts.map
@@ -2,7 +2,7 @@ import "node:path";
2
2
  import "node:url";
3
3
  import.meta.url;
4
4
  import { Buffer } from "node:buffer";
5
- //#region src/test-helpers/fake-design.ts
5
+ // src/test-helpers/fake-design.ts
6
6
  /** A scriptable in-memory design provider for model and app tests (links look like `https://design.test/<file>?node=<id>`). */
7
7
  const FAKE_PNG = Buffer.from([
8
8
  137,
@@ -108,7 +108,6 @@ function makeFakeDesign(kind = "fake") {
108
108
  };
109
109
  return fake;
110
110
  }
111
- //#endregion
112
111
  export { FAKE_PNG, fakeUrl, makeFakeDesign };
113
112
 
114
113
  //# sourceMappingURL=fake-design.mjs.map
@@ -2,7 +2,6 @@ import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
3
  import { SetStateInput, StateNotifierProvider } from "../adapters/notifier/provider.mjs";
4
4
  import { z } from "zod";
5
- //#region src/test-helpers/fake-notifier.d.ts
6
5
  /** A recording state provider and the writes it received. */
7
6
  interface FakeStateNotifier {
8
7
  provider: StateNotifierProvider;
@@ -16,6 +15,5 @@ interface FakeStateNotifier {
16
15
  * channel config schema (any object by default).
17
16
  */
18
17
  declare function makeFakeStateNotifier(kind?: string, failWith?: string, schema?: z.ZodType): FakeStateNotifier;
19
- //#endregion
20
18
  export { FakeStateNotifier, makeFakeStateNotifier };
21
19
  //# sourceMappingURL=fake-notifier.d.mts.map
@@ -2,7 +2,7 @@ import "node:path";
2
2
  import "node:url";
3
3
  import.meta.url;
4
4
  import { z } from "zod";
5
- //#region src/test-helpers/fake-notifier.ts
5
+ // src/test-helpers/fake-notifier.ts
6
6
  /** Fake `state` notifier (a git host stand-in) recording every state write. */
7
7
  /**
8
8
  * Build a fake `state` provider of the given kind. `failWith` makes every write
@@ -38,7 +38,6 @@ function makeFakeStateNotifier(kind = "fake-git", failWith, schema = z.object({}
38
38
  secrets
39
39
  };
40
40
  }
41
- //#endregion
42
41
  export { makeFakeStateNotifier };
43
42
 
44
43
  //# sourceMappingURL=fake-notifier.mjs.map
@@ -1,7 +1,6 @@
1
1
  import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
3
  import { StorageAdapter } from "../adapter/storage.mjs";
4
- //#region src/test-helpers/fake-storage.d.ts
5
4
  /** Storage and database doubles used by the capture pipeline tests. */
6
5
  interface FakeStorage {
7
6
  storage: StorageAdapter;
@@ -9,6 +8,5 @@ interface FakeStorage {
9
8
  }
10
9
  /** Create an in-memory storage adapter for capture pipeline tests. */
11
10
  declare function makeStorage(): FakeStorage;
12
- //#endregion
13
11
  export { FakeStorage, makeStorage };
14
12
  //# sourceMappingURL=fake-storage.d.mts.map
@@ -2,7 +2,7 @@ import "node:path";
2
2
  import "node:url";
3
3
  import.meta.url;
4
4
  import { Readable } from "node:stream";
5
- //#region src/test-helpers/fake-storage.ts
5
+ // src/test-helpers/fake-storage.ts
6
6
  /** Create an in-memory storage adapter for capture pipeline tests. */
7
7
  function makeStorage() {
8
8
  const objects = /* @__PURE__ */ new Map();
@@ -43,7 +43,6 @@ function makeStorage() {
43
43
  objects
44
44
  };
45
45
  }
46
- //#endregion
47
46
  export { makeStorage };
48
47
 
49
48
  //# sourceMappingURL=fake-storage.mjs.map
@@ -2,7 +2,7 @@ import "node:path";
2
2
  import "node:url";
3
3
  import.meta.url;
4
4
  import { Column, Table } from "drizzle-orm";
5
- //#region src/test-helpers/fake-tables.ts
5
+ // src/test-helpers/fake-tables.ts
6
6
  /**
7
7
  * Dialect-free stub tables for the in-memory test fake.
8
8
  *
@@ -112,6 +112,7 @@ const designNodes = defineTable("design_nodes", {
112
112
  state: "state",
113
113
  renderPath: "render_path",
114
114
  renderVersion: "render_version",
115
+ notifiedVersion: "notified_version",
115
116
  fetchedAt: "fetched_at",
116
117
  createdAt: "created_at",
117
118
  updatedAt: "updated_at"
@@ -265,6 +266,9 @@ const fakeSchema = {
265
266
  inherited: "inherited",
266
267
  baselineId: "baseline_id",
267
268
  baselineVersion: "baseline_version",
269
+ sourceBuildId: "source_build_id",
270
+ comparisonImagePath: "comparison_image_path",
271
+ comparisonMetadata: "comparison_metadata",
268
272
  mode: "mode",
269
273
  browser: "browser",
270
274
  createdAt: "created_at",
@@ -277,6 +281,7 @@ const fakeSchema = {
277
281
  viewportName: "viewport_name",
278
282
  branch: "branch",
279
283
  snapshotId: "snapshot_id",
284
+ sourceBuildId: "source_build_id",
280
285
  screenshotPath: "screenshot_path",
281
286
  infraHash: "infra_hash",
282
287
  fingerprint: "fingerprint",
@@ -458,7 +463,6 @@ const fakeSchema = {
458
463
  createdAt: "created_at"
459
464
  })
460
465
  };
461
- //#endregion
462
466
  export { fakeSchema };
463
467
 
464
468
  //# sourceMappingURL=fake-tables.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"fake-tables.mjs","names":[],"sources":["../../src/test-helpers/fake-tables.ts"],"sourcesContent":["/**\n * Dialect-free stub tables for the in-memory test fake.\n *\n * The fake never touches a driver: it only needs table handles whose columns\n * carry the property → column-name mapping (`getTableColumns`) and flow\n * through drizzle's expression builders (`eq`, `and`, `inArray`, `orderBy`)\n * into the `sql-chunks.ts` matcher. Real `Column`/`Table` base classes from\n * the `drizzle-orm` root (already a core dependency) satisfy both without\n * pulling in any dialect package (`sqlite-core`, `pg-core`, …).\n */\nimport { Column, Table } from \"drizzle-orm\";\nimport type { Tables } from \"../adapters/database.ts\";\n\n/** A column handle with driver passthrough mapping (the fake maps nothing). */\nclass FakeColumn extends Column {\n override getSQLType(): string {\n return this.columnType;\n }\n}\n\n// `Table.Symbol` is runtime-only (`@internal`, absent from the public types).\nconst columnsSymbol = (Table as unknown as { Symbol: { Columns: symbol } }).Symbol.Columns;\n\nfunction defineTable(name: string, columns: Record<string, string>): Table {\n const table = new Table(name, undefined, name);\n const handles: Record<string, FakeColumn> = {};\n for (const [property, dbName] of Object.entries(columns)) {\n handles[property] = new FakeColumn(table, {\n name: dbName,\n keyAsName: false,\n notNull: false,\n default: undefined,\n defaultFn: undefined,\n onUpdateFn: undefined,\n hasDefault: false,\n primaryKey: false,\n isUnique: false,\n uniqueName: undefined,\n uniqueType: undefined,\n dataType: \"string\",\n columnType: \"FakeColumn\",\n generated: undefined,\n generatedIdentity: undefined,\n });\n }\n (table as unknown as Record<symbol, unknown>)[columnsSymbol] = handles;\n return table;\n}\n\n// Stub tables matching the real schema's property -> column mapping.\n// No constraints or defaults — just names for whereMatches/orderRows.\nconst projects = defineTable(\"projects\", {\n id: \"id\",\n name: \"name\",\n slug: \"slug\",\n gitRepository: \"git_repository\",\n gitDefaultBranch: \"git_default_branch\",\n pixelThreshold: \"pixel_threshold\",\n maxDiffRatio: \"max_diff_ratio\",\n publicBranchRegex: \"public_branch_regex\",\n storybookMeta: \"storybook_meta\",\n executePlay: \"execute_play\",\n playTimeoutMs: \"play_timeout_ms\",\n runA11y: \"run_a11y\",\n runTests: \"run_tests\",\n browser: \"browser\",\n viewports: \"viewports\",\n browsers: \"browsers\",\n modesAllowlist: \"modes_allowlist\",\n automigrate: \"automigrate\",\n aiProfile: \"ai_profile\",\n reviewEnabled: \"review_enabled\",\n reviewApprovals: \"review_approvals\",\n storybookUrlTtlSeconds: \"storybook_url_ttl_seconds\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst designLinks = defineTable(\"design_links\", {\n id: \"id\",\n projectId: \"project_id\",\n importPath: \"import_path\",\n label: \"label\",\n url: \"url\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst designCredentials = defineTable(\"design_credentials\", {\n id: \"id\",\n projectId: \"project_id\",\n provider: \"provider\",\n tokenEncrypted: \"token_encrypted\",\n status: \"status\",\n checkedAt: \"checked_at\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst userConnections = defineTable(\"user_connections\", {\n id: \"id\",\n userId: \"user_id\",\n service: \"service\",\n tokenEncrypted: \"token_encrypted\",\n refreshTokenEncrypted: \"refresh_token_encrypted\",\n expiresAt: \"expires_at\",\n status: \"status\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst designNodes = defineTable(\"design_nodes\", {\n id: \"id\",\n projectId: \"project_id\",\n provider: \"provider\",\n viewerId: \"viewer_id\",\n fileKey: \"file_key\",\n nodeId: \"node_id\",\n name: \"name\",\n version: \"version\",\n lastModified: \"last_modified\",\n state: \"state\",\n renderPath: \"render_path\",\n renderVersion: \"render_version\",\n fetchedAt: \"fetched_at\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst builds = defineTable(\"builds\", {\n id: \"id\",\n projectId: \"project_id\",\n gitSha: \"git_sha\",\n gitBranch: \"git_branch\",\n isDefault: \"is_default\",\n authorEmail: \"author_email\",\n authorName: \"author_name\",\n message: \"message\",\n public: \"public\",\n status: \"status\",\n snapshotCount: \"snapshot_count\",\n changedCount: \"changed_count\",\n approvedCount: \"approved_count\",\n rejectedCount: \"rejected_count\",\n inheritedCount: \"inherited_count\",\n affectedOnly: \"affected_only\",\n baselineSha: \"baseline_sha\",\n changedFiles: \"changed_files\",\n affectedImportPaths: \"affected_import_paths\",\n testResults: \"test_results\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst captureAttempts = defineTable(\"capture_attempts\", {\n id: \"id\",\n projectId: \"project_id\",\n buildId: \"build_id\",\n attemptNo: \"attempt_no\",\n status: \"status\",\n error: \"error\",\n reqId: \"req_id\",\n storyCount: \"story_count\",\n failedCount: \"failed_count\",\n queuedAt: \"queued_at\",\n startedAt: \"started_at\",\n finishedAt: \"finished_at\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst captureShards = defineTable(\"capture_shards\", {\n id: \"id\",\n projectId: \"project_id\",\n buildId: \"build_id\",\n kind: \"kind\",\n ordinal: \"ordinal\",\n status: \"status\",\n attemptId: \"attempt_id\",\n payload: \"payload\",\n result: \"result\",\n error: \"error\",\n startedAt: \"started_at\",\n finishedAt: \"finished_at\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst captureJobs = defineTable(\"capture_jobs\", {\n id: \"id\",\n entry: \"entry\",\n jobId: \"job_id\",\n kind: \"kind\",\n buildId: \"build_id\",\n shardId: \"shard_id\",\n attempt: \"attempt\",\n maxAttempts: \"max_attempts\",\n status: \"status\",\n visibleAt: \"visible_at\",\n owner: \"owner\",\n payload: \"payload\",\n cancelRequestedAt: \"cancel_requested_at\",\n error: \"error\",\n startedAt: \"started_at\",\n finishedAt: \"finished_at\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst buildComponents = defineTable(\"build_components\", {\n id: \"id\",\n projectId: \"project_id\",\n buildId: \"build_id\",\n importPath: \"import_path\",\n title: \"title\",\n storyCount: \"story_count\",\n hash: \"hash\",\n createdAt: \"created_at\",\n});\n\nconst buildReviews = defineTable(\"build_reviews\", {\n id: \"id\",\n buildId: \"build_id\",\n userId: \"user_id\",\n verdict: \"verdict\",\n body: \"body\",\n createdAt: \"created_at\",\n});\n\nconst siteSettings = defineTable(\"site_settings\", {\n id: \"id\",\n value: \"value\",\n updatedBy: \"updated_by\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst captureLogs = defineTable(\"capture_logs\", {\n id: \"id\",\n projectId: \"project_id\",\n buildId: \"build_id\",\n attemptId: \"attempt_id\",\n seq: \"seq\",\n level: \"level\",\n message: \"message\",\n fields: \"fields\",\n createdAt: \"created_at\",\n});\n\nconst snapshots = defineTable(\"snapshots\", {\n durationMs: \"duration_ms\",\n a11yViolations: \"a11y_violations\",\n id: \"id\",\n projectId: \"project_id\",\n buildId: \"build_id\",\n storyId: \"story_id\",\n storyName: \"story_name\",\n storyTitle: \"story_title\",\n storyImportPath: \"story_import_path\",\n viewportName: \"viewport_name\",\n viewportWidth: \"viewport_width\",\n viewportHeight: \"viewport_height\",\n screenshotPath: \"screenshot_path\",\n diffPath: \"diff_path\",\n diffPixels: \"diff_pixels\",\n diffRatio: \"diff_ratio\",\n diffPassed: \"diff_passed\",\n status: \"status\",\n reviewedBy: \"reviewed_by\",\n reviewedAt: \"reviewed_at\",\n designUrl: \"design_url\",\n infraHash: \"infra_hash\",\n envChange: \"env_change\",\n inherited: \"inherited\",\n baselineId: \"baseline_id\",\n baselineVersion: \"baseline_version\",\n mode: \"mode\",\n browser: \"browser\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst baselines = defineTable(\"baselines\", {\n id: \"id\",\n projectId: \"project_id\",\n storyId: \"story_id\",\n viewportName: \"viewport_name\",\n branch: \"branch\",\n snapshotId: \"snapshot_id\",\n screenshotPath: \"screenshot_path\",\n infraHash: \"infra_hash\",\n fingerprint: \"fingerprint\",\n mode: \"mode\",\n browser: \"browser\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst comments = defineTable(\"comments\", {\n id: \"id\",\n projectId: \"project_id\",\n buildId: \"build_id\",\n snapshotId: \"snapshot_id\",\n userId: \"user_id\",\n body: \"body\",\n parentId: \"parent_id\",\n resolved: \"resolved\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n storyId: \"story_id\",\n});\n\nconst labelTypes = defineTable(\"label_types\", {\n id: \"id\",\n projectId: \"project_id\",\n key: \"key\",\n name: \"name\",\n linkTemplate: \"link_template\",\n color: \"color\",\n createdAt: \"created_at\",\n});\n\nconst buildLabels = defineTable(\"build_labels\", {\n id: \"id\",\n projectId: \"project_id\",\n buildId: \"build_id\",\n typeKey: \"type_key\",\n value: \"value\",\n createdAt: \"created_at\",\n});\n\nconst projectLinks = defineTable(\"project_links\", {\n id: \"id\",\n downstreamId: \"downstream_id\",\n upstreamId: \"upstream_id\",\n packageName: \"package_name\",\n createdAt: \"created_at\",\n});\n\nconst buildPackageUsage = defineTable(\"build_package_usage\", {\n id: \"id\",\n projectId: \"project_id\",\n buildId: \"build_id\",\n storyImportPath: \"story_import_path\",\n packageName: \"package_name\",\n modulePath: \"module_path\",\n version: \"version\",\n createdAt: \"created_at\",\n});\n\nconst tokens = defineTable(\"tokens\", {\n id: \"id\",\n projectId: \"project_id\",\n name: \"name\",\n hash: \"hash\",\n userId: \"user_id\",\n lastUsedAt: \"last_used_at\",\n createdAt: \"created_at\",\n});\n\nconst webhooks = defineTable(\"webhooks\", {\n id: \"id\",\n projectId: \"project_id\",\n url: \"url\",\n secretEncrypted: \"secret_encrypted\",\n events: \"events\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst users = defineTable(\"users\", {\n id: \"id\",\n email: \"email\",\n name: \"name\",\n avatarUrl: \"avatar_url\",\n role: \"role\",\n lastLoginAt: \"last_login_at\",\n createdAt: \"created_at\",\n passwordHash: \"password_hash\",\n displayNameOverride: \"display_name_override\",\n authProvider: \"auth_provider\",\n disabled: \"disabled\",\n});\n\nconst userInviteTokens = defineTable(\"user_invite_tokens\", {\n id: \"id\",\n userId: \"user_id\",\n tokenHash: \"token_hash\",\n expiresAt: \"expires_at\",\n usedAt: \"used_at\",\n createdAt: \"created_at\",\n});\n\nconst projectMembers = defineTable(\"project_members\", {\n id: \"id\",\n projectId: \"project_id\",\n userId: \"user_id\",\n role: \"role\",\n source: \"source\",\n createdAt: \"created_at\",\n});\n\nconst projectGroupMappings = defineTable(\"project_group_mappings\", {\n id: \"id\",\n projectId: \"project_id\",\n groupName: \"group_name\",\n role: \"role\",\n createdAt: \"created_at\",\n});\n\nconst insights = defineTable(\"insights\", {\n id: \"id\",\n projectId: \"project_id\",\n buildId: \"build_id\",\n kind: \"kind\",\n windowKey: \"window_key\",\n inputHash: \"input_hash\",\n status: \"status\",\n profile: \"profile\",\n model: \"model\",\n promptVersion: \"prompt_version\",\n verdict: \"verdict\",\n summary: \"summary\",\n result: \"result\",\n errorCode: \"error_code\",\n createdAt: \"created_at\",\n startedAt: \"started_at\",\n finishedAt: \"finished_at\",\n});\n\nconst aiUsage = defineTable(\"ai_usage\", {\n id: \"id\",\n insightId: \"insight_id\",\n projectId: \"project_id\",\n profile: \"profile\",\n task: \"task\",\n model: \"model\",\n inputTokens: \"input_tokens\",\n outputTokens: \"output_tokens\",\n estimated: \"estimated\",\n images: \"images\",\n status: \"status\",\n createdAt: \"created_at\",\n});\n\nconst aiBudgetAlerts = defineTable(\"ai_budget_alerts\", {\n id: \"id\",\n day: \"day\",\n threshold: \"threshold\",\n createdAt: \"created_at\",\n});\n\nconst notificationChannels = defineTable(\"notification_channels\", {\n id: \"id\",\n projectId: \"project_id\",\n provider: \"provider\",\n config: \"config\",\n secretEncrypted: \"secret_encrypted\",\n events: \"events\",\n enabled: \"enabled\",\n lastError: \"last_error\",\n lastErrorAt: \"last_error_at\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst notificationSubscriptions = defineTable(\"notification_subscriptions\", {\n id: \"id\",\n projectId: \"project_id\",\n userId: \"user_id\",\n events: \"events\",\n via: \"via\",\n enabled: \"enabled\",\n createdAt: \"created_at\",\n});\n\nconst contentRefs = defineTable(\"content_refs\", {\n hash: \"hash\",\n refCount: \"ref_count\",\n lastSeenAt: \"last_seen_at\",\n createdAt: \"created_at\",\n});\n\n/** Stub schema bundled into the `Tables` map every fake serves. */\nexport const fakeSchema: Tables = {\n projects,\n builds,\n captureAttempts,\n captureLogs,\n captureShards,\n captureJobs,\n buildComponents,\n buildReviews,\n siteSettings,\n snapshots,\n baselines,\n comments,\n labelTypes,\n buildLabels,\n projectLinks,\n designLinks,\n designCredentials,\n userConnections,\n designNodes,\n buildPackageUsage,\n tokens,\n webhooks,\n users,\n userInviteTokens,\n projectMembers,\n projectGroupMappings,\n insights,\n aiUsage,\n aiBudgetAlerts,\n notificationChannels,\n notificationSubscriptions,\n contentRefs,\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAcA,IAAM,aAAN,cAAyB,OAAO;CAC9B,aAA8B;EAC5B,OAAO,KAAK;CACd;AACF;AAGA,MAAM,gBAAiB,MAAqD,OAAO;AAEnF,SAAS,YAAY,MAAc,SAAwC;CACzE,MAAM,QAAQ,IAAI,MAAM,MAAM,KAAA,GAAW,IAAI;CAC7C,MAAM,UAAsC,CAAC;CAC7C,KAAK,MAAM,CAAC,UAAU,WAAW,OAAO,QAAQ,OAAO,GACrD,QAAQ,YAAY,IAAI,WAAW,OAAO;EACxC,MAAM;EACN,WAAW;EACX,SAAS;EACT,SAAS,KAAA;EACT,WAAW,KAAA;EACX,YAAY,KAAA;EACZ,YAAY;EACZ,YAAY;EACZ,UAAU;EACV,YAAY,KAAA;EACZ,YAAY,KAAA;EACZ,UAAU;EACV,YAAY;EACZ,WAAW,KAAA;EACX,mBAAmB,KAAA;CACrB,CAAC;CAEH,MAA8C,iBAAiB;CAC/D,OAAO;AACT;AAIA,MAAM,WAAW,YAAY,YAAY;CACvC,IAAI;CACJ,MAAM;CACN,MAAM;CACN,eAAe;CACf,kBAAkB;CAClB,gBAAgB;CAChB,cAAc;CACd,mBAAmB;CACnB,eAAe;CACf,aAAa;CACb,eAAe;CACf,SAAS;CACT,UAAU;CACV,SAAS;CACT,WAAW;CACX,UAAU;CACV,gBAAgB;CAChB,aAAa;CACb,WAAW;CACX,eAAe;CACf,iBAAiB;CACjB,wBAAwB;CACxB,WAAW;CACX,WAAW;AACb,CAAC;AAED,MAAM,cAAc,YAAY,gBAAgB;CAC9C,IAAI;CACJ,WAAW;CACX,YAAY;CACZ,OAAO;CACP,KAAK;CACL,WAAW;CACX,WAAW;AACb,CAAC;AAED,MAAM,oBAAoB,YAAY,sBAAsB;CAC1D,IAAI;CACJ,WAAW;CACX,UAAU;CACV,gBAAgB;CAChB,QAAQ;CACR,WAAW;CACX,WAAW;CACX,WAAW;AACb,CAAC;AAED,MAAM,kBAAkB,YAAY,oBAAoB;CACtD,IAAI;CACJ,QAAQ;CACR,SAAS;CACT,gBAAgB;CAChB,uBAAuB;CACvB,WAAW;CACX,QAAQ;CACR,WAAW;CACX,WAAW;AACb,CAAC;AAED,MAAM,cAAc,YAAY,gBAAgB;CAC9C,IAAI;CACJ,WAAW;CACX,UAAU;CACV,UAAU;CACV,SAAS;CACT,QAAQ;CACR,MAAM;CACN,SAAS;CACT,cAAc;CACd,OAAO;CACP,YAAY;CACZ,eAAe;CACf,WAAW;CACX,WAAW;CACX,WAAW;AACb,CAAC;AAED,MAAM,SAAS,YAAY,UAAU;CACnC,IAAI;CACJ,WAAW;CACX,QAAQ;CACR,WAAW;CACX,WAAW;CACX,aAAa;CACb,YAAY;CACZ,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,eAAe;CACf,cAAc;CACd,eAAe;CACf,eAAe;CACf,gBAAgB;CAChB,cAAc;CACd,aAAa;CACb,cAAc;CACd,qBAAqB;CACrB,aAAa;CACb,WAAW;CACX,WAAW;AACb,CAAC;AAED,MAAM,kBAAkB,YAAY,oBAAoB;CACtD,IAAI;CACJ,WAAW;CACX,SAAS;CACT,WAAW;CACX,QAAQ;CACR,OAAO;CACP,OAAO;CACP,YAAY;CACZ,aAAa;CACb,UAAU;CACV,WAAW;CACX,YAAY;CACZ,WAAW;CACX,WAAW;AACb,CAAC;AAED,MAAM,gBAAgB,YAAY,kBAAkB;CAClD,IAAI;CACJ,WAAW;CACX,SAAS;CACT,MAAM;CACN,SAAS;CACT,QAAQ;CACR,WAAW;CACX,SAAS;CACT,QAAQ;CACR,OAAO;CACP,WAAW;CACX,YAAY;CACZ,WAAW;CACX,WAAW;AACb,CAAC;AAED,MAAM,cAAc,YAAY,gBAAgB;CAC9C,IAAI;CACJ,OAAO;CACP,OAAO;CACP,MAAM;CACN,SAAS;CACT,SAAS;CACT,SAAS;CACT,aAAa;CACb,QAAQ;CACR,WAAW;CACX,OAAO;CACP,SAAS;CACT,mBAAmB;CACnB,OAAO;CACP,WAAW;CACX,YAAY;CACZ,WAAW;CACX,WAAW;AACb,CAAC;AAED,MAAM,kBAAkB,YAAY,oBAAoB;CACtD,IAAI;CACJ,WAAW;CACX,SAAS;CACT,YAAY;CACZ,OAAO;CACP,YAAY;CACZ,MAAM;CACN,WAAW;AACb,CAAC;AAED,MAAM,eAAe,YAAY,iBAAiB;CAChD,IAAI;CACJ,SAAS;CACT,QAAQ;CACR,SAAS;CACT,MAAM;CACN,WAAW;AACb,CAAC;AAED,MAAM,eAAe,YAAY,iBAAiB;CAChD,IAAI;CACJ,OAAO;CACP,WAAW;CACX,WAAW;CACX,WAAW;AACb,CAAC;;AAyPD,MAAa,aAAqB;CAChC;CACA;CACA;CACA,aA3PkB,YAAY,gBAAgB;EAC9C,IAAI;EACJ,WAAW;EACX,SAAS;EACT,WAAW;EACX,KAAK;EACL,OAAO;EACP,SAAS;EACT,QAAQ;EACR,WAAW;CACb,CAiPE;CACA;CACA;CACA;CACA;CACA;CACA,WArPgB,YAAY,aAAa;EACzC,YAAY;EACZ,gBAAgB;EAChB,IAAI;EACJ,WAAW;EACX,SAAS;EACT,SAAS;EACT,WAAW;EACX,YAAY;EACZ,iBAAiB;EACjB,cAAc;EACd,eAAe;EACf,gBAAgB;EAChB,gBAAgB;EAChB,UAAU;EACV,YAAY;EACZ,WAAW;EACX,YAAY;EACZ,QAAQ;EACR,YAAY;EACZ,YAAY;EACZ,WAAW;EACX,WAAW;EACX,WAAW;EACX,WAAW;EACX,YAAY;EACZ,iBAAiB;EACjB,MAAM;EACN,SAAS;EACT,WAAW;EACX,WAAW;CACb,CAsNE;CACA,WArNgB,YAAY,aAAa;EACzC,IAAI;EACJ,WAAW;EACX,SAAS;EACT,cAAc;EACd,QAAQ;EACR,YAAY;EACZ,gBAAgB;EAChB,WAAW;EACX,aAAa;EACb,MAAM;EACN,SAAS;EACT,WAAW;EACX,WAAW;CACb,CAuME;CACA,UAtMe,YAAY,YAAY;EACvC,IAAI;EACJ,WAAW;EACX,SAAS;EACT,YAAY;EACZ,QAAQ;EACR,MAAM;EACN,UAAU;EACV,UAAU;EACV,WAAW;EACX,WAAW;EACX,SAAS;CACX,CA0LE;CACA,YAzLiB,YAAY,eAAe;EAC5C,IAAI;EACJ,WAAW;EACX,KAAK;EACL,MAAM;EACN,cAAc;EACd,OAAO;EACP,WAAW;CACb,CAiLE;CACA,aAhLkB,YAAY,gBAAgB;EAC9C,IAAI;EACJ,WAAW;EACX,SAAS;EACT,SAAS;EACT,OAAO;EACP,WAAW;CACb,CAyKE;CACA,cAxKmB,YAAY,iBAAiB;EAChD,IAAI;EACJ,cAAc;EACd,YAAY;EACZ,aAAa;EACb,WAAW;CACb,CAkKE;CACA;CACA;CACA;CACA;CACA,mBArKwB,YAAY,uBAAuB;EAC3D,IAAI;EACJ,WAAW;EACX,SAAS;EACT,iBAAiB;EACjB,aAAa;EACb,YAAY;EACZ,SAAS;EACT,WAAW;CACb,CA4JE;CACA,QA3Ja,YAAY,UAAU;EACnC,IAAI;EACJ,WAAW;EACX,MAAM;EACN,MAAM;EACN,QAAQ;EACR,YAAY;EACZ,WAAW;CACb,CAmJE;CACA,UAlJe,YAAY,YAAY;EACvC,IAAI;EACJ,WAAW;EACX,KAAK;EACL,iBAAiB;EACjB,QAAQ;EACR,WAAW;EACX,WAAW;CACb,CA0IE;CACA,OAzIY,YAAY,SAAS;EACjC,IAAI;EACJ,OAAO;EACP,MAAM;EACN,WAAW;EACX,MAAM;EACN,aAAa;EACb,WAAW;EACX,cAAc;EACd,qBAAqB;EACrB,cAAc;EACd,UAAU;CACZ,CA6HE;CACA,kBA5HuB,YAAY,sBAAsB;EACzD,IAAI;EACJ,QAAQ;EACR,WAAW;EACX,WAAW;EACX,QAAQ;EACR,WAAW;CACb,CAqHE;CACA,gBApHqB,YAAY,mBAAmB;EACpD,IAAI;EACJ,WAAW;EACX,QAAQ;EACR,MAAM;EACN,QAAQ;EACR,WAAW;CACb,CA6GE;CACA,sBA5G2B,YAAY,0BAA0B;EACjE,IAAI;EACJ,WAAW;EACX,WAAW;EACX,MAAM;EACN,WAAW;CACb,CAsGE;CACA,UArGe,YAAY,YAAY;EACvC,IAAI;EACJ,WAAW;EACX,SAAS;EACT,MAAM;EACN,WAAW;EACX,WAAW;EACX,QAAQ;EACR,SAAS;EACT,OAAO;EACP,eAAe;EACf,SAAS;EACT,SAAS;EACT,QAAQ;EACR,WAAW;EACX,WAAW;EACX,WAAW;EACX,YAAY;CACd,CAmFE;CACA,SAlFc,YAAY,YAAY;EACtC,IAAI;EACJ,WAAW;EACX,WAAW;EACX,SAAS;EACT,MAAM;EACN,OAAO;EACP,aAAa;EACb,cAAc;EACd,WAAW;EACX,QAAQ;EACR,QAAQ;EACR,WAAW;CACb,CAqEE;CACA,gBApEqB,YAAY,oBAAoB;EACrD,IAAI;EACJ,KAAK;EACL,WAAW;EACX,WAAW;CACb,CA+DE;CACA,sBA9D2B,YAAY,yBAAyB;EAChE,IAAI;EACJ,WAAW;EACX,UAAU;EACV,QAAQ;EACR,iBAAiB;EACjB,QAAQ;EACR,SAAS;EACT,WAAW;EACX,aAAa;EACb,WAAW;EACX,WAAW;CACb,CAkDE;CACA,2BAjDgC,YAAY,8BAA8B;EAC1E,IAAI;EACJ,WAAW;EACX,QAAQ;EACR,QAAQ;EACR,KAAK;EACL,SAAS;EACT,WAAW;CACb,CAyCE;CACA,aAxCkB,YAAY,gBAAgB;EAC9C,MAAM;EACN,UAAU;EACV,YAAY;EACZ,WAAW;CACb,CAmCE;AACF"}
1
+ {"version":3,"file":"fake-tables.mjs","names":[],"sources":["../../src/test-helpers/fake-tables.ts"],"sourcesContent":["/**\n * Dialect-free stub tables for the in-memory test fake.\n *\n * The fake never touches a driver: it only needs table handles whose columns\n * carry the property → column-name mapping (`getTableColumns`) and flow\n * through drizzle's expression builders (`eq`, `and`, `inArray`, `orderBy`)\n * into the `sql-chunks.ts` matcher. Real `Column`/`Table` base classes from\n * the `drizzle-orm` root (already a core dependency) satisfy both without\n * pulling in any dialect package (`sqlite-core`, `pg-core`, …).\n */\nimport { Column, Table } from \"drizzle-orm\";\nimport type { Tables } from \"../adapters/database.ts\";\n\n/** A column handle with driver passthrough mapping (the fake maps nothing). */\nclass FakeColumn extends Column {\n override getSQLType(): string {\n return this.columnType;\n }\n}\n\n// `Table.Symbol` is runtime-only (`@internal`, absent from the public types).\nconst columnsSymbol = (Table as unknown as { Symbol: { Columns: symbol } }).Symbol.Columns;\n\nfunction defineTable(name: string, columns: Record<string, string>): Table {\n const table = new Table(name, undefined, name);\n const handles: Record<string, FakeColumn> = {};\n for (const [property, dbName] of Object.entries(columns)) {\n handles[property] = new FakeColumn(table, {\n name: dbName,\n keyAsName: false,\n notNull: false,\n default: undefined,\n defaultFn: undefined,\n onUpdateFn: undefined,\n hasDefault: false,\n primaryKey: false,\n isUnique: false,\n uniqueName: undefined,\n uniqueType: undefined,\n dataType: \"string\",\n columnType: \"FakeColumn\",\n generated: undefined,\n generatedIdentity: undefined,\n });\n }\n (table as unknown as Record<symbol, unknown>)[columnsSymbol] = handles;\n return table;\n}\n\n// Stub tables matching the real schema's property -> column mapping.\n// No constraints or defaults — just names for whereMatches/orderRows.\nconst projects = defineTable(\"projects\", {\n id: \"id\",\n name: \"name\",\n slug: \"slug\",\n gitRepository: \"git_repository\",\n gitDefaultBranch: \"git_default_branch\",\n pixelThreshold: \"pixel_threshold\",\n maxDiffRatio: \"max_diff_ratio\",\n publicBranchRegex: \"public_branch_regex\",\n storybookMeta: \"storybook_meta\",\n executePlay: \"execute_play\",\n playTimeoutMs: \"play_timeout_ms\",\n runA11y: \"run_a11y\",\n runTests: \"run_tests\",\n browser: \"browser\",\n viewports: \"viewports\",\n browsers: \"browsers\",\n modesAllowlist: \"modes_allowlist\",\n automigrate: \"automigrate\",\n aiProfile: \"ai_profile\",\n reviewEnabled: \"review_enabled\",\n reviewApprovals: \"review_approvals\",\n storybookUrlTtlSeconds: \"storybook_url_ttl_seconds\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst designLinks = defineTable(\"design_links\", {\n id: \"id\",\n projectId: \"project_id\",\n importPath: \"import_path\",\n label: \"label\",\n url: \"url\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst designCredentials = defineTable(\"design_credentials\", {\n id: \"id\",\n projectId: \"project_id\",\n provider: \"provider\",\n tokenEncrypted: \"token_encrypted\",\n status: \"status\",\n checkedAt: \"checked_at\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst userConnections = defineTable(\"user_connections\", {\n id: \"id\",\n userId: \"user_id\",\n service: \"service\",\n tokenEncrypted: \"token_encrypted\",\n refreshTokenEncrypted: \"refresh_token_encrypted\",\n expiresAt: \"expires_at\",\n status: \"status\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst designNodes = defineTable(\"design_nodes\", {\n id: \"id\",\n projectId: \"project_id\",\n provider: \"provider\",\n viewerId: \"viewer_id\",\n fileKey: \"file_key\",\n nodeId: \"node_id\",\n name: \"name\",\n version: \"version\",\n lastModified: \"last_modified\",\n state: \"state\",\n renderPath: \"render_path\",\n renderVersion: \"render_version\",\n notifiedVersion: \"notified_version\",\n fetchedAt: \"fetched_at\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst builds = defineTable(\"builds\", {\n id: \"id\",\n projectId: \"project_id\",\n gitSha: \"git_sha\",\n gitBranch: \"git_branch\",\n isDefault: \"is_default\",\n authorEmail: \"author_email\",\n authorName: \"author_name\",\n message: \"message\",\n public: \"public\",\n status: \"status\",\n snapshotCount: \"snapshot_count\",\n changedCount: \"changed_count\",\n approvedCount: \"approved_count\",\n rejectedCount: \"rejected_count\",\n inheritedCount: \"inherited_count\",\n affectedOnly: \"affected_only\",\n baselineSha: \"baseline_sha\",\n changedFiles: \"changed_files\",\n affectedImportPaths: \"affected_import_paths\",\n testResults: \"test_results\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst captureAttempts = defineTable(\"capture_attempts\", {\n id: \"id\",\n projectId: \"project_id\",\n buildId: \"build_id\",\n attemptNo: \"attempt_no\",\n status: \"status\",\n error: \"error\",\n reqId: \"req_id\",\n storyCount: \"story_count\",\n failedCount: \"failed_count\",\n queuedAt: \"queued_at\",\n startedAt: \"started_at\",\n finishedAt: \"finished_at\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst captureShards = defineTable(\"capture_shards\", {\n id: \"id\",\n projectId: \"project_id\",\n buildId: \"build_id\",\n kind: \"kind\",\n ordinal: \"ordinal\",\n status: \"status\",\n attemptId: \"attempt_id\",\n payload: \"payload\",\n result: \"result\",\n error: \"error\",\n startedAt: \"started_at\",\n finishedAt: \"finished_at\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst captureJobs = defineTable(\"capture_jobs\", {\n id: \"id\",\n entry: \"entry\",\n jobId: \"job_id\",\n kind: \"kind\",\n buildId: \"build_id\",\n shardId: \"shard_id\",\n attempt: \"attempt\",\n maxAttempts: \"max_attempts\",\n status: \"status\",\n visibleAt: \"visible_at\",\n owner: \"owner\",\n payload: \"payload\",\n cancelRequestedAt: \"cancel_requested_at\",\n error: \"error\",\n startedAt: \"started_at\",\n finishedAt: \"finished_at\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst buildComponents = defineTable(\"build_components\", {\n id: \"id\",\n projectId: \"project_id\",\n buildId: \"build_id\",\n importPath: \"import_path\",\n title: \"title\",\n storyCount: \"story_count\",\n hash: \"hash\",\n createdAt: \"created_at\",\n});\n\nconst buildReviews = defineTable(\"build_reviews\", {\n id: \"id\",\n buildId: \"build_id\",\n userId: \"user_id\",\n verdict: \"verdict\",\n body: \"body\",\n createdAt: \"created_at\",\n});\n\nconst siteSettings = defineTable(\"site_settings\", {\n id: \"id\",\n value: \"value\",\n updatedBy: \"updated_by\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst captureLogs = defineTable(\"capture_logs\", {\n id: \"id\",\n projectId: \"project_id\",\n buildId: \"build_id\",\n attemptId: \"attempt_id\",\n seq: \"seq\",\n level: \"level\",\n message: \"message\",\n fields: \"fields\",\n createdAt: \"created_at\",\n});\n\nconst snapshots = defineTable(\"snapshots\", {\n durationMs: \"duration_ms\",\n a11yViolations: \"a11y_violations\",\n id: \"id\",\n projectId: \"project_id\",\n buildId: \"build_id\",\n storyId: \"story_id\",\n storyName: \"story_name\",\n storyTitle: \"story_title\",\n storyImportPath: \"story_import_path\",\n viewportName: \"viewport_name\",\n viewportWidth: \"viewport_width\",\n viewportHeight: \"viewport_height\",\n screenshotPath: \"screenshot_path\",\n diffPath: \"diff_path\",\n diffPixels: \"diff_pixels\",\n diffRatio: \"diff_ratio\",\n diffPassed: \"diff_passed\",\n status: \"status\",\n reviewedBy: \"reviewed_by\",\n reviewedAt: \"reviewed_at\",\n designUrl: \"design_url\",\n infraHash: \"infra_hash\",\n envChange: \"env_change\",\n inherited: \"inherited\",\n baselineId: \"baseline_id\",\n baselineVersion: \"baseline_version\",\n sourceBuildId: \"source_build_id\",\n comparisonImagePath: \"comparison_image_path\",\n comparisonMetadata: \"comparison_metadata\",\n mode: \"mode\",\n browser: \"browser\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst baselines = defineTable(\"baselines\", {\n id: \"id\",\n projectId: \"project_id\",\n storyId: \"story_id\",\n viewportName: \"viewport_name\",\n branch: \"branch\",\n snapshotId: \"snapshot_id\",\n sourceBuildId: \"source_build_id\",\n screenshotPath: \"screenshot_path\",\n infraHash: \"infra_hash\",\n fingerprint: \"fingerprint\",\n mode: \"mode\",\n browser: \"browser\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst comments = defineTable(\"comments\", {\n id: \"id\",\n projectId: \"project_id\",\n buildId: \"build_id\",\n snapshotId: \"snapshot_id\",\n userId: \"user_id\",\n body: \"body\",\n parentId: \"parent_id\",\n resolved: \"resolved\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n storyId: \"story_id\",\n});\n\nconst labelTypes = defineTable(\"label_types\", {\n id: \"id\",\n projectId: \"project_id\",\n key: \"key\",\n name: \"name\",\n linkTemplate: \"link_template\",\n color: \"color\",\n createdAt: \"created_at\",\n});\n\nconst buildLabels = defineTable(\"build_labels\", {\n id: \"id\",\n projectId: \"project_id\",\n buildId: \"build_id\",\n typeKey: \"type_key\",\n value: \"value\",\n createdAt: \"created_at\",\n});\n\nconst projectLinks = defineTable(\"project_links\", {\n id: \"id\",\n downstreamId: \"downstream_id\",\n upstreamId: \"upstream_id\",\n packageName: \"package_name\",\n createdAt: \"created_at\",\n});\n\nconst buildPackageUsage = defineTable(\"build_package_usage\", {\n id: \"id\",\n projectId: \"project_id\",\n buildId: \"build_id\",\n storyImportPath: \"story_import_path\",\n packageName: \"package_name\",\n modulePath: \"module_path\",\n version: \"version\",\n createdAt: \"created_at\",\n});\n\nconst tokens = defineTable(\"tokens\", {\n id: \"id\",\n projectId: \"project_id\",\n name: \"name\",\n hash: \"hash\",\n userId: \"user_id\",\n lastUsedAt: \"last_used_at\",\n createdAt: \"created_at\",\n});\n\nconst webhooks = defineTable(\"webhooks\", {\n id: \"id\",\n projectId: \"project_id\",\n url: \"url\",\n secretEncrypted: \"secret_encrypted\",\n events: \"events\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst users = defineTable(\"users\", {\n id: \"id\",\n email: \"email\",\n name: \"name\",\n avatarUrl: \"avatar_url\",\n role: \"role\",\n lastLoginAt: \"last_login_at\",\n createdAt: \"created_at\",\n passwordHash: \"password_hash\",\n displayNameOverride: \"display_name_override\",\n authProvider: \"auth_provider\",\n disabled: \"disabled\",\n});\n\nconst userInviteTokens = defineTable(\"user_invite_tokens\", {\n id: \"id\",\n userId: \"user_id\",\n tokenHash: \"token_hash\",\n expiresAt: \"expires_at\",\n usedAt: \"used_at\",\n createdAt: \"created_at\",\n});\n\nconst projectMembers = defineTable(\"project_members\", {\n id: \"id\",\n projectId: \"project_id\",\n userId: \"user_id\",\n role: \"role\",\n source: \"source\",\n createdAt: \"created_at\",\n});\n\nconst projectGroupMappings = defineTable(\"project_group_mappings\", {\n id: \"id\",\n projectId: \"project_id\",\n groupName: \"group_name\",\n role: \"role\",\n createdAt: \"created_at\",\n});\n\nconst insights = defineTable(\"insights\", {\n id: \"id\",\n projectId: \"project_id\",\n buildId: \"build_id\",\n kind: \"kind\",\n windowKey: \"window_key\",\n inputHash: \"input_hash\",\n status: \"status\",\n profile: \"profile\",\n model: \"model\",\n promptVersion: \"prompt_version\",\n verdict: \"verdict\",\n summary: \"summary\",\n result: \"result\",\n errorCode: \"error_code\",\n createdAt: \"created_at\",\n startedAt: \"started_at\",\n finishedAt: \"finished_at\",\n});\n\nconst aiUsage = defineTable(\"ai_usage\", {\n id: \"id\",\n insightId: \"insight_id\",\n projectId: \"project_id\",\n profile: \"profile\",\n task: \"task\",\n model: \"model\",\n inputTokens: \"input_tokens\",\n outputTokens: \"output_tokens\",\n estimated: \"estimated\",\n images: \"images\",\n status: \"status\",\n createdAt: \"created_at\",\n});\n\nconst aiBudgetAlerts = defineTable(\"ai_budget_alerts\", {\n id: \"id\",\n day: \"day\",\n threshold: \"threshold\",\n createdAt: \"created_at\",\n});\n\nconst notificationChannels = defineTable(\"notification_channels\", {\n id: \"id\",\n projectId: \"project_id\",\n provider: \"provider\",\n config: \"config\",\n secretEncrypted: \"secret_encrypted\",\n events: \"events\",\n enabled: \"enabled\",\n lastError: \"last_error\",\n lastErrorAt: \"last_error_at\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n});\n\nconst notificationSubscriptions = defineTable(\"notification_subscriptions\", {\n id: \"id\",\n projectId: \"project_id\",\n userId: \"user_id\",\n events: \"events\",\n via: \"via\",\n enabled: \"enabled\",\n createdAt: \"created_at\",\n});\n\nconst contentRefs = defineTable(\"content_refs\", {\n hash: \"hash\",\n refCount: \"ref_count\",\n lastSeenAt: \"last_seen_at\",\n createdAt: \"created_at\",\n});\n\n/** Stub schema bundled into the `Tables` map every fake serves. */\nexport const fakeSchema: Tables = {\n projects,\n builds,\n captureAttempts,\n captureLogs,\n captureShards,\n captureJobs,\n buildComponents,\n buildReviews,\n siteSettings,\n snapshots,\n baselines,\n comments,\n labelTypes,\n buildLabels,\n projectLinks,\n designLinks,\n designCredentials,\n userConnections,\n designNodes,\n buildPackageUsage,\n tokens,\n webhooks,\n users,\n userInviteTokens,\n projectMembers,\n projectGroupMappings,\n insights,\n aiUsage,\n aiBudgetAlerts,\n notificationChannels,\n notificationSubscriptions,\n contentRefs,\n};\n"],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
- //#region src/test-helpers/manual-clock.d.ts
4
3
  /**
5
4
  * A manual clock with its own timers, for lease, poll-cadence and cancel tests that must not sleep.
6
5
  * `advance` moves time forward and fires every timer that falls due, in order, letting promise
@@ -22,6 +21,5 @@ interface ManualClock {
22
21
  }
23
22
  /** Create a manual clock starting at `start` (epoch ms). */
24
23
  declare function createManualClock(start?: number): ManualClock;
25
- //#endregion
26
24
  export { ManualClock, createManualClock };
27
25
  //# sourceMappingURL=manual-clock.d.mts.map
@@ -1,7 +1,7 @@
1
1
  import "node:path";
2
2
  import "node:url";
3
3
  import.meta.url;
4
- //#region src/test-helpers/manual-clock.ts
4
+ // src/test-helpers/manual-clock.ts
5
5
  /** Let queued promise jobs and I/O callbacks run (a few macrotask turns). */
6
6
  async function settle() {
7
7
  for (let turn = 0; turn < 5; turn += 1) await new Promise((resolve) => {
@@ -50,7 +50,6 @@ function createManualClock(start = Date.parse("2026-01-01T00:00:00.000Z")) {
50
50
  }
51
51
  };
52
52
  }
53
- //#endregion
54
53
  export { createManualClock };
55
54
 
56
55
  //# sourceMappingURL=manual-clock.mjs.map
@@ -1,7 +1,6 @@
1
1
  import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
3
  import { NotifierProvider } from "../adapters/notifier/provider.mjs";
4
- //#region src/test-helpers/notifier-contract.d.ts
5
4
  /** Build the provider under test (sync or async factories both work). */
6
5
  type NotifierFactory = () => NotifierProvider | Promise<NotifierProvider>;
7
6
  /** Run the notifier contract against a factory. */
@@ -12,6 +11,5 @@ declare function notifierContractSuite(label: string, make: NotifierFactory): vo
12
11
  * and rejects an invalid config at `create`.
13
12
  */
14
13
  declare function stateNotifierContractSuite(label: string, make: NotifierFactory, validConfig: unknown): void;
15
- //#endregion
16
14
  export { NotifierFactory, notifierContractSuite, stateNotifierContractSuite };
17
15
  //# sourceMappingURL=notifier-contract.d.mts.map
@@ -3,7 +3,7 @@ import "node:url";
3
3
  import.meta.url;
4
4
  import { isStateProvider } from "../adapters/notifier/provider.mjs";
5
5
  import { describe, expect, it } from "vitest";
6
- //#region src/test-helpers/notifier-contract.ts
6
+ // src/test-helpers/notifier-contract.ts
7
7
  /**
8
8
  * Published notifier contract suites for first- and third-party providers.
9
9
  *
@@ -57,7 +57,6 @@ function stateNotifierContractSuite(label, make, validConfig) {
57
57
  });
58
58
  });
59
59
  }
60
- //#endregion
61
60
  export { notifierContractSuite, stateNotifierContractSuite };
62
61
 
63
62
  //# sourceMappingURL=notifier-contract.mjs.map
@@ -1,7 +1,6 @@
1
1
  import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
3
  import { CaptureQueue } from "../adapter/capture-queue.mjs";
4
- //#region src/test-helpers/queue-contract.d.ts
5
4
  /** Build the adapter under test (sync or async factories both work). */
6
5
  type QueueFactory = () => CaptureQueue | Promise<CaptureQueue>;
7
6
  /** Options of {@link queueContractSuite}. */
@@ -20,6 +19,5 @@ interface PollableContractOptions {
20
19
  }
21
20
  /** Run the queue contract against a factory. */
22
21
  declare function queueContractSuite(label: string, make: QueueFactory, options?: QueueContractOptions): void;
23
- //#endregion
24
22
  export { PollableContractOptions, QueueContractOptions, QueueFactory, queueContractSuite };
25
23
  //# sourceMappingURL=queue-contract.d.mts.map
@@ -2,7 +2,7 @@ import "node:path";
2
2
  import "node:url";
3
3
  import.meta.url;
4
4
  import { describe, expect, it } from "vitest";
5
- //#region src/test-helpers/queue-contract.ts
5
+ // src/test-helpers/queue-contract.ts
6
6
  /**
7
7
  * Published queue contract suite for first- and third-party adapters.
8
8
  *
@@ -252,7 +252,6 @@ function cancelCases(make) {
252
252
  expect(await queue.cancel("b-contract-unknown")).toBe(false);
253
253
  });
254
254
  }
255
- //#endregion
256
255
  export { queueContractSuite };
257
256
 
258
257
  //# sourceMappingURL=queue-contract.mjs.map
@@ -1,7 +1,6 @@
1
1
  import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
3
  import { DatabaseAdapter } from "../adapter/database.mjs";
4
- //#region src/test-helpers/queue-multi-instance.d.ts
5
4
  /** A set-up database the instances of one case share. */
6
5
  type SharedDatabaseFactory = () => DatabaseAdapter | Promise<DatabaseAdapter>;
7
6
  /** Options of {@link databaseQueueMultiInstanceSuite}. */
@@ -15,6 +14,5 @@ interface MultiInstanceOptions {
15
14
  }
16
15
  /** Run the multi-instance suite against databases from `makeDb`. */
17
16
  declare function databaseQueueMultiInstanceSuite(label: string, makeDb: SharedDatabaseFactory, options?: MultiInstanceOptions): void;
18
- //#endregion
19
17
  export { MultiInstanceOptions, SharedDatabaseFactory, databaseQueueMultiInstanceSuite };
20
18
  //# sourceMappingURL=queue-multi-instance.d.mts.map
@@ -5,7 +5,7 @@ import { CaptureJobModel, attemptRowId } from "../models/capture-job.mjs";
5
5
  import { LEASE_EXHAUSTED_ERROR } from "../capture/db-queue/claim.mjs";
6
6
  import { createDatabaseCaptureQueue } from "../capture/db-queue/index.mjs";
7
7
  import { describe, expect, it } from "vitest";
8
- //#region src/test-helpers/queue-multi-instance.ts
8
+ // src/test-helpers/queue-multi-instance.ts
9
9
  /**
10
10
  * Multi-instance suite for the database capture queue: several queue instances (one per simulated
11
11
  * app instance) share ONE database, the way horizontally scaled app instances do. Database packages
@@ -200,7 +200,6 @@ function cancelAndKindCases(makeDb, size, timeoutMs) {
200
200
  expect((await capture.queues[0].status(buildId))?.status).toBe("completed");
201
201
  }, timeoutMs);
202
202
  }
203
- //#endregion
204
203
  export { databaseQueueMultiInstanceSuite };
205
204
 
206
205
  //# sourceMappingURL=queue-multi-instance.mjs.map
@@ -1,11 +1,9 @@
1
1
  import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
3
  import { CaptureRunner } from "../adapter/capture-runner.mjs";
4
- //#region src/test-helpers/runner-contract.d.ts
5
4
  /** Build the adapter under test (sync or async factories both work). */
6
5
  type RunnerFactory = () => CaptureRunner | Promise<CaptureRunner>;
7
6
  /** Run the runner contract against a factory. */
8
7
  declare function runnerContractSuite(label: string, make: RunnerFactory): void;
9
- //#endregion
10
8
  export { RunnerFactory, runnerContractSuite };
11
9
  //# sourceMappingURL=runner-contract.d.mts.map
@@ -3,7 +3,7 @@ import "node:url";
3
3
  import.meta.url;
4
4
  import { isCaptureTarget } from "../adapters/capture-target.mjs";
5
5
  import { describe, expect, it } from "vitest";
6
- //#region src/test-helpers/runner-contract.ts
6
+ // src/test-helpers/runner-contract.ts
7
7
  /**
8
8
  * Published runner contract suite for first- and third-party adapters.
9
9
  *
@@ -37,7 +37,6 @@ function runnerContractSuite(label, make) {
37
37
  });
38
38
  });
39
39
  }
40
- //#endregion
41
40
  export { runnerContractSuite };
42
41
 
43
42
  //# sourceMappingURL=runner-contract.mjs.map
@@ -2,7 +2,7 @@ import "node:path";
2
2
  import "node:url";
3
3
  import.meta.url;
4
4
  import { getTableColumns } from "drizzle-orm";
5
- //#region src/test-helpers/sql-chunks.ts
5
+ // src/test-helpers/sql-chunks.ts
6
6
  /** Flatten the string parts of a drizzle SQL chunk into a single string. */
7
7
  function textOf(chunk) {
8
8
  if (chunk === void 0 || !Array.isArray(chunk.value) || !chunk.value.every((part) => typeof part === "string")) return;
@@ -24,6 +24,7 @@ function matchChunk(chunks, row, table) {
24
24
  const text = chunks.map((c) => textOf(c) ?? "").join("");
25
25
  if (/is not null/iu.test(text)) return isNullMatches(chunks, row, table, true);
26
26
  if (/is null/iu.test(text)) return isNullMatches(chunks, row, table, false);
27
+ if (text.includes(" <> ")) return !eqMatches(chunks, row, table);
27
28
  if (text.includes(" like ")) return likeMatches(chunks, row, table);
28
29
  if (text.includes(" in ")) return inArrayMatches(chunks, row, table);
29
30
  if (text.includes(" >= ")) return !ltMatches(chunks, row, table);
@@ -155,7 +156,6 @@ function columnKey(table, dbName) {
155
156
  for (const [property, column] of Object.entries(getTableColumns(table))) if (column.name === dbName) return property;
156
157
  return dbName;
157
158
  }
158
- //#endregion
159
159
  export { orderRows, whereMatches };
160
160
 
161
161
  //# sourceMappingURL=sql-chunks.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"sql-chunks.mjs","names":[],"sources":["../../src/test-helpers/sql-chunks.ts"],"sourcesContent":["import { getTableColumns, type SQL, type Table } from \"drizzle-orm\";\n\n/* eslint-disable require-await, no-unnecessary-type-assertion, no-unnecessary-type-parameters, non-nullable-type-assertion-style */\n\n/** A drizzle SQL chunk inspected for matching and ordering. */\nexport interface SqlChunk {\n value?: unknown;\n name?: string;\n table?: unknown;\n brand?: unknown;\n queryChunks?: SqlChunk[];\n}\n\n/** Flatten the string parts of a drizzle SQL chunk into a single string. */\nfunction textOf(chunk: SqlChunk | undefined): string | undefined {\n if (\n chunk === undefined ||\n !Array.isArray(chunk.value) ||\n !chunk.value.every((part) => typeof part === \"string\")\n ) {\n return undefined;\n }\n return chunk.value.join(\"\");\n}\n\n/** Test whether an in-memory row satisfies a drizzle where-clause. */\nexport function whereMatches(where: SQL, row: Record<string, unknown>, table: Table): boolean {\n let current = where.queryChunks as unknown as SqlChunk[];\n let wrapped = current[1]?.queryChunks;\n while (wrapped !== undefined && textOf(current[0]) === \"(\" && textOf(current.at(-1)) === \")\") {\n current = wrapped;\n wrapped = current[1]?.queryChunks;\n }\n // Drizzle's `and(singleCondition)` emits the condition directly, without\n // the enclosing parens produced for two or more clauses, so unwrap it.\n if (current.length === 1 && current[0]?.queryChunks !== undefined) {\n current = current[0].queryChunks as unknown as SqlChunk[];\n }\n if (current.some((chunk) => textOf(chunk)?.trim() === \"and\")) {\n return current\n .filter((chunk) => textOf(chunk) === undefined)\n .every((chunk) => matchChunk(chunk.queryChunks ?? [], row, table));\n }\n return matchChunk(current, row, table);\n}\n\nfunction matchChunk(chunks: SqlChunk[], row: Record<string, unknown>, table: Table): boolean {\n const text = chunks.map((c) => textOf(c) ?? \"\").join(\"\");\n if (/is not null/iu.test(text)) {\n return isNullMatches(chunks, row, table, true);\n }\n if (/is null/iu.test(text)) {\n return isNullMatches(chunks, row, table, false);\n }\n if (text.includes(\" like \")) {\n return likeMatches(chunks, row, table);\n }\n if (text.includes(\" in \")) {\n return inArrayMatches(chunks, row, table);\n }\n if (text.includes(\" >= \")) {\n return !ltMatches(chunks, row, table);\n }\n if (text.includes(\" <= \")) {\n return lteMatches(chunks, row, table);\n }\n if (text.includes(\" < \")) {\n return ltMatches(chunks, row, table);\n }\n return eqMatches(chunks, row, table);\n}\n\n/** Match `is null` / `is not null` predicates (no value argument). */\nfunction isNullMatches(\n chunks: SqlChunk[],\n row: Record<string, unknown>,\n table: Table,\n negated: boolean,\n): boolean {\n let columnName: string | undefined;\n for (const chunk of chunks) {\n if (typeof chunk.name === \"string\" && chunk.table !== undefined) {\n columnName = chunk.name;\n }\n }\n if (columnName === undefined) {\n return false;\n }\n const cell = row[columnKey(table, columnName)];\n const missing = cell === null || cell === undefined;\n return negated ? !missing : missing;\n}\n\nfunction eqMatches(chunks: SqlChunk[], row: Record<string, unknown>, table: Table): boolean {\n let columnName: string | undefined;\n let argument: unknown;\n for (const chunk of chunks) {\n if (typeof chunk.name === \"string\" && chunk.table !== undefined) {\n columnName = chunk.name;\n } else if (\"brand\" in chunk) {\n argument = chunk.value;\n }\n }\n if (columnName === undefined) {\n return false;\n }\n return row[columnKey(table, columnName)] === argument;\n}\n\n/** Match `column like 'pattern'`: `%` is any run of characters, `_` any one; everything else literal. */\nfunction likeMatches(chunks: SqlChunk[], row: Record<string, unknown>, table: Table): boolean {\n let columnName: string | undefined;\n let pattern: unknown;\n for (const chunk of chunks as unknown[]) {\n if (typeof chunk === \"string\") {\n pattern = chunk;\n } else if (chunk !== null && typeof chunk === \"object\") {\n const node = chunk as SqlChunk;\n if (typeof node.name === \"string\" && node.table !== undefined) {\n columnName = node.name;\n } else if (\"brand\" in node) {\n pattern = node.value;\n }\n }\n }\n const cell = columnName === undefined ? undefined : row[columnKey(table, columnName)];\n if (typeof cell !== \"string\" || typeof pattern !== \"string\") {\n return false;\n }\n const source = pattern.replaceAll(/[.*+?^${}()|[\\]\\\\]/gu, String.raw`\\$&`);\n return new RegExp(`^${source.replaceAll(\"%\", \".*\").replaceAll(\"_\", \".\")}$`, \"su\").test(cell);\n}\n\n/* eslint-disable complexity, max-depth -- handles drizzle's varied chunk shapes */\nfunction inArrayMatches(chunks: SqlChunk[], row: Record<string, unknown>, table: Table): boolean {\n let columnName: string | undefined;\n const values: unknown[] = [];\n const collect = (nodes: unknown[]): void => {\n for (const raw of nodes as SqlChunk[]) {\n const chunk = raw as SqlChunk & Record<string, unknown>;\n // Handle array-like chunk (inArray values stored as array of chunks)\n if (\n Array.isArray(chunk) ||\n (chunk && typeof chunk === \"object\" && Object.keys(chunk).every((k) => /^\\d+$/u.test(k)))\n ) {\n collect(Object.values(chunk as unknown as Record<string, unknown>) as unknown[]);\n continue;\n }\n if (typeof chunk.name === \"string\" && chunk.table !== undefined) {\n columnName = chunk.name as string;\n }\n if (\"brand\" in chunk && (chunk as Record<string, unknown>)[\"value\"] !== undefined) {\n const val = (chunk as Record<string, unknown>)[\"value\"];\n if (Array.isArray(val)) {\n values.push(...(val as unknown[]));\n } else {\n values.push(val);\n }\n }\n if (chunk.queryChunks) {\n collect(chunk.queryChunks as unknown[]);\n }\n const val = (chunk as Record<string, unknown>)[\"value\"];\n if (Array.isArray(val)) {\n for (const item of val as unknown[]) {\n if (\n item &&\n typeof item === \"object\" &&\n \"queryChunks\" in (item as Record<string, unknown>)\n ) {\n collect(((item as Record<string, unknown>)[\"queryChunks\"] as unknown[]) ?? []);\n }\n if (item && typeof item === \"object\" && \"value\" in (item as Record<string, unknown>)) {\n const iv = (item as Record<string, unknown>)[\"value\"];\n if (iv !== undefined) {\n values.push(iv);\n }\n }\n if (typeof item === \"string\") {\n values.push(item);\n }\n }\n }\n }\n };\n collect(chunks as unknown[]);\n if (columnName === undefined) {\n return false;\n }\n const key = columnKey(table, columnName);\n return values.includes(row[key]);\n}\n/* eslint-enable complexity, max-depth */\n\n/** `column <= value`: the cell is present and not greater than the argument. */\nfunction lteMatches(chunks: SqlChunk[], row: Record<string, unknown>, table: Table): boolean {\n if (ltMatches(chunks, row, table)) {\n return true;\n }\n return eqMatches(chunks, row, table);\n}\n\nfunction ltMatches(chunks: SqlChunk[], row: Record<string, unknown>, table: Table): boolean {\n let columnName: string | undefined;\n let argument: unknown;\n for (const chunk of chunks) {\n if (typeof chunk.name === \"string\" && chunk.table !== undefined) {\n columnName = chunk.name;\n } else if (\"brand\" in chunk) {\n argument = chunk.value;\n }\n }\n if (columnName === undefined) {\n return false;\n }\n const key = columnKey(table, columnName);\n const cell = row[key];\n if (typeof cell === \"string\" && typeof argument === \"string\") {\n return cell < argument;\n }\n if (typeof cell === \"number\" && typeof argument === \"number\") {\n return cell < argument;\n }\n return String(cell) < String(argument);\n}\n\nfunction compareCells(left: unknown, right: unknown): number {\n if (typeof left === \"string\" && typeof right === \"string\") {\n if (left === right) {\n return 0;\n }\n return left < right ? -1 : 1;\n }\n if (typeof left === \"number\" && typeof right === \"number\") {\n return left - right;\n }\n const leftText = String(left);\n const rightText = String(right);\n if (leftText === rightText) {\n return 0;\n }\n return leftText < rightText ? -1 : 1;\n}\n\n/** Collect every raw string part of a drizzle SQL chunk tree. */\nfunction sqlText(nodes: SqlChunk[]): string {\n return nodes\n .map((node) => {\n const own = textOf(node) ?? \"\";\n const nested = node.queryChunks ? sqlText(node.queryChunks as unknown as SqlChunk[]) : \"\";\n return own + nested;\n })\n .join(\"\");\n}\n\n/** Find the ordered column reference in a drizzle order-by expression. */\nfunction findOrderColumn(nodes: SqlChunk[]): string | undefined {\n for (const node of nodes) {\n if (typeof node.name === \"string\" && node.table !== undefined) {\n return node.name;\n }\n if (node.queryChunks) {\n const nested = findOrderColumn(node.queryChunks as unknown as SqlChunk[]);\n if (nested !== undefined) {\n return nested;\n }\n }\n }\n return undefined;\n}\n\n/** Sort rows per a drizzle order-by expression (single-column asc/desc). */\nexport function orderRows(rows: unknown[], orderBy: SQL, table: Table): unknown[] {\n const chunks = orderBy.queryChunks as unknown as SqlChunk[];\n const columnName = findOrderColumn(chunks);\n if (columnName === undefined) {\n return rows;\n }\n const key = columnKey(table, columnName);\n const descending = /desc/iu.test(sqlText(chunks));\n return rows.toSorted((left, right) => {\n const order = compareCells(\n (left as Record<string, unknown>)[key],\n (right as Record<string, unknown>)[key],\n );\n return descending ? -order : order;\n });\n}\n\nfunction columnKey(table: Table, dbName: string): string {\n for (const [property, column] of Object.entries(getTableColumns(table))) {\n if (column.name === dbName) {\n return property;\n }\n }\n return dbName;\n}\n/* eslint-enable require-await, no-unnecessary-type-assertion, no-unnecessary-type-parameters, non-nullable-type-assertion-style */\n"],"mappings":"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"}
1
+ {"version":3,"file":"sql-chunks.mjs","names":[],"sources":["../../src/test-helpers/sql-chunks.ts"],"sourcesContent":["import { getTableColumns, type SQL, type Table } from \"drizzle-orm\";\n\n/* eslint-disable require-await, no-unnecessary-type-assertion, no-unnecessary-type-parameters, non-nullable-type-assertion-style */\n\n/** A drizzle SQL chunk inspected for matching and ordering. */\nexport interface SqlChunk {\n value?: unknown;\n name?: string;\n table?: unknown;\n brand?: unknown;\n queryChunks?: SqlChunk[];\n}\n\n/** Flatten the string parts of a drizzle SQL chunk into a single string. */\nfunction textOf(chunk: SqlChunk | undefined): string | undefined {\n if (\n chunk === undefined ||\n !Array.isArray(chunk.value) ||\n !chunk.value.every((part) => typeof part === \"string\")\n ) {\n return undefined;\n }\n return chunk.value.join(\"\");\n}\n\n/** Test whether an in-memory row satisfies a drizzle where-clause. */\nexport function whereMatches(where: SQL, row: Record<string, unknown>, table: Table): boolean {\n let current = where.queryChunks as unknown as SqlChunk[];\n let wrapped = current[1]?.queryChunks;\n while (wrapped !== undefined && textOf(current[0]) === \"(\" && textOf(current.at(-1)) === \")\") {\n current = wrapped;\n wrapped = current[1]?.queryChunks;\n }\n // Drizzle's `and(singleCondition)` emits the condition directly, without\n // the enclosing parens produced for two or more clauses, so unwrap it.\n if (current.length === 1 && current[0]?.queryChunks !== undefined) {\n current = current[0].queryChunks as unknown as SqlChunk[];\n }\n if (current.some((chunk) => textOf(chunk)?.trim() === \"and\")) {\n return current\n .filter((chunk) => textOf(chunk) === undefined)\n .every((chunk) => matchChunk(chunk.queryChunks ?? [], row, table));\n }\n return matchChunk(current, row, table);\n}\n\nfunction matchChunk(chunks: SqlChunk[], row: Record<string, unknown>, table: Table): boolean {\n const text = chunks.map((c) => textOf(c) ?? \"\").join(\"\");\n if (/is not null/iu.test(text)) {\n return isNullMatches(chunks, row, table, true);\n }\n if (/is null/iu.test(text)) {\n return isNullMatches(chunks, row, table, false);\n }\n if (text.includes(\" <> \")) {\n return !eqMatches(chunks, row, table);\n }\n if (text.includes(\" like \")) {\n return likeMatches(chunks, row, table);\n }\n if (text.includes(\" in \")) {\n return inArrayMatches(chunks, row, table);\n }\n if (text.includes(\" >= \")) {\n return !ltMatches(chunks, row, table);\n }\n if (text.includes(\" <= \")) {\n return lteMatches(chunks, row, table);\n }\n if (text.includes(\" < \")) {\n return ltMatches(chunks, row, table);\n }\n return eqMatches(chunks, row, table);\n}\n\n/** Match `is null` / `is not null` predicates (no value argument). */\nfunction isNullMatches(\n chunks: SqlChunk[],\n row: Record<string, unknown>,\n table: Table,\n negated: boolean,\n): boolean {\n let columnName: string | undefined;\n for (const chunk of chunks) {\n if (typeof chunk.name === \"string\" && chunk.table !== undefined) {\n columnName = chunk.name;\n }\n }\n if (columnName === undefined) {\n return false;\n }\n const cell = row[columnKey(table, columnName)];\n const missing = cell === null || cell === undefined;\n return negated ? !missing : missing;\n}\n\nfunction eqMatches(chunks: SqlChunk[], row: Record<string, unknown>, table: Table): boolean {\n let columnName: string | undefined;\n let argument: unknown;\n for (const chunk of chunks) {\n if (typeof chunk.name === \"string\" && chunk.table !== undefined) {\n columnName = chunk.name;\n } else if (\"brand\" in chunk) {\n argument = chunk.value;\n }\n }\n if (columnName === undefined) {\n return false;\n }\n return row[columnKey(table, columnName)] === argument;\n}\n\n/** Match `column like 'pattern'`: `%` is any run of characters, `_` any one; everything else literal. */\nfunction likeMatches(chunks: SqlChunk[], row: Record<string, unknown>, table: Table): boolean {\n let columnName: string | undefined;\n let pattern: unknown;\n for (const chunk of chunks as unknown[]) {\n if (typeof chunk === \"string\") {\n pattern = chunk;\n } else if (chunk !== null && typeof chunk === \"object\") {\n const node = chunk as SqlChunk;\n if (typeof node.name === \"string\" && node.table !== undefined) {\n columnName = node.name;\n } else if (\"brand\" in node) {\n pattern = node.value;\n }\n }\n }\n const cell = columnName === undefined ? undefined : row[columnKey(table, columnName)];\n if (typeof cell !== \"string\" || typeof pattern !== \"string\") {\n return false;\n }\n const source = pattern.replaceAll(/[.*+?^${}()|[\\]\\\\]/gu, String.raw`\\$&`);\n return new RegExp(`^${source.replaceAll(\"%\", \".*\").replaceAll(\"_\", \".\")}$`, \"su\").test(cell);\n}\n\n/* eslint-disable complexity, max-depth -- handles drizzle's varied chunk shapes */\nfunction inArrayMatches(chunks: SqlChunk[], row: Record<string, unknown>, table: Table): boolean {\n let columnName: string | undefined;\n const values: unknown[] = [];\n const collect = (nodes: unknown[]): void => {\n for (const raw of nodes as SqlChunk[]) {\n const chunk = raw as SqlChunk & Record<string, unknown>;\n // Handle array-like chunk (inArray values stored as array of chunks)\n if (\n Array.isArray(chunk) ||\n (chunk && typeof chunk === \"object\" && Object.keys(chunk).every((k) => /^\\d+$/u.test(k)))\n ) {\n collect(Object.values(chunk as unknown as Record<string, unknown>) as unknown[]);\n continue;\n }\n if (typeof chunk.name === \"string\" && chunk.table !== undefined) {\n columnName = chunk.name as string;\n }\n if (\"brand\" in chunk && (chunk as Record<string, unknown>)[\"value\"] !== undefined) {\n const val = (chunk as Record<string, unknown>)[\"value\"];\n if (Array.isArray(val)) {\n values.push(...(val as unknown[]));\n } else {\n values.push(val);\n }\n }\n if (chunk.queryChunks) {\n collect(chunk.queryChunks as unknown[]);\n }\n const val = (chunk as Record<string, unknown>)[\"value\"];\n if (Array.isArray(val)) {\n for (const item of val as unknown[]) {\n if (\n item &&\n typeof item === \"object\" &&\n \"queryChunks\" in (item as Record<string, unknown>)\n ) {\n collect(((item as Record<string, unknown>)[\"queryChunks\"] as unknown[]) ?? []);\n }\n if (item && typeof item === \"object\" && \"value\" in (item as Record<string, unknown>)) {\n const iv = (item as Record<string, unknown>)[\"value\"];\n if (iv !== undefined) {\n values.push(iv);\n }\n }\n if (typeof item === \"string\") {\n values.push(item);\n }\n }\n }\n }\n };\n collect(chunks as unknown[]);\n if (columnName === undefined) {\n return false;\n }\n const key = columnKey(table, columnName);\n return values.includes(row[key]);\n}\n/* eslint-enable complexity, max-depth */\n\n/** `column <= value`: the cell is present and not greater than the argument. */\nfunction lteMatches(chunks: SqlChunk[], row: Record<string, unknown>, table: Table): boolean {\n if (ltMatches(chunks, row, table)) {\n return true;\n }\n return eqMatches(chunks, row, table);\n}\n\nfunction ltMatches(chunks: SqlChunk[], row: Record<string, unknown>, table: Table): boolean {\n let columnName: string | undefined;\n let argument: unknown;\n for (const chunk of chunks) {\n if (typeof chunk.name === \"string\" && chunk.table !== undefined) {\n columnName = chunk.name;\n } else if (\"brand\" in chunk) {\n argument = chunk.value;\n }\n }\n if (columnName === undefined) {\n return false;\n }\n const key = columnKey(table, columnName);\n const cell = row[key];\n if (typeof cell === \"string\" && typeof argument === \"string\") {\n return cell < argument;\n }\n if (typeof cell === \"number\" && typeof argument === \"number\") {\n return cell < argument;\n }\n return String(cell) < String(argument);\n}\n\nfunction compareCells(left: unknown, right: unknown): number {\n if (typeof left === \"string\" && typeof right === \"string\") {\n if (left === right) {\n return 0;\n }\n return left < right ? -1 : 1;\n }\n if (typeof left === \"number\" && typeof right === \"number\") {\n return left - right;\n }\n const leftText = String(left);\n const rightText = String(right);\n if (leftText === rightText) {\n return 0;\n }\n return leftText < rightText ? -1 : 1;\n}\n\n/** Collect every raw string part of a drizzle SQL chunk tree. */\nfunction sqlText(nodes: SqlChunk[]): string {\n return nodes\n .map((node) => {\n const own = textOf(node) ?? \"\";\n const nested = node.queryChunks ? sqlText(node.queryChunks as unknown as SqlChunk[]) : \"\";\n return own + nested;\n })\n .join(\"\");\n}\n\n/** Find the ordered column reference in a drizzle order-by expression. */\nfunction findOrderColumn(nodes: SqlChunk[]): string | undefined {\n for (const node of nodes) {\n if (typeof node.name === \"string\" && node.table !== undefined) {\n return node.name;\n }\n if (node.queryChunks) {\n const nested = findOrderColumn(node.queryChunks as unknown as SqlChunk[]);\n if (nested !== undefined) {\n return nested;\n }\n }\n }\n return undefined;\n}\n\n/** Sort rows per a drizzle order-by expression (single-column asc/desc). */\nexport function orderRows(rows: unknown[], orderBy: SQL, table: Table): unknown[] {\n const chunks = orderBy.queryChunks as unknown as SqlChunk[];\n const columnName = findOrderColumn(chunks);\n if (columnName === undefined) {\n return rows;\n }\n const key = columnKey(table, columnName);\n const descending = /desc/iu.test(sqlText(chunks));\n return rows.toSorted((left, right) => {\n const order = compareCells(\n (left as Record<string, unknown>)[key],\n (right as Record<string, unknown>)[key],\n );\n return descending ? -order : order;\n });\n}\n\nfunction columnKey(table: Table, dbName: string): string {\n for (const [property, column] of Object.entries(getTableColumns(table))) {\n if (column.name === dbName) {\n return property;\n }\n }\n return dbName;\n}\n/* eslint-enable require-await, no-unnecessary-type-assertion, no-unnecessary-type-parameters, non-nullable-type-assertion-style */\n"],"mappings":"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"}
@@ -1,11 +1,9 @@
1
1
  import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
3
  import { StorageAdapter } from "../adapter/storage.mjs";
4
- //#region src/test-helpers/storage-contract.d.ts
5
4
  /** Build the adapter under test (sync or async factories both work). */
6
5
  type StorageFactory = () => StorageAdapter | Promise<StorageAdapter>;
7
6
  /** Run the full storage contract against a factory. */
8
7
  declare function storageContractSuite(label: string, make: StorageFactory): void;
9
- //#endregion
10
8
  export { StorageFactory, storageContractSuite };
11
9
  //# sourceMappingURL=storage-contract.d.mts.map
@@ -3,7 +3,7 @@ import "node:url";
3
3
  import.meta.url;
4
4
  import { Readable } from "node:stream";
5
5
  import { describe, expect, it } from "vitest";
6
- //#region src/test-helpers/storage-contract.ts
6
+ // src/test-helpers/storage-contract.ts
7
7
  /**
8
8
  * Published storage contract suite for first- and third-party adapters.
9
9
  *
@@ -81,7 +81,6 @@ function storageContractSuite(label, make) {
81
81
  });
82
82
  });
83
83
  }
84
- //#endregion
85
84
  export { storageContractSuite };
86
85
 
87
86
  //# sourceMappingURL=storage-contract.mjs.map