@storyshelf/core 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. package/dist/adapter/capture-queue.d.mts +0 -2
  2. package/dist/adapter/capture-runner.d.mts +9 -4
  3. package/dist/adapter/capture-runner.mjs +6 -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 +112 -31
  36. package/dist/adapters/remote-browser.mjs +132 -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/render-runs.d.mts +0 -2
  58. package/dist/adapters/render-runs.mjs +1 -2
  59. package/dist/adapters/setup-runner.d.mts +0 -2
  60. package/dist/adapters/setup-runner.mjs +1 -2
  61. package/dist/adapters/sources.d.mts +0 -2
  62. package/dist/adapters/sources.mjs +1 -2
  63. package/dist/adapters/validate.d.mts +0 -2
  64. package/dist/adapters/validate.mjs +2 -2
  65. package/dist/adapters/validate.mjs.map +1 -1
  66. package/dist/ai.d.mts +0 -2
  67. package/dist/ai.mjs +1 -2
  68. package/dist/auth.d.mts +0 -2
  69. package/dist/auth.mjs +1 -2
  70. package/dist/brand-packs.d.mts +0 -2
  71. package/dist/brand-packs.mjs +0 -1
  72. package/dist/capture/a11y/axe-source.d.mts +0 -2
  73. package/dist/capture/a11y/axe-source.mjs +1 -2
  74. package/dist/capture/a11y/in-page.d.mts +1 -3
  75. package/dist/capture/a11y/in-page.mjs +3 -4
  76. package/dist/capture/a11y/in-page.mjs.map +1 -1
  77. package/dist/capture/a11y/map.d.mts +0 -2
  78. package/dist/capture/a11y/map.mjs +1 -2
  79. package/dist/capture/a11y/options.d.mts +0 -2
  80. package/dist/capture/a11y/options.mjs +1 -2
  81. package/dist/capture/adapter.d.mts +5 -2
  82. package/dist/capture/adapter.mjs +1 -2
  83. package/dist/capture/adapter.mjs.map +1 -1
  84. package/dist/capture/affected.d.mts +0 -2
  85. package/dist/capture/affected.mjs +1 -2
  86. package/dist/capture/attempt-logger.mjs +1 -2
  87. package/dist/capture/browsers.d.mts +0 -2
  88. package/dist/capture/browsers.mjs +1 -2
  89. package/dist/capture/build-state/deliver.d.mts +0 -2
  90. package/dist/capture/build-state/deliver.mjs +1 -2
  91. package/dist/capture/build-state/notify-job.d.mts +0 -2
  92. package/dist/capture/build-state/notify-job.mjs +1 -2
  93. package/dist/capture/build-state/publisher.d.mts +0 -2
  94. package/dist/capture/build-state/publisher.mjs +1 -2
  95. package/dist/capture/build-state/resume.d.mts +0 -2
  96. package/dist/capture/build-state/resume.mjs +1 -2
  97. package/dist/capture/build-state/types.d.mts +1 -3
  98. package/dist/capture/catalog/catalogue.d.mts +0 -2
  99. package/dist/capture/catalog/catalogue.mjs +1 -2
  100. package/dist/capture/catalog/components.d.mts +0 -2
  101. package/dist/capture/catalog/components.mjs +1 -2
  102. package/dist/capture/catalog/history.d.mts +0 -2
  103. package/dist/capture/catalog/history.mjs +1 -2
  104. package/dist/capture/catalog/hook.d.mts +0 -2
  105. package/dist/capture/catalog/hook.mjs +1 -2
  106. package/dist/capture/catalog/index.d.mts +2 -2
  107. package/dist/capture/catalog/load.d.mts +0 -2
  108. package/dist/capture/catalog/load.mjs +1 -2
  109. package/dist/capture/catalog/parse.d.mts +0 -2
  110. package/dist/capture/catalog/parse.mjs +1 -2
  111. package/dist/capture/catalog/read.d.mts +6 -3
  112. package/dist/capture/catalog/read.mjs +14 -8
  113. package/dist/capture/catalog/read.mjs.map +1 -1
  114. package/dist/capture/catalog/types.d.mts +0 -2
  115. package/dist/capture/comparison-reference.d.mts +27 -0
  116. package/dist/capture/comparison-reference.mjs +75 -0
  117. package/dist/capture/comparison-reference.mjs.map +1 -0
  118. package/dist/capture/consumer/capture-handler.d.mts +1 -3
  119. package/dist/capture/consumer/capture-handler.mjs +1 -2
  120. package/dist/capture/consumer/idle.d.mts +0 -2
  121. package/dist/capture/consumer/idle.mjs +1 -2
  122. package/dist/capture/consumer/index.d.mts +0 -2
  123. package/dist/capture/consumer/index.mjs +1 -2
  124. package/dist/capture/consumer/loop.mjs +1 -2
  125. package/dist/capture/consumer/metrics.d.mts +0 -2
  126. package/dist/capture/consumer/metrics.mjs +1 -2
  127. package/dist/capture/consumer/retry.d.mts +0 -2
  128. package/dist/capture/consumer/retry.mjs +1 -2
  129. package/dist/capture/consumer/run-job.mjs +1 -2
  130. package/dist/capture/consumer/startup.mjs +1 -2
  131. package/dist/capture/consumer/types.d.mts +0 -2
  132. package/dist/capture/crash-failure.d.mts +0 -2
  133. package/dist/capture/crash-failure.mjs +1 -2
  134. package/dist/capture/db-queue/cadence.d.mts +0 -2
  135. package/dist/capture/db-queue/cadence.mjs +1 -2
  136. package/dist/capture/db-queue/claim.d.mts +0 -2
  137. package/dist/capture/db-queue/claim.mjs +20 -4
  138. package/dist/capture/db-queue/claim.mjs.map +1 -1
  139. package/dist/capture/db-queue/clock.mjs +1 -2
  140. package/dist/capture/db-queue/codec.mjs +1 -2
  141. package/dist/capture/db-queue/index.d.mts +0 -2
  142. package/dist/capture/db-queue/index.mjs +3 -3
  143. package/dist/capture/db-queue/index.mjs.map +1 -1
  144. package/dist/capture/db-queue/keeper.d.mts +0 -2
  145. package/dist/capture/db-queue/keeper.mjs +1 -2
  146. package/dist/capture/db-queue/lease.mjs +1 -2
  147. package/dist/capture/db-queue/lifecycle.mjs +1 -2
  148. package/dist/capture/db-queue/operations.mjs +1 -2
  149. package/dist/capture/db-queue/poll-loop.d.mts +0 -2
  150. package/dist/capture/db-queue/poll-loop.mjs +1 -2
  151. package/dist/capture/db-queue/poll.d.mts +0 -2
  152. package/dist/capture/db-queue/poll.mjs +1 -2
  153. package/dist/capture/db-queue/timers.d.mts +0 -2
  154. package/dist/capture/db-queue/timers.mjs +1 -2
  155. package/dist/capture/db-queue/types.d.mts +0 -2
  156. package/dist/capture/db-queue/types.mjs +1 -2
  157. package/dist/capture/db-queue/types.mjs.map +1 -1
  158. package/dist/capture/db-queue/wake.mjs +1 -2
  159. package/dist/capture/design.mjs +1 -2
  160. package/dist/capture/diff-record.mjs +1 -2
  161. package/dist/capture/dispatch.d.mts +1 -3
  162. package/dist/capture/dispatch.mjs +17 -5
  163. package/dist/capture/dispatch.mjs.map +1 -1
  164. package/dist/capture/enrich.mjs +1 -2
  165. package/dist/capture/failure-sets.mjs +1 -2
  166. package/dist/capture/fingerprint.d.mts +0 -2
  167. package/dist/capture/fingerprint.mjs +1 -2
  168. package/dist/capture/forked/channel.d.mts +0 -2
  169. package/dist/capture/forked/child.d.mts +0 -2
  170. package/dist/capture/forked/child.mjs +1 -2
  171. package/dist/capture/forked/crash-tracker.mjs +1 -2
  172. package/dist/capture/forked/decision.d.mts +0 -2
  173. package/dist/capture/forked/decision.mjs +1 -2
  174. package/dist/capture/forked/exit.mjs +1 -2
  175. package/dist/capture/forked/fork.d.mts +0 -2
  176. package/dist/capture/forked/fork.mjs +1 -2
  177. package/dist/capture/forked/forked-capture.d.mts +0 -2
  178. package/dist/capture/forked/forked-capture.mjs +1 -2
  179. package/dist/capture/forked/lease-book.mjs +1 -2
  180. package/dist/capture/forked/protocol.d.mts +0 -2
  181. package/dist/capture/forked/protocol.mjs +1 -2
  182. package/dist/capture/forked/runs.mjs +1 -2
  183. package/dist/capture/guards.mjs +1 -2
  184. package/dist/capture/ignore-regions.d.mts +36 -0
  185. package/dist/capture/ignore-regions.mjs +65 -0
  186. package/dist/capture/ignore-regions.mjs.map +1 -0
  187. package/dist/capture/isolate.mjs +1 -2
  188. package/dist/capture/job-lease.d.mts +0 -2
  189. package/dist/capture/job-lease.mjs +1 -2
  190. package/dist/capture/matrix.mjs +4 -4
  191. package/dist/capture/matrix.mjs.map +1 -1
  192. package/dist/capture/modes.d.mts +0 -2
  193. package/dist/capture/modes.mjs +2 -3
  194. package/dist/capture/modes.mjs.map +1 -1
  195. package/dist/capture/orchestrator.d.mts +0 -2
  196. package/dist/capture/orchestrator.mjs +2 -3
  197. package/dist/capture/pipeline.d.mts +0 -2
  198. package/dist/capture/pipeline.mjs +37 -6
  199. package/dist/capture/pipeline.mjs.map +1 -1
  200. package/dist/capture/progress.d.mts +0 -2
  201. package/dist/capture/progress.mjs +1 -2
  202. package/dist/capture/publish/accept.d.mts +0 -2
  203. package/dist/capture/publish/accept.mjs +1 -2
  204. package/dist/capture/publish/complete.d.mts +1 -3
  205. package/dist/capture/publish/complete.mjs +1 -2
  206. package/dist/capture/publish/extract.d.mts +0 -2
  207. package/dist/capture/publish/extract.mjs +6 -5
  208. package/dist/capture/publish/extract.mjs.map +1 -1
  209. package/dist/capture/publish/handler.d.mts +1 -3
  210. package/dist/capture/publish/handler.mjs +1 -2
  211. package/dist/capture/publish/index.d.mts +2 -1
  212. package/dist/capture/publish/invalid-zip.d.mts +8 -0
  213. package/dist/capture/publish/invalid-zip.mjs +11 -0
  214. package/dist/capture/publish/invalid-zip.mjs.map +1 -0
  215. package/dist/capture/publish/limits.d.mts +0 -2
  216. package/dist/capture/publish/limits.mjs +1 -2
  217. package/dist/capture/publish/published.d.mts +0 -2
  218. package/dist/capture/publish/published.mjs +1 -2
  219. package/dist/capture/publish/run.d.mts +1 -3
  220. package/dist/capture/publish/run.mjs +1 -2
  221. package/dist/capture/rediff.d.mts +1 -3
  222. package/dist/capture/rediff.mjs +19 -6
  223. package/dist/capture/rediff.mjs.map +1 -1
  224. package/dist/capture/render.mjs +1 -2
  225. package/dist/capture/render.mjs.map +1 -1
  226. package/dist/capture/scratch.d.mts +0 -2
  227. package/dist/capture/scratch.mjs +2 -4
  228. package/dist/capture/scratch.mjs.map +1 -1
  229. package/dist/capture/shard-plan.mjs +1 -2
  230. package/dist/capture/shards/context.mjs +3 -3
  231. package/dist/capture/shards/context.mjs.map +1 -1
  232. package/dist/capture/shards/execute.mjs +4 -3
  233. package/dist/capture/shards/execute.mjs.map +1 -1
  234. package/dist/capture/shards/fan-out.mjs +1 -2
  235. package/dist/capture/shards/history.mjs +1 -2
  236. package/dist/capture/shards/reduce.mjs +1 -2
  237. package/dist/capture/sizing.d.mts +0 -2
  238. package/dist/capture/sizing.mjs +1 -2
  239. package/dist/capture/skip-checks.mjs +1 -2
  240. package/dist/capture/statics.d.mts +0 -2
  241. package/dist/capture/statics.mjs +2 -4
  242. package/dist/capture/statics.mjs.map +1 -1
  243. package/dist/capture/storybook-urls.d.mts +0 -2
  244. package/dist/capture/storybook-urls.mjs +3 -3
  245. package/dist/capture/storybook-urls.mjs.map +1 -1
  246. package/dist/capture/storybook.d.mts +0 -2
  247. package/dist/capture/storybook.mjs +8 -4
  248. package/dist/capture/storybook.mjs.map +1 -1
  249. package/dist/capture/target.mjs +1 -2
  250. package/dist/capture/targets.d.mts +0 -2
  251. package/dist/capture/targets.mjs +1 -2
  252. package/dist/capture/tests.d.mts +0 -2
  253. package/dist/capture/tests.mjs +13 -3
  254. package/dist/capture/tests.mjs.map +1 -1
  255. package/dist/capture/token-chunks.mjs +24 -7
  256. package/dist/capture/token-chunks.mjs.map +1 -1
  257. package/dist/capture.d.mts +5 -2
  258. package/dist/capture.mjs +5 -2
  259. package/dist/config.d.mts +16 -3
  260. package/dist/config.mjs +6 -3
  261. package/dist/config.mjs.map +1 -1
  262. package/dist/diff.d.mts +0 -2
  263. package/dist/diff.mjs +1 -2
  264. package/dist/index.d.mts +2 -2
  265. package/dist/index.mjs +2 -2
  266. package/dist/insights/budget.d.mts +0 -2
  267. package/dist/insights/budget.mjs +1 -2
  268. package/dist/insights/envelope.d.mts +0 -2
  269. package/dist/insights/envelope.mjs +1 -2
  270. package/dist/insights/evidence-health.d.mts +0 -2
  271. package/dist/insights/evidence-health.mjs +1 -2
  272. package/dist/insights/evidence.d.mts +0 -2
  273. package/dist/insights/evidence.mjs +1 -2
  274. package/dist/insights/hash.d.mts +0 -2
  275. package/dist/insights/hash.mjs +1 -2
  276. package/dist/insights/limits.d.mts +0 -2
  277. package/dist/insights/limits.mjs +1 -2
  278. package/dist/insights/prompts/v1.d.mts +0 -2
  279. package/dist/insights/prompts/v1.mjs +1 -2
  280. package/dist/insights/redact.d.mts +0 -2
  281. package/dist/insights/redact.mjs +1 -2
  282. package/dist/insights/text.mjs +1 -2
  283. package/dist/logger.d.mts +0 -2
  284. package/dist/logger.mjs +1 -2
  285. package/dist/models/ai-budget-alert.d.mts +0 -2
  286. package/dist/models/ai-budget-alert.mjs +1 -2
  287. package/dist/models/ai-usage.d.mts +0 -2
  288. package/dist/models/ai-usage.mjs +1 -2
  289. package/dist/models/baseline-approval.d.mts +18 -0
  290. package/dist/models/baseline-approval.mjs +41 -0
  291. package/dist/models/baseline-approval.mjs.map +1 -0
  292. package/dist/models/baseline-archive.d.mts +0 -2
  293. package/dist/models/baseline-archive.mjs +1 -2
  294. package/dist/models/baseline-atomic.mjs +66 -0
  295. package/dist/models/baseline-atomic.mjs.map +1 -0
  296. package/dist/models/baseline-conflict.d.mts +6 -0
  297. package/dist/models/baseline-conflict.mjs +9 -0
  298. package/dist/models/baseline-conflict.mjs.map +1 -0
  299. package/dist/models/baseline-export.d.mts +0 -2
  300. package/dist/models/baseline-export.mjs +1 -2
  301. package/dist/models/baseline-import.mjs +1 -2
  302. package/dist/models/baseline-origin.d.mts +16 -0
  303. package/dist/models/baseline-origin.mjs +35 -0
  304. package/dist/models/baseline-origin.mjs.map +1 -0
  305. package/dist/models/baseline-status.d.mts +0 -2
  306. package/dist/models/baseline-status.mjs +1 -2
  307. package/dist/models/baseline-transfer.d.mts +1 -2
  308. package/dist/models/baseline-transfer.mjs +30 -2
  309. package/dist/models/baseline-transfer.mjs.map +1 -1
  310. package/dist/models/baseline.d.mts +5 -2
  311. package/dist/models/baseline.mjs +91 -12
  312. package/dist/models/baseline.mjs.map +1 -1
  313. package/dist/models/build-component.d.mts +0 -2
  314. package/dist/models/build-component.mjs +1 -2
  315. package/dist/models/build-review-status.d.mts +0 -2
  316. package/dist/models/build-review-status.mjs +1 -2
  317. package/dist/models/build-review.d.mts +0 -2
  318. package/dist/models/build-review.mjs +1 -2
  319. package/dist/models/build.d.mts +1 -3
  320. package/dist/models/build.mjs +14 -15
  321. package/dist/models/build.mjs.map +1 -1
  322. package/dist/models/capture-attempt.d.mts +0 -2
  323. package/dist/models/capture-attempt.mjs +1 -2
  324. package/dist/models/capture-job.d.mts +0 -2
  325. package/dist/models/capture-job.mjs +1 -2
  326. package/dist/models/capture-log.d.mts +0 -2
  327. package/dist/models/capture-log.mjs +1 -2
  328. package/dist/models/capture-shard.d.mts +0 -2
  329. package/dist/models/capture-shard.mjs +1 -2
  330. package/dist/models/changeset.d.mts +0 -2
  331. package/dist/models/changeset.mjs +1 -2
  332. package/dist/models/columns.mjs +1 -2
  333. package/dist/models/comment.d.mts +0 -2
  334. package/dist/models/comment.mjs +1 -2
  335. package/dist/models/component.d.mts +0 -2
  336. package/dist/models/component.mjs +1 -2
  337. package/dist/models/connections.d.mts +0 -2
  338. package/dist/models/connections.mjs +1 -2
  339. package/dist/models/content-ref.d.mts +0 -2
  340. package/dist/models/content-ref.mjs +1 -2
  341. package/dist/models/credentials.d.mts +0 -2
  342. package/dist/models/credentials.mjs +1 -2
  343. package/dist/models/design-credentials.d.mts +0 -2
  344. package/dist/models/design-credentials.mjs +1 -2
  345. package/dist/models/design-health.d.mts +0 -2
  346. package/dist/models/design-health.mjs +1 -2
  347. package/dist/models/design-nodes.d.mts +2 -4
  348. package/dist/models/design-nodes.mjs +1 -2
  349. package/dist/models/design-renders.mjs +1 -2
  350. package/dist/models/design-resolve.d.mts +0 -2
  351. package/dist/models/design-resolve.mjs +1 -2
  352. package/dist/models/design.d.mts +0 -2
  353. package/dist/models/design.mjs +1 -2
  354. package/dist/models/inherited-ratio.d.mts +0 -2
  355. package/dist/models/inherited-ratio.mjs +1 -2
  356. package/dist/models/insight.d.mts +0 -2
  357. package/dist/models/insight.mjs +1 -2
  358. package/dist/models/label.d.mts +0 -2
  359. package/dist/models/label.mjs +1 -2
  360. package/dist/models/member.d.mts +0 -2
  361. package/dist/models/member.mjs +1 -2
  362. package/dist/models/notification-channel.d.mts +0 -2
  363. package/dist/models/notification-channel.mjs +1 -2
  364. package/dist/models/notification-subscription.d.mts +0 -2
  365. package/dist/models/notification-subscription.mjs +1 -2
  366. package/dist/models/project-group-mapping.d.mts +0 -2
  367. package/dist/models/project-group-mapping.mjs +1 -2
  368. package/dist/models/project.d.mts +0 -2
  369. package/dist/models/project.mjs +1 -2
  370. package/dist/models/public-origin.d.mts +0 -2
  371. package/dist/models/public-origin.mjs +1 -2
  372. package/dist/models/review-switch-off.d.mts +0 -2
  373. package/dist/models/review-switch-off.mjs +1 -2
  374. package/dist/models/site-settings.d.mts +0 -2
  375. package/dist/models/site-settings.mjs +1 -2
  376. package/dist/models/snapshot.d.mts +3 -2
  377. package/dist/models/snapshot.mjs +4 -2
  378. package/dist/models/snapshot.mjs.map +1 -1
  379. package/dist/models/token.d.mts +0 -2
  380. package/dist/models/token.mjs +1 -2
  381. package/dist/models/usage.d.mts +0 -2
  382. package/dist/models/usage.mjs +1 -2
  383. package/dist/models/user.d.mts +0 -2
  384. package/dist/models/user.mjs +1 -2
  385. package/dist/models/webhook.d.mts +0 -2
  386. package/dist/models/webhook.mjs +1 -2
  387. package/dist/models.d.mts +5 -2
  388. package/dist/models.mjs +5 -2
  389. package/dist/options.d.mts +0 -2
  390. package/dist/options.mjs +2 -4
  391. package/dist/options.mjs.map +1 -1
  392. package/dist/paths.d.mts +3 -3
  393. package/dist/paths.mjs +7 -3
  394. package/dist/paths.mjs.map +1 -1
  395. package/dist/retention/ai.d.mts +1 -3
  396. package/dist/retention/ai.mjs +0 -1
  397. package/dist/retention/pending.mjs +1 -2
  398. package/dist/retention/published-gzip-sweep.mjs +28 -0
  399. package/dist/retention/published-gzip-sweep.mjs.map +1 -0
  400. package/dist/retention/screenshot-sweep.d.mts +0 -2
  401. package/dist/retention/screenshot-sweep.mjs +1 -2
  402. package/dist/retention.d.mts +0 -2
  403. package/dist/retention.mjs +5 -2
  404. package/dist/retention.mjs.map +1 -1
  405. package/dist/schema/baseline.d.mts +2 -2
  406. package/dist/schema/build-component.d.mts +0 -2
  407. package/dist/schema/build-review.d.mts +0 -2
  408. package/dist/schema/build.d.mts +0 -2
  409. package/dist/schema/capture-attempt.d.mts +0 -2
  410. package/dist/schema/capture-job.d.mts +0 -2
  411. package/dist/schema/capture-shard.d.mts +0 -2
  412. package/dist/schema/comment.d.mts +0 -2
  413. package/dist/schema/connection.d.mts +0 -2
  414. package/dist/schema/content-ref.d.mts +0 -2
  415. package/dist/schema/design.d.mts +0 -2
  416. package/dist/schema/insight.d.mts +0 -2
  417. package/dist/schema/label.d.mts +0 -2
  418. package/dist/schema/member.d.mts +0 -2
  419. package/dist/schema/notification.d.mts +0 -2
  420. package/dist/schema/project-group-mapping.d.mts +0 -2
  421. package/dist/schema/project.d.mts +0 -2
  422. package/dist/schema/site-setting.d.mts +0 -2
  423. package/dist/schema/snapshot.d.mts +5 -2
  424. package/dist/schema/token.d.mts +0 -2
  425. package/dist/schema/usage.d.mts +0 -2
  426. package/dist/schema/user.d.mts +0 -2
  427. package/dist/schema/webhook.d.mts +0 -2
  428. package/dist/schema.d.mts +4 -6
  429. package/dist/serverless.d.mts +0 -2
  430. package/dist/serverless.mjs +1 -2
  431. package/dist/test-helpers/build-reference-contract.d.mts +14 -0
  432. package/dist/test-helpers/build-reference-contract.mjs +66 -0
  433. package/dist/test-helpers/build-reference-contract.mjs.map +1 -0
  434. package/dist/test-helpers/create-project.d.mts +0 -2
  435. package/dist/test-helpers/create-project.mjs +1 -2
  436. package/dist/test-helpers/database-contract.d.mts +0 -2
  437. package/dist/test-helpers/database-contract.mjs +37 -2
  438. package/dist/test-helpers/database-contract.mjs.map +1 -1
  439. package/dist/test-helpers/deferred.d.mts +0 -2
  440. package/dist/test-helpers/deferred.mjs +1 -2
  441. package/dist/test-helpers/design-contract.d.mts +0 -2
  442. package/dist/test-helpers/design-contract.mjs +1 -2
  443. package/dist/test-helpers/fake-adapters.d.mts +0 -2
  444. package/dist/test-helpers/fake-adapters.mjs +1 -2
  445. package/dist/test-helpers/fake-database.d.mts +0 -2
  446. package/dist/test-helpers/fake-database.mjs +7 -2
  447. package/dist/test-helpers/fake-database.mjs.map +1 -1
  448. package/dist/test-helpers/fake-design.d.mts +0 -2
  449. package/dist/test-helpers/fake-design.mjs +1 -2
  450. package/dist/test-helpers/fake-notifier.d.mts +0 -2
  451. package/dist/test-helpers/fake-notifier.mjs +1 -2
  452. package/dist/test-helpers/fake-storage.d.mts +0 -2
  453. package/dist/test-helpers/fake-storage.mjs +1 -2
  454. package/dist/test-helpers/fake-tables.mjs +5 -2
  455. package/dist/test-helpers/fake-tables.mjs.map +1 -1
  456. package/dist/test-helpers/manual-clock.d.mts +0 -2
  457. package/dist/test-helpers/manual-clock.mjs +1 -2
  458. package/dist/test-helpers/notifier-contract.d.mts +0 -2
  459. package/dist/test-helpers/notifier-contract.mjs +1 -2
  460. package/dist/test-helpers/queue-contract.d.mts +0 -2
  461. package/dist/test-helpers/queue-contract.mjs +1 -2
  462. package/dist/test-helpers/queue-multi-instance.d.mts +0 -2
  463. package/dist/test-helpers/queue-multi-instance.mjs +1 -2
  464. package/dist/test-helpers/runner-contract.d.mts +0 -2
  465. package/dist/test-helpers/runner-contract.mjs +1 -2
  466. package/dist/test-helpers/sql-chunks.mjs +2 -2
  467. package/dist/test-helpers/sql-chunks.mjs.map +1 -1
  468. package/dist/test-helpers/storage-contract.d.mts +0 -2
  469. package/dist/test-helpers/storage-contract.mjs +1 -2
  470. package/dist/test-helpers.d.mts +2 -1
  471. package/dist/test-helpers.mjs +2 -1
  472. package/dist/tracing.mjs +36 -6
  473. package/dist/tracing.mjs.map +1 -1
  474. package/dist/types.d.mts +0 -2
  475. package/dist/types.mjs +1 -2
  476. package/dist/urls.d.mts +0 -2
  477. package/dist/urls.mjs +1 -2
  478. package/dist/utils/adaptive-concurrency.d.mts +0 -2
  479. package/dist/utils/adaptive-concurrency.mjs +1 -2
  480. package/dist/utils/connect-retry.d.mts +2 -2
  481. package/dist/utils/connect-retry.mjs +2 -3
  482. package/dist/utils/connect-retry.mjs.map +1 -1
  483. package/dist/utils/encrypt.d.mts +0 -2
  484. package/dist/utils/encrypt.mjs +1 -2
  485. package/dist/utils/environment.d.mts +0 -2
  486. package/dist/utils/environment.mjs +1 -2
  487. package/dist/utils/hash.d.mts +0 -2
  488. package/dist/utils/hash.mjs +1 -2
  489. package/dist/utils/http.d.mts +13 -3
  490. package/dist/utils/http.mjs +79 -17
  491. package/dist/utils/http.mjs.map +1 -1
  492. package/dist/utils/map-adaptive.d.mts +0 -2
  493. package/dist/utils/map-adaptive.mjs +1 -2
  494. package/dist/utils/map-limit.d.mts +0 -2
  495. package/dist/utils/map-limit.mjs +1 -2
  496. package/dist/utils/mime.d.mts +0 -2
  497. package/dist/utils/mime.mjs +1 -2
  498. package/dist/utils/page-limiter.d.mts +0 -2
  499. package/dist/utils/page-limiter.mjs +1 -2
  500. package/dist/utils/path-security.d.mts +0 -2
  501. package/dist/utils/path-security.mjs +2 -4
  502. package/dist/utils/path-security.mjs.map +1 -1
  503. package/dist/utils/public-origin.d.mts +0 -2
  504. package/dist/utils/public-origin.mjs +1 -2
  505. package/dist/utils/redact.d.mts +0 -2
  506. package/dist/utils/redact.mjs +1 -2
  507. package/dist/utils/remote-environment.d.mts +40 -3
  508. package/dist/utils/remote-environment.mjs +52 -3
  509. package/dist/utils/remote-environment.mjs.map +1 -1
  510. package/dist/utils/resources.d.mts +0 -2
  511. package/dist/utils/resources.mjs +1 -2
  512. package/dist/utils/screenshot-store.d.mts +0 -2
  513. package/dist/utils/screenshot-store.mjs +1 -2
  514. package/dist/utils/session-gate.d.mts +7 -6
  515. package/dist/utils/session-gate.mjs +28 -12
  516. package/dist/utils/session-gate.mjs.map +1 -1
  517. package/dist/utils/storybook-token.d.mts +11 -3
  518. package/dist/utils/storybook-token.mjs +10 -9
  519. package/dist/utils/storybook-token.mjs.map +1 -1
  520. package/dist/utils/storybook-url.d.mts +0 -2
  521. package/dist/utils/storybook-url.mjs +1 -2
  522. package/dist/utils/timing.d.mts +0 -2
  523. package/dist/utils/timing.mjs +1 -2
  524. package/dist/utils/ulid.d.mts +0 -2
  525. package/dist/utils/ulid.mjs +1 -2
  526. package/dist/utils/zip-read.mjs +1 -2
  527. package/dist/utils/zip-write.d.mts +0 -2
  528. package/dist/utils/zip-write.mjs +1 -2
  529. package/dist/utils.d.mts +5 -5
  530. package/dist/utils.mjs +5 -5
  531. package/package.json +6 -6
