@nitpicker/archive 0.0.0 → 0.25.1

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 (739) 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 +1055 -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 +803 -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 +45 -0
  315. package/lib/filesystem/parse-tar-size-field.d.ts +13 -0
  316. package/lib/filesystem/parse-tar-size-field.js +37 -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 +132 -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/compare-strings.d.ts +12 -0
  576. package/lib/test-utils/compare-strings.js +14 -0
  577. package/lib/test-utils/create-legacy-analysis-tables.d.ts +13 -0
  578. package/lib/test-utils/create-legacy-analysis-tables.js +37 -0
  579. package/lib/test-utils/fk-parent-tables.d.ts +15 -0
  580. package/lib/test-utils/fk-parent-tables.js +19 -0
  581. package/lib/test-utils/seed-content-item.d.ts +35 -0
  582. package/lib/test-utils/seed-content-item.js +42 -0
  583. package/lib/test-utils/setup-legacy-fk-db.d.ts +34 -0
  584. package/lib/test-utils/setup-legacy-fk-db.js +271 -0
  585. package/lib/transfer/attach-source-database.d.ts +31 -0
  586. package/lib/transfer/attach-source-database.js +40 -0
  587. package/lib/transfer/build-split-config.d.ts +30 -0
  588. package/lib/transfer/build-split-config.js +42 -0
  589. package/lib/transfer/clear-replaced-page-rows.d.ts +23 -0
  590. package/lib/transfer/clear-replaced-page-rows.js +61 -0
  591. package/lib/transfer/concat-archives.d.ts +55 -0
  592. package/lib/transfer/concat-archives.js +95 -0
  593. package/lib/transfer/concat-source-transfer-phases.d.ts +10 -0
  594. package/lib/transfer/concat-source-transfer-phases.js +17 -0
  595. package/lib/transfer/content-item-rank-sql.d.ts +21 -0
  596. package/lib/transfer/content-item-rank-sql.js +23 -0
  597. package/lib/transfer/copy-anchor-edges.d.ts +28 -0
  598. package/lib/transfer/copy-anchor-edges.js +42 -0
  599. package/lib/transfer/copy-dictionaries-for-concat.d.ts +39 -0
  600. package/lib/transfer/copy-dictionaries-for-concat.js +81 -0
  601. package/lib/transfer/copy-dictionaries-for-split.d.ts +29 -0
  602. package/lib/transfer/copy-dictionaries-for-split.js +224 -0
  603. package/lib/transfer/copy-header-set-children.d.ts +27 -0
  604. package/lib/transfer/copy-header-set-children.js +51 -0
  605. package/lib/transfer/copy-image-items.d.ts +21 -0
  606. package/lib/transfer/copy-image-items.js +62 -0
  607. package/lib/transfer/copy-inventory-source-lists.d.ts +30 -0
  608. package/lib/transfer/copy-inventory-source-lists.js +61 -0
  609. package/lib/transfer/copy-journal-tables.d.ts +30 -0
  610. package/lib/transfer/copy-journal-tables.js +56 -0
  611. package/lib/transfer/copy-page-console-logs.d.ts +16 -0
  612. package/lib/transfer/copy-page-console-logs.js +27 -0
  613. package/lib/transfer/copy-page-html-blobs.d.ts +31 -0
  614. package/lib/transfer/copy-page-html-blobs.js +43 -0
  615. package/lib/transfer/copy-page-meta.d.ts +27 -0
  616. package/lib/transfer/copy-page-meta.js +68 -0
  617. package/lib/transfer/copy-page-template-clusters.d.ts +31 -0
  618. package/lib/transfer/copy-page-template-clusters.js +56 -0
  619. package/lib/transfer/copy-page-template-labels.d.ts +34 -0
  620. package/lib/transfer/copy-page-template-labels.js +88 -0
  621. package/lib/transfer/copy-resource-items.d.ts +29 -0
  622. package/lib/transfer/copy-resource-items.js +89 -0
  623. package/lib/transfer/copy-resource-ref-edges.d.ts +20 -0
  624. package/lib/transfer/copy-resource-ref-edges.js +33 -0
  625. package/lib/transfer/copy-simple-page-scoped-tables.d.ts +15 -0
  626. package/lib/transfer/copy-simple-page-scoped-tables.js +34 -0
  627. package/lib/transfer/count-external-pages-in-scope.d.ts +26 -0
  628. package/lib/transfer/count-external-pages-in-scope.js +40 -0
  629. package/lib/transfer/create-transfer-temp-tables.d.ts +30 -0
  630. package/lib/transfer/create-transfer-temp-tables.js +59 -0
  631. package/lib/transfer/dictionary-copy-specs.d.ts +32 -0
  632. package/lib/transfer/dictionary-copy-specs.js +28 -0
  633. package/lib/transfer/drop-transfer-temp-tables.d.ts +9 -0
  634. package/lib/transfer/drop-transfer-temp-tables.js +18 -0
  635. package/lib/transfer/flatten-redirect-chains.d.ts +44 -0
  636. package/lib/transfer/flatten-redirect-chains.js +74 -0
  637. package/lib/transfer/insert-content-items.d.ts +35 -0
  638. package/lib/transfer/insert-content-items.js +116 -0
  639. package/lib/transfer/list-transfer-columns.d.ts +35 -0
  640. package/lib/transfer/list-transfer-columns.js +45 -0
  641. package/lib/transfer/mark-in-scope-content-items.d.ts +31 -0
  642. package/lib/transfer/mark-in-scope-content-items.js +54 -0
  643. package/lib/transfer/merge-archive-configs.d.ts +51 -0
  644. package/lib/transfer/merge-archive-configs.js +85 -0
  645. package/lib/transfer/plan-content-items-for-concat.d.ts +33 -0
  646. package/lib/transfer/plan-content-items-for-concat.js +51 -0
  647. package/lib/transfer/plan-content-items-for-split.d.ts +42 -0
  648. package/lib/transfer/plan-content-items-for-split.js +83 -0
  649. package/lib/transfer/plan-resource-items.d.ts +40 -0
  650. package/lib/transfer/plan-resource-items.js +69 -0
  651. package/lib/transfer/quote-transfer-identifier.d.ts +18 -0
  652. package/lib/transfer/quote-transfer-identifier.js +20 -0
  653. package/lib/transfer/reclassify-resource-externality.d.ts +37 -0
  654. package/lib/transfer/reclassify-resource-externality.js +66 -0
  655. package/lib/transfer/remap-redirect-dest-ids.d.ts +34 -0
  656. package/lib/transfer/remap-redirect-dest-ids.js +51 -0
  657. package/lib/transfer/replace-content-items.d.ts +39 -0
  658. package/lib/transfer/replace-content-items.js +83 -0
  659. package/lib/transfer/simple-page-scoped-tables.d.ts +25 -0
  660. package/lib/transfer/simple-page-scoped-tables.js +38 -0
  661. package/lib/transfer/split-archive.d.ts +55 -0
  662. package/lib/transfer/split-archive.js +98 -0
  663. package/lib/transfer/split-source-transfer-phases.d.ts +11 -0
  664. package/lib/transfer/split-source-transfer-phases.js +18 -0
  665. package/lib/transfer/transfer-action.d.ts +34 -0
  666. package/lib/transfer/transfer-action.js +32 -0
  667. package/lib/transfer/transfer-archive-rows.d.ts +65 -0
  668. package/lib/transfer/transfer-archive-rows.js +156 -0
  669. package/lib/transfer/transfer-dictionary-tables.d.ts +12 -0
  670. package/lib/transfer/transfer-dictionary-tables.js +22 -0
  671. package/lib/transfer/transfer-post-phases.d.ts +10 -0
  672. package/lib/transfer/transfer-post-phases.js +13 -0
  673. package/lib/transfer/transfer-source-alias.d.ts +9 -0
  674. package/lib/transfer/transfer-source-alias.js +9 -0
  675. package/lib/transfer/types.d.ts +111 -0
  676. package/lib/transfer/types.js +35 -0
  677. package/lib/types.d.ts +772 -0
  678. package/lib/types.js +1 -0
  679. package/lib/url-alias/compute-tier-a-alias-key.d.ts +44 -0
  680. package/lib/url-alias/compute-tier-a-alias-key.js +47 -0
  681. package/lib/url-alias/compute-tier-b-alias-key.d.ts +23 -0
  682. package/lib/url-alias/compute-tier-b-alias-key.js +26 -0
  683. package/lib/url-alias/group-alias-candidates.d.ts +27 -0
  684. package/lib/url-alias/group-alias-candidates.js +29 -0
  685. package/lib/url-alias/types.d.ts +12 -0
  686. package/lib/url-alias/types.js +1 -0
  687. package/lib/url-pattern/compute-shape-key.d.ts +58 -0
  688. package/lib/url-pattern/compute-shape-key.js +129 -0
  689. package/lib/url-pattern/decompose-url.d.ts +33 -0
  690. package/lib/url-pattern/decompose-url.js +79 -0
  691. package/lib/url-pattern/reconstruct-url.d.ts +15 -0
  692. package/lib/url-pattern/reconstruct-url.js +33 -0
  693. package/lib/url-sort/compute-url-sort-ranks.d.ts +30 -0
  694. package/lib/url-sort/compute-url-sort-ranks.js +33 -0
  695. package/lib/utils/array/each-splitted.d.ts +10 -0
  696. package/lib/utils/array/each-splitted.js +14 -0
  697. package/lib/utils/debug.d.ts +8 -0
  698. package/lib/utils/debug.js +8 -0
  699. package/lib/utils/error/emit-error-with-retry.d.ts +40 -0
  700. package/lib/utils/error/emit-error-with-retry.js +44 -0
  701. package/lib/utils/error/emit-error.d.ts +39 -0
  702. package/lib/utils/error/emit-error.js +41 -0
  703. package/lib/utils/object/parse-response-headers.d.ts +12 -0
  704. package/lib/utils/object/parse-response-headers.js +26 -0
  705. package/lib/utils/object/redact-request-headers.d.ts +15 -0
  706. package/lib/utils/object/redact-request-headers.js +27 -0
  707. package/lib/utils/types/types.d.ts +383 -0
  708. package/lib/utils/types/types.js +1 -0
  709. package/lib/verify-migration/capture-rejection.d.ts +24 -0
  710. package/lib/verify-migration/capture-rejection.js +31 -0
  711. package/lib/verify-migration/check-anchor-edges-count.d.ts +34 -0
  712. package/lib/verify-migration/check-anchor-edges-count.js +72 -0
  713. package/lib/verify-migration/check-anchor-edges-sum.d.ts +13 -0
  714. package/lib/verify-migration/check-anchor-edges-sum.js +27 -0
  715. package/lib/verify-migration/check-content-items-count.d.ts +16 -0
  716. package/lib/verify-migration/check-content-items-count.js +30 -0
  717. package/lib/verify-migration/check-content-type-preservation.d.ts +22 -0
  718. package/lib/verify-migration/check-content-type-preservation.js +40 -0
  719. package/lib/verify-migration/check-foreign-key-integrity.d.ts +31 -0
  720. package/lib/verify-migration/check-foreign-key-integrity.js +47 -0
  721. package/lib/verify-migration/check-image-items-count.d.ts +12 -0
  722. package/lib/verify-migration/check-image-items-count.js +26 -0
  723. package/lib/verify-migration/check-page-meta-count.d.ts +15 -0
  724. package/lib/verify-migration/check-page-meta-count.js +31 -0
  725. package/lib/verify-migration/check-reader-parity.d.ts +23 -0
  726. package/lib/verify-migration/check-reader-parity.js +182 -0
  727. package/lib/verify-migration/check-resource-items-count.d.ts +17 -0
  728. package/lib/verify-migration/check-resource-items-count.js +33 -0
  729. package/lib/verify-migration/check-url-round-trip.d.ts +43 -0
  730. package/lib/verify-migration/check-url-round-trip.js +112 -0
  731. package/lib/verify-migration/types.d.ts +70 -0
  732. package/lib/verify-migration/types.js +63 -0
  733. package/lib/verify-migration/verify-migration.d.ts +41 -0
  734. package/lib/verify-migration/verify-migration.js +120 -0
  735. package/lib/with-bulk-write-pragmas.d.ts +51 -0
  736. package/lib/with-bulk-write-pragmas.js +132 -0
  737. package/lib/write-queue.d.ts +32 -0
  738. package/lib/write-queue.js +55 -0
  739. package/package.json +350 -3
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Deletes every Scoped-Replace derived row for the given page ids, across the
3
+ * 17 tables a page's re-scrape needs to start clean.
4
+ *
5
+ * Shared by {@link resetFailedPages} and {@link repromoteExternalPages} —
6
+ * both un-scrape a page back to `scraped = 0` and need the same "delete this
7
+ * page's derived rows so the re-scrape can re-insert fresh data without
8
+ * duplicates" sweep. `page_errors` is deliberately NOT included here:
9
+ * `repromoteExternalPages` never cleared it (an external page's prior error
10
+ * history stays visible after being promoted back into scope), and folding
11
+ * it into this shared helper would silently change that existing behaviour.
12
+ * Callers that do want `page_errors` cleared (`resetFailedPages`) delete it
13
+ * themselves alongside this call.
14
+ * @param knex - Knex query builder connected to the archive DB.
15
+ * @param pageIds - `content_items.id` values whose derived rows should be
16
+ * deleted. Expected to already be chunked below
17
+ * `SQLITE_LIMIT_VARIABLE_NUMBER` by the caller.
18
+ */
19
+ export async function clearPageDerivedRows(knex, pageIds) {
20
+ await knex('page_meta').whereIn('page_id', pageIds).delete();
21
+ await knex('anchor_edges').whereIn('page_id', pageIds).delete();
22
+ await knex('image_items').whereIn('page_id', pageIds).delete();
23
+ await knex('resource_ref_edges').whereIn('page_id', pageIds).delete();
24
+ await knex('page_html_ref').whereIn('page_id', pageIds).delete();
25
+ await knex('technology_signals').whereIn('pageId', pageIds).delete();
26
+ await knex('page_technologies').whereIn('pageId', pageIds).delete();
27
+ await knex('page_jsonld').whereIn('pageId', pageIds).delete();
28
+ await knex('page_main_content_headings').whereIn('pageId', pageIds).delete();
29
+ await knex('page_main_content_images').whereIn('pageId', pageIds).delete();
30
+ await knex('page_main_content_tables').whereIn('pageId', pageIds).delete();
31
+ await knex('page_main_content_buttons').whereIn('pageId', pageIds).delete();
32
+ await knex('page_main_content_iframes').whereIn('pageId', pageIds).delete();
33
+ await knex('page_main_content_videos').whereIn('pageId', pageIds).delete();
34
+ await knex('page_main_content_audios').whereIn('pageId', pageIds).delete();
35
+ await knex('page_main_content_canvases').whereIn('pageId', pageIds).delete();
36
+ await knex('page_main_content_custom_elements').whereIn('pageId', pageIds).delete();
37
+ }
@@ -0,0 +1,30 @@
1
+ import type { ExURL, ParseURLOptions } from '@d-zero/shared/parse-url';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Promote previously-external pages whose URL falls under any of the new scope
5
+ * entries back to a "needs scraping" state so that the next crawl picks them up
6
+ * as full internal pages.
7
+ *
8
+ * For each matching page:
9
+ * - clears the scrape metadata (status, headers, snapshot path, etc.) by
10
+ * deleting the `page_meta` row outright (a re-scrape re-inserts it fresh),
11
+ * - flips `is_external` to `0` and `scraped` to `0` on `content_items`,
12
+ * - removes stale `anchor_edges`, `image_items`, and `resource_ref_edges`
13
+ * rows so that the re-scrape can re-insert fresh ones without duplicates.
14
+ *
15
+ * The page row itself is kept (id is preserved) so existing referrers via
16
+ * `anchor_edges.href_page_id` remain valid. SELECT and UPDATE/DELETE
17
+ * statements are chunked to stay below SQLite's
18
+ * `SQLITE_LIMIT_VARIABLE_NUMBER`.
19
+ * @param knex - Knex query builder connected to the archive DB.
20
+ * @param scopes - The hostname-indexed scope map after the new roots are merged.
21
+ * @param options - URL parsing options forwarded to {@link findScopeEntry}.
22
+ * @param onProgress - Called after each chunk's DELETE/UPDATE statements
23
+ * complete, with the pages processed so far and the total to promote
24
+ * (issue #294: a large `--append` can promote thousands of pages across
25
+ * `content_items` plus the 17 tables {@link clearPageDerivedRows} clears,
26
+ * running for seconds to minutes with no other signal it hasn't hung).
27
+ * Omit for no reporting (the default; e.g. tests).
28
+ * @returns The URLs of the pages that were promoted.
29
+ */
30
+ export declare function repromoteExternalPages(knex: Knex, scopes: ReadonlyMap<string, readonly ExURL[]>, options?: ParseURLOptions, onProgress?: (processed: number, total: number) => void): Promise<string[]>;
@@ -0,0 +1,91 @@
1
+ import { tryParseUrl as parseUrl } from '@d-zero/shared/parse-url';
2
+ import { dbLog } from '../../../debug.js';
3
+ import { findScopeEntry } from '../../../scope/find-scope-entry.js';
4
+ import { clearPageDerivedRows } from './clear-page-derived-rows.js';
5
+ /**
6
+ * Promote previously-external pages whose URL falls under any of the new scope
7
+ * entries back to a "needs scraping" state so that the next crawl picks them up
8
+ * as full internal pages.
9
+ *
10
+ * For each matching page:
11
+ * - clears the scrape metadata (status, headers, snapshot path, etc.) by
12
+ * deleting the `page_meta` row outright (a re-scrape re-inserts it fresh),
13
+ * - flips `is_external` to `0` and `scraped` to `0` on `content_items`,
14
+ * - removes stale `anchor_edges`, `image_items`, and `resource_ref_edges`
15
+ * rows so that the re-scrape can re-insert fresh ones without duplicates.
16
+ *
17
+ * The page row itself is kept (id is preserved) so existing referrers via
18
+ * `anchor_edges.href_page_id` remain valid. SELECT and UPDATE/DELETE
19
+ * statements are chunked to stay below SQLite's
20
+ * `SQLITE_LIMIT_VARIABLE_NUMBER`.
21
+ * @param knex - Knex query builder connected to the archive DB.
22
+ * @param scopes - The hostname-indexed scope map after the new roots are merged.
23
+ * @param options - URL parsing options forwarded to {@link findScopeEntry}.
24
+ * @param onProgress - Called after each chunk's DELETE/UPDATE statements
25
+ * complete, with the pages processed so far and the total to promote
26
+ * (issue #294: a large `--append` can promote thousands of pages across
27
+ * `content_items` plus the 17 tables {@link clearPageDerivedRows} clears,
28
+ * running for seconds to minutes with no other signal it hasn't hung).
29
+ * Omit for no reporting (the default; e.g. tests).
30
+ * @returns The URLs of the pages that were promoted.
31
+ */
32
+ export async function repromoteExternalPages(knex, scopes, options, onProgress) {
33
+ if (scopes.size === 0) {
34
+ return [];
35
+ }
36
+ const candidates = await knex('content_items')
37
+ .join('url_refs', 'content_items.url_id', 'url_refs.id')
38
+ .select('content_items.id as id', 'url_refs.url as url')
39
+ .where('content_items.is_external', 1);
40
+ const promotedIds = [];
41
+ const promotedUrls = [];
42
+ for (const row of candidates) {
43
+ const parsed = parseUrl(row.url, options);
44
+ if (!parsed) {
45
+ continue;
46
+ }
47
+ if (findScopeEntry(parsed, scopes, options) === null) {
48
+ continue;
49
+ }
50
+ promotedIds.push(row.id);
51
+ promotedUrls.push(row.url);
52
+ }
53
+ if (promotedIds.length === 0) {
54
+ return [];
55
+ }
56
+ const chunkSize = 500;
57
+ for (let i = 0; i < promotedIds.length; i += chunkSize) {
58
+ const chunk = promotedIds.slice(i, i + chunkSize);
59
+ await knex('content_items').whereIn('id', chunk).update({
60
+ scraped: 0,
61
+ is_external: 0,
62
+ is_skipped: 0,
63
+ skip_reason: null,
64
+ status: null,
65
+ status_text: null,
66
+ content_type_id: null,
67
+ content_length: null,
68
+ header_set_id: null,
69
+ redirect_dest_id: null,
70
+ // `first_crawled_at` / `last_crawled_at` are deliberately
71
+ // left untouched — the last-success timestamp survives the
72
+ // demotion.
73
+ });
74
+ // Clear the prior crawl's data for the repromoted pages via the
75
+ // shared sweep (also used by `resetFailedPages` / `resetPagesByUrls`).
76
+ // `updatePage` also replaces anchor_edges/image_items/tags/jsonld/
77
+ // page_main_content_* when it re-scrapes them, but only when the new
78
+ // scrape is non-empty — so this pre-clear is still load-bearing for
79
+ // pages that get repromoted but then re-scrape to nothing (or are
80
+ // never reached again), and it is the only place `resource_ref_edges`
81
+ // is cleared for this operation. Deleting the `page_meta` row (rather
82
+ // than nulling every column) clears title / description / og:* /
83
+ // twitter:* / meta_extras / main_content_* in one statement; a
84
+ // re-scrape re-inserts it via `ON CONFLICT(page_id) DO UPDATE`.
85
+ // Orphan blobs in `page_html_blobs` are left behind; #23 will add GC.
86
+ await clearPageDerivedRows(knex, chunk);
87
+ onProgress?.(Math.min(i + chunkSize, promotedIds.length), promotedIds.length);
88
+ }
89
+ dbLog('Repromoted %d external pages back to pending', promotedUrls.length);
90
+ return promotedUrls;
91
+ }
@@ -0,0 +1,88 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Reset previously-attempted pages that ended in a recoverable failure so a
4
+ * follow-up crawl can re-fetch them from scratch.
5
+ *
6
+ * A page qualifies as a recoverable failure when it was already scraped
7
+ * (`scraped = 1`), is not a redirect source (`redirect_dest_id IS NULL`), was
8
+ * not intentionally skipped (`is_skipped` is not `1`), and one of the
9
+ * following holds:
10
+ *
11
+ * - `status = -1` — the sentinel a hard scrape failure (network error,
12
+ * timeout, browser crash) is recorded with (see `handle-scrape-error.ts`);
13
+ * - `status IS NULL` — no status was ever stored for the row;
14
+ * - the row has no `content_type_refs` link — the content type could not be
15
+ * determined;
16
+ * - `status` is in the `5xx` range — a (frequently transient) server error;
17
+ * - `page_meta.image_scan_desktop` or `image_scan_mobile` is one of
18
+ * {@link RETRYABLE_IMAGE_SCAN_CODES} — `@d-zero/beholder` abandoned that
19
+ * viewport's `<img>` scan for a transient reason (navigation never
20
+ * settled, or the frame/session was lost mid-scan), independent of the
21
+ * page's own HTTP `status` (a page can score `status = 200` and still
22
+ * have failed its mobile image scan).
23
+ *
24
+ * Definitive `4xx` responses are intentionally excluded: re-fetching a 404
25
+ * almost always yields the same answer.
26
+ *
27
+ * A second exclusion runs in JS after the SQL candidate scan: any page whose
28
+ * latest recorded `page_errors` / `crawl_errors` message classifies into a
29
+ * permanent {@link PERMANENT_ERROR_KINDS} kind (dns / tls / client-blocked /
30
+ * parse-error / connection-refused) is left as-is rather than reset to
31
+ * pending. Without this filter, `--retry-failed` never converges: NXDOMAIN
32
+ * hosts, expired-cert hosts, and `ERR_BLOCKED_BY_CLIENT` ad pixels would be
33
+ * reset every iteration, re-attempted, fail identically, and rejoin the
34
+ * candidate pool for the next iteration. The exclusion keeps the retry
35
+ * target shrinking across `--retry-failed` passes by leaving deterministic
36
+ * dead-ends alone.
37
+ *
38
+ * **Outage override**: before applying the permanent-kind exclusion, the
39
+ * message's `createdAt` is checked against every recorded
40
+ * `network_outages` window (see `is-within-outage-window.ts`). A `dns` (or
41
+ * any other permanent-kind) failure whose timestamp falls inside a window
42
+ * is treated as retryable regardless — `dns` is only a permanent,
43
+ * site-specific verdict when nothing else explains it; inside a confirmed
44
+ * operator-network outage, the same `getaddrinfo ENOTFOUND` message is
45
+ * evidence about the CRAWLER's connectivity, not the target site, and
46
+ * excluding it from retry would strand a perfectly reachable host as a
47
+ * false permanent failure for the rest of the archive's life. An archive
48
+ * with no recorded outages (`listNetworkOutages` returns `[]`) behaves
49
+ * exactly as before this override existed.
50
+ *
51
+ * **Confirmed same-cluster trap exclusion**: a third pass drops any
52
+ * remaining candidate whose URL shape (`computeShapeKey`) matches a
53
+ * `dedupe_cap_events.shape_key` already recorded in this archive (see
54
+ * `DedupeCapTracker`). A trap page frequently fails outright (timeout / 5xx)
55
+ * rather than rendering a comparable body, so it never reaches
56
+ * `DedupeCapTracker#observe` during the crawl that hit it — without this
57
+ * exclusion, `--retry-failed` would keep re-queueing the very pages the cap
58
+ * already exists to suppress, re-inflating the pending count on every pass
59
+ * for a shape this archive has already confirmed is not worth the cost of
60
+ * re-discovering. Left as a failed row rather than rewritten to a skip —
61
+ * post-hoc marking (`content_items.dedupe_cap_event_id`, computed at
62
+ * `viewer-build`) is what surfaces these pages as capped, not this reset
63
+ * path. An archive with no recorded cap events (`listDedupeCapShapeKeys`
64
+ * returns `[]`) behaves exactly as before this exclusion existed.
65
+ *
66
+ * Matching rows — internal and external alike — are demoted back to pending
67
+ * (`scraped = 0`) and have their stale scrape metadata cleared (the
68
+ * `page_meta` row is deleted outright rather than nulled column-by-column).
69
+ * The page row itself is kept (id preserved) so existing
70
+ * `anchor_edges.href_page_id` referrers stay valid, and `is_external` is
71
+ * left untouched so the next pass re-classifies each page from the crawl
72
+ * scope. Related `anchor_edges`, `image_items`, `resource_ref_edges`,
73
+ * `page_errors`, and the `page_main_content_*` child tables are deleted so
74
+ * the re-scrape can re-insert fresh data without duplicates — kept in sync
75
+ * with the `page_meta` row deletion above so a reset page's `main_content_*`
76
+ * counts and its child-table detail never disagree.
77
+ *
78
+ * SELECT and UPDATE/DELETE statements are chunked to stay below SQLite's
79
+ * `SQLITE_LIMIT_VARIABLE_NUMBER`.
80
+ * @param knex - Knex query builder connected to the archive DB.
81
+ * @param onProgress - Called after each chunk's DELETE/UPDATE statements
82
+ * complete, with the pages processed so far and the total to reset (issue
83
+ * #294: a large `--retry-failed` can reset thousands of pages across 13
84
+ * tables, running for seconds to minutes with no other signal it hasn't
85
+ * hung). Omit for no reporting (the default; e.g. tests).
86
+ * @returns The URLs of the pages that were reset to pending.
87
+ */
88
+ export declare function resetFailedPages(knex: Knex, onProgress?: (processed: number, total: number) => void): Promise<string[]>;
@@ -0,0 +1,216 @@
1
+ import { dbLog } from '../../../debug.js';
2
+ import { classifyErrorKind } from '../../../error-kind/classify-error-kind.js';
3
+ import { PERMANENT_ERROR_KINDS } from '../../../error-kind/permanent-error-kinds.js';
4
+ import { getFailedPageMessages } from '../../../get-failed-page-messages.js';
5
+ import { isWithinOutageWindow } from '../../../is-within-outage-window.js';
6
+ import { computeShapeKey } from '../../../url-pattern/compute-shape-key.js';
7
+ import { listDedupeCapShapeKeys } from '../../dedupe-cap/list-dedupe-cap-shape-keys.js';
8
+ import { listNetworkOutages } from '../../outages/list-network-outages.js';
9
+ import { clearPageDerivedRows } from './clear-page-derived-rows.js';
10
+ import { RETRYABLE_IMAGE_SCAN_CODES } from './retryable-image-scan-codes.js';
11
+ /**
12
+ * Reset previously-attempted pages that ended in a recoverable failure so a
13
+ * follow-up crawl can re-fetch them from scratch.
14
+ *
15
+ * A page qualifies as a recoverable failure when it was already scraped
16
+ * (`scraped = 1`), is not a redirect source (`redirect_dest_id IS NULL`), was
17
+ * not intentionally skipped (`is_skipped` is not `1`), and one of the
18
+ * following holds:
19
+ *
20
+ * - `status = -1` — the sentinel a hard scrape failure (network error,
21
+ * timeout, browser crash) is recorded with (see `handle-scrape-error.ts`);
22
+ * - `status IS NULL` — no status was ever stored for the row;
23
+ * - the row has no `content_type_refs` link — the content type could not be
24
+ * determined;
25
+ * - `status` is in the `5xx` range — a (frequently transient) server error;
26
+ * - `page_meta.image_scan_desktop` or `image_scan_mobile` is one of
27
+ * {@link RETRYABLE_IMAGE_SCAN_CODES} — `@d-zero/beholder` abandoned that
28
+ * viewport's `<img>` scan for a transient reason (navigation never
29
+ * settled, or the frame/session was lost mid-scan), independent of the
30
+ * page's own HTTP `status` (a page can score `status = 200` and still
31
+ * have failed its mobile image scan).
32
+ *
33
+ * Definitive `4xx` responses are intentionally excluded: re-fetching a 404
34
+ * almost always yields the same answer.
35
+ *
36
+ * A second exclusion runs in JS after the SQL candidate scan: any page whose
37
+ * latest recorded `page_errors` / `crawl_errors` message classifies into a
38
+ * permanent {@link PERMANENT_ERROR_KINDS} kind (dns / tls / client-blocked /
39
+ * parse-error / connection-refused) is left as-is rather than reset to
40
+ * pending. Without this filter, `--retry-failed` never converges: NXDOMAIN
41
+ * hosts, expired-cert hosts, and `ERR_BLOCKED_BY_CLIENT` ad pixels would be
42
+ * reset every iteration, re-attempted, fail identically, and rejoin the
43
+ * candidate pool for the next iteration. The exclusion keeps the retry
44
+ * target shrinking across `--retry-failed` passes by leaving deterministic
45
+ * dead-ends alone.
46
+ *
47
+ * **Outage override**: before applying the permanent-kind exclusion, the
48
+ * message's `createdAt` is checked against every recorded
49
+ * `network_outages` window (see `is-within-outage-window.ts`). A `dns` (or
50
+ * any other permanent-kind) failure whose timestamp falls inside a window
51
+ * is treated as retryable regardless — `dns` is only a permanent,
52
+ * site-specific verdict when nothing else explains it; inside a confirmed
53
+ * operator-network outage, the same `getaddrinfo ENOTFOUND` message is
54
+ * evidence about the CRAWLER's connectivity, not the target site, and
55
+ * excluding it from retry would strand a perfectly reachable host as a
56
+ * false permanent failure for the rest of the archive's life. An archive
57
+ * with no recorded outages (`listNetworkOutages` returns `[]`) behaves
58
+ * exactly as before this override existed.
59
+ *
60
+ * **Confirmed same-cluster trap exclusion**: a third pass drops any
61
+ * remaining candidate whose URL shape (`computeShapeKey`) matches a
62
+ * `dedupe_cap_events.shape_key` already recorded in this archive (see
63
+ * `DedupeCapTracker`). A trap page frequently fails outright (timeout / 5xx)
64
+ * rather than rendering a comparable body, so it never reaches
65
+ * `DedupeCapTracker#observe` during the crawl that hit it — without this
66
+ * exclusion, `--retry-failed` would keep re-queueing the very pages the cap
67
+ * already exists to suppress, re-inflating the pending count on every pass
68
+ * for a shape this archive has already confirmed is not worth the cost of
69
+ * re-discovering. Left as a failed row rather than rewritten to a skip —
70
+ * post-hoc marking (`content_items.dedupe_cap_event_id`, computed at
71
+ * `viewer-build`) is what surfaces these pages as capped, not this reset
72
+ * path. An archive with no recorded cap events (`listDedupeCapShapeKeys`
73
+ * returns `[]`) behaves exactly as before this exclusion existed.
74
+ *
75
+ * Matching rows — internal and external alike — are demoted back to pending
76
+ * (`scraped = 0`) and have their stale scrape metadata cleared (the
77
+ * `page_meta` row is deleted outright rather than nulled column-by-column).
78
+ * The page row itself is kept (id preserved) so existing
79
+ * `anchor_edges.href_page_id` referrers stay valid, and `is_external` is
80
+ * left untouched so the next pass re-classifies each page from the crawl
81
+ * scope. Related `anchor_edges`, `image_items`, `resource_ref_edges`,
82
+ * `page_errors`, and the `page_main_content_*` child tables are deleted so
83
+ * the re-scrape can re-insert fresh data without duplicates — kept in sync
84
+ * with the `page_meta` row deletion above so a reset page's `main_content_*`
85
+ * counts and its child-table detail never disagree.
86
+ *
87
+ * SELECT and UPDATE/DELETE statements are chunked to stay below SQLite's
88
+ * `SQLITE_LIMIT_VARIABLE_NUMBER`.
89
+ * @param knex - Knex query builder connected to the archive DB.
90
+ * @param onProgress - Called after each chunk's DELETE/UPDATE statements
91
+ * complete, with the pages processed so far and the total to reset (issue
92
+ * #294: a large `--retry-failed` can reset thousands of pages across 13
93
+ * tables, running for seconds to minutes with no other signal it hasn't
94
+ * hung). Omit for no reporting (the default; e.g. tests).
95
+ * @returns The URLs of the pages that were reset to pending.
96
+ */
97
+ export async function resetFailedPages(knex, onProgress) {
98
+ const candidates = await knex('content_items')
99
+ .join('url_refs', 'content_items.url_id', 'url_refs.id')
100
+ .leftJoin('page_meta', 'content_items.id', 'page_meta.page_id')
101
+ .select('content_items.id as id', 'url_refs.url as url', 'content_items.status as status', 'content_items.content_type_id as contentTypeId')
102
+ .where('content_items.scraped', 1)
103
+ .whereNull('content_items.redirect_dest_id')
104
+ .where((qb) => {
105
+ qb.where('content_items.is_skipped', 0).orWhereNull('content_items.is_skipped');
106
+ })
107
+ .where((qb) => {
108
+ qb.whereNull('content_items.status')
109
+ .orWhere('content_items.status', -1)
110
+ .orWhereNull('content_items.content_type_id')
111
+ .orWhereBetween('content_items.status', [500, 599])
112
+ .orWhereIn('page_meta.image_scan_desktop', RETRYABLE_IMAGE_SCAN_CODES)
113
+ .orWhereIn('page_meta.image_scan_mobile', RETRYABLE_IMAGE_SCAN_CODES);
114
+ });
115
+ if (candidates.length === 0) {
116
+ return [];
117
+ }
118
+ // Diagnostic only: how many candidates matched solely because of an
119
+ // image-scan outcome, not the pre-existing status-based conditions —
120
+ // i.e. a page whose HTTP status looks fine but whose mobile/desktop
121
+ // `<img>` scan was abandoned for a transient reason.
122
+ const imageScanOnlyCount = candidates.filter((row) => {
123
+ const statusQualifies = row.status === null ||
124
+ row.status === -1 ||
125
+ row.contentTypeId === null ||
126
+ (row.status >= 500 && row.status <= 599);
127
+ return !statusQualifies;
128
+ }).length;
129
+ if (imageScanOnlyCount > 0) {
130
+ dbLog('%d of %d retry candidate(s) matched via image-scan degradation only', imageScanOnlyCount, candidates.length);
131
+ }
132
+ const candidateIds = candidates.map((row) => row.id);
133
+ const candidateUrls = candidates.map((row) => row.url);
134
+ // Three unrelated reads (page_errors/crawl_errors, network_outages,
135
+ // dedupe_cap_events) with no data dependency between them — run
136
+ // concurrently instead of paying three sequential round-trips on every
137
+ // `--retry-failed` pass.
138
+ const [messages, outageWindows, cappedShapeKeys] = await Promise.all([
139
+ getFailedPageMessages(knex, candidateIds, candidateUrls),
140
+ listNetworkOutages(knex),
141
+ listDedupeCapShapeKeys(knex).then((shapeKeys) => new Set(shapeKeys)),
142
+ ]);
143
+ // Drop candidates whose latest recorded message classifies as permanent —
144
+ // UNLESS that message's timestamp falls inside a recorded network outage,
145
+ // in which case the permanent-kind verdict is overridden (see the
146
+ // "Outage override" section of this function's docstring). An
147
+ // empty/absent message stays in the retry pool regardless — we keep
148
+ // retrying when we don't know it's permanent, erring on the side of
149
+ // investigation.
150
+ const retryable = candidates.filter((row) => {
151
+ const resolved = messages.get(row.id);
152
+ if (resolved === undefined || resolved.message === '') {
153
+ return true;
154
+ }
155
+ if (!PERMANENT_ERROR_KINDS.has(classifyErrorKind(resolved.message))) {
156
+ return true;
157
+ }
158
+ return isWithinOutageWindow(resolved.createdAt, outageWindows);
159
+ });
160
+ const excludedCount = candidates.length - retryable.length;
161
+ if (excludedCount > 0) {
162
+ dbLog('Excluded %d page(s) from retry — permanent failure kinds (dns/tls/client-blocked/parse-error/connection-refused)', excludedCount);
163
+ }
164
+ // Drop candidates whose URL shape already has a confirmed same-cluster
165
+ // trap recorded (see the "Confirmed same-cluster trap exclusion" section
166
+ // of this function's docstring). A row whose shape cannot be computed
167
+ // (`computeShapeKey` returns `null`) stays in the retry pool — no signal
168
+ // either way, so err on the side of retrying it.
169
+ const notCapped = cappedShapeKeys.size === 0
170
+ ? retryable
171
+ : retryable.filter((row) => {
172
+ const shapeKey = computeShapeKey(row.url);
173
+ return shapeKey === null || !cappedShapeKeys.has(shapeKey);
174
+ });
175
+ const excludedCappedCount = retryable.length - notCapped.length;
176
+ if (excludedCappedCount > 0) {
177
+ dbLog('Excluded %d page(s) from retry — confirmed same-cluster trap shape', excludedCappedCount);
178
+ }
179
+ if (notCapped.length === 0) {
180
+ return [];
181
+ }
182
+ const ids = notCapped.map((row) => row.id);
183
+ const urls = notCapped.map((row) => row.url);
184
+ const chunkSize = 500;
185
+ for (let i = 0; i < ids.length; i += chunkSize) {
186
+ const chunk = ids.slice(i, i + chunkSize);
187
+ await knex('content_items').whereIn('id', chunk).update({
188
+ scraped: 0,
189
+ status: null,
190
+ status_text: null,
191
+ content_type_id: null,
192
+ content_length: null,
193
+ header_set_id: null,
194
+ // `first_crawled_at` / `last_crawled_at` are deliberately left
195
+ // untouched so the last-success timestamp records survive the
196
+ // demotion (the within-archive observation axis for #11/#17/#19).
197
+ });
198
+ // Clear the prior crawl's per-page data so the re-scrape starts clean,
199
+ // via the shared sweep (also used by `repromoteExternalPages` /
200
+ // `resetPagesByUrls`) plus `page_errors`, which that sweep
201
+ // deliberately excludes (see its JSDoc). `updatePage` only replaces
202
+ // anchor_edges/image_items/tags/jsonld when the new scrape is
203
+ // non-empty, so this pre-clear is load-bearing for pages that reset
204
+ // but then fail again (or are never reached), and it is the only
205
+ // place `resource_ref_edges` and `page_errors` are cleared for this
206
+ // operation. Deleting the `page_meta` row (rather than nulling every
207
+ // column) clears title / description / og:* / twitter:* /
208
+ // meta_extras in one statement; a re-scrape re-inserts it via
209
+ // `ON CONFLICT(page_id) DO UPDATE`.
210
+ await knex('page_errors').whereIn('pageId', chunk).delete();
211
+ await clearPageDerivedRows(knex, chunk);
212
+ onProgress?.(Math.min(i + chunkSize, ids.length), ids.length);
213
+ }
214
+ dbLog('Reset %d failed pages back to pending', urls.length);
215
+ return urls;
216
+ }
@@ -0,0 +1,80 @@
1
+ import type { ResetPagesByUrlsResult } from '../../../types.js';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Reset pages matching an operator-supplied URL list back to pending, so a
5
+ * follow-up crawl re-fetches them from scratch — the un-scrape half of
6
+ * `crawl --recrawl`.
7
+ *
8
+ * Unlike {@link resetFailedPages}, this function does not filter by prior
9
+ * failure kind: a URL named explicitly by the operator is reset regardless
10
+ * of what its last observation was, including a definitive `4xx`/`5xx` — the
11
+ * whole point of `--recrawl` is to catch a page that used to 404 and is now
12
+ * live. The only requirement on the raw candidate scan is `scraped = 1` (a
13
+ * page never scraped has nothing to reset; it is the caller's "novel URL"
14
+ * path instead).
15
+ *
16
+ * Three conservative guards then apply — matching content follows the same
17
+ * union used to skip `resetFailedPages`'s permanent-failure filter had none:
18
+ * a matched row is excluded (not reset) rather than silently promoted, and
19
+ * the exclusion is reported back to the caller by category:
20
+ *
21
+ * - **Redirect source** (`redirect_dest_id` is set): resetting it would
22
+ * discard a real, previously-observed 3xx. If the operator wants the
23
+ * redirect re-verified, that is `--retry-failed`'s job (which does NOT
24
+ * exclude redirect sources from a permanent-failure reset — a different
25
+ * operation with a different default).
26
+ * - **Intentionally skipped** (`is_skipped = 1`): the row was excluded by
27
+ * `excludes`/`excludeUrls` at ingestion or fetch time. `--recrawl` does not
28
+ * second-guess that configuration; re-running the crawl with a changed
29
+ * exclude list is the supported path to un-skip a page.
30
+ * - **External** (`is_external = 1`): bringing a scope-external URL back
31
+ * into scope is `--append`'s job (`repromoteExternalPages`), which also
32
+ * updates the scope map. `--recrawl` only re-fetches in-scope pages.
33
+ *
34
+ * Deliberately does NOT exclude candidates whose URL shape already has a
35
+ * confirmed same-cluster trap recorded (`dedupe_cap_events.shape_key`) — the
36
+ * exclusion {@link resetFailedPages} applies for exactly that reason (see its
37
+ * own JSDoc). The two functions differ on what "the operator asked for this"
38
+ * means: `resetFailedPages` widens an automatic, unattended SQL scan
39
+ * (`--retry-failed`), so a known trap is safe to silently skip re-admitting.
40
+ * `resetPagesByUrls` resets URLs the operator named one-by-one in a file —
41
+ * the same reasoning that already exempts explicit URLs from the
42
+ * failure-kind filter above applies here too: an operator who names a
43
+ * specific trap-shaped URL is not "re-discovering" it by accident, and
44
+ * silently refusing to reset a row they explicitly listed would be a more
45
+ * surprising failure mode than honouring the request.
46
+ *
47
+ * A URL that matches no `content_items` row at all (not yet known to the
48
+ * archive) is silently absent from every array on the result — the caller
49
+ * treats it as a novel URL, the same "not yet known" path `--inventory`
50
+ * takes. A URL matching a row with `scraped = 0` is likewise absent from
51
+ * every array: it is already pending, so there is nothing to reset.
52
+ *
53
+ * On a match, `content_items` is UPDATEd exactly like
54
+ * {@link resetFailedPages} (`scraped`/`status`/`status_text`/
55
+ * `content_type_id`/`content_length`/`header_set_id` cleared,
56
+ * `first_crawled_at`/`last_crawled_at` preserved), and every derived row is
57
+ * cleared via {@link clearPageDerivedRows} plus `page_errors` and
58
+ * the legacy `analysis_violations` table when an archive still carries it.
59
+ * Current archives no longer create that table, but an archive written by
60
+ * an earlier version keeps it (FK to `content_items(id)`). The reset only
61
+ * UPDATEs `content_items`, so no FK violation is reachable here; the stale
62
+ * violation rows of a re-fetched page are removed because they describe
63
+ * content that is about to be replaced. The delete is guarded by `hasTable`.
64
+ * `analysis_text_refs` is a content-hash dictionary shared across pages and
65
+ * is not touched; an orphaned entry is a harmless, unreferenced row, the
66
+ * same trade-off already made for `page_html_blobs`.
67
+ *
68
+ * SELECT and UPDATE/DELETE statements are chunked to stay below SQLite's
69
+ * `SQLITE_LIMIT_VARIABLE_NUMBER`.
70
+ * @param knex - Knex query builder connected to the archive DB.
71
+ * @param urls - URL strings to match against `content_items`, already in
72
+ * `withoutHashAndAuth` form (mirrors every other URL-list comparison in
73
+ * this package, e.g. `getExistingPageUrls`).
74
+ * @param onProgress - Called after each chunk's DELETE/UPDATE statements
75
+ * complete, with the pages processed so far and the total to reset. Omit
76
+ * for no reporting (the default; e.g. tests).
77
+ * @returns The reset URLs, plus the excluded URLs grouped by exclusion
78
+ * reason — see {@link ResetPagesByUrlsResult}.
79
+ */
80
+ export declare function resetPagesByUrls(knex: Knex, urls: readonly string[], onProgress?: (processed: number, total: number) => void): Promise<ResetPagesByUrlsResult>;