@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,14 @@
1
+ /**
2
+ * Retrieves the base URL of the crawl session from the `info` table.
3
+ * @param knex - Knex query builder connected to the archive DB.
4
+ * @returns The base URL string.
5
+ * @throws {Error} If no base URL is found in the database.
6
+ */
7
+ export async function getBaseUrl(knex) {
8
+ const selected = await knex.select('baseUrl').from('info');
9
+ if (!selected[0]) {
10
+ throw new Error('No baseUrl');
11
+ }
12
+ const [{ baseUrl }] = selected;
13
+ return baseUrl || '';
14
+ }
@@ -0,0 +1,10 @@
1
+ import type { Config } from '../../types.js';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Retrieves the full crawl configuration from the `info` table.
5
+ * Deserializes JSON-encoded fields (`roots`, `excludes`, `excludeKeywords`, `excludeUrls`, `requestHeaderNames`).
6
+ * @param knex - Knex query builder connected to the archive DB.
7
+ * @returns The parsed {@link Config} object.
8
+ * @throws {Error} If no configuration is found in the database.
9
+ */
10
+ export declare function getConfig(knex: Knex): Promise<Config>;
@@ -0,0 +1,29 @@
1
+ import { dbLog } from '../../debug.js';
2
+ import { getJSON } from '../../get-json.js';
3
+ /**
4
+ * Retrieves the full crawl configuration from the `info` table.
5
+ * Deserializes JSON-encoded fields (`roots`, `excludes`, `excludeKeywords`, `excludeUrls`, `requestHeaderNames`).
6
+ * @param knex - Knex query builder connected to the archive DB.
7
+ * @returns The parsed {@link Config} object.
8
+ * @throws {Error} If no configuration is found in the database.
9
+ */
10
+ export async function getConfig(knex) {
11
+ const [config] = await knex.select('*').from('info');
12
+ if (!config) {
13
+ throw new Error('No config');
14
+ }
15
+ const opt = {
16
+ ...config,
17
+ excludes: getJSON(config.excludes, []),
18
+ excludeKeywords: getJSON(config.excludeKeywords, []),
19
+ excludeUrls: getJSON(config.excludeUrls, []),
20
+ roots: getJSON(config.roots, []),
21
+ requestHeaderNames: getJSON(config.requestHeaderNames, []),
22
+ retry: config.retry ?? 3,
23
+ maxExcludedDepth: config.maxExcludedDepth ?? 0,
24
+ };
25
+ // @ts-expect-error — `id` is the primary key, not part of the public Config shape
26
+ delete opt.id;
27
+ dbLog('Table `info`: %O => %O', config, opt);
28
+ return opt;
29
+ }
@@ -0,0 +1,11 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Retrieves the working directory recorded when this stub's crawl session
4
+ * was created, so {@link import('../../archive.js').default.resume} can
5
+ * reconstruct the completed archive's output path independent of the
6
+ * directory `crawl --resume` happens to be invoked from.
7
+ * @param knex - Knex query builder connected to the archive DB.
8
+ * @returns The recorded cwd, or `null` for a stub created before this column
9
+ * existed (or created by a code path that never stamps it, i.e. `resume`).
10
+ */
11
+ export declare function getCreatedCwd(knex: Knex): Promise<string | null>;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Retrieves the working directory recorded when this stub's crawl session
3
+ * was created, so {@link import('../../archive.js').default.resume} can
4
+ * reconstruct the completed archive's output path independent of the
5
+ * directory `crawl --resume` happens to be invoked from.
6
+ * @param knex - Knex query builder connected to the archive DB.
7
+ * @returns The recorded cwd, or `null` for a stub created before this column
8
+ * existed (or created by a code path that never stamps it, i.e. `resume`).
9
+ */
10
+ export async function getCreatedCwd(knex) {
11
+ const [row] = await knex.select('createdCwd').from('info');
12
+ return row?.createdCwd ?? null;
13
+ }
@@ -0,0 +1,8 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Retrieves the crawl session name from the `info` table.
4
+ * @param knex - Knex query builder connected to the archive DB.
5
+ * @returns The name string.
6
+ * @throws {Error} If no name is found in the database.
7
+ */
8
+ export declare function getName(knex: Knex): Promise<string>;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Retrieves the crawl session name from the `info` table.
3
+ * @param knex - Knex query builder connected to the archive DB.
4
+ * @returns The name string.
5
+ * @throws {Error} If no name is found in the database.
6
+ */
7
+ export async function getName(knex) {
8
+ const selected = await knex.select('name').from('info');
9
+ if (!selected[0]) {
10
+ throw new Error('No name');
11
+ }
12
+ const [{ name }] = selected;
13
+ return name;
14
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Columns of the `info` table that `setConfig` / `updateConfig` are allowed to
3
+ * write. Any key outside this set is silently dropped so callers can splat a
4
+ * wider runtime config (with extras like `cwd`) without hitting "no such
5
+ * column" at the SQL layer.
6
+ */
7
+ export declare const INFO_COLUMN_ALLOWLIST: ReadonlySet<string>;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Columns of the `info` table that `setConfig` / `updateConfig` are allowed to
3
+ * write. Any key outside this set is silently dropped so callers can splat a
4
+ * wider runtime config (with extras like `cwd`) without hitting "no such
5
+ * column" at the SQL layer.
6
+ */
7
+ export const INFO_COLUMN_ALLOWLIST = new Set([
8
+ 'version',
9
+ 'name',
10
+ 'baseUrl',
11
+ 'roots',
12
+ 'recursive',
13
+ 'interval',
14
+ 'image',
15
+ 'fetchExternal',
16
+ 'parallels',
17
+ 'excludes',
18
+ 'excludeKeywords',
19
+ 'excludeUrls',
20
+ 'maxExcludedDepth',
21
+ 'retry',
22
+ 'fromList',
23
+ 'disableQueries',
24
+ 'userAgent',
25
+ 'ignoreRobots',
26
+ 'mainContentSelector',
27
+ 'requestHeaderNames',
28
+ 'createdCwd',
29
+ ]);
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Subset of {@link ./info-column-allowlist.ts} that is stored as a JSON-encoded
3
+ * string and therefore needs `JSON.stringify` on write.
4
+ */
5
+ export declare const INFO_JSON_COLUMNS: ReadonlySet<string>;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Subset of {@link ./info-column-allowlist.ts} that is stored as a JSON-encoded
3
+ * string and therefore needs `JSON.stringify` on write.
4
+ */
5
+ export const INFO_JSON_COLUMNS = new Set([
6
+ 'roots',
7
+ 'excludes',
8
+ 'excludeKeywords',
9
+ 'excludeUrls',
10
+ 'requestHeaderNames',
11
+ ]);
@@ -0,0 +1,12 @@
1
+ import type { Config } from '../../types.js';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Stores the crawl configuration in the `info` table.
5
+ * Only fields in {@link ./info-column-allowlist.ts} are forwarded — any extra
6
+ * runtime-only field on the input is silently dropped so callers can splat
7
+ * a wider config object without producing SQL errors. JSON-array fields
8
+ * are serialized via `JSON.stringify`.
9
+ * @param knex - Knex query builder connected to the archive DB.
10
+ * @param config - The {@link Config} object to store.
11
+ */
12
+ export declare function setConfig(knex: Knex, config: Config): Promise<number[]>;
@@ -0,0 +1,21 @@
1
+ import { INFO_COLUMN_ALLOWLIST } from './info-column-allowlist.js';
2
+ import { INFO_JSON_COLUMNS } from './info-json-columns.js';
3
+ /**
4
+ * Stores the crawl configuration in the `info` table.
5
+ * Only fields in {@link ./info-column-allowlist.ts} are forwarded — any extra
6
+ * runtime-only field on the input is silently dropped so callers can splat
7
+ * a wider config object without producing SQL errors. JSON-array fields
8
+ * are serialized via `JSON.stringify`.
9
+ * @param knex - Knex query builder connected to the archive DB.
10
+ * @param config - The {@link Config} object to store.
11
+ */
12
+ export async function setConfig(knex, config) {
13
+ const payload = {};
14
+ for (const [key, value] of Object.entries(config)) {
15
+ if (!INFO_COLUMN_ALLOWLIST.has(key)) {
16
+ continue;
17
+ }
18
+ payload[key] = INFO_JSON_COLUMNS.has(key) ? JSON.stringify(value) : value;
19
+ }
20
+ return knex.from('info').insert(payload);
21
+ }
@@ -0,0 +1,17 @@
1
+ import type { Config } from '../../types.js';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Update the single row in the `info` table with a partial config patch.
5
+ *
6
+ * Used by the append flow to extend `roots` (and any other tweakable
7
+ * field) without replacing the entire row. JSON-array fields are serialized on
8
+ * the fly; primitive fields are written verbatim. Unspecified fields stay as-is.
9
+ *
10
+ * Unknown keys (anything outside the allow-list of `info`-table columns) are
11
+ * silently dropped instead of being passed to SQL, so callers that splat a
12
+ * wider runtime config (e.g. `CrawlConfig` with `cwd` / `executablePath`)
13
+ * cannot accidentally trigger a "no such column" SQL error.
14
+ * @param knex - Knex query builder connected to the archive DB.
15
+ * @param patch - Partial {@link Config} fields to overwrite. `undefined` values are skipped.
16
+ */
17
+ export declare function updateConfig(knex: Knex, patch: Partial<Config>): Promise<void>;
@@ -0,0 +1,36 @@
1
+ import { INFO_COLUMN_ALLOWLIST } from './info-column-allowlist.js';
2
+ import { INFO_JSON_COLUMNS } from './info-json-columns.js';
3
+ /**
4
+ * Update the single row in the `info` table with a partial config patch.
5
+ *
6
+ * Used by the append flow to extend `roots` (and any other tweakable
7
+ * field) without replacing the entire row. JSON-array fields are serialized on
8
+ * the fly; primitive fields are written verbatim. Unspecified fields stay as-is.
9
+ *
10
+ * Unknown keys (anything outside the allow-list of `info`-table columns) are
11
+ * silently dropped instead of being passed to SQL, so callers that splat a
12
+ * wider runtime config (e.g. `CrawlConfig` with `cwd` / `executablePath`)
13
+ * cannot accidentally trigger a "no such column" SQL error.
14
+ * @param knex - Knex query builder connected to the archive DB.
15
+ * @param patch - Partial {@link Config} fields to overwrite. `undefined` values are skipped.
16
+ */
17
+ export async function updateConfig(knex, patch) {
18
+ const payload = {};
19
+ for (const [key, value] of Object.entries(patch)) {
20
+ if (value === undefined) {
21
+ continue;
22
+ }
23
+ if (!INFO_COLUMN_ALLOWLIST.has(key)) {
24
+ continue;
25
+ }
26
+ if (INFO_JSON_COLUMNS.has(key)) {
27
+ payload[key] = JSON.stringify(value);
28
+ continue;
29
+ }
30
+ payload[key] = value;
31
+ }
32
+ if (Object.keys(payload).length === 0) {
33
+ return;
34
+ }
35
+ await knex.from('info').update(payload);
36
+ }
@@ -0,0 +1,19 @@
1
+ import type { ConsoleLogContent } from './types.js';
2
+ /**
3
+ * Computes the `console_log_items.hash` for one console log entry's content.
4
+ *
5
+ * Hashing over the raw content fields (not their resolved ref ids) keeps the
6
+ * dictionary row's identity independent of ref-table state, matching
7
+ * `text_refs` / `json_refs` / `url_refs`, whose hash columns are likewise
8
+ * computed from source content rather than downstream ids. The same
9
+ * message logged by a shared framework on every page therefore hashes to
10
+ * the same value regardless of insertion order or which page's scrape
11
+ * resolves the dictionary row first.
12
+ * @param entry - The content fields to hash. `argsJson` must already be
13
+ * `stringifyConsoleLogArgs`'s output — this function does not
14
+ * re-serialize `args` itself.
15
+ * @returns 32-byte SHA-256 hash, ready for the `hash BLOB UNIQUE` column.
16
+ * @example
17
+ * const hash = computeConsoleLogHash({ type: 'error', text: 'boom', argsJson: null });
18
+ */
19
+ export declare function computeConsoleLogHash(entry: ConsoleLogContent): Buffer;
@@ -0,0 +1,30 @@
1
+ import { computeContentHash } from '../../populate-ref-tables/compute-content-hash.js';
2
+ /**
3
+ * Computes the `console_log_items.hash` for one console log entry's content.
4
+ *
5
+ * Hashing over the raw content fields (not their resolved ref ids) keeps the
6
+ * dictionary row's identity independent of ref-table state, matching
7
+ * `text_refs` / `json_refs` / `url_refs`, whose hash columns are likewise
8
+ * computed from source content rather than downstream ids. The same
9
+ * message logged by a shared framework on every page therefore hashes to
10
+ * the same value regardless of insertion order or which page's scrape
11
+ * resolves the dictionary row first.
12
+ * @param entry - The content fields to hash. `argsJson` must already be
13
+ * `stringifyConsoleLogArgs`'s output — this function does not
14
+ * re-serialize `args` itself.
15
+ * @returns 32-byte SHA-256 hash, ready for the `hash BLOB UNIQUE` column.
16
+ * @example
17
+ * const hash = computeConsoleLogHash({ type: 'error', text: 'boom', argsJson: null });
18
+ */
19
+ export function computeConsoleLogHash(entry) {
20
+ const canonical = JSON.stringify([
21
+ entry.type,
22
+ entry.text,
23
+ entry.argsJson,
24
+ entry.location?.url ?? null,
25
+ entry.location?.lineNumber ?? null,
26
+ entry.location?.columnNumber ?? null,
27
+ entry.stack ?? null,
28
+ ]);
29
+ return computeContentHash(canonical);
30
+ }
@@ -0,0 +1,34 @@
1
+ import type { ConsoleLogEntry } from '../../utils/types/types.js';
2
+ import type { WriteRefCaches } from '../_shared/types.js';
3
+ import type { Knex } from 'knex';
4
+ /**
5
+ * Replaces one page's `page_console_logs` rows wholesale with a freshly
6
+ * captured set of console messages / page errors (issue #228).
7
+ *
8
+ * Scoped-Replace, the same pattern as `replaceAnchorEdges` /
9
+ * `replaceImageItems`: the page's existing rows are deleted and the new
10
+ * set is inserted in the same transaction, so a re-scrape (`--append` /
11
+ * `--retry-failed` / re-render) never accumulates duplicate occurrences.
12
+ * Unlike those two, there is no non-empty guard on the DELETE here — the
13
+ * caller (`Crawler#handleConsoleLogs`) already skips emitting the event
14
+ * entirely when `entries` is empty, which is what keeps a degraded
15
+ * re-scrape from wiping out a prior good capture.
16
+ *
17
+ * `pageUrl` is the originally-requested URL (matching `updatePage`'s
18
+ * `page.url.withoutHashAndAuth` contract), not necessarily the page that
19
+ * ends up holding the content: `resolveRedirectChain` derives the same
20
+ * redirect destination `updatePage` writes content under, so console logs
21
+ * attach to the row that actually carries the page's `page_meta`, not to
22
+ * an empty placeholder for the pre-redirect URL.
23
+ * @param knex - Knex query builder connected to the archive DB.
24
+ * @param caches - The connection's write-side id caches.
25
+ * @param pageUrl - The originally-requested URL, normalised
26
+ * (`withoutHashAndAuth` form).
27
+ * @param redirectPaths - The redirect chain hops captured during fetch, in
28
+ * order (empty when the page was not redirected).
29
+ * @param entries - The console log entries to persist. Must be non-empty —
30
+ * callers should skip calling this function entirely for an empty list.
31
+ * @example
32
+ * await replaceConsoleLogs(knex, caches, page.url.withoutHashAndAuth, page.redirectPaths, entries);
33
+ */
34
+ export declare function replaceConsoleLogs(knex: Knex, caches: WriteRefCaches, pageUrl: string, redirectPaths: readonly string[], entries: readonly ConsoleLogEntry[]): Promise<void>;
@@ -0,0 +1,123 @@
1
+ import { upsertTextRefs } from '../../populate-entity-tables/upsert-text-refs.js';
2
+ import { resolveRedirectChain } from '../../resolve-redirect-chain.js';
3
+ import { clearWriteRefCaches } from '../_shared/clear-write-ref-caches.js';
4
+ import { resolveContentItemId } from '../_shared/resolve-content-item-id.js';
5
+ import { upsertJsonRef } from '../_shared/upsert-json-ref.js';
6
+ import { upsertUrlRef } from '../_shared/upsert-url-ref.js';
7
+ import { computeConsoleLogHash } from './compute-console-log-hash.js';
8
+ import { stringifyConsoleLogArgs } from './stringify-console-log-args.js';
9
+ import { upsertConsoleLogItem } from './upsert-console-log-item.js';
10
+ /** Rows sent per `INSERT INTO page_console_logs ... VALUES (...)` statement. */
11
+ const INSERT_CHUNK_SIZE = 500;
12
+ /**
13
+ * Replaces one page's `page_console_logs` rows wholesale with a freshly
14
+ * captured set of console messages / page errors (issue #228).
15
+ *
16
+ * Scoped-Replace, the same pattern as `replaceAnchorEdges` /
17
+ * `replaceImageItems`: the page's existing rows are deleted and the new
18
+ * set is inserted in the same transaction, so a re-scrape (`--append` /
19
+ * `--retry-failed` / re-render) never accumulates duplicate occurrences.
20
+ * Unlike those two, there is no non-empty guard on the DELETE here — the
21
+ * caller (`Crawler#handleConsoleLogs`) already skips emitting the event
22
+ * entirely when `entries` is empty, which is what keeps a degraded
23
+ * re-scrape from wiping out a prior good capture.
24
+ *
25
+ * `pageUrl` is the originally-requested URL (matching `updatePage`'s
26
+ * `page.url.withoutHashAndAuth` contract), not necessarily the page that
27
+ * ends up holding the content: `resolveRedirectChain` derives the same
28
+ * redirect destination `updatePage` writes content under, so console logs
29
+ * attach to the row that actually carries the page's `page_meta`, not to
30
+ * an empty placeholder for the pre-redirect URL.
31
+ * @param knex - Knex query builder connected to the archive DB.
32
+ * @param caches - The connection's write-side id caches.
33
+ * @param pageUrl - The originally-requested URL, normalised
34
+ * (`withoutHashAndAuth` form).
35
+ * @param redirectPaths - The redirect chain hops captured during fetch, in
36
+ * order (empty when the page was not redirected).
37
+ * @param entries - The console log entries to persist. Must be non-empty —
38
+ * callers should skip calling this function entirely for an empty list.
39
+ * @example
40
+ * await replaceConsoleLogs(knex, caches, page.url.withoutHashAndAuth, page.redirectPaths, entries);
41
+ */
42
+ export async function replaceConsoleLogs(knex, caches, pageUrl, redirectPaths, entries) {
43
+ const { destUrl } = resolveRedirectChain(pageUrl, redirectPaths);
44
+ try {
45
+ await knex.transaction(async (trx) => {
46
+ const pageId = await resolveContentItemId(trx, caches, destUrl);
47
+ await trx('page_console_logs').where('pageId', pageId).delete();
48
+ const texts = new Set();
49
+ for (const entry of entries) {
50
+ // `text_refs` never stores the empty string (its upsert
51
+ // treats `''` as "nothing to dedupe" and skips it) — a
52
+ // `console.log()` call with zero arguments reports `text:
53
+ // ''`, so that entry resolves to `textId: null` below
54
+ // instead of looking it up.
55
+ if (entry.text !== '') {
56
+ texts.add(entry.text);
57
+ }
58
+ if (entry.stack) {
59
+ texts.add(entry.stack);
60
+ }
61
+ }
62
+ const textIds = await upsertTextRefs(trx, texts);
63
+ const rows = [];
64
+ for (const entry of entries) {
65
+ let textId = null;
66
+ if (entry.text !== '') {
67
+ const resolved = textIds.get(entry.text);
68
+ if (resolved === undefined) {
69
+ throw new Error(`replaceConsoleLogs: text_refs id not resolved for "${entry.text}"`);
70
+ }
71
+ textId = resolved;
72
+ }
73
+ const stackTextId = entry.stack ? (textIds.get(entry.stack) ?? null) : null;
74
+ const argsJson = stringifyConsoleLogArgs(entry.args);
75
+ const argsJsonId = argsJson === null ? null : await upsertJsonRef(trx, caches, argsJson);
76
+ const locUrlId = entry.location?.url === undefined
77
+ ? null
78
+ : await upsertUrlRef(trx, caches, entry.location.url);
79
+ const consoleLogId = await upsertConsoleLogItem(trx, caches, {
80
+ hash: computeConsoleLogHash({
81
+ type: entry.type,
82
+ text: entry.text,
83
+ argsJson,
84
+ location: entry.location,
85
+ stack: entry.stack,
86
+ }),
87
+ type: entry.type,
88
+ textId,
89
+ argsJsonId,
90
+ locUrlId,
91
+ locLine: entry.location?.lineNumber ?? null,
92
+ locColumn: entry.location?.columnNumber ?? null,
93
+ stackTextId,
94
+ });
95
+ rows.push({ pageId, consoleLogId, ts: entry.ts });
96
+ }
97
+ for (let index = 0; index < rows.length; index += INSERT_CHUNK_SIZE) {
98
+ await trx('page_console_logs').insert(rows.slice(index, index + INSERT_CHUNK_SIZE));
99
+ }
100
+ // Denormalised onto `page_meta` (the same write-once-at-scrape-time
101
+ // pattern as `tag_count` / `jsonld_count`) so the Pages list can
102
+ // display and sort by it without a live JOIN + COUNT per row.
103
+ // Computed from `entries` directly rather than re-querying the rows
104
+ // just inserted above — the data is already in hand. A `page_meta`
105
+ // row may not exist yet for a `'skipped'` / `'error'` scrape; the
106
+ // UPDATE then simply affects zero rows rather than throwing.
107
+ const errorCount = entries.filter((entry) => entry.type === 'error' || entry.type === 'pageerror').length;
108
+ await trx('page_meta').where('page_id', pageId).update({
109
+ console_error_count: errorCount,
110
+ });
111
+ });
112
+ }
113
+ catch (error) {
114
+ // A rolled-back transaction can leave ids cached that no longer
115
+ // correspond to any row (AUTOINCREMENT never rewinds) — same
116
+ // cache-poisoning hazard `updatePage` / `recordRedirect` guard
117
+ // against. A full clear (not a partial one) is required because
118
+ // this function shares `caches` with every other write path on
119
+ // the same connection.
120
+ clearWriteRefCaches(caches);
121
+ throw error;
122
+ }
123
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Serializes a console call's argument array to a JSON string, or `null`
3
+ * when there is nothing worth storing.
4
+ *
5
+ * Two cases collapse to `null` rather than an empty/degenerate string:
6
+ * an empty `args` array (most commonly a `"pageerror"` entry, which
7
+ * beholder always reports with `args: []`) and a `JSON.stringify` failure
8
+ * (e.g. a circular reference in a logged object) — both mean "no
9
+ * additional structured payload beyond `text`", not "a malformed one".
10
+ * @param args - The `ConsoleLogEntry.args` array to serialize.
11
+ * @returns The JSON string, or `null` when empty or unserializable.
12
+ * @example
13
+ * stringifyConsoleLogArgs(['a', 1]); // '["a",1]'
14
+ * stringifyConsoleLogArgs([]); // null
15
+ */
16
+ export declare function stringifyConsoleLogArgs(args: readonly unknown[]): string | null;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Serializes a console call's argument array to a JSON string, or `null`
3
+ * when there is nothing worth storing.
4
+ *
5
+ * Two cases collapse to `null` rather than an empty/degenerate string:
6
+ * an empty `args` array (most commonly a `"pageerror"` entry, which
7
+ * beholder always reports with `args: []`) and a `JSON.stringify` failure
8
+ * (e.g. a circular reference in a logged object) — both mean "no
9
+ * additional structured payload beyond `text`", not "a malformed one".
10
+ * @param args - The `ConsoleLogEntry.args` array to serialize.
11
+ * @returns The JSON string, or `null` when empty or unserializable.
12
+ * @example
13
+ * stringifyConsoleLogArgs(['a', 1]); // '["a",1]'
14
+ * stringifyConsoleLogArgs([]); // null
15
+ */
16
+ export function stringifyConsoleLogArgs(args) {
17
+ if (args.length === 0) {
18
+ return null;
19
+ }
20
+ try {
21
+ return JSON.stringify(args);
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * The content fields of a `ConsoleLogEntry` that determine its identity in
3
+ * `console_log_items` — everything except `pageUrl` / `ts`, which are
4
+ * per-occurrence rather than per-content (see `page_console_logs`).
5
+ */
6
+ export interface ConsoleLogContent {
7
+ type: string;
8
+ text: string;
9
+ /**
10
+ * Pre-stringified `args` (via `stringifyConsoleLogArgs`), or `null` for
11
+ * an empty/unserializable args array. Callers compute this once and
12
+ * reuse it both for hashing here and for the `json_refs` storage
13
+ * decision, rather than calling `stringifyConsoleLogArgs` on the same
14
+ * `args` array twice.
15
+ */
16
+ argsJson: string | null;
17
+ location?: {
18
+ url?: string;
19
+ lineNumber?: number;
20
+ columnNumber?: number;
21
+ };
22
+ stack?: string;
23
+ }
24
+ /**
25
+ * The resolved ref ids and scalar fields that make up one
26
+ * `console_log_items` row, computed by the caller before the upsert runs.
27
+ */
28
+ export interface ConsoleLogItemRow {
29
+ hash: Buffer;
30
+ type: string;
31
+ /** `null` when `text` is the empty string — `text_refs` never stores `''`. */
32
+ textId: number | null;
33
+ argsJsonId: number | null;
34
+ locUrlId: number | null;
35
+ locLine: number | null;
36
+ locColumn: number | null;
37
+ stackTextId: number | null;
38
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,29 @@
1
+ import type { ConsoleLogItemRow } from './types.js';
2
+ import type { WriteRefCaches } from '../_shared/types.js';
3
+ import type { Knex } from 'knex';
4
+ /**
5
+ * Resolves the `console_log_items.id` for one console log entry's content,
6
+ * inserting the dictionary row when the hash is not yet known.
7
+ *
8
+ * Same no-op-update-for-`RETURNING` idiom as `upsertUrlRef` / `upsertJsonRef`:
9
+ * `INSERT ... ON CONFLICT(hash) DO UPDATE SET hash = hash RETURNING id`
10
+ * yields the existing row's id on a hash collision without a separate
11
+ * SELECT round trip, and (unlike `INSERT OR IGNORE ... RETURNING`) still
12
+ * returns a row when the insert itself is the no-op.
13
+ * @param qb - Knex instance or transaction connected to the archive DB.
14
+ * @param caches - The connection's write-side id caches; mutated in place.
15
+ * @param row - The content hash plus every resolved ref id / scalar column.
16
+ * @returns The `console_log_items.id` of the existing or newly inserted row.
17
+ * @example
18
+ * const id = await upsertConsoleLogItem(trx, caches, {
19
+ * hash: computeConsoleLogHash(entry),
20
+ * type: entry.type,
21
+ * textId,
22
+ * argsJsonId: null,
23
+ * locUrlId: null,
24
+ * locLine: null,
25
+ * locColumn: null,
26
+ * stackTextId: null,
27
+ * });
28
+ */
29
+ export declare function upsertConsoleLogItem(qb: Knex | Knex.Transaction, caches: WriteRefCaches, row: ConsoleLogItemRow): Promise<number>;
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Resolves the `console_log_items.id` for one console log entry's content,
3
+ * inserting the dictionary row when the hash is not yet known.
4
+ *
5
+ * Same no-op-update-for-`RETURNING` idiom as `upsertUrlRef` / `upsertJsonRef`:
6
+ * `INSERT ... ON CONFLICT(hash) DO UPDATE SET hash = hash RETURNING id`
7
+ * yields the existing row's id on a hash collision without a separate
8
+ * SELECT round trip, and (unlike `INSERT OR IGNORE ... RETURNING`) still
9
+ * returns a row when the insert itself is the no-op.
10
+ * @param qb - Knex instance or transaction connected to the archive DB.
11
+ * @param caches - The connection's write-side id caches; mutated in place.
12
+ * @param row - The content hash plus every resolved ref id / scalar column.
13
+ * @returns The `console_log_items.id` of the existing or newly inserted row.
14
+ * @example
15
+ * const id = await upsertConsoleLogItem(trx, caches, {
16
+ * hash: computeConsoleLogHash(entry),
17
+ * type: entry.type,
18
+ * textId,
19
+ * argsJsonId: null,
20
+ * locUrlId: null,
21
+ * locLine: null,
22
+ * locColumn: null,
23
+ * stackTextId: null,
24
+ * });
25
+ */
26
+ export async function upsertConsoleLogItem(qb, caches, row) {
27
+ const hex = row.hash.toString('hex');
28
+ const cached = caches.consoleLogIds.get(hex);
29
+ if (cached !== undefined) {
30
+ return cached;
31
+ }
32
+ const rows = await qb.raw(`INSERT INTO console_log_items
33
+ (hash, type, text_id, args_json_id, loc_url_id, loc_line, loc_column, stack_text_id)
34
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
35
+ ON CONFLICT(hash) DO UPDATE SET hash = hash
36
+ RETURNING id`, [
37
+ row.hash,
38
+ row.type,
39
+ row.textId,
40
+ row.argsJsonId,
41
+ row.locUrlId,
42
+ row.locLine,
43
+ row.locColumn,
44
+ row.stackTextId,
45
+ ]);
46
+ const first = rows[0];
47
+ if (first === undefined) {
48
+ throw new Error('upsertConsoleLogItem: RETURNING yielded no row');
49
+ }
50
+ caches.consoleLogIds.set(hex, first.id);
51
+ return first.id;
52
+ }