@@ -1,13 +1,11 @@
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/database-contract.d.ts
5
4
  /** Tables every adapter must expose (single-sourced from the contract). */
6
5
  declare const REQUIRED_TABLES: string[];
7
6
  /** Build the adapter under test (sync or async factories both work). */
8
7
  type DatabaseFactory = () => DatabaseAdapter | Promise<DatabaseAdapter>;
9
8
  /** Run the database contract against a factory. */
10
9
  declare function databaseContractSuite(label: string, make: DatabaseFactory): void;
11
- //#endregion
12
10
  export { DatabaseFactory, REQUIRED_TABLES, databaseContractSuite };
13
11
  //# sourceMappingURL=database-contract.d.mts.map
@@ -1,9 +1,12 @@
1
1
  import "node:path";
2
2
  import "node:url";
3
3
  import.meta.url;
4
+ import { createShelfLogger } from "../logger.mjs";
4
5
  import { REQUIRED_TABLE_KEYS } from "../adapter/database.mjs";
6
+ import { randomUUID } from "node:crypto";
7
+ import { getTableColumns, ne } from "drizzle-orm";
5
8
  import { describe, expect, it } from "vitest";
6
- //#region src/test-helpers/database-contract.ts
9
+ // src/test-helpers/database-contract.ts
7
10
  /**
8
11
  * Published database contract suite for first- and third-party adapters.
9
12
  *
@@ -21,6 +24,7 @@ const REQUIRED_TABLES = REQUIRED_TABLE_KEYS;
21
24
  const REQUIRED_METHODS = [
22
25
  "insert",
23
26
  "update",
27
+ "updateWhere",
24
28
  "get",
25
29
  "remove",
26
30
  "list",
@@ -43,6 +47,38 @@ function databaseContractSuite(label, make) {
43
47
  const adapter = await make();
44
48
  for (const method of REQUIRED_METHODS) expect(typeof adapter[method]).toBe("function");
45
49
  });
50
+ it("conditionally updates and returns the current row when refused", async () => {
51
+ const adapter = await make();
52
+ await adapter.lifecycle?.setup({
53
+ config: {},
54
+ logger: createShelfLogger({ level: "silent" })
55
+ });
56
+ const table = adapter.tables.projects;
57
+ const id = `conditional-contract-${randomUUID()}`;
58
+ try {
59
+ const now = (/* @__PURE__ */ new Date()).toISOString();
60
+ await adapter.insert(table, {
61
+ id,
62
+ name: "before",
63
+ slug: id,
64
+ createdAt: now,
65
+ updatedAt: now
66
+ });
67
+ const condition = ne(getTableColumns(table)["name"], "locked");
68
+ const first = await adapter.updateWhere(table, id, { name: "locked" }, condition);
69
+ expect(first?.["name"]).toBe("locked");
70
+ const refused = await adapter.updateWhere(table, id, { name: "after" }, condition);
71
+ expect(refused?.["name"]).toBe("locked");
72
+ expect((await adapter.get(table, id))?.["name"]).toBe("locked");
73
+ expect(await adapter.updateWhere(table, "missing", { name: "x" }, condition)).toBeNull();
74
+ } finally {
75
+ try {
76
+ await adapter.remove(table, id);
77
+ } finally {
78
+ await adapter.lifecycle?.teardown();
79
+ }
80
+ }
81
+ }, 3e4);
46
82
  it("keeps the lifecycle rule (absent or all three hooks)", async () => {
47
83
  const lifecycle = (await make()).lifecycle;
48
84
  if (lifecycle === void 0) return;
@@ -52,7 +88,6 @@ function databaseContractSuite(label, make) {
52
88
  });
53
89
  });
