@nitpicker/archive 0.0.0-stage → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (737) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +105 -2
  3. package/lib/apply-connection-pragmas.d.ts +18 -0
  4. package/lib/apply-connection-pragmas.js +40 -0
  5. package/lib/archive-accessor.d.ts +265 -0
  6. package/lib/archive-accessor.js +477 -0
  7. package/lib/archive-lock.d.ts +45 -0
  8. package/lib/archive-lock.js +154 -0
  9. package/lib/archive.d.ts +736 -0
  10. package/lib/archive.js +1056 -0
  11. package/lib/body-hash/compute-body-hash.d.ts +32 -0
  12. package/lib/body-hash/compute-body-hash.js +35 -0
  13. package/lib/cache/clear-archive-cache-entry.d.ts +18 -0
  14. package/lib/cache/clear-archive-cache-entry.js +24 -0
  15. package/lib/cache/clear-archive-cache-root.d.ts +26 -0
  16. package/lib/cache/clear-archive-cache-root.js +32 -0
  17. package/lib/cache/compute-archive-cache-key.d.ts +39 -0
  18. package/lib/cache/compute-archive-cache-key.js +95 -0
  19. package/lib/cache/extract-archive-to-cache.d.ts +57 -0
  20. package/lib/cache/extract-archive-to-cache.js +326 -0
  21. package/lib/cache/get-archive-cache-root.d.ts +20 -0
  22. package/lib/cache/get-archive-cache-root.js +53 -0
  23. package/lib/cache/is-archive-cache-disabled.d.ts +24 -0
  24. package/lib/cache/is-archive-cache-disabled.js +34 -0
  25. package/lib/cache/list-archive-cache-entries.d.ts +23 -0
  26. package/lib/cache/list-archive-cache-entries.js +130 -0
  27. package/lib/cache/path-exists.d.ts +9 -0
  28. package/lib/cache/path-exists.js +18 -0
  29. package/lib/cache/resolve-archive-cache-dir.d.ts +26 -0
  30. package/lib/cache/resolve-archive-cache-dir.js +32 -0
  31. package/lib/cache/types.d.ts +33 -0
  32. package/lib/cache/types.js +1 -0
  33. package/lib/content-type/is-html-content-type.d.ts +17 -0
  34. package/lib/content-type/is-html-content-type.js +19 -0
  35. package/lib/content-type/normalize-content-type.d.ts +14 -0
  36. package/lib/content-type/normalize-content-type.js +20 -0
  37. package/lib/create-adjunct-tables.d.ts +66 -0
  38. package/lib/create-adjunct-tables.js +510 -0
  39. package/lib/create-entity-tables.d.ts +191 -0
  40. package/lib/create-entity-tables.js +387 -0
  41. package/lib/create-progress-reporter.d.ts +30 -0
  42. package/lib/create-progress-reporter.js +38 -0
  43. package/lib/create-ref-tables.d.ts +35 -0
  44. package/lib/create-ref-tables.js +185 -0
  45. package/lib/create-template-tables.d.ts +28 -0
  46. package/lib/create-template-tables.js +92 -0
  47. package/lib/database.d.ts +549 -0
  48. package/lib/database.js +804 -0
  49. package/lib/db-ops/_shared/clear-write-ref-caches.d.ts +27 -0
  50. package/lib/db-ops/_shared/clear-write-ref-caches.js +35 -0
  51. package/lib/db-ops/_shared/compress-payload.d.ts +26 -0
  52. package/lib/db-ops/_shared/compress-payload.js +30 -0
  53. package/lib/db-ops/_shared/create-write-ref-caches.d.ts +17 -0
  54. package/lib/db-ops/_shared/create-write-ref-caches.js +27 -0
  55. package/lib/db-ops/_shared/decode-json-ref.d.ts +17 -0
  56. package/lib/db-ops/_shared/decode-json-ref.js +31 -0
  57. package/lib/db-ops/_shared/keyset-paginate-by-id.d.ts +49 -0
  58. package/lib/db-ops/_shared/keyset-paginate-by-id.js +69 -0
  59. package/lib/db-ops/_shared/load-response-headers-by-set-ids.d.ts +20 -0
  60. package/lib/db-ops/_shared/load-response-headers-by-set-ids.js +53 -0
  61. package/lib/db-ops/_shared/resolve-content-item-id.d.ts +62 -0
  62. package/lib/db-ops/_shared/resolve-content-item-id.js +143 -0
  63. package/lib/db-ops/_shared/resolve-url-or-blob.d.ts +23 -0
  64. package/lib/db-ops/_shared/resolve-url-or-blob.js +29 -0
  65. package/lib/db-ops/_shared/retry-setting.d.ts +16 -0
  66. package/lib/db-ops/_shared/retry-setting.js +18 -0
  67. package/lib/db-ops/_shared/safe-parse-json.d.ts +11 -0
  68. package/lib/db-ops/_shared/safe-parse-json.js +18 -0
  69. package/lib/db-ops/_shared/types.d.ts +94 -0
  70. package/lib/db-ops/_shared/types.js +1 -0
  71. package/lib/db-ops/_shared/upsert-blob-ref.d.ts +25 -0
  72. package/lib/db-ops/_shared/upsert-blob-ref.js +48 -0
  73. package/lib/db-ops/_shared/upsert-content-type-ref.d.ts +30 -0
  74. package/lib/db-ops/_shared/upsert-content-type-ref.js +45 -0
  75. package/lib/db-ops/_shared/upsert-json-ref.d.ts +22 -0
  76. package/lib/db-ops/_shared/upsert-json-ref.js +41 -0
  77. package/lib/db-ops/_shared/upsert-response-headers.d.ts +35 -0
  78. package/lib/db-ops/_shared/upsert-response-headers.js +49 -0
  79. package/lib/db-ops/_shared/upsert-url-ref.d.ts +39 -0
  80. package/lib/db-ops/_shared/upsert-url-ref.js +62 -0
  81. package/lib/db-ops/anchors/get-anchors-on-page.d.ts +10 -0
  82. package/lib/db-ops/anchors/get-anchors-on-page.js +21 -0
  83. package/lib/db-ops/config/get-base-url.d.ts +8 -0
  84. package/lib/db-ops/config/get-base-url.js +14 -0
  85. package/lib/db-ops/config/get-config.d.ts +10 -0
  86. package/lib/db-ops/config/get-config.js +29 -0
  87. package/lib/db-ops/config/get-created-cwd.d.ts +11 -0
  88. package/lib/db-ops/config/get-created-cwd.js +13 -0
  89. package/lib/db-ops/config/get-name.d.ts +8 -0
  90. package/lib/db-ops/config/get-name.js +14 -0
  91. package/lib/db-ops/config/info-column-allowlist.d.ts +7 -0
  92. package/lib/db-ops/config/info-column-allowlist.js +29 -0
  93. package/lib/db-ops/config/info-json-columns.d.ts +5 -0
  94. package/lib/db-ops/config/info-json-columns.js +11 -0
  95. package/lib/db-ops/config/set-config.d.ts +12 -0
  96. package/lib/db-ops/config/set-config.js +21 -0
  97. package/lib/db-ops/config/update-config.d.ts +17 -0
  98. package/lib/db-ops/config/update-config.js +36 -0
  99. package/lib/db-ops/console-logs/compute-console-log-hash.d.ts +19 -0
  100. package/lib/db-ops/console-logs/compute-console-log-hash.js +30 -0
  101. package/lib/db-ops/console-logs/replace-console-logs.d.ts +34 -0
  102. package/lib/db-ops/console-logs/replace-console-logs.js +123 -0
  103. package/lib/db-ops/console-logs/stringify-console-log-args.d.ts +16 -0
  104. package/lib/db-ops/console-logs/stringify-console-log-args.js +26 -0
  105. package/lib/db-ops/console-logs/types.d.ts +38 -0
  106. package/lib/db-ops/console-logs/types.js +1 -0
  107. package/lib/db-ops/console-logs/upsert-console-log-item.d.ts +29 -0
  108. package/lib/db-ops/console-logs/upsert-console-log-item.js +52 -0
  109. package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.d.ts +18 -0
  110. package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.js +23 -0
  111. package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.d.ts +12 -0
  112. package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.js +15 -0
  113. package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.d.ts +14 -0
  114. package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.js +30 -0
  115. package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.d.ts +57 -0
  116. package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.js +87 -0
  117. package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.d.ts +21 -0
  118. package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.js +27 -0
  119. package/lib/db-ops/errors/insert-crawl-error.d.ts +15 -0
  120. package/lib/db-ops/errors/insert-crawl-error.js +21 -0
  121. package/lib/db-ops/errors/insert-page-error.d.ts +21 -0
  122. package/lib/db-ops/errors/insert-page-error.js +30 -0
  123. package/lib/db-ops/errors/list-dns-burned-host-candidates.d.ts +33 -0
  124. package/lib/db-ops/errors/list-dns-burned-host-candidates.js +158 -0
  125. package/lib/db-ops/html/read-page-html-blob.d.ts +17 -0
  126. package/lib/db-ops/html/read-page-html-blob.js +20 -0
  127. package/lib/db-ops/lifecycle/checkpoint.d.ts +8 -0
  128. package/lib/db-ops/lifecycle/checkpoint.js +9 -0
  129. package/lib/db-ops/lifecycle/destroy.d.ts +6 -0
  130. package/lib/db-ops/lifecycle/destroy.js +7 -0
  131. package/lib/db-ops/lifecycle/init.d.ts +58 -0
  132. package/lib/db-ops/lifecycle/init.js +122 -0
  133. package/lib/db-ops/list-reconcile/record-list-reconcile-run.d.ts +22 -0
  134. package/lib/db-ops/list-reconcile/record-list-reconcile-run.js +41 -0
  135. package/lib/db-ops/meta/get-audios-of-page.d.ts +11 -0
  136. package/lib/db-ops/meta/get-audios-of-page.js +15 -0
  137. package/lib/db-ops/meta/get-buttons-of-page.d.ts +11 -0
  138. package/lib/db-ops/meta/get-buttons-of-page.js +15 -0
  139. package/lib/db-ops/meta/get-canvases-of-page.d.ts +11 -0
  140. package/lib/db-ops/meta/get-canvases-of-page.js +15 -0
  141. package/lib/db-ops/meta/get-custom-elements-of-page.d.ts +11 -0
  142. package/lib/db-ops/meta/get-custom-elements-of-page.js +15 -0
  143. package/lib/db-ops/meta/get-headings-of-page.d.ts +11 -0
  144. package/lib/db-ops/meta/get-headings-of-page.js +15 -0
  145. package/lib/db-ops/meta/get-iframes-of-page.d.ts +11 -0
  146. package/lib/db-ops/meta/get-iframes-of-page.js +15 -0
  147. package/lib/db-ops/meta/get-jsonld-of-page.d.ts +13 -0
  148. package/lib/db-ops/meta/get-jsonld-of-page.js +27 -0
  149. package/lib/db-ops/meta/get-main-content-images-of-page.d.ts +11 -0
  150. package/lib/db-ops/meta/get-main-content-images-of-page.js +15 -0
  151. package/lib/db-ops/meta/get-main-content-tables-of-page.d.ts +11 -0
  152. package/lib/db-ops/meta/get-main-content-tables-of-page.js +15 -0
  153. package/lib/db-ops/meta/get-page-technologies-of-page.d.ts +11 -0
  154. package/lib/db-ops/meta/get-page-technologies-of-page.js +15 -0
  155. package/lib/db-ops/meta/get-technology-signals-of-page.d.ts +11 -0
  156. package/lib/db-ops/meta/get-technology-signals-of-page.js +15 -0
  157. package/lib/db-ops/meta/get-videos-of-page.d.ts +11 -0
  158. package/lib/db-ops/meta/get-videos-of-page.js +15 -0
  159. package/lib/db-ops/outages/close-network-outage.d.ts +12 -0
  160. package/lib/db-ops/outages/close-network-outage.js +15 -0
  161. package/lib/db-ops/outages/close-stale-open-network-outages.d.ts +26 -0
  162. package/lib/db-ops/outages/close-stale-open-network-outages.js +42 -0
  163. package/lib/db-ops/outages/compute-outage-clamp-timestamp.d.ts +26 -0
  164. package/lib/db-ops/outages/compute-outage-clamp-timestamp.js +31 -0
  165. package/lib/db-ops/outages/insert-network-outage.d.ts +14 -0
  166. package/lib/db-ops/outages/insert-network-outage.js +29 -0
  167. package/lib/db-ops/outages/list-network-outages.d.ts +28 -0
  168. package/lib/db-ops/outages/list-network-outages.js +42 -0
  169. package/lib/db-ops/pages/order/set-url-order.d.ts +13 -0
  170. package/lib/db-ops/pages/order/set-url-order.js +38 -0
  171. package/lib/db-ops/pages/read/build-page-query.d.ts +18 -0
  172. package/lib/db-ops/pages/read/build-page-query.js +40 -0
  173. package/lib/db-ops/pages/read/get-crawling-state.d.ts +117 -0
  174. package/lib/db-ops/pages/read/get-crawling-state.js +161 -0
  175. package/lib/db-ops/pages/read/get-existing-page-urls.d.ts +15 -0
  176. package/lib/db-ops/pages/read/get-existing-page-urls.js +30 -0
  177. package/lib/db-ops/pages/read/get-page-count.d.ts +12 -0
  178. package/lib/db-ops/pages/read/get-page-count.js +21 -0
  179. package/lib/db-ops/pages/read/get-page-source-by-url.d.ts +24 -0
  180. package/lib/db-ops/pages/read/get-page-source-by-url.js +28 -0
  181. package/lib/db-ops/pages/read/get-pages-with-rels.d.ts +38 -0
  182. package/lib/db-ops/pages/read/get-pages-with-rels.js +107 -0
  183. package/lib/db-ops/pages/read/get-pages.d.ts +11 -0
  184. package/lib/db-ops/pages/read/get-pages.js +51 -0
  185. package/lib/db-ops/pages/read/get-scraped-html-page-count.d.ts +18 -0
  186. package/lib/db-ops/pages/read/get-scraped-html-page-count.js +25 -0
  187. package/lib/db-ops/pages/read/reconstruct-page-rows.d.ts +31 -0
  188. package/lib/db-ops/pages/read/reconstruct-page-rows.js +32 -0
  189. package/lib/db-ops/pages/reset/clear-page-derived-rows.d.ts +20 -0
  190. package/lib/db-ops/pages/reset/clear-page-derived-rows.js +37 -0
  191. package/lib/db-ops/pages/reset/repromote-external-pages.d.ts +30 -0
  192. package/lib/db-ops/pages/reset/repromote-external-pages.js +91 -0
  193. package/lib/db-ops/pages/reset/reset-failed-pages.d.ts +88 -0
  194. package/lib/db-ops/pages/reset/reset-failed-pages.js +216 -0
  195. package/lib/db-ops/pages/reset/reset-pages-by-urls.d.ts +80 -0
  196. package/lib/db-ops/pages/reset/reset-pages-by-urls.js +151 -0
  197. package/lib/db-ops/pages/reset/retryable-image-scan-codes.d.ts +24 -0
  198. package/lib/db-ops/pages/reset/retryable-image-scan-codes.js +24 -0
  199. package/lib/db-ops/pages/write/insert-audios.d.ts +14 -0
  200. package/lib/db-ops/pages/write/insert-audios.js +25 -0
  201. package/lib/db-ops/pages/write/insert-buttons.d.ts +14 -0
  202. package/lib/db-ops/pages/write/insert-buttons.js +29 -0
  203. package/lib/db-ops/pages/write/insert-canvases.d.ts +14 -0
  204. package/lib/db-ops/pages/write/insert-canvases.js +26 -0
  205. package/lib/db-ops/pages/write/insert-custom-elements.d.ts +27 -0
  206. package/lib/db-ops/pages/write/insert-custom-elements.js +40 -0
  207. package/lib/db-ops/pages/write/insert-headings.d.ts +15 -0
  208. package/lib/db-ops/pages/write/insert-headings.js +27 -0
  209. package/lib/db-ops/pages/write/insert-iframes.d.ts +14 -0
  210. package/lib/db-ops/pages/write/insert-iframes.js +28 -0
  211. package/lib/db-ops/pages/write/insert-inventory-content-items.d.ts +38 -0
  212. package/lib/db-ops/pages/write/insert-inventory-content-items.js +60 -0
  213. package/lib/db-ops/pages/write/insert-inventory-seeds.d.ts +36 -0
  214. package/lib/db-ops/pages/write/insert-inventory-seeds.js +48 -0
  215. package/lib/db-ops/pages/write/insert-inventory-skipped-pages.d.ts +42 -0
  216. package/lib/db-ops/pages/write/insert-inventory-skipped-pages.js +56 -0
  217. package/lib/db-ops/pages/write/insert-jsonld.d.ts +17 -0
  218. package/lib/db-ops/pages/write/insert-jsonld.js +49 -0
  219. package/lib/db-ops/pages/write/insert-main-content-images.d.ts +20 -0
  220. package/lib/db-ops/pages/write/insert-main-content-images.js +32 -0
  221. package/lib/db-ops/pages/write/insert-main-content-tables.d.ts +14 -0
  222. package/lib/db-ops/pages/write/insert-main-content-tables.js +29 -0
  223. package/lib/db-ops/pages/write/insert-page.d.ts +56 -0
  224. package/lib/db-ops/pages/write/insert-page.js +259 -0
  225. package/lib/db-ops/pages/write/insert-technologies.d.ts +25 -0
  226. package/lib/db-ops/pages/write/insert-technologies.js +45 -0
  227. package/lib/db-ops/pages/write/insert-videos.d.ts +14 -0
  228. package/lib/db-ops/pages/write/insert-videos.js +28 -0
  229. package/lib/db-ops/pages/write/link-redirect-sources.d.ts +42 -0
  230. package/lib/db-ops/pages/write/link-redirect-sources.js +101 -0
  231. package/lib/db-ops/pages/write/record-redirect.d.ts +35 -0
  232. package/lib/db-ops/pages/write/record-redirect.js +100 -0
  233. package/lib/db-ops/pages/write/set-skipped-page.d.ts +13 -0
  234. package/lib/db-ops/pages/write/set-skipped-page.js +24 -0
  235. package/lib/db-ops/pages/write/update-page.d.ts +40 -0
  236. package/lib/db-ops/pages/write/update-page.js +419 -0
  237. package/lib/db-ops/pages/write/write-page-html-blob.d.ts +19 -0
  238. package/lib/db-ops/pages/write/write-page-html-blob.js +41 -0
  239. package/lib/db-ops/referrers/get-redirects-for-pages.d.ts +9 -0
  240. package/lib/db-ops/referrers/get-redirects-for-pages.js +15 -0
  241. package/lib/db-ops/referrers/get-referrers-of-page.d.ts +17 -0
  242. package/lib/db-ops/referrers/get-referrers-of-page.js +32 -0
  243. package/lib/db-ops/referrers/get-referrers-of-resource.d.ts +8 -0
  244. package/lib/db-ops/referrers/get-referrers-of-resource.js +15 -0
  245. package/lib/db-ops/resources/build-resource-query.d.ts +25 -0
  246. package/lib/db-ops/resources/build-resource-query.js +29 -0
  247. package/lib/db-ops/resources/get-existing-resource-urls.d.ts +9 -0
  248. package/lib/db-ops/resources/get-existing-resource-urls.js +24 -0
  249. package/lib/db-ops/resources/get-resource-by-url.d.ts +13 -0
  250. package/lib/db-ops/resources/get-resource-by-url.js +22 -0
  251. package/lib/db-ops/resources/get-resource-url-list.d.ts +17 -0
  252. package/lib/db-ops/resources/get-resource-url-list.js +26 -0
  253. package/lib/db-ops/resources/get-resources.d.ts +8 -0
  254. package/lib/db-ops/resources/get-resources.js +11 -0
  255. package/lib/db-ops/resources/insert-inventory-resources.d.ts +24 -0
  256. package/lib/db-ops/resources/insert-inventory-resources.js +64 -0
  257. package/lib/db-ops/resources/insert-resource-referrers.d.ts +15 -0
  258. package/lib/db-ops/resources/insert-resource-referrers.js +54 -0
  259. package/lib/db-ops/resources/insert-resource.d.ts +34 -0
  260. package/lib/db-ops/resources/insert-resource.js +73 -0
  261. package/lib/db-ops/resources/reconstruct-resource-rows.d.ts +26 -0
  262. package/lib/db-ops/resources/reconstruct-resource-rows.js +30 -0
  263. package/lib/db-ops/templates/assign-template-labels.d.ts +60 -0
  264. package/lib/db-ops/templates/assign-template-labels.js +187 -0
  265. package/lib/db-ops/templates/replace-page-templates.d.ts +44 -0
  266. package/lib/db-ops/templates/replace-page-templates.js +174 -0
  267. package/lib/db-ops/templates/serialize-template-cluster-reason.d.ts +16 -0
  268. package/lib/db-ops/templates/serialize-template-cluster-reason.js +17 -0
  269. package/lib/db-ops/templates/types.d.ts +103 -0
  270. package/lib/db-ops/templates/types.js +1 -0
  271. package/lib/debug.d.ts +8 -0
  272. package/lib/debug.js +9 -0
  273. package/lib/decode-html-blob.d.ts +20 -0
  274. package/lib/decode-html-blob.js +23 -0
  275. package/lib/decode-page-html-blob-bytes.d.ts +25 -0
  276. package/lib/decode-page-html-blob-bytes.js +29 -0
  277. package/lib/decode-stored-blob-bytes.d.ts +25 -0
  278. package/lib/decode-stored-blob-bytes.js +47 -0
  279. package/lib/derive-lineage-from-parent.d.ts +37 -0
  280. package/lib/derive-lineage-from-parent.js +42 -0
  281. package/lib/drop-legacy-tables.d.ts +45 -0
  282. package/lib/drop-legacy-tables.js +56 -0
  283. package/lib/error-kind/classify-error-kind.d.ts +20 -0
  284. package/lib/error-kind/classify-error-kind.js +136 -0
  285. package/lib/error-kind/network-related-error-kinds.d.ts +23 -0
  286. package/lib/error-kind/network-related-error-kinds.js +28 -0
  287. package/lib/error-kind/permanent-error-kinds.d.ts +48 -0
  288. package/lib/error-kind/permanent-error-kinds.js +54 -0
  289. package/lib/error-kind/types.d.ts +54 -0
  290. package/lib/error-kind/types.js +1 -0
  291. package/lib/filesystem/append-text.d.ts +9 -0
  292. package/lib/filesystem/append-text.js +14 -0
  293. package/lib/filesystem/copy-dir-sync.d.ts +6 -0
  294. package/lib/filesystem/copy-dir-sync.js +9 -0
  295. package/lib/filesystem/copy-dir.d.ts +7 -0
  296. package/lib/filesystem/copy-dir.js +13 -0
  297. package/lib/filesystem/copy-file-with-progress.d.ts +20 -0
  298. package/lib/filesystem/copy-file-with-progress.js +34 -0
  299. package/lib/filesystem/exists.d.ts +6 -0
  300. package/lib/filesystem/exists.js +9 -0
  301. package/lib/filesystem/get-file-list.d.ts +8 -0
  302. package/lib/filesystem/get-file-list.js +12 -0
  303. package/lib/filesystem/is-dir.d.ts +6 -0
  304. package/lib/filesystem/is-dir.js +10 -0
  305. package/lib/filesystem/mkdir.d.ts +8 -0
  306. package/lib/filesystem/mkdir.js +15 -0
  307. package/lib/filesystem/output-binary.d.ts +12 -0
  308. package/lib/filesystem/output-binary.js +17 -0
  309. package/lib/filesystem/output-json.d.ts +9 -0
  310. package/lib/filesystem/output-json.js +14 -0
  311. package/lib/filesystem/output-text.d.ts +11 -0
  312. package/lib/filesystem/output-text.js +32 -0
  313. package/lib/filesystem/parse-pax-path.d.ts +18 -0
  314. package/lib/filesystem/parse-pax-path.js +47 -0
  315. package/lib/filesystem/parse-tar-size-field.d.ts +13 -0
  316. package/lib/filesystem/parse-tar-size-field.js +40 -0
  317. package/lib/filesystem/peek-tar-top-dir.d.ts +35 -0
  318. package/lib/filesystem/peek-tar-top-dir.js +215 -0
  319. package/lib/filesystem/read-json.d.ts +7 -0
  320. package/lib/filesystem/read-json.js +11 -0
  321. package/lib/filesystem/read-text.d.ts +6 -0
  322. package/lib/filesystem/read-text.js +10 -0
  323. package/lib/filesystem/readline.d.ts +11 -0
  324. package/lib/filesystem/readline.js +26 -0
  325. package/lib/filesystem/remove.d.ts +5 -0
  326. package/lib/filesystem/remove.js +10 -0
  327. package/lib/filesystem/rename.d.ts +16 -0
  328. package/lib/filesystem/rename.js +48 -0
  329. package/lib/filesystem/tar.d.ts +23 -0
  330. package/lib/filesystem/tar.js +78 -0
  331. package/lib/filesystem/untar.d.ts +33 -0
  332. package/lib/filesystem/untar.js +84 -0
  333. package/lib/get-failed-page-messages.d.ts +56 -0
  334. package/lib/get-failed-page-messages.js +146 -0
  335. package/lib/get-json.d.ts +10 -0
  336. package/lib/get-json.js +25 -0
  337. package/lib/html-snapshot/match-selector-html.d.ts +25 -0
  338. package/lib/html-snapshot/match-selector-html.js +28 -0
  339. package/lib/html-snapshot/match-selector-snapshots.d.ts +33 -0
  340. package/lib/html-snapshot/match-selector-snapshots.js +33 -0
  341. package/lib/html-snapshot/search-html-document.d.ts +29 -0
  342. package/lib/html-snapshot/search-html-document.js +27 -0
  343. package/lib/html-snapshot/search-html-snapshots.d.ts +36 -0
  344. package/lib/html-snapshot/search-html-snapshots.js +35 -0
  345. package/lib/html-snapshot/types.d.ts +111 -0
  346. package/lib/html-snapshot/types.js +7 -0
  347. package/lib/html-snapshot/validate-search-pattern.d.ts +15 -0
  348. package/lib/html-snapshot/validate-search-pattern.js +17 -0
  349. package/lib/init-schema.d.ts +48 -0
  350. package/lib/init-schema.js +124 -0
  351. package/lib/is-inventory-source.d.ts +21 -0
  352. package/lib/is-inventory-source.js +22 -0
  353. package/lib/is-within-outage-window.d.ts +49 -0
  354. package/lib/is-within-outage-window.js +33 -0
  355. package/lib/isolated-cluster/create-isolated-cluster-run.d.ts +24 -0
  356. package/lib/isolated-cluster/create-isolated-cluster-run.js +26 -0
  357. package/lib/libsql-dialect.d.ts +115 -0
  358. package/lib/libsql-dialect.js +116 -0
  359. package/lib/limited-page-ids.d.ts +9 -0
  360. package/lib/limited-page-ids.js +18 -0
  361. package/lib/meta/assert-compatible-version.d.ts +60 -0
  362. package/lib/meta/assert-compatible-version.js +93 -0
  363. package/lib/meta/classify-jsonld-type.d.ts +23 -0
  364. package/lib/meta/classify-jsonld-type.js +43 -0
  365. package/lib/meta/compare-semver.d.ts +23 -0
  366. package/lib/meta/compare-semver.js +51 -0
  367. package/lib/meta/compute-main-contents-denormalized.d.ts +41 -0
  368. package/lib/meta/compute-main-contents-denormalized.js +88 -0
  369. package/lib/meta/compute-page-denormalized.d.ts +20 -0
  370. package/lib/meta/compute-page-denormalized.js +35 -0
  371. package/lib/meta/derive-flat-from-meta.d.ts +34 -0
  372. package/lib/meta/derive-flat-from-meta.js +158 -0
  373. package/lib/meta/derive-meta-extras.d.ts +20 -0
  374. package/lib/meta/derive-meta-extras.js +23 -0
  375. package/lib/meta/extract-tags-for-archive.d.ts +17 -0
  376. package/lib/meta/extract-tags-for-archive.js +36 -0
  377. package/lib/meta/parse-main-content-class-list.d.ts +19 -0
  378. package/lib/meta/parse-main-content-class-list.js +34 -0
  379. package/lib/meta/summarize-jsonld.d.ts +17 -0
  380. package/lib/meta/summarize-jsonld.js +29 -0
  381. package/lib/meta/technologies/combine-technology-confidence.d.ts +46 -0
  382. package/lib/meta/technologies/combine-technology-confidence.js +93 -0
  383. package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.d.ts +45 -0
  384. package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.js +53 -0
  385. package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.d.ts +33 -0
  386. package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.js +46 -0
  387. package/lib/meta/technologies/extract-technologies-for-archive.d.ts +33 -0
  388. package/lib/meta/technologies/extract-technologies-for-archive.js +30 -0
  389. package/lib/meta/technologies/match-js-license-comment-signal.d.ts +21 -0
  390. package/lib/meta/technologies/match-js-license-comment-signal.js +23 -0
  391. package/lib/meta/technologies/match-structural-technology-signals.d.ts +26 -0
  392. package/lib/meta/technologies/match-structural-technology-signals.js +48 -0
  393. package/lib/meta/technologies/normalize-wappalyzer-entries.d.ts +25 -0
  394. package/lib/meta/technologies/normalize-wappalyzer-entries.js +35 -0
  395. package/lib/meta/technologies/technology-signal-definitions.d.ts +44 -0
  396. package/lib/meta/technologies/technology-signal-definitions.js +60 -0
  397. package/lib/meta/technologies/types.d.ts +70 -0
  398. package/lib/meta/technologies/types.js +13 -0
  399. package/lib/meta/types.d.ts +1490 -0
  400. package/lib/meta/types.js +65 -0
  401. package/lib/migrate-content-items-alias-of-id.d.ts +52 -0
  402. package/lib/migrate-content-items-alias-of-id.js +69 -0
  403. package/lib/migrate-content-items-dedupe-cap-event-id.d.ts +46 -0
  404. package/lib/migrate-content-items-dedupe-cap-event-id.js +62 -0
  405. package/lib/migrate-content-items-is-metadata-only.d.ts +44 -0
  406. package/lib/migrate-content-items-is-metadata-only.js +60 -0
  407. package/lib/migrate-entity-tables.d.ts +55 -0
  408. package/lib/migrate-entity-tables.js +66 -0
  409. package/lib/migrate-info-created-cwd.d.ts +17 -0
  410. package/lib/migrate-info-created-cwd.js +36 -0
  411. package/lib/migrate-info-main-content-selector.d.ts +16 -0
  412. package/lib/migrate-info-main-content-selector.js +35 -0
  413. package/lib/migrate-info-request-header-names.d.ts +16 -0
  414. package/lib/migrate-info-request-header-names.js +35 -0
  415. package/lib/migrate-info-roots.d.ts +20 -0
  416. package/lib/migrate-info-roots.js +52 -0
  417. package/lib/migrate-inventory-runs-to-list-reconcile-runs.d.ts +34 -0
  418. package/lib/migrate-inventory-runs-to-list-reconcile-runs.js +51 -0
  419. package/lib/migrate-list-reconcile-runs-exclude-skipped.d.ts +25 -0
  420. package/lib/migrate-list-reconcile-runs-exclude-skipped.js +44 -0
  421. package/lib/migrate-list-reconcile-runs-invalid-skipped.d.ts +16 -0
  422. package/lib/migrate-list-reconcile-runs-invalid-skipped.js +35 -0
  423. package/lib/migrate-main-contents-columns.d.ts +26 -0
  424. package/lib/migrate-main-contents-columns.js +61 -0
  425. package/lib/migrate-page-meta-body-hash.d.ts +44 -0
  426. package/lib/migrate-page-meta-body-hash.js +63 -0
  427. package/lib/migrate-page-meta-console-error-count.d.ts +27 -0
  428. package/lib/migrate-page-meta-console-error-count.js +45 -0
  429. package/lib/migrate-page-meta-custom-element-count.d.ts +33 -0
  430. package/lib/migrate-page-meta-custom-element-count.js +51 -0
  431. package/lib/migrate-page-meta-image-scan.d.ts +27 -0
  432. package/lib/migrate-page-meta-image-scan.js +52 -0
  433. package/lib/migrate-page-tags-to-page-technologies.d.ts +39 -0
  434. package/lib/migrate-page-tags-to-page-technologies.js +79 -0
  435. package/lib/migrate-ref-tables.d.ts +25 -0
  436. package/lib/migrate-ref-tables.js +38 -0
  437. package/lib/native-executor/check-native-executor-config.d.ts +17 -0
  438. package/lib/native-executor/check-native-executor-config.js +20 -0
  439. package/lib/page-meta-column-maps.d.ts +32 -0
  440. package/lib/page-meta-column-maps.js +43 -0
  441. package/lib/page.d.ts +546 -0
  442. package/lib/page.js +764 -0
  443. package/lib/peek-archive-lock.d.ts +40 -0
  444. package/lib/peek-archive-lock.js +62 -0
  445. package/lib/populate-entity-tables/collapse-anchor-rows.d.ts +41 -0
  446. package/lib/populate-entity-tables/collapse-anchor-rows.js +87 -0
  447. package/lib/populate-entity-tables/derive-dom-path.d.ts +35 -0
  448. package/lib/populate-entity-tables/derive-dom-path.js +72 -0
  449. package/lib/populate-entity-tables/is-blob-ref-value.d.ts +16 -0
  450. package/lib/populate-entity-tables/is-blob-ref-value.js +19 -0
  451. package/lib/populate-entity-tables/match-images-to-dom-paths.d.ts +66 -0
  452. package/lib/populate-entity-tables/match-images-to-dom-paths.js +96 -0
  453. package/lib/populate-entity-tables/populate-anchor-edges.d.ts +33 -0
  454. package/lib/populate-entity-tables/populate-anchor-edges.js +153 -0
  455. package/lib/populate-entity-tables/populate-content-items.d.ts +40 -0
  456. package/lib/populate-entity-tables/populate-content-items.js +141 -0
  457. package/lib/populate-entity-tables/populate-entities.d.ts +81 -0
  458. package/lib/populate-entity-tables/populate-entities.js +110 -0
  459. package/lib/populate-entity-tables/populate-image-items.d.ts +91 -0
  460. package/lib/populate-entity-tables/populate-image-items.js +226 -0
  461. package/lib/populate-entity-tables/populate-page-meta.d.ts +33 -0
  462. package/lib/populate-entity-tables/populate-page-meta.js +267 -0
  463. package/lib/populate-entity-tables/populate-resource-items.d.ts +22 -0
  464. package/lib/populate-entity-tables/populate-resource-items.js +114 -0
  465. package/lib/populate-entity-tables/populate-resource-ref-edges.d.ts +31 -0
  466. package/lib/populate-entity-tables/populate-resource-ref-edges.js +33 -0
  467. package/lib/populate-entity-tables/resolve-blob-refs.d.ts +31 -0
  468. package/lib/populate-entity-tables/resolve-blob-refs.js +100 -0
  469. package/lib/populate-entity-tables/resolve-content-type-refs.d.ts +22 -0
  470. package/lib/populate-entity-tables/resolve-content-type-refs.js +27 -0
  471. package/lib/populate-entity-tables/resolve-header-sets.d.ts +49 -0
  472. package/lib/populate-entity-tables/resolve-header-sets.js +122 -0
  473. package/lib/populate-entity-tables/resolve-json-refs.d.ts +25 -0
  474. package/lib/populate-entity-tables/resolve-json-refs.js +67 -0
  475. package/lib/populate-entity-tables/resolve-text-refs.d.ts +30 -0
  476. package/lib/populate-entity-tables/resolve-text-refs.js +61 -0
  477. package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.d.ts +21 -0
  478. package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.js +27 -0
  479. package/lib/populate-entity-tables/resolve-url-refs.d.ts +33 -0
  480. package/lib/populate-entity-tables/resolve-url-refs.js +60 -0
  481. package/lib/populate-entity-tables/test-utils/count-rows.d.ts +17 -0
  482. package/lib/populate-entity-tables/test-utils/count-rows.js +20 -0
  483. package/lib/populate-entity-tables/test-utils/seed-content-items.d.ts +25 -0
  484. package/lib/populate-entity-tables/test-utils/seed-content-items.js +42 -0
  485. package/lib/populate-entity-tables/test-utils/setup-entities-db.d.ts +30 -0
  486. package/lib/populate-entity-tables/test-utils/setup-entities-db.js +175 -0
  487. package/lib/populate-entity-tables/types.d.ts +157 -0
  488. package/lib/populate-entity-tables/types.js +12 -0
  489. package/lib/populate-entity-tables/upsert-text-refs.d.ts +38 -0
  490. package/lib/populate-entity-tables/upsert-text-refs.js +78 -0
  491. package/lib/populate-ref-tables/classify-content-type.d.ts +16 -0
  492. package/lib/populate-ref-tables/classify-content-type.js +52 -0
  493. package/lib/populate-ref-tables/compute-content-hash.d.ts +22 -0
  494. package/lib/populate-ref-tables/compute-content-hash.js +26 -0
  495. package/lib/populate-ref-tables/compute-header-flags.d.ts +16 -0
  496. package/lib/populate-ref-tables/compute-header-flags.js +70 -0
  497. package/lib/populate-ref-tables/content-type-rules.d.ts +38 -0
  498. package/lib/populate-ref-tables/content-type-rules.js +133 -0
  499. package/lib/populate-ref-tables/create-header-table-caches.d.ts +25 -0
  500. package/lib/populate-ref-tables/create-header-table-caches.js +49 -0
  501. package/lib/populate-ref-tables/data-uri-url-refs-limit.d.ts +15 -0
  502. package/lib/populate-ref-tables/data-uri-url-refs-limit.js +15 -0
  503. package/lib/populate-ref-tables/decode-data-uri.d.ts +21 -0
  504. package/lib/populate-ref-tables/decode-data-uri.js +126 -0
  505. package/lib/populate-ref-tables/decompose-header-set.d.ts +29 -0
  506. package/lib/populate-ref-tables/decompose-header-set.js +157 -0
  507. package/lib/populate-ref-tables/decompose-url.d.ts +25 -0
  508. package/lib/populate-ref-tables/decompose-url.js +70 -0
  509. package/lib/populate-ref-tables/header-stability.d.ts +19 -0
  510. package/lib/populate-ref-tables/header-stability.js +22 -0
  511. package/lib/populate-ref-tables/header-value-cache-key.d.ts +17 -0
  512. package/lib/populate-ref-tables/header-value-cache-key.js +19 -0
  513. package/lib/populate-ref-tables/normalize-mime.d.ts +24 -0
  514. package/lib/populate-ref-tables/normalize-mime.js +36 -0
  515. package/lib/populate-ref-tables/populate-blob-refs.d.ts +38 -0
  516. package/lib/populate-ref-tables/populate-blob-refs.js +134 -0
  517. package/lib/populate-ref-tables/populate-content-type-refs.d.ts +27 -0
  518. package/lib/populate-ref-tables/populate-content-type-refs.js +70 -0
  519. package/lib/populate-ref-tables/populate-header-tables.d.ts +35 -0
  520. package/lib/populate-ref-tables/populate-header-tables.js +80 -0
  521. package/lib/populate-ref-tables/populate-json-refs.d.ts +29 -0
  522. package/lib/populate-ref-tables/populate-json-refs.js +101 -0
  523. package/lib/populate-ref-tables/populate-refs.d.ts +51 -0
  524. package/lib/populate-ref-tables/populate-refs.js +62 -0
  525. package/lib/populate-ref-tables/populate-text-refs.d.ts +32 -0
  526. package/lib/populate-ref-tables/populate-text-refs.js +133 -0
  527. package/lib/populate-ref-tables/populate-url-refs.d.ts +28 -0
  528. package/lib/populate-ref-tables/populate-url-refs.js +148 -0
  529. package/lib/populate-ref-tables/test-utils/count-rows.d.ts +15 -0
  530. package/lib/populate-ref-tables/test-utils/count-rows.js +17 -0
  531. package/lib/populate-ref-tables/types.d.ts +197 -0
  532. package/lib/populate-ref-tables/types.js +7 -0
  533. package/lib/populate-ref-tables/upsert-one-header-set.d.ts +34 -0
  534. package/lib/populate-ref-tables/upsert-one-header-set.js +208 -0
  535. package/lib/populate-ref-tables/volatile-header-names.d.ts +20 -0
  536. package/lib/populate-ref-tables/volatile-header-names.js +33 -0
  537. package/lib/redirect-table.d.ts +9 -0
  538. package/lib/redirect-table.js +28 -0
  539. package/lib/release-finished-statements.d.ts +42 -0
  540. package/lib/release-finished-statements.js +45 -0
  541. package/lib/resolve-redirect-chain.d.ts +33 -0
  542. package/lib/resolve-redirect-chain.js +27 -0
  543. package/lib/resource.d.ts +46 -0
  544. package/lib/resource.js +62 -0
  545. package/lib/retarget-legacy-fk-tables.d.ts +61 -0
  546. package/lib/retarget-legacy-fk-tables.js +137 -0
  547. package/lib/safe-path.d.ts +9 -0
  548. package/lib/safe-path.js +17 -0
  549. package/lib/scope/build-scope-map.d.ts +21 -0
  550. package/lib/scope/build-scope-map.js +32 -0
  551. package/lib/scope/find-scope-entry.d.ts +25 -0
  552. package/lib/scope/find-scope-entry.js +45 -0
  553. package/lib/template-classification/classify-archive-page-templates.d.ts +42 -0
  554. package/lib/template-classification/classify-archive-page-templates.js +70 -0
  555. package/lib/template-classification/classify-page-templates.d.ts +33 -0
  556. package/lib/template-classification/classify-page-templates.js +60 -0
  557. package/lib/template-classification/collect-page-ids-with-html.d.ts +24 -0
  558. package/lib/template-classification/collect-page-ids-with-html.js +30 -0
  559. package/lib/template-classification/collect-page-stylesheet-urls.d.ts +32 -0
  560. package/lib/template-classification/collect-page-stylesheet-urls.js +130 -0
  561. package/lib/template-classification/create-content-root-hint.d.ts +41 -0
  562. package/lib/template-classification/create-content-root-hint.js +51 -0
  563. package/lib/template-classification/create-page-cluster-factory.d.ts +36 -0
  564. package/lib/template-classification/create-page-cluster-factory.js +52 -0
  565. package/lib/template-classification/load-page-cluster-candidates.d.ts +32 -0
  566. package/lib/template-classification/load-page-cluster-candidates.js +93 -0
  567. package/lib/template-classification/page-cluster/resolve-page-cluster-keys.d.ts +34 -0
  568. package/lib/template-classification/page-cluster/resolve-page-cluster-keys.js +236 -0
  569. package/lib/template-classification/page-cluster/types.d.ts +123 -0
  570. package/lib/template-classification/page-cluster/types.js +1 -0
  571. package/lib/template-classification/types.d.ts +234 -0
  572. package/lib/template-classification/types.js +1 -0
  573. package/lib/test-utils/build-full-schema-test-db.d.ts +34 -0
  574. package/lib/test-utils/build-full-schema-test-db.js +74 -0
  575. package/lib/test-utils/create-legacy-analysis-tables.d.ts +13 -0
  576. package/lib/test-utils/create-legacy-analysis-tables.js +37 -0
  577. package/lib/test-utils/fk-parent-tables.d.ts +15 -0
  578. package/lib/test-utils/fk-parent-tables.js +19 -0
  579. package/lib/test-utils/seed-content-item.d.ts +35 -0
  580. package/lib/test-utils/seed-content-item.js +42 -0
  581. package/lib/test-utils/setup-legacy-fk-db.d.ts +34 -0
  582. package/lib/test-utils/setup-legacy-fk-db.js +271 -0
  583. package/lib/transfer/attach-source-database.d.ts +31 -0
  584. package/lib/transfer/attach-source-database.js +40 -0
  585. package/lib/transfer/build-split-config.d.ts +30 -0
  586. package/lib/transfer/build-split-config.js +42 -0
  587. package/lib/transfer/clear-replaced-page-rows.d.ts +23 -0
  588. package/lib/transfer/clear-replaced-page-rows.js +61 -0
  589. package/lib/transfer/concat-archives.d.ts +55 -0
  590. package/lib/transfer/concat-archives.js +95 -0
  591. package/lib/transfer/concat-source-transfer-phases.d.ts +10 -0
  592. package/lib/transfer/concat-source-transfer-phases.js +17 -0
  593. package/lib/transfer/content-item-rank-sql.d.ts +21 -0
  594. package/lib/transfer/content-item-rank-sql.js +23 -0
  595. package/lib/transfer/copy-anchor-edges.d.ts +28 -0
  596. package/lib/transfer/copy-anchor-edges.js +42 -0
  597. package/lib/transfer/copy-dictionaries-for-concat.d.ts +39 -0
  598. package/lib/transfer/copy-dictionaries-for-concat.js +81 -0
  599. package/lib/transfer/copy-dictionaries-for-split.d.ts +29 -0
  600. package/lib/transfer/copy-dictionaries-for-split.js +224 -0
  601. package/lib/transfer/copy-header-set-children.d.ts +27 -0
  602. package/lib/transfer/copy-header-set-children.js +51 -0
  603. package/lib/transfer/copy-image-items.d.ts +21 -0
  604. package/lib/transfer/copy-image-items.js +62 -0
  605. package/lib/transfer/copy-inventory-source-lists.d.ts +30 -0
  606. package/lib/transfer/copy-inventory-source-lists.js +61 -0
  607. package/lib/transfer/copy-journal-tables.d.ts +30 -0
  608. package/lib/transfer/copy-journal-tables.js +56 -0
  609. package/lib/transfer/copy-page-console-logs.d.ts +16 -0
  610. package/lib/transfer/copy-page-console-logs.js +27 -0
  611. package/lib/transfer/copy-page-html-blobs.d.ts +31 -0
  612. package/lib/transfer/copy-page-html-blobs.js +43 -0
  613. package/lib/transfer/copy-page-meta.d.ts +27 -0
  614. package/lib/transfer/copy-page-meta.js +68 -0
  615. package/lib/transfer/copy-page-template-clusters.d.ts +31 -0
  616. package/lib/transfer/copy-page-template-clusters.js +56 -0
  617. package/lib/transfer/copy-page-template-labels.d.ts +34 -0
  618. package/lib/transfer/copy-page-template-labels.js +88 -0
  619. package/lib/transfer/copy-resource-items.d.ts +29 -0
  620. package/lib/transfer/copy-resource-items.js +89 -0
  621. package/lib/transfer/copy-resource-ref-edges.d.ts +20 -0
  622. package/lib/transfer/copy-resource-ref-edges.js +33 -0
  623. package/lib/transfer/copy-simple-page-scoped-tables.d.ts +15 -0
  624. package/lib/transfer/copy-simple-page-scoped-tables.js +34 -0
  625. package/lib/transfer/count-external-pages-in-scope.d.ts +26 -0
  626. package/lib/transfer/count-external-pages-in-scope.js +40 -0
  627. package/lib/transfer/create-transfer-temp-tables.d.ts +30 -0
  628. package/lib/transfer/create-transfer-temp-tables.js +59 -0
  629. package/lib/transfer/dictionary-copy-specs.d.ts +32 -0
  630. package/lib/transfer/dictionary-copy-specs.js +28 -0
  631. package/lib/transfer/drop-transfer-temp-tables.d.ts +9 -0
  632. package/lib/transfer/drop-transfer-temp-tables.js +18 -0
  633. package/lib/transfer/flatten-redirect-chains.d.ts +44 -0
  634. package/lib/transfer/flatten-redirect-chains.js +74 -0
  635. package/lib/transfer/insert-content-items.d.ts +35 -0
  636. package/lib/transfer/insert-content-items.js +116 -0
  637. package/lib/transfer/list-transfer-columns.d.ts +35 -0
  638. package/lib/transfer/list-transfer-columns.js +45 -0
  639. package/lib/transfer/mark-in-scope-content-items.d.ts +31 -0
  640. package/lib/transfer/mark-in-scope-content-items.js +54 -0
  641. package/lib/transfer/merge-archive-configs.d.ts +51 -0
  642. package/lib/transfer/merge-archive-configs.js +85 -0
  643. package/lib/transfer/plan-content-items-for-concat.d.ts +33 -0
  644. package/lib/transfer/plan-content-items-for-concat.js +51 -0
  645. package/lib/transfer/plan-content-items-for-split.d.ts +42 -0
  646. package/lib/transfer/plan-content-items-for-split.js +83 -0
  647. package/lib/transfer/plan-resource-items.d.ts +40 -0
  648. package/lib/transfer/plan-resource-items.js +69 -0
  649. package/lib/transfer/quote-transfer-identifier.d.ts +18 -0
  650. package/lib/transfer/quote-transfer-identifier.js +20 -0
  651. package/lib/transfer/reclassify-resource-externality.d.ts +37 -0
  652. package/lib/transfer/reclassify-resource-externality.js +66 -0
  653. package/lib/transfer/remap-redirect-dest-ids.d.ts +34 -0
  654. package/lib/transfer/remap-redirect-dest-ids.js +51 -0
  655. package/lib/transfer/replace-content-items.d.ts +39 -0
  656. package/lib/transfer/replace-content-items.js +83 -0
  657. package/lib/transfer/simple-page-scoped-tables.d.ts +25 -0
  658. package/lib/transfer/simple-page-scoped-tables.js +38 -0
  659. package/lib/transfer/split-archive.d.ts +55 -0
  660. package/lib/transfer/split-archive.js +98 -0
  661. package/lib/transfer/split-source-transfer-phases.d.ts +11 -0
  662. package/lib/transfer/split-source-transfer-phases.js +18 -0
  663. package/lib/transfer/transfer-action.d.ts +34 -0
  664. package/lib/transfer/transfer-action.js +32 -0
  665. package/lib/transfer/transfer-archive-rows.d.ts +65 -0
  666. package/lib/transfer/transfer-archive-rows.js +156 -0
  667. package/lib/transfer/transfer-dictionary-tables.d.ts +12 -0
  668. package/lib/transfer/transfer-dictionary-tables.js +22 -0
  669. package/lib/transfer/transfer-post-phases.d.ts +10 -0
  670. package/lib/transfer/transfer-post-phases.js +13 -0
  671. package/lib/transfer/transfer-source-alias.d.ts +9 -0
  672. package/lib/transfer/transfer-source-alias.js +9 -0
  673. package/lib/transfer/types.d.ts +111 -0
  674. package/lib/transfer/types.js +35 -0
  675. package/lib/types.d.ts +772 -0
  676. package/lib/types.js +1 -0
  677. package/lib/url-alias/compute-tier-a-alias-key.d.ts +44 -0
  678. package/lib/url-alias/compute-tier-a-alias-key.js +47 -0
  679. package/lib/url-alias/compute-tier-b-alias-key.d.ts +23 -0
  680. package/lib/url-alias/compute-tier-b-alias-key.js +26 -0
  681. package/lib/url-alias/group-alias-candidates.d.ts +27 -0
  682. package/lib/url-alias/group-alias-candidates.js +29 -0
  683. package/lib/url-alias/types.d.ts +12 -0
  684. package/lib/url-alias/types.js +1 -0
  685. package/lib/url-pattern/compute-shape-key.d.ts +58 -0
  686. package/lib/url-pattern/compute-shape-key.js +129 -0
  687. package/lib/url-pattern/decompose-url.d.ts +33 -0
  688. package/lib/url-pattern/decompose-url.js +79 -0
  689. package/lib/url-pattern/reconstruct-url.d.ts +15 -0
  690. package/lib/url-pattern/reconstruct-url.js +33 -0
  691. package/lib/url-sort/compute-url-sort-ranks.d.ts +30 -0
  692. package/lib/url-sort/compute-url-sort-ranks.js +33 -0
  693. package/lib/utils/array/each-splitted.d.ts +10 -0
  694. package/lib/utils/array/each-splitted.js +14 -0
  695. package/lib/utils/debug.d.ts +8 -0
  696. package/lib/utils/debug.js +8 -0
  697. package/lib/utils/error/emit-error-with-retry.d.ts +40 -0
  698. package/lib/utils/error/emit-error-with-retry.js +44 -0
  699. package/lib/utils/error/emit-error.d.ts +39 -0
  700. package/lib/utils/error/emit-error.js +41 -0
  701. package/lib/utils/object/parse-response-headers.d.ts +12 -0
  702. package/lib/utils/object/parse-response-headers.js +26 -0
  703. package/lib/utils/object/redact-request-headers.d.ts +15 -0
  704. package/lib/utils/object/redact-request-headers.js +27 -0
  705. package/lib/utils/types/types.d.ts +383 -0
  706. package/lib/utils/types/types.js +1 -0
  707. package/lib/verify-migration/capture-rejection.d.ts +24 -0
  708. package/lib/verify-migration/capture-rejection.js +31 -0
  709. package/lib/verify-migration/check-anchor-edges-count.d.ts +34 -0
  710. package/lib/verify-migration/check-anchor-edges-count.js +72 -0
  711. package/lib/verify-migration/check-anchor-edges-sum.d.ts +13 -0
  712. package/lib/verify-migration/check-anchor-edges-sum.js +27 -0
  713. package/lib/verify-migration/check-content-items-count.d.ts +16 -0
  714. package/lib/verify-migration/check-content-items-count.js +30 -0
  715. package/lib/verify-migration/check-content-type-preservation.d.ts +22 -0
  716. package/lib/verify-migration/check-content-type-preservation.js +40 -0
  717. package/lib/verify-migration/check-foreign-key-integrity.d.ts +31 -0
  718. package/lib/verify-migration/check-foreign-key-integrity.js +47 -0
  719. package/lib/verify-migration/check-image-items-count.d.ts +12 -0
  720. package/lib/verify-migration/check-image-items-count.js +26 -0
  721. package/lib/verify-migration/check-page-meta-count.d.ts +15 -0
  722. package/lib/verify-migration/check-page-meta-count.js +31 -0
  723. package/lib/verify-migration/check-reader-parity.d.ts +23 -0
  724. package/lib/verify-migration/check-reader-parity.js +182 -0
  725. package/lib/verify-migration/check-resource-items-count.d.ts +17 -0
  726. package/lib/verify-migration/check-resource-items-count.js +33 -0
  727. package/lib/verify-migration/check-url-round-trip.d.ts +43 -0
  728. package/lib/verify-migration/check-url-round-trip.js +112 -0
  729. package/lib/verify-migration/types.d.ts +70 -0
  730. package/lib/verify-migration/types.js +63 -0
  731. package/lib/verify-migration/verify-migration.d.ts +41 -0
  732. package/lib/verify-migration/verify-migration.js +120 -0
  733. package/lib/with-bulk-write-pragmas.d.ts +51 -0
  734. package/lib/with-bulk-write-pragmas.js +132 -0
  735. package/lib/write-queue.d.ts +32 -0
  736. package/lib/write-queue.js +55 -0
  737. package/package.json +360 -5
