@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,30 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Creates every `temp.xfer_*` table one source's transfer needs: the
4
+ * `content_items` / `resource_items` plans (per-row action + resolved
5
+ * destination id), the in-scope/referenced staging tables split's plan
6
+ * computation uses, and one `(src_id PRIMARY KEY)` need-table plus one
7
+ * `(src_id PRIMARY KEY, dest_id)` map-table per dictionary in
8
+ * {@link TRANSFER_DICTIONARY_TABLES}.
9
+ *
10
+ * Must run on the SAME connection {@link import('./attach-source-database.js').attachSourceDatabase}
11
+ * attached the source to (SQLite `TEMP` tables are connection-scoped, not
12
+ * transaction-scoped) — and, unlike `ATTACH`, is safe to run either inside
13
+ * or outside a transaction. Called once per source, paired with
14
+ * {@link import('./drop-transfer-temp-tables.js').dropTransferTempTables}
15
+ * after that source's transaction commits, so a second source's plan
16
+ * starts from empty tables rather than accumulating the previous source's
17
+ * rows.
18
+ * @param knex - Knex query builder connected to the destination archive DB
19
+ * (the connection the temp tables attach to).
20
+ * @example
21
+ * ```ts
22
+ * await createTransferTempTables(knex);
23
+ * try {
24
+ * await knex.transaction(async (trx) => { ... });
25
+ * } finally {
26
+ * await dropTransferTempTables(knex);
27
+ * }
28
+ * ```
29
+ */
30
+ export declare function createTransferTempTables(knex: Knex): Promise<void>;
@@ -0,0 +1,59 @@
1
+ import { TRANSFER_DICTIONARY_TABLES } from './transfer-dictionary-tables.js';
2
+ /**
3
+ * Creates every `temp.xfer_*` table one source's transfer needs: the
4
+ * `content_items` / `resource_items` plans (per-row action + resolved
5
+ * destination id), the in-scope/referenced staging tables split's plan
6
+ * computation uses, and one `(src_id PRIMARY KEY)` need-table plus one
7
+ * `(src_id PRIMARY KEY, dest_id)` map-table per dictionary in
8
+ * {@link TRANSFER_DICTIONARY_TABLES}.
9
+ *
10
+ * Must run on the SAME connection {@link import('./attach-source-database.js').attachSourceDatabase}
11
+ * attached the source to (SQLite `TEMP` tables are connection-scoped, not
12
+ * transaction-scoped) — and, unlike `ATTACH`, is safe to run either inside
13
+ * or outside a transaction. Called once per source, paired with
14
+ * {@link import('./drop-transfer-temp-tables.js').dropTransferTempTables}
15
+ * after that source's transaction commits, so a second source's plan
16
+ * starts from empty tables rather than accumulating the previous source's
17
+ * rows.
18
+ * @param knex - Knex query builder connected to the destination archive DB
19
+ * (the connection the temp tables attach to).
20
+ * @example
21
+ * ```ts
22
+ * await createTransferTempTables(knex);
23
+ * try {
24
+ * await knex.transaction(async (trx) => { ... });
25
+ * } finally {
26
+ * await dropTransferTempTables(knex);
27
+ * }
28
+ * ```
29
+ */
30
+ export async function createTransferTempTables(knex) {
31
+ await knex.raw(`
32
+ CREATE TEMP TABLE xfer_ci_plan (
33
+ src_id INTEGER PRIMARY KEY,
34
+ action INTEGER NOT NULL,
35
+ dest_id INTEGER
36
+ )
37
+ `);
38
+ await knex.raw(`
39
+ CREATE TEMP TABLE xfer_ci_in_scope (
40
+ src_id INTEGER PRIMARY KEY
41
+ )
42
+ `);
43
+ await knex.raw(`
44
+ CREATE TEMP TABLE xfer_ci_ref (
45
+ src_id INTEGER PRIMARY KEY
46
+ )
47
+ `);
48
+ await knex.raw(`
49
+ CREATE TEMP TABLE xfer_ri_plan (
50
+ src_id INTEGER PRIMARY KEY,
51
+ action INTEGER NOT NULL,
52
+ dest_id INTEGER
53
+ )
54
+ `);
55
+ for (const table of TRANSFER_DICTIONARY_TABLES) {
56
+ await knex.raw(`CREATE TEMP TABLE xfer_need_${table} (src_id INTEGER PRIMARY KEY)`);
57
+ await knex.raw(`CREATE TEMP TABLE xfer_map_${table} (src_id INTEGER PRIMARY KEY, dest_id INTEGER NOT NULL)`);
58
+ }
59
+ }
@@ -0,0 +1,32 @@
1
+ /** One content-addressable dictionary table's copy contract. */
2
+ export interface DictionaryCopySpec {
3
+ /** Table name (same in both `main` and the attached source). */
4
+ readonly table: string;
5
+ /**
6
+ * Column(s) forming the natural (content-addressed) key used both as
7
+ * the `ON CONFLICT` target on insert and to re-resolve the
8
+ * destination id for every source row afterwards. This is
9
+ * DELIBERATELY not always the table's `UNIQUE` constraint used at
10
+ * write time — see `header_sets`' entry below.
11
+ */
12
+ readonly naturalKey: readonly string[];
13
+ }
14
+ /**
15
+ * Every dictionary table a transfer copies (concat and split alike), in
16
+ * dependency order (independent dictionaries first; `header_sets` before
17
+ * its `header_set_entries`/`header_flags` children — handled separately in
18
+ * `copy-header-set-children.ts` since they have no own id to map;
19
+ * `console_log_items` has no cross-dictionary FKs of
20
+ * its own, so ordering relative to the others does not matter).
21
+ *
22
+ * `header_sets`' natural key is `raw_hash` alone, not
23
+ * `(raw_json_hash, raw_hash)` — `raw_json_hash` is BLAKE3 of the raw
24
+ * `responseHeaders` JSON STRING (kept only for the pre-0.13 migration
25
+ * lookup, per `create-ref-tables.ts`'s docs) and can differ between two
26
+ * byte-for-byte-different JSON serialisations of the exact same header
27
+ * set (key order, whitespace), whereas `raw_hash` is BLAKE3 of the
28
+ * decomposed, sorted `name=value` pairs — the actual dedup identity every
29
+ * live write computes against. Two archives crawling the same site
30
+ * therefore share a `raw_hash` far more reliably than a `raw_json_hash`.
31
+ */
32
+ export declare const DICTIONARY_COPY_SPECS: readonly DictionaryCopySpec[];
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Every dictionary table a transfer copies (concat and split alike), in
3
+ * dependency order (independent dictionaries first; `header_sets` before
4
+ * its `header_set_entries`/`header_flags` children — handled separately in
5
+ * `copy-header-set-children.ts` since they have no own id to map;
6
+ * `console_log_items` has no cross-dictionary FKs of
7
+ * its own, so ordering relative to the others does not matter).
8
+ *
9
+ * `header_sets`' natural key is `raw_hash` alone, not
10
+ * `(raw_json_hash, raw_hash)` — `raw_json_hash` is BLAKE3 of the raw
11
+ * `responseHeaders` JSON STRING (kept only for the pre-0.13 migration
12
+ * lookup, per `create-ref-tables.ts`'s docs) and can differ between two
13
+ * byte-for-byte-different JSON serialisations of the exact same header
14
+ * set (key order, whitespace), whereas `raw_hash` is BLAKE3 of the
15
+ * decomposed, sorted `name=value` pairs — the actual dedup identity every
16
+ * live write computes against. Two archives crawling the same site
17
+ * therefore share a `raw_hash` far more reliably than a `raw_json_hash`.
18
+ */
19
+ export const DICTIONARY_COPY_SPECS = [
20
+ { table: 'url_refs', naturalKey: ['url'] },
21
+ { table: 'content_type_refs', naturalKey: ['raw'] },
22
+ { table: 'text_refs', naturalKey: ['hash', 'text'] },
23
+ { table: 'json_refs', naturalKey: ['hash'] },
24
+ { table: 'blob_refs', naturalKey: ['hash'] },
25
+ { table: 'header_name_refs', naturalKey: ['name'] },
26
+ { table: 'header_value_refs', naturalKey: ['hash', 'value'] },
27
+ { table: 'header_sets', naturalKey: ['raw_hash'] },
28
+ ];
@@ -0,0 +1,9 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Drops every temp table
4
+ * {@link import('./create-transfer-temp-tables.js').createTransferTempTables}
5
+ * created, so the next source starts from a clean slate. Safe to call even
6
+ * if creation only partially succeeded (`IF EXISTS`).
7
+ * @param knex - Knex query builder connected to the destination archive DB.
8
+ */
9
+ export declare function dropTransferTempTables(knex: Knex): Promise<void>;
@@ -0,0 +1,18 @@
1
+ import { TRANSFER_DICTIONARY_TABLES } from './transfer-dictionary-tables.js';
2
+ /**
3
+ * Drops every temp table
4
+ * {@link import('./create-transfer-temp-tables.js').createTransferTempTables}
5
+ * created, so the next source starts from a clean slate. Safe to call even
6
+ * if creation only partially succeeded (`IF EXISTS`).
7
+ * @param knex - Knex query builder connected to the destination archive DB.
8
+ */
9
+ export async function dropTransferTempTables(knex) {
10
+ await knex.raw('DROP TABLE IF EXISTS xfer_ci_plan');
11
+ await knex.raw('DROP TABLE IF EXISTS xfer_ci_in_scope');
12
+ await knex.raw('DROP TABLE IF EXISTS xfer_ci_ref');
13
+ await knex.raw('DROP TABLE IF EXISTS xfer_ri_plan');
14
+ for (const table of TRANSFER_DICTIONARY_TABLES) {
15
+ await knex.raw(`DROP TABLE IF EXISTS xfer_need_${table}`);
16
+ await knex.raw(`DROP TABLE IF EXISTS xfer_map_${table}`);
17
+ }
18
+ }
@@ -0,0 +1,44 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Re-flattens `content_items.redirect_dest_id` to a single hop after
4
+ * concat, breaking any cycle it finds.
5
+ *
6
+ * Every source archive individually satisfies the "redirect destination
7
+ * is always the final hop" invariant (`linkRedirectSources` pre-flattens
8
+ * at write time), but merging two sources can reintroduce a chain: if
9
+ * source A has `P → X` (X external/unresolved in A) and source B's
10
+ * winning row for X is itself `X → Y`, the merged destination now has a
11
+ * two-hop `P → X → Y` — a shape no single crawl ever produces, and every
12
+ * reader in this codebase (`resolveAliasAndRedirectChain`,
13
+ * `list-links.ts`, …) assumes at most one hop.
14
+ *
15
+ * Runs a bounded loop: each pass sets every row's `redirect_dest_id` to
16
+ * its CURRENT target's `redirect_dest_id` when that target itself
17
+ * redirects further, stopping either when a pass changes zero rows or
18
+ * after `maxHops` passes (a cross-source cycle — A→B, B→A — would
19
+ * otherwise loop forever alternating between the two, since neither
20
+ * satisfies "my target has no further redirect"). Any row still part of
21
+ * a chain after the cap, or found to point at itself, is a cycle: its
22
+ * `redirect_dest_id` is set to `NULL` rather than left pointing at a
23
+ * still-chained row.
24
+ *
25
+ * This is whole-archive (not source-scoped) and split-safe: a single,
26
+ * not-yet-merged source is already flat (this function is still called
27
+ * for split too, for uniformity — every pass finds zero rows to change on
28
+ * the first iteration, a cheap no-op).
29
+ * @param trx - The destination transaction (no source ATTACHed — this
30
+ * runs once, after every source has been transferred, not per-source).
31
+ * @param maxHops - Maximum flatten passes before treating any remaining
32
+ * chain as a cycle. Defaults to {@link DEFAULT_MAX_HOPS}.
33
+ * @returns The number of rows flattened across every pass, and the number
34
+ * of cycle rows NULLed out.
35
+ * @example
36
+ * ```ts
37
+ * for (const source of sources) { await transferArchiveRows(...); }
38
+ * const { flattened, cyclesBroken } = await flattenRedirectChains(knex);
39
+ * ```
40
+ */
41
+ export declare function flattenRedirectChains(trx: Knex, maxHops?: number): Promise<{
42
+ flattened: number;
43
+ cyclesBroken: number;
44
+ }>;
@@ -0,0 +1,74 @@
1
+ /** Default cap on flatten iterations — see {@link flattenRedirectChains}'s docs. */
2
+ const DEFAULT_MAX_HOPS = 32;
3
+ /**
4
+ * Re-flattens `content_items.redirect_dest_id` to a single hop after
5
+ * concat, breaking any cycle it finds.
6
+ *
7
+ * Every source archive individually satisfies the "redirect destination
8
+ * is always the final hop" invariant (`linkRedirectSources` pre-flattens
9
+ * at write time), but merging two sources can reintroduce a chain: if
10
+ * source A has `P → X` (X external/unresolved in A) and source B's
11
+ * winning row for X is itself `X → Y`, the merged destination now has a
12
+ * two-hop `P → X → Y` — a shape no single crawl ever produces, and every
13
+ * reader in this codebase (`resolveAliasAndRedirectChain`,
14
+ * `list-links.ts`, …) assumes at most one hop.
15
+ *
16
+ * Runs a bounded loop: each pass sets every row's `redirect_dest_id` to
17
+ * its CURRENT target's `redirect_dest_id` when that target itself
18
+ * redirects further, stopping either when a pass changes zero rows or
19
+ * after `maxHops` passes (a cross-source cycle — A→B, B→A — would
20
+ * otherwise loop forever alternating between the two, since neither
21
+ * satisfies "my target has no further redirect"). Any row still part of
22
+ * a chain after the cap, or found to point at itself, is a cycle: its
23
+ * `redirect_dest_id` is set to `NULL` rather than left pointing at a
24
+ * still-chained row.
25
+ *
26
+ * This is whole-archive (not source-scoped) and split-safe: a single,
27
+ * not-yet-merged source is already flat (this function is still called
28
+ * for split too, for uniformity — every pass finds zero rows to change on
29
+ * the first iteration, a cheap no-op).
30
+ * @param trx - The destination transaction (no source ATTACHed — this
31
+ * runs once, after every source has been transferred, not per-source).
32
+ * @param maxHops - Maximum flatten passes before treating any remaining
33
+ * chain as a cycle. Defaults to {@link DEFAULT_MAX_HOPS}.
34
+ * @returns The number of rows flattened across every pass, and the number
35
+ * of cycle rows NULLed out.
36
+ * @example
37
+ * ```ts
38
+ * for (const source of sources) { await transferArchiveRows(...); }
39
+ * const { flattened, cyclesBroken } = await flattenRedirectChains(knex);
40
+ * ```
41
+ */
42
+ export async function flattenRedirectChains(trx, maxHops = DEFAULT_MAX_HOPS) {
43
+ let flattened = 0;
44
+ for (let hop = 0; hop < maxHops; hop++) {
45
+ const result = await trx.raw(`
46
+ UPDATE content_items
47
+ SET redirect_dest_id = t.redirect_dest_id
48
+ FROM content_items t
49
+ WHERE t.id = content_items.redirect_dest_id
50
+ AND t.redirect_dest_id IS NOT NULL
51
+ AND t.redirect_dest_id != content_items.id
52
+ `);
53
+ const changes = result?.changes ?? 0;
54
+ flattened += changes;
55
+ if (changes === 0) {
56
+ break;
57
+ }
58
+ }
59
+ const selfLoops = await trx
60
+ .select('id')
61
+ .from('content_items')
62
+ .whereRaw('redirect_dest_id = id');
63
+ const stillChained = await trx
64
+ .select('t1.id as id')
65
+ .from({ t1: 'content_items' })
66
+ .join({ t2: 'content_items' }, 't2.id', 't1.redirect_dest_id')
67
+ .whereNotNull('t1.redirect_dest_id')
68
+ .whereNotNull('t2.redirect_dest_id');
69
+ const cycleIds = [...new Set([...selfLoops, ...stillChained].map((r) => r.id))];
70
+ if (cycleIds.length > 0) {
71
+ await trx('content_items').whereIn('id', cycleIds).update({ redirect_dest_id: null });
72
+ }
73
+ return { flattened, cyclesBroken: cycleIds.length };
74
+ }
@@ -0,0 +1,35 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Inserts every `full`/`stub`-action `content_items` row from
4
+ * `temp.xfer_ci_plan` into the destination, then backfills each plan row's
5
+ * `dest_id` with the id the insert assigned.
6
+ *
7
+ * Every column is looked up via {@link listTransferColumns} (never a
8
+ * hand-written list — see that function's docs for why) and given an
9
+ * explicit SELECT expression by {@link columnExpression}: dictionary FK
10
+ * columns resolve through their `temp.xfer_map_*` table, `is_external`/
11
+ * `is_target` are forced for `stub` rows, and `redirect_dest_id`/
12
+ * `alias_of_id`/`dedupe_cap_event_id` are always written `NULL` (see
13
+ * {@link columnExpression}'s docs). Every other column passes through
14
+ * unchanged.
15
+ *
16
+ * Must run AFTER every dictionary copy this source needs
17
+ * (`copy-dictionaries-for-concat.ts` / `copy-dictionaries-for-split.ts`,
18
+ * `copy-header-set-children.ts`) — a `full`/`stub` row's `url_id` is NOT
19
+ * NULL, so a missing `temp.xfer_map_url_refs` entry surfaces immediately
20
+ * as a constraint violation rather than silently inserting garbage.
21
+ * @param trx - Transaction with the source ATTACHed as
22
+ * {@link TRANSFER_SOURCE_ALIAS}.
23
+ * @param options - Options.
24
+ * @param options.crawlOrderOffset - Added to every copied row's
25
+ * `crawl_order` (concat: the destination's current `MAX(crawl_order)`,
26
+ * so a second source's pages sort after the first's; split: `0`, since
27
+ * a single source's relative order is preserved as-is).
28
+ * @example
29
+ * ```ts
30
+ * await insertContentItems(trx, { crawlOrderOffset: 0 });
31
+ * ```
32
+ */
33
+ export declare function insertContentItems(trx: Knex, options: {
34
+ crawlOrderOffset: number;
35
+ }): Promise<void>;
@@ -0,0 +1,116 @@
1
+ import { listTransferColumns } from './list-transfer-columns.js';
2
+ import { quoteTransferIdentifier } from './quote-transfer-identifier.js';
3
+ import { TRANSFER_ACTION } from './transfer-action.js';
4
+ import { TRANSFER_SOURCE_ALIAS } from './transfer-source-alias.js';
5
+ const SRC = TRANSFER_SOURCE_ALIAS;
6
+ /**
7
+ * Builds the per-column SELECT expression for one `content_items` column,
8
+ * given its plan-driven remap rule.
9
+ * @param column - The destination column name.
10
+ * @param crawlOrderOffset - See {@link insertContentItems}.
11
+ */
12
+ function columnExpression(column, crawlOrderOffset) {
13
+ switch (column) {
14
+ case 'url_id': {
15
+ return 'mu.dest_id';
16
+ }
17
+ case 'content_type_id': {
18
+ return 'mct.dest_id';
19
+ }
20
+ case 'header_set_id': {
21
+ return 'mhs.dest_id';
22
+ }
23
+ case 'redirect_dest_id':
24
+ case 'alias_of_id':
25
+ case 'dedupe_cap_event_id': {
26
+ // Never carried over verbatim: `redirect_dest_id` is remapped in a
27
+ // later pass once every source id has a destination id
28
+ // (`remap-redirect-dest-ids.ts`); `alias_of_id`/`dedupe_cap_event_id`
29
+ // are always recomputed from scratch by the mandatory viewer
30
+ // read-model rebuild's backfills, so writing a stale source value
31
+ // here would only be overwritten moments later.
32
+ return 'NULL';
33
+ }
34
+ case 'is_external': {
35
+ // A `stub` row is forced external regardless of what it was in the
36
+ // source archive (it may well have been a fully-scraped internal
37
+ // page there) — that IS the definition of "kept as a stub".
38
+ return `CASE WHEN p.action = ${TRANSFER_ACTION.stub} THEN 1 ELSE s.is_external END`;
39
+ }
40
+ case 'is_target': {
41
+ return `CASE WHEN p.action = ${TRANSFER_ACTION.stub} THEN 0 ELSE s.is_target END`;
42
+ }
43
+ case 'crawl_order': {
44
+ // `s.crawl_order + offset` is NULL-safe for free: SQLite's `+`
45
+ // against a NULL operand yields NULL, matching a source row whose
46
+ // `crawl_order` was never set (pre-#... archives, or rows written
47
+ // outside the normal crawl-order-assigning path).
48
+ return `s.crawl_order + ${crawlOrderOffset}`;
49
+ }
50
+ default: {
51
+ return `s.${quoteTransferIdentifier(column)}`;
52
+ }
53
+ }
54
+ }
55
+ /**
56
+ * Inserts every `full`/`stub`-action `content_items` row from
57
+ * `temp.xfer_ci_plan` into the destination, then backfills each plan row's
58
+ * `dest_id` with the id the insert assigned.
59
+ *
60
+ * Every column is looked up via {@link listTransferColumns} (never a
61
+ * hand-written list — see that function's docs for why) and given an
62
+ * explicit SELECT expression by {@link columnExpression}: dictionary FK
63
+ * columns resolve through their `temp.xfer_map_*` table, `is_external`/
64
+ * `is_target` are forced for `stub` rows, and `redirect_dest_id`/
65
+ * `alias_of_id`/`dedupe_cap_event_id` are always written `NULL` (see
66
+ * {@link columnExpression}'s docs). Every other column passes through
67
+ * unchanged.
68
+ *
69
+ * Must run AFTER every dictionary copy this source needs
70
+ * (`copy-dictionaries-for-concat.ts` / `copy-dictionaries-for-split.ts`,
71
+ * `copy-header-set-children.ts`) — a `full`/`stub` row's `url_id` is NOT
72
+ * NULL, so a missing `temp.xfer_map_url_refs` entry surfaces immediately
73
+ * as a constraint violation rather than silently inserting garbage.
74
+ * @param trx - Transaction with the source ATTACHed as
75
+ * {@link TRANSFER_SOURCE_ALIAS}.
76
+ * @param options - Options.
77
+ * @param options.crawlOrderOffset - Added to every copied row's
78
+ * `crawl_order` (concat: the destination's current `MAX(crawl_order)`,
79
+ * so a second source's pages sort after the first's; split: `0`, since
80
+ * a single source's relative order is preserved as-is).
81
+ * @example
82
+ * ```ts
83
+ * await insertContentItems(trx, { crawlOrderOffset: 0 });
84
+ * ```
85
+ */
86
+ export async function insertContentItems(trx, options) {
87
+ const columns = await listTransferColumns(trx, SRC, 'content_items', ['id']);
88
+ const columnList = columns.map(quoteTransferIdentifier).join(', ');
89
+ const selectList = columns
90
+ .map((col) => columnExpression(col, options.crawlOrderOffset))
91
+ .join(', ');
92
+ await trx.raw(`
93
+ INSERT INTO main.content_items (${columnList})
94
+ SELECT ${selectList}
95
+ FROM ${SRC}.content_items s
96
+ JOIN xfer_ci_plan p ON p.src_id = s.id
97
+ LEFT JOIN xfer_map_url_refs mu ON mu.src_id = s.url_id
98
+ LEFT JOIN xfer_map_content_type_refs mct ON mct.src_id = s.content_type_id
99
+ LEFT JOIN xfer_map_header_sets mhs ON mhs.src_id = s.header_set_id
100
+ WHERE p.action IN (${TRANSFER_ACTION.full}, ${TRANSFER_ACTION.stub})
101
+ ORDER BY s.id
102
+ `);
103
+ await trx.raw(`
104
+ UPDATE xfer_ci_plan
105
+ SET dest_id = x.dest_id
106
+ FROM (
107
+ SELECT p.src_id AS src_id, d.id AS dest_id
108
+ FROM xfer_ci_plan p
109
+ JOIN ${SRC}.content_items s ON s.id = p.src_id
110
+ JOIN xfer_map_url_refs mu ON mu.src_id = s.url_id
111
+ JOIN main.content_items d ON d.url_id = mu.dest_id
112
+ WHERE p.action IN (${TRANSFER_ACTION.full}, ${TRANSFER_ACTION.stub})
113
+ ) x
114
+ WHERE xfer_ci_plan.src_id = x.src_id
115
+ `);
116
+ }
@@ -0,0 +1,35 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Lists a table's column names via SQLite's `pragma_table_info` table-valued
4
+ * function, in declaration order, minus any names in `exclude`.
5
+ *
6
+ * A transfer copy must NEVER build its column list from a hand-written
7
+ * literal or from `SELECT *` — migrated archives add columns via `ALTER
8
+ * TABLE ADD COLUMN`, which always appends at the end, so a fresh archive's
9
+ * `content_items` (say) can have `alias_of_id` earlier in declaration order
10
+ * than a migrated archive's copy of the same table. A positional `INSERT
11
+ * ... SELECT * FROM other_table` across two archives with different column
12
+ * orders would silently shift values into the wrong columns. Reading each
13
+ * side's own column list and building an explicit, named `SELECT
14
+ * <col1>, <col2>, ...` (this function's contract) sidesteps the problem
15
+ * entirely — column order never matters when every column is named.
16
+ *
17
+ * The pragma table-valued function must be schema-qualified as
18
+ * `<schema>.pragma_table_info(<table>)` — `pragma_table_info('schema.table')`
19
+ * silently returns zero rows instead of erroring, so `schema` and `table`
20
+ * are deliberately separate parameters rather than one dotted string a
21
+ * caller could get wrong.
22
+ * @param knex - Knex query builder connected to the archive DB.
23
+ * @param schema - The schema the table lives in: `'main'` for the
24
+ * destination, or the attached source's alias (`TRANSFER_SOURCE_ALIAS`).
25
+ * @param table - Bare table name (no schema prefix).
26
+ * @param exclude - Column names to omit (typically the PK, which a copy
27
+ * assigns fresh via `AUTOINCREMENT` rather than carrying over).
28
+ * @returns Column names in declaration order, minus `exclude`.
29
+ * @example
30
+ * ```ts
31
+ * const columns = await listTransferColumns(trx, 'xfer_src', 'content_items', ['id']);
32
+ * // ['url_id', 'is_external', 'scraped', ...] — in THIS archive's own order
33
+ * ```
34
+ */
35
+ export declare function listTransferColumns(knex: Knex, schema: string, table: string, exclude?: readonly string[]): Promise<string[]>;
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Lists a table's column names via SQLite's `pragma_table_info` table-valued
3
+ * function, in declaration order, minus any names in `exclude`.
4
+ *
5
+ * A transfer copy must NEVER build its column list from a hand-written
6
+ * literal or from `SELECT *` — migrated archives add columns via `ALTER
7
+ * TABLE ADD COLUMN`, which always appends at the end, so a fresh archive's
8
+ * `content_items` (say) can have `alias_of_id` earlier in declaration order
9
+ * than a migrated archive's copy of the same table. A positional `INSERT
10
+ * ... SELECT * FROM other_table` across two archives with different column
11
+ * orders would silently shift values into the wrong columns. Reading each
12
+ * side's own column list and building an explicit, named `SELECT
13
+ * <col1>, <col2>, ...` (this function's contract) sidesteps the problem
14
+ * entirely — column order never matters when every column is named.
15
+ *
16
+ * The pragma table-valued function must be schema-qualified as
17
+ * `<schema>.pragma_table_info(<table>)` — `pragma_table_info('schema.table')`
18
+ * silently returns zero rows instead of erroring, so `schema` and `table`
19
+ * are deliberately separate parameters rather than one dotted string a
20
+ * caller could get wrong.
21
+ * @param knex - Knex query builder connected to the archive DB.
22
+ * @param schema - The schema the table lives in: `'main'` for the
23
+ * destination, or the attached source's alias (`TRANSFER_SOURCE_ALIAS`).
24
+ * @param table - Bare table name (no schema prefix).
25
+ * @param exclude - Column names to omit (typically the PK, which a copy
26
+ * assigns fresh via `AUTOINCREMENT` rather than carrying over).
27
+ * @returns Column names in declaration order, minus `exclude`.
28
+ * @example
29
+ * ```ts
30
+ * const columns = await listTransferColumns(trx, 'xfer_src', 'content_items', ['id']);
31
+ * // ['url_id', 'is_external', 'scraped', ...] — in THIS archive's own order
32
+ * ```
33
+ */
34
+ export async function listTransferColumns(knex, schema, table, exclude = []) {
35
+ const excludeSet = new Set(exclude);
36
+ const rows = await knex
37
+ .select('name')
38
+ .from(knex.raw(`${schema}.pragma_table_info(?)`, [table]))
39
+ .orderBy('cid');
40
+ const columns = rows.map((row) => row.name).filter((name) => !excludeSet.has(name));
41
+ if (columns.length === 0) {
42
+ throw new Error(`No columns found for table "${schema}.${table}" — does it exist?`);
43
+ }
44
+ return columns;
45
+ }
@@ -0,0 +1,31 @@
1
+ import type { ExURL, ParseURLOptions } from '@d-zero/shared/parse-url';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Determines which of the source's internal (`is_external = 0`)
5
+ * `content_items` rows fall inside `scope` (split's new, narrower root
6
+ * set), writing matching ids into `temp.xfer_ci_in_scope`.
7
+ *
8
+ * Mirrors `repromoteExternalPages`'s shape (load every candidate URL into
9
+ * memory, classify with {@link findScopeEntry} in JS, write matches back
10
+ * in bound-count-safe chunks) — the same accepted pattern for a one-off,
11
+ * whole-archive scope reclassification. External rows are never
12
+ * candidates here: split's scope check only ever needs to know "was this
13
+ * an internal page that is now out of scope", since the "external
14
+ * everywhere but in scope" case is a concat-only concept (split has a
15
+ * single source, so there is nothing to promote).
16
+ * @param trx - Transaction with the source ATTACHed as
17
+ * {@link TRANSFER_SOURCE_ALIAS}. Must run after
18
+ * {@link import('./create-transfer-temp-tables.js').createTransferTempTables}.
19
+ * @param scope - The new (narrower) scope map, from
20
+ * {@link import('../scope/build-scope-map.js').buildScopeMap} over
21
+ * the split's scope URLs.
22
+ * @param options - URL parsing options forwarded to {@link findScopeEntry}
23
+ * (the source archive's own `disableQueries`, typically).
24
+ * @returns The number of ids written to `temp.xfer_ci_in_scope`.
25
+ * @example
26
+ * ```ts
27
+ * const scope = buildScopeMap(['https://example.com/blog/']);
28
+ * const inScopeCount = await markInScopeContentItems(trx, scope, sourceConfig);
29
+ * ```
30
+ */
31
+ export declare function markInScopeContentItems(trx: Knex, scope: ReadonlyMap<string, readonly ExURL[]>, options?: ParseURLOptions): Promise<number>;
@@ -0,0 +1,54 @@
1
+ import { tryParseUrl as parseUrl } from '@d-zero/shared/parse-url';
2
+ import { findScopeEntry } from '../scope/find-scope-entry.js';
3
+ import { TRANSFER_SOURCE_ALIAS } from './transfer-source-alias.js';
4
+ /**
5
+ * Determines which of the source's internal (`is_external = 0`)
6
+ * `content_items` rows fall inside `scope` (split's new, narrower root
7
+ * set), writing matching ids into `temp.xfer_ci_in_scope`.
8
+ *
9
+ * Mirrors `repromoteExternalPages`'s shape (load every candidate URL into
10
+ * memory, classify with {@link findScopeEntry} in JS, write matches back
11
+ * in bound-count-safe chunks) — the same accepted pattern for a one-off,
12
+ * whole-archive scope reclassification. External rows are never
13
+ * candidates here: split's scope check only ever needs to know "was this
14
+ * an internal page that is now out of scope", since the "external
15
+ * everywhere but in scope" case is a concat-only concept (split has a
16
+ * single source, so there is nothing to promote).
17
+ * @param trx - Transaction with the source ATTACHed as
18
+ * {@link TRANSFER_SOURCE_ALIAS}. Must run after
19
+ * {@link import('./create-transfer-temp-tables.js').createTransferTempTables}.
20
+ * @param scope - The new (narrower) scope map, from
21
+ * {@link import('../scope/build-scope-map.js').buildScopeMap} over
22
+ * the split's scope URLs.
23
+ * @param options - URL parsing options forwarded to {@link findScopeEntry}
24
+ * (the source archive's own `disableQueries`, typically).
25
+ * @returns The number of ids written to `temp.xfer_ci_in_scope`.
26
+ * @example
27
+ * ```ts
28
+ * const scope = buildScopeMap(['https://example.com/blog/']);
29
+ * const inScopeCount = await markInScopeContentItems(trx, scope, sourceConfig);
30
+ * ```
31
+ */
32
+ export async function markInScopeContentItems(trx, scope, options) {
33
+ const candidates = await trx
34
+ .select(`${TRANSFER_SOURCE_ALIAS}.content_items.id as id`, 'url_refs.url as url')
35
+ .from(`${TRANSFER_SOURCE_ALIAS}.content_items`)
36
+ .join({ url_refs: `${TRANSFER_SOURCE_ALIAS}.url_refs` }, 'url_refs.id', `${TRANSFER_SOURCE_ALIAS}.content_items.url_id`)
37
+ .where(`${TRANSFER_SOURCE_ALIAS}.content_items.is_external`, 0);
38
+ const inScopeIds = [];
39
+ for (const row of candidates) {
40
+ const parsed = parseUrl(row.url, options);
41
+ if (!parsed) {
42
+ continue;
43
+ }
44
+ if (findScopeEntry(parsed, scope, options) !== null) {
45
+ inScopeIds.push(row.id);
46
+ }
47
+ }
48
+ const chunkSize = 500;
49
+ for (let i = 0; i < inScopeIds.length; i += chunkSize) {
50
+ const chunk = inScopeIds.slice(i, i + chunkSize);
51
+ await trx.insert(chunk.map((id) => ({ src_id: id }))).into('xfer_ci_in_scope');
52
+ }
53
+ return inScopeIds.length;
54
+ }