54
90
  }
55
- //#endregion
56
91
  export { REQUIRED_TABLES, databaseContractSuite };
57
92
 
58
93
  //# sourceMappingURL=database-contract.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"database-contract.mjs","names":[],"sources":["../../src/test-helpers/database-contract.ts"],"sourcesContent":["/**\n * Published database contract suite for first- and third-party adapters.\n *\n * Structural conformance only (identity, table map, methods, lifecycle\n * rule) — row-level CRUD stays per-package because insert shapes differ per\n * dialect schema. A package proves conformance in one line:\n *\n * ```ts\n * import { databaseContractSuite } from \"@storyshelf/core/test-helpers\";\n * databaseContractSuite(\"sqlite\", () => createSqliteDatabase(\":memory:\"));\n * ```\n */\nimport { describe, expect, it } from \"vitest\";\nimport type { DatabaseAdapter } from \"../adapters/database.ts\";\nimport { REQUIRED_TABLE_KEYS } from \"../adapters/database.ts\";\n\n/** Tables every adapter must expose (single-sourced from the contract). */\nexport const REQUIRED_TABLES = REQUIRED_TABLE_KEYS;\n\nconst REQUIRED_METHODS = [\"insert\", \"update\", \"get\", \"remove\", \"list\", \"count\", \"all\"];\n\n/** Build the adapter under test (sync or async factories both work). */\nexport type DatabaseFactory = () => DatabaseAdapter | Promise<DatabaseAdapter>;\n\n/** Run the database contract against a factory. */\nexport function databaseContractSuite(label: string, make: DatabaseFactory): void {\n describe(`database contract: ${label}`, () => {\n it(\"exposes database metadata\", async () => {\n const adapter = await make();\n expect(adapter.metadata.category).toBe(\"database\");\n expect(adapter.metadata.kind.length).toBeGreaterThan(0);\n });\n\n it(\"exposes the full table map\", async () => {\n const adapter = await make();\n const tables = adapter.tables as unknown as Record<string, unknown>;\n for (const table of REQUIRED_TABLES) {\n expect(tables[table], `missing table: ${table}`).toBeDefined();\n }\n });\n\n it(\"exposes every CRUD method\", async () => {\n const adapter = await make();\n for (const method of REQUIRED_METHODS) {\n expect(typeof (adapter as unknown as Record<string, unknown>)[method]).toBe(\"function\");\n }\n });\n\n it(\"keeps the lifecycle rule (absent or all three hooks)\", async () => {\n const adapter = await make();\n const lifecycle = adapter.lifecycle as\n | { setup?: unknown; teardown?: unknown; health?: unknown }\n | undefined;\n if (lifecycle === undefined) {\n return;\n }\n expect(typeof lifecycle.setup).toBe(\"function\");\n expect(typeof lifecycle.teardown).toBe(\"function\");\n expect(typeof lifecycle.health).toBe(\"function\");\n });\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAiBA,MAAa,kBAAkB;AAE/B,MAAM,mBAAmB;CAAC;CAAU;CAAU;CAAO;CAAU;CAAQ;CAAS;AAAK;;AAMrF,SAAgB,sBAAsB,OAAe,MAA6B;CAChF,SAAS,sBAAsB,eAAe;EAC5C,GAAG,6BAA6B,YAAY;GAC1C,MAAM,UAAU,MAAM,KAAK;GAC3B,OAAO,QAAQ,SAAS,QAAQ,CAAC,CAAC,KAAK,UAAU;GACjD,OAAO,QAAQ,SAAS,KAAK,MAAM,CAAC,CAAC,gBAAgB,CAAC;EACxD,CAAC;EAED,GAAG,8BAA8B,YAAY;GAE3C,MAAM,UAAS,MADO,KAAK,EAAA,CACJ;GACvB,KAAK,MAAM,SAAS,iBAClB,OAAO,OAAO,QAAQ,kBAAkB,OAAO,CAAC,CAAC,YAAY;EAEjE,CAAC;EAED,GAAG,6BAA6B,YAAY;GAC1C,MAAM,UAAU,MAAM,KAAK;GAC3B,KAAK,MAAM,UAAU,kBACnB,OAAO,OAAQ,QAA+C,OAAO,CAAC,CAAC,KAAK,UAAU;EAE1F,CAAC;EAED,GAAG,wDAAwD,YAAY;GAErE,MAAM,aAAY,MADI,KAAK,EAAA,CACD;GAG1B,IAAI,cAAc,KAAA,GAChB;GAEF,OAAO,OAAO,UAAU,KAAK,CAAC,CAAC,KAAK,UAAU;GAC9C,OAAO,OAAO,UAAU,QAAQ,CAAC,CAAC,KAAK,UAAU;GACjD,OAAO,OAAO,UAAU,MAAM,CAAC,CAAC,KAAK,UAAU;EACjD,CAAC;CACH,CAAC;AACH"}
