@nitpicker/archive 0.0.0 → 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 +106 -0
  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 +350 -3
@@ -0,0 +1,18 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Adds `rejectedCount` onto the `rejected_count` of the `dedupe_cap_events`
4
+ * row for `shapeKey`, treating a still-`NULL` count as `0`. Unlike
5
+ * `finalize-dedupe-cap-event.ts` (which stamps a session's own newly-capped
6
+ * shape exactly once, guarded by `whereNull`), this targets a shape that
7
+ * capped in an EARLIER session and was preloaded into `DedupeCapTracker`'s
8
+ * sticky set (see `DedupeCapTracker`'s constructor JSDoc) — gate rejections
9
+ * for such a shape still occur in the current session, but no `dedupeCap`
10
+ * event (and thus no new row) is ever emitted for it, since the tracker
11
+ * short-circuits on an already-sticky shape before `observe` runs. Matches
12
+ * by `shape_key` rather than `id` because the caller (`CrawlerOrchestrator`)
13
+ * only has the shape key for a preloaded-sticky shape, never its row id.
14
+ * @param knex - Knex query builder connected to the archive DB.
15
+ * @param shapeKey - The capped shape whose rejection count to accumulate.
16
+ * @param rejectedCount - Additional anchors rejected for this shape in the current session.
17
+ */
18
+ export declare function accumulateDedupeCapRejectedCount(knex: Knex, shapeKey: string, rejectedCount: number): Promise<void>;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Adds `rejectedCount` onto the `rejected_count` of the `dedupe_cap_events`
3
+ * row for `shapeKey`, treating a still-`NULL` count as `0`. Unlike
4
+ * `finalize-dedupe-cap-event.ts` (which stamps a session's own newly-capped
5
+ * shape exactly once, guarded by `whereNull`), this targets a shape that
6
+ * capped in an EARLIER session and was preloaded into `DedupeCapTracker`'s
7
+ * sticky set (see `DedupeCapTracker`'s constructor JSDoc) — gate rejections
8
+ * for such a shape still occur in the current session, but no `dedupeCap`
9
+ * event (and thus no new row) is ever emitted for it, since the tracker
10
+ * short-circuits on an already-sticky shape before `observe` runs. Matches
11
+ * by `shape_key` rather than `id` because the caller (`CrawlerOrchestrator`)
12
+ * only has the shape key for a preloaded-sticky shape, never its row id.
13
+ * @param knex - Knex query builder connected to the archive DB.
14
+ * @param shapeKey - The capped shape whose rejection count to accumulate.
15
+ * @param rejectedCount - Additional anchors rejected for this shape in the current session.
16
+ */
17
+ export async function accumulateDedupeCapRejectedCount(knex, shapeKey, rejectedCount) {
18
+ await knex('dedupe_cap_events')
19
+ .where({ shape_key: shapeKey })
20
+ .update({
21
+ rejected_count: knex.raw('COALESCE(rejected_count, 0) + ?', [rejectedCount]),
22
+ });
23
+ }
@@ -0,0 +1,12 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Finalizes a `dedupe_cap_events` row by stamping `rejected_count` — but
4
+ * ONLY if it is still unset. The `whereNull('rejected_count')` guard makes
5
+ * this idempotent, mirroring `close-network-outage.ts`'s `ended_at` guard: a
6
+ * second call matches zero rows and is a silent no-op rather than
7
+ * overwriting an already-finalized count.
8
+ * @param knex - Knex query builder connected to the archive DB.
9
+ * @param id - The `dedupe_cap_events.id` to finalize.
10
+ * @param rejectedCount - Number of anchors rejected for this shape after it capped.
11
+ */
12
+ export declare function finalizeDedupeCapEvent(knex: Knex, id: number, rejectedCount: number): Promise<void>;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Finalizes a `dedupe_cap_events` row by stamping `rejected_count` — but
3
+ * ONLY if it is still unset. The `whereNull('rejected_count')` guard makes
4
+ * this idempotent, mirroring `close-network-outage.ts`'s `ended_at` guard: a
5
+ * second call matches zero rows and is a silent no-op rather than
6
+ * overwriting an already-finalized count.
7
+ * @param knex - Knex query builder connected to the archive DB.
8
+ * @param id - The `dedupe_cap_events.id` to finalize.
9
+ * @param rejectedCount - Number of anchors rejected for this shape after it capped.
10
+ */
11
+ export async function finalizeDedupeCapEvent(knex, id, rejectedCount) {
12
+ await knex('dedupe_cap_events').where({ id }).whereNull('rejected_count').update({
13
+ rejected_count: rejectedCount,
14
+ });
15
+ }
@@ -0,0 +1,14 @@
1
+ import type { InsertDedupeCapEventParams } from '../../types.js';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Appends one row to the `dedupe_cap_events` journal, with `rejected_count`
5
+ * left `NULL` — the row starts life without a finalized rejection count.
6
+ *
7
+ * Called the instant `DedupeCapTracker#observe` confirms a URL shape as a
8
+ * same-cluster trap (the `dedupeCap` event). See
9
+ * `finalize-dedupe-cap-event.ts` for how `rejected_count` is later set.
10
+ * @param knex - Knex query builder connected to the archive DB.
11
+ * @param params - The newly-capped shape's fields to record.
12
+ * @returns The autoincremented `id` of the newly-inserted row.
13
+ */
14
+ export declare function insertDedupeCapEvent(knex: Knex, params: InsertDedupeCapEventParams): Promise<number>;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Appends one row to the `dedupe_cap_events` journal, with `rejected_count`
3
+ * left `NULL` — the row starts life without a finalized rejection count.
4
+ *
5
+ * Called the instant `DedupeCapTracker#observe` confirms a URL shape as a
6
+ * same-cluster trap (the `dedupeCap` event). See
7
+ * `finalize-dedupe-cap-event.ts` for how `rejected_count` is later set.
8
+ * @param knex - Knex query builder connected to the archive DB.
9
+ * @param params - The newly-capped shape's fields to record.
10
+ * @returns The autoincremented `id` of the newly-inserted row.
11
+ */
12
+ export async function insertDedupeCapEvent(knex, params) {
13
+ const inserted = await knex
14
+ .from('dedupe_cap_events')
15
+ .insert({
16
+ shape_key: params.shapeKey,
17
+ sample_url: params.sampleUrl,
18
+ body_hash: params.bodyHash,
19
+ effective_threshold: params.effectiveThreshold,
20
+ observed_count: params.observedCount,
21
+ detected_at: params.detectedAt,
22
+ rejected_count: null,
23
+ })
24
+ .returning('id');
25
+ const id = inserted[0]?.id;
26
+ if (typeof id !== 'number') {
27
+ throw new TypeError('insertDedupeCapEvent: INSERT returned no row id');
28
+ }
29
+ return id;
30
+ }
@@ -0,0 +1,57 @@
1
+ import type { DedupeCapObservationRow } from '../../types.js';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Reads back every previously-scraped internal page's raw fields in the
5
+ * exact population a live crawl's `DedupeCapTracker#observe` call site
6
+ * would have fed it, so `CrawlerOrchestrator`'s five resuming-session
7
+ * methods (`append`/`inventory`/`recrawl`/`retryFailed`/`resume`) can
8
+ * replay a prior session's Misra-Gries observations into a fresh tracker
9
+ * instance (see `buildDedupeCapObservation`) instead of restarting every
10
+ * not-yet-capped shape's counter at 0.
11
+ *
12
+ * The WHERE clause reproduces the live observation gate
13
+ * (`!isExternal && !isMetadataOnly && html.length > 0`) using columns that
14
+ * survive a process restart:
15
+ *
16
+ * - `is_external = 0` — external pages carry no useful signal (same
17
+ * exclusion `computeMetaSignature`'s design already assumes).
18
+ * - `is_target = 1` — the archived equivalent of "not metadata-only": a
19
+ * metadata-only fetch never invokes the browser and is written with
20
+ * `is_target = 0` (see `Crawler`'s metadata-only branch), matching the
21
+ * live gate's `!isMetadataOnly` exactly.
22
+ * - `redirect_dest_id IS NULL` — a redirect source's own body was never
23
+ * rendered; only the destination page (a separate row) was.
24
+ * - `is_skipped IS NULL OR is_skipped = 0` — a skipped placeholder row
25
+ * (`source = 'inventory-seed'` etc.) has no rendered body either.
26
+ * - `pm.body_hash IS NOT NULL` — the archived proxy for `html.length > 0`:
27
+ * `update-page.ts` only ever writes a non-null `body_hash` on the same
28
+ * `writeHtml && html.length > 0` gate the live site's `precomputedBodyHash`
29
+ * computation uses, so this column faithfully reconstructs that
30
+ * condition. Also excludes pre-`body_hash`-migration legacy archives'
31
+ * un-backfilled rows (`migrate-page-meta-body-hash.ts` adds the column on
32
+ * every writer open but does not compute values for existing rows) —
33
+ * understating the replayed count is safe (never over-counts), so no
34
+ * column-presence guard is needed here.
35
+ *
36
+ * Deliberately does NOT exclude rows already marked
37
+ * `content_items.dedupe_cap_event_id` (the post-hoc marking column) —
38
+ * unlike `body_hash`, that column is only backfilled during a
39
+ * `viewer-build`, not written during a live crawl, so filtering on it here
40
+ * would silently diverge from what the live crawl-time gate actually saw.
41
+ * `DedupeCapTracker#observe` is an O(1) no-op for a shape already in its
42
+ * sticky set regardless, so replaying an already-capped shape's rows costs
43
+ * a discarded observation, never an incorrect one.
44
+ *
45
+ * Rows are read in `ci.id` order (insertion / discovery order) via
46
+ * `keysetPaginateById` — Misra-Gries counting is order-dependent, so
47
+ * replaying in the archive's original discovery order reproduces what the
48
+ * tracker's state would look like had the process never restarted, subject
49
+ * to the same `mapCap` LRU eviction.
50
+ * @param knex - Knex query builder connected to the archive DB.
51
+ * @param onProgress - Called after each chunk, with the highest `ci.id`
52
+ * scanned so far and the max `ci.id` in the table — mirrors
53
+ * `getResourceUrlList`'s progress shape (`SetupProgressCallbacks.onChunkProgress`).
54
+ * Omit for no reporting (tests, and callers that don't need it).
55
+ * @returns Every qualifying page's raw fields, in `ci.id` order.
56
+ */
57
+ export declare function listDedupeCapObservations(knex: Knex, onProgress?: (scannedUpToId: number, maxId: number) => void): Promise<DedupeCapObservationRow[]>;
@@ -0,0 +1,87 @@
1
+ import { keysetPaginateById } from '../_shared/keyset-paginate-by-id.js';
2
+ const READ_CHUNK_SIZE = 2000;
3
+ /**
4
+ * Reads back every previously-scraped internal page's raw fields in the
5
+ * exact population a live crawl's `DedupeCapTracker#observe` call site
6
+ * would have fed it, so `CrawlerOrchestrator`'s five resuming-session
7
+ * methods (`append`/`inventory`/`recrawl`/`retryFailed`/`resume`) can
8
+ * replay a prior session's Misra-Gries observations into a fresh tracker
9
+ * instance (see `buildDedupeCapObservation`) instead of restarting every
10
+ * not-yet-capped shape's counter at 0.
11
+ *
12
+ * The WHERE clause reproduces the live observation gate
13
+ * (`!isExternal && !isMetadataOnly && html.length > 0`) using columns that
14
+ * survive a process restart:
15
+ *
16
+ * - `is_external = 0` — external pages carry no useful signal (same
17
+ * exclusion `computeMetaSignature`'s design already assumes).
18
+ * - `is_target = 1` — the archived equivalent of "not metadata-only": a
19
+ * metadata-only fetch never invokes the browser and is written with
20
+ * `is_target = 0` (see `Crawler`'s metadata-only branch), matching the
21
+ * live gate's `!isMetadataOnly` exactly.
22
+ * - `redirect_dest_id IS NULL` — a redirect source's own body was never
23
+ * rendered; only the destination page (a separate row) was.
24
+ * - `is_skipped IS NULL OR is_skipped = 0` — a skipped placeholder row
25
+ * (`source = 'inventory-seed'` etc.) has no rendered body either.
26
+ * - `pm.body_hash IS NOT NULL` — the archived proxy for `html.length > 0`:
27
+ * `update-page.ts` only ever writes a non-null `body_hash` on the same
28
+ * `writeHtml && html.length > 0` gate the live site's `precomputedBodyHash`
29
+ * computation uses, so this column faithfully reconstructs that
30
+ * condition. Also excludes pre-`body_hash`-migration legacy archives'
31
+ * un-backfilled rows (`migrate-page-meta-body-hash.ts` adds the column on
32
+ * every writer open but does not compute values for existing rows) —
33
+ * understating the replayed count is safe (never over-counts), so no
34
+ * column-presence guard is needed here.
35
+ *
36
+ * Deliberately does NOT exclude rows already marked
37
+ * `content_items.dedupe_cap_event_id` (the post-hoc marking column) —
38
+ * unlike `body_hash`, that column is only backfilled during a
39
+ * `viewer-build`, not written during a live crawl, so filtering on it here
40
+ * would silently diverge from what the live crawl-time gate actually saw.
41
+ * `DedupeCapTracker#observe` is an O(1) no-op for a shape already in its
42
+ * sticky set regardless, so replaying an already-capped shape's rows costs
43
+ * a discarded observation, never an incorrect one.
44
+ *
45
+ * Rows are read in `ci.id` order (insertion / discovery order) via
46
+ * `keysetPaginateById` — Misra-Gries counting is order-dependent, so
47
+ * replaying in the archive's original discovery order reproduces what the
48
+ * tracker's state would look like had the process never restarted, subject
49
+ * to the same `mapCap` LRU eviction.
50
+ * @param knex - Knex query builder connected to the archive DB.
51
+ * @param onProgress - Called after each chunk, with the highest `ci.id`
52
+ * scanned so far and the max `ci.id` in the table — mirrors
53
+ * `getResourceUrlList`'s progress shape (`SetupProgressCallbacks.onChunkProgress`).
54
+ * Omit for no reporting (tests, and callers that don't need it).
55
+ * @returns Every qualifying page's raw fields, in `ci.id` order.
56
+ */
57
+ export async function listDedupeCapObservations(knex, onProgress) {
58
+ return keysetPaginateById(knex, 'content_items', (lastId) => knex('content_items as ci')
59
+ .join('url_refs as ur', 'ur.id', 'ci.url_id')
60
+ .join('page_meta as pm', 'pm.page_id', 'ci.id')
61
+ .leftJoin('text_refs as title_ref', 'title_ref.id', 'pm.title_text_id')
62
+ .leftJoin('text_refs as description_ref', 'description_ref.id', 'pm.description_text_id')
63
+ .leftJoin('text_refs as og_title_ref', 'og_title_ref.id', 'pm.og_title_text_id')
64
+ .leftJoin('url_refs as og_url_ur', 'og_url_ur.id', 'pm.og_url_id')
65
+ .where('ci.id', '>', lastId)
66
+ .andWhere('ci.scraped', 1)
67
+ .andWhere('ci.is_external', 0)
68
+ .andWhere('ci.is_target', 1)
69
+ .whereNull('ci.redirect_dest_id')
70
+ .where((qb) => {
71
+ qb.whereNull('ci.is_skipped').orWhere('ci.is_skipped', 0);
72
+ })
73
+ .whereNotNull('pm.body_hash')
74
+ .orderBy('ci.id', 'asc')
75
+ .limit(READ_CHUNK_SIZE)
76
+ .select('ci.id as id', 'ur.url as url', 'title_ref.text as title', 'description_ref.text as description', 'og_title_ref.text as ogTitle', 'og_url_ur.url as ogUrl', 'pm.body_hash as bodyHash'), (row) => ({
77
+ url: row.url,
78
+ title: row.title,
79
+ description: row.description,
80
+ ogTitle: row.ogTitle,
81
+ ogUrl: row.ogUrl,
82
+ // libsql returns BLOB columns as `Uint8Array`, not `Buffer` —
83
+ // `DedupeCapTracker#observe` compares hashes via `Buffer#equals`,
84
+ // so this must be a real `Buffer`.
85
+ bodyHash: Buffer.from(row.bodyHash),
86
+ }), onProgress);
87
+ }
@@ -0,0 +1,21 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Every distinct `dedupe_cap_events.shape_key` recorded in this archive —
4
+ * used by `CrawlerOrchestrator` to preload `DedupeCapTracker`'s sticky set
5
+ * on `--resume` / `--append` / `--retry-failed` / `--inventory`, so a trap
6
+ * this crawl already paid the cost of discovering once is not re-admitted
7
+ * in a later session. Fresh (non-resuming) crawls do not call this — there
8
+ * is no archive history to seed from.
9
+ *
10
+ * Unlike `listDnsBurnedHostCandidates`, no additional exclusion logic is
11
+ * needed: once `DedupeCapTracker` confirms a shape as a trap, it stays
12
+ * confirmed — there is no equivalent of "the host might have recovered
13
+ * since".
14
+ *
15
+ * Returns `[]` on legacy archives that pre-date the `dedupe_cap_events`
16
+ * table (self-healed on next writer open, so this is never a permanent
17
+ * state) or that have recorded no capped shapes.
18
+ * @param knex - Knex query builder connected to the archive DB.
19
+ * @returns Distinct shape keys already confirmed capped.
20
+ */
21
+ export declare function listDedupeCapShapeKeys(knex: Knex): Promise<string[]>;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Every distinct `dedupe_cap_events.shape_key` recorded in this archive —
3
+ * used by `CrawlerOrchestrator` to preload `DedupeCapTracker`'s sticky set
4
+ * on `--resume` / `--append` / `--retry-failed` / `--inventory`, so a trap
5
+ * this crawl already paid the cost of discovering once is not re-admitted
6
+ * in a later session. Fresh (non-resuming) crawls do not call this — there
7
+ * is no archive history to seed from.
8
+ *
9
+ * Unlike `listDnsBurnedHostCandidates`, no additional exclusion logic is
10
+ * needed: once `DedupeCapTracker` confirms a shape as a trap, it stays
11
+ * confirmed — there is no equivalent of "the host might have recovered
12
+ * since".
13
+ *
14
+ * Returns `[]` on legacy archives that pre-date the `dedupe_cap_events`
15
+ * table (self-healed on next writer open, so this is never a permanent
16
+ * state) or that have recorded no capped shapes.
17
+ * @param knex - Knex query builder connected to the archive DB.
18
+ * @returns Distinct shape keys already confirmed capped.
19
+ */
20
+ export async function listDedupeCapShapeKeys(knex) {
21
+ const hasTable = await knex.schema.hasTable('dedupe_cap_events');
22
+ if (!hasTable) {
23
+ return [];
24
+ }
25
+ const rows = (await knex('dedupe_cap_events').distinct('shape_key'));
26
+ return rows.map((row) => row.shape_key);
27
+ }
@@ -0,0 +1,15 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Records a crawler-level (`error` channel) failure into `crawl_errors`.
4
+ *
5
+ * Unlike `insertPageError` this is not tied to a scraped page: `url`
6
+ * may be an external link that never became a page row, or `null` for a
7
+ * process-level error. The cause is intentionally not stored — it is derived
8
+ * on read so that older archives (which only have `error.log`) and freshly
9
+ * captured rows classify identically.
10
+ * @param knex - Knex query builder connected to the archive DB.
11
+ * @param url - The URL the error is about, or `null` for a process-level error.
12
+ * @param message - The error message (one line is enough for classification).
13
+ * @param isExternal - Whether the URL is external to the crawl scope.
14
+ */
15
+ export declare function insertCrawlError(knex: Knex, url: string | null, message: string, isExternal?: boolean): Promise<void>;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Records a crawler-level (`error` channel) failure into `crawl_errors`.
3
+ *
4
+ * Unlike `insertPageError` this is not tied to a scraped page: `url`
5
+ * may be an external link that never became a page row, or `null` for a
6
+ * process-level error. The cause is intentionally not stored — it is derived
7
+ * on read so that older archives (which only have `error.log`) and freshly
8
+ * captured rows classify identically.
9
+ * @param knex - Knex query builder connected to the archive DB.
10
+ * @param url - The URL the error is about, or `null` for a process-level error.
11
+ * @param message - The error message (one line is enough for classification).
12
+ * @param isExternal - Whether the URL is external to the crawl scope.
13
+ */
14
+ export async function insertCrawlError(knex, url, message, isExternal = false) {
15
+ await knex('crawl_errors').insert({
16
+ url,
17
+ isExternal: isExternal ? 1 : 0,
18
+ message,
19
+ createdAt: Date.now(),
20
+ });
21
+ }
@@ -0,0 +1,21 @@
1
+ import type { WriteRefCaches } from '../_shared/types.js';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Records a partial scrape failure against the page identified by `url`.
5
+ *
6
+ * The page row is resolved (or inserted as a stub) via
7
+ * {@link resolveContentItemId} so the error can be recorded even before
8
+ * `setPage` has run — useful when the failure fires during scraping
9
+ * (e.g. mid-`scrapeStart`) and the orchestrator enqueues this write
10
+ * before the success write for the same URL.
11
+ *
12
+ * A single page can have multiple `page_errors` rows (e.g. both
13
+ * `desktop-compact` and `mobile-small` viewports failing).
14
+ * @param knex - Knex query builder connected to the archive DB.
15
+ * @param caches - The connection's write-side id caches.
16
+ * @param url - URL of the page being scraped.
17
+ * @param phase - Scrape phase name (typically `'retryExhausted'`).
18
+ * @param message - Human-readable failure message.
19
+ * @param isExternal - Whether the URL is external. Defaults to `false`.
20
+ */
21
+ export declare function insertPageError(knex: Knex, caches: WriteRefCaches, url: string, phase: string, message: string, isExternal?: boolean): Promise<void>;
@@ -0,0 +1,30 @@
1
+ import { resolveContentItemId } from '../_shared/resolve-content-item-id.js';
2
+ /**
3
+ * Records a partial scrape failure against the page identified by `url`.
4
+ *
5
+ * The page row is resolved (or inserted as a stub) via
6
+ * {@link resolveContentItemId} so the error can be recorded even before
7
+ * `setPage` has run — useful when the failure fires during scraping
8
+ * (e.g. mid-`scrapeStart`) and the orchestrator enqueues this write
9
+ * before the success write for the same URL.
10
+ *
11
+ * A single page can have multiple `page_errors` rows (e.g. both
12
+ * `desktop-compact` and `mobile-small` viewports failing).
13
+ * @param knex - Knex query builder connected to the archive DB.
14
+ * @param caches - The connection's write-side id caches.
15
+ * @param url - URL of the page being scraped.
16
+ * @param phase - Scrape phase name (typically `'retryExhausted'`).
17
+ * @param message - Human-readable failure message.
18
+ * @param isExternal - Whether the URL is external. Defaults to `false`.
19
+ */
20
+ export async function insertPageError(knex, caches, url, phase, message, isExternal = false) {
21
+ const pageId = await resolveContentItemId(knex, caches, url, {
22
+ isExternal: isExternal ? 1 : 0,
23
+ });
24
+ await knex('page_errors').insert({
25
+ pageId,
26
+ phase,
27
+ message,
28
+ createdAt: Date.now(),
29
+ });
30
+ }
@@ -0,0 +1,33 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Hostnames whose `crawl_errors` history is consistently DNS failures and
4
+ * for which no recent 2xx-3xx page or resource is recorded — i.e. hosts
5
+ * the previous crawl already proved unreachable. Returned in lower-cased
6
+ * form. Used by `CrawlerOrchestrator.#preloadDnsBurnedHostCache` so the
7
+ * next session short-circuits HEAD pre-flight on these hosts.
8
+ *
9
+ * Implementation: a coarse `LIKE` filter over `crawl_errors.message`
10
+ * narrows the row set, then `classifyErrorKind` confirms `'dns'` in JS
11
+ * (the regex is the single truth source — DB-side filters never narrow
12
+ * it). Exclusion bags are built from a single `pages` and a single
13
+ * `resources` scan: any host with a 2xx-3xx page, a 2xx-3xx resource, or
14
+ * a `pages.lastCrawledAt` newer than its latest DNS error is dropped
15
+ * (the host probably recovered between the failure and the last crawl).
16
+ *
17
+ * Returns `[]` on legacy archives that pre-date the `crawl_errors`
18
+ * table — the `hasTable` guard keeps the call non-destructive.
19
+ *
20
+ * **Outage exclusion**: a host whose latest DNS error's `createdAt` falls
21
+ * inside a recorded `network_outages` window is dropped from the result
22
+ * regardless of the other checks. A host with no prior success this
23
+ * archive has ever seen (the case this whole exclusion-bag scheme cannot
24
+ * otherwise catch) would, without this check, get preload-seeded into
25
+ * `dnsBurnedHostCache` and short-circuit on EVERY subsequent session
26
+ * forever — the exact "damage 3" this function's caller
27
+ * (`#preloadDnsBurnedHostCache`) exists to prevent for hosts genuinely
28
+ * proven dead, not to inflict on hosts merely unlucky enough to be first
29
+ * contacted during an operator-side network blip.
30
+ * @param knex - Knex query builder connected to the archive DB.
31
+ * @returns Lower-cased hostnames safe to short-circuit.
32
+ */
33
+ export declare function listDnsBurnedHostCandidates(knex: Knex): Promise<string[]>;
@@ -0,0 +1,158 @@
1
+ import { classifyErrorKind } from '../../error-kind/classify-error-kind.js';
2
+ import { isWithinOutageWindow } from '../../is-within-outage-window.js';
3
+ import { listNetworkOutages } from '../outages/list-network-outages.js';
4
+ /**
5
+ * Hostnames whose `crawl_errors` history is consistently DNS failures and
6
+ * for which no recent 2xx-3xx page or resource is recorded — i.e. hosts
7
+ * the previous crawl already proved unreachable. Returned in lower-cased
8
+ * form. Used by `CrawlerOrchestrator.#preloadDnsBurnedHostCache` so the
9
+ * next session short-circuits HEAD pre-flight on these hosts.
10
+ *
11
+ * Implementation: a coarse `LIKE` filter over `crawl_errors.message`
12
+ * narrows the row set, then `classifyErrorKind` confirms `'dns'` in JS
13
+ * (the regex is the single truth source — DB-side filters never narrow
14
+ * it). Exclusion bags are built from a single `pages` and a single
15
+ * `resources` scan: any host with a 2xx-3xx page, a 2xx-3xx resource, or
16
+ * a `pages.lastCrawledAt` newer than its latest DNS error is dropped
17
+ * (the host probably recovered between the failure and the last crawl).
18
+ *
19
+ * Returns `[]` on legacy archives that pre-date the `crawl_errors`
20
+ * table — the `hasTable` guard keeps the call non-destructive.
21
+ *
22
+ * **Outage exclusion**: a host whose latest DNS error's `createdAt` falls
23
+ * inside a recorded `network_outages` window is dropped from the result
24
+ * regardless of the other checks. A host with no prior success this
25
+ * archive has ever seen (the case this whole exclusion-bag scheme cannot
26
+ * otherwise catch) would, without this check, get preload-seeded into
27
+ * `dnsBurnedHostCache` and short-circuit on EVERY subsequent session
28
+ * forever — the exact "damage 3" this function's caller
29
+ * (`#preloadDnsBurnedHostCache`) exists to prevent for hosts genuinely
30
+ * proven dead, not to inflict on hosts merely unlucky enough to be first
31
+ * contacted during an operator-side network blip.
32
+ * @param knex - Knex query builder connected to the archive DB.
33
+ * @returns Lower-cased hostnames safe to short-circuit.
34
+ */
35
+ export async function listDnsBurnedHostCandidates(knex) {
36
+ const hasCrawlErrors = await knex.schema.hasTable('crawl_errors');
37
+ if (!hasCrawlErrors) {
38
+ return [];
39
+ }
40
+ // Coarse SQL filter: cheap LIKE OR-chain over `message`. The dns regex
41
+ // truth source lives in `classifyErrorKind`, so we only need to feed it
42
+ // rows that COULD match a DNS token. Each LIKE is anchored on a known
43
+ // substring of the regex so future additions to the regex (without
44
+ // matching new SQL terms) widen the JS-side filter only — never narrow it.
45
+ //
46
+ // `%EAI_AGAIN%` is deliberately NOT in the SQL filter: it now classifies
47
+ // as `dns-transient` (local resolver hiccup), not `dns`, so it must not
48
+ // reach this candidate set. The `%getaddrinfo%` term still pulls
49
+ // `getaddrinfo EAI_AGAIN ...` rows but the JS-side `classifyErrorKind`
50
+ // check (first-match-wins) routes them to `dns-transient` and they
51
+ // silently drop out — keeping the cache focused on real NXDOMAIN.
52
+ const dnsLikeRows = (await knex('crawl_errors')
53
+ .select('url', 'message', 'createdAt')
54
+ .whereNotNull('url')
55
+ .where((qb) => {
56
+ qb.where('message', 'like', '%ENOTFOUND%')
57
+ .orWhere('message', 'like', '%getaddrinfo%')
58
+ .orWhere('message', 'like', '%ERR_NAME_NOT_RESOLVED%')
59
+ .orWhere('message', 'like', '%ERR_NAME_RESOLUTION_FAILED%');
60
+ }));
61
+ if (dnsLikeRows.length === 0) {
62
+ return [];
63
+ }
64
+ // Map<hostname, latestErrorCreatedAt> for hosts whose error message
65
+ // confidently classifies as DNS (LIKE matched but classifyErrorKind says
66
+ // e.g. `unknown` → drop).
67
+ const candidateLatestErrorAt = new Map();
68
+ for (const row of dnsLikeRows) {
69
+ if (classifyErrorKind(row.message) !== 'dns') {
70
+ continue;
71
+ }
72
+ let host;
73
+ try {
74
+ host = new URL(row.url).hostname.toLowerCase();
75
+ }
76
+ catch {
77
+ continue;
78
+ }
79
+ if (!host) {
80
+ continue;
81
+ }
82
+ const createdAt = typeof row.createdAt === 'number' ? row.createdAt : 0;
83
+ const previous = candidateLatestErrorAt.get(host) ?? 0;
84
+ if (createdAt > previous) {
85
+ candidateLatestErrorAt.set(host, createdAt);
86
+ }
87
+ }
88
+ if (candidateLatestErrorAt.size === 0) {
89
+ return [];
90
+ }
91
+ // Exclusion-bag #1: pages with a 2xx-3xx status anywhere on the host.
92
+ // Tracking the latest `last_crawled_at` per host lets us additionally
93
+ // drop hosts whose last successful contact post-dates the most recent
94
+ // DNS error (the host probably came back after a transient outage).
95
+ const pageOkRows = (await knex('content_items')
96
+ .join('url_refs', 'content_items.url_id', 'url_refs.id')
97
+ .select('url_refs.url as url', 'content_items.last_crawled_at as lastCrawledAt')
98
+ .whereBetween('content_items.status', [200, 399]));
99
+ const pageOkHosts = new Set();
100
+ const latestPageOkAt = new Map();
101
+ for (const row of pageOkRows) {
102
+ let host;
103
+ try {
104
+ host = new URL(row.url).hostname.toLowerCase();
105
+ }
106
+ catch {
107
+ continue;
108
+ }
109
+ pageOkHosts.add(host);
110
+ if (typeof row.lastCrawledAt === 'number') {
111
+ const previous = latestPageOkAt.get(host) ?? 0;
112
+ if (row.lastCrawledAt > previous) {
113
+ latestPageOkAt.set(host, row.lastCrawledAt);
114
+ }
115
+ }
116
+ }
117
+ // Exclusion-bag #2: non-HTML resources with a 2xx-3xx status. resources
118
+ // have no timestamp column so this is presence-only.
119
+ const resourceOkRows = (await knex('resource_items')
120
+ .join('url_refs', 'resource_items.url_id', 'url_refs.id')
121
+ .select('url_refs.url as url')
122
+ .whereBetween('resource_items.status', [200, 399]));
123
+ const resourceOkHosts = new Set();
124
+ for (const row of resourceOkRows) {
125
+ let host;
126
+ try {
127
+ host = new URL(row.url).hostname.toLowerCase();
128
+ }
129
+ catch {
130
+ continue;
131
+ }
132
+ resourceOkHosts.add(host);
133
+ }
134
+ const outageWindows = await listNetworkOutages(knex);
135
+ // A candidate host is burned only if neither pages nor resources hold a
136
+ // 2xx-3xx for it, its latest 2xx page (if any) is not newer than the
137
+ // latest DNS error (guards against re-burning a host that recovered
138
+ // between the last DNS failure and the most recent crawl), AND that
139
+ // latest DNS error did not happen during a recorded network outage.
140
+ const burned = [];
141
+ for (const [host, latestErrorAt] of candidateLatestErrorAt) {
142
+ if (pageOkHosts.has(host)) {
143
+ continue;
144
+ }
145
+ if (resourceOkHosts.has(host)) {
146
+ continue;
147
+ }
148
+ const latestOkAt = latestPageOkAt.get(host);
149
+ if (typeof latestOkAt === 'number' && latestOkAt > latestErrorAt) {
150
+ continue;
151
+ }
152
+ if (isWithinOutageWindow(latestErrorAt, outageWindows)) {
153
+ continue;
154
+ }
155
+ burned.push(host);
156
+ }
157
+ return burned;
158
+ }
@@ -0,0 +1,17 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Reads the stored HTML snapshot row of a page (`page_html_ref` →
4
+ * `page_html_blobs`) without decoding it.
5
+ *
6
+ * Kept apart from the decode so that a caller can retry the read (a
7
+ * transient database failure) without retrying the decode (a corrupt or
8
+ * oversized blob fails the same way every time).
9
+ * @param knex - Knex query builder connected to the archive DB.
10
+ * @param pageId - The database ID of the page.
11
+ * @returns The blob's hash, stored bytes and codec, or `null` if no snapshot is stored.
12
+ */
13
+ export declare function readPageHtmlBlob(knex: Knex, pageId: number): Promise<{
14
+ hash: Uint8Array;
15
+ body: Uint8Array;
16
+ codec: string;
17
+ } | null>;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Reads the stored HTML snapshot row of a page (`page_html_ref` →
3
+ * `page_html_blobs`) without decoding it.
4
+ *
5
+ * Kept apart from the decode so that a caller can retry the read (a
6
+ * transient database failure) without retrying the decode (a corrupt or
7
+ * oversized blob fails the same way every time).
8
+ * @param knex - Knex query builder connected to the archive DB.
9
+ * @param pageId - The database ID of the page.
10
+ * @returns The blob's hash, stored bytes and codec, or `null` if no snapshot is stored.
11
+ */
12
+ export async function readPageHtmlBlob(knex, pageId) {
13
+ const row = await knex
14
+ .from('page_html_ref')
15
+ .join('page_html_blobs', 'page_html_ref.hash', '=', 'page_html_blobs.hash')
16
+ .select('page_html_blobs.hash as hash', 'page_html_blobs.body as body', 'page_html_blobs.codec as codec')
17
+ .where('page_html_ref.page_id', pageId)
18
+ .first();
19
+ return row ?? null;
20
+ }
@@ -0,0 +1,8 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Forces a WAL checkpoint, writing all pending WAL data back to the main database file.
4
+ * Uses TRUNCATE mode to reset the WAL file to zero bytes after checkpointing.
5
+ * This ensures the database is fully self-contained in `db.sqlite` before archiving.
6
+ * @param knex - Knex query builder connected to the archive DB.
7
+ */
8
+ export declare function checkpoint(knex: Knex): Promise<void>;