@nitpicker/archive 0.0.0 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (737) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +106 -0
  3. package/lib/apply-connection-pragmas.d.ts +18 -0
  4. package/lib/apply-connection-pragmas.js +40 -0
  5. package/lib/archive-accessor.d.ts +265 -0
  6. package/lib/archive-accessor.js +477 -0
  7. package/lib/archive-lock.d.ts +45 -0
  8. package/lib/archive-lock.js +154 -0
  9. package/lib/archive.d.ts +736 -0
  10. package/lib/archive.js +1056 -0
  11. package/lib/body-hash/compute-body-hash.d.ts +32 -0
  12. package/lib/body-hash/compute-body-hash.js +35 -0
  13. package/lib/cache/clear-archive-cache-entry.d.ts +18 -0
  14. package/lib/cache/clear-archive-cache-entry.js +24 -0
  15. package/lib/cache/clear-archive-cache-root.d.ts +26 -0
  16. package/lib/cache/clear-archive-cache-root.js +32 -0
  17. package/lib/cache/compute-archive-cache-key.d.ts +39 -0
  18. package/lib/cache/compute-archive-cache-key.js +95 -0
  19. package/lib/cache/extract-archive-to-cache.d.ts +57 -0
  20. package/lib/cache/extract-archive-to-cache.js +326 -0
  21. package/lib/cache/get-archive-cache-root.d.ts +20 -0
  22. package/lib/cache/get-archive-cache-root.js +53 -0
  23. package/lib/cache/is-archive-cache-disabled.d.ts +24 -0
  24. package/lib/cache/is-archive-cache-disabled.js +34 -0
  25. package/lib/cache/list-archive-cache-entries.d.ts +23 -0
  26. package/lib/cache/list-archive-cache-entries.js +130 -0
  27. package/lib/cache/path-exists.d.ts +9 -0
  28. package/lib/cache/path-exists.js +18 -0
  29. package/lib/cache/resolve-archive-cache-dir.d.ts +26 -0
  30. package/lib/cache/resolve-archive-cache-dir.js +32 -0
  31. package/lib/cache/types.d.ts +33 -0
  32. package/lib/cache/types.js +1 -0
  33. package/lib/content-type/is-html-content-type.d.ts +17 -0
  34. package/lib/content-type/is-html-content-type.js +19 -0
  35. package/lib/content-type/normalize-content-type.d.ts +14 -0
  36. package/lib/content-type/normalize-content-type.js +20 -0
  37. package/lib/create-adjunct-tables.d.ts +66 -0
  38. package/lib/create-adjunct-tables.js +510 -0
  39. package/lib/create-entity-tables.d.ts +191 -0
  40. package/lib/create-entity-tables.js +387 -0
  41. package/lib/create-progress-reporter.d.ts +30 -0
  42. package/lib/create-progress-reporter.js +38 -0
  43. package/lib/create-ref-tables.d.ts +35 -0
  44. package/lib/create-ref-tables.js +185 -0
  45. package/lib/create-template-tables.d.ts +28 -0
  46. package/lib/create-template-tables.js +92 -0
  47. package/lib/database.d.ts +549 -0
  48. package/lib/database.js +804 -0
  49. package/lib/db-ops/_shared/clear-write-ref-caches.d.ts +27 -0
  50. package/lib/db-ops/_shared/clear-write-ref-caches.js +35 -0
  51. package/lib/db-ops/_shared/compress-payload.d.ts +26 -0
  52. package/lib/db-ops/_shared/compress-payload.js +30 -0
  53. package/lib/db-ops/_shared/create-write-ref-caches.d.ts +17 -0
  54. package/lib/db-ops/_shared/create-write-ref-caches.js +27 -0
  55. package/lib/db-ops/_shared/decode-json-ref.d.ts +17 -0
  56. package/lib/db-ops/_shared/decode-json-ref.js +31 -0
  57. package/lib/db-ops/_shared/keyset-paginate-by-id.d.ts +49 -0
  58. package/lib/db-ops/_shared/keyset-paginate-by-id.js +69 -0
  59. package/lib/db-ops/_shared/load-response-headers-by-set-ids.d.ts +20 -0
  60. package/lib/db-ops/_shared/load-response-headers-by-set-ids.js +53 -0
  61. package/lib/db-ops/_shared/resolve-content-item-id.d.ts +62 -0
  62. package/lib/db-ops/_shared/resolve-content-item-id.js +143 -0
  63. package/lib/db-ops/_shared/resolve-url-or-blob.d.ts +23 -0
  64. package/lib/db-ops/_shared/resolve-url-or-blob.js +29 -0
  65. package/lib/db-ops/_shared/retry-setting.d.ts +16 -0
  66. package/lib/db-ops/_shared/retry-setting.js +18 -0
  67. package/lib/db-ops/_shared/safe-parse-json.d.ts +11 -0
  68. package/lib/db-ops/_shared/safe-parse-json.js +18 -0
  69. package/lib/db-ops/_shared/types.d.ts +94 -0
  70. package/lib/db-ops/_shared/types.js +1 -0
  71. package/lib/db-ops/_shared/upsert-blob-ref.d.ts +25 -0
  72. package/lib/db-ops/_shared/upsert-blob-ref.js +48 -0
  73. package/lib/db-ops/_shared/upsert-content-type-ref.d.ts +30 -0
  74. package/lib/db-ops/_shared/upsert-content-type-ref.js +45 -0
  75. package/lib/db-ops/_shared/upsert-json-ref.d.ts +22 -0
  76. package/lib/db-ops/_shared/upsert-json-ref.js +41 -0
  77. package/lib/db-ops/_shared/upsert-response-headers.d.ts +35 -0
  78. package/lib/db-ops/_shared/upsert-response-headers.js +49 -0
  79. package/lib/db-ops/_shared/upsert-url-ref.d.ts +39 -0
  80. package/lib/db-ops/_shared/upsert-url-ref.js +62 -0
  81. package/lib/db-ops/anchors/get-anchors-on-page.d.ts +10 -0
  82. package/lib/db-ops/anchors/get-anchors-on-page.js +21 -0
  83. package/lib/db-ops/config/get-base-url.d.ts +8 -0
  84. package/lib/db-ops/config/get-base-url.js +14 -0
  85. package/lib/db-ops/config/get-config.d.ts +10 -0
  86. package/lib/db-ops/config/get-config.js +29 -0
  87. package/lib/db-ops/config/get-created-cwd.d.ts +11 -0
  88. package/lib/db-ops/config/get-created-cwd.js +13 -0
  89. package/lib/db-ops/config/get-name.d.ts +8 -0
  90. package/lib/db-ops/config/get-name.js +14 -0
  91. package/lib/db-ops/config/info-column-allowlist.d.ts +7 -0
  92. package/lib/db-ops/config/info-column-allowlist.js +29 -0
  93. package/lib/db-ops/config/info-json-columns.d.ts +5 -0
  94. package/lib/db-ops/config/info-json-columns.js +11 -0
  95. package/lib/db-ops/config/set-config.d.ts +12 -0
  96. package/lib/db-ops/config/set-config.js +21 -0
  97. package/lib/db-ops/config/update-config.d.ts +17 -0
  98. package/lib/db-ops/config/update-config.js +36 -0
  99. package/lib/db-ops/console-logs/compute-console-log-hash.d.ts +19 -0
  100. package/lib/db-ops/console-logs/compute-console-log-hash.js +30 -0
  101. package/lib/db-ops/console-logs/replace-console-logs.d.ts +34 -0
  102. package/lib/db-ops/console-logs/replace-console-logs.js +123 -0
  103. package/lib/db-ops/console-logs/stringify-console-log-args.d.ts +16 -0
  104. package/lib/db-ops/console-logs/stringify-console-log-args.js +26 -0
  105. package/lib/db-ops/console-logs/types.d.ts +38 -0
  106. package/lib/db-ops/console-logs/types.js +1 -0
  107. package/lib/db-ops/console-logs/upsert-console-log-item.d.ts +29 -0
  108. package/lib/db-ops/console-logs/upsert-console-log-item.js +52 -0
  109. package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.d.ts +18 -0
  110. package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.js +23 -0
  111. package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.d.ts +12 -0
  112. package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.js +15 -0
  113. package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.d.ts +14 -0
  114. package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.js +30 -0
  115. package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.d.ts +57 -0
  116. package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.js +87 -0
  117. package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.d.ts +21 -0
  118. package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.js +27 -0
  119. package/lib/db-ops/errors/insert-crawl-error.d.ts +15 -0
  120. package/lib/db-ops/errors/insert-crawl-error.js +21 -0
  121. package/lib/db-ops/errors/insert-page-error.d.ts +21 -0
  122. package/lib/db-ops/errors/insert-page-error.js +30 -0
  123. package/lib/db-ops/errors/list-dns-burned-host-candidates.d.ts +33 -0
  124. package/lib/db-ops/errors/list-dns-burned-host-candidates.js +158 -0
  125. package/lib/db-ops/html/read-page-html-blob.d.ts +17 -0
  126. package/lib/db-ops/html/read-page-html-blob.js +20 -0
  127. package/lib/db-ops/lifecycle/checkpoint.d.ts +8 -0
  128. package/lib/db-ops/lifecycle/checkpoint.js +9 -0
  129. package/lib/db-ops/lifecycle/destroy.d.ts +6 -0
  130. package/lib/db-ops/lifecycle/destroy.js +7 -0
  131. package/lib/db-ops/lifecycle/init.d.ts +58 -0
  132. package/lib/db-ops/lifecycle/init.js +122 -0
  133. package/lib/db-ops/list-reconcile/record-list-reconcile-run.d.ts +22 -0
  134. package/lib/db-ops/list-reconcile/record-list-reconcile-run.js +41 -0
  135. package/lib/db-ops/meta/get-audios-of-page.d.ts +11 -0
  136. package/lib/db-ops/meta/get-audios-of-page.js +15 -0
  137. package/lib/db-ops/meta/get-buttons-of-page.d.ts +11 -0
  138. package/lib/db-ops/meta/get-buttons-of-page.js +15 -0
  139. package/lib/db-ops/meta/get-canvases-of-page.d.ts +11 -0
  140. package/lib/db-ops/meta/get-canvases-of-page.js +15 -0
  141. package/lib/db-ops/meta/get-custom-elements-of-page.d.ts +11 -0
  142. package/lib/db-ops/meta/get-custom-elements-of-page.js +15 -0
  143. package/lib/db-ops/meta/get-headings-of-page.d.ts +11 -0
  144. package/lib/db-ops/meta/get-headings-of-page.js +15 -0
  145. package/lib/db-ops/meta/get-iframes-of-page.d.ts +11 -0
  146. package/lib/db-ops/meta/get-iframes-of-page.js +15 -0
  147. package/lib/db-ops/meta/get-jsonld-of-page.d.ts +13 -0
  148. package/lib/db-ops/meta/get-jsonld-of-page.js +27 -0
  149. package/lib/db-ops/meta/get-main-content-images-of-page.d.ts +11 -0
  150. package/lib/db-ops/meta/get-main-content-images-of-page.js +15 -0
  151. package/lib/db-ops/meta/get-main-content-tables-of-page.d.ts +11 -0
  152. package/lib/db-ops/meta/get-main-content-tables-of-page.js +15 -0
  153. package/lib/db-ops/meta/get-page-technologies-of-page.d.ts +11 -0
  154. package/lib/db-ops/meta/get-page-technologies-of-page.js +15 -0
  155. package/lib/db-ops/meta/get-technology-signals-of-page.d.ts +11 -0
  156. package/lib/db-ops/meta/get-technology-signals-of-page.js +15 -0
  157. package/lib/db-ops/meta/get-videos-of-page.d.ts +11 -0
  158. package/lib/db-ops/meta/get-videos-of-page.js +15 -0
  159. package/lib/db-ops/outages/close-network-outage.d.ts +12 -0
  160. package/lib/db-ops/outages/close-network-outage.js +15 -0
  161. package/lib/db-ops/outages/close-stale-open-network-outages.d.ts +26 -0
  162. package/lib/db-ops/outages/close-stale-open-network-outages.js +42 -0
  163. package/lib/db-ops/outages/compute-outage-clamp-timestamp.d.ts +26 -0
  164. package/lib/db-ops/outages/compute-outage-clamp-timestamp.js +31 -0
  165. package/lib/db-ops/outages/insert-network-outage.d.ts +14 -0
  166. package/lib/db-ops/outages/insert-network-outage.js +29 -0
  167. package/lib/db-ops/outages/list-network-outages.d.ts +28 -0
  168. package/lib/db-ops/outages/list-network-outages.js +42 -0
  169. package/lib/db-ops/pages/order/set-url-order.d.ts +13 -0
  170. package/lib/db-ops/pages/order/set-url-order.js +38 -0
  171. package/lib/db-ops/pages/read/build-page-query.d.ts +18 -0
  172. package/lib/db-ops/pages/read/build-page-query.js +40 -0
  173. package/lib/db-ops/pages/read/get-crawling-state.d.ts +117 -0
  174. package/lib/db-ops/pages/read/get-crawling-state.js +161 -0
  175. package/lib/db-ops/pages/read/get-existing-page-urls.d.ts +15 -0
  176. package/lib/db-ops/pages/read/get-existing-page-urls.js +30 -0
  177. package/lib/db-ops/pages/read/get-page-count.d.ts +12 -0
  178. package/lib/db-ops/pages/read/get-page-count.js +21 -0
  179. package/lib/db-ops/pages/read/get-page-source-by-url.d.ts +24 -0
  180. package/lib/db-ops/pages/read/get-page-source-by-url.js +28 -0
  181. package/lib/db-ops/pages/read/get-pages-with-rels.d.ts +38 -0
  182. package/lib/db-ops/pages/read/get-pages-with-rels.js +107 -0
  183. package/lib/db-ops/pages/read/get-pages.d.ts +11 -0
  184. package/lib/db-ops/pages/read/get-pages.js +51 -0
  185. package/lib/db-ops/pages/read/get-scraped-html-page-count.d.ts +18 -0
  186. package/lib/db-ops/pages/read/get-scraped-html-page-count.js +25 -0
  187. package/lib/db-ops/pages/read/reconstruct-page-rows.d.ts +31 -0
  188. package/lib/db-ops/pages/read/reconstruct-page-rows.js +32 -0
  189. package/lib/db-ops/pages/reset/clear-page-derived-rows.d.ts +20 -0
  190. package/lib/db-ops/pages/reset/clear-page-derived-rows.js +37 -0
  191. package/lib/db-ops/pages/reset/repromote-external-pages.d.ts +30 -0
  192. package/lib/db-ops/pages/reset/repromote-external-pages.js +91 -0
  193. package/lib/db-ops/pages/reset/reset-failed-pages.d.ts +88 -0
  194. package/lib/db-ops/pages/reset/reset-failed-pages.js +216 -0
  195. package/lib/db-ops/pages/reset/reset-pages-by-urls.d.ts +80 -0
  196. package/lib/db-ops/pages/reset/reset-pages-by-urls.js +151 -0
  197. package/lib/db-ops/pages/reset/retryable-image-scan-codes.d.ts +24 -0
  198. package/lib/db-ops/pages/reset/retryable-image-scan-codes.js +24 -0
  199. package/lib/db-ops/pages/write/insert-audios.d.ts +14 -0
  200. package/lib/db-ops/pages/write/insert-audios.js +25 -0
  201. package/lib/db-ops/pages/write/insert-buttons.d.ts +14 -0
  202. package/lib/db-ops/pages/write/insert-buttons.js +29 -0
  203. package/lib/db-ops/pages/write/insert-canvases.d.ts +14 -0
  204. package/lib/db-ops/pages/write/insert-canvases.js +26 -0
  205. package/lib/db-ops/pages/write/insert-custom-elements.d.ts +27 -0
  206. package/lib/db-ops/pages/write/insert-custom-elements.js +40 -0
  207. package/lib/db-ops/pages/write/insert-headings.d.ts +15 -0
  208. package/lib/db-ops/pages/write/insert-headings.js +27 -0
  209. package/lib/db-ops/pages/write/insert-iframes.d.ts +14 -0
  210. package/lib/db-ops/pages/write/insert-iframes.js +28 -0
  211. package/lib/db-ops/pages/write/insert-inventory-content-items.d.ts +38 -0
  212. package/lib/db-ops/pages/write/insert-inventory-content-items.js +60 -0
  213. package/lib/db-ops/pages/write/insert-inventory-seeds.d.ts +36 -0
  214. package/lib/db-ops/pages/write/insert-inventory-seeds.js +48 -0
  215. package/lib/db-ops/pages/write/insert-inventory-skipped-pages.d.ts +42 -0
  216. package/lib/db-ops/pages/write/insert-inventory-skipped-pages.js +56 -0
  217. package/lib/db-ops/pages/write/insert-jsonld.d.ts +17 -0
  218. package/lib/db-ops/pages/write/insert-jsonld.js +49 -0
  219. package/lib/db-ops/pages/write/insert-main-content-images.d.ts +20 -0
  220. package/lib/db-ops/pages/write/insert-main-content-images.js +32 -0
  221. package/lib/db-ops/pages/write/insert-main-content-tables.d.ts +14 -0
  222. package/lib/db-ops/pages/write/insert-main-content-tables.js +29 -0
  223. package/lib/db-ops/pages/write/insert-page.d.ts +56 -0
  224. package/lib/db-ops/pages/write/insert-page.js +259 -0
  225. package/lib/db-ops/pages/write/insert-technologies.d.ts +25 -0
  226. package/lib/db-ops/pages/write/insert-technologies.js +45 -0
  227. package/lib/db-ops/pages/write/insert-videos.d.ts +14 -0
  228. package/lib/db-ops/pages/write/insert-videos.js +28 -0
  229. package/lib/db-ops/pages/write/link-redirect-sources.d.ts +42 -0
  230. package/lib/db-ops/pages/write/link-redirect-sources.js +101 -0
  231. package/lib/db-ops/pages/write/record-redirect.d.ts +35 -0
  232. package/lib/db-ops/pages/write/record-redirect.js +100 -0
  233. package/lib/db-ops/pages/write/set-skipped-page.d.ts +13 -0
  234. package/lib/db-ops/pages/write/set-skipped-page.js +24 -0
  235. package/lib/db-ops/pages/write/update-page.d.ts +40 -0
  236. package/lib/db-ops/pages/write/update-page.js +419 -0
  237. package/lib/db-ops/pages/write/write-page-html-blob.d.ts +19 -0
  238. package/lib/db-ops/pages/write/write-page-html-blob.js +41 -0
  239. package/lib/db-ops/referrers/get-redirects-for-pages.d.ts +9 -0
  240. package/lib/db-ops/referrers/get-redirects-for-pages.js +15 -0
  241. package/lib/db-ops/referrers/get-referrers-of-page.d.ts +17 -0
  242. package/lib/db-ops/referrers/get-referrers-of-page.js +32 -0
  243. package/lib/db-ops/referrers/get-referrers-of-resource.d.ts +8 -0
  244. package/lib/db-ops/referrers/get-referrers-of-resource.js +15 -0
  245. package/lib/db-ops/resources/build-resource-query.d.ts +25 -0
  246. package/lib/db-ops/resources/build-resource-query.js +29 -0
  247. package/lib/db-ops/resources/get-existing-resource-urls.d.ts +9 -0
  248. package/lib/db-ops/resources/get-existing-resource-urls.js +24 -0
  249. package/lib/db-ops/resources/get-resource-by-url.d.ts +13 -0
  250. package/lib/db-ops/resources/get-resource-by-url.js +22 -0
  251. package/lib/db-ops/resources/get-resource-url-list.d.ts +17 -0
  252. package/lib/db-ops/resources/get-resource-url-list.js +26 -0
  253. package/lib/db-ops/resources/get-resources.d.ts +8 -0
  254. package/lib/db-ops/resources/get-resources.js +11 -0
  255. package/lib/db-ops/resources/insert-inventory-resources.d.ts +24 -0
  256. package/lib/db-ops/resources/insert-inventory-resources.js +64 -0
  257. package/lib/db-ops/resources/insert-resource-referrers.d.ts +15 -0
  258. package/lib/db-ops/resources/insert-resource-referrers.js +54 -0
  259. package/lib/db-ops/resources/insert-resource.d.ts +34 -0
  260. package/lib/db-ops/resources/insert-resource.js +73 -0
  261. package/lib/db-ops/resources/reconstruct-resource-rows.d.ts +26 -0
  262. package/lib/db-ops/resources/reconstruct-resource-rows.js +30 -0
  263. package/lib/db-ops/templates/assign-template-labels.d.ts +60 -0
  264. package/lib/db-ops/templates/assign-template-labels.js +187 -0
  265. package/lib/db-ops/templates/replace-page-templates.d.ts +44 -0
  266. package/lib/db-ops/templates/replace-page-templates.js +174 -0
  267. package/lib/db-ops/templates/serialize-template-cluster-reason.d.ts +16 -0
  268. package/lib/db-ops/templates/serialize-template-cluster-reason.js +17 -0
  269. package/lib/db-ops/templates/types.d.ts +103 -0
  270. package/lib/db-ops/templates/types.js +1 -0
  271. package/lib/debug.d.ts +8 -0
  272. package/lib/debug.js +9 -0
  273. package/lib/decode-html-blob.d.ts +20 -0
  274. package/lib/decode-html-blob.js +23 -0
  275. package/lib/decode-page-html-blob-bytes.d.ts +25 -0
  276. package/lib/decode-page-html-blob-bytes.js +29 -0
  277. package/lib/decode-stored-blob-bytes.d.ts +25 -0
  278. package/lib/decode-stored-blob-bytes.js +47 -0
  279. package/lib/derive-lineage-from-parent.d.ts +37 -0
  280. package/lib/derive-lineage-from-parent.js +42 -0
  281. package/lib/drop-legacy-tables.d.ts +45 -0
  282. package/lib/drop-legacy-tables.js +56 -0
  283. package/lib/error-kind/classify-error-kind.d.ts +20 -0
  284. package/lib/error-kind/classify-error-kind.js +136 -0
  285. package/lib/error-kind/network-related-error-kinds.d.ts +23 -0
  286. package/lib/error-kind/network-related-error-kinds.js +28 -0
  287. package/lib/error-kind/permanent-error-kinds.d.ts +48 -0
  288. package/lib/error-kind/permanent-error-kinds.js +54 -0
  289. package/lib/error-kind/types.d.ts +54 -0
  290. package/lib/error-kind/types.js +1 -0
  291. package/lib/filesystem/append-text.d.ts +9 -0
  292. package/lib/filesystem/append-text.js +14 -0
  293. package/lib/filesystem/copy-dir-sync.d.ts +6 -0
  294. package/lib/filesystem/copy-dir-sync.js +9 -0
  295. package/lib/filesystem/copy-dir.d.ts +7 -0
  296. package/lib/filesystem/copy-dir.js +13 -0
  297. package/lib/filesystem/copy-file-with-progress.d.ts +20 -0
  298. package/lib/filesystem/copy-file-with-progress.js +34 -0
  299. package/lib/filesystem/exists.d.ts +6 -0
  300. package/lib/filesystem/exists.js +9 -0
  301. package/lib/filesystem/get-file-list.d.ts +8 -0
  302. package/lib/filesystem/get-file-list.js +12 -0
  303. package/lib/filesystem/is-dir.d.ts +6 -0
  304. package/lib/filesystem/is-dir.js +10 -0
  305. package/lib/filesystem/mkdir.d.ts +8 -0
  306. package/lib/filesystem/mkdir.js +15 -0
  307. package/lib/filesystem/output-binary.d.ts +12 -0
  308. package/lib/filesystem/output-binary.js +17 -0
  309. package/lib/filesystem/output-json.d.ts +9 -0
  310. package/lib/filesystem/output-json.js +14 -0
  311. package/lib/filesystem/output-text.d.ts +11 -0
  312. package/lib/filesystem/output-text.js +32 -0
  313. package/lib/filesystem/parse-pax-path.d.ts +18 -0
  314. package/lib/filesystem/parse-pax-path.js +47 -0
  315. package/lib/filesystem/parse-tar-size-field.d.ts +13 -0
  316. package/lib/filesystem/parse-tar-size-field.js +40 -0
  317. package/lib/filesystem/peek-tar-top-dir.d.ts +35 -0
  318. package/lib/filesystem/peek-tar-top-dir.js +215 -0
  319. package/lib/filesystem/read-json.d.ts +7 -0
  320. package/lib/filesystem/read-json.js +11 -0
  321. package/lib/filesystem/read-text.d.ts +6 -0
  322. package/lib/filesystem/read-text.js +10 -0
  323. package/lib/filesystem/readline.d.ts +11 -0
  324. package/lib/filesystem/readline.js +26 -0
  325. package/lib/filesystem/remove.d.ts +5 -0
  326. package/lib/filesystem/remove.js +10 -0
  327. package/lib/filesystem/rename.d.ts +16 -0
  328. package/lib/filesystem/rename.js +48 -0
  329. package/lib/filesystem/tar.d.ts +23 -0
  330. package/lib/filesystem/tar.js +78 -0
  331. package/lib/filesystem/untar.d.ts +33 -0
  332. package/lib/filesystem/untar.js +84 -0
  333. package/lib/get-failed-page-messages.d.ts +56 -0
  334. package/lib/get-failed-page-messages.js +146 -0
  335. package/lib/get-json.d.ts +10 -0
  336. package/lib/get-json.js +25 -0
  337. package/lib/html-snapshot/match-selector-html.d.ts +25 -0
  338. package/lib/html-snapshot/match-selector-html.js +28 -0
  339. package/lib/html-snapshot/match-selector-snapshots.d.ts +33 -0
  340. package/lib/html-snapshot/match-selector-snapshots.js +33 -0
  341. package/lib/html-snapshot/search-html-document.d.ts +29 -0
  342. package/lib/html-snapshot/search-html-document.js +27 -0
  343. package/lib/html-snapshot/search-html-snapshots.d.ts +36 -0
  344. package/lib/html-snapshot/search-html-snapshots.js +35 -0
  345. package/lib/html-snapshot/types.d.ts +111 -0
  346. package/lib/html-snapshot/types.js +7 -0
  347. package/lib/html-snapshot/validate-search-pattern.d.ts +15 -0
  348. package/lib/html-snapshot/validate-search-pattern.js +17 -0
  349. package/lib/init-schema.d.ts +48 -0
  350. package/lib/init-schema.js +124 -0
  351. package/lib/is-inventory-source.d.ts +21 -0
  352. package/lib/is-inventory-source.js +22 -0
  353. package/lib/is-within-outage-window.d.ts +49 -0
  354. package/lib/is-within-outage-window.js +33 -0
  355. package/lib/isolated-cluster/create-isolated-cluster-run.d.ts +24 -0
  356. package/lib/isolated-cluster/create-isolated-cluster-run.js +26 -0
  357. package/lib/libsql-dialect.d.ts +115 -0
  358. package/lib/libsql-dialect.js +116 -0
  359. package/lib/limited-page-ids.d.ts +9 -0
  360. package/lib/limited-page-ids.js +18 -0
  361. package/lib/meta/assert-compatible-version.d.ts +60 -0
  362. package/lib/meta/assert-compatible-version.js +93 -0
  363. package/lib/meta/classify-jsonld-type.d.ts +23 -0
  364. package/lib/meta/classify-jsonld-type.js +43 -0
  365. package/lib/meta/compare-semver.d.ts +23 -0
  366. package/lib/meta/compare-semver.js +51 -0
  367. package/lib/meta/compute-main-contents-denormalized.d.ts +41 -0
  368. package/lib/meta/compute-main-contents-denormalized.js +88 -0
  369. package/lib/meta/compute-page-denormalized.d.ts +20 -0
  370. package/lib/meta/compute-page-denormalized.js +35 -0
  371. package/lib/meta/derive-flat-from-meta.d.ts +34 -0
  372. package/lib/meta/derive-flat-from-meta.js +158 -0
  373. package/lib/meta/derive-meta-extras.d.ts +20 -0
  374. package/lib/meta/derive-meta-extras.js +23 -0
  375. package/lib/meta/extract-tags-for-archive.d.ts +17 -0
  376. package/lib/meta/extract-tags-for-archive.js +36 -0
  377. package/lib/meta/parse-main-content-class-list.d.ts +19 -0
  378. package/lib/meta/parse-main-content-class-list.js +34 -0
  379. package/lib/meta/summarize-jsonld.d.ts +17 -0
  380. package/lib/meta/summarize-jsonld.js +29 -0
  381. package/lib/meta/technologies/combine-technology-confidence.d.ts +46 -0
  382. package/lib/meta/technologies/combine-technology-confidence.js +93 -0
  383. package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.d.ts +45 -0
  384. package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.js +53 -0
  385. package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.d.ts +33 -0
  386. package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.js +46 -0
  387. package/lib/meta/technologies/extract-technologies-for-archive.d.ts +33 -0
  388. package/lib/meta/technologies/extract-technologies-for-archive.js +30 -0
  389. package/lib/meta/technologies/match-js-license-comment-signal.d.ts +21 -0
  390. package/lib/meta/technologies/match-js-license-comment-signal.js +23 -0
  391. package/lib/meta/technologies/match-structural-technology-signals.d.ts +26 -0
  392. package/lib/meta/technologies/match-structural-technology-signals.js +48 -0
  393. package/lib/meta/technologies/normalize-wappalyzer-entries.d.ts +25 -0
  394. package/lib/meta/technologies/normalize-wappalyzer-entries.js +35 -0
  395. package/lib/meta/technologies/technology-signal-definitions.d.ts +44 -0
  396. package/lib/meta/technologies/technology-signal-definitions.js +60 -0
  397. package/lib/meta/technologies/types.d.ts +70 -0
  398. package/lib/meta/technologies/types.js +13 -0
  399. package/lib/meta/types.d.ts +1490 -0
  400. package/lib/meta/types.js +65 -0
  401. package/lib/migrate-content-items-alias-of-id.d.ts +52 -0
  402. package/lib/migrate-content-items-alias-of-id.js +69 -0
  403. package/lib/migrate-content-items-dedupe-cap-event-id.d.ts +46 -0
  404. package/lib/migrate-content-items-dedupe-cap-event-id.js +62 -0
  405. package/lib/migrate-content-items-is-metadata-only.d.ts +44 -0
  406. package/lib/migrate-content-items-is-metadata-only.js +60 -0
  407. package/lib/migrate-entity-tables.d.ts +55 -0
  408. package/lib/migrate-entity-tables.js +66 -0
  409. package/lib/migrate-info-created-cwd.d.ts +17 -0
  410. package/lib/migrate-info-created-cwd.js +36 -0
  411. package/lib/migrate-info-main-content-selector.d.ts +16 -0
  412. package/lib/migrate-info-main-content-selector.js +35 -0
  413. package/lib/migrate-info-request-header-names.d.ts +16 -0
  414. package/lib/migrate-info-request-header-names.js +35 -0
  415. package/lib/migrate-info-roots.d.ts +20 -0
  416. package/lib/migrate-info-roots.js +52 -0
  417. package/lib/migrate-inventory-runs-to-list-reconcile-runs.d.ts +34 -0
  418. package/lib/migrate-inventory-runs-to-list-reconcile-runs.js +51 -0
  419. package/lib/migrate-list-reconcile-runs-exclude-skipped.d.ts +25 -0
  420. package/lib/migrate-list-reconcile-runs-exclude-skipped.js +44 -0
  421. package/lib/migrate-list-reconcile-runs-invalid-skipped.d.ts +16 -0
  422. package/lib/migrate-list-reconcile-runs-invalid-skipped.js +35 -0
  423. package/lib/migrate-main-contents-columns.d.ts +26 -0
  424. package/lib/migrate-main-contents-columns.js +61 -0
  425. package/lib/migrate-page-meta-body-hash.d.ts +44 -0
  426. package/lib/migrate-page-meta-body-hash.js +63 -0
  427. package/lib/migrate-page-meta-console-error-count.d.ts +27 -0
  428. package/lib/migrate-page-meta-console-error-count.js +45 -0
  429. package/lib/migrate-page-meta-custom-element-count.d.ts +33 -0
  430. package/lib/migrate-page-meta-custom-element-count.js +51 -0
  431. package/lib/migrate-page-meta-image-scan.d.ts +27 -0
  432. package/lib/migrate-page-meta-image-scan.js +52 -0
  433. package/lib/migrate-page-tags-to-page-technologies.d.ts +39 -0
  434. package/lib/migrate-page-tags-to-page-technologies.js +79 -0
  435. package/lib/migrate-ref-tables.d.ts +25 -0
  436. package/lib/migrate-ref-tables.js +38 -0
  437. package/lib/native-executor/check-native-executor-config.d.ts +17 -0
  438. package/lib/native-executor/check-native-executor-config.js +20 -0
  439. package/lib/page-meta-column-maps.d.ts +32 -0
  440. package/lib/page-meta-column-maps.js +43 -0
  441. package/lib/page.d.ts +546 -0
  442. package/lib/page.js +764 -0
  443. package/lib/peek-archive-lock.d.ts +40 -0
  444. package/lib/peek-archive-lock.js +62 -0
  445. package/lib/populate-entity-tables/collapse-anchor-rows.d.ts +41 -0
  446. package/lib/populate-entity-tables/collapse-anchor-rows.js +87 -0
  447. package/lib/populate-entity-tables/derive-dom-path.d.ts +35 -0
  448. package/lib/populate-entity-tables/derive-dom-path.js +72 -0
  449. package/lib/populate-entity-tables/is-blob-ref-value.d.ts +16 -0
  450. package/lib/populate-entity-tables/is-blob-ref-value.js +19 -0
  451. package/lib/populate-entity-tables/match-images-to-dom-paths.d.ts +66 -0
  452. package/lib/populate-entity-tables/match-images-to-dom-paths.js +96 -0
  453. package/lib/populate-entity-tables/populate-anchor-edges.d.ts +33 -0
  454. package/lib/populate-entity-tables/populate-anchor-edges.js +153 -0
  455. package/lib/populate-entity-tables/populate-content-items.d.ts +40 -0
  456. package/lib/populate-entity-tables/populate-content-items.js +141 -0
  457. package/lib/populate-entity-tables/populate-entities.d.ts +81 -0
  458. package/lib/populate-entity-tables/populate-entities.js +110 -0
  459. package/lib/populate-entity-tables/populate-image-items.d.ts +91 -0
  460. package/lib/populate-entity-tables/populate-image-items.js +226 -0
  461. package/lib/populate-entity-tables/populate-page-meta.d.ts +33 -0
  462. package/lib/populate-entity-tables/populate-page-meta.js +267 -0
  463. package/lib/populate-entity-tables/populate-resource-items.d.ts +22 -0
  464. package/lib/populate-entity-tables/populate-resource-items.js +114 -0
  465. package/lib/populate-entity-tables/populate-resource-ref-edges.d.ts +31 -0
  466. package/lib/populate-entity-tables/populate-resource-ref-edges.js +33 -0
  467. package/lib/populate-entity-tables/resolve-blob-refs.d.ts +31 -0
  468. package/lib/populate-entity-tables/resolve-blob-refs.js +100 -0
  469. package/lib/populate-entity-tables/resolve-content-type-refs.d.ts +22 -0
  470. package/lib/populate-entity-tables/resolve-content-type-refs.js +27 -0
  471. package/lib/populate-entity-tables/resolve-header-sets.d.ts +49 -0
  472. package/lib/populate-entity-tables/resolve-header-sets.js +122 -0
  473. package/lib/populate-entity-tables/resolve-json-refs.d.ts +25 -0
  474. package/lib/populate-entity-tables/resolve-json-refs.js +67 -0
  475. package/lib/populate-entity-tables/resolve-text-refs.d.ts +30 -0
  476. package/lib/populate-entity-tables/resolve-text-refs.js +61 -0
  477. package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.d.ts +21 -0
  478. package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.js +27 -0
  479. package/lib/populate-entity-tables/resolve-url-refs.d.ts +33 -0
  480. package/lib/populate-entity-tables/resolve-url-refs.js +60 -0
  481. package/lib/populate-entity-tables/test-utils/count-rows.d.ts +17 -0
  482. package/lib/populate-entity-tables/test-utils/count-rows.js +20 -0
  483. package/lib/populate-entity-tables/test-utils/seed-content-items.d.ts +25 -0
  484. package/lib/populate-entity-tables/test-utils/seed-content-items.js +42 -0
  485. package/lib/populate-entity-tables/test-utils/setup-entities-db.d.ts +30 -0
  486. package/lib/populate-entity-tables/test-utils/setup-entities-db.js +175 -0
  487. package/lib/populate-entity-tables/types.d.ts +157 -0
  488. package/lib/populate-entity-tables/types.js +12 -0
  489. package/lib/populate-entity-tables/upsert-text-refs.d.ts +38 -0
  490. package/lib/populate-entity-tables/upsert-text-refs.js +78 -0
  491. package/lib/populate-ref-tables/classify-content-type.d.ts +16 -0
  492. package/lib/populate-ref-tables/classify-content-type.js +52 -0
  493. package/lib/populate-ref-tables/compute-content-hash.d.ts +22 -0
  494. package/lib/populate-ref-tables/compute-content-hash.js +26 -0
  495. package/lib/populate-ref-tables/compute-header-flags.d.ts +16 -0
  496. package/lib/populate-ref-tables/compute-header-flags.js +70 -0
  497. package/lib/populate-ref-tables/content-type-rules.d.ts +38 -0
  498. package/lib/populate-ref-tables/content-type-rules.js +133 -0
  499. package/lib/populate-ref-tables/create-header-table-caches.d.ts +25 -0
  500. package/lib/populate-ref-tables/create-header-table-caches.js +49 -0
  501. package/lib/populate-ref-tables/data-uri-url-refs-limit.d.ts +15 -0
  502. package/lib/populate-ref-tables/data-uri-url-refs-limit.js +15 -0
  503. package/lib/populate-ref-tables/decode-data-uri.d.ts +21 -0
  504. package/lib/populate-ref-tables/decode-data-uri.js +126 -0
  505. package/lib/populate-ref-tables/decompose-header-set.d.ts +29 -0
  506. package/lib/populate-ref-tables/decompose-header-set.js +157 -0
  507. package/lib/populate-ref-tables/decompose-url.d.ts +25 -0
  508. package/lib/populate-ref-tables/decompose-url.js +70 -0
  509. package/lib/populate-ref-tables/header-stability.d.ts +19 -0
  510. package/lib/populate-ref-tables/header-stability.js +22 -0
  511. package/lib/populate-ref-tables/header-value-cache-key.d.ts +17 -0
  512. package/lib/populate-ref-tables/header-value-cache-key.js +19 -0
  513. package/lib/populate-ref-tables/normalize-mime.d.ts +24 -0
  514. package/lib/populate-ref-tables/normalize-mime.js +36 -0
  515. package/lib/populate-ref-tables/populate-blob-refs.d.ts +38 -0
  516. package/lib/populate-ref-tables/populate-blob-refs.js +134 -0
  517. package/lib/populate-ref-tables/populate-content-type-refs.d.ts +27 -0
  518. package/lib/populate-ref-tables/populate-content-type-refs.js +70 -0
  519. package/lib/populate-ref-tables/populate-header-tables.d.ts +35 -0
  520. package/lib/populate-ref-tables/populate-header-tables.js +80 -0
  521. package/lib/populate-ref-tables/populate-json-refs.d.ts +29 -0
  522. package/lib/populate-ref-tables/populate-json-refs.js +101 -0
  523. package/lib/populate-ref-tables/populate-refs.d.ts +51 -0
  524. package/lib/populate-ref-tables/populate-refs.js +62 -0
  525. package/lib/populate-ref-tables/populate-text-refs.d.ts +32 -0
  526. package/lib/populate-ref-tables/populate-text-refs.js +133 -0
  527. package/lib/populate-ref-tables/populate-url-refs.d.ts +28 -0
  528. package/lib/populate-ref-tables/populate-url-refs.js +148 -0
  529. package/lib/populate-ref-tables/test-utils/count-rows.d.ts +15 -0
  530. package/lib/populate-ref-tables/test-utils/count-rows.js +17 -0
  531. package/lib/populate-ref-tables/types.d.ts +197 -0
  532. package/lib/populate-ref-tables/types.js +7 -0
  533. package/lib/populate-ref-tables/upsert-one-header-set.d.ts +34 -0
  534. package/lib/populate-ref-tables/upsert-one-header-set.js +208 -0
  535. package/lib/populate-ref-tables/volatile-header-names.d.ts +20 -0
  536. package/lib/populate-ref-tables/volatile-header-names.js +33 -0
  537. package/lib/redirect-table.d.ts +9 -0
  538. package/lib/redirect-table.js +28 -0
  539. package/lib/release-finished-statements.d.ts +42 -0
  540. package/lib/release-finished-statements.js +45 -0
  541. package/lib/resolve-redirect-chain.d.ts +33 -0
  542. package/lib/resolve-redirect-chain.js +27 -0
  543. package/lib/resource.d.ts +46 -0
  544. package/lib/resource.js +62 -0
  545. package/lib/retarget-legacy-fk-tables.d.ts +61 -0
  546. package/lib/retarget-legacy-fk-tables.js +137 -0
  547. package/lib/safe-path.d.ts +9 -0
  548. package/lib/safe-path.js +17 -0
  549. package/lib/scope/build-scope-map.d.ts +21 -0
  550. package/lib/scope/build-scope-map.js +32 -0
  551. package/lib/scope/find-scope-entry.d.ts +25 -0
  552. package/lib/scope/find-scope-entry.js +45 -0
  553. package/lib/template-classification/classify-archive-page-templates.d.ts +42 -0
  554. package/lib/template-classification/classify-archive-page-templates.js +70 -0
  555. package/lib/template-classification/classify-page-templates.d.ts +33 -0
  556. package/lib/template-classification/classify-page-templates.js +60 -0
  557. package/lib/template-classification/collect-page-ids-with-html.d.ts +24 -0
  558. package/lib/template-classification/collect-page-ids-with-html.js +30 -0
  559. package/lib/template-classification/collect-page-stylesheet-urls.d.ts +32 -0
  560. package/lib/template-classification/collect-page-stylesheet-urls.js +130 -0
  561. package/lib/template-classification/create-content-root-hint.d.ts +41 -0
  562. package/lib/template-classification/create-content-root-hint.js +51 -0
  563. package/lib/template-classification/create-page-cluster-factory.d.ts +36 -0
  564. package/lib/template-classification/create-page-cluster-factory.js +52 -0
  565. package/lib/template-classification/load-page-cluster-candidates.d.ts +32 -0
  566. package/lib/template-classification/load-page-cluster-candidates.js +93 -0
  567. package/lib/template-classification/page-cluster/resolve-page-cluster-keys.d.ts +34 -0
  568. package/lib/template-classification/page-cluster/resolve-page-cluster-keys.js +236 -0
  569. package/lib/template-classification/page-cluster/types.d.ts +123 -0
  570. package/lib/template-classification/page-cluster/types.js +1 -0
  571. package/lib/template-classification/types.d.ts +234 -0
  572. package/lib/template-classification/types.js +1 -0
  573. package/lib/test-utils/build-full-schema-test-db.d.ts +34 -0
  574. package/lib/test-utils/build-full-schema-test-db.js +74 -0
  575. package/lib/test-utils/create-legacy-analysis-tables.d.ts +13 -0
  576. package/lib/test-utils/create-legacy-analysis-tables.js +37 -0
  577. package/lib/test-utils/fk-parent-tables.d.ts +15 -0
  578. package/lib/test-utils/fk-parent-tables.js +19 -0
  579. package/lib/test-utils/seed-content-item.d.ts +35 -0
  580. package/lib/test-utils/seed-content-item.js +42 -0
  581. package/lib/test-utils/setup-legacy-fk-db.d.ts +34 -0
  582. package/lib/test-utils/setup-legacy-fk-db.js +271 -0
  583. package/lib/transfer/attach-source-database.d.ts +31 -0
  584. package/lib/transfer/attach-source-database.js +40 -0
  585. package/lib/transfer/build-split-config.d.ts +30 -0
  586. package/lib/transfer/build-split-config.js +42 -0
  587. package/lib/transfer/clear-replaced-page-rows.d.ts +23 -0
  588. package/lib/transfer/clear-replaced-page-rows.js +61 -0
  589. package/lib/transfer/concat-archives.d.ts +55 -0
  590. package/lib/transfer/concat-archives.js +95 -0
  591. package/lib/transfer/concat-source-transfer-phases.d.ts +10 -0
  592. package/lib/transfer/concat-source-transfer-phases.js +17 -0
  593. package/lib/transfer/content-item-rank-sql.d.ts +21 -0
  594. package/lib/transfer/content-item-rank-sql.js +23 -0
  595. package/lib/transfer/copy-anchor-edges.d.ts +28 -0
  596. package/lib/transfer/copy-anchor-edges.js +42 -0
  597. package/lib/transfer/copy-dictionaries-for-concat.d.ts +39 -0
  598. package/lib/transfer/copy-dictionaries-for-concat.js +81 -0
  599. package/lib/transfer/copy-dictionaries-for-split.d.ts +29 -0
  600. package/lib/transfer/copy-dictionaries-for-split.js +224 -0
  601. package/lib/transfer/copy-header-set-children.d.ts +27 -0
  602. package/lib/transfer/copy-header-set-children.js +51 -0
  603. package/lib/transfer/copy-image-items.d.ts +21 -0
  604. package/lib/transfer/copy-image-items.js +62 -0
  605. package/lib/transfer/copy-inventory-source-lists.d.ts +30 -0
  606. package/lib/transfer/copy-inventory-source-lists.js +61 -0
  607. package/lib/transfer/copy-journal-tables.d.ts +30 -0
  608. package/lib/transfer/copy-journal-tables.js +56 -0
  609. package/lib/transfer/copy-page-console-logs.d.ts +16 -0
  610. package/lib/transfer/copy-page-console-logs.js +27 -0
  611. package/lib/transfer/copy-page-html-blobs.d.ts +31 -0
  612. package/lib/transfer/copy-page-html-blobs.js +43 -0
  613. package/lib/transfer/copy-page-meta.d.ts +27 -0
  614. package/lib/transfer/copy-page-meta.js +68 -0
  615. package/lib/transfer/copy-page-template-clusters.d.ts +31 -0
  616. package/lib/transfer/copy-page-template-clusters.js +56 -0
  617. package/lib/transfer/copy-page-template-labels.d.ts +34 -0
  618. package/lib/transfer/copy-page-template-labels.js +88 -0
  619. package/lib/transfer/copy-resource-items.d.ts +29 -0
  620. package/lib/transfer/copy-resource-items.js +89 -0
  621. package/lib/transfer/copy-resource-ref-edges.d.ts +20 -0
  622. package/lib/transfer/copy-resource-ref-edges.js +33 -0
  623. package/lib/transfer/copy-simple-page-scoped-tables.d.ts +15 -0
  624. package/lib/transfer/copy-simple-page-scoped-tables.js +34 -0
  625. package/lib/transfer/count-external-pages-in-scope.d.ts +26 -0
  626. package/lib/transfer/count-external-pages-in-scope.js +40 -0
  627. package/lib/transfer/create-transfer-temp-tables.d.ts +30 -0
  628. package/lib/transfer/create-transfer-temp-tables.js +59 -0
  629. package/lib/transfer/dictionary-copy-specs.d.ts +32 -0
  630. package/lib/transfer/dictionary-copy-specs.js +28 -0
  631. package/lib/transfer/drop-transfer-temp-tables.d.ts +9 -0
  632. package/lib/transfer/drop-transfer-temp-tables.js +18 -0
  633. package/lib/transfer/flatten-redirect-chains.d.ts +44 -0
  634. package/lib/transfer/flatten-redirect-chains.js +74 -0
  635. package/lib/transfer/insert-content-items.d.ts +35 -0
  636. package/lib/transfer/insert-content-items.js +116 -0
  637. package/lib/transfer/list-transfer-columns.d.ts +35 -0
  638. package/lib/transfer/list-transfer-columns.js +45 -0
  639. package/lib/transfer/mark-in-scope-content-items.d.ts +31 -0
  640. package/lib/transfer/mark-in-scope-content-items.js +54 -0
  641. package/lib/transfer/merge-archive-configs.d.ts +51 -0
  642. package/lib/transfer/merge-archive-configs.js +85 -0
  643. package/lib/transfer/plan-content-items-for-concat.d.ts +33 -0
  644. package/lib/transfer/plan-content-items-for-concat.js +51 -0
  645. package/lib/transfer/plan-content-items-for-split.d.ts +42 -0
  646. package/lib/transfer/plan-content-items-for-split.js +83 -0
  647. package/lib/transfer/plan-resource-items.d.ts +40 -0
  648. package/lib/transfer/plan-resource-items.js +69 -0
  649. package/lib/transfer/quote-transfer-identifier.d.ts +18 -0
  650. package/lib/transfer/quote-transfer-identifier.js +20 -0
  651. package/lib/transfer/reclassify-resource-externality.d.ts +37 -0
  652. package/lib/transfer/reclassify-resource-externality.js +66 -0
  653. package/lib/transfer/remap-redirect-dest-ids.d.ts +34 -0
  654. package/lib/transfer/remap-redirect-dest-ids.js +51 -0
  655. package/lib/transfer/replace-content-items.d.ts +39 -0
  656. package/lib/transfer/replace-content-items.js +83 -0
  657. package/lib/transfer/simple-page-scoped-tables.d.ts +25 -0
  658. package/lib/transfer/simple-page-scoped-tables.js +38 -0
  659. package/lib/transfer/split-archive.d.ts +55 -0
  660. package/lib/transfer/split-archive.js +98 -0
  661. package/lib/transfer/split-source-transfer-phases.d.ts +11 -0
  662. package/lib/transfer/split-source-transfer-phases.js +18 -0
  663. package/lib/transfer/transfer-action.d.ts +34 -0
  664. package/lib/transfer/transfer-action.js +32 -0
  665. package/lib/transfer/transfer-archive-rows.d.ts +65 -0
  666. package/lib/transfer/transfer-archive-rows.js +156 -0
  667. package/lib/transfer/transfer-dictionary-tables.d.ts +12 -0
  668. package/lib/transfer/transfer-dictionary-tables.js +22 -0
  669. package/lib/transfer/transfer-post-phases.d.ts +10 -0
  670. package/lib/transfer/transfer-post-phases.js +13 -0
  671. package/lib/transfer/transfer-source-alias.d.ts +9 -0
  672. package/lib/transfer/transfer-source-alias.js +9 -0
  673. package/lib/transfer/types.d.ts +111 -0
  674. package/lib/transfer/types.js +35 -0
  675. package/lib/types.d.ts +772 -0
  676. package/lib/types.js +1 -0
  677. package/lib/url-alias/compute-tier-a-alias-key.d.ts +44 -0
  678. package/lib/url-alias/compute-tier-a-alias-key.js +47 -0
  679. package/lib/url-alias/compute-tier-b-alias-key.d.ts +23 -0
  680. package/lib/url-alias/compute-tier-b-alias-key.js +26 -0
  681. package/lib/url-alias/group-alias-candidates.d.ts +27 -0
  682. package/lib/url-alias/group-alias-candidates.js +29 -0
  683. package/lib/url-alias/types.d.ts +12 -0
  684. package/lib/url-alias/types.js +1 -0
  685. package/lib/url-pattern/compute-shape-key.d.ts +58 -0
  686. package/lib/url-pattern/compute-shape-key.js +129 -0
  687. package/lib/url-pattern/decompose-url.d.ts +33 -0
  688. package/lib/url-pattern/decompose-url.js +79 -0
  689. package/lib/url-pattern/reconstruct-url.d.ts +15 -0
  690. package/lib/url-pattern/reconstruct-url.js +33 -0
  691. package/lib/url-sort/compute-url-sort-ranks.d.ts +30 -0
  692. package/lib/url-sort/compute-url-sort-ranks.js +33 -0
  693. package/lib/utils/array/each-splitted.d.ts +10 -0
  694. package/lib/utils/array/each-splitted.js +14 -0
  695. package/lib/utils/debug.d.ts +8 -0
  696. package/lib/utils/debug.js +8 -0
  697. package/lib/utils/error/emit-error-with-retry.d.ts +40 -0
  698. package/lib/utils/error/emit-error-with-retry.js +44 -0
  699. package/lib/utils/error/emit-error.d.ts +39 -0
  700. package/lib/utils/error/emit-error.js +41 -0
  701. package/lib/utils/object/parse-response-headers.d.ts +12 -0
  702. package/lib/utils/object/parse-response-headers.js +26 -0
  703. package/lib/utils/object/redact-request-headers.d.ts +15 -0
  704. package/lib/utils/object/redact-request-headers.js +27 -0
  705. package/lib/utils/types/types.d.ts +383 -0
  706. package/lib/utils/types/types.js +1 -0
  707. package/lib/verify-migration/capture-rejection.d.ts +24 -0
  708. package/lib/verify-migration/capture-rejection.js +31 -0
  709. package/lib/verify-migration/check-anchor-edges-count.d.ts +34 -0
  710. package/lib/verify-migration/check-anchor-edges-count.js +72 -0
  711. package/lib/verify-migration/check-anchor-edges-sum.d.ts +13 -0
  712. package/lib/verify-migration/check-anchor-edges-sum.js +27 -0
  713. package/lib/verify-migration/check-content-items-count.d.ts +16 -0
  714. package/lib/verify-migration/check-content-items-count.js +30 -0
  715. package/lib/verify-migration/check-content-type-preservation.d.ts +22 -0
  716. package/lib/verify-migration/check-content-type-preservation.js +40 -0
  717. package/lib/verify-migration/check-foreign-key-integrity.d.ts +31 -0
  718. package/lib/verify-migration/check-foreign-key-integrity.js +47 -0
  719. package/lib/verify-migration/check-image-items-count.d.ts +12 -0
  720. package/lib/verify-migration/check-image-items-count.js +26 -0
  721. package/lib/verify-migration/check-page-meta-count.d.ts +15 -0
  722. package/lib/verify-migration/check-page-meta-count.js +31 -0
  723. package/lib/verify-migration/check-reader-parity.d.ts +23 -0
  724. package/lib/verify-migration/check-reader-parity.js +182 -0
  725. package/lib/verify-migration/check-resource-items-count.d.ts +17 -0
  726. package/lib/verify-migration/check-resource-items-count.js +33 -0
  727. package/lib/verify-migration/check-url-round-trip.d.ts +43 -0
  728. package/lib/verify-migration/check-url-round-trip.js +112 -0
  729. package/lib/verify-migration/types.d.ts +70 -0
  730. package/lib/verify-migration/types.js +63 -0
  731. package/lib/verify-migration/verify-migration.d.ts +41 -0
  732. package/lib/verify-migration/verify-migration.js +120 -0
  733. package/lib/with-bulk-write-pragmas.d.ts +51 -0
  734. package/lib/with-bulk-write-pragmas.js +132 -0
  735. package/lib/write-queue.d.ts +32 -0
  736. package/lib/write-queue.js +55 -0
  737. package/package.json +350 -3