1
+ {"version":3,"file":"database-contract.mjs","names":[],"sources":["../../src/test-helpers/database-contract.ts"],"sourcesContent":["/**\n * Published database contract suite for first- and third-party adapters.\n *\n * Structural conformance only (identity, table map, methods, lifecycle\n * rule) — row-level CRUD stays per-package because insert shapes differ per\n * dialect schema. A package proves conformance in one line:\n *\n * ```ts\n * import { databaseContractSuite } from \"@storyshelf/core/test-helpers\";\n * databaseContractSuite(\"sqlite\", () => createSqliteDatabase(\":memory:\"));\n * ```\n */\nimport { getTableColumns, ne } from \"drizzle-orm\";\nimport { randomUUID } from \"node:crypto\";\nimport { describe, expect, it } from \"vitest\";\nimport type { DatabaseAdapter } from \"../adapters/database.ts\";\nimport { REQUIRED_TABLE_KEYS } from \"../adapters/database.ts\";\nimport { createShelfLogger } from \"../logger.ts\";\n\n/** Tables every adapter must expose (single-sourced from the contract). */\nexport const REQUIRED_TABLES = REQUIRED_TABLE_KEYS;\n\nconst REQUIRED_METHODS = [\n \"insert\",\n \"update\",\n \"updateWhere\",\n \"get\",\n \"remove\",\n \"list\",\n \"count\",\n \"all\",\n];\n\n/** Build the adapter under test (sync or async factories both work). */\nexport type DatabaseFactory = () => DatabaseAdapter | Promise<DatabaseAdapter>;\n\n/** Run the database contract against a factory. */\nexport function databaseContractSuite(label: string, make: DatabaseFactory): void {\n describe(`database contract: ${label}`, () => {\n it(\"exposes database metadata\", async () => {\n const adapter = await make();\n expect(adapter.metadata.category).toBe(\"database\");\n expect(adapter.metadata.kind.length).toBeGreaterThan(0);\n });\n\n it(\"exposes the full table map\", async () => {\n const adapter = await make();\n const tables = adapter.tables as unknown as Record<string, unknown>;\n for (const table of REQUIRED_TABLES) {\n expect(tables[table], `missing table: ${table}`).toBeDefined();\n }\n });\n\n it(\"exposes every CRUD method\", async () => {\n const adapter = await make();\n for (const method of REQUIRED_METHODS) {\n expect(typeof (adapter as unknown as Record<string, unknown>)[method]).toBe(\"function\");\n }\n });\n\n it(\"conditionally updates and returns the current row when refused\", async () => {\n const adapter = await make();\n await adapter.lifecycle?.setup({\n config: {},\n logger: createShelfLogger({ level: \"silent\" }),\n });\n const table = adapter.tables.projects;\n const id = `conditional-contract-${randomUUID()}`;\n try {\n const now = new Date().toISOString();\n await adapter.insert(table, {\n id,\n name: \"before\",\n slug: id,\n createdAt: now,\n updatedAt: now,\n });\n const condition = ne(getTableColumns(table)[\"name\"]!, \"locked\");\n const first = await adapter.updateWhere(table, id, { name: \"locked\" }, condition);\n expect(first?.[\"name\"]).toBe(\"locked\");\n const refused = await adapter.updateWhere(table, id, { name: \"after\" }, condition);\n expect(refused?.[\"name\"]).toBe(\"locked\");\n expect((await adapter.get(table, id))?.[\"name\"]).toBe(\"locked\");\n expect(await adapter.updateWhere(table, \"missing\", { name: \"x\" }, condition)).toBeNull();\n } finally {\n try {\n await adapter.remove(table, id);\n } finally {\n await adapter.lifecycle?.teardown();\n }\n }\n }, 30_000);\n\n it(\"keeps the lifecycle rule (absent or all three hooks)\", async () => {\n const adapter = await make();\n const lifecycle = adapter.lifecycle as\n | { setup?: unknown; teardown?: unknown; health?: unknown }\n | undefined;\n if (lifecycle === undefined) {\n return;\n }\n expect(typeof lifecycle.setup).toBe(\"function\");\n expect(typeof lifecycle.teardown).toBe(\"function\");\n expect(typeof lifecycle.health).toBe(\"function\");\n });\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAoBA,MAAa,kBAAkB;AAE/B,MAAM,mBAAmB;CACvB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAMA,SAAgB,sBAAsB,OAAe,MAA6B;CAChF,SAAS,sBAAsB,eAAe;EAC5C,GAAG,6BAA6B,YAAY;GAC1C,MAAM,UAAU,MAAM,KAAK;GAC3B,OAAO,QAAQ,SAAS,QAAQ,CAAC,CAAC,KAAK,UAAU;GACjD,OAAO,QAAQ,SAAS,KAAK,MAAM,CAAC,CAAC,gBAAgB,CAAC;EACxD,CAAC;EAED,GAAG,8BAA8B,YAAY;GAE3C,MAAM,UAAS,MADO,KAAK,EAAA,CACJ;GACvB,KAAK,MAAM,SAAS,iBAClB,OAAO,OAAO,QAAQ,kBAAkB,OAAO,CAAC,CAAC,YAAY;EAEjE,CAAC;EAED,GAAG,6BAA6B,YAAY;GAC1C,MAAM,UAAU,MAAM,KAAK;GAC3B,KAAK,MAAM,UAAU,kBACnB,OAAO,OAAQ,QAA+C,OAAO,CAAC,CAAC,KAAK,UAAU;EAE1F,CAAC;EAED,GAAG,kEAAkE,YAAY;GAC/E,MAAM,UAAU,MAAM,KAAK;GAC3B,MAAM,QAAQ,WAAW,MAAM;IAC7B,QAAQ,CAAC;IACT,QAAQ,kBAAkB,EAAE,OAAO,SAAS,CAAC;GAC/C,CAAC;GACD,MAAM,QAAQ,QAAQ,OAAO;GAC7B,MAAM,KAAK,wBAAwB,WAAW;GAC9C,IAAI;IACF,MAAM,uBAAM,IAAI,KAAK,EAAA,CAAE,YAAY;IACnC,MAAM,QAAQ,OAAO,OAAO;KAC1B;KACA,MAAM;KACN,MAAM;KACN,WAAW;KACX,WAAW;IACb,CAAC;IACD,MAAM,YAAY,GAAG,gBAAgB,KAAK,CAAC,CAAC,SAAU,QAAQ;IAC9D,MAAM,QAAQ,MAAM,QAAQ,YAAY,OAAO,IAAI,EAAE,MAAM,SAAS,GAAG,SAAS;IAChF,OAAO,QAAQ,OAAO,CAAC,CAAC,KAAK,QAAQ;IACrC,MAAM,UAAU,MAAM,QAAQ,YAAY,OAAO,IAAI,EAAE,MAAM,QAAQ,GAAG,SAAS;IACjF,OAAO,UAAU,OAAO,CAAC,CAAC,KAAK,QAAQ;IACvC,QAAQ,MAAM,QAAQ,IAAI,OAAO,EAAE,EAAA,GAAK,OAAO,CAAC,CAAC,KAAK,QAAQ;IAC9D,OAAO,MAAM,QAAQ,YAAY,OAAO,WAAW,EAAE,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS;GACzF,UAAU;IACR,IAAI;KACF,MAAM,QAAQ,OAAO,OAAO,EAAE;IAChC,UAAU;KACR,MAAM,QAAQ,WAAW,SAAS;IACpC;GACF;EACF,GAAG,GAAM;EAET,GAAG,wDAAwD,YAAY;GAErE,MAAM,aAAY,MADI,KAAK,EAAA,CACD;GAG1B,IAAI,cAAc,KAAA,GAChB;GAEF,OAAO,OAAO,UAAU,KAAK,CAAC,CAAC,KAAK,UAAU;GAC9C,OAAO,OAAO,UAAU,QAAQ,CAAC,CAAC,KAAK,UAAU;GACjD,OAAO,OAAO,UAAU,MAAM,CAAC,CAAC,KAAK,UAAU;EACjD,CAAC;CACH,CAAC;AACH"}
@@ -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/deferred.d.ts
4
3
  /**
5
4
  * A promise a test resolves by hand, for asserting concurrency and ordering without sleeping.
6
5
  * Tests wait on `promise` to observe an in-flight state, then call `resolve()` to let it finish.
@@ -34,6 +33,5 @@ interface ReleaseQueue {
34
33
  }
35
34
  /** Create a FIFO release queue. */
36
35
  declare function createReleaseQueue(): ReleaseQueue;
37
- //#endregion
38
36
  export { Deferred, Latch, ReleaseQueue, createLatch, createReleaseQueue, deferred };
39
37
  //# sourceMappingURL=deferred.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/deferred.ts
4
+ // src/test-helpers/deferred.ts
5
5
  /** Create a promise the test settles explicitly. */
6
6
  function deferred() {
7
7
  let resolve;
@@ -55,7 +55,6 @@ function createReleaseQueue() {
55
55
  }
56
56
  };
57
57
  }
