@nitpicker/archive 0.0.0-stage → 0.25.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 (737) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +105 -2
  3. package/lib/apply-connection-pragmas.d.ts +18 -0
  4. package/lib/apply-connection-pragmas.js +40 -0
  5. package/lib/archive-accessor.d.ts +265 -0
  6. package/lib/archive-accessor.js +477 -0
  7. package/lib/archive-lock.d.ts +45 -0
  8. package/lib/archive-lock.js +154 -0
  9. package/lib/archive.d.ts +736 -0
  10. package/lib/archive.js +1056 -0
  11. package/lib/body-hash/compute-body-hash.d.ts +32 -0
  12. package/lib/body-hash/compute-body-hash.js +35 -0
  13. package/lib/cache/clear-archive-cache-entry.d.ts +18 -0
  14. package/lib/cache/clear-archive-cache-entry.js +24 -0
  15. package/lib/cache/clear-archive-cache-root.d.ts +26 -0
  16. package/lib/cache/clear-archive-cache-root.js +32 -0
  17. package/lib/cache/compute-archive-cache-key.d.ts +39 -0
  18. package/lib/cache/compute-archive-cache-key.js +95 -0
  19. package/lib/cache/extract-archive-to-cache.d.ts +57 -0
  20. package/lib/cache/extract-archive-to-cache.js +326 -0
  21. package/lib/cache/get-archive-cache-root.d.ts +20 -0
  22. package/lib/cache/get-archive-cache-root.js +53 -0
  23. package/lib/cache/is-archive-cache-disabled.d.ts +24 -0
  24. package/lib/cache/is-archive-cache-disabled.js +34 -0
  25. package/lib/cache/list-archive-cache-entries.d.ts +23 -0
  26. package/lib/cache/list-archive-cache-entries.js +130 -0
  27. package/lib/cache/path-exists.d.ts +9 -0
  28. package/lib/cache/path-exists.js +18 -0
  29. package/lib/cache/resolve-archive-cache-dir.d.ts +26 -0
  30. package/lib/cache/resolve-archive-cache-dir.js +32 -0
  31. package/lib/cache/types.d.ts +33 -0
  32. package/lib/cache/types.js +1 -0
  33. package/lib/content-type/is-html-content-type.d.ts +17 -0
  34. package/lib/content-type/is-html-content-type.js +19 -0
  35. package/lib/content-type/normalize-content-type.d.ts +14 -0
  36. package/lib/content-type/normalize-content-type.js +20 -0
  37. package/lib/create-adjunct-tables.d.ts +66 -0
  38. package/lib/create-adjunct-tables.js +510 -0
  39. package/lib/create-entity-tables.d.ts +191 -0
  40. package/lib/create-entity-tables.js +387 -0
  41. package/lib/create-progress-reporter.d.ts +30 -0
  42. package/lib/create-progress-reporter.js +38 -0
  43. package/lib/create-ref-tables.d.ts +35 -0
  44. package/lib/create-ref-tables.js +185 -0
  45. package/lib/create-template-tables.d.ts +28 -0
  46. package/lib/create-template-tables.js +92 -0
  47. package/lib/database.d.ts +549 -0
  48. package/lib/database.js +804 -0
  49. package/lib/db-ops/_shared/clear-write-ref-caches.d.ts +27 -0
  50. package/lib/db-ops/_shared/clear-write-ref-caches.js +35 -0
  51. package/lib/db-ops/_shared/compress-payload.d.ts +26 -0
  52. package/lib/db-ops/_shared/compress-payload.js +30 -0
  53. package/lib/db-ops/_shared/create-write-ref-caches.d.ts +17 -0
  54. package/lib/db-ops/_shared/create-write-ref-caches.js +27 -0
  55. package/lib/db-ops/_shared/decode-json-ref.d.ts +17 -0
  56. package/lib/db-ops/_shared/decode-json-ref.js +31 -0
  57. package/lib/db-ops/_shared/keyset-paginate-by-id.d.ts +49 -0
  58. package/lib/db-ops/_shared/keyset-paginate-by-id.js +69 -0
  59. package/lib/db-ops/_shared/load-response-headers-by-set-ids.d.ts +20 -0
  60. package/lib/db-ops/_shared/load-response-headers-by-set-ids.js +53 -0
  61. package/lib/db-ops/_shared/resolve-content-item-id.d.ts +62 -0
  62. package/lib/db-ops/_shared/resolve-content-item-id.js +143 -0
  63. package/lib/db-ops/_shared/resolve-url-or-blob.d.ts +23 -0
  64. package/lib/db-ops/_shared/resolve-url-or-blob.js +29 -0
  65. package/lib/db-ops/_shared/retry-setting.d.ts +16 -0
  66. package/lib/db-ops/_shared/retry-setting.js +18 -0
  67. package/lib/db-ops/_shared/safe-parse-json.d.ts +11 -0
  68. package/lib/db-ops/_shared/safe-parse-json.js +18 -0
  69. package/lib/db-ops/_shared/types.d.ts +94 -0
  70. package/lib/db-ops/_shared/types.js +1 -0
  71. package/lib/db-ops/_shared/upsert-blob-ref.d.ts +25 -0
  72. package/lib/db-ops/_shared/upsert-blob-ref.js +48 -0
  73. package/lib/db-ops/_shared/upsert-content-type-ref.d.ts +30 -0
  74. package/lib/db-ops/_shared/upsert-content-type-ref.js +45 -0
  75. package/lib/db-ops/_shared/upsert-json-ref.d.ts +22 -0
  76. package/lib/db-ops/_shared/upsert-json-ref.js +41 -0
  77. package/lib/db-ops/_shared/upsert-response-headers.d.ts +35 -0
  78. package/lib/db-ops/_shared/upsert-response-headers.js +49 -0
  79. package/lib/db-ops/_shared/upsert-url-ref.d.ts +39 -0
  80. package/lib/db-ops/_shared/upsert-url-ref.js +62 -0
  81. package/lib/db-ops/anchors/get-anchors-on-page.d.ts +10 -0
  82. package/lib/db-ops/anchors/get-anchors-on-page.js +21 -0
  83. package/lib/db-ops/config/get-base-url.d.ts +8 -0
  84. package/lib/db-ops/config/get-base-url.js +14 -0
  85. package/lib/db-ops/config/get-config.d.ts +10 -0
  86. package/lib/db-ops/config/get-config.js +29 -0
  87. package/lib/db-ops/config/get-created-cwd.d.ts +11 -0
  88. package/lib/db-ops/config/get-created-cwd.js +13 -0
  89. package/lib/db-ops/config/get-name.d.ts +8 -0
  90. package/lib/db-ops/config/get-name.js +14 -0
  91. package/lib/db-ops/config/info-column-allowlist.d.ts +7 -0
  92. package/lib/db-ops/config/info-column-allowlist.js +29 -0
  93. package/lib/db-ops/config/info-json-columns.d.ts +5 -0
  94. package/lib/db-ops/config/info-json-columns.js +11 -0
  95. package/lib/db-ops/config/set-config.d.ts +12 -0
  96. package/lib/db-ops/config/set-config.js +21 -0
  97. package/lib/db-ops/config/update-config.d.ts +17 -0
  98. package/lib/db-ops/config/update-config.js +36 -0
  99. package/lib/db-ops/console-logs/compute-console-log-hash.d.ts +19 -0
  100. package/lib/db-ops/console-logs/compute-console-log-hash.js +30 -0
  101. package/lib/db-ops/console-logs/replace-console-logs.d.ts +34 -0
  102. package/lib/db-ops/console-logs/replace-console-logs.js +123 -0
  103. package/lib/db-ops/console-logs/stringify-console-log-args.d.ts +16 -0
  104. package/lib/db-ops/console-logs/stringify-console-log-args.js +26 -0
  105. package/lib/db-ops/console-logs/types.d.ts +38 -0
  106. package/lib/db-ops/console-logs/types.js +1 -0
  107. package/lib/db-ops/console-logs/upsert-console-log-item.d.ts +29 -0
  108. package/lib/db-ops/console-logs/upsert-console-log-item.js +52 -0
  109. package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.d.ts +18 -0
  110. package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.js +23 -0
  111. package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.d.ts +12 -0
  112. package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.js +15 -0
  113. package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.d.ts +14 -0
  114. package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.js +30 -0
  115. package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.d.ts +57 -0
  116. package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.js +87 -0
  117. package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.d.ts +21 -0
  118. package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.js +27 -0
  119. package/lib/db-ops/errors/insert-crawl-error.d.ts +15 -0
  120. package/lib/db-ops/errors/insert-crawl-error.js +21 -0
  121. package/lib/db-ops/errors/insert-page-error.d.ts +21 -0
  122. package/lib/db-ops/errors/insert-page-error.js +30 -0
  123. package/lib/db-ops/errors/list-dns-burned-host-candidates.d.ts +33 -0
  124. package/lib/db-ops/errors/list-dns-burned-host-candidates.js +158 -0
  125. package/lib/db-ops/html/read-page-html-blob.d.ts +17 -0
  126. package/lib/db-ops/html/read-page-html-blob.js +20 -0
  127. package/lib/db-ops/lifecycle/checkpoint.d.ts +8 -0
  128. package/lib/db-ops/lifecycle/checkpoint.js +9 -0
  129. package/lib/db-ops/lifecycle/destroy.d.ts +6 -0
  130. package/lib/db-ops/lifecycle/destroy.js +7 -0
  131. package/lib/db-ops/lifecycle/init.d.ts +58 -0
  132. package/lib/db-ops/lifecycle/init.js +122 -0
  133. package/lib/db-ops/list-reconcile/record-list-reconcile-run.d.ts +22 -0
  134. package/lib/db-ops/list-reconcile/record-list-reconcile-run.js +41 -0
  135. package/lib/db-ops/meta/get-audios-of-page.d.ts +11 -0
  136. package/lib/db-ops/meta/get-audios-of-page.js +15 -0
  137. package/lib/db-ops/meta/get-buttons-of-page.d.ts +11 -0
  138. package/lib/db-ops/meta/get-buttons-of-page.js +15 -0
  139. package/lib/db-ops/meta/get-canvases-of-page.d.ts +11 -0
  140. package/lib/db-ops/meta/get-canvases-of-page.js +15 -0
  141. package/lib/db-ops/meta/get-custom-elements-of-page.d.ts +11 -0
  142. package/lib/db-ops/meta/get-custom-elements-of-page.js +15 -0
  143. package/lib/db-ops/meta/get-headings-of-page.d.ts +11 -0
  144. package/lib/db-ops/meta/get-headings-of-page.js +15 -0
  145. package/lib/db-ops/meta/get-iframes-of-page.d.ts +11 -0
  146. package/lib/db-ops/meta/get-iframes-of-page.js +15 -0
  147. package/lib/db-ops/meta/get-jsonld-of-page.d.ts +13 -0
  148. package/lib/db-ops/meta/get-jsonld-of-page.js +27 -0
  149. package/lib/db-ops/meta/get-main-content-images-of-page.d.ts +11 -0
  150. package/lib/db-ops/meta/get-main-content-images-of-page.js +15 -0
  151. package/lib/db-ops/meta/get-main-content-tables-of-page.d.ts +11 -0
  152. package/lib/db-ops/meta/get-main-content-tables-of-page.js +15 -0
  153. package/lib/db-ops/meta/get-page-technologies-of-page.d.ts +11 -0
  154. package/lib/db-ops/meta/get-page-technologies-of-page.js +15 -0
  155. package/lib/db-ops/meta/get-technology-signals-of-page.d.ts +11 -0
  156. package/lib/db-ops/meta/get-technology-signals-of-page.js +15 -0
  157. package/lib/db-ops/meta/get-videos-of-page.d.ts +11 -0
  158. package/lib/db-ops/meta/get-videos-of-page.js +15 -0
  159. package/lib/db-ops/outages/close-network-outage.d.ts +12 -0
  160. package/lib/db-ops/outages/close-network-outage.js +15 -0
  161. package/lib/db-ops/outages/close-stale-open-network-outages.d.ts +26 -0
  162. package/lib/db-ops/outages/close-stale-open-network-outages.js +42 -0
  163. package/lib/db-ops/outages/compute-outage-clamp-timestamp.d.ts +26 -0
  164. package/lib/db-ops/outages/compute-outage-clamp-timestamp.js +31 -0
  165. package/lib/db-ops/outages/insert-network-outage.d.ts +14 -0
  166. package/lib/db-ops/outages/insert-network-outage.js +29 -0
  167. package/lib/db-ops/outages/list-network-outages.d.ts +28 -0
  168. package/lib/db-ops/outages/list-network-outages.js +42 -0
  169. package/lib/db-ops/pages/order/set-url-order.d.ts +13 -0
  170. package/lib/db-ops/pages/order/set-url-order.js +38 -0
  171. package/lib/db-ops/pages/read/build-page-query.d.ts +18 -0
  172. package/lib/db-ops/pages/read/build-page-query.js +40 -0
  173. package/lib/db-ops/pages/read/get-crawling-state.d.ts +117 -0
  174. package/lib/db-ops/pages/read/get-crawling-state.js +161 -0
  175. package/lib/db-ops/pages/read/get-existing-page-urls.d.ts +15 -0
  176. package/lib/db-ops/pages/read/get-existing-page-urls.js +30 -0
  177. package/lib/db-ops/pages/read/get-page-count.d.ts +12 -0
  178. package/lib/db-ops/pages/read/get-page-count.js +21 -0
  179. package/lib/db-ops/pages/read/get-page-source-by-url.d.ts +24 -0
  180. package/lib/db-ops/pages/read/get-page-source-by-url.js +28 -0
  181. package/lib/db-ops/pages/read/get-pages-with-rels.d.ts +38 -0
  182. package/lib/db-ops/pages/read/get-pages-with-rels.js +107 -0
  183. package/lib/db-ops/pages/read/get-pages.d.ts +11 -0
  184. package/lib/db-ops/pages/read/get-pages.js +51 -0
  185. package/lib/db-ops/pages/read/get-scraped-html-page-count.d.ts +18 -0
  186. package/lib/db-ops/pages/read/get-scraped-html-page-count.js +25 -0
  187. package/lib/db-ops/pages/read/reconstruct-page-rows.d.ts +31 -0
  188. package/lib/db-ops/pages/read/reconstruct-page-rows.js +32 -0
  189. package/lib/db-ops/pages/reset/clear-page-derived-rows.d.ts +20 -0
  190. package/lib/db-ops/pages/reset/clear-page-derived-rows.js +37 -0
  191. package/lib/db-ops/pages/reset/repromote-external-pages.d.ts +30 -0
  192. package/lib/db-ops/pages/reset/repromote-external-pages.js +91 -0
  193. package/lib/db-ops/pages/reset/reset-failed-pages.d.ts +88 -0
  194. package/lib/db-ops/pages/reset/reset-failed-pages.js +216 -0
  195. package/lib/db-ops/pages/reset/reset-pages-by-urls.d.ts +80 -0
  196. package/lib/db-ops/pages/reset/reset-pages-by-urls.js +151 -0
  197. package/lib/db-ops/pages/reset/retryable-image-scan-codes.d.ts +24 -0
  198. package/lib/db-ops/pages/reset/retryable-image-scan-codes.js +24 -0
  199. package/lib/db-ops/pages/write/insert-audios.d.ts +14 -0
  200. package/lib/db-ops/pages/write/insert-audios.js +25 -0
  201. package/lib/db-ops/pages/write/insert-buttons.d.ts +14 -0
  202. package/lib/db-ops/pages/write/insert-buttons.js +29 -0
  203. package/lib/db-ops/pages/write/insert-canvases.d.ts +14 -0
  204. package/lib/db-ops/pages/write/insert-canvases.js +26 -0
  205. package/lib/db-ops/pages/write/insert-custom-elements.d.ts +27 -0
  206. package/lib/db-ops/pages/write/insert-custom-elements.js +40 -0
  207. package/lib/db-ops/pages/write/insert-headings.d.ts +15 -0
  208. package/lib/db-ops/pages/write/insert-headings.js +27 -0
  209. package/lib/db-ops/pages/write/insert-iframes.d.ts +14 -0
  210. package/lib/db-ops/pages/write/insert-iframes.js +28 -0
  211. package/lib/db-ops/pages/write/insert-inventory-content-items.d.ts +38 -0
  212. package/lib/db-ops/pages/write/insert-inventory-content-items.js +60 -0
  213. package/lib/db-ops/pages/write/insert-inventory-seeds.d.ts +36 -0
  214. package/lib/db-ops/pages/write/insert-inventory-seeds.js +48 -0
  215. package/lib/db-ops/pages/write/insert-inventory-skipped-pages.d.ts +42 -0
  216. package/lib/db-ops/pages/write/insert-inventory-skipped-pages.js +56 -0
  217. package/lib/db-ops/pages/write/insert-jsonld.d.ts +17 -0
  218. package/lib/db-ops/pages/write/insert-jsonld.js +49 -0
  219. package/lib/db-ops/pages/write/insert-main-content-images.d.ts +20 -0
  220. package/lib/db-ops/pages/write/insert-main-content-images.js +32 -0
  221. package/lib/db-ops/pages/write/insert-main-content-tables.d.ts +14 -0
  222. package/lib/db-ops/pages/write/insert-main-content-tables.js +29 -0
  223. package/lib/db-ops/pages/write/insert-page.d.ts +56 -0
  224. package/lib/db-ops/pages/write/insert-page.js +259 -0
  225. package/lib/db-ops/pages/write/insert-technologies.d.ts +25 -0
  226. package/lib/db-ops/pages/write/insert-technologies.js +45 -0
  227. package/lib/db-ops/pages/write/insert-videos.d.ts +14 -0
  228. package/lib/db-ops/pages/write/insert-videos.js +28 -0
  229. package/lib/db-ops/pages/write/link-redirect-sources.d.ts +42 -0
  230. package/lib/db-ops/pages/write/link-redirect-sources.js +101 -0
  231. package/lib/db-ops/pages/write/record-redirect.d.ts +35 -0
  232. package/lib/db-ops/pages/write/record-redirect.js +100 -0
  233. package/lib/db-ops/pages/write/set-skipped-page.d.ts +13 -0
  234. package/lib/db-ops/pages/write/set-skipped-page.js +24 -0
  235. package/lib/db-ops/pages/write/update-page.d.ts +40 -0
  236. package/lib/db-ops/pages/write/update-page.js +419 -0
  237. package/lib/db-ops/pages/write/write-page-html-blob.d.ts +19 -0
  238. package/lib/db-ops/pages/write/write-page-html-blob.js +41 -0
  239. package/lib/db-ops/referrers/get-redirects-for-pages.d.ts +9 -0
  240. package/lib/db-ops/referrers/get-redirects-for-pages.js +15 -0
  241. package/lib/db-ops/referrers/get-referrers-of-page.d.ts +17 -0
  242. package/lib/db-ops/referrers/get-referrers-of-page.js +32 -0
  243. package/lib/db-ops/referrers/get-referrers-of-resource.d.ts +8 -0
  244. package/lib/db-ops/referrers/get-referrers-of-resource.js +15 -0
  245. package/lib/db-ops/resources/build-resource-query.d.ts +25 -0
  246. package/lib/db-ops/resources/build-resource-query.js +29 -0
  247. package/lib/db-ops/resources/get-existing-resource-urls.d.ts +9 -0
  248. package/lib/db-ops/resources/get-existing-resource-urls.js +24 -0
  249. package/lib/db-ops/resources/get-resource-by-url.d.ts +13 -0
  250. package/lib/db-ops/resources/get-resource-by-url.js +22 -0
  251. package/lib/db-ops/resources/get-resource-url-list.d.ts +17 -0
  252. package/lib/db-ops/resources/get-resource-url-list.js +26 -0
  253. package/lib/db-ops/resources/get-resources.d.ts +8 -0
  254. package/lib/db-ops/resources/get-resources.js +11 -0
  255. package/lib/db-ops/resources/insert-inventory-resources.d.ts +24 -0
  256. package/lib/db-ops/resources/insert-inventory-resources.js +64 -0
  257. package/lib/db-ops/resources/insert-resource-referrers.d.ts +15 -0
  258. package/lib/db-ops/resources/insert-resource-referrers.js +54 -0
  259. package/lib/db-ops/resources/insert-resource.d.ts +34 -0
  260. package/lib/db-ops/resources/insert-resource.js +73 -0
  261. package/lib/db-ops/resources/reconstruct-resource-rows.d.ts +26 -0
  262. package/lib/db-ops/resources/reconstruct-resource-rows.js +30 -0
  263. package/lib/db-ops/templates/assign-template-labels.d.ts +60 -0
  264. package/lib/db-ops/templates/assign-template-labels.js +187 -0
  265. package/lib/db-ops/templates/replace-page-templates.d.ts +44 -0
  266. package/lib/db-ops/templates/replace-page-templates.js +174 -0
  267. package/lib/db-ops/templates/serialize-template-cluster-reason.d.ts +16 -0
  268. package/lib/db-ops/templates/serialize-template-cluster-reason.js +17 -0
  269. package/lib/db-ops/templates/types.d.ts +103 -0
  270. package/lib/db-ops/templates/types.js +1 -0
  271. package/lib/debug.d.ts +8 -0
  272. package/lib/debug.js +9 -0
  273. package/lib/decode-html-blob.d.ts +20 -0
  274. package/lib/decode-html-blob.js +23 -0
  275. package/lib/decode-page-html-blob-bytes.d.ts +25 -0
  276. package/lib/decode-page-html-blob-bytes.js +29 -0
  277. package/lib/decode-stored-blob-bytes.d.ts +25 -0
  278. package/lib/decode-stored-blob-bytes.js +47 -0
  279. package/lib/derive-lineage-from-parent.d.ts +37 -0
  280. package/lib/derive-lineage-from-parent.js +42 -0
  281. package/lib/drop-legacy-tables.d.ts +45 -0
  282. package/lib/drop-legacy-tables.js +56 -0
  283. package/lib/error-kind/classify-error-kind.d.ts +20 -0
  284. package/lib/error-kind/classify-error-kind.js +136 -0
  285. package/lib/error-kind/network-related-error-kinds.d.ts +23 -0
  286. package/lib/error-kind/network-related-error-kinds.js +28 -0
  287. package/lib/error-kind/permanent-error-kinds.d.ts +48 -0
  288. package/lib/error-kind/permanent-error-kinds.js +54 -0
  289. package/lib/error-kind/types.d.ts +54 -0
  290. package/lib/error-kind/types.js +1 -0
  291. package/lib/filesystem/append-text.d.ts +9 -0
  292. package/lib/filesystem/append-text.js +14 -0
  293. package/lib/filesystem/copy-dir-sync.d.ts +6 -0
  294. package/lib/filesystem/copy-dir-sync.js +9 -0
  295. package/lib/filesystem/copy-dir.d.ts +7 -0
  296. package/lib/filesystem/copy-dir.js +13 -0
  297. package/lib/filesystem/copy-file-with-progress.d.ts +20 -0
  298. package/lib/filesystem/copy-file-with-progress.js +34 -0
  299. package/lib/filesystem/exists.d.ts +6 -0
  300. package/lib/filesystem/exists.js +9 -0
  301. package/lib/filesystem/get-file-list.d.ts +8 -0
  302. package/lib/filesystem/get-file-list.js +12 -0
  303. package/lib/filesystem/is-dir.d.ts +6 -0
  304. package/lib/filesystem/is-dir.js +10 -0
  305. package/lib/filesystem/mkdir.d.ts +8 -0
  306. package/lib/filesystem/mkdir.js +15 -0
  307. package/lib/filesystem/output-binary.d.ts +12 -0
  308. package/lib/filesystem/output-binary.js +17 -0
  309. package/lib/filesystem/output-json.d.ts +9 -0
  310. package/lib/filesystem/output-json.js +14 -0
  311. package/lib/filesystem/output-text.d.ts +11 -0
  312. package/lib/filesystem/output-text.js +32 -0
  313. package/lib/filesystem/parse-pax-path.d.ts +18 -0
  314. package/lib/filesystem/parse-pax-path.js +47 -0
  315. package/lib/filesystem/parse-tar-size-field.d.ts +13 -0
  316. package/lib/filesystem/parse-tar-size-field.js +40 -0
  317. package/lib/filesystem/peek-tar-top-dir.d.ts +35 -0
  318. package/lib/filesystem/peek-tar-top-dir.js +215 -0
  319. package/lib/filesystem/read-json.d.ts +7 -0
  320. package/lib/filesystem/read-json.js +11 -0
  321. package/lib/filesystem/read-text.d.ts +6 -0
  322. package/lib/filesystem/read-text.js +10 -0
  323. package/lib/filesystem/readline.d.ts +11 -0
  324. package/lib/filesystem/readline.js +26 -0
  325. package/lib/filesystem/remove.d.ts +5 -0
  326. package/lib/filesystem/remove.js +10 -0
  327. package/lib/filesystem/rename.d.ts +16 -0
  328. package/lib/filesystem/rename.js +48 -0
  329. package/lib/filesystem/tar.d.ts +23 -0
  330. package/lib/filesystem/tar.js +78 -0
  331. package/lib/filesystem/untar.d.ts +33 -0
  332. package/lib/filesystem/untar.js +84 -0
  333. package/lib/get-failed-page-messages.d.ts +56 -0
  334. package/lib/get-failed-page-messages.js +146 -0
  335. package/lib/get-json.d.ts +10 -0
  336. package/lib/get-json.js +25 -0
  337. package/lib/html-snapshot/match-selector-html.d.ts +25 -0
  338. package/lib/html-snapshot/match-selector-html.js +28 -0
  339. package/lib/html-snapshot/match-selector-snapshots.d.ts +33 -0
  340. package/lib/html-snapshot/match-selector-snapshots.js +33 -0
  341. package/lib/html-snapshot/search-html-document.d.ts +29 -0
  342. package/lib/html-snapshot/search-html-document.js +27 -0
  343. package/lib/html-snapshot/search-html-snapshots.d.ts +36 -0
  344. package/lib/html-snapshot/search-html-snapshots.js +35 -0
  345. package/lib/html-snapshot/types.d.ts +111 -0
  346. package/lib/html-snapshot/types.js +7 -0
  347. package/lib/html-snapshot/validate-search-pattern.d.ts +15 -0
  348. package/lib/html-snapshot/validate-search-pattern.js +17 -0
  349. package/lib/init-schema.d.ts +48 -0
  350. package/lib/init-schema.js +124 -0
  351. package/lib/is-inventory-source.d.ts +21 -0
  352. package/lib/is-inventory-source.js +22 -0
  353. package/lib/is-within-outage-window.d.ts +49 -0
  354. package/lib/is-within-outage-window.js +33 -0
  355. package/lib/isolated-cluster/create-isolated-cluster-run.d.ts +24 -0
  356. package/lib/isolated-cluster/create-isolated-cluster-run.js +26 -0
  357. package/lib/libsql-dialect.d.ts +115 -0
  358. package/lib/libsql-dialect.js +116 -0
  359. package/lib/limited-page-ids.d.ts +9 -0
  360. package/lib/limited-page-ids.js +18 -0
  361. package/lib/meta/assert-compatible-version.d.ts +60 -0
  362. package/lib/meta/assert-compatible-version.js +93 -0
  363. package/lib/meta/classify-jsonld-type.d.ts +23 -0
  364. package/lib/meta/classify-jsonld-type.js +43 -0
  365. package/lib/meta/compare-semver.d.ts +23 -0
  366. package/lib/meta/compare-semver.js +51 -0
  367. package/lib/meta/compute-main-contents-denormalized.d.ts +41 -0
  368. package/lib/meta/compute-main-contents-denormalized.js +88 -0
  369. package/lib/meta/compute-page-denormalized.d.ts +20 -0
  370. package/lib/meta/compute-page-denormalized.js +35 -0
  371. package/lib/meta/derive-flat-from-meta.d.ts +34 -0
  372. package/lib/meta/derive-flat-from-meta.js +158 -0
  373. package/lib/meta/derive-meta-extras.d.ts +20 -0
  374. package/lib/meta/derive-meta-extras.js +23 -0
  375. package/lib/meta/extract-tags-for-archive.d.ts +17 -0
  376. package/lib/meta/extract-tags-for-archive.js +36 -0
  377. package/lib/meta/parse-main-content-class-list.d.ts +19 -0
  378. package/lib/meta/parse-main-content-class-list.js +34 -0
  379. package/lib/meta/summarize-jsonld.d.ts +17 -0
  380. package/lib/meta/summarize-jsonld.js +29 -0
  381. package/lib/meta/technologies/combine-technology-confidence.d.ts +46 -0
  382. package/lib/meta/technologies/combine-technology-confidence.js +93 -0
  383. package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.d.ts +45 -0
  384. package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.js +53 -0
  385. package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.d.ts +33 -0
  386. package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.js +46 -0
  387. package/lib/meta/technologies/extract-technologies-for-archive.d.ts +33 -0
  388. package/lib/meta/technologies/extract-technologies-for-archive.js +30 -0
  389. package/lib/meta/technologies/match-js-license-comment-signal.d.ts +21 -0
  390. package/lib/meta/technologies/match-js-license-comment-signal.js +23 -0
  391. package/lib/meta/technologies/match-structural-technology-signals.d.ts +26 -0
  392. package/lib/meta/technologies/match-structural-technology-signals.js +48 -0
  393. package/lib/meta/technologies/normalize-wappalyzer-entries.d.ts +25 -0
  394. package/lib/meta/technologies/normalize-wappalyzer-entries.js +35 -0
  395. package/lib/meta/technologies/technology-signal-definitions.d.ts +44 -0
  396. package/lib/meta/technologies/technology-signal-definitions.js +60 -0
  397. package/lib/meta/technologies/types.d.ts +70 -0
  398. package/lib/meta/technologies/types.js +13 -0
  399. package/lib/meta/types.d.ts +1490 -0
  400. package/lib/meta/types.js +65 -0
  401. package/lib/migrate-content-items-alias-of-id.d.ts +52 -0
  402. package/lib/migrate-content-items-alias-of-id.js +69 -0
  403. package/lib/migrate-content-items-dedupe-cap-event-id.d.ts +46 -0
  404. package/lib/migrate-content-items-dedupe-cap-event-id.js +62 -0
  405. package/lib/migrate-content-items-is-metadata-only.d.ts +44 -0
  406. package/lib/migrate-content-items-is-metadata-only.js +60 -0
  407. package/lib/migrate-entity-tables.d.ts +55 -0
  408. package/lib/migrate-entity-tables.js +66 -0
  409. package/lib/migrate-info-created-cwd.d.ts +17 -0
  410. package/lib/migrate-info-created-cwd.js +36 -0
  411. package/lib/migrate-info-main-content-selector.d.ts +16 -0
  412. package/lib/migrate-info-main-content-selector.js +35 -0
  413. package/lib/migrate-info-request-header-names.d.ts +16 -0
  414. package/lib/migrate-info-request-header-names.js +35 -0
  415. package/lib/migrate-info-roots.d.ts +20 -0
  416. package/lib/migrate-info-roots.js +52 -0
  417. package/lib/migrate-inventory-runs-to-list-reconcile-runs.d.ts +34 -0
  418. package/lib/migrate-inventory-runs-to-list-reconcile-runs.js +51 -0
  419. package/lib/migrate-list-reconcile-runs-exclude-skipped.d.ts +25 -0
  420. package/lib/migrate-list-reconcile-runs-exclude-skipped.js +44 -0
  421. package/lib/migrate-list-reconcile-runs-invalid-skipped.d.ts +16 -0
  422. package/lib/migrate-list-reconcile-runs-invalid-skipped.js +35 -0
  423. package/lib/migrate-main-contents-columns.d.ts +26 -0
  424. package/lib/migrate-main-contents-columns.js +61 -0
  425. package/lib/migrate-page-meta-body-hash.d.ts +44 -0
  426. package/lib/migrate-page-meta-body-hash.js +63 -0
  427. package/lib/migrate-page-meta-console-error-count.d.ts +27 -0
  428. package/lib/migrate-page-meta-console-error-count.js +45 -0
  429. package/lib/migrate-page-meta-custom-element-count.d.ts +33 -0
  430. package/lib/migrate-page-meta-custom-element-count.js +51 -0
  431. package/lib/migrate-page-meta-image-scan.d.ts +27 -0
  432. package/lib/migrate-page-meta-image-scan.js +52 -0
  433. package/lib/migrate-page-tags-to-page-technologies.d.ts +39 -0
  434. package/lib/migrate-page-tags-to-page-technologies.js +79 -0
  435. package/lib/migrate-ref-tables.d.ts +25 -0
  436. package/lib/migrate-ref-tables.js +38 -0
  437. package/lib/native-executor/check-native-executor-config.d.ts +17 -0
  438. package/lib/native-executor/check-native-executor-config.js +20 -0
  439. package/lib/page-meta-column-maps.d.ts +32 -0
  440. package/lib/page-meta-column-maps.js +43 -0
  441. package/lib/page.d.ts +546 -0
  442. package/lib/page.js +764 -0
  443. package/lib/peek-archive-lock.d.ts +40 -0
  444. package/lib/peek-archive-lock.js +62 -0
  445. package/lib/populate-entity-tables/collapse-anchor-rows.d.ts +41 -0
  446. package/lib/populate-entity-tables/collapse-anchor-rows.js +87 -0
  447. package/lib/populate-entity-tables/derive-dom-path.d.ts +35 -0
  448. package/lib/populate-entity-tables/derive-dom-path.js +72 -0
  449. package/lib/populate-entity-tables/is-blob-ref-value.d.ts +16 -0
  450. package/lib/populate-entity-tables/is-blob-ref-value.js +19 -0
  451. package/lib/populate-entity-tables/match-images-to-dom-paths.d.ts +66 -0
  452. package/lib/populate-entity-tables/match-images-to-dom-paths.js +96 -0
  453. package/lib/populate-entity-tables/populate-anchor-edges.d.ts +33 -0
  454. package/lib/populate-entity-tables/populate-anchor-edges.js +153 -0
  455. package/lib/populate-entity-tables/populate-content-items.d.ts +40 -0
  456. package/lib/populate-entity-tables/populate-content-items.js +141 -0
  457. package/lib/populate-entity-tables/populate-entities.d.ts +81 -0
  458. package/lib/populate-entity-tables/populate-entities.js +110 -0
  459. package/lib/populate-entity-tables/populate-image-items.d.ts +91 -0
  460. package/lib/populate-entity-tables/populate-image-items.js +226 -0
  461. package/lib/populate-entity-tables/populate-page-meta.d.ts +33 -0
  462. package/lib/populate-entity-tables/populate-page-meta.js +267 -0
  463. package/lib/populate-entity-tables/populate-resource-items.d.ts +22 -0
  464. package/lib/populate-entity-tables/populate-resource-items.js +114 -0
  465. package/lib/populate-entity-tables/populate-resource-ref-edges.d.ts +31 -0
  466. package/lib/populate-entity-tables/populate-resource-ref-edges.js +33 -0
  467. package/lib/populate-entity-tables/resolve-blob-refs.d.ts +31 -0
  468. package/lib/populate-entity-tables/resolve-blob-refs.js +100 -0
  469. package/lib/populate-entity-tables/resolve-content-type-refs.d.ts +22 -0
  470. package/lib/populate-entity-tables/resolve-content-type-refs.js +27 -0
  471. package/lib/populate-entity-tables/resolve-header-sets.d.ts +49 -0
  472. package/lib/populate-entity-tables/resolve-header-sets.js +122 -0
  473. package/lib/populate-entity-tables/resolve-json-refs.d.ts +25 -0
  474. package/lib/populate-entity-tables/resolve-json-refs.js +67 -0
  475. package/lib/populate-entity-tables/resolve-text-refs.d.ts +30 -0
  476. package/lib/populate-entity-tables/resolve-text-refs.js +61 -0
  477. package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.d.ts +21 -0
  478. package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.js +27 -0
  479. package/lib/populate-entity-tables/resolve-url-refs.d.ts +33 -0
  480. package/lib/populate-entity-tables/resolve-url-refs.js +60 -0
  481. package/lib/populate-entity-tables/test-utils/count-rows.d.ts +17 -0
  482. package/lib/populate-entity-tables/test-utils/count-rows.js +20 -0
  483. package/lib/populate-entity-tables/test-utils/seed-content-items.d.ts +25 -0
  484. package/lib/populate-entity-tables/test-utils/seed-content-items.js +42 -0
  485. package/lib/populate-entity-tables/test-utils/setup-entities-db.d.ts +30 -0
  486. package/lib/populate-entity-tables/test-utils/setup-entities-db.js +175 -0
  487. package/lib/populate-entity-tables/types.d.ts +157 -0
  488. package/lib/populate-entity-tables/types.js +12 -0
  489. package/lib/populate-entity-tables/upsert-text-refs.d.ts +38 -0
  490. package/lib/populate-entity-tables/upsert-text-refs.js +78 -0
  491. package/lib/populate-ref-tables/classify-content-type.d.ts +16 -0
  492. package/lib/populate-ref-tables/classify-content-type.js +52 -0
  493. package/lib/populate-ref-tables/compute-content-hash.d.ts +22 -0
  494. package/lib/populate-ref-tables/compute-content-hash.js +26 -0
  495. package/lib/populate-ref-tables/compute-header-flags.d.ts +16 -0
  496. package/lib/populate-ref-tables/compute-header-flags.js +70 -0
  497. package/lib/populate-ref-tables/content-type-rules.d.ts +38 -0
  498. package/lib/populate-ref-tables/content-type-rules.js +133 -0
  499. package/lib/populate-ref-tables/create-header-table-caches.d.ts +25 -0
  500. package/lib/populate-ref-tables/create-header-table-caches.js +49 -0
  501. package/lib/populate-ref-tables/data-uri-url-refs-limit.d.ts +15 -0
  502. package/lib/populate-ref-tables/data-uri-url-refs-limit.js +15 -0
  503. package/lib/populate-ref-tables/decode-data-uri.d.ts +21 -0
  504. package/lib/populate-ref-tables/decode-data-uri.js +126 -0
  505. package/lib/populate-ref-tables/decompose-header-set.d.ts +29 -0
  506. package/lib/populate-ref-tables/decompose-header-set.js +157 -0
  507. package/lib/populate-ref-tables/decompose-url.d.ts +25 -0
  508. package/lib/populate-ref-tables/decompose-url.js +70 -0
  509. package/lib/populate-ref-tables/header-stability.d.ts +19 -0
  510. package/lib/populate-ref-tables/header-stability.js +22 -0
  511. package/lib/populate-ref-tables/header-value-cache-key.d.ts +17 -0
  512. package/lib/populate-ref-tables/header-value-cache-key.js +19 -0
  513. package/lib/populate-ref-tables/normalize-mime.d.ts +24 -0
  514. package/lib/populate-ref-tables/normalize-mime.js +36 -0
  515. package/lib/populate-ref-tables/populate-blob-refs.d.ts +38 -0
  516. package/lib/populate-ref-tables/populate-blob-refs.js +134 -0
  517. package/lib/populate-ref-tables/populate-content-type-refs.d.ts +27 -0
  518. package/lib/populate-ref-tables/populate-content-type-refs.js +70 -0
  519. package/lib/populate-ref-tables/populate-header-tables.d.ts +35 -0
  520. package/lib/populate-ref-tables/populate-header-tables.js +80 -0
  521. package/lib/populate-ref-tables/populate-json-refs.d.ts +29 -0
  522. package/lib/populate-ref-tables/populate-json-refs.js +101 -0
  523. package/lib/populate-ref-tables/populate-refs.d.ts +51 -0
  524. package/lib/populate-ref-tables/populate-refs.js +62 -0
  525. package/lib/populate-ref-tables/populate-text-refs.d.ts +32 -0
  526. package/lib/populate-ref-tables/populate-text-refs.js +133 -0
  527. package/lib/populate-ref-tables/populate-url-refs.d.ts +28 -0
  528. package/lib/populate-ref-tables/populate-url-refs.js +148 -0
  529. package/lib/populate-ref-tables/test-utils/count-rows.d.ts +15 -0
  530. package/lib/populate-ref-tables/test-utils/count-rows.js +17 -0
  531. package/lib/populate-ref-tables/types.d.ts +197 -0
  532. package/lib/populate-ref-tables/types.js +7 -0
  533. package/lib/populate-ref-tables/upsert-one-header-set.d.ts +34 -0
  534. package/lib/populate-ref-tables/upsert-one-header-set.js +208 -0
  535. package/lib/populate-ref-tables/volatile-header-names.d.ts +20 -0
  536. package/lib/populate-ref-tables/volatile-header-names.js +33 -0
  537. package/lib/redirect-table.d.ts +9 -0
  538. package/lib/redirect-table.js +28 -0
  539. package/lib/release-finished-statements.d.ts +42 -0
  540. package/lib/release-finished-statements.js +45 -0
  541. package/lib/resolve-redirect-chain.d.ts +33 -0
  542. package/lib/resolve-redirect-chain.js +27 -0
  543. package/lib/resource.d.ts +46 -0
  544. package/lib/resource.js +62 -0
  545. package/lib/retarget-legacy-fk-tables.d.ts +61 -0
  546. package/lib/retarget-legacy-fk-tables.js +137 -0
  547. package/lib/safe-path.d.ts +9 -0
  548. package/lib/safe-path.js +17 -0
  549. package/lib/scope/build-scope-map.d.ts +21 -0
  550. package/lib/scope/build-scope-map.js +32 -0
  551. package/lib/scope/find-scope-entry.d.ts +25 -0
  552. package/lib/scope/find-scope-entry.js +45 -0
  553. package/lib/template-classification/classify-archive-page-templates.d.ts +42 -0
  554. package/lib/template-classification/classify-archive-page-templates.js +70 -0
  555. package/lib/template-classification/classify-page-templates.d.ts +33 -0
  556. package/lib/template-classification/classify-page-templates.js +60 -0
  557. package/lib/template-classification/collect-page-ids-with-html.d.ts +24 -0
  558. package/lib/template-classification/collect-page-ids-with-html.js +30 -0
  559. package/lib/template-classification/collect-page-stylesheet-urls.d.ts +32 -0
  560. package/lib/template-classification/collect-page-stylesheet-urls.js +130 -0
  561. package/lib/template-classification/create-content-root-hint.d.ts +41 -0
  562. package/lib/template-classification/create-content-root-hint.js +51 -0
  563. package/lib/template-classification/create-page-cluster-factory.d.ts +36 -0
  564. package/lib/template-classification/create-page-cluster-factory.js +52 -0
  565. package/lib/template-classification/load-page-cluster-candidates.d.ts +32 -0
  566. package/lib/template-classification/load-page-cluster-candidates.js +93 -0
  567. package/lib/template-classification/page-cluster/resolve-page-cluster-keys.d.ts +34 -0
  568. package/lib/template-classification/page-cluster/resolve-page-cluster-keys.js +236 -0
  569. package/lib/template-classification/page-cluster/types.d.ts +123 -0
  570. package/lib/template-classification/page-cluster/types.js +1 -0
  571. package/lib/template-classification/types.d.ts +234 -0
  572. package/lib/template-classification/types.js +1 -0
  573. package/lib/test-utils/build-full-schema-test-db.d.ts +34 -0
  574. package/lib/test-utils/build-full-schema-test-db.js +74 -0
  575. package/lib/test-utils/create-legacy-analysis-tables.d.ts +13 -0
  576. package/lib/test-utils/create-legacy-analysis-tables.js +37 -0
  577. package/lib/test-utils/fk-parent-tables.d.ts +15 -0
  578. package/lib/test-utils/fk-parent-tables.js +19 -0
  579. package/lib/test-utils/seed-content-item.d.ts +35 -0
  580. package/lib/test-utils/seed-content-item.js +42 -0
  581. package/lib/test-utils/setup-legacy-fk-db.d.ts +34 -0
  582. package/lib/test-utils/setup-legacy-fk-db.js +271 -0
  583. package/lib/transfer/attach-source-database.d.ts +31 -0
  584. package/lib/transfer/attach-source-database.js +40 -0
  585. package/lib/transfer/build-split-config.d.ts +30 -0
  586. package/lib/transfer/build-split-config.js +42 -0
  587. package/lib/transfer/clear-replaced-page-rows.d.ts +23 -0
  588. package/lib/transfer/clear-replaced-page-rows.js +61 -0
  589. package/lib/transfer/concat-archives.d.ts +55 -0
  590. package/lib/transfer/concat-archives.js +95 -0
  591. package/lib/transfer/concat-source-transfer-phases.d.ts +10 -0
  592. package/lib/transfer/concat-source-transfer-phases.js +17 -0
  593. package/lib/transfer/content-item-rank-sql.d.ts +21 -0
  594. package/lib/transfer/content-item-rank-sql.js +23 -0
  595. package/lib/transfer/copy-anchor-edges.d.ts +28 -0
  596. package/lib/transfer/copy-anchor-edges.js +42 -0
  597. package/lib/transfer/copy-dictionaries-for-concat.d.ts +39 -0
  598. package/lib/transfer/copy-dictionaries-for-concat.js +81 -0
  599. package/lib/transfer/copy-dictionaries-for-split.d.ts +29 -0
  600. package/lib/transfer/copy-dictionaries-for-split.js +224 -0
  601. package/lib/transfer/copy-header-set-children.d.ts +27 -0
  602. package/lib/transfer/copy-header-set-children.js +51 -0
  603. package/lib/transfer/copy-image-items.d.ts +21 -0
  604. package/lib/transfer/copy-image-items.js +62 -0
  605. package/lib/transfer/copy-inventory-source-lists.d.ts +30 -0
  606. package/lib/transfer/copy-inventory-source-lists.js +61 -0
  607. package/lib/transfer/copy-journal-tables.d.ts +30 -0
  608. package/lib/transfer/copy-journal-tables.js +56 -0
  609. package/lib/transfer/copy-page-console-logs.d.ts +16 -0
  610. package/lib/transfer/copy-page-console-logs.js +27 -0
  611. package/lib/transfer/copy-page-html-blobs.d.ts +31 -0
  612. package/lib/transfer/copy-page-html-blobs.js +43 -0
  613. package/lib/transfer/copy-page-meta.d.ts +27 -0
  614. package/lib/transfer/copy-page-meta.js +68 -0
  615. package/lib/transfer/copy-page-template-clusters.d.ts +31 -0
  616. package/lib/transfer/copy-page-template-clusters.js +56 -0
  617. package/lib/transfer/copy-page-template-labels.d.ts +34 -0
  618. package/lib/transfer/copy-page-template-labels.js +88 -0
  619. package/lib/transfer/copy-resource-items.d.ts +29 -0
  620. package/lib/transfer/copy-resource-items.js +89 -0
  621. package/lib/transfer/copy-resource-ref-edges.d.ts +20 -0
  622. package/lib/transfer/copy-resource-ref-edges.js +33 -0
  623. package/lib/transfer/copy-simple-page-scoped-tables.d.ts +15 -0
  624. package/lib/transfer/copy-simple-page-scoped-tables.js +34 -0
  625. package/lib/transfer/count-external-pages-in-scope.d.ts +26 -0
  626. package/lib/transfer/count-external-pages-in-scope.js +40 -0
  627. package/lib/transfer/create-transfer-temp-tables.d.ts +30 -0
  628. package/lib/transfer/create-transfer-temp-tables.js +59 -0
  629. package/lib/transfer/dictionary-copy-specs.d.ts +32 -0
  630. package/lib/transfer/dictionary-copy-specs.js +28 -0
  631. package/lib/transfer/drop-transfer-temp-tables.d.ts +9 -0
  632. package/lib/transfer/drop-transfer-temp-tables.js +18 -0
  633. package/lib/transfer/flatten-redirect-chains.d.ts +44 -0
  634. package/lib/transfer/flatten-redirect-chains.js +74 -0
  635. package/lib/transfer/insert-content-items.d.ts +35 -0
  636. package/lib/transfer/insert-content-items.js +116 -0
  637. package/lib/transfer/list-transfer-columns.d.ts +35 -0
  638. package/lib/transfer/list-transfer-columns.js +45 -0
  639. package/lib/transfer/mark-in-scope-content-items.d.ts +31 -0
  640. package/lib/transfer/mark-in-scope-content-items.js +54 -0
  641. package/lib/transfer/merge-archive-configs.d.ts +51 -0
  642. package/lib/transfer/merge-archive-configs.js +85 -0
  643. package/lib/transfer/plan-content-items-for-concat.d.ts +33 -0
  644. package/lib/transfer/plan-content-items-for-concat.js +51 -0
  645. package/lib/transfer/plan-content-items-for-split.d.ts +42 -0
  646. package/lib/transfer/plan-content-items-for-split.js +83 -0
  647. package/lib/transfer/plan-resource-items.d.ts +40 -0
  648. package/lib/transfer/plan-resource-items.js +69 -0
  649. package/lib/transfer/quote-transfer-identifier.d.ts +18 -0
  650. package/lib/transfer/quote-transfer-identifier.js +20 -0
  651. package/lib/transfer/reclassify-resource-externality.d.ts +37 -0
  652. package/lib/transfer/reclassify-resource-externality.js +66 -0
  653. package/lib/transfer/remap-redirect-dest-ids.d.ts +34 -0
  654. package/lib/transfer/remap-redirect-dest-ids.js +51 -0
  655. package/lib/transfer/replace-content-items.d.ts +39 -0
  656. package/lib/transfer/replace-content-items.js +83 -0
  657. package/lib/transfer/simple-page-scoped-tables.d.ts +25 -0
  658. package/lib/transfer/simple-page-scoped-tables.js +38 -0
  659. package/lib/transfer/split-archive.d.ts +55 -0
  660. package/lib/transfer/split-archive.js +98 -0
  661. package/lib/transfer/split-source-transfer-phases.d.ts +11 -0
  662. package/lib/transfer/split-source-transfer-phases.js +18 -0
  663. package/lib/transfer/transfer-action.d.ts +34 -0
  664. package/lib/transfer/transfer-action.js +32 -0
  665. package/lib/transfer/transfer-archive-rows.d.ts +65 -0
  666. package/lib/transfer/transfer-archive-rows.js +156 -0
  667. package/lib/transfer/transfer-dictionary-tables.d.ts +12 -0
  668. package/lib/transfer/transfer-dictionary-tables.js +22 -0
  669. package/lib/transfer/transfer-post-phases.d.ts +10 -0
  670. package/lib/transfer/transfer-post-phases.js +13 -0
  671. package/lib/transfer/transfer-source-alias.d.ts +9 -0
  672. package/lib/transfer/transfer-source-alias.js +9 -0
  673. package/lib/transfer/types.d.ts +111 -0
  674. package/lib/transfer/types.js +35 -0
  675. package/lib/types.d.ts +772 -0
  676. package/lib/types.js +1 -0
  677. package/lib/url-alias/compute-tier-a-alias-key.d.ts +44 -0
  678. package/lib/url-alias/compute-tier-a-alias-key.js +47 -0
  679. package/lib/url-alias/compute-tier-b-alias-key.d.ts +23 -0
  680. package/lib/url-alias/compute-tier-b-alias-key.js +26 -0
  681. package/lib/url-alias/group-alias-candidates.d.ts +27 -0
  682. package/lib/url-alias/group-alias-candidates.js +29 -0
  683. package/lib/url-alias/types.d.ts +12 -0
  684. package/lib/url-alias/types.js +1 -0
  685. package/lib/url-pattern/compute-shape-key.d.ts +58 -0
  686. package/lib/url-pattern/compute-shape-key.js +129 -0
  687. package/lib/url-pattern/decompose-url.d.ts +33 -0
  688. package/lib/url-pattern/decompose-url.js +79 -0
  689. package/lib/url-pattern/reconstruct-url.d.ts +15 -0
  690. package/lib/url-pattern/reconstruct-url.js +33 -0
  691. package/lib/url-sort/compute-url-sort-ranks.d.ts +30 -0
  692. package/lib/url-sort/compute-url-sort-ranks.js +33 -0
  693. package/lib/utils/array/each-splitted.d.ts +10 -0
  694. package/lib/utils/array/each-splitted.js +14 -0
  695. package/lib/utils/debug.d.ts +8 -0
  696. package/lib/utils/debug.js +8 -0
  697. package/lib/utils/error/emit-error-with-retry.d.ts +40 -0
  698. package/lib/utils/error/emit-error-with-retry.js +44 -0
  699. package/lib/utils/error/emit-error.d.ts +39 -0
  700. package/lib/utils/error/emit-error.js +41 -0
  701. package/lib/utils/object/parse-response-headers.d.ts +12 -0
  702. package/lib/utils/object/parse-response-headers.js +26 -0
  703. package/lib/utils/object/redact-request-headers.d.ts +15 -0
  704. package/lib/utils/object/redact-request-headers.js +27 -0
  705. package/lib/utils/types/types.d.ts +383 -0
  706. package/lib/utils/types/types.js +1 -0
  707. package/lib/verify-migration/capture-rejection.d.ts +24 -0
  708. package/lib/verify-migration/capture-rejection.js +31 -0
  709. package/lib/verify-migration/check-anchor-edges-count.d.ts +34 -0
  710. package/lib/verify-migration/check-anchor-edges-count.js +72 -0
  711. package/lib/verify-migration/check-anchor-edges-sum.d.ts +13 -0
  712. package/lib/verify-migration/check-anchor-edges-sum.js +27 -0
  713. package/lib/verify-migration/check-content-items-count.d.ts +16 -0
  714. package/lib/verify-migration/check-content-items-count.js +30 -0
  715. package/lib/verify-migration/check-content-type-preservation.d.ts +22 -0
  716. package/lib/verify-migration/check-content-type-preservation.js +40 -0
  717. package/lib/verify-migration/check-foreign-key-integrity.d.ts +31 -0
  718. package/lib/verify-migration/check-foreign-key-integrity.js +47 -0
  719. package/lib/verify-migration/check-image-items-count.d.ts +12 -0
  720. package/lib/verify-migration/check-image-items-count.js +26 -0
  721. package/lib/verify-migration/check-page-meta-count.d.ts +15 -0
  722. package/lib/verify-migration/check-page-meta-count.js +31 -0
  723. package/lib/verify-migration/check-reader-parity.d.ts +23 -0
  724. package/lib/verify-migration/check-reader-parity.js +182 -0
  725. package/lib/verify-migration/check-resource-items-count.d.ts +17 -0
  726. package/lib/verify-migration/check-resource-items-count.js +33 -0
  727. package/lib/verify-migration/check-url-round-trip.d.ts +43 -0
  728. package/lib/verify-migration/check-url-round-trip.js +112 -0
  729. package/lib/verify-migration/types.d.ts +70 -0
  730. package/lib/verify-migration/types.js +63 -0
  731. package/lib/verify-migration/verify-migration.d.ts +41 -0
  732. package/lib/verify-migration/verify-migration.js +120 -0
  733. package/lib/with-bulk-write-pragmas.d.ts +51 -0
  734. package/lib/with-bulk-write-pragmas.js +132 -0
  735. package/lib/write-queue.d.ts +32 -0
  736. package/lib/write-queue.js +55 -0
  737. package/package.json +360 -5