@@ -0,0 +1,153 @@
1
+ import { createProgressReporter } from '../create-progress-reporter.js';
2
+ import { collapseAnchorRows } from './collapse-anchor-rows.js';
3
+ import { resolveTextRefs } from './resolve-text-refs.js';
4
+ /**
5
+ * Rows scanned per keyset-paginated `SELECT` chunk against `anchors`.
6
+ * `anchors` is the largest table in the archive (≈ 13 M rows on the
7
+ * reference archive) so the chunk size trades off memory against
8
+ * round-trip overhead. 5 000 rows per SELECT keeps peak chunk memory
9
+ * ≈ 5 MB (per-row ≈ 1 KB with URL / textContent stored elsewhere) and
10
+ * amortises the per-query round-trip cost across many collapses.
11
+ */
12
+ const READ_CHUNK_SIZE = 5000;
13
+ /**
14
+ * Edges buffered before a bulk `.insert(rows).onConflict(...).ignore()`.
15
+ * The real constraint here is NOT the SQLite bound-parameter limit —
16
+ * knex's sqlite3-family dialect compiles any multi-row `.insert()` (with
17
+ * or without `onConflict`) into `INSERT INTO ... SELECT ... UNION ALL
18
+ * SELECT ...`, which is capped by SQLite's `SQLITE_LIMIT_COMPOUND_SELECT`
19
+ * (default 500). A chunk size above 500 fails with "too many terms in
20
+ * compound SELECT" — confirmed against a real archive whose anchor count
21
+ * routinely produces 500+ distinct `(page_id, href_page_id)` pairs per
22
+ * page. Kept at exactly 500 (not lower) to match the established
23
+ * convention already used by `upsert-one-header-set.ts` and the
24
+ * ref-tables populate steps.
25
+ */
26
+ const INSERT_CHUNK_SIZE = 500;
27
+ /**
28
+ * Populates `anchor_edges` from `anchors` (issue #193).
29
+ *
30
+ * The algorithm is a **single keyset-paginated scan** over `anchors`
31
+ * ordered by `(pageId, hrefId, id)`. Each chunk feeds
32
+ * {@link ./collapse-anchor-rows.ts}, which yields one edge per distinct
33
+ * `(pageId, hrefId)` pair as soon as the pair boundary is observed.
34
+ *
35
+ * A boundary can straddle two chunks (the last row of chunk N shares a
36
+ * pair with the first row of chunk N+1), so the outer loop keeps an
37
+ * "open edge" state that flushes only when the *next* pair actually
38
+ * starts. On end-of-stream the last open edge is emitted.
39
+ *
40
+ * `first_text_id` is left unresolved during the streaming pass — the
41
+ * text is buffered on each pending edge and resolved in bulk by
42
+ * {@link ./resolve-text-refs.ts} at INSERT time. Every INSERT batch
43
+ * therefore issues one text-refs lookup + one INSERT, keeping DB
44
+ * round-trips per edge low.
45
+ *
46
+ * `INSERT OR IGNORE` on the `(page_id, href_page_id)` UNIQUE composite
47
+ * makes the step idempotent: a re-run after partial failure re-emits the
48
+ * same edges but the writes no-op.
49
+ * @param trx - Knex instance or transaction connected to the archive DB.
50
+ * @param onProgress - Optional sink for periodic progress lines (one per
51
+ * ~5% of `anchors` scanned); see {@link ../create-progress-reporter.ts}.
52
+ * @example
53
+ * await knex.transaction(async (trx) => {
54
+ * await populateAnchorEdges(trx);
55
+ * });
56
+ */
57
+ export async function populateAnchorEdges(trx, onProgress) {
58
+ let cursorPageId = 0;
59
+ let cursorHrefId = 0;
60
+ let cursorId = 0;
61
+ let carryOver = null;
62
+ const pending = [];
63
+ const countRows = await trx('anchors').count({ n: '*' });
64
+ const total = Number(countRows[0]?.n ?? 0);
65
+ const report = createProgressReporter('anchor_edges (anchors)', total, onProgress);
66
+ let processed = 0;
67
+ while (true) {
68
+ const rows = await trx('anchors')
69
+ .select('id', 'pageId', 'hrefId', 'hash', 'textContent')
70
+ .where(function () {
71
+ this.where('pageId', '>', cursorPageId)
72
+ .orWhere(function () {
73
+ this.where('pageId', cursorPageId).andWhere('hrefId', '>', cursorHrefId);
74
+ })
75
+ .orWhere(function () {
76
+ this.where('pageId', cursorPageId)
77
+ .andWhere('hrefId', cursorHrefId)
78
+ .andWhere('id', '>', cursorId);
79
+ });
80
+ })
81
+ .orderBy([
82
+ { column: 'pageId', order: 'asc' },
83
+ { column: 'hrefId', order: 'asc' },
84
+ { column: 'id', order: 'asc' },
85
+ ])
86
+ .limit(READ_CHUNK_SIZE);
87
+ if (rows.length === 0) {
88
+ break;
89
+ }
90
+ const lastRow = rows.at(-1);
91
+ cursorPageId = lastRow.pageId;
92
+ cursorHrefId = lastRow.hrefId;
93
+ cursorId = lastRow.id;
94
+ processed += rows.length;
95
+ report(processed);
96
+ const chunkEdges = [...collapseAnchorRows(rows)];
97
+ for (const edge of chunkEdges) {
98
+ if (carryOver !== null &&
99
+ carryOver.page_id === edge.page_id &&
100
+ carryOver.href_page_id === edge.href_page_id) {
101
+ carryOver.count += edge.count;
102
+ continue;
103
+ }
104
+ if (carryOver !== null) {
105
+ pending.push(carryOver);
106
+ }
107
+ carryOver = edge;
108
+ if (pending.length >= INSERT_CHUNK_SIZE) {
109
+ await flush(trx, pending);
110
+ }
111
+ }
112
+ }
113
+ if (carryOver !== null) {
114
+ pending.push(carryOver);
115
+ }
116
+ if (pending.length > 0) {
117
+ await flush(trx, pending);
118
+ }
119
+ }
120
+ /**
121
+ * Resolves `first_text_id` for every buffered edge in `pending`, then
122
+ * bulk-inserts the batch into `anchor_edges` and clears the buffer.
123
+ *
124
+ * Extracted from the main loop so the "resolve + insert" pair happens in
125
+ * exactly one place — the streaming loop, the carry-over flush at
126
+ * end-of-stream, and any future re-order boundary all land here.
127
+ * @param trx - Knex instance or transaction.
128
+ * @param pending - Buffered edges awaiting `first_text_id` resolution
129
+ * and INSERT; mutated in place (cleared on return).
130
+ */
131
+ async function flush(trx, pending) {
132
+ const texts = new Set();
133
+ for (const edge of pending) {
134
+ if (edge.first_textContent != null && edge.first_textContent !== '') {
135
+ texts.add(edge.first_textContent);
136
+ }
137
+ }
138
+ const textIds = await resolveTextRefs(trx, texts);
139
+ const inserts = pending.map((edge) => ({
140
+ page_id: edge.page_id,
141
+ href_page_id: edge.href_page_id,
142
+ count: edge.count,
143
+ first_hash: edge.first_hash,
144
+ first_text_id: edge.first_textContent != null && edge.first_textContent !== ''
145
+ ? (textIds.get(edge.first_textContent) ?? null)
146
+ : null,
147
+ }));
148
+ await trx('anchor_edges')
149
+ .insert(inserts)
150
+ .onConflict(['page_id', 'href_page_id'])
151
+ .ignore();
152
+ pending.length = 0;
153
+ }
@@ -0,0 +1,40 @@
1
+ import type { ProgressCallback } from '../create-progress-reporter.js';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Populates `content_items` from `pages` (issue #193).
5
+ *
6
+ * Strategy per chunk:
7
+ *
8
+ * 1. **Keyset-paginate** `pages` in id order so partial-failure re-runs
9
+ * resume from the last committed row without reading the full table.
10
+ * Same pattern as {@link ../populate-ref-tables/populate-url-refs.ts}.
11
+ * 2. **Batch-resolve** `url_refs.id`, `content_type_refs.id`, and
12
+ * `header_sets.id` for every distinct value in the chunk — one round
13
+ * trip per ref table instead of N round trips per row.
14
+ * 3. **Bulk INSERT** with explicit `id = pages.id`. Reusing the legacy
15
+ * PK preserves every FK reference in `page_errors` / `page_tags` /
16
+ * `page_jsonld` / `page_html_ref` without a per-row UPDATE.
17
+ *
18
+ * `redirect_dest_id` is copied verbatim from `redirectDestId` — the FK
19
+ * self-reference is `DEFERRABLE INITIALLY DEFERRED` (see
20
+ * {@link ../create-entity-tables.ts}) so a redirect source
21
+ * inserted before its destination is validated only at COMMIT time.
22
+ *
23
+ * `INSERT OR IGNORE` on the natural PK makes the step idempotent — a
24
+ * re-run after a partial failure only inserts the rows that are still
25
+ * missing.
26
+ *
27
+ * `content_type_refs` is preloaded once at the start because its
28
+ * cardinality is small (see {@link ./resolve-content-type-refs.ts}); the
29
+ * URL and header-set resolvers are called per chunk because their
30
+ * per-archive cardinality can be very large (one row per distinct URL /
31
+ * response JSON).
32
+ * @param trx - Knex instance or transaction connected to the archive DB.
33
+ * @param onProgress - Optional sink for periodic progress lines (one per
34
+ * ~5% of `pages` scanned); see {@link ../create-progress-reporter.ts}.
35
+ * @example
36
+ * await knex.transaction(async (trx) => {
37
+ * await populateContentItems(trx);
38
+ * });
39
+ */
40
+ export declare function populateContentItems(trx: Knex, onProgress?: ProgressCallback): Promise<void>;
@@ -0,0 +1,141 @@
1
+ import { createProgressReporter } from '../create-progress-reporter.js';
2
+ import { loadContentTypeRefs } from './resolve-content-type-refs.js';
3
+ import { resolveHeaderSets } from './resolve-header-sets.js';
4
+ import { resolveUrlRefs } from './resolve-url-refs.js';
5
+ /**
6
+ * Rows scanned per keyset-paginated `SELECT` chunk against `pages`. The
7
+ * migration reads every page column that maps to `content_items` in one
8
+ * SELECT per chunk, so scaling this too high would blow up the result-set
9
+ * size for long meta text columns. 500 keeps peak memory bounded at
10
+ * ≈ 30 MB for a chunk of `pages` with populated meta and header sets.
11
+ */
12
+ const READ_CHUNK_SIZE = 500;
13
+ /**
14
+ * Rows sent per `INSERT INTO content_items ... VALUES (...)` statement.
15
+ * Each row binds 16 params (id + 15 core columns), so 300 rows =
16
+ * 4 800 params — safely under SQLite's default variable limit of 32 766.
17
+ */
18
+ const INSERT_CHUNK_SIZE = 300;
19
+ /**
20
+ * Populates `content_items` from `pages` (issue #193).
21
+ *
22
+ * Strategy per chunk:
23
+ *
24
+ * 1. **Keyset-paginate** `pages` in id order so partial-failure re-runs
25
+ * resume from the last committed row without reading the full table.
26
+ * Same pattern as {@link ../populate-ref-tables/populate-url-refs.ts}.
27
+ * 2. **Batch-resolve** `url_refs.id`, `content_type_refs.id`, and
28
+ * `header_sets.id` for every distinct value in the chunk — one round
29
+ * trip per ref table instead of N round trips per row.
30
+ * 3. **Bulk INSERT** with explicit `id = pages.id`. Reusing the legacy
31
+ * PK preserves every FK reference in `page_errors` / `page_tags` /
32
+ * `page_jsonld` / `page_html_ref` without a per-row UPDATE.
33
+ *
34
+ * `redirect_dest_id` is copied verbatim from `redirectDestId` — the FK
35
+ * self-reference is `DEFERRABLE INITIALLY DEFERRED` (see
36
+ * {@link ../create-entity-tables.ts}) so a redirect source
37
+ * inserted before its destination is validated only at COMMIT time.
38
+ *
39
+ * `INSERT OR IGNORE` on the natural PK makes the step idempotent — a
40
+ * re-run after a partial failure only inserts the rows that are still
41
+ * missing.
42
+ *
43
+ * `content_type_refs` is preloaded once at the start because its
44
+ * cardinality is small (see {@link ./resolve-content-type-refs.ts}); the
45
+ * URL and header-set resolvers are called per chunk because their
46
+ * per-archive cardinality can be very large (one row per distinct URL /
47
+ * response JSON).
48
+ * @param trx - Knex instance or transaction connected to the archive DB.
49
+ * @param onProgress - Optional sink for periodic progress lines (one per
50
+ * ~5% of `pages` scanned); see {@link ../create-progress-reporter.ts}.
51
+ * @example
52
+ * await knex.transaction(async (trx) => {
53
+ * await populateContentItems(trx);
54
+ * });
55
+ */
56
+ export async function populateContentItems(trx, onProgress) {
57
+ const contentTypeIds = await loadContentTypeRefs(trx);
58
+ const countRows = await trx('pages').count({ n: '*' });
59
+ const total = Number(countRows[0]?.n ?? 0);
60
+ const report = createProgressReporter('content_items (pages)', total, onProgress);
61
+ let processed = 0;
62
+ let cursor = 0;
63
+ while (true) {
64
+ const rows = await trx('pages')
65
+ .select('id', 'url', 'redirectDestId', 'scraped', 'isTarget', 'isExternal', 'status', 'statusText', 'contentType', 'contentLength', 'responseHeaders', 'firstCrawledAt', 'lastCrawledAt', 'order', 'isSkipped', 'skipReason', 'source')
66
+ .where('id', '>', cursor)
67
+ .orderBy('id', 'asc')
68
+ .limit(READ_CHUNK_SIZE);
69
+ if (rows.length === 0) {
70
+ break;
71
+ }
72
+ cursor = rows.at(-1).id;
73
+ processed += rows.length;
74
+ report(processed);
75
+ const urls = new Set();
76
+ const headerJsonStrings = new Set();
77
+ for (const row of rows) {
78
+ urls.add(row.url);
79
+ if (typeof row.responseHeaders === 'string' && row.responseHeaders !== '') {
80
+ headerJsonStrings.add(row.responseHeaders);
81
+ }
82
+ }
83
+ const urlIds = await resolveUrlRefs(trx, urls);
84
+ const headerSetIds = await resolveHeaderSets(trx, headerJsonStrings);
85
+ const inserts = rows.map((row) => {
86
+ const urlId = urlIds.get(row.url) ?? null;
87
+ if (urlId === null) {
88
+ throw new Error(`populateContentItems: url_refs.id not resolved for page id=${row.id} url=${row.url} — populateUrlRefs must run first`);
89
+ }
90
+ let contentTypeId = null;
91
+ if (row.contentType != null && row.contentType !== '') {
92
+ const resolved = contentTypeIds.get(row.contentType);
93
+ if (resolved === undefined) {
94
+ throw new Error(`populateContentItems: content_type_refs.id not resolved for page id=${row.id} contentType=${row.contentType} — populateContentTypeRefs must run first`);
95
+ }
96
+ contentTypeId = resolved;
97
+ }
98
+ let headerSetId = null;
99
+ if (typeof row.responseHeaders === 'string' && row.responseHeaders !== '') {
100
+ const resolved = headerSetIds.get(row.responseHeaders);
101
+ if (resolved === undefined) {
102
+ // `resolveHeaderSets` skips sentinel values ('{}' / 'null')
103
+ // AND payloads that `decomposeHeaderSet` cannot parse into
104
+ // any entries — in both cases the source row genuinely had
105
+ // no header set to point at, so `header_set_id = null` is
106
+ // the correct final state. `resolveHeaderSets` already ran
107
+ // the raw_hash fallback, so this branch only fires when the
108
+ // row has no persistable header set (parse error, or every
109
+ // entry stripped for non-string values).
110
+ headerSetId = null;
111
+ }
112
+ else {
113
+ headerSetId = resolved;
114
+ }
115
+ }
116
+ return {
117
+ id: row.id,
118
+ url_id: urlId,
119
+ is_external: row.isExternal == null ? 0 : row.isExternal ? 1 : 0,
120
+ scraped: row.scraped ? 1 : 0,
121
+ is_target: row.isTarget ? 1 : 0,
122
+ status: row.status ?? null,
123
+ status_text: row.statusText ?? null,
124
+ content_type_id: contentTypeId,
125
+ content_length: row.contentLength ?? null,
126
+ header_set_id: headerSetId,
127
+ redirect_dest_id: row.redirectDestId ?? null,
128
+ source: row.source,
129
+ first_crawled_at: row.firstCrawledAt ?? null,
130
+ last_crawled_at: row.lastCrawledAt ?? null,
131
+ crawl_order: row.order ?? null,
132
+ is_skipped: row.isSkipped == null ? null : row.isSkipped ? 1 : 0,
133
+ skip_reason: row.skipReason ?? null,
134
+ };
135
+ });
136
+ for (let index = 0; index < inserts.length; index += INSERT_CHUNK_SIZE) {
137
+ const chunk = inserts.slice(index, index + INSERT_CHUNK_SIZE);
138
+ await trx('content_items').insert(chunk).onConflict('id').ignore();
139
+ }
140
+ }
141
+ }
@@ -0,0 +1,81 @@
1
+ import type { ProgressCallback } from '../create-progress-reporter.js';
2
+ import type { PageDomPathResolver } from './populate-image-items.js';
3
+ import type { Knex } from 'knex';
4
+ /**
5
+ * Runs the six 0.13 entity/edge populates (issue #193) in dependency
6
+ * order against an already-connected archive.
7
+ *
8
+ * Order rationale:
9
+ *
10
+ * 1. **`content_items`** — every downstream populate's FKs reference
11
+ * `content_items(id)`. Must land first so the FKs are valid at
12
+ * COMMIT time. `redirect_dest_id` is `DEFERRABLE INITIALLY DEFERRED`
13
+ * (see {@link ../create-entity-tables.ts}) so a redirect
14
+ * source inserted before its destination is validated only at
15
+ * COMMIT — the insert order within this populate is not
16
+ * load-bearing.
17
+ * 2. **`page_meta`** — FK to `content_items(id)`.
18
+ * 3. **`resource_items`** — required before `resource_ref_edges`.
19
+ * 4. **`anchor_edges`** — FKs to `content_items(id)` on both
20
+ * sides.
21
+ * 5. **`resource_ref_edges`** — FKs to `resource_items(id)` and
22
+ * `content_items(id)`.
23
+ * 6. **`image_items`** — FK to `content_items(id)`; the
24
+ * dom-path text_refs upsert is scoped to this populate so re-runs are
25
+ * self-contained.
26
+ *
27
+ * Every sub-populate is independently idempotent via `INSERT OR IGNORE` on
28
+ * its natural key or PK. On a **re-crawl** (`crawl --append` /
29
+ * `--retry-failed` / `--inventory` all UPDATE existing `pages` /
30
+ * `resources` rows in place, and `#insertPage` deletes + re-inserts
31
+ * `anchors` / `images` per page), running populate again against the
32
+ * previously-populated archive would leave `content_items` / `page_meta`
33
+ * / `resource_items` at their FIRST-crawl values (source-priority
34
+ * upgrades, refreshed status, changed metadata never propagate) and
35
+ * `anchor_edges` / `image_items` / `resource_ref_edges` would keep stale
36
+ * rows keyed by the now-deleted legacy ids. To keep the reader-side
37
+ * view of the archive faithful to `pages` / `resources` on re-crawl,
38
+ * every entity + edge table is TRUNCATEd (in child-first order so no FK
39
+ * check trips) at the top of this function before the six sub-populates
40
+ * re-insert from the current legacy state. Ref tables (`url_refs`,
41
+ * `text_refs`, `content_type_refs`, `header_*`) are NOT truncated —
42
+ * they are content-addressable and additive; re-inserting the same
43
+ * value hits `INSERT OR IGNORE` and is a no-op.
44
+ *
45
+ * The whole invocation is expected to run inside one writer transaction
46
+ * with `.bak` protection at the caller level (a single WAL transaction
47
+ * with `.bak` rollback on failure);
48
+ * this function does not open its own transaction so the
49
+ * caller controls the boundary — see {@link
50
+ * ../populate-ref-tables/populate-refs.ts} for the same convention.
51
+ *
52
+ * **`PRAGMA foreign_keys = ON` is REQUIRED** on the underlying
53
+ * connection before this function is called. `content_items.redirect_dest_id`
54
+ * is `DEFERRABLE INITIALLY DEFERRED` (see
55
+ * {@link ../create-entity-tables.ts}); without foreign-key
56
+ * enforcement libsql commits `content_items` rows whose `redirect_dest_id`
57
+ * points at a non-existent page and the deferrable-FK-enforcement-at-COMMIT
58
+ * invariant is silently broken. The
59
+ * migration script sets the pragma explicitly; any other caller must do
60
+ * the same.
61
+ * HTML BLOB reads happen inline inside {@link populateImageItems} against
62
+ * the same `trx` — no `getPageHtml` callback here — because a callback
63
+ * that routed through `Database.getHtmlOfPageById` would re-enter the
64
+ * connection pool from inside this writer transaction and deadlock on
65
+ * libsql's single writer connection. See `./populate-image-items.ts` for
66
+ * the detailed rationale.
67
+ * @param trx - Knex instance or transaction connected to the archive DB.
68
+ * @param resolvePageDomPaths - Callback that returns dom_path strings
69
+ * for one page's images. Injected rather than hard-coded so
70
+ * `@nitpicker/archive` does not become a jsdom consumer at runtime.
71
+ * @param onProgress - Optional sink threaded to every sub-populate for
72
+ * periodic progress lines; see {@link ../create-progress-reporter.ts}.
73
+ * @example
74
+ * const archive = await Archive.open(archivePath);
75
+ * const knex = archive.getKnex();
76
+ * await knex.transaction(async (trx) => {
77
+ * await populateEntityTables(trx, jsdomResolver);
78
+ * });
79
+ * await archive.write();
80
+ */
81
+ export declare function populateEntityTables(trx: Knex, resolvePageDomPaths: PageDomPathResolver, onProgress?: ProgressCallback): Promise<void>;
@@ -0,0 +1,110 @@
1
+ import { populateAnchorEdges } from './populate-anchor-edges.js';
2
+ import { populateContentItems } from './populate-content-items.js';
3
+ import { populateImageItems } from './populate-image-items.js';
4
+ import { populatePageMeta } from './populate-page-meta.js';
5
+ import { populateResourceItems } from './populate-resource-items.js';
6
+ import { populateResourceRefEdges } from './populate-resource-ref-edges.js';
7
+ /**
8
+ * Runs the six 0.13 entity/edge populates (issue #193) in dependency
9
+ * order against an already-connected archive.
10
+ *
11
+ * Order rationale:
12
+ *
13
+ * 1. **`content_items`** — every downstream populate's FKs reference
14
+ * `content_items(id)`. Must land first so the FKs are valid at
15
+ * COMMIT time. `redirect_dest_id` is `DEFERRABLE INITIALLY DEFERRED`
16
+ * (see {@link ../create-entity-tables.ts}) so a redirect
17
+ * source inserted before its destination is validated only at
18
+ * COMMIT — the insert order within this populate is not
19
+ * load-bearing.
20
+ * 2. **`page_meta`** — FK to `content_items(id)`.
21
+ * 3. **`resource_items`** — required before `resource_ref_edges`.
22
+ * 4. **`anchor_edges`** — FKs to `content_items(id)` on both
23
+ * sides.
24
+ * 5. **`resource_ref_edges`** — FKs to `resource_items(id)` and
25
+ * `content_items(id)`.
26
+ * 6. **`image_items`** — FK to `content_items(id)`; the
27
+ * dom-path text_refs upsert is scoped to this populate so re-runs are
28
+ * self-contained.
29
+ *
30
+ * Every sub-populate is independently idempotent via `INSERT OR IGNORE` on
31
+ * its natural key or PK. On a **re-crawl** (`crawl --append` /
32
+ * `--retry-failed` / `--inventory` all UPDATE existing `pages` /
33
+ * `resources` rows in place, and `#insertPage` deletes + re-inserts
34
+ * `anchors` / `images` per page), running populate again against the
35
+ * previously-populated archive would leave `content_items` / `page_meta`
36
+ * / `resource_items` at their FIRST-crawl values (source-priority
37
+ * upgrades, refreshed status, changed metadata never propagate) and
38
+ * `anchor_edges` / `image_items` / `resource_ref_edges` would keep stale
39
+ * rows keyed by the now-deleted legacy ids. To keep the reader-side
40
+ * view of the archive faithful to `pages` / `resources` on re-crawl,
41
+ * every entity + edge table is TRUNCATEd (in child-first order so no FK
42
+ * check trips) at the top of this function before the six sub-populates
43
+ * re-insert from the current legacy state. Ref tables (`url_refs`,
44
+ * `text_refs`, `content_type_refs`, `header_*`) are NOT truncated —
45
+ * they are content-addressable and additive; re-inserting the same
46
+ * value hits `INSERT OR IGNORE` and is a no-op.
47
+ *
48
+ * The whole invocation is expected to run inside one writer transaction
49
+ * with `.bak` protection at the caller level (a single WAL transaction
50
+ * with `.bak` rollback on failure);
51
+ * this function does not open its own transaction so the
52
+ * caller controls the boundary — see {@link
53
+ * ../populate-ref-tables/populate-refs.ts} for the same convention.
54
+ *
55
+ * **`PRAGMA foreign_keys = ON` is REQUIRED** on the underlying
56
+ * connection before this function is called. `content_items.redirect_dest_id`
57
+ * is `DEFERRABLE INITIALLY DEFERRED` (see
58
+ * {@link ../create-entity-tables.ts}); without foreign-key
59
+ * enforcement libsql commits `content_items` rows whose `redirect_dest_id`
60
+ * points at a non-existent page and the deferrable-FK-enforcement-at-COMMIT
61
+ * invariant is silently broken. The
62
+ * migration script sets the pragma explicitly; any other caller must do
63
+ * the same.
64
+ * HTML BLOB reads happen inline inside {@link populateImageItems} against
65
+ * the same `trx` — no `getPageHtml` callback here — because a callback
66
+ * that routed through `Database.getHtmlOfPageById` would re-enter the
67
+ * connection pool from inside this writer transaction and deadlock on
68
+ * libsql's single writer connection. See `./populate-image-items.ts` for
69
+ * the detailed rationale.
70
+ * @param trx - Knex instance or transaction connected to the archive DB.
71
+ * @param resolvePageDomPaths - Callback that returns dom_path strings
72
+ * for one page's images. Injected rather than hard-coded so
73
+ * `@nitpicker/archive` does not become a jsdom consumer at runtime.
74
+ * @param onProgress - Optional sink threaded to every sub-populate for
75
+ * periodic progress lines; see {@link ../create-progress-reporter.ts}.
76
+ * @example
77
+ * const archive = await Archive.open(archivePath);
78
+ * const knex = archive.getKnex();
79
+ * await knex.transaction(async (trx) => {
80
+ * await populateEntityTables(trx, jsdomResolver);
81
+ * });
82
+ * await archive.write();
83
+ */
84
+ export async function populateEntityTables(trx, resolvePageDomPaths, onProgress) {
85
+ // Truncate child-first so no outgoing FK check ever sees a broken
86
+ // reference mid-delete. Order is: leaf edge/entity tables that have
87
+ // no incoming FKs (`image_items`, `anchor_edges`, `resource_ref_edges`),
88
+ // then the parent entities they referenced (`page_meta` and
89
+ // `resource_items`; `page_meta` references `content_items` so it
90
+ // must be dropped before `content_items`; `resource_items` was
91
+ // pointed at by `resource_ref_edges` which is now empty), and
92
+ // finally `content_items` itself — the only remaining incoming
93
+ // reference is its own DEFERRABLE INITIALLY DEFERRED
94
+ // `redirect_dest_id`, which is validated at COMMIT so a mid-trx
95
+ // wipe-and-refill is legal. No external table has an enforced FK
96
+ // into `content_items` (viewer read-model tables
97
+ // hold logical-only pointers), so the truncation stops here.
98
+ await trx('image_items').delete();
99
+ await trx('anchor_edges').delete();
100
+ await trx('resource_ref_edges').delete();
101
+ await trx('page_meta').delete();
102
+ await trx('resource_items').delete();
103
+ await trx('content_items').delete();
104
+ await populateContentItems(trx, onProgress);
105
+ await populatePageMeta(trx, onProgress);
106
+ await populateResourceItems(trx, onProgress);
107
+ await populateAnchorEdges(trx, onProgress);
108
+ await populateResourceRefEdges(trx);
109
+ await populateImageItems(trx, resolvePageDomPaths, onProgress);
110
+ }
@@ -0,0 +1,91 @@
1
+ import type { ProgressCallback } from '../create-progress-reporter.js';
2
+ import type { DomPathResult } from './types.js';
3
+ import type { Knex } from 'knex';
4
+ /**
5
+ * Callback that resolves DOM-path strings for one page's images. The
6
+ * callback receives the page's HTML string (or `null` when no snapshot
7
+ * is stored) plus the page's `images` rows, and must return one
8
+ * {@link DomPathResult} per row.
9
+ *
10
+ * Injected rather than hard-coded so `@nitpicker/archive` does not
11
+ * become a jsdom consumer at runtime — the migration script
12
+ * (`scripts/migrate-to-0.13.mjs`) wires a jsdom-backed
13
+ * implementation, while unit tests inject stubs. A future crawler-time
14
+ * DOM-path capture can use the same signature with
15
+ * puppeteer-backed elements.
16
+ */
17
+ export type PageDomPathResolver = (pageId: number, htmlString: string | null, images: readonly ImageRowForResolver[]) => Promise<ReadonlyMap<number, DomPathResult>>;
18
+ /**
19
+ * The projection of `images` rows passed to a
20
+ * {@link PageDomPathResolver}. Kept as a narrow shape (only the fields
21
+ * the resolver needs) so callers of the resolver do not depend on the
22
+ * full row width.
23
+ */
24
+ export interface ImageRowForResolver {
25
+ /** Legacy `images.id`. */
26
+ id: number;
27
+ /** Legacy `images.sourceCode`. */
28
+ sourceCode: string | null;
29
+ }
30
+ /**
31
+ * Populates `image_items` from `images` (issue #193).
32
+ *
33
+ * The outer loop iterates **pages**, not images. Each page's images are
34
+ * processed as one whole unit — dom-path derivation, HTML BLOB fetch,
35
+ * and ref lookups all happen once per page. This design closes three
36
+ * separate correctness / efficiency traps that a purely image-chunked
37
+ * loop would expose:
38
+ *
39
+ * 1. **Ordinal-cursor bleed across chunks** — `matchImagesToDomPaths`
40
+ * tracks per-outerHTML cursor state, so a page with 1 000 identical
41
+ * `<img>` tags spanning two image-chunks would reset the cursor at
42
+ * the boundary and duplicate dom_paths already assigned in the
43
+ * previous chunk. Iterating by page keeps every page's cursor state
44
+ * self-contained.
45
+ * 2. **Repeated `getPageHtml` + jsdom parse** — a page whose images
46
+ * straddle N image-chunks would fetch and re-parse the same multi-MB
47
+ * HTML snapshot N times. Iterating by page makes this exactly once
48
+ * per page.
49
+ * 3. **Data-URI routing gap** — legacy `images.src` can be either a
50
+ * plain URL (goes to `url_refs`) or a large `data:` URI (goes to
51
+ * `blob_refs`, per the 512-byte threshold). The lookups partition
52
+ * by that rule, so a data URI is never bound into
53
+ * `resolveUrlRefs`' `WHERE url IN (?)` — which could otherwise
54
+ * exceed SQLite's `SQLITE_MAX_SQL_LENGTH` for multi-KB URIs.
55
+ *
56
+ * Per outer iteration:
57
+ *
58
+ * 1. **Keyset-paginate** distinct `pageId` values from `images`. Peak
59
+ * memory ≈ 500 integers.
60
+ * 2. **Fetch all images** for those page ids in one query, ordered by
61
+ * `(pageId, id)` so JS-side grouping is a linear pass.
62
+ * 3. **Resolve dom paths per page** — one `getPageHtml` + one resolver
63
+ * call each. `dom_path` texts are collected across the whole batch
64
+ * so `upsertTextRefs` runs once per batch.
65
+ * 4. **Partition src / currentSrc** by the data-URI routing rule and
66
+ * batch-resolve url refs, blob refs, and alt text refs across the
67
+ * whole batch.
68
+ * 5. **Bulk INSERT** with explicit `id = images.id`.
69
+ *
70
+ * `INSERT OR IGNORE` on the natural PK makes the step idempotent.
71
+ *
72
+ * HTML BLOBs are read inline via the same `trx` handle rather than
73
+ * through a caller-supplied `getPageHtml` callback: a callback that
74
+ * queried `Database.getHtmlOfPageById` (which uses the non-transactional
75
+ * Knex instance) would re-enter the pool from inside this writer
76
+ * transaction and deadlock on libsql's single writer connection. Reading
77
+ * `page_html_ref` + `page_html_blobs` via `trx` keeps every read on the
78
+ * same connection the outer trx already owns.
79
+ * @param trx - Knex instance or transaction connected to the archive DB.
80
+ * @param resolvePageDomPaths - Callback that returns dom_path strings
81
+ * for one page's images (see {@link PageDomPathResolver}).
82
+ * @param onProgress - Optional sink for periodic progress lines (one per
83
+ * ~5% of distinct `images.pageId` values scanned); see
84
+ * {@link ../create-progress-reporter.ts}.
85
+ * @example
86
+ * const jsdomResolver = createJsdomResolver();
87
+ * await knex.transaction(async (trx) => {
88
+ * await populateImageItems(trx, jsdomResolver);
89
+ * });
90
+ */
91
+ export declare function populateImageItems(trx: Knex, resolvePageDomPaths: PageDomPathResolver, onProgress?: ProgressCallback): Promise<void>;