58
- //#endregion
59
58
  export { createLatch, createReleaseQueue, deferred };
60
59
 
61
60
  //# sourceMappingURL=deferred.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 { DesignProvider } from "../adapter/design.mjs";
4
- //#region src/test-helpers/design-contract.d.ts
5
4
  /** Build the provider under test (sync or async factories both work). */
6
5
  type DesignFactory = () => DesignProvider | Promise<DesignProvider>;
7
6
  /** Links the suite uses to probe `parseUrl`. */
@@ -16,6 +15,5 @@ interface DesignContractSamples {
16
15
  }
17
16
  /** Run the design-provider contract against a factory. */
18
17
  declare function designContractSuite(label: string, make: DesignFactory, samples: DesignContractSamples): void;
19
- //#endregion
20
18
  export { DesignContractSamples, DesignFactory, designContractSuite };
21
19
  //# sourceMappingURL=design-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/design-contract.ts
5
+ // src/test-helpers/design-contract.ts
6
6
  /**
7
7
  * Published design-provider contract suite for first- and third-party providers.
8
8
  *
@@ -34,7 +34,6 @@ function designContractSuite(label, make, samples) {
34
34
  });
35
35
  });
36
36
  }
37
- //#endregion
38
37
  export { designContractSuite };
39
38
 
40
39
  //# sourceMappingURL=design-contract.mjs.map
@@ -3,12 +3,10 @@ import __tsdown_shims_url from 'node:url';
3
3
  import { DatabaseAdapter } from "../adapter/database.mjs";
4
4
  import { makeDatabase } from "./fake-database.mjs";
5
5
  import { FakeStorage, makeStorage } from "./fake-storage.mjs";
6
- //#region src/test-helpers/fake-adapters.d.ts
7
6
  /**
8
7
  * Empty table map for spec/test doubles whose methods never run (OpenAPI
9
8
  * generation, asset serving). Satisfies boot validation without a driver.
10
9
  */