@@ -0,0 +1,419 @@
1
+ import { tryParseUrl as parseUrl } from '@d-zero/shared/parse-url';
2
+ import { computeBodyHash } from '../../../body-hash/compute-body-hash.js';
3
+ import { isHtmlContentType } from '../../../content-type/is-html-content-type.js';
4
+ import { dbLog } from '../../../debug.js';
5
+ import { deriveLineageFromParent } from '../../../derive-lineage-from-parent.js';
6
+ import { matchImagesToDomPaths } from '../../../populate-entity-tables/match-images-to-dom-paths.js';
7
+ import { upsertTextRefs } from '../../../populate-entity-tables/upsert-text-refs.js';
8
+ import { resolveRedirectChain } from '../../../resolve-redirect-chain.js';
9
+ import { eachSplitted } from '../../../utils/array/each-splitted.js';
10
+ import { clearWriteRefCaches } from '../../_shared/clear-write-ref-caches.js';
11
+ import { resolveContentItemId } from '../../_shared/resolve-content-item-id.js';
12
+ import { resolveUrlOrBlob } from '../../_shared/resolve-url-or-blob.js';
13
+ import { insertAudios } from './insert-audios.js';
14
+ import { insertButtons } from './insert-buttons.js';
15
+ import { insertCanvases } from './insert-canvases.js';
16
+ import { insertCustomElements } from './insert-custom-elements.js';
17
+ import { insertHeadings } from './insert-headings.js';
18
+ import { insertIframes } from './insert-iframes.js';
19
+ import { insertJsonLd } from './insert-jsonld.js';
20
+ import { insertMainContentImages } from './insert-main-content-images.js';
21
+ import { insertMainContentTables } from './insert-main-content-tables.js';
22
+ import { insertPage } from './insert-page.js';
23
+ import { insertTechnologies } from './insert-technologies.js';
24
+ import { insertVideos } from './insert-videos.js';
25
+ import { linkRedirectSources } from './link-redirect-sources.js';
26
+ import { writePageHtmlBlob } from './write-page-html-blob.js';
27
+ /**
28
+ * Inserts or updates a crawled page — `content_items` + `page_meta` plus its
29
+ * redirect chain, `anchor_edges`, `image_items`, and (when `writeHtml`) its
30
+ * compressed HTML snapshot BLOB.
31
+ *
32
+ * Self-redirects (where the source URL equals the destination URL after
33
+ * normalization) are skipped to avoid marking a page as redirected to itself
34
+ * — a situation caused by authentication challenges (e.g. Basic Auth 302)
35
+ * that would otherwise exclude the page from reports via the
36
+ * `whereNull('redirect_dest_id')` filter.
37
+ * @param knex - Knex query builder connected to the archive DB.
38
+ * @param caches - The connection's write-side id caches.
39
+ * @param page - The page data to store, optionally carrying the in-browser
40
+ * dom-path capture (see {@link PageDataWithDomPaths}).
41
+ * @param writeHtml - When `true`, this call is allowed to insert (or clear)
42
+ * the page's HTML blob. `setExternalPage` passes `false` because external
43
+ * metadata-only scrapes never carry HTML and must not perturb an already
44
+ * stored body.
45
+ * @param isTarget - Whether this page is a crawl target.
46
+ * @param source - Provenance label written ONLY when the row is freshly
47
+ * inserted. Existing rows keep their original `source` (this is why a
48
+ * second `crawl --inventory` does not "demote" an `'inventory-seed'` row
49
+ * that was discovered earlier).
50
+ * @param bodyHash - Precomputed body hash for the page's HTML (see
51
+ * `CrawlerEventTypes.page.bodyHash`). `undefined`/`null` falls back to
52
+ * computing it from the HTML instead.
53
+ * @param recursive - The crawl session's `recursive` option, forwarded to
54
+ * `replaceAnchorEdges` so it can compute each discovered anchor's
55
+ * `is_metadata_only` value the same way `processAnchors`
56
+ * (`handle-scrape-end.ts`) decides whether to queue it for a full or
57
+ * metadata-only scrape (#369). Defaults to `true` (the historical,
58
+ * pre-#369 behaviour: never persist an anchor as metadata-only) for
59
+ * callers that do not track the option, such as `setExternalPage`, whose
60
+ * anchor list is always empty anyway.
61
+ * @returns The database `pageId` (`content_items.id`) of the inserted or updated row.
62
+ */
63
+ export async function updatePage(knex, caches, page, writeHtml, isTarget, source, bodyHash, recursive = true) {
64
+ const { destUrl, sources } = resolveRedirectChain(page.url.withoutHashAndAuth, page.redirectPaths);
65
+ const destUrlObject = parseUrl(destUrl);
66
+ if (!destUrlObject) {
67
+ throw new Error(`Failed to parse URL: ${destUrl}`);
68
+ }
69
+ try {
70
+ return await knex.transaction(async (trx) => {
71
+ return await updatePageInTransaction(trx, knex, caches, page, destUrlObject, sources, writeHtml, isTarget, source, bodyHash, recursive);
72
+ });
73
+ }
74
+ catch (error) {
75
+ // A rolled-back transaction can leave ids cached that no longer
76
+ // correspond to any row (AUTOINCREMENT never rewinds) — see
77
+ // `clearWriteRefCaches` for why a full clear, not a partial one,
78
+ // is required. `emitErrorAndRetry` may retry this whole call, so
79
+ // the cache must be clean before the next attempt.
80
+ clearWriteRefCaches(caches);
81
+ throw error;
82
+ }
83
+ }
84
+ /**
85
+ * The transactional body of {@link updatePage}, extracted so the
86
+ * transaction boundary in the caller can wrap it in a try/catch for
87
+ * cache invalidation on rollback.
88
+ * @param trx - The active transaction.
89
+ * @param knex - Knex query builder connected to the archive DB (passed
90
+ * through to `insertPage` for its `trx ?? knex` fallback contract).
91
+ * @param caches - The connection's write-side id caches.
92
+ * @param page - The page data to store.
93
+ * @param destUrlObject - The parsed redirect-chain destination URL.
94
+ * @param sources - Redirect-source URLs from the chain resolution.
95
+ * @param writeHtml - See {@link updatePage}.
96
+ * @param isTarget - See {@link updatePage}.
97
+ * @param source - See {@link updatePage}.
98
+ * @param bodyHash - See {@link updatePage}.
99
+ * @param recursive - See {@link updatePage}.
100
+ * @returns The `content_items.id` of the inserted or updated row.
101
+ */
102
+ async function updatePageInTransaction(trx, knex, caches, page, destUrlObject, sources, writeHtml, isTarget, source, bodyHash, recursive) {
103
+ const pageId = await insertPage(knex, caches, {
104
+ ...page,
105
+ url: destUrlObject,
106
+ }, isTarget, trx, source);
107
+ // Technology detection combines a Wappalyzer signal source (HTML-body
108
+ // independent — relies on `<script src>` / `<iframe src>` / window
109
+ // globals / response headers, so it fires for every page including
110
+ // external / metadata-only) with structural signals that scan
111
+ // `page.html` (naturally a no-op against the empty string an
112
+ // external/metadata-only scrape leaves it as). Both run unconditionally,
113
+ // unlike JSON-LD below, which lives inside the rendered HTML body and
114
+ // is only written when there is HTML to scrape — see the same
115
+ // `writeHtml` gate as `writePageHtmlBlob` below.
116
+ await insertTechnologies(pageId, page.html, page.meta, trx);
117
+ if (writeHtml) {
118
+ await insertJsonLd(pageId, page.meta, trx);
119
+ }
120
+ // beholder's MainContentsData is captured in the same render pass as the
121
+ // HTML body / JSON-LD, so it shares the same `writeHtml` + non-null gate:
122
+ // external / non-HTML / metadata-only scrapes never populate it.
123
+ if (writeHtml && page.mainContents) {
124
+ await insertHeadings(pageId, page.mainContents, trx);
125
+ await insertMainContentImages(pageId, page.mainContents, trx);
126
+ await insertMainContentTables(pageId, page.mainContents, trx);
127
+ await insertButtons(pageId, page.mainContents, trx);
128
+ await insertIframes(pageId, page.mainContents, trx);
129
+ await insertVideos(pageId, page.mainContents, trx);
130
+ await insertAudios(pageId, page.mainContents, trx);
131
+ await insertCanvases(pageId, page.mainContents, trx);
132
+ // Unlike the eight calls above, the source here is nitpicker's own
133
+ // `capture-custom-elements.ts` capture, not `page.mainContents` — see
134
+ // `insert-custom-elements.ts`. That capture can fail independently
135
+ // of `page.mainContents` (a separate `page.evaluate()` call), so
136
+ // `undefined` (capture failed) must skip the call entirely — passing
137
+ // a defaulted `[]` would look identical to "found zero" and, per
138
+ // `insertCustomElements`'s docs, wipe stale-but-still-good rows.
139
+ if (page.mainContentCustomElements !== undefined) {
140
+ await insertCustomElements(pageId, page.mainContentCustomElements, trx);
141
+ }
142
+ }
143
+ // Chain lineage propagates FROM the originating URL
144
+ // (`page.url`), NOT from the destination. See the matching
145
+ // rationale in `recordRedirect`: intermediates are reached
146
+ // transitively from the originating URL's render, so they
147
+ // inherit its lineage. The `source` argument is the
148
+ // authoritative origin label when inventoryMode is live; fall
149
+ // through to a DB lookup of `page.url` for the resume /
150
+ // retry-failed path where the call-site has no source.
151
+ let originatingSource = source;
152
+ if (originatingSource === undefined) {
153
+ originatingSource = await readSourceByUrl(trx, caches, page.url.withoutHashAndAuth);
154
+ }
155
+ const chainLineageSource = deriveLineageFromParent(originatingSource, 'crawled');
156
+ await linkRedirectSources(trx, caches, sources, pageId, destUrlObject.withoutHashAndAuth, page.isExternal, chainLineageSource);
157
+ // Only insert a snapshot blob when there is actual HTML to write.
158
+ // `page.html.length > 0` is the precise signal: the scraper returns
159
+ // `html: ''` for everything that is not a rendered `text/html` document
160
+ // (non-HTML responses, metadata-only, external, degraded renders), so a
161
+ // non-empty `html` is exactly "a rendered HTML body exists". Gating on
162
+ // `isTarget` alone would store an empty body for every internal non-HTML
163
+ // resource — PDF / zip / images are isTarget=1 (#72).
164
+ //
165
+ // `isTarget` is intentionally NOT part of this condition: it is implied by
166
+ // `html.length > 0` (only in-scope target pages are browser-rendered into a
167
+ // non-empty body; metadata-only and external pages carry `html: ''`), so the
168
+ // content check alone expresses the intent without a redundant term.
169
+ if (writeHtml && page.html.length > 0) {
170
+ await writePageHtmlBlob(pageId, page.html, trx);
171
+ // Prefer the caller's precomputed hash (the crawler already hashed
172
+ // this exact `page.html` once, before this write path ever runs) —
173
+ // falling back to computing it here only when the caller has not
174
+ // (direct callers such as tests, or a future write path that has not
175
+ // adopted the precompute). Either way this stays derived from the
176
+ // same `page.html` written above, in the same transaction, so
177
+ // `page_meta.body_hash` never observably lags the snapshot it was
178
+ // derived from.
179
+ await trx('page_meta')
180
+ .where('page_id', pageId)
181
+ .update({ body_hash: bodyHash ?? computeBodyHash(page.html) });
182
+ }
183
+ else if (writeHtml &&
184
+ page.contentType !== null &&
185
+ !isHtmlContentType(page.contentType)) {
186
+ // The page is now a *known* non-HTML type. If a previous scrape stored
187
+ // an HTML body for this URL (e.g. it served HTML then was replaced by
188
+ // a PDF across `crawl --resume` / `--append`), drop the stale ref so
189
+ // `page_html_ref` never contradicts the content type. A degraded HTML
190
+ // re-scrape (text/html or unknown content type with empty html) is NOT
191
+ // cleared — the last good snapshot is preserved, mirroring the
192
+ // anchors / images empty-guard below. Gated on `writeHtml` because a
193
+ // stale ref can only have been written by a snapshot-capable call
194
+ // (`setPage`); `setExternalPage` passes `writeHtml = false` and never
195
+ // sets `html`, so it has nothing to clear.
196
+ //
197
+ // `page_meta.body_hash` is cleared alongside it for the same reason —
198
+ // it is derived from the same HTML `page_html_ref` points at, so it
199
+ // must not outlive the ref it was computed from.
200
+ await trx('page_html_ref').where('page_id', pageId).delete();
201
+ await trx('page_meta').where('page_id', pageId).update({ body_hash: null });
202
+ }
203
+ // Re-scrape semantics: the same URL can be scraped more than once
204
+ // (e.g. `crawl --resume`, re-visits, `--append` re-promotion). Edges
205
+ // are replaced wholesale per page on every non-empty scrape — the
206
+ // delete is paired with, and guarded by, a non-empty new list: a
207
+ // degraded re-scrape (navigation timeout / partial render) can return
208
+ // an empty `anchorList` for a page that previously had links, and
209
+ // wiping the prior good data in that case would be destructive. We
210
+ // cannot tell a transient empty result apart from a page that has
211
+ // legitimately lost all its links, so we err on the side of keeping
212
+ // what we already had. The accepted trade-off is that a page which
213
+ // genuinely dropped to zero links keeps its stale rows until the next
214
+ // non-empty re-scrape replaces them (#70).
215
+ //
216
+ // Lineage propagation: read the current page's merged source
217
+ // (post-UPDATE by `insertPage`) so anchor placeholder rows inherit a
218
+ // label that reflects the parent's chain. A `'crawled'`-lineage
219
+ // parent passes `'crawled'` explicitly so the crawled-wins downgrade
220
+ // in `resolveContentItemId` fires when an anchor hits an existing
221
+ // `'inventory-*'` row. An inventory-lineage parent passes
222
+ // `'inventory-discovered'` to label transitively-reached URLs
223
+ // correctly without the orchestrator needing to rehydrate
224
+ // `inventoryMode` from disk.
225
+ const [parentRow] = (await trx
226
+ .select('source')
227
+ .from('content_items')
228
+ .where('id', pageId));
229
+ const anchorLineageSource = deriveLineageFromParent(parentRow?.source, 'crawled');
230
+ await replaceAnchorEdges(trx, caches, pageId, page, anchorLineageSource, recursive);
231
+ await replaceImageItems(trx, caches, pageId, page);
232
+ // Clear this page's resource_ref_edges unconditionally (no non-empty
233
+ // guard, unlike anchors/images above): the crawler always emits this
234
+ // page's `responseReferrers` events right after its `page` event (see
235
+ // `Crawler#handleResources`, called immediately after `#handleResult`
236
+ // for the same scrape), through the same serialized WriteQueue, so the
237
+ // fresh INSERT is guaranteed to follow this DELETE in commit order —
238
+ // no writer can interleave a stale re-insert between them. This is a
239
+ // write-ordering guarantee only: the DELETE and the follow-up INSERT
240
+ // are still two separate transactions, so a concurrent read-only
241
+ // connection (viewer / MCP open on the same archive during an active
242
+ // `--append` / `--retry-failed` run) can observe a momentary window
243
+ // with zero rows for this page and misclassify its resources as
244
+ // unused. The window closes as soon as the next transaction commits,
245
+ // so this is a transient display artifact, not a durable data loss —
246
+ // accepted rather than merging the two writes into one transaction.
247
+ // A degraded re-scrape that legitimately captures zero sub-resources
248
+ // leaves this page referrer-less until its next non-empty re-scrape —
249
+ // accepted, since resource_items rows for no-longer-referenced
250
+ // resources are themselves allowed to become orphaned (no cross-page
251
+ // cleanup is attempted for those either).
252
+ await trx('resource_ref_edges').where('page_id', pageId).delete();
253
+ return pageId;
254
+ }
255
+ /**
256
+ * Reads the `source` of the row identified by `url` without creating a
257
+ * placeholder — the cache-first mirror of the legacy by-URL SELECT.
258
+ * Returns `undefined` when no row exists yet.
259
+ * @param trx - The active transaction.
260
+ * @param caches - The connection's write-side id caches (read-only here;
261
+ * a DB fallback does not populate the identity cache because the id is
262
+ * not needed).
263
+ * @param url - Normalised URL key.
264
+ */
265
+ async function readSourceByUrl(trx, caches, url) {
266
+ const cached = caches.contentItems.get(url);
267
+ if (cached !== undefined) {
268
+ return cached.source;
269
+ }
270
+ const [row] = (await trx
271
+ .select('ci.source')
272
+ .from('content_items as ci')
273
+ .join('url_refs as ur', 'ur.id', 'ci.url_id')
274
+ .where('ur.url', url));
275
+ return row?.source;
276
+ }
277
+ /**
278
+ * Replaces the page's `anchor_edges` rows with the aggregate of the new
279
+ * scrape's `anchorList` (empty-guarded; see the caller's re-scrape
280
+ * comment). Instances sharing the same resolved `href_page_id` collapse
281
+ * into one edge whose `count` is the instance count and whose
282
+ * `first_hash` / `first_text_id` capture the first instance encountered
283
+ * in list order — the same first-wins rule the archive migration applies
284
+ * to legacy `anchors` rows.
285
+ * @param trx - The active transaction.
286
+ * @param caches - The connection's write-side id caches.
287
+ * @param pageId - The owning `content_items.id`.
288
+ * @param page - The scraped page payload.
289
+ * @param anchorLineageSource - Lineage label for anchor-target
290
+ * placeholder rows (see the caller's lineage comment).
291
+ * @param recursive - The crawl session's `recursive` option. Combined with
292
+ * each anchor's `isExternal` (already resolved by `processAnchors` before
293
+ * this ever runs) to compute `is_metadata_only` the same way
294
+ * `processAnchors` (`handle-scrape-end.ts`) decides whether to queue the
295
+ * anchor for a full or metadata-only scrape: `!recursive || isExternal`.
296
+ * Both `recursive` and a given URL's `isExternal` are constant for the
297
+ * duration of one `CrawlerOrchestrator#crawling()` invocation (this is a
298
+ * pure recomputation of that call's own decision, not a second source of
299
+ * truth, #369) — NOT necessarily across the whole session:
300
+ * `#crawlUntilPendingClears`'s auto-retry loop (issue #350) always
301
+ * re-invokes `crawling([], { recursive: false, isRetryContinuation: true })`
302
+ * for a retry round regardless of the session's original `recursive`
303
+ * value, so the SAME URL anchored again during a retry round can compute
304
+ * a different `is_metadata_only` verdict than it did on the original
305
+ * pass. `resolveContentItemId`'s ratchet lets the later call's opinion
306
+ * win, same as it does for any other repeat discovery.
307
+ */
308
+ async function replaceAnchorEdges(trx, caches, pageId, page, anchorLineageSource, recursive) {
309
+ if (page.anchorList.length === 0) {
310
+ return;
311
+ }
312
+ const edges = new Map();
313
+ for (const anchor of page.anchorList) {
314
+ const isExternal = anchor.isExternal ?? false;
315
+ const hrefId = await resolveContentItemId(trx, caches, anchor.href.withoutHashAndAuth, {
316
+ isExternal: isExternal ? 1 : 0,
317
+ source: anchorLineageSource,
318
+ isMetadataOnly: !recursive || isExternal ? 1 : 0,
319
+ });
320
+ const existing = edges.get(hrefId);
321
+ if (existing !== undefined) {
322
+ existing.count += 1;
323
+ continue;
324
+ }
325
+ edges.set(hrefId, {
326
+ count: 1,
327
+ firstHash: anchor.href.hash || null,
328
+ firstText: anchor.textContent || null,
329
+ });
330
+ }
331
+ const texts = new Set();
332
+ for (const edge of edges.values()) {
333
+ if (edge.firstText !== null) {
334
+ texts.add(edge.firstText);
335
+ }
336
+ }
337
+ const textIds = await upsertTextRefs(trx, texts);
338
+ dbLog('Replace anchor_edges: %d edges (%d instances)', edges.size, page.anchorList.length);
339
+ await trx('anchor_edges').where('page_id', pageId).delete();
340
+ const rows = [...edges.entries()].map(([hrefPageId, edge]) => ({
341
+ page_id: pageId,
342
+ href_page_id: hrefPageId,
343
+ count: edge.count,
344
+ first_hash: edge.firstHash,
345
+ first_text_id: edge.firstText === null ? null : (textIds.get(edge.firstText) ?? null),
346
+ }));
347
+ await eachSplitted(rows, 100, async (chunk) => {
348
+ await trx('anchor_edges').insert(chunk);
349
+ });
350
+ }
351
+ /**
352
+ * Replaces the page's `image_items` rows with the new scrape's
353
+ * `imageList` (empty-guarded; see the caller's re-scrape comment).
354
+ * `src` / `currentSrc` route to `url_refs` or (for large `data:` URIs)
355
+ * `blob_refs`; `dom_path_text_id` resolves by matching each image's
356
+ * `sourceCode` against the in-browser capture carried on
357
+ * `page.imageDomPaths`, falling back to the synthetic `unknown/<n>`
358
+ * marker per image when the capture is absent or ambiguous.
359
+ * @param trx - The active transaction.
360
+ * @param caches - The connection's write-side id caches.
361
+ * @param pageId - The owning `content_items.id`.
362
+ * @param page - The scraped page payload.
363
+ */
364
+ async function replaceImageItems(trx, caches, pageId, page) {
365
+ if (page.imageList.length === 0) {
366
+ return;
367
+ }
368
+ // Match by list index: ids only need to be unique within this call and
369
+ // ordered in insertion order, which the list order is by construction.
370
+ const domPaths = matchImagesToDomPaths(page.imageList.map((image, index) => ({
371
+ id: index,
372
+ sourceCode: image.sourceCode || null,
373
+ })), page.imageDomPaths ?? []);
374
+ const texts = new Set();
375
+ for (const image of page.imageList) {
376
+ if (typeof image.alt === 'string' && image.alt !== '') {
377
+ texts.add(image.alt);
378
+ }
379
+ }
380
+ for (const entry of domPaths.values()) {
381
+ texts.add(entry.path);
382
+ }
383
+ const textIds = await upsertTextRefs(trx, texts);
384
+ const rows = [];
385
+ for (const [index, image] of page.imageList.entries()) {
386
+ const domPath = domPaths.get(index);
387
+ if (domPath === undefined) {
388
+ throw new Error(`replaceImageItems: dom_path not resolved for image #${index}`);
389
+ }
390
+ const domPathId = textIds.get(domPath.path);
391
+ if (domPathId === undefined) {
392
+ throw new Error(`replaceImageItems: text_refs.id not resolved for dom_path=${domPath.path}`);
393
+ }
394
+ const srcSlot = await resolveUrlOrBlob(trx, caches, image.src);
395
+ const currentSrcSlot = await resolveUrlOrBlob(trx, caches, image.currentSrc);
396
+ rows.push({
397
+ page_id: pageId,
398
+ src_url_id: srcSlot.url,
399
+ current_src_url_id: currentSrcSlot.url,
400
+ src_blob_id: srcSlot.blob,
401
+ current_src_blob_id: currentSrcSlot.blob,
402
+ alt_text_id: typeof image.alt === 'string' && image.alt !== ''
403
+ ? (textIds.get(image.alt) ?? null)
404
+ : null,
405
+ width: image.width,
406
+ height: image.height,
407
+ natural_width: image.naturalWidth,
408
+ natural_height: image.naturalHeight,
409
+ is_lazy: image.isLazy == null ? null : image.isLazy ? 1 : 0,
410
+ viewport_width: image.viewportWidth,
411
+ dom_path_text_id: domPathId,
412
+ });
413
+ }
414
+ dbLog('Replace image_items: %d rows', rows.length);
415
+ await trx('image_items').where('page_id', pageId).delete();
416
+ await eachSplitted(rows, 100, async (chunk) => {
417
+ await trx('image_items').insert(chunk);
418
+ });
419
+ }
@@ -0,0 +1,19 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Encodes, dedups, and persists a page's HTML snapshot.
4
+ *
5
+ * Computes SHA-256 over the raw UTF-8 bytes, compresses them with zstd,
6
+ * inserts into `page_html_blobs` only if the hash is new (so identical
7
+ * bodies — 404 templates, error pages, redirect destinations — share a
8
+ * single row), and then upserts `page_html_ref(page_id → hash)` so the
9
+ * latest scrape always points at the right body.
10
+ *
11
+ * Runs entirely inside the caller's transaction; a failure here rolls
12
+ * back the rest of `updatePage`, which is the desired semantics (an
13
+ * archive that lost its HTML for a page would otherwise serve stale
14
+ * meta against a missing body).
15
+ * @param pageId - The database id of the page.
16
+ * @param html - The raw HTML string (UTF-8).
17
+ * @param trx - The active transaction.
18
+ */
19
+ export declare function writePageHtmlBlob(pageId: number, html: string, trx: Knex.Transaction): Promise<void>;
@@ -0,0 +1,41 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { compressPayload } from '../../_shared/compress-payload.js';
3
+ /**
4
+ * Encodes, dedups, and persists a page's HTML snapshot.
5
+ *
6
+ * Computes SHA-256 over the raw UTF-8 bytes, compresses them with zstd,
7
+ * inserts into `page_html_blobs` only if the hash is new (so identical
8
+ * bodies — 404 templates, error pages, redirect destinations — share a
9
+ * single row), and then upserts `page_html_ref(page_id → hash)` so the
10
+ * latest scrape always points at the right body.
11
+ *
12
+ * Runs entirely inside the caller's transaction; a failure here rolls
13
+ * back the rest of `updatePage`, which is the desired semantics (an
14
+ * archive that lost its HTML for a page would otherwise serve stale
15
+ * meta against a missing body).
16
+ * @param pageId - The database id of the page.
17
+ * @param html - The raw HTML string (UTF-8).
18
+ * @param trx - The active transaction.
19
+ */
20
+ export async function writePageHtmlBlob(pageId, html, trx) {
21
+ const rawBytes = Buffer.from(html, 'utf8');
22
+ const hash = createHash('sha256').update(rawBytes).digest();
23
+ const { body, codec, sizeRaw, sizeStored } = compressPayload(rawBytes);
24
+ await trx('page_html_blobs')
25
+ .insert({
26
+ hash,
27
+ body,
28
+ codec,
29
+ size_raw: sizeRaw,
30
+ size_stored: sizeStored,
31
+ })
32
+ .onConflict('hash')
33
+ .ignore();
34
+ // Upsert so a re-scrape's body cleanly supersedes the prior pointer.
35
+ // The old blob row is intentionally left in place — a future #23 GC
36
+ // pass will sweep unreachable hashes.
37
+ await trx('page_html_ref')
38
+ .insert({ page_id: pageId, hash })
39
+ .onConflict('page_id')
40
+ .merge(['hash']);
41
+ }
@@ -0,0 +1,9 @@
1
+ import type { DB_Redirect } from '../../types.js';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Retrieves redirect sources for the given page IDs in bulk.
5
+ * @param knex - Knex query builder connected to the archive DB.
6
+ * @param pageIds - The database IDs of the destination pages.
7
+ * @returns An array of {@link DB_Redirect} records mapping destination pages to their redirect sources.
8
+ */
9
+ export declare function getRedirectsForPages(knex: Knex, pageIds: number[]): Promise<DB_Redirect[]>;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Retrieves redirect sources for the given page IDs in bulk.
3
+ * @param knex - Knex query builder connected to the archive DB.
4
+ * @param pageIds - The database IDs of the destination pages.
5
+ * @returns An array of {@link DB_Redirect} records mapping destination pages to their redirect sources.
6
+ */
7
+ export async function getRedirectsForPages(knex, pageIds) {
8
+ if (pageIds.length === 0)
9
+ return [];
10
+ return knex
11
+ .select('content_items.redirect_dest_id as pageId', 'url_refs.url as from', 'content_items.id as fromId')
12
+ .from('content_items')
13
+ .join('url_refs', 'url_refs.id', '=', 'content_items.url_id')
14
+ .whereIn('content_items.redirect_dest_id', pageIds);
15
+ }
@@ -0,0 +1,17 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Retrieves pages that link to a specific page (incoming links / referrers).
4
+ *
5
+ * Incoming links are resolved **through redirects**: an anchor pointing at a
6
+ * redirect source (e.g. `http://x` that 301s to `https://x`) counts as a
7
+ * referrer of the redirect's final destination, not of the source. This keeps
8
+ * backlinks merged on the canonical page instead of splitting them across the
9
+ * `http`/`https` (or any redirect source/dest) pair. The resolution mirrors
10
+ * `getPagesWithRels`' redirect handling — `redirect_dest_id` is
11
+ * pre-flattened to the final destination, so
12
+ * `COALESCE(target.redirect_dest_id, target.id)` is a single hop.
13
+ * @param knex - Knex query builder connected to the archive DB.
14
+ * @param pageId - The database ID of the target page.
15
+ * @returns An array of referrer records with URL, hash, and text content.
16
+ */
17
+ export declare function getReferrersOfPage(knex: Knex, pageId: number): Promise<any[]>;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Retrieves pages that link to a specific page (incoming links / referrers).
3
+ *
4
+ * Incoming links are resolved **through redirects**: an anchor pointing at a
5
+ * redirect source (e.g. `http://x` that 301s to `https://x`) counts as a
6
+ * referrer of the redirect's final destination, not of the source. This keeps
7
+ * backlinks merged on the canonical page instead of splitting them across the
8
+ * `http`/`https` (or any redirect source/dest) pair. The resolution mirrors
9
+ * `getPagesWithRels`' redirect handling — `redirect_dest_id` is
10
+ * pre-flattened to the final destination, so
11
+ * `COALESCE(target.redirect_dest_id, target.id)` is a single hop.
12
+ * @param knex - Knex query builder connected to the archive DB.
13
+ * @param pageId - The database ID of the target page.
14
+ * @returns An array of referrer records with URL, hash, and text content.
15
+ */
16
+ export async function getReferrersOfPage(knex, pageId) {
17
+ const res = await knex
18
+ .select('referrer_url.url as url',
19
+ // `through` / `throughId` = the URL the anchor actually pointed at (the
20
+ // redirect source, e.g. `http://x`), mirroring `getPagesWithRels`'
21
+ // `redirect.from` / `redirect.fromId`. Lets report code print the
22
+ // "[REDIRECTED FROM]" note even on this (non-preloaded) referrer path.
23
+ 'target_url.url as through', 'target.id as throughId', 'anchor_edges.first_hash as hash', 'first_text.text as textContent')
24
+ .from('anchor_edges')
25
+ .join('content_items as referrer', 'anchor_edges.page_id', '=', 'referrer.id')
26
+ .join('url_refs as referrer_url', 'referrer.url_id', '=', 'referrer_url.id')
27
+ .join('content_items as target', 'anchor_edges.href_page_id', '=', 'target.id')
28
+ .join('url_refs as target_url', 'target.url_id', '=', 'target_url.id')
29
+ .leftJoin('text_refs as first_text', 'anchor_edges.first_text_id', '=', 'first_text.id')
30
+ .whereRaw('coalesce("target"."redirect_dest_id", "target"."id") = ?', [pageId]);
31
+ return res;
32
+ }
@@ -0,0 +1,8 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Retrieves the page URLs that reference a specific resource.
4
+ * @param knex - Knex query builder connected to the archive DB.
5
+ * @param id - The database ID of the resource.
6
+ * @returns An array of page URL strings that reference the resource.
7
+ */
8
+ export declare function getReferrersOfResource(knex: Knex, id: number): Promise<string[]>;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Retrieves the page URLs that reference a specific resource.
3
+ * @param knex - Knex query builder connected to the archive DB.
4
+ * @param id - The database ID of the resource.
5
+ * @returns An array of page URL strings that reference the resource.
6
+ */
7
+ export async function getReferrersOfResource(knex, id) {
8
+ const res = await knex
9
+ .select('url_refs.url as url')
10
+ .from('resource_ref_edges')
11
+ .join('content_items', 'content_items.id', '=', 'resource_ref_edges.page_id')
12
+ .join('url_refs', 'url_refs.id', '=', 'content_items.url_id')
13
+ .where('resource_ref_edges.resource_id', id);
14
+ return res.map((r) => r.url);
15
+ }
@@ -0,0 +1,25 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Builds a `resource_items` query joined against `url_refs` and
4
+ * `content_type_refs`, reconstructing a flat, legacy-shaped resource row.
5
+ * Selected columns are aliased to `DB_Resource` field names. `responseHeaders`
6
+ * is NOT reconstructed here (it needs a second, batched pass — see
7
+ * {@link ../resources/reconstruct-resource-rows.js}) so this query stays a
8
+ * single-pass join with no N+1 subqueries; `headerSetId` is selected as an
9
+ * intermediate for that second pass.
10
+ *
11
+ * The `url_refs` join is a LEFT JOIN, not INNER: a resource whose own
12
+ * identity URL is a large `data:` URI has `url_id = NULL` (routed to
13
+ * `url_blob_id` / `blob_refs` instead — see `create-entity-tables.ts`'s
14
+ * `resource_items url / blob mutual-exclusion CHECK`). An INNER JOIN
15
+ * would silently drop such rows from every reader. `url` reads back as
16
+ * `null` for those rows, matching the established `image_items` src /
17
+ * blob convention (`list-images.ts`) — recovering the raw data URI would
18
+ * require zstd-decompression in JS, which no current caller needs.
19
+ * @param knex - Knex query builder connected to the archive DB.
20
+ * @returns A query builder pre-configured with the joins `get-resources.ts` /
21
+ * `get-resource-by-url.ts` need; callers add `.where()` on top.
22
+ * @example
23
+ * const rows = await buildResourceQuery(knex).whereIn('ur.url', urls);
24
+ */
25
+ export declare function buildResourceQuery(knex: Knex): Knex.QueryBuilder;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Builds a `resource_items` query joined against `url_refs` and
3
+ * `content_type_refs`, reconstructing a flat, legacy-shaped resource row.
4
+ * Selected columns are aliased to `DB_Resource` field names. `responseHeaders`
5
+ * is NOT reconstructed here (it needs a second, batched pass — see
6
+ * {@link ../resources/reconstruct-resource-rows.js}) so this query stays a
7
+ * single-pass join with no N+1 subqueries; `headerSetId` is selected as an
8
+ * intermediate for that second pass.
9
+ *
10
+ * The `url_refs` join is a LEFT JOIN, not INNER: a resource whose own
11
+ * identity URL is a large `data:` URI has `url_id = NULL` (routed to
12
+ * `url_blob_id` / `blob_refs` instead — see `create-entity-tables.ts`'s
13
+ * `resource_items url / blob mutual-exclusion CHECK`). An INNER JOIN
14
+ * would silently drop such rows from every reader. `url` reads back as
15
+ * `null` for those rows, matching the established `image_items` src /
16
+ * blob convention (`list-images.ts`) — recovering the raw data URI would
17
+ * require zstd-decompression in JS, which no current caller needs.
18
+ * @param knex - Knex query builder connected to the archive DB.
19
+ * @returns A query builder pre-configured with the joins `get-resources.ts` /
20
+ * `get-resource-by-url.ts` need; callers add `.where()` on top.
21
+ * @example
22
+ * const rows = await buildResourceQuery(knex).whereIn('ur.url', urls);
23
+ */
24
+ export function buildResourceQuery(knex) {
25
+ return knex('resource_items as ri')
26
+ .leftJoin('url_refs as ur', 'ur.id', 'ri.url_id')
27
+ .leftJoin('content_type_refs as ctr', 'ctr.id', 'ri.content_type_id')
28
+ .select('ri.id as id', 'ur.url as url', 'ri.is_external as isExternal', 'ri.status as status', 'ri.status_text as statusText', 'ctr.raw as contentType', 'ri.content_length as contentLength', 'ri.header_set_id as headerSetId', 'ri.compress as compress', 'ri.cdn as cdn', 'ri.source as source');
29
+ }
@@ -0,0 +1,9 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Return the subset of `urls` that already exist as `resource_items` rows.
4
+ * See `getExistingPageUrls` — same chunking strategy.
5
+ * @param knex - Knex query builder connected to the archive DB.
6
+ * @param urls - URL strings to probe.
7
+ * @returns URLs found among `resource_items`.
8
+ */
9
+ export declare function getExistingResourceUrls(knex: Knex, urls: readonly string[]): Promise<string[]>;