@nitpicker/archive 0.0.0 → 0.25.1

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 (739) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +106 -0
  3. package/lib/apply-connection-pragmas.d.ts +18 -0
  4. package/lib/apply-connection-pragmas.js +40 -0
  5. package/lib/archive-accessor.d.ts +265 -0
  6. package/lib/archive-accessor.js +477 -0
  7. package/lib/archive-lock.d.ts +45 -0
  8. package/lib/archive-lock.js +154 -0
  9. package/lib/archive.d.ts +736 -0
  10. package/lib/archive.js +1055 -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 +803 -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 +45 -0
  315. package/lib/filesystem/parse-tar-size-field.d.ts +13 -0
  316. package/lib/filesystem/parse-tar-size-field.js +37 -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 +132 -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/compare-strings.d.ts +12 -0
  576. package/lib/test-utils/compare-strings.js +14 -0
  577. package/lib/test-utils/create-legacy-analysis-tables.d.ts +13 -0
  578. package/lib/test-utils/create-legacy-analysis-tables.js +37 -0
  579. package/lib/test-utils/fk-parent-tables.d.ts +15 -0
  580. package/lib/test-utils/fk-parent-tables.js +19 -0
  581. package/lib/test-utils/seed-content-item.d.ts +35 -0
  582. package/lib/test-utils/seed-content-item.js +42 -0
  583. package/lib/test-utils/setup-legacy-fk-db.d.ts +34 -0
  584. package/lib/test-utils/setup-legacy-fk-db.js +271 -0
  585. package/lib/transfer/attach-source-database.d.ts +31 -0
  586. package/lib/transfer/attach-source-database.js +40 -0
  587. package/lib/transfer/build-split-config.d.ts +30 -0
  588. package/lib/transfer/build-split-config.js +42 -0
  589. package/lib/transfer/clear-replaced-page-rows.d.ts +23 -0
  590. package/lib/transfer/clear-replaced-page-rows.js +61 -0
  591. package/lib/transfer/concat-archives.d.ts +55 -0
  592. package/lib/transfer/concat-archives.js +95 -0
  593. package/lib/transfer/concat-source-transfer-phases.d.ts +10 -0
  594. package/lib/transfer/concat-source-transfer-phases.js +17 -0
  595. package/lib/transfer/content-item-rank-sql.d.ts +21 -0
  596. package/lib/transfer/content-item-rank-sql.js +23 -0
  597. package/lib/transfer/copy-anchor-edges.d.ts +28 -0
  598. package/lib/transfer/copy-anchor-edges.js +42 -0
  599. package/lib/transfer/copy-dictionaries-for-concat.d.ts +39 -0
  600. package/lib/transfer/copy-dictionaries-for-concat.js +81 -0
  601. package/lib/transfer/copy-dictionaries-for-split.d.ts +29 -0
  602. package/lib/transfer/copy-dictionaries-for-split.js +224 -0
  603. package/lib/transfer/copy-header-set-children.d.ts +27 -0
  604. package/lib/transfer/copy-header-set-children.js +51 -0
  605. package/lib/transfer/copy-image-items.d.ts +21 -0
  606. package/lib/transfer/copy-image-items.js +62 -0
  607. package/lib/transfer/copy-inventory-source-lists.d.ts +30 -0
  608. package/lib/transfer/copy-inventory-source-lists.js +61 -0
  609. package/lib/transfer/copy-journal-tables.d.ts +30 -0
  610. package/lib/transfer/copy-journal-tables.js +56 -0
  611. package/lib/transfer/copy-page-console-logs.d.ts +16 -0
  612. package/lib/transfer/copy-page-console-logs.js +27 -0
  613. package/lib/transfer/copy-page-html-blobs.d.ts +31 -0
  614. package/lib/transfer/copy-page-html-blobs.js +43 -0
  615. package/lib/transfer/copy-page-meta.d.ts +27 -0
  616. package/lib/transfer/copy-page-meta.js +68 -0
  617. package/lib/transfer/copy-page-template-clusters.d.ts +31 -0
  618. package/lib/transfer/copy-page-template-clusters.js +56 -0
  619. package/lib/transfer/copy-page-template-labels.d.ts +34 -0
  620. package/lib/transfer/copy-page-template-labels.js +88 -0
  621. package/lib/transfer/copy-resource-items.d.ts +29 -0
  622. package/lib/transfer/copy-resource-items.js +89 -0
  623. package/lib/transfer/copy-resource-ref-edges.d.ts +20 -0
  624. package/lib/transfer/copy-resource-ref-edges.js +33 -0
  625. package/lib/transfer/copy-simple-page-scoped-tables.d.ts +15 -0
  626. package/lib/transfer/copy-simple-page-scoped-tables.js +34 -0
  627. package/lib/transfer/count-external-pages-in-scope.d.ts +26 -0
  628. package/lib/transfer/count-external-pages-in-scope.js +40 -0
  629. package/lib/transfer/create-transfer-temp-tables.d.ts +30 -0
  630. package/lib/transfer/create-transfer-temp-tables.js +59 -0
  631. package/lib/transfer/dictionary-copy-specs.d.ts +32 -0
  632. package/lib/transfer/dictionary-copy-specs.js +28 -0
  633. package/lib/transfer/drop-transfer-temp-tables.d.ts +9 -0
  634. package/lib/transfer/drop-transfer-temp-tables.js +18 -0
  635. package/lib/transfer/flatten-redirect-chains.d.ts +44 -0
  636. package/lib/transfer/flatten-redirect-chains.js +74 -0
  637. package/lib/transfer/insert-content-items.d.ts +35 -0
  638. package/lib/transfer/insert-content-items.js +116 -0
  639. package/lib/transfer/list-transfer-columns.d.ts +35 -0
  640. package/lib/transfer/list-transfer-columns.js +45 -0
  641. package/lib/transfer/mark-in-scope-content-items.d.ts +31 -0
  642. package/lib/transfer/mark-in-scope-content-items.js +54 -0
  643. package/lib/transfer/merge-archive-configs.d.ts +51 -0
  644. package/lib/transfer/merge-archive-configs.js +85 -0
  645. package/lib/transfer/plan-content-items-for-concat.d.ts +33 -0
  646. package/lib/transfer/plan-content-items-for-concat.js +51 -0
  647. package/lib/transfer/plan-content-items-for-split.d.ts +42 -0
  648. package/lib/transfer/plan-content-items-for-split.js +83 -0
  649. package/lib/transfer/plan-resource-items.d.ts +40 -0
  650. package/lib/transfer/plan-resource-items.js +69 -0
  651. package/lib/transfer/quote-transfer-identifier.d.ts +18 -0
  652. package/lib/transfer/quote-transfer-identifier.js +20 -0
  653. package/lib/transfer/reclassify-resource-externality.d.ts +37 -0
  654. package/lib/transfer/reclassify-resource-externality.js +66 -0
  655. package/lib/transfer/remap-redirect-dest-ids.d.ts +34 -0
  656. package/lib/transfer/remap-redirect-dest-ids.js +51 -0
  657. package/lib/transfer/replace-content-items.d.ts +39 -0
  658. package/lib/transfer/replace-content-items.js +83 -0
  659. package/lib/transfer/simple-page-scoped-tables.d.ts +25 -0
  660. package/lib/transfer/simple-page-scoped-tables.js +38 -0
  661. package/lib/transfer/split-archive.d.ts +55 -0
  662. package/lib/transfer/split-archive.js +98 -0
  663. package/lib/transfer/split-source-transfer-phases.d.ts +11 -0
  664. package/lib/transfer/split-source-transfer-phases.js +18 -0
  665. package/lib/transfer/transfer-action.d.ts +34 -0
  666. package/lib/transfer/transfer-action.js +32 -0
  667. package/lib/transfer/transfer-archive-rows.d.ts +65 -0
  668. package/lib/transfer/transfer-archive-rows.js +156 -0
  669. package/lib/transfer/transfer-dictionary-tables.d.ts +12 -0
  670. package/lib/transfer/transfer-dictionary-tables.js +22 -0
  671. package/lib/transfer/transfer-post-phases.d.ts +10 -0
  672. package/lib/transfer/transfer-post-phases.js +13 -0
  673. package/lib/transfer/transfer-source-alias.d.ts +9 -0
  674. package/lib/transfer/transfer-source-alias.js +9 -0
  675. package/lib/transfer/types.d.ts +111 -0
  676. package/lib/transfer/types.js +35 -0
  677. package/lib/types.d.ts +772 -0
  678. package/lib/types.js +1 -0
  679. package/lib/url-alias/compute-tier-a-alias-key.d.ts +44 -0
  680. package/lib/url-alias/compute-tier-a-alias-key.js +47 -0
  681. package/lib/url-alias/compute-tier-b-alias-key.d.ts +23 -0
  682. package/lib/url-alias/compute-tier-b-alias-key.js +26 -0
  683. package/lib/url-alias/group-alias-candidates.d.ts +27 -0
  684. package/lib/url-alias/group-alias-candidates.js +29 -0
  685. package/lib/url-alias/types.d.ts +12 -0
  686. package/lib/url-alias/types.js +1 -0
  687. package/lib/url-pattern/compute-shape-key.d.ts +58 -0
  688. package/lib/url-pattern/compute-shape-key.js +129 -0
  689. package/lib/url-pattern/decompose-url.d.ts +33 -0
  690. package/lib/url-pattern/decompose-url.js +79 -0
  691. package/lib/url-pattern/reconstruct-url.d.ts +15 -0
  692. package/lib/url-pattern/reconstruct-url.js +33 -0
  693. package/lib/url-sort/compute-url-sort-ranks.d.ts +30 -0
  694. package/lib/url-sort/compute-url-sort-ranks.js +33 -0
  695. package/lib/utils/array/each-splitted.d.ts +10 -0
  696. package/lib/utils/array/each-splitted.js +14 -0
  697. package/lib/utils/debug.d.ts +8 -0
  698. package/lib/utils/debug.js +8 -0
  699. package/lib/utils/error/emit-error-with-retry.d.ts +40 -0
  700. package/lib/utils/error/emit-error-with-retry.js +44 -0
  701. package/lib/utils/error/emit-error.d.ts +39 -0
  702. package/lib/utils/error/emit-error.js +41 -0
  703. package/lib/utils/object/parse-response-headers.d.ts +12 -0
  704. package/lib/utils/object/parse-response-headers.js +26 -0
  705. package/lib/utils/object/redact-request-headers.d.ts +15 -0
  706. package/lib/utils/object/redact-request-headers.js +27 -0
  707. package/lib/utils/types/types.d.ts +383 -0
  708. package/lib/utils/types/types.js +1 -0
  709. package/lib/verify-migration/capture-rejection.d.ts +24 -0
  710. package/lib/verify-migration/capture-rejection.js +31 -0
  711. package/lib/verify-migration/check-anchor-edges-count.d.ts +34 -0
  712. package/lib/verify-migration/check-anchor-edges-count.js +72 -0
  713. package/lib/verify-migration/check-anchor-edges-sum.d.ts +13 -0
  714. package/lib/verify-migration/check-anchor-edges-sum.js +27 -0
  715. package/lib/verify-migration/check-content-items-count.d.ts +16 -0
  716. package/lib/verify-migration/check-content-items-count.js +30 -0
  717. package/lib/verify-migration/check-content-type-preservation.d.ts +22 -0
  718. package/lib/verify-migration/check-content-type-preservation.js +40 -0
  719. package/lib/verify-migration/check-foreign-key-integrity.d.ts +31 -0
  720. package/lib/verify-migration/check-foreign-key-integrity.js +47 -0
  721. package/lib/verify-migration/check-image-items-count.d.ts +12 -0
  722. package/lib/verify-migration/check-image-items-count.js +26 -0
  723. package/lib/verify-migration/check-page-meta-count.d.ts +15 -0
  724. package/lib/verify-migration/check-page-meta-count.js +31 -0
  725. package/lib/verify-migration/check-reader-parity.d.ts +23 -0
  726. package/lib/verify-migration/check-reader-parity.js +182 -0
  727. package/lib/verify-migration/check-resource-items-count.d.ts +17 -0
  728. package/lib/verify-migration/check-resource-items-count.js +33 -0
  729. package/lib/verify-migration/check-url-round-trip.d.ts +43 -0
  730. package/lib/verify-migration/check-url-round-trip.js +112 -0
  731. package/lib/verify-migration/types.d.ts +70 -0
  732. package/lib/verify-migration/types.js +63 -0
  733. package/lib/verify-migration/verify-migration.d.ts +41 -0
  734. package/lib/verify-migration/verify-migration.js +120 -0
  735. package/lib/with-bulk-write-pragmas.d.ts +51 -0
  736. package/lib/with-bulk-write-pragmas.js +132 -0
  737. package/lib/write-queue.d.ts +32 -0
  738. package/lib/write-queue.js +55 -0
  739. package/package.json +350 -3