11
10
  declare function stubTables(): DatabaseAdapter["tables"];
12
- //#endregion
13
11
  export { type FakeStorage, makeDatabase, makeStorage, stubTables };
14
12
  //# sourceMappingURL=fake-adapters.d.mts.map
@@ -4,7 +4,7 @@ import.meta.url;
4
4
  import { REQUIRED_TABLE_KEYS } from "../adapter/database.mjs";
5
5
  import { makeDatabase } from "./fake-database.mjs";
6
6
  import { makeStorage } from "./fake-storage.mjs";
7
- //#region src/test-helpers/fake-adapters.ts
7
+ // src/test-helpers/fake-adapters.ts
8
8
  /**
9
9
  * Empty table map for spec/test doubles whose methods never run (OpenAPI
10
10
  * generation, asset serving). Satisfies boot validation without a driver.
@@ -14,7 +14,6 @@ function stubTables() {
14
14
  for (const key of REQUIRED_TABLE_KEYS) tables[key] = {};
15
15
  return tables;
16
16
  }
17
- //#endregion
18
17
  export { makeDatabase, makeStorage, stubTables };
19
18
 
20
19
  //# sourceMappingURL=fake-adapters.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 { DatabaseAdapter } from "../adapter/database.mjs";
4
- //#region src/test-helpers/fake-database.d.ts
5
4
  /** Create an in-memory database adapter for capture pipeline tests. */