@@ -0,0 +1,27 @@
1
+ import type { WriteRefCaches } from './types.js';
2
+ /**
3
+ * Empties every map in a {@link WriteRefCaches} bundle in place.
4
+ *
5
+ * Called when a write transaction that used the caches rolls back. SQLite
6
+ * `ROLLBACK` undoes every row the transaction inserted, but `AUTOINCREMENT`
7
+ * counters never rewind — so an id cached optimistically during the failed
8
+ * attempt would survive the rollback and no longer correspond to any row.
9
+ * A retried attempt reusing that id would issue `UPDATE ... WHERE id = ?`
10
+ * against a nonexistent row and silently affect zero rows instead of
11
+ * failing loudly.
12
+ *
13
+ * A full clear (rather than tracking which entries the failed transaction
14
+ * touched) is the simplest correct fix: transient write failures are rare
15
+ * (retry exists precisely because they are), so paying a one-time
16
+ * DB-again warm-up after a rollback is cheap next to the correctness risk
17
+ * of a partially-poisoned cache.
18
+ * @param caches - The cache bundle to clear.
19
+ * @example
20
+ * try {
21
+ * await knex.transaction(async (trx) => { ... });
22
+ * } catch (error) {
23
+ * clearWriteRefCaches(caches);
24
+ * throw error;
25
+ * }
26
+ */
27
+ export declare function clearWriteRefCaches(caches: WriteRefCaches): void;
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Empties every map in a {@link WriteRefCaches} bundle in place.
3
+ *
4
+ * Called when a write transaction that used the caches rolls back. SQLite
5
+ * `ROLLBACK` undoes every row the transaction inserted, but `AUTOINCREMENT`
6
+ * counters never rewind — so an id cached optimistically during the failed
7
+ * attempt would survive the rollback and no longer correspond to any row.
8
+ * A retried attempt reusing that id would issue `UPDATE ... WHERE id = ?`
9
+ * against a nonexistent row and silently affect zero rows instead of
10
+ * failing loudly.
11
+ *
12
+ * A full clear (rather than tracking which entries the failed transaction
13
+ * touched) is the simplest correct fix: transient write failures are rare
14
+ * (retry exists precisely because they are), so paying a one-time
15
+ * DB-again warm-up after a rollback is cheap next to the correctness risk
16
+ * of a partially-poisoned cache.
17
+ * @param caches - The cache bundle to clear.
18
+ * @example
19
+ * try {
20
+ * await knex.transaction(async (trx) => { ... });
21
+ * } catch (error) {
22
+ * clearWriteRefCaches(caches);
23
+ * throw error;
24
+ * }
25
+ */
26
+ export function clearWriteRefCaches(caches) {
27
+ caches.urlIds.clear();
28
+ caches.contentItems.clear();
29
+ caches.resourceIds.clear();
30
+ caches.contentTypeIds.clear();
31
+ caches.jsonIds.clear();
32
+ caches.blobIds.clear();
33
+ caches.consoleLogIds.clear();
34
+ caches.headers = null;
35
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Compresses raw bytes for storage in a `codec`/`size_raw`/`size_stored`
3
+ * BLOB column, matching the read side of
4
+ * {@link import('./decode-json-ref.js').decodeJsonRef} and
5
+ * {@link import('../../decode-html-blob.js').decodeStoredBlob}.
6
+ *
7
+ * The one shared primitive behind every `codec: 'zstd'` writer in the
8
+ * archive (`upsert-json-ref.ts`, `write-page-html-blob.ts`,
9
+ * `replace-page-templates.ts`) — a codec change (e.g. a brotli fallback, a
10
+ * different zstd level) only has to happen here. Callers that also need a
11
+ * content hash (`upsert-json-ref.ts`, `write-page-html-blob.ts`) compute it
12
+ * themselves from the same `rawBytes` they pass in here, rather than this
13
+ * function computing one not every caller needs.
14
+ * @param rawBytes - The raw (uncompressed) payload bytes.
15
+ * @returns The compressed body alongside the codec and size bookkeeping the
16
+ * BLOB column's schema expects.
17
+ * @example
18
+ * const rawBytes = Buffer.from(JSON.stringify(reason), 'utf8');
19
+ * const { body, codec, sizeRaw, sizeStored } = compressPayload(rawBytes);
20
+ */
21
+ export declare function compressPayload(rawBytes: Buffer): {
22
+ readonly body: Buffer;
23
+ readonly codec: 'zstd';
24
+ readonly sizeRaw: number;
25
+ readonly sizeStored: number;
26
+ };
@@ -0,0 +1,30 @@
1
+ import { zstdCompressSync } from 'node:zlib';
2
+ /**
3
+ * Compresses raw bytes for storage in a `codec`/`size_raw`/`size_stored`
4
+ * BLOB column, matching the read side of
5
+ * {@link import('./decode-json-ref.js').decodeJsonRef} and
6
+ * {@link import('../../decode-html-blob.js').decodeStoredBlob}.
7
+ *
8
+ * The one shared primitive behind every `codec: 'zstd'` writer in the
9
+ * archive (`upsert-json-ref.ts`, `write-page-html-blob.ts`,
10
+ * `replace-page-templates.ts`) — a codec change (e.g. a brotli fallback, a
11
+ * different zstd level) only has to happen here. Callers that also need a
12
+ * content hash (`upsert-json-ref.ts`, `write-page-html-blob.ts`) compute it
13
+ * themselves from the same `rawBytes` they pass in here, rather than this
14
+ * function computing one not every caller needs.
15
+ * @param rawBytes - The raw (uncompressed) payload bytes.
16
+ * @returns The compressed body alongside the codec and size bookkeeping the
17
+ * BLOB column's schema expects.
18
+ * @example
19
+ * const rawBytes = Buffer.from(JSON.stringify(reason), 'utf8');
20
+ * const { body, codec, sizeRaw, sizeStored } = compressPayload(rawBytes);
21
+ */
22
+ export function compressPayload(rawBytes) {
23
+ const compressed = zstdCompressSync(rawBytes);
24
+ return {
25
+ body: compressed,
26
+ codec: 'zstd',
27
+ sizeRaw: rawBytes.byteLength,
28
+ sizeStored: compressed.byteLength,
29
+ };
30
+ }
@@ -0,0 +1,17 @@
1
+ import type { WriteRefCaches } from './types.js';
2
+ /**
3
+ * Creates an empty {@link WriteRefCaches} bundle for one archive writer
4
+ * connection.
5
+ *
6
+ * All maps start empty and fill lazily as the write path touches URLs,
7
+ * content types, JSON payloads, and data-URI blobs. The header caches
8
+ * (`headers`) start as `null` and are warmed from the DB by the first
9
+ * header-set upsert — see {@link ./types.ts} for the cache-correctness
10
+ * argument (append-only ref tables + single writer connection).
11
+ * @returns A fresh cache bundle. One per `Database` instance; never share
12
+ * across connections.
13
+ * @example
14
+ * const caches = createWriteRefCaches();
15
+ * const urlId = await upsertUrlRef(knex, caches, 'https://example.com/');
16
+ */
17
+ export declare function createWriteRefCaches(): WriteRefCaches;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Creates an empty {@link WriteRefCaches} bundle for one archive writer
3
+ * connection.
4
+ *
5
+ * All maps start empty and fill lazily as the write path touches URLs,
6
+ * content types, JSON payloads, and data-URI blobs. The header caches
7
+ * (`headers`) start as `null` and are warmed from the DB by the first
8
+ * header-set upsert — see {@link ./types.ts} for the cache-correctness
9
+ * argument (append-only ref tables + single writer connection).
10
+ * @returns A fresh cache bundle. One per `Database` instance; never share
11
+ * across connections.
12
+ * @example
13
+ * const caches = createWriteRefCaches();
14
+ * const urlId = await upsertUrlRef(knex, caches, 'https://example.com/');
15
+ */
16
+ export function createWriteRefCaches() {
17
+ return {
18
+ urlIds: new Map(),
19
+ contentItems: new Map(),
20
+ resourceIds: new Map(),
21
+ contentTypeIds: new Map(),
22
+ jsonIds: new Map(),
23
+ blobIds: new Map(),
24
+ consoleLogIds: new Map(),
25
+ headers: null,
26
+ };
27
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Decodes one `json_refs` payload back into its JSON string.
3
+ *
4
+ * The write path (`upsert-json-ref.ts`) and the archive-migration
5
+ * populate (`populate-json-refs.ts`) both store bodies zstd-compressed;
6
+ * the `'none'` codec is accepted because the `json_refs.codec` column
7
+ * permits it, not because either writer currently produces it. Corrupt
8
+ * bodies fail closed to `null` rather than throwing — readers treat an
9
+ * undecodable payload the same as an absent one.
10
+ * @param body - The raw `json_refs.json_text` body, or null when absent.
11
+ * @param codec - The `json_refs.codec` value, or null when absent.
12
+ * @returns The decoded JSON string, or null when there is no body or the
13
+ * body cannot be decoded.
14
+ * @example
15
+ * const metaExtras = decodeJsonRef(row.extras_body, row.extras_codec);
16
+ */
17
+ export declare function decodeJsonRef(body: Buffer | string | null, codec: 'zstd' | 'none' | null): string | null;
@@ -0,0 +1,31 @@
1
+ import { zstdDecompressSync } from 'node:zlib';
2
+ /**
3
+ * Decodes one `json_refs` payload back into its JSON string.
4
+ *
5
+ * The write path (`upsert-json-ref.ts`) and the archive-migration
6
+ * populate (`populate-json-refs.ts`) both store bodies zstd-compressed;
7
+ * the `'none'` codec is accepted because the `json_refs.codec` column
8
+ * permits it, not because either writer currently produces it. Corrupt
9
+ * bodies fail closed to `null` rather than throwing — readers treat an
10
+ * undecodable payload the same as an absent one.
11
+ * @param body - The raw `json_refs.json_text` body, or null when absent.
12
+ * @param codec - The `json_refs.codec` value, or null when absent.
13
+ * @returns The decoded JSON string, or null when there is no body or the
14
+ * body cannot be decoded.
15
+ * @example
16
+ * const metaExtras = decodeJsonRef(row.extras_body, row.extras_codec);
17
+ */
18
+ export function decodeJsonRef(body, codec) {
19
+ if (body == null) {
20
+ return null;
21
+ }
22
+ try {
23
+ if (codec === 'zstd') {
24
+ return zstdDecompressSync(body).toString('utf8');
25
+ }
26
+ return typeof body === 'string' ? body : body.toString('utf8');
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
@@ -0,0 +1,49 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Reads every row a caller-supplied query matches, in ascending-`id`
4
+ * keyset-paginated chunks rather than one unbounded SELECT (issue #294): on
5
+ * a large archive, a single multi-second-to-minutes scan gives the caller
6
+ * no way to report progress mid-read. The accumulated result is identical
7
+ * to a single un-chunked SELECT — chunking exists purely to make the scan
8
+ * observable, not to bound memory (the mapped output is already fully
9
+ * materialised for the caller either way).
10
+ *
11
+ * Extracted from `getResourceUrlList` / `listDedupeCapObservations`, which
12
+ * had grown byte-for-byte identical pagination boilerplate (the `MAX(id)`
13
+ * probe, the `for (;;)` chunk loop, the `onProgress` shape) around two
14
+ * otherwise-unrelated queries. Callers own everything query-shaped
15
+ * (joins, `WHERE`, `SELECT`, chunk size via `.limit()` inside
16
+ * `buildQuery`) — this helper only owns the keyset-chunking mechanics
17
+ * common to both.
18
+ * @param knex - Knex query builder connected to the archive DB.
19
+ * @param idTable - The table `id` keys off, used for the O(1) `MAX(id)`
20
+ * probe that seeds `onProgress`'s total (only queried when `onProgress`
21
+ * is given).
22
+ * @param buildQuery - Builds one chunk's query given the last-seen `id`
23
+ * (`0` on the first call). Must filter on `id > lastId`, order by `id`
24
+ * ascending, and cap the row count (typically via `.limit()`) — this
25
+ * helper does not add any of those clauses itself. The resolved rows
26
+ * must each carry an `id` field so the next chunk's cursor can advance.
27
+ * @param mapRow - Transforms one raw row into the caller's output shape.
28
+ * @param onProgress - Called after each chunk, with the highest `id`
29
+ * scanned so far and the max `id` in `idTable`. Omit for no reporting.
30
+ * @returns Every matched row, mapped via `mapRow`, in `id` order.
31
+ * @example
32
+ * ```ts
33
+ * const urls = await keysetPaginateById(
34
+ * knex,
35
+ * 'resource_items',
36
+ * (lastId) =>
37
+ * knex('resource_items')
38
+ * .join('url_refs', 'url_refs.id', 'resource_items.url_id')
39
+ * .where('resource_items.id', '>', lastId)
40
+ * .orderBy('resource_items.id', 'asc')
41
+ * .limit(2000)
42
+ * .select('resource_items.id as id', 'url_refs.url as url'),
43
+ * (row) => row.url,
44
+ * );
45
+ * ```
46
+ */
47
+ export declare function keysetPaginateById<Row extends {
48
+ id: number;
49
+ }, Out>(knex: Knex, idTable: string, buildQuery: (lastId: number) => Knex.QueryBuilder, mapRow: (row: Row) => Out, onProgress?: (scannedUpToId: number, maxId: number) => void): Promise<Out[]>;
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Reads every row a caller-supplied query matches, in ascending-`id`
3
+ * keyset-paginated chunks rather than one unbounded SELECT (issue #294): on
4
+ * a large archive, a single multi-second-to-minutes scan gives the caller
5
+ * no way to report progress mid-read. The accumulated result is identical
6
+ * to a single un-chunked SELECT — chunking exists purely to make the scan
7
+ * observable, not to bound memory (the mapped output is already fully
8
+ * materialised for the caller either way).
9
+ *
10
+ * Extracted from `getResourceUrlList` / `listDedupeCapObservations`, which
11
+ * had grown byte-for-byte identical pagination boilerplate (the `MAX(id)`
12
+ * probe, the `for (;;)` chunk loop, the `onProgress` shape) around two
13
+ * otherwise-unrelated queries. Callers own everything query-shaped
14
+ * (joins, `WHERE`, `SELECT`, chunk size via `.limit()` inside
15
+ * `buildQuery`) — this helper only owns the keyset-chunking mechanics
16
+ * common to both.
17
+ * @param knex - Knex query builder connected to the archive DB.
18
+ * @param idTable - The table `id` keys off, used for the O(1) `MAX(id)`
19
+ * probe that seeds `onProgress`'s total (only queried when `onProgress`
20
+ * is given).
21
+ * @param buildQuery - Builds one chunk's query given the last-seen `id`
22
+ * (`0` on the first call). Must filter on `id > lastId`, order by `id`
23
+ * ascending, and cap the row count (typically via `.limit()`) — this
24
+ * helper does not add any of those clauses itself. The resolved rows
25
+ * must each carry an `id` field so the next chunk's cursor can advance.
26
+ * @param mapRow - Transforms one raw row into the caller's output shape.
27
+ * @param onProgress - Called after each chunk, with the highest `id`
28
+ * scanned so far and the max `id` in `idTable`. Omit for no reporting.
29
+ * @returns Every matched row, mapped via `mapRow`, in `id` order.
30
+ * @example
31
+ * ```ts
32
+ * const urls = await keysetPaginateById(
33
+ * knex,
34
+ * 'resource_items',
35
+ * (lastId) =>
36
+ * knex('resource_items')
37
+ * .join('url_refs', 'url_refs.id', 'resource_items.url_id')
38
+ * .where('resource_items.id', '>', lastId)
39
+ * .orderBy('resource_items.id', 'asc')
40
+ * .limit(2000)
41
+ * .select('resource_items.id as id', 'url_refs.url as url'),
42
+ * (row) => row.url,
43
+ * );
44
+ * ```
45
+ */
46
+ export async function keysetPaginateById(knex, idTable, buildQuery, mapRow, onProgress) {
47
+ // MAX() over the keyset column is an O(1) index-tail read; only fetched
48
+ // when someone is listening.
49
+ let maxId = 0;
50
+ if (onProgress) {
51
+ const [maxRow] = await knex(idTable).max({ max: 'id' });
52
+ maxId = maxRow?.max ?? 0;
53
+ }
54
+ const results = [];
55
+ let lastId = 0;
56
+ for (;;) {
57
+ const rows = (await buildQuery(lastId));
58
+ if (rows.length === 0) {
59
+ onProgress?.(maxId, maxId);
60
+ break;
61
+ }
62
+ lastId = rows.at(-1).id;
63
+ for (const row of rows) {
64
+ results.push(mapRow(row));
65
+ }
66
+ onProgress?.(Math.min(lastId, maxId), maxId);
67
+ }
68
+ return results;
69
+ }
@@ -0,0 +1,20 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Loads and merges the response headers for every given `header_sets.id`
4
+ * back into flat `Record<name, value>` objects, in one chunked batch
5
+ * (never one query per row).
6
+ *
7
+ * Multi-value headers (repeated `Set-Cookie` etc.) are joined with
8
+ * `', '` in `occurrence` order within each name — the flat-record shape
9
+ * the pre-0.13 `responseHeaders` JSON column stored, which every reader
10
+ * of the reconstructed rows still expects.
11
+ * @param knex - Knex query builder connected to the archive DB.
12
+ * @param headerSetIds - Distinct `header_sets.id` values to load. Empty
13
+ * input returns an empty map without touching the DB.
14
+ * @returns Map from `header_sets.id` to the merged header record. Ids
15
+ * with no entries are absent from the map.
16
+ * @example
17
+ * const headersBySetId = await loadResponseHeadersBySetIds(knex, [1, 2]);
18
+ * const record = headersBySetId.get(1) ?? {};
19
+ */
20
+ export declare function loadResponseHeadersBySetIds(knex: Knex, headerSetIds: readonly number[]): Promise<Map<number, Record<string, string>>>;
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Ids per `WHERE header_set_id IN (?, ...)` chunk. Modern SQLite builds
3
+ * (including the vendored libsql) reject statements binding more than
4
+ * 32,766 parameters, and header sets dedupe poorly on real sites (Date /
5
+ * ETag / Set-Cookie make most sets unique), so an IN-list sized by the
6
+ * page batch without chunking would exceed the limit on large archives.
7
+ * 800 matches
8
+ * the `LOOKUP_CHUNK_SIZE` convention the populate/upsert paths already
9
+ * use (`resolve-text-refs.ts` and siblings).
10
+ */
11
+ const LOOKUP_CHUNK_SIZE = 800;
12
+ /**
13
+ * Loads and merges the response headers for every given `header_sets.id`
14
+ * back into flat `Record<name, value>` objects, in one chunked batch
15
+ * (never one query per row).
16
+ *
17
+ * Multi-value headers (repeated `Set-Cookie` etc.) are joined with
18
+ * `', '` in `occurrence` order within each name — the flat-record shape
19
+ * the pre-0.13 `responseHeaders` JSON column stored, which every reader
20
+ * of the reconstructed rows still expects.
21
+ * @param knex - Knex query builder connected to the archive DB.
22
+ * @param headerSetIds - Distinct `header_sets.id` values to load. Empty
23
+ * input returns an empty map without touching the DB.
24
+ * @returns Map from `header_sets.id` to the merged header record. Ids
25
+ * with no entries are absent from the map.
26
+ * @example
27
+ * const headersBySetId = await loadResponseHeadersBySetIds(knex, [1, 2]);
28
+ * const record = headersBySetId.get(1) ?? {};
29
+ */
30
+ export async function loadResponseHeadersBySetIds(knex, headerSetIds) {
31
+ const merged = new Map();
32
+ for (let index = 0; index < headerSetIds.length; index += LOOKUP_CHUNK_SIZE) {
33
+ const chunk = headerSetIds.slice(index, index + LOOKUP_CHUNK_SIZE);
34
+ const headerRows = (await knex('header_set_entries as hse')
35
+ .join('header_name_refs as hnr', 'hnr.id', 'hse.name_id')
36
+ .join('header_value_refs as hvr', 'hvr.id', 'hse.value_id')
37
+ .whereIn('hse.header_set_id', chunk)
38
+ .orderBy(['hse.header_set_id', 'hnr.name', 'hse.occurrence'])
39
+ .select('hse.header_set_id as headerSetId', 'hnr.name as name', 'hvr.value as value'));
40
+ for (const row of headerRows) {
41
+ const bySet = merged.get(row.headerSetId) ?? new Map();
42
+ const values = bySet.get(row.name) ?? [];
43
+ values.push(row.value);
44
+ bySet.set(row.name, values);
45
+ merged.set(row.headerSetId, bySet);
46
+ }
47
+ }
48
+ const result = new Map();
49
+ for (const [setId, bySet] of merged) {
50
+ result.set(setId, Object.fromEntries([...bySet.entries()].map(([k, v]) => [k, v.join(', ')])));
51
+ }
52
+ return result;
53
+ }
@@ -0,0 +1,62 @@
1
+ import type { ResolveContentItemIdOptions, WriteRefCaches } from './types.js';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Returns the `content_items.id` for `url`, inserting a placeholder row
5
+ * (via `url_refs`) when the URL is not yet known. Foundational identity
6
+ * primitive shared by every op that needs to record an edge or lookup to
7
+ * a URL — the `content_items` successor of the legacy `pages.id`
8
+ * resolver.
9
+ *
10
+ * **Source semantics.** `source` is written ONLY on the INSERT path —
11
+ * when the row already exists, the INSERT is never reached and the
12
+ * existing row's `source` stays untouched. This is what keeps a second
13
+ * `crawl --inventory` from "demoting" a page that was first labelled
14
+ * `'inventory-seed'` back to `'inventory-discovered'` on later passes.
15
+ *
16
+ * **Crawled-wins downgrade.** When a row that was previously labelled
17
+ * `'inventory-seed'` or `'inventory-discovered'` is re-encountered via a
18
+ * `'crawled'`-lineage anchor (the parent page is part of the graph
19
+ * reachable from the original crawl roots), the row is downgraded to
20
+ * `'crawled'`. The inventory goal is finding orphans — anything reachable
21
+ * from the crawled chain is NOT an orphan and should not retain an
22
+ * inventory label. The cached `source` is updated in the same step so a
23
+ * later hit does not re-issue the UPDATE.
24
+ *
25
+ * **`is_metadata_only` promotion** (issue #369) is evaluated in the same
26
+ * pass as the crawled-wins downgrade, and both diffs are folded into a
27
+ * single `UPDATE` statement (not two) when either column actually
28
+ * changes — see {@link applyExistingRowUpdates}.
29
+ *
30
+ * **Cache poisoning on rollback.** Entries cached inside a transaction
31
+ * that later rolls back would point at ids that no longer exist. Every
32
+ * write op that opens a multi-statement transaction around this function
33
+ * must discard the whole cache bundle when that transaction fails,
34
+ * before any retry — see the try/catch + `clearWriteRefCaches` wrappers
35
+ * in `update-page.ts` and `record-redirect.ts`.
36
+ *
37
+ * **Race-condition safety.** The INSERT uses `ON CONFLICT(url_id) DO
38
+ * UPDATE SET url_id = url_id RETURNING id, source` — the same no-op
39
+ * -update idiom as `upsertUrlRef` — so when a concurrent transaction
40
+ * wins the insert race, the statement still returns the existing row's
41
+ * id and source in one round trip. `onConflict().ignore()` without
42
+ * `RETURNING` must NOT be used here: knex's sqlite-family dialects
43
+ * report the connection's stale `lastInsertRowid` for a conflict-ignored
44
+ * insert, which reads as a valid id belonging to an unrelated row.
45
+ * @param qb - Knex instance OR a transaction, used verbatim for every
46
+ * statement this function issues. Pass the `trx` when running inside a
47
+ * transaction so reads see uncommitted writes from that transaction.
48
+ * @param caches - The connection's write-side id caches; mutated in place.
49
+ * @param url - The URL to look up or insert (normalised
50
+ * `withoutHashAndAuth` form, matching the legacy identity contract).
51
+ * @param options - See {@link ResolveContentItemIdOptions}.
52
+ * @returns The `content_items.id` of the existing or newly inserted row.
53
+ * @throws {Error} When the upsert's `RETURNING` yields no row — should
54
+ * not happen, so it surfaces as a hard error.
55
+ * @example
56
+ * const pageId = await resolveContentItemId(trx, caches, anchor.href, {
57
+ * isExternal: 1,
58
+ * source: 'crawled',
59
+ * isMetadataOnly: 1,
60
+ * });
61
+ */
62
+ export declare function resolveContentItemId(qb: Knex | Knex.Transaction, caches: WriteRefCaches, url: string, options?: ResolveContentItemIdOptions): Promise<number>;
@@ -0,0 +1,143 @@
1
+ import { upsertUrlRef } from './upsert-url-ref.js';
2
+ /**
3
+ * Returns the `content_items.id` for `url`, inserting a placeholder row
4
+ * (via `url_refs`) when the URL is not yet known. Foundational identity
5
+ * primitive shared by every op that needs to record an edge or lookup to
6
+ * a URL — the `content_items` successor of the legacy `pages.id`
7
+ * resolver.
8
+ *
9
+ * **Source semantics.** `source` is written ONLY on the INSERT path —
10
+ * when the row already exists, the INSERT is never reached and the
11
+ * existing row's `source` stays untouched. This is what keeps a second
12
+ * `crawl --inventory` from "demoting" a page that was first labelled
13
+ * `'inventory-seed'` back to `'inventory-discovered'` on later passes.
14
+ *
15
+ * **Crawled-wins downgrade.** When a row that was previously labelled
16
+ * `'inventory-seed'` or `'inventory-discovered'` is re-encountered via a
17
+ * `'crawled'`-lineage anchor (the parent page is part of the graph
18
+ * reachable from the original crawl roots), the row is downgraded to
19
+ * `'crawled'`. The inventory goal is finding orphans — anything reachable
20
+ * from the crawled chain is NOT an orphan and should not retain an
21
+ * inventory label. The cached `source` is updated in the same step so a
22
+ * later hit does not re-issue the UPDATE.
23
+ *
24
+ * **`is_metadata_only` promotion** (issue #369) is evaluated in the same
25
+ * pass as the crawled-wins downgrade, and both diffs are folded into a
26
+ * single `UPDATE` statement (not two) when either column actually
27
+ * changes — see {@link applyExistingRowUpdates}.
28
+ *
29
+ * **Cache poisoning on rollback.** Entries cached inside a transaction
30
+ * that later rolls back would point at ids that no longer exist. Every
31
+ * write op that opens a multi-statement transaction around this function
32
+ * must discard the whole cache bundle when that transaction fails,
33
+ * before any retry — see the try/catch + `clearWriteRefCaches` wrappers
34
+ * in `update-page.ts` and `record-redirect.ts`.
35
+ *
36
+ * **Race-condition safety.** The INSERT uses `ON CONFLICT(url_id) DO
37
+ * UPDATE SET url_id = url_id RETURNING id, source` — the same no-op
38
+ * -update idiom as `upsertUrlRef` — so when a concurrent transaction
39
+ * wins the insert race, the statement still returns the existing row's
40
+ * id and source in one round trip. `onConflict().ignore()` without
41
+ * `RETURNING` must NOT be used here: knex's sqlite-family dialects
42
+ * report the connection's stale `lastInsertRowid` for a conflict-ignored
43
+ * insert, which reads as a valid id belonging to an unrelated row.
44
+ * @param qb - Knex instance OR a transaction, used verbatim for every
45
+ * statement this function issues. Pass the `trx` when running inside a
46
+ * transaction so reads see uncommitted writes from that transaction.
47
+ * @param caches - The connection's write-side id caches; mutated in place.
48
+ * @param url - The URL to look up or insert (normalised
49
+ * `withoutHashAndAuth` form, matching the legacy identity contract).
50
+ * @param options - See {@link ResolveContentItemIdOptions}.
51
+ * @returns The `content_items.id` of the existing or newly inserted row.
52
+ * @throws {Error} When the upsert's `RETURNING` yields no row — should
53
+ * not happen, so it surfaces as a hard error.
54
+ * @example
55
+ * const pageId = await resolveContentItemId(trx, caches, anchor.href, {
56
+ * isExternal: 1,
57
+ * source: 'crawled',
58
+ * isMetadataOnly: 1,
59
+ * });
60
+ */
61
+ export async function resolveContentItemId(qb, caches, url, options) {
62
+ const { isExternal, source, isMetadataOnly } = options ?? {};
63
+ const cached = caches.contentItems.get(url);
64
+ if (cached !== undefined) {
65
+ await applyExistingRowUpdates(qb, cached, source, isMetadataOnly);
66
+ return cached.id;
67
+ }
68
+ const urlId = await upsertUrlRef(qb, caches, url);
69
+ const [record] = (await qb
70
+ .select('id', 'source', 'is_metadata_only')
71
+ .from('content_items')
72
+ .where('url_id', urlId));
73
+ if (record !== undefined) {
74
+ const entry = {
75
+ id: record.id,
76
+ source: record.source,
77
+ isMetadataOnly: record.is_metadata_only,
78
+ };
79
+ await applyExistingRowUpdates(qb, entry, source, isMetadataOnly);
80
+ caches.contentItems.set(url, entry);
81
+ return entry.id;
82
+ }
83
+ const insertedRows = await qb.raw(`INSERT INTO content_items (url_id, scraped, is_target, is_external, is_metadata_only${source === undefined ? '' : ', source'})
84
+ VALUES (?, 0, 0, ?, ?${source === undefined ? '' : ', ?'})
85
+ ON CONFLICT(url_id) DO UPDATE SET url_id = url_id
86
+ RETURNING id, source, is_metadata_only`, source === undefined
87
+ ? [urlId, isExternal ?? 0, isMetadataOnly ?? 0]
88
+ : [urlId, isExternal ?? 0, isMetadataOnly ?? 0, source]);
89
+ const inserted = insertedRows[0];
90
+ if (inserted === undefined) {
91
+ throw new Error(`Failed to insert a new content item: ${url}`);
92
+ }
93
+ const insertedEntry = {
94
+ id: inserted.id,
95
+ source: inserted.source,
96
+ isMetadataOnly: inserted.is_metadata_only,
97
+ };
98
+ // A conflict means a concurrent writer created the row between this
99
+ // function's SELECT miss and the INSERT — the returned `source` /
100
+ // `is_metadata_only` are that row's values, so both follow-ups must be
101
+ // evaluated exactly as on the SELECT-hit path.
102
+ await applyExistingRowUpdates(qb, insertedEntry, source, isMetadataOnly);
103
+ caches.contentItems.set(url, insertedEntry);
104
+ return insertedEntry.id;
105
+ }
106
+ /**
107
+ * Applies both the crawled-wins `source` downgrade and the `is_metadata_only`
108
+ * promotion (issue #369) to an already-resolved row in a single `UPDATE`,
109
+ * and keeps the cache entry in sync so a repeat call with the same values
110
+ * does not re-issue any write.
111
+ *
112
+ * Folded into one function (and one statement) rather than two independent
113
+ * ones: `resolveContentItemId` runs once per anchor on every scraped page
114
+ * across a whole crawl, so a page whose anchors trip both conditions would
115
+ * otherwise pay two round trips instead of one.
116
+ * @param qb - Knex instance or transaction.
117
+ * @param entry - The cached identity to check and mutate.
118
+ * @param source - The resolution's lineage label, if any — see
119
+ * {@link ResolveContentItemIdOptions.source}.
120
+ * @param isMetadataOnly - The resolution's explicit scrape-depth opinion, if
121
+ * any — see {@link ResolveContentItemIdOptions.isMetadataOnly}. Omitted by
122
+ * every caller except `replaceAnchorEdges`, which always has an opinion,
123
+ * so this is a no-op for the rest.
124
+ */
125
+ async function applyExistingRowUpdates(qb, entry, source, isMetadataOnly) {
126
+ const updates = {};
127
+ if (source === 'crawled' && entry.source !== 'crawled') {
128
+ updates.source = 'crawled';
129
+ }
130
+ if (isMetadataOnly !== undefined && entry.isMetadataOnly !== isMetadataOnly) {
131
+ updates.is_metadata_only = isMetadataOnly;
132
+ }
133
+ if (Object.keys(updates).length === 0) {
134
+ return;
135
+ }
136
+ await qb('content_items').where('id', entry.id).update(updates);
137
+ if (updates.source !== undefined) {
138
+ entry.source = updates.source;
139
+ }
140
+ if (updates.is_metadata_only !== undefined) {
141
+ entry.isMetadataOnly = updates.is_metadata_only;
142
+ }
143
+ }
@@ -0,0 +1,23 @@
1
+ import type { WriteRefCaches } from './types.js';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Routes one URL-shaped value to either `url_refs` or `blob_refs` per the
5
+ * data-URI threshold rule (large data URIs live in `blob_refs`, everything
6
+ * else in `url_refs`), upserting into whichever dictionary applies.
7
+ *
8
+ * Shared by every writer that can receive a `data:` URI in a URL-shaped
9
+ * column: `image_items.src` / `current_src` and `resource_items`' own
10
+ * identity URL. At most one of `url` / `blob` is non-null; both are `null`
11
+ * when the value is empty or a malformed data URI that fails to decode.
12
+ * @param qb - Knex instance or transaction connected to the archive DB.
13
+ * @param caches - The connection's write-side id caches.
14
+ * @param value - Raw URL-shaped value.
15
+ * @returns `{ url, blob }` pair with at most one non-null field.
16
+ * @example
17
+ * const slot = await resolveUrlOrBlob(trx, caches, image.src);
18
+ * // slot.url set for a regular URL, slot.blob set for a large data: URI.
19
+ */
20
+ export declare function resolveUrlOrBlob(qb: Knex | Knex.Transaction, caches: WriteRefCaches, value: string | null | undefined): Promise<{
21
+ url: number | null;
22
+ blob: number | null;
23
+ }>;