@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,51 @@
1
+ import type { Config } from '../types.js';
2
+ /**
3
+ * Merges two or more source archives' {@link Config} into the config
4
+ * concat's output archive is created with.
5
+ *
6
+ * - `disableQueries` and `fromList` must be IDENTICAL across every
7
+ * source, or this throws {@link ArchiveConfigConflictError}:
8
+ * - `disableQueries` changes how every URL is normalised
9
+ * (`normalizeArchiveUrl`'s `ExURL.withoutHashAndAuth` vs. a
10
+ * query-stripped form) — sources crawled with different settings
11
+ * have incomparable `url_refs.url` values, so URL-string matching
12
+ * (`plan-content-items-for-concat.ts`'s whole mechanism) would
13
+ * silently misclassify identical URLs as distinct.
14
+ * - `fromList` archives restrict which internal rows the viewer read
15
+ * model admits to exactly `config.roots` (`computeFromListAllowedPageIds`) —
16
+ * mixing a `fromList` source with a recursive one has no single
17
+ * correct restriction rule.
18
+ * - `roots` is the union of every source's roots, in argument order,
19
+ * deduplicated (a root appearing in two sources counts once).
20
+ * `baseUrl` is the merged `roots[0]`.
21
+ * - `excludes` / `excludeKeywords` / `excludeUrls` are unioned the same
22
+ * way, order-preserving.
23
+ * - `requestHeaderNames` is unioned too: it only records which header names
24
+ * ANY source needed (never values), so dropping a later source's names would
25
+ * silence the "re-supply these headers" warning for that source's pages.
26
+ * - Every other scalar field (`recursive`, `interval`, `image`,
27
+ * `fetchExternal`, `parallels`, `maxExcludedDepth`, `retry`,
28
+ * `userAgent`, `ignoreRobots`, `mainContentSelector`) is taken from the
29
+ * FIRST source — these only ever describe how a crawl session was RUN,
30
+ * never the shape of the data, so there is no principled way to merge
31
+ * two different values and "first argument wins" is at least
32
+ * predictable.
33
+ * - `version` is always {@link REQUIRED_FORMAT_VERSION} (the output is a
34
+ * freshly-created archive on the current format) and `createdCwd` is
35
+ * always `null` (never persisted into a shared `.nitpicker`, per
36
+ * `Archive.write()`'s own scrub — see the DB schema doc's `info.createdCwd`
37
+ * entry).
38
+ * @param configs - Every source's `getConfig()` result, in argument order.
39
+ * @param name - The output archive's `name` (typically its basename).
40
+ * @returns The merged {@link Config} to write via `Archive#setConfig`.
41
+ * @throws {ArchiveConfigConflictError} If `disableQueries` or `fromList`
42
+ * differ across `configs`.
43
+ * @example
44
+ * ```ts
45
+ * const merged = mergeArchiveConfigs(
46
+ * [await a.getConfig(), await b.getConfig()],
47
+ * 'merged',
48
+ * );
49
+ * ```
50
+ */
51
+ export declare function mergeArchiveConfigs(configs: readonly Config[], name: string): Config;
@@ -0,0 +1,85 @@
1
+ import { REQUIRED_FORMAT_VERSION } from '../meta/assert-compatible-version.js';
2
+ import { ArchiveConfigConflictError } from './types.js';
3
+ /** {@link Config} fields that must be IDENTICAL across every source, or concat refuses. */
4
+ const STRICT_MATCH_FIELDS = ['disableQueries', 'fromList'];
5
+ /**
6
+ * Merges two or more source archives' {@link Config} into the config
7
+ * concat's output archive is created with.
8
+ *
9
+ * - `disableQueries` and `fromList` must be IDENTICAL across every
10
+ * source, or this throws {@link ArchiveConfigConflictError}:
11
+ * - `disableQueries` changes how every URL is normalised
12
+ * (`normalizeArchiveUrl`'s `ExURL.withoutHashAndAuth` vs. a
13
+ * query-stripped form) — sources crawled with different settings
14
+ * have incomparable `url_refs.url` values, so URL-string matching
15
+ * (`plan-content-items-for-concat.ts`'s whole mechanism) would
16
+ * silently misclassify identical URLs as distinct.
17
+ * - `fromList` archives restrict which internal rows the viewer read
18
+ * model admits to exactly `config.roots` (`computeFromListAllowedPageIds`) —
19
+ * mixing a `fromList` source with a recursive one has no single
20
+ * correct restriction rule.
21
+ * - `roots` is the union of every source's roots, in argument order,
22
+ * deduplicated (a root appearing in two sources counts once).
23
+ * `baseUrl` is the merged `roots[0]`.
24
+ * - `excludes` / `excludeKeywords` / `excludeUrls` are unioned the same
25
+ * way, order-preserving.
26
+ * - `requestHeaderNames` is unioned too: it only records which header names
27
+ * ANY source needed (never values), so dropping a later source's names would
28
+ * silence the "re-supply these headers" warning for that source's pages.
29
+ * - Every other scalar field (`recursive`, `interval`, `image`,
30
+ * `fetchExternal`, `parallels`, `maxExcludedDepth`, `retry`,
31
+ * `userAgent`, `ignoreRobots`, `mainContentSelector`) is taken from the
32
+ * FIRST source — these only ever describe how a crawl session was RUN,
33
+ * never the shape of the data, so there is no principled way to merge
34
+ * two different values and "first argument wins" is at least
35
+ * predictable.
36
+ * - `version` is always {@link REQUIRED_FORMAT_VERSION} (the output is a
37
+ * freshly-created archive on the current format) and `createdCwd` is
38
+ * always `null` (never persisted into a shared `.nitpicker`, per
39
+ * `Archive.write()`'s own scrub — see the DB schema doc's `info.createdCwd`
40
+ * entry).
41
+ * @param configs - Every source's `getConfig()` result, in argument order.
42
+ * @param name - The output archive's `name` (typically its basename).
43
+ * @returns The merged {@link Config} to write via `Archive#setConfig`.
44
+ * @throws {ArchiveConfigConflictError} If `disableQueries` or `fromList`
45
+ * differ across `configs`.
46
+ * @example
47
+ * ```ts
48
+ * const merged = mergeArchiveConfigs(
49
+ * [await a.getConfig(), await b.getConfig()],
50
+ * 'merged',
51
+ * );
52
+ * ```
53
+ */
54
+ export function mergeArchiveConfigs(configs, name) {
55
+ if (configs.length === 0) {
56
+ throw new Error('mergeArchiveConfigs: at least one source config is required');
57
+ }
58
+ for (const field of STRICT_MATCH_FIELDS) {
59
+ const values = configs.map((c) => c[field]);
60
+ const distinct = new Set(values);
61
+ if (distinct.size > 1) {
62
+ throw new ArchiveConfigConflictError(field, values);
63
+ }
64
+ }
65
+ const roots = [...new Set(configs.flatMap((c) => c.roots))];
66
+ const excludes = [...new Set(configs.flatMap((c) => c.excludes))];
67
+ const excludeKeywords = [...new Set(configs.flatMap((c) => c.excludeKeywords))];
68
+ const excludeUrls = [...new Set(configs.flatMap((c) => c.excludeUrls))];
69
+ const requestHeaderNames = [
70
+ ...new Set(configs.flatMap((c) => c.requestHeaderNames ?? [])),
71
+ ];
72
+ const first = configs[0];
73
+ return {
74
+ ...first,
75
+ version: REQUIRED_FORMAT_VERSION,
76
+ name,
77
+ roots,
78
+ baseUrl: roots[0],
79
+ excludes,
80
+ excludeKeywords,
81
+ excludeUrls,
82
+ requestHeaderNames,
83
+ createdCwd: null,
84
+ };
85
+ }
@@ -0,0 +1,33 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Populates `temp.xfer_ci_plan` for one concat source: every source
4
+ * `content_items` row is matched against the destination by URL string
5
+ * (`url_refs.url`, not `url_id` — the two archives assign unrelated ids to
6
+ * the same URL) and classified as:
7
+ *
8
+ * - `full` — no destination row exists yet for this URL.
9
+ * - `replace` — a destination row exists, and this source's rank
10
+ * ({@link contentItemRankSql}) is greater than or equal to the
11
+ * destination's. `>=` (not `>`) is deliberate: sources are merged one at
12
+ * a time in argument order, always compared against the CURRENT
13
+ * destination state, so an equal rank still overwrites — this is what
14
+ * makes "ties go to the later argument" fall out naturally, with no
15
+ * extra tie-breaking logic needed.
16
+ * - `skip` — a destination row exists and outranks this source's row; the
17
+ * destination's existing (better) observation is left untouched.
18
+ *
19
+ * Every source row gets a plan entry (concat never drops a row outright —
20
+ * that only happens in split, where a row can be out of the new scope AND
21
+ * unreferenced). `dest_id` is left `NULL` for `full` rows here; it is
22
+ * filled in once {@link import('./insert-content-items.js').insertContentItems}
23
+ * assigns the new destination id.
24
+ * @param trx - Transaction with the source ATTACHed as
25
+ * {@link TRANSFER_SOURCE_ALIAS}. Must run after
26
+ * {@link import('./create-transfer-temp-tables.js').createTransferTempTables}.
27
+ * @example
28
+ * ```ts
29
+ * await planContentItemsForConcat(trx);
30
+ * const { full, replace, skip } = await countPlanActions(trx); // for progress reporting
31
+ * ```
32
+ */
33
+ export declare function planContentItemsForConcat(trx: Knex): Promise<void>;
@@ -0,0 +1,51 @@
1
+ import { contentItemRankSql } from './content-item-rank-sql.js';
2
+ import { TRANSFER_ACTION } from './transfer-action.js';
3
+ import { TRANSFER_SOURCE_ALIAS } from './transfer-source-alias.js';
4
+ /**
5
+ * Populates `temp.xfer_ci_plan` for one concat source: every source
6
+ * `content_items` row is matched against the destination by URL string
7
+ * (`url_refs.url`, not `url_id` — the two archives assign unrelated ids to
8
+ * the same URL) and classified as:
9
+ *
10
+ * - `full` — no destination row exists yet for this URL.
11
+ * - `replace` — a destination row exists, and this source's rank
12
+ * ({@link contentItemRankSql}) is greater than or equal to the
13
+ * destination's. `>=` (not `>`) is deliberate: sources are merged one at
14
+ * a time in argument order, always compared against the CURRENT
15
+ * destination state, so an equal rank still overwrites — this is what
16
+ * makes "ties go to the later argument" fall out naturally, with no
17
+ * extra tie-breaking logic needed.
18
+ * - `skip` — a destination row exists and outranks this source's row; the
19
+ * destination's existing (better) observation is left untouched.
20
+ *
21
+ * Every source row gets a plan entry (concat never drops a row outright —
22
+ * that only happens in split, where a row can be out of the new scope AND
23
+ * unreferenced). `dest_id` is left `NULL` for `full` rows here; it is
24
+ * filled in once {@link import('./insert-content-items.js').insertContentItems}
25
+ * assigns the new destination id.
26
+ * @param trx - Transaction with the source ATTACHed as
27
+ * {@link TRANSFER_SOURCE_ALIAS}. Must run after
28
+ * {@link import('./create-transfer-temp-tables.js').createTransferTempTables}.
29
+ * @example
30
+ * ```ts
31
+ * await planContentItemsForConcat(trx);
32
+ * const { full, replace, skip } = await countPlanActions(trx); // for progress reporting
33
+ * ```
34
+ */
35
+ export async function planContentItemsForConcat(trx) {
36
+ await trx.raw(`
37
+ INSERT INTO xfer_ci_plan (src_id, action, dest_id)
38
+ SELECT
39
+ s.id,
40
+ CASE
41
+ WHEN d.id IS NULL THEN ${TRANSFER_ACTION.full}
42
+ WHEN ${contentItemRankSql('s')} >= ${contentItemRankSql('d')} THEN ${TRANSFER_ACTION.replace}
43
+ ELSE ${TRANSFER_ACTION.skip}
44
+ END,
45
+ d.id
46
+ FROM ${TRANSFER_SOURCE_ALIAS}.content_items s
47
+ JOIN ${TRANSFER_SOURCE_ALIAS}.url_refs su ON su.id = s.url_id
48
+ LEFT JOIN main.url_refs du ON du.url = su.url
49
+ LEFT JOIN main.content_items d ON d.url_id = du.id
50
+ `);
51
+ }
@@ -0,0 +1,42 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Populates `temp.xfer_ci_plan` for split, in three passes over the
4
+ * source's `content_items`:
5
+ *
6
+ * 1. **Core** — every id `temp.xfer_ci_in_scope` marked (in-scope,
7
+ * internal — see
8
+ * {@link import('./mark-in-scope-content-items.js').markInScopeContentItems})
9
+ * is kept in `full`.
10
+ * 2. **Redirect-destination promotion** — a core row's `redirect_dest_id`,
11
+ * when it points at an INTERNAL row, joins core as `full` too, even if
12
+ * that destination's own path falls outside the split scope. This is
13
+ * the same invariant `insertPage` documents: "the redirect destination
14
+ * of an in-scope request is recorded internal even when its path is out
15
+ * of scope" (a soft-404 landing page is the canonical example) — split
16
+ * must not treat that page differently than a live crawl would. Only
17
+ * ONE hop is honoured here, matching `redirect_dest_id`'s own
18
+ * contract: crawler writes always pre-flatten a redirect chain to its
19
+ * final destination at write time, so a single JOIN already reaches the
20
+ * terminal page — there is no multi-hop chain left to walk in a
21
+ * single, not-yet-merged source archive (concat, which CAN reintroduce
22
+ * a multi-hop chain by combining two sources, re-flattens separately —
23
+ * see `flatten-redirect-chains.ts`).
24
+ * 3. **Referenced-row stubbing** — any row NOT in core that a core row's
25
+ * `anchor_edges` targets, or that a core row's `redirect_dest_id`
26
+ * points at (now only the EXTERNAL case survives this filter, since
27
+ * every internal destination was already absorbed into core by pass
28
+ * 2), is kept as a `stub`: the `content_items` row only, forced
29
+ * external — see `insert-content-items.ts`. A row reachable by neither
30
+ * path is left out of the plan entirely, which is split's definition
31
+ * of "dropped".
32
+ * @param trx - Transaction with the source ATTACHed as
33
+ * {@link TRANSFER_SOURCE_ALIAS}. Must run after
34
+ * {@link import('./mark-in-scope-content-items.js').markInScopeContentItems}
35
+ * has populated `temp.xfer_ci_in_scope`.
36
+ * @example
37
+ * ```ts
38
+ * await markInScopeContentItems(trx, scope, sourceConfig);
39
+ * await planContentItemsForSplit(trx);
40
+ * ```
41
+ */
42
+ export declare function planContentItemsForSplit(trx: Knex): Promise<void>;
@@ -0,0 +1,83 @@
1
+ import { TRANSFER_ACTION } from './transfer-action.js';
2
+ import { TRANSFER_SOURCE_ALIAS } from './transfer-source-alias.js';
3
+ /**
4
+ * Populates `temp.xfer_ci_plan` for split, in three passes over the
5
+ * source's `content_items`:
6
+ *
7
+ * 1. **Core** — every id `temp.xfer_ci_in_scope` marked (in-scope,
8
+ * internal — see
9
+ * {@link import('./mark-in-scope-content-items.js').markInScopeContentItems})
10
+ * is kept in `full`.
11
+ * 2. **Redirect-destination promotion** — a core row's `redirect_dest_id`,
12
+ * when it points at an INTERNAL row, joins core as `full` too, even if
13
+ * that destination's own path falls outside the split scope. This is
14
+ * the same invariant `insertPage` documents: "the redirect destination
15
+ * of an in-scope request is recorded internal even when its path is out
16
+ * of scope" (a soft-404 landing page is the canonical example) — split
17
+ * must not treat that page differently than a live crawl would. Only
18
+ * ONE hop is honoured here, matching `redirect_dest_id`'s own
19
+ * contract: crawler writes always pre-flatten a redirect chain to its
20
+ * final destination at write time, so a single JOIN already reaches the
21
+ * terminal page — there is no multi-hop chain left to walk in a
22
+ * single, not-yet-merged source archive (concat, which CAN reintroduce
23
+ * a multi-hop chain by combining two sources, re-flattens separately —
24
+ * see `flatten-redirect-chains.ts`).
25
+ * 3. **Referenced-row stubbing** — any row NOT in core that a core row's
26
+ * `anchor_edges` targets, or that a core row's `redirect_dest_id`
27
+ * points at (now only the EXTERNAL case survives this filter, since
28
+ * every internal destination was already absorbed into core by pass
29
+ * 2), is kept as a `stub`: the `content_items` row only, forced
30
+ * external — see `insert-content-items.ts`. A row reachable by neither
31
+ * path is left out of the plan entirely, which is split's definition
32
+ * of "dropped".
33
+ * @param trx - Transaction with the source ATTACHed as
34
+ * {@link TRANSFER_SOURCE_ALIAS}. Must run after
35
+ * {@link import('./mark-in-scope-content-items.js').markInScopeContentItems}
36
+ * has populated `temp.xfer_ci_in_scope`.
37
+ * @example
38
+ * ```ts
39
+ * await markInScopeContentItems(trx, scope, sourceConfig);
40
+ * await planContentItemsForSplit(trx);
41
+ * ```
42
+ */
43
+ export async function planContentItemsForSplit(trx) {
44
+ await trx.raw(`
45
+ INSERT INTO xfer_ci_plan (src_id, action)
46
+ SELECT src_id, ${TRANSFER_ACTION.full} FROM xfer_ci_in_scope
47
+ `);
48
+ await trx.raw(`
49
+ INSERT INTO xfer_ci_plan (src_id, action)
50
+ SELECT DISTINCT d.id, ${TRANSFER_ACTION.full}
51
+ FROM ${TRANSFER_SOURCE_ALIAS}.content_items s
52
+ JOIN xfer_ci_plan p ON p.src_id = s.id
53
+ JOIN ${TRANSFER_SOURCE_ALIAS}.content_items d ON d.id = s.redirect_dest_id
54
+ WHERE d.is_external = 0
55
+ AND d.id NOT IN (SELECT src_id FROM xfer_ci_plan)
56
+ `);
57
+ await trx.raw(`
58
+ INSERT OR IGNORE INTO xfer_ci_ref (src_id)
59
+ SELECT DISTINCT ae.href_page_id
60
+ FROM ${TRANSFER_SOURCE_ALIAS}.anchor_edges ae
61
+ JOIN xfer_ci_plan p ON p.src_id = ae.page_id
62
+ WHERE ae.href_page_id NOT IN (SELECT src_id FROM xfer_ci_plan)
63
+ `);
64
+ // `OR IGNORE` on BOTH inserts (not just this one) is deliberate, not
65
+ // redundant: this table's PK is `src_id`, and an anchor target can also
66
+ // be a redirect target of some other core row, so the two passes can
67
+ // legitimately overlap. The first pass alone cannot collide with itself
68
+ // (`SELECT DISTINCT` on an empty destination table), but relying on
69
+ // that ordering to justify leaving it unguarded would silently break if
70
+ // a third insert into `xfer_ci_ref` were ever added ahead of it.
71
+ await trx.raw(`
72
+ INSERT OR IGNORE INTO xfer_ci_ref (src_id)
73
+ SELECT DISTINCT s.redirect_dest_id
74
+ FROM ${TRANSFER_SOURCE_ALIAS}.content_items s
75
+ JOIN xfer_ci_plan p ON p.src_id = s.id
76
+ WHERE s.redirect_dest_id IS NOT NULL
77
+ AND s.redirect_dest_id NOT IN (SELECT src_id FROM xfer_ci_plan)
78
+ `);
79
+ await trx.raw(`
80
+ INSERT INTO xfer_ci_plan (src_id, action)
81
+ SELECT src_id, ${TRANSFER_ACTION.stub} FROM xfer_ci_ref
82
+ `);
83
+ }
@@ -0,0 +1,40 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Populates `temp.xfer_ri_plan` for `resource_items`, one call per source,
4
+ * for either transfer mode:
5
+ *
6
+ * - **`concat`** — every source resource is matched against the
7
+ * destination by its identity (`url_id` resolved through `url_refs.url`,
8
+ * or `url_blob_id` resolved through `blob_refs.hash` — the two are
9
+ * mutually exclusive per `resource_items`' own CHECK constraint, so at
10
+ * most one of the two LEFT JOINs below ever produces a match for a given
11
+ * row) and classified `full` (no destination row yet), `replace`
12
+ * (destination exists but has never recorded a response — `status IS
13
+ * NULL` — while this source has), or `skip` (destination already has a
14
+ * recorded response). Matching happens directly against raw
15
+ * `url`/`hash` values, not through `temp.xfer_map_url_refs`/
16
+ * `xfer_map_blob_refs` — those dictionary maps are built AFTER this
17
+ * plan (`copy-dictionaries-for-concat.ts` needs to know which resources
18
+ * are kept before it can compute needed dictionary ids for split), so
19
+ * this plan cannot depend on them.
20
+ * - **`split`** — a resource is kept (`full`) only when at least one
21
+ * `full`-action page in `temp.xfer_ci_plan` references it via
22
+ * `resource_ref_edges`. A resource with no surviving referrer is left
23
+ * out of the plan (dropped) — split does not preserve an
24
+ * otherwise-orphan resource just because its URL happens to still be
25
+ * in scope (accepted simplification: a resource with zero referring
26
+ * pages has no page context left to display it against in the output
27
+ * archive anyway).
28
+ * @param trx - Transaction with the source ATTACHed as
29
+ * {@link TRANSFER_SOURCE_ALIAS}. For `'split'`, must run after
30
+ * `temp.xfer_ci_plan` has been fully populated (every `full` page
31
+ * decided) — see
32
+ * {@link import('./plan-content-items-for-split.js').planContentItemsForSplit}.
33
+ * @param mode - Which transfer this plan is for.
34
+ * @example
35
+ * ```ts
36
+ * await planContentItemsForSplit(trx);
37
+ * await planResourceItems(trx, 'split');
38
+ * ```
39
+ */
40
+ export declare function planResourceItems(trx: Knex, mode: 'concat' | 'split'): Promise<void>;
@@ -0,0 +1,69 @@
1
+ import { TRANSFER_ACTION } from './transfer-action.js';
2
+ import { TRANSFER_SOURCE_ALIAS } from './transfer-source-alias.js';
3
+ /**
4
+ * Populates `temp.xfer_ri_plan` for `resource_items`, one call per source,
5
+ * for either transfer mode:
6
+ *
7
+ * - **`concat`** — every source resource is matched against the
8
+ * destination by its identity (`url_id` resolved through `url_refs.url`,
9
+ * or `url_blob_id` resolved through `blob_refs.hash` — the two are
10
+ * mutually exclusive per `resource_items`' own CHECK constraint, so at
11
+ * most one of the two LEFT JOINs below ever produces a match for a given
12
+ * row) and classified `full` (no destination row yet), `replace`
13
+ * (destination exists but has never recorded a response — `status IS
14
+ * NULL` — while this source has), or `skip` (destination already has a
15
+ * recorded response). Matching happens directly against raw
16
+ * `url`/`hash` values, not through `temp.xfer_map_url_refs`/
17
+ * `xfer_map_blob_refs` — those dictionary maps are built AFTER this
18
+ * plan (`copy-dictionaries-for-concat.ts` needs to know which resources
19
+ * are kept before it can compute needed dictionary ids for split), so
20
+ * this plan cannot depend on them.
21
+ * - **`split`** — a resource is kept (`full`) only when at least one
22
+ * `full`-action page in `temp.xfer_ci_plan` references it via
23
+ * `resource_ref_edges`. A resource with no surviving referrer is left
24
+ * out of the plan (dropped) — split does not preserve an
25
+ * otherwise-orphan resource just because its URL happens to still be
26
+ * in scope (accepted simplification: a resource with zero referring
27
+ * pages has no page context left to display it against in the output
28
+ * archive anyway).
29
+ * @param trx - Transaction with the source ATTACHed as
30
+ * {@link TRANSFER_SOURCE_ALIAS}. For `'split'`, must run after
31
+ * `temp.xfer_ci_plan` has been fully populated (every `full` page
32
+ * decided) — see
33
+ * {@link import('./plan-content-items-for-split.js').planContentItemsForSplit}.
34
+ * @param mode - Which transfer this plan is for.
35
+ * @example
36
+ * ```ts
37
+ * await planContentItemsForSplit(trx);
38
+ * await planResourceItems(trx, 'split');
39
+ * ```
40
+ */
41
+ export async function planResourceItems(trx, mode) {
42
+ if (mode === 'split') {
43
+ await trx.raw(`
44
+ INSERT INTO xfer_ri_plan (src_id, action)
45
+ SELECT DISTINCT r.id, ${TRANSFER_ACTION.full}
46
+ FROM ${TRANSFER_SOURCE_ALIAS}.resource_items r
47
+ JOIN ${TRANSFER_SOURCE_ALIAS}.resource_ref_edges e ON e.resource_id = r.id
48
+ JOIN xfer_ci_plan p ON p.src_id = e.page_id AND p.action = ${TRANSFER_ACTION.full}
49
+ `);
50
+ return;
51
+ }
52
+ await trx.raw(`
53
+ INSERT INTO xfer_ri_plan (src_id, action, dest_id)
54
+ SELECT
55
+ s.id,
56
+ CASE
57
+ WHEN d.id IS NULL THEN ${TRANSFER_ACTION.full}
58
+ WHEN (s.status IS NOT NULL) >= (d.status IS NOT NULL) THEN ${TRANSFER_ACTION.replace}
59
+ ELSE ${TRANSFER_ACTION.skip}
60
+ END,
61
+ d.id
62
+ FROM ${TRANSFER_SOURCE_ALIAS}.resource_items s
63
+ LEFT JOIN ${TRANSFER_SOURCE_ALIAS}.url_refs su ON su.id = s.url_id
64
+ LEFT JOIN main.url_refs du ON du.url = su.url
65
+ LEFT JOIN ${TRANSFER_SOURCE_ALIAS}.blob_refs sb ON sb.id = s.url_blob_id
66
+ LEFT JOIN main.blob_refs db ON db.hash = sb.hash
67
+ LEFT JOIN main.resource_items d ON d.url_id = du.id OR d.url_blob_id = db.id
68
+ `);
69
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Double-quotes a bare SQL identifier (`"order"`, not `order`) so a column
3
+ * name that happens to collide with a SQLite keyword (`order`, `key`,
4
+ * `references`, …) never breaks a transfer statement built by
5
+ * interpolating {@link import('./list-transfer-columns.js').listTransferColumns}'
6
+ * output directly into raw SQL — every generic (not hand-written)
7
+ * column-list builder in `archive/transfer/` must quote through this
8
+ * function rather than splicing bare names.
9
+ * @param name - A bare, trusted column or table identifier (never
10
+ * user-supplied — every caller sources `name` from `pragma_table_info`
11
+ * against this codebase's own fixed schema).
12
+ * @returns The identifier wrapped in double quotes.
13
+ * @example
14
+ * ```ts
15
+ * columns.map(quoteTransferIdentifier).join(', ') // '"id", "order", "text"'
16
+ * ```
17
+ */
18
+ export declare function quoteTransferIdentifier(name: string): string;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Double-quotes a bare SQL identifier (`"order"`, not `order`) so a column
3
+ * name that happens to collide with a SQLite keyword (`order`, `key`,
4
+ * `references`, …) never breaks a transfer statement built by
5
+ * interpolating {@link import('./list-transfer-columns.js').listTransferColumns}'
6
+ * output directly into raw SQL — every generic (not hand-written)
7
+ * column-list builder in `archive/transfer/` must quote through this
8
+ * function rather than splicing bare names.
9
+ * @param name - A bare, trusted column or table identifier (never
10
+ * user-supplied — every caller sources `name` from `pragma_table_info`
11
+ * against this codebase's own fixed schema).
12
+ * @returns The identifier wrapped in double quotes.
13
+ * @example
14
+ * ```ts
15
+ * columns.map(quoteTransferIdentifier).join(', ') // '"id", "order", "text"'
16
+ * ```
17
+ */
18
+ export function quoteTransferIdentifier(name) {
19
+ return `"${name.replaceAll('"', '""')}"`;
20
+ }
@@ -0,0 +1,37 @@
1
+ import type { ExURL, ParseURLOptions } from '@d-zero/shared/parse-url';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Recomputes `resource_items.is_external` for the WHOLE destination
5
+ * archive against its final (merged or narrowed) scope, once every source
6
+ * has been transferred.
7
+ *
8
+ * Unlike `content_items.is_external` ("was this taken on as a crawl
9
+ * target" — a write-time fact this transfer never re-derives, per
10
+ * ARCHITECTURE.md's invariant), `resource_items.is_external` is a pure
11
+ * scope check computed the same way at crawl time
12
+ * (`@nitpicker/crawler`'s `Crawler#handleResources`: `findScopeEntry(url, this.#scope)
13
+ * === null`). Concat's merged scope is a union of every source's roots,
14
+ * so a resource one source recorded as external can legitimately become
15
+ * internal-by-scope in the output even though nothing about the resource
16
+ * itself changed — recomputing this is the resource-table equivalent of
17
+ * what `content_items` deliberately does NOT do, and the two must not be
18
+ * "unified" into the same rule.
19
+ *
20
+ * Mirrors `repromoteExternalPages`'s shape (load every resource's URL,
21
+ * classify in JS, write matches back in bound-safe chunks) rather than a
22
+ * single SQL scope join — `resource_items.url_id` is nullable
23
+ * (`url_blob_id` rows have no URL to classify and are left as recorded),
24
+ * so the candidate set is every resource with a non-null `url_id`.
25
+ * @param trx - The destination transaction (no source ATTACHed).
26
+ * @param scope - The output archive's final scope map
27
+ * (`buildScopeMap(mergedOrNarrowedRoots, config)`).
28
+ * @param options - URL parsing options forwarded to {@link findScopeEntry}
29
+ * (the output archive's own `disableQueries`).
30
+ * @returns The number of resources whose `is_external` flipped.
31
+ * @example
32
+ * ```ts
33
+ * const scope = buildScopeMap(config.roots, config);
34
+ * const flipped = await reclassifyResourceExternality(knex, scope, config);
35
+ * ```
36
+ */
37
+ export declare function reclassifyResourceExternality(trx: Knex, scope: ReadonlyMap<string, readonly ExURL[]>, options?: ParseURLOptions): Promise<number>;
@@ -0,0 +1,66 @@
1
+ import { tryParseUrl as parseUrl } from '@d-zero/shared/parse-url';
2
+ import { findScopeEntry } from '../scope/find-scope-entry.js';
3
+ /**
4
+ * Recomputes `resource_items.is_external` for the WHOLE destination
5
+ * archive against its final (merged or narrowed) scope, once every source
6
+ * has been transferred.
7
+ *
8
+ * Unlike `content_items.is_external` ("was this taken on as a crawl
9
+ * target" — a write-time fact this transfer never re-derives, per
10
+ * ARCHITECTURE.md's invariant), `resource_items.is_external` is a pure
11
+ * scope check computed the same way at crawl time
12
+ * (`@nitpicker/crawler`'s `Crawler#handleResources`: `findScopeEntry(url, this.#scope)
13
+ * === null`). Concat's merged scope is a union of every source's roots,
14
+ * so a resource one source recorded as external can legitimately become
15
+ * internal-by-scope in the output even though nothing about the resource
16
+ * itself changed — recomputing this is the resource-table equivalent of
17
+ * what `content_items` deliberately does NOT do, and the two must not be
18
+ * "unified" into the same rule.
19
+ *
20
+ * Mirrors `repromoteExternalPages`'s shape (load every resource's URL,
21
+ * classify in JS, write matches back in bound-safe chunks) rather than a
22
+ * single SQL scope join — `resource_items.url_id` is nullable
23
+ * (`url_blob_id` rows have no URL to classify and are left as recorded),
24
+ * so the candidate set is every resource with a non-null `url_id`.
25
+ * @param trx - The destination transaction (no source ATTACHed).
26
+ * @param scope - The output archive's final scope map
27
+ * (`buildScopeMap(mergedOrNarrowedRoots, config)`).
28
+ * @param options - URL parsing options forwarded to {@link findScopeEntry}
29
+ * (the output archive's own `disableQueries`).
30
+ * @returns The number of resources whose `is_external` flipped.
31
+ * @example
32
+ * ```ts
33
+ * const scope = buildScopeMap(config.roots, config);
34
+ * const flipped = await reclassifyResourceExternality(knex, scope, config);
35
+ * ```
36
+ */
37
+ export async function reclassifyResourceExternality(trx, scope, options) {
38
+ const candidates = await trx
39
+ .select('resource_items.id as id', 'url_refs.url as url', 'resource_items.is_external')
40
+ .from('resource_items')
41
+ .join('url_refs', 'url_refs.id', 'resource_items.url_id');
42
+ const toInternal = [];
43
+ const toExternal = [];
44
+ for (const row of candidates) {
45
+ const parsed = parseUrl(row.url, options);
46
+ const isExternal = parsed ? findScopeEntry(parsed, scope, options) === null : true;
47
+ if (isExternal && row.is_external === 0) {
48
+ toExternal.push(row.id);
49
+ }
50
+ else if (!isExternal && row.is_external === 1) {
51
+ toInternal.push(row.id);
52
+ }
53
+ }
54
+ const chunkSize = 500;
55
+ for (const [ids, value] of [
56
+ [toInternal, 0],
57
+ [toExternal, 1],
58
+ ]) {
59
+ for (let i = 0; i < ids.length; i += chunkSize) {
60
+ await trx('resource_items')
61
+ .whereIn('id', ids.slice(i, i + chunkSize))
62
+ .update({ is_external: value });
63
+ }
64
+ }
65
+ return toInternal.length + toExternal.length;
66
+ }
@@ -0,0 +1,34 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Remaps `redirect_dest_id` for every `full`/`stub`/`replace`-action
4
+ * destination row this source just wrote, from the source's own id space
5
+ * into the destination's, via `temp.xfer_ci_plan` (which by this point
6
+ * maps EVERY source id to a destination id, not just the ones this source
7
+ * inserted — `skip`/`replace` rows already had `dest_id` set at plan
8
+ * time).
9
+ *
10
+ * `skip`-action rows are deliberately excluded from the `SET` target
11
+ * (via the `p.action IN (...)` filter) — a `skip` row's `content_items`
12
+ * row belongs to a PRIOR, better-ranked source, and this (losing) source
13
+ * has no business touching its `redirect_dest_id`.
14
+ *
15
+ * Must run AFTER both
16
+ * {@link import('./insert-content-items.js').insertContentItems} and
17
+ * {@link import('./replace-content-items.js').replaceContentItems} —
18
+ * every plan row needs a resolved `dest_id` (its own AND its redirect
19
+ * target's) before this can run. A source row whose `redirect_dest_id`
20
+ * points outside this source's own plan (should not happen — concat's
21
+ * plan covers every source row, and split's plan closure always pulls a
22
+ * kept row's redirect target in too, see `plan-content-items-for-split.ts`)
23
+ * silently leaves that destination row's `redirect_dest_id` at `NULL`
24
+ * rather than erroring — a dangling-but-absent redirect is a safe
25
+ * degrade, never a wrong one.
26
+ * @param trx - Transaction with the source ATTACHed as
27
+ * {@link TRANSFER_SOURCE_ALIAS}.
28
+ * @example
29
+ * ```ts
30
+ * await insertContentItems(trx, { crawlOrderOffset: 0 });
31
+ * await remapRedirectDestIds(trx);
32
+ * ```
33
+ */
34
+ export declare function remapRedirectDestIds(trx: Knex): Promise<void>;