6
5
  declare function makeDatabase(): {
7
6
  db: DatabaseAdapter;
8
7
  };
9
- //#endregion
10
8
  export { makeDatabase };
11
9
  //# sourceMappingURL=fake-database.d.mts.map
@@ -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
  *
@@ -265,6 +265,9 @@ const fakeSchema = {
265
265
  inherited: "inherited",
266
266
  baselineId: "baseline_id",
267
267
  baselineVersion: "baseline_version",
268
+ sourceBuildId: "source_build_id",
269
+ comparisonImagePath: "comparison_image_path",
270
+ comparisonMetadata: "comparison_metadata",
268
271
  mode: "mode",
269
272
  browser: "browser",
270
273
  createdAt: "created_at",
@@ -277,6 +280,7 @@ const fakeSchema = {
277
280
  viewportName: "viewport_name",
278
281
  branch: "branch",
279
282
  snapshotId: "snapshot_id",
283
+ sourceBuildId: "source_build_id",
280
284
  screenshotPath: "screenshot_path",
281
285
  infraHash: "infra_hash",
282
286
  fingerprint: "fingerprint",
@@ -458,7 +462,6 @@ const fakeSchema = {
458
462
  createdAt: "created_at"
459
463
  })
460
464
  };
461
- //#endregion
462
465
  export { fakeSchema };
463
466
 
464
467
  //# 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":"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"}
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 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