@@ -0,0 +1,226 @@
1
+ import { createProgressReporter } from '../create-progress-reporter.js';
2
+ import { decodePageHtmlBlobBytes } from '../decode-page-html-blob-bytes.js';
3
+ import { isBlobRefValue } from './is-blob-ref-value.js';
4
+ import { resolveBlobRefs } from './resolve-blob-refs.js';
5
+ import { resolveTextRefs } from './resolve-text-refs.js';
6
+ import { resolveUrlOrBlobFromMaps } from './resolve-url-or-blob-from-maps.js';
7
+ import { resolveUrlRefs } from './resolve-url-refs.js';
8
+ import { upsertTextRefs } from './upsert-text-refs.js';
9
+ /**
10
+ * Page ids scanned per keyset-paginated `SELECT DISTINCT pageId` chunk.
11
+ * Batches the outer loop so 470 K pages worth of `images` rows are
12
+ * traversed in ~1 K round trips instead of one round-trip per page,
13
+ * without holding the entire distinct-pageId list in memory at once.
14
+ */
15
+ const PAGE_ID_CHUNK_SIZE = 500;
16
+ /**
17
+ * Rows sent per `INSERT INTO image_items ... VALUES (...)` statement.
18
+ * Each row binds 13 params, so 300 rows = 3 900 params — safely under
19
+ * the SQLite variable limit.
20
+ */
21
+ const INSERT_CHUNK_SIZE = 300;
22
+ /**
23
+ * Populates `image_items` from `images` (issue #193).
24
+ *
25
+ * The outer loop iterates **pages**, not images. Each page's images are
26
+ * processed as one whole unit — dom-path derivation, HTML BLOB fetch,
27
+ * and ref lookups all happen once per page. This design closes three
28
+ * separate correctness / efficiency traps that a purely image-chunked
29
+ * loop would expose:
30
+ *
31
+ * 1. **Ordinal-cursor bleed across chunks** — `matchImagesToDomPaths`
32
+ * tracks per-outerHTML cursor state, so a page with 1 000 identical
33
+ * `<img>` tags spanning two image-chunks would reset the cursor at
34
+ * the boundary and duplicate dom_paths already assigned in the
35
+ * previous chunk. Iterating by page keeps every page's cursor state
36
+ * self-contained.
37
+ * 2. **Repeated `getPageHtml` + jsdom parse** — a page whose images
38
+ * straddle N image-chunks would fetch and re-parse the same multi-MB
39
+ * HTML snapshot N times. Iterating by page makes this exactly once
40
+ * per page.
41
+ * 3. **Data-URI routing gap** — legacy `images.src` can be either a
42
+ * plain URL (goes to `url_refs`) or a large `data:` URI (goes to
43
+ * `blob_refs`, per the 512-byte threshold). The lookups partition
44
+ * by that rule, so a data URI is never bound into
45
+ * `resolveUrlRefs`' `WHERE url IN (?)` — which could otherwise
46
+ * exceed SQLite's `SQLITE_MAX_SQL_LENGTH` for multi-KB URIs.
47
+ *
48
+ * Per outer iteration:
49
+ *
50
+ * 1. **Keyset-paginate** distinct `pageId` values from `images`. Peak
51
+ * memory ≈ 500 integers.
52
+ * 2. **Fetch all images** for those page ids in one query, ordered by
53
+ * `(pageId, id)` so JS-side grouping is a linear pass.
54
+ * 3. **Resolve dom paths per page** — one `getPageHtml` + one resolver
55
+ * call each. `dom_path` texts are collected across the whole batch
56
+ * so `upsertTextRefs` runs once per batch.
57
+ * 4. **Partition src / currentSrc** by the data-URI routing rule and
58
+ * batch-resolve url refs, blob refs, and alt text refs across the
59
+ * whole batch.
60
+ * 5. **Bulk INSERT** with explicit `id = images.id`.
61
+ *
62
+ * `INSERT OR IGNORE` on the natural PK makes the step idempotent.
63
+ *
64
+ * HTML BLOBs are read inline via the same `trx` handle rather than
65
+ * through a caller-supplied `getPageHtml` callback: a callback that
66
+ * queried `Database.getHtmlOfPageById` (which uses the non-transactional
67
+ * Knex instance) would re-enter the pool from inside this writer
68
+ * transaction and deadlock on libsql's single writer connection. Reading
69
+ * `page_html_ref` + `page_html_blobs` via `trx` keeps every read on the
70
+ * same connection the outer trx already owns.
71
+ * @param trx - Knex instance or transaction connected to the archive DB.
72
+ * @param resolvePageDomPaths - Callback that returns dom_path strings
73
+ * for one page's images (see {@link PageDomPathResolver}).
74
+ * @param onProgress - Optional sink for periodic progress lines (one per
75
+ * ~5% of distinct `images.pageId` values scanned); see
76
+ * {@link ../create-progress-reporter.ts}.
77
+ * @example
78
+ * const jsdomResolver = createJsdomResolver();
79
+ * await knex.transaction(async (trx) => {
80
+ * await populateImageItems(trx, jsdomResolver);
81
+ * });
82
+ */
83
+ export async function populateImageItems(trx, resolvePageDomPaths, onProgress) {
84
+ const countRows = await trx('images').countDistinct({ n: 'pageId' });
85
+ const totalRow = countRows[0];
86
+ const total = Number(totalRow?.n ?? 0);
87
+ const report = createProgressReporter('image_items (distinct pages)', total, onProgress);
88
+ let processedPages = 0;
89
+ let cursorPageId = 0;
90
+ while (true) {
91
+ const pageIdRows = await trx('images')
92
+ .distinct('pageId')
93
+ .where('pageId', '>', cursorPageId)
94
+ .orderBy('pageId', 'asc')
95
+ .limit(PAGE_ID_CHUNK_SIZE);
96
+ if (pageIdRows.length === 0) {
97
+ break;
98
+ }
99
+ const pageIds = pageIdRows.map((r) => r.pageId);
100
+ cursorPageId = pageIds.at(-1);
101
+ processedPages += pageIds.length;
102
+ report(processedPages);
103
+ const rows = await trx('images')
104
+ .select('id', 'pageId', 'src', 'currentSrc', 'alt', 'width', 'height', 'naturalWidth', 'naturalHeight', 'isLazy', 'viewportWidth', 'sourceCode')
105
+ .whereIn('pageId', pageIds)
106
+ .orderBy([
107
+ { column: 'pageId', order: 'asc' },
108
+ { column: 'id', order: 'asc' },
109
+ ]);
110
+ if (rows.length === 0) {
111
+ continue;
112
+ }
113
+ const byPage = new Map();
114
+ for (const row of rows) {
115
+ const bucket = byPage.get(row.pageId);
116
+ if (bucket === undefined) {
117
+ byPage.set(row.pageId, [row]);
118
+ }
119
+ else {
120
+ bucket.push(row);
121
+ }
122
+ }
123
+ const domPaths = new Map();
124
+ for (const [pageId, pageImages] of byPage) {
125
+ const html = await readPageHtmlInTrx(trx, pageId);
126
+ const resolved = await resolvePageDomPaths(pageId, html, pageImages);
127
+ for (const [imageId, entry] of resolved) {
128
+ domPaths.set(imageId, entry);
129
+ }
130
+ }
131
+ const urls = new Set();
132
+ const dataUris = new Set();
133
+ const alts = new Set();
134
+ const domPathTexts = new Set();
135
+ for (const row of rows) {
136
+ for (const value of [row.src, row.currentSrc]) {
137
+ if (typeof value !== 'string' || value === '') {
138
+ continue;
139
+ }
140
+ if (isBlobRefValue(value)) {
141
+ dataUris.add(value);
142
+ }
143
+ else {
144
+ urls.add(value);
145
+ }
146
+ }
147
+ if (typeof row.alt === 'string' && row.alt !== '') {
148
+ alts.add(row.alt);
149
+ }
150
+ const domPath = domPaths.get(row.id);
151
+ if (domPath !== undefined) {
152
+ domPathTexts.add(domPath.path);
153
+ }
154
+ }
155
+ const urlIds = await resolveUrlRefs(trx, urls);
156
+ const blobIds = await resolveBlobRefs(trx, dataUris);
157
+ const altIds = await resolveTextRefs(trx, alts);
158
+ // `dom_path` strings are synthesised right here and were not
159
+ // among the columns the `text_refs` populate scanned
160
+ // (`populate-ref-tables/populate-text-refs.ts`) — insert every distinct
161
+ // derived path (including `unknown/<id>` fallbacks) before
162
+ // resolving its id. The upsert is idempotent so re-runs across
163
+ // partial failures do not duplicate rows.
164
+ const domPathIds = await upsertTextRefs(trx, domPathTexts);
165
+ const inserts = [];
166
+ for (const row of rows) {
167
+ const domPath = domPaths.get(row.id);
168
+ if (domPath === undefined) {
169
+ throw new Error(`populateImageItems: dom_path not resolved for image id=${row.id}`);
170
+ }
171
+ const domPathId = domPathIds.get(domPath.path);
172
+ if (domPathId === undefined) {
173
+ throw new Error(`populateImageItems: text_refs.id not resolved for dom_path=${domPath.path} — the upsertTextRefs above must have inserted it`);
174
+ }
175
+ const srcSlot = resolveUrlOrBlobFromMaps(row.src, urlIds, blobIds);
176
+ const currentSrcSlot = resolveUrlOrBlobFromMaps(row.currentSrc, urlIds, blobIds);
177
+ inserts.push({
178
+ id: row.id,
179
+ page_id: row.pageId,
180
+ src_url_id: srcSlot.url,
181
+ current_src_url_id: currentSrcSlot.url,
182
+ src_blob_id: srcSlot.blob,
183
+ current_src_blob_id: currentSrcSlot.blob,
184
+ alt_text_id: typeof row.alt === 'string' && row.alt !== ''
185
+ ? (altIds.get(row.alt) ?? null)
186
+ : null,
187
+ width: row.width,
188
+ height: row.height,
189
+ natural_width: row.naturalWidth,
190
+ natural_height: row.naturalHeight,
191
+ is_lazy: row.isLazy == null ? null : row.isLazy ? 1 : 0,
192
+ viewport_width: row.viewportWidth,
193
+ dom_path_text_id: domPathId,
194
+ });
195
+ }
196
+ for (let index = 0; index < inserts.length; index += INSERT_CHUNK_SIZE) {
197
+ const chunk = inserts.slice(index, index + INSERT_CHUNK_SIZE);
198
+ await trx('image_items').insert(chunk).onConflict('id').ignore();
199
+ }
200
+ }
201
+ }
202
+ /**
203
+ * Reads the stored HTML snapshot for one legacy page id, via the same
204
+ * `trx` handle that the outer populate transaction owns. Mirrors
205
+ * `Database.getHtmlOfPageById` but keeps every read on the trx
206
+ * connection so the populate does not re-enter the pool from
207
+ * inside its own writer transaction (see {@link populateImageItems}'s
208
+ * doc for the deadlock this avoids).
209
+ * @param trx - The open migration transaction.
210
+ * @param pageId - `pages.id` (== `content_items.id`) to read HTML for.
211
+ * @returns Decoded HTML string, or `null` when no snapshot is stored.
212
+ * @throws {Error} Naming the page and the blob hash when the snapshot is
213
+ * corrupt or decompresses past `MAX_DECODED_SNAPSHOT_BYTES`; the migration
214
+ * fails rather than resolving the page's images without its HTML.
215
+ */
216
+ async function readPageHtmlInTrx(trx, pageId) {
217
+ const row = (await trx('page_html_ref')
218
+ .join('page_html_blobs', 'page_html_ref.hash', '=', 'page_html_blobs.hash')
219
+ .select('page_html_blobs.hash as hash', 'page_html_blobs.body as body', 'page_html_blobs.codec as codec')
220
+ .where('page_html_ref.page_id', pageId)
221
+ .first());
222
+ if (!row) {
223
+ return null;
224
+ }
225
+ return decodePageHtmlBlobBytes({ pageId, ...row }).toString('utf8');
226
+ }
@@ -0,0 +1,33 @@
1
+ import type { ProgressCallback } from '../create-progress-reporter.js';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Populates `page_meta` from `pages WHERE scraped = 1` (issue #193).
5
+ *
6
+ * Pages that were never scraped contribute no meta rows — they have no rendered title,
7
+ * description, or JSON-LD to preserve, so filtering at the SELECT keeps
8
+ * the reader working set narrow and matches the migration acceptance check
9
+ * `count(*) FROM page_meta = count(*) FROM pages WHERE scraped = 1`.
10
+ *
11
+ * Per chunk:
12
+ *
13
+ * 1. **Keyset-paginate** `pages.id > cursor AND scraped = 1`.
14
+ * 2. **Batch-resolve** all text / URL / JSON ref ids for every value in
15
+ * the chunk — three resolvers, one round-trip per ref table.
16
+ * 3. **Bulk INSERT** with `page_id = pages.id`. `page_id` is both PK and
17
+ * FK on `content_items(id)`; `populateContentItems` must have already
18
+ * inserted the corresponding `content_items` row for the FK to be
19
+ * valid at COMMIT time.
20
+ *
21
+ * `INSERT OR IGNORE` on the `page_id` PK makes the step idempotent so
22
+ * partial-failure re-runs are safe.
23
+ * @param trx - Knex instance or transaction connected to the archive DB.
24
+ * @param onProgress - Optional sink for periodic progress lines (one per
25
+ * ~5% of `pages WHERE scraped = 1` scanned); see
26
+ * {@link ../create-progress-reporter.ts}.
27
+ * @example
28
+ * await knex.transaction(async (trx) => {
29
+ * await populateContentItems(trx);
30
+ * await populatePageMeta(trx);
31
+ * });
32
+ */
33
+ export declare function populatePageMeta(trx: Knex, onProgress?: ProgressCallback): Promise<void>;
@@ -0,0 +1,267 @@
1
+ import { createProgressReporter } from '../create-progress-reporter.js';
2
+ import { PAGE_META_COLUMN_MAPS } from '../page-meta-column-maps.js';
3
+ import { DATA_URI_URL_REFS_LIMIT } from '../populate-ref-tables/data-uri-url-refs-limit.js';
4
+ import { resolveJsonRefs } from './resolve-json-refs.js';
5
+ import { resolveTextRefs } from './resolve-text-refs.js';
6
+ import { resolveUrlRefs } from './resolve-url-refs.js';
7
+ /**
8
+ * Rows scanned per keyset-paginated `SELECT` chunk against
9
+ * `pages WHERE scraped = 1`. The row width here is dominated by long
10
+ * text columns (`meta_extras` JSON, `description`, `twitter_description`)
11
+ * so 400 rows caps peak chunk memory at ≈ 40 MB on the reference
12
+ * archive.
13
+ */
14
+ const READ_CHUNK_SIZE = 400;
15
+ /**
16
+ * Rows sent per `INSERT INTO page_meta ... VALUES (...)` statement. Each
17
+ * row binds 47 params (see the column list below), so 200 rows =
18
+ * 9 400 params — safely under SQLite's default variable limit.
19
+ */
20
+ const INSERT_CHUNK_SIZE = 200;
21
+ /**
22
+ * Populates `page_meta` from `pages WHERE scraped = 1` (issue #193).
23
+ *
24
+ * Pages that were never scraped contribute no meta rows — they have no rendered title,
25
+ * description, or JSON-LD to preserve, so filtering at the SELECT keeps
26
+ * the reader working set narrow and matches the migration acceptance check
27
+ * `count(*) FROM page_meta = count(*) FROM pages WHERE scraped = 1`.
28
+ *
29
+ * Per chunk:
30
+ *
31
+ * 1. **Keyset-paginate** `pages.id > cursor AND scraped = 1`.
32
+ * 2. **Batch-resolve** all text / URL / JSON ref ids for every value in
33
+ * the chunk — three resolvers, one round-trip per ref table.
34
+ * 3. **Bulk INSERT** with `page_id = pages.id`. `page_id` is both PK and
35
+ * FK on `content_items(id)`; `populateContentItems` must have already
36
+ * inserted the corresponding `content_items` row for the FK to be
37
+ * valid at COMMIT time.
38
+ *
39
+ * `INSERT OR IGNORE` on the `page_id` PK makes the step idempotent so
40
+ * partial-failure re-runs are safe.
41
+ * @param trx - Knex instance or transaction connected to the archive DB.
42
+ * @param onProgress - Optional sink for periodic progress lines (one per
43
+ * ~5% of `pages WHERE scraped = 1` scanned); see
44
+ * {@link ../create-progress-reporter.ts}.
45
+ * @example
46
+ * await knex.transaction(async (trx) => {
47
+ * await populateContentItems(trx);
48
+ * await populatePageMeta(trx);
49
+ * });
50
+ */
51
+ export async function populatePageMeta(trx, onProgress) {
52
+ const textColumns = PAGE_META_COLUMN_MAPS.text.map((entry) => entry.source);
53
+ const urlColumns = PAGE_META_COLUMN_MAPS.url.map((entry) => entry.source);
54
+ const plainColumns = [
55
+ 'id',
56
+ 'lang',
57
+ 'dir',
58
+ 'charset',
59
+ 'baseHref',
60
+ 'viewport_raw',
61
+ 'themeColor',
62
+ 'applicationName',
63
+ 'author',
64
+ 'generator',
65
+ 'publisher',
66
+ 'robots_noindex',
67
+ 'robots_nofollow',
68
+ 'robots_noarchive',
69
+ 'robots_noimageindex',
70
+ 'googlebot',
71
+ 'og_type',
72
+ 'og_site_name',
73
+ 'og_image_alt',
74
+ 'og_image_width',
75
+ 'og_image_height',
76
+ 'og_locale',
77
+ 'og_article_published_time',
78
+ 'og_article_modified_time',
79
+ 'twitter_card',
80
+ 'twitter_site',
81
+ 'twitter_creator',
82
+ 'fb_app_id',
83
+ 'verification_google',
84
+ 'formatDetection_telephone',
85
+ 'tag_count',
86
+ 'jsonld_count',
87
+ 'tags_providers_csv',
88
+ 'meta_extras',
89
+ ];
90
+ const countRows = await trx('pages').where('scraped', true).count({ n: '*' });
91
+ const total = Number(countRows[0]?.n ?? 0);
92
+ const report = createProgressReporter('page_meta (pages)', total, onProgress);
93
+ let processed = 0;
94
+ let cursor = 0;
95
+ while (true) {
96
+ const rows = await trx('pages')
97
+ .select(...plainColumns, ...textColumns, ...urlColumns)
98
+ .where('id', '>', cursor)
99
+ .andWhere('scraped', true)
100
+ .orderBy('id', 'asc')
101
+ .limit(READ_CHUNK_SIZE);
102
+ if (rows.length === 0) {
103
+ break;
104
+ }
105
+ cursor = rows.at(-1).id;
106
+ processed += rows.length;
107
+ report(processed);
108
+ const texts = new Set();
109
+ const urls = new Set();
110
+ const jsonStrings = new Set();
111
+ for (const row of rows) {
112
+ for (const column of textColumns) {
113
+ const value = row[column];
114
+ if (typeof value === 'string' && value !== '') {
115
+ texts.add(value);
116
+ }
117
+ }
118
+ for (const column of urlColumns) {
119
+ const value = row[column];
120
+ if (typeof value === 'string' && value !== '' && !isLargeDataUri(value)) {
121
+ urls.add(value);
122
+ }
123
+ }
124
+ const metaExtras = row.meta_extras;
125
+ if (typeof metaExtras === 'string' && metaExtras !== '') {
126
+ jsonStrings.add(metaExtras);
127
+ }
128
+ }
129
+ const textIds = await resolveTextRefs(trx, texts);
130
+ const urlIds = await resolveUrlRefs(trx, urls);
131
+ const jsonIds = await resolveJsonRefs(trx, jsonStrings);
132
+ const inserts = rows.map((row) => {
133
+ const rowId = row.id;
134
+ const insert = {
135
+ page_id: rowId,
136
+ lang: row.lang ?? null,
137
+ dir: row.dir ?? null,
138
+ charset: row.charset ?? null,
139
+ base_href: row.baseHref ?? null,
140
+ viewport_raw: row.viewport_raw ?? null,
141
+ theme_color: row.themeColor ?? null,
142
+ application_name: row.applicationName ?? null,
143
+ author: row.author ?? null,
144
+ generator: row.generator ?? null,
145
+ publisher: row.publisher ?? null,
146
+ robots_noindex: row.robots_noindex ?? null,
147
+ robots_nofollow: row.robots_nofollow ?? null,
148
+ robots_noarchive: row.robots_noarchive ?? null,
149
+ robots_noimageindex: row.robots_noimageindex ?? null,
150
+ googlebot: row.googlebot ?? null,
151
+ og_type: row.og_type ?? null,
152
+ og_site_name: row.og_site_name ?? null,
153
+ og_image_alt: row.og_image_alt ?? null,
154
+ og_image_width: row.og_image_width ?? null,
155
+ og_image_height: row.og_image_height ?? null,
156
+ og_locale: row.og_locale ?? null,
157
+ og_article_published_time: row.og_article_published_time ?? null,
158
+ og_article_modified_time: row.og_article_modified_time ?? null,
159
+ twitter_card: row.twitter_card ?? null,
160
+ twitter_site: row.twitter_site ?? null,
161
+ twitter_creator: row.twitter_creator ?? null,
162
+ fb_app_id: row.fb_app_id ?? null,
163
+ verification_google: row.verification_google ?? null,
164
+ format_detection_telephone: row.formatDetection_telephone ?? null,
165
+ tag_count: row.tag_count ?? null,
166
+ jsonld_count: row.jsonld_count ?? null,
167
+ tags_providers_csv: row.tags_providers_csv ?? null,
168
+ meta_extras_json_id: resolveOptionalJsonId(row.meta_extras, jsonIds, rowId),
169
+ };
170
+ for (const { source, target } of PAGE_META_COLUMN_MAPS.text) {
171
+ insert[target] = resolveOptionalTextId(row[source], textIds, rowId, source);
172
+ }
173
+ for (const { source, target } of PAGE_META_COLUMN_MAPS.url) {
174
+ insert[target] = resolveOptionalUrlId(row[source], urlIds, rowId, source);
175
+ }
176
+ return insert;
177
+ });
178
+ for (let index = 0; index < inserts.length; index += INSERT_CHUNK_SIZE) {
179
+ const chunk = inserts.slice(index, index + INSERT_CHUNK_SIZE);
180
+ await trx('page_meta').insert(chunk).onConflict('page_id').ignore();
181
+ }
182
+ }
183
+ }
184
+ /**
185
+ * Returns `true` when `value` is a `data:` URI larger than the routing
186
+ * threshold — i.e. one that the `url_refs` populate
187
+ * (`populate-ref-tables/populate-url-refs.ts`) sent to `blob_refs` instead
188
+ * of `url_refs`. `page_meta` deliberately has no `*_blob_id` companion
189
+ * columns for its URL slots, so we skip these values from
190
+ * the `url_refs` lookup rather than issue a doomed `WHERE url IN (?)`
191
+ * that would burn a chunk slot per multi-KB URI. The resulting
192
+ * `*_url_id` is null with a `console.warn` breadcrumb; the operator
193
+ * can then decide whether the archive needs a schema extension or the
194
+ * raw data warrants normalisation.
195
+ * @param value - Raw URL column value.
196
+ */
197
+ function isLargeDataUri(value) {
198
+ return value.startsWith('data:') && value.length > DATA_URI_URL_REFS_LIMIT;
199
+ }
200
+ /**
201
+ * Resolves `text_refs.id` for a `page_meta.<name>_text_id` slot or
202
+ * throws when a non-empty source value has no matching `text_refs` row
203
+ * (parity with `populateContentItems`' `url_id` throw — silent NULL
204
+ * corruption would still let the count-based acceptance invariant pass
205
+ * while individual `page_meta` rows lose their meta text).
206
+ * @param value - Raw column value from the source `pages` row.
207
+ * @param textIds - `text → text_refs.id` map batch-resolved for the
208
+ * current chunk (see {@link ./resolve-text-refs.ts}).
209
+ * @param pageId - Owning page id (for the error message).
210
+ * @param column - Source column name (for the error message).
211
+ */
212
+ function resolveOptionalTextId(value, textIds, pageId, column) {
213
+ if (typeof value !== 'string' || value === '') {
214
+ return null;
215
+ }
216
+ const id = textIds.get(value);
217
+ if (id === undefined) {
218
+ throw new Error(`populatePageMeta: text_refs.id not resolved for page id=${pageId} column=${column} — populateTextRefs must run first`);
219
+ }
220
+ return id;
221
+ }
222
+ /**
223
+ * Resolves `url_refs.id` for a `page_meta.<name>_url_id` slot, throws
224
+ * on a missing lookup for a regular URL, and returns `null` (with a
225
+ * warning) for large data URIs that the `url_refs` populate routed to
226
+ * `blob_refs` — those cannot land in `page_meta` because the schema has
227
+ * no `*_blob_id` companion columns.
228
+ * @param value - Raw column value from the source `pages` row.
229
+ * @param urlIds - `url → url_refs.id` map batch-resolved for the
230
+ * current chunk (see {@link ./resolve-url-refs.ts}).
231
+ * @param pageId - Owning page id (for the error message).
232
+ * @param column - Source column name (for the error message).
233
+ */
234
+ function resolveOptionalUrlId(value, urlIds, pageId, column) {
235
+ if (typeof value !== 'string' || value === '') {
236
+ return null;
237
+ }
238
+ if (isLargeDataUri(value)) {
239
+ // oxlint-disable-next-line no-console
240
+ console.warn(`populatePageMeta: dropping large data URI in page id=${pageId} column=${column} (page_meta has no *_blob_id companion for URL columns)`);
241
+ return null;
242
+ }
243
+ const id = urlIds.get(value);
244
+ if (id === undefined) {
245
+ throw new Error(`populatePageMeta: url_refs.id not resolved for page id=${pageId} column=${column} — populateUrlRefs must run first`);
246
+ }
247
+ return id;
248
+ }
249
+ /**
250
+ * Resolves `json_refs.id` for `page_meta.meta_extras_json_id` or throws
251
+ * when the source `meta_extras` string has no matching `json_refs` row
252
+ * (parity with the text/url branches above).
253
+ * @param value - Raw `meta_extras` value from the source `pages` row.
254
+ * @param jsonIds - `JSON string → json_refs.id` map batch-resolved for
255
+ * the current chunk (see {@link ./resolve-json-refs.ts}).
256
+ * @param pageId - Owning page id (for the error message).
257
+ */
258
+ function resolveOptionalJsonId(value, jsonIds, pageId) {
259
+ if (typeof value !== 'string' || value === '') {
260
+ return null;
261
+ }
262
+ const id = jsonIds.get(value);
263
+ if (id === undefined) {
264
+ throw new Error(`populatePageMeta: json_refs.id not resolved for page id=${pageId} column=meta_extras — populateJsonRefs must run first`);
265
+ }
266
+ return id;
267
+ }
@@ -0,0 +1,22 @@
1
+ import type { ProgressCallback } from '../create-progress-reporter.js';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Populates `resource_items` from `resources` (issue #193).
5
+ *
6
+ * Structurally analogous to {@link ./populate-content-items.ts}: for each
7
+ * `resources` chunk, batch-resolve `url_refs.id`, `content_type_refs.id`,
8
+ * and `header_sets.id`, then bulk-INSERT with explicit `id = resources.id`.
9
+ * Reusing the legacy PK preserves the `resources-referrers.resourceId`
10
+ * FK reference (which `populateResourceRefEdges` later carries over as
11
+ * `resource_ref_edges.resource_id`) without any per-row UPDATE.
12
+ *
13
+ * `INSERT OR IGNORE` on `id` makes the step idempotent.
14
+ * @param trx - Knex instance or transaction connected to the archive DB.
15
+ * @param onProgress - Optional sink for periodic progress lines (one per
16
+ * ~5% of `resources` scanned); see {@link ../create-progress-reporter.ts}.
17
+ * @example
18
+ * await knex.transaction(async (trx) => {
19
+ * await populateResourceItems(trx);
20
+ * });
21
+ */
22
+ export declare function populateResourceItems(trx: Knex, onProgress?: ProgressCallback): Promise<void>;
@@ -0,0 +1,114 @@
1
+ import { createProgressReporter } from '../create-progress-reporter.js';
2
+ import { isBlobRefValue } from './is-blob-ref-value.js';
3
+ import { resolveBlobRefs } from './resolve-blob-refs.js';
4
+ import { loadContentTypeRefs } from './resolve-content-type-refs.js';
5
+ import { resolveHeaderSets } from './resolve-header-sets.js';
6
+ import { resolveUrlOrBlobFromMaps } from './resolve-url-or-blob-from-maps.js';
7
+ import { resolveUrlRefs } from './resolve-url-refs.js';
8
+ /**
9
+ * Rows scanned per keyset-paginated `SELECT` chunk against `resources`.
10
+ * `resources` rows are narrow (no meta columns) so 800 rows fits
11
+ * comfortably in a chunk without stressing memory. Bumping this higher
12
+ * would help throughput but risks pushing large `responseHeaders` JSON
13
+ * blobs past a healthy per-result-set size on archives with per-row
14
+ * multi-KB header payloads.
15
+ */
16
+ const READ_CHUNK_SIZE = 800;
17
+ /**
18
+ * Rows sent per `INSERT INTO resource_items ... VALUES (...)` statement.
19
+ * Each row binds 11 params (id + 10 columns), so 500 rows = 5 500 params
20
+ * — well under SQLite's default variable limit.
21
+ */
22
+ const INSERT_CHUNK_SIZE = 500;
23
+ /**
24
+ * Populates `resource_items` from `resources` (issue #193).
25
+ *
26
+ * Structurally analogous to {@link ./populate-content-items.ts}: for each
27
+ * `resources` chunk, batch-resolve `url_refs.id`, `content_type_refs.id`,
28
+ * and `header_sets.id`, then bulk-INSERT with explicit `id = resources.id`.
29
+ * Reusing the legacy PK preserves the `resources-referrers.resourceId`
30
+ * FK reference (which `populateResourceRefEdges` later carries over as
31
+ * `resource_ref_edges.resource_id`) without any per-row UPDATE.
32
+ *
33
+ * `INSERT OR IGNORE` on `id` makes the step idempotent.
34
+ * @param trx - Knex instance or transaction connected to the archive DB.
35
+ * @param onProgress - Optional sink for periodic progress lines (one per
36
+ * ~5% of `resources` scanned); see {@link ../create-progress-reporter.ts}.
37
+ * @example
38
+ * await knex.transaction(async (trx) => {
39
+ * await populateResourceItems(trx);
40
+ * });
41
+ */
42
+ export async function populateResourceItems(trx, onProgress) {
43
+ const contentTypeIds = await loadContentTypeRefs(trx);
44
+ const countRows = await trx('resources').count({ n: '*' });
45
+ const total = Number(countRows[0]?.n ?? 0);
46
+ const report = createProgressReporter('resource_items (resources)', total, onProgress);
47
+ let processed = 0;
48
+ let cursor = 0;
49
+ while (true) {
50
+ const rows = await trx('resources')
51
+ .select('id', 'url', 'isExternal', 'status', 'statusText', 'contentType', 'contentLength', 'responseHeaders', 'compress', 'cdn', 'source')
52
+ .where('id', '>', cursor)
53
+ .orderBy('id', 'asc')
54
+ .limit(READ_CHUNK_SIZE);
55
+ if (rows.length === 0) {
56
+ break;
57
+ }
58
+ cursor = rows.at(-1).id;
59
+ processed += rows.length;
60
+ report(processed);
61
+ const urls = new Set();
62
+ const dataUris = new Set();
63
+ const headerJsonStrings = new Set();
64
+ for (const row of rows) {
65
+ if (isBlobRefValue(row.url)) {
66
+ dataUris.add(row.url);
67
+ }
68
+ else {
69
+ urls.add(row.url);
70
+ }
71
+ if (typeof row.responseHeaders === 'string' && row.responseHeaders !== '') {
72
+ headerJsonStrings.add(row.responseHeaders);
73
+ }
74
+ }
75
+ const urlIds = await resolveUrlRefs(trx, urls);
76
+ const blobIds = await resolveBlobRefs(trx, dataUris);
77
+ const headerSetIds = await resolveHeaderSets(trx, headerJsonStrings);
78
+ const inserts = rows.map((row) => {
79
+ const slot = resolveUrlOrBlobFromMaps(row.url, urlIds, blobIds);
80
+ if (slot.url === null && slot.blob === null) {
81
+ throw new Error(`populateResourceItems: neither url_refs.id nor blob_refs.id resolved for resource id=${row.id} url=${row.url.slice(0, 80)} — populateUrlRefs/populateBlobRefs must run first`);
82
+ }
83
+ let contentTypeId = null;
84
+ if (row.contentType != null && row.contentType !== '') {
85
+ const resolved = contentTypeIds.get(row.contentType);
86
+ if (resolved === undefined) {
87
+ throw new Error(`populateResourceItems: content_type_refs.id not resolved for resource id=${row.id} contentType=${row.contentType} — populateContentTypeRefs must run first`);
88
+ }
89
+ contentTypeId = resolved;
90
+ }
91
+ const headerSetId = typeof row.responseHeaders === 'string' && row.responseHeaders !== ''
92
+ ? (headerSetIds.get(row.responseHeaders) ?? null)
93
+ : null;
94
+ return {
95
+ id: row.id,
96
+ url_id: slot.url,
97
+ url_blob_id: slot.blob,
98
+ is_external: row.isExternal == null ? 0 : row.isExternal ? 1 : 0,
99
+ status: row.status ?? null,
100
+ status_text: row.statusText ?? null,
101
+ content_type_id: contentTypeId,
102
+ content_length: row.contentLength ?? null,
103
+ header_set_id: headerSetId,
104
+ compress: row.compress ?? null,
105
+ cdn: row.cdn ?? null,
106
+ source: row.source,
107
+ };
108
+ });
109
+ for (let index = 0; index < inserts.length; index += INSERT_CHUNK_SIZE) {
110
+ const chunk = inserts.slice(index, index + INSERT_CHUNK_SIZE);
111
+ await trx('resource_items').insert(chunk).onConflict('id').ignore();
112
+ }
113
+ }
114
+ }