@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,191 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Creates the 6 core entity and edge tables of the 0.13 format (issue #192).
4
+ *
5
+ * These are the normalised entity / edge tables that replace the legacy
6
+ * write model (`pages`, `anchors`, `images`, `resources`, `resources-referrers`)
7
+ * in the 0.13 format. This migration is purely additive DDL — no existing table
8
+ * is modified and no row is inserted; the populate step
9
+ * (`populateEntityTables`) fills the tables from the legacy sources.
10
+ *
11
+ * Tables created:
12
+ *
13
+ * - `content_items` — replaces `pages` (core columns). The remaining
14
+ * per-page metadata splits into `page_meta`.
15
+ * - `page_meta` — page-specific metadata (title, description, meta tags,
16
+ * OpenGraph, Twitter, robots, denormalised aggregates, meta_extras JSON
17
+ * pointer). Split from `pages` so that filter / cursor queries against
18
+ * `content_items` scan a narrower row.
19
+ * - `resource_items` — replaces `resources`. Identity URL splits into
20
+ * `url_id` (regular URLs) vs `url_blob_id` (large `data:` URIs, routed
21
+ * via `blob_refs`) — a resource's own URL is captured verbatim from
22
+ * the network layer and, unlike a page's URL, can legally be a large
23
+ * inline `data:` URI (e.g. a CSS `background-image` sub-resource).
24
+ * - `anchor_edges` — replaces `anchors`. Deduped to distinct
25
+ * `(page_id, href_page_id)` pairs; `count` records how many instances
26
+ * were observed and `first_hash` / `first_text_id` capture the first
27
+ * instance's identity so the most important observable fact per link is
28
+ * preserved without every redundant row.
29
+ * - `resource_ref_edges` — replaces `resources-referrers`. Structural
30
+ * rename with an added `count` column; `WITHOUT ROWID` because the
31
+ * composite PK `(resource_id, page_id)` is the natural clustering key
32
+ * and every column is small — the same reasoning as `page_html_blobs`.
33
+ * - `image_items` — replaces `images`. `src` / `currentSrc` split into
34
+ * `*_url_id` (regular URLs) vs `*_blob_id` (large `data:` URIs, routed
35
+ * via `blob_refs`); `sourceCode` is replaced by `dom_path_text_id`,
36
+ * which the populate step derives from the `outerHTML` string.
37
+ *
38
+ * ### Key invariants
39
+ *
40
+ * **Same PK values as legacy.** `content_items.id`, `resource_items.id`,
41
+ * and `image_items.id` reuse the exact PK values from `pages.id`,
42
+ * `resources.id`, and `images.id` respectively. The populate step inserts
43
+ * rows with explicit IDs so every existing FK reference in `page_errors`,
44
+ * `page_tags`, `page_jsonld`, `page_html_ref`, and `resources-referrers`
45
+ * (before it becomes `resource_ref_edges`) survives the switch without
46
+ * any per-row UPDATE. `AUTOINCREMENT` is nevertheless applied on all four
47
+ * entity PKs (`content_items` / `resource_items` / `anchor_edges` /
48
+ * `image_items`) to match the legacy contract (`t.increments()` on
49
+ * `pages` / `resources` / `anchors` / `images`) — this prevents rowid
50
+ * reuse after DELETE, so external systems (viewer
51
+ * bookmarks, Sheets exports) keyed on `content_item.id` cannot be
52
+ * silently reassigned to a different record.
53
+ *
54
+ * **UNIQUE(url_id) on content_items and resource_items.** The legacy
55
+ * `pages.url UNIQUE` / `resources.url UNIQUE` guaranteed one row per
56
+ * URL string. Under the new model the URL string is stored once in
57
+ * `url_refs` and each entity references `url_refs.id` via `url_id` —
58
+ * but `url_refs.url UNIQUE` only guarantees "one URL string → one
59
+ * ref id", it does NOT prevent two entity rows from claiming the same
60
+ * ref id. `UNIQUE(url_id)` on both `content_items` and `resource_items`
61
+ * re-establishes that guarantee at the entity level — without it a
62
+ * populate bug could attach two entity rows to the same URL, and every
63
+ * by-URL reader would silently return an arbitrary one. The UNIQUE
64
+ * constraint's auto-index also serves the by-URL seek path, so no
65
+ * separate `CREATE INDEX ... ON content_items(url_id)` is needed.
66
+ * `resource_items.url_id` is nullable (unlike `content_items.url_id`)
67
+ * because a resource's identity URL can itself be blob-routed — see the
68
+ * `resource_items url / blob mutual-exclusion CHECK` invariant below.
69
+ * `UNIQUE` on a nullable SQLite column only dedups the non-NULL values,
70
+ * so the guarantee still holds for every resource that does have a
71
+ * `url_id`.
72
+ *
73
+ * **`redirect_dest_id` self-reference is DEFERRABLE INITIALLY DEFERRED.**
74
+ * `content_items.redirect_dest_id` references `content_items(id)` (not
75
+ * `pages(id)`), mirroring the legacy `pages.redirectDestId → pages.id`
76
+ * self-reference. In the real archive shape, a redirect source can be
77
+ * discovered as an anchor (assigned a low `pages.id`) BEFORE its
78
+ * destination is crawled (higher `pages.id`), so a straight
79
+ * `ORDER BY id ASC` populate would violate the FK on the source row.
80
+ * Making the FK deferred lets the populate step commit all `content_items`
81
+ * inserts inside one transaction without any per-row ordering
82
+ * discipline — SQLite validates the constraint only at COMMIT time.
83
+ *
84
+ * **`page_meta.page_id` PK == FK ON DELETE CASCADE.** `page_meta` uses
85
+ * `page_id` as both the primary key and the FK back to `content_items(id)`.
86
+ * This is a 1:1 relation (every content_item has at most one meta row),
87
+ * so a separate autoincrement id would only bloat the row. The cascade
88
+ * mirrors the legacy `page_html_ref` / `page_tags` / `page_jsonld` FKs
89
+ * to `pages(id)` so a future cleanup pass can DELETE from
90
+ * `content_items` without leaving orphan meta rows.
91
+ *
92
+ * **`content_items.source` and `resource_items.source` DEFAULT 'crawled'.**
93
+ * The legacy `pages.source` / `resources.source` columns were
94
+ * `NOT NULL DEFAULT 'crawled'`, and multiple existing writer paths rely
95
+ * on the default (redirect-source insert, per-chunk resource insert, and
96
+ * `markBrowserScrape`). Preserving the default keeps those callsites
97
+ * working when the 0.13 write path re-points them at the new tables — dropping
98
+ * the default would turn a routine crawl into an immediate hard failure
99
+ * the first time a callsite omits `source`.
100
+ *
101
+ * **`anchor_edges` dedup shape.** `unique(page_id, href_page_id)` enforces
102
+ * the collapse from ≈ 13M legacy `anchors` rows to ≈ 9.7M `anchor_edges`
103
+ * rows (~25 % reduction on the reference archive).
104
+ * `first_hash` and `first_text_id` capture the anchor `hash` and
105
+ * `textContent` of the FIRST instance encountered (lowest `anchors.id`
106
+ * for the pair); duplicate observations are counted via `count` without
107
+ * retaining their bodies. The UNIQUE constraint's auto-index on
108
+ * `(page_id, href_page_id)` also serves any `WHERE page_id = ?` seek via
109
+ * SQLite's leading-prefix rule, so no separate
110
+ * `CREATE INDEX ... ON anchor_edges(page_id)` is needed; only the reverse-direction
111
+ * `idx_anchor_edges_href` on `href_page_id` alone is added.
112
+ *
113
+ * **`image_items.dom_path_text_id NOT NULL`.** Every image row must
114
+ * resolve to a `text_refs` entry describing its DOM position. The
115
+ * image-items populate derives the path from `images.sourceCode` (the
116
+ * stored `outerHTML`); an
117
+ * image whose `sourceCode` is empty falls back to the synthetic label
118
+ * `img[unknown]` (via the image-items populate) so the FK is never violated.
119
+ *
120
+ * **`image_items` src / blob mutual-exclusion CHECK.** `src_url_id` and
121
+ * `src_blob_id` (and their `current_src_*` mirror) are separate nullable
122
+ * columns because a `<img>` value can be either a plain URL or a large
123
+ * `data:` URI. A single legacy `images.src` TEXT column could not
124
+ * express the ambiguity; the new schema splits the two but adds a CHECK
125
+ * so at most one slot per (src, currentSrc) pair is non-null. Without
126
+ * the CHECK a populate bug or future writer could silently write both,
127
+ * and the viewer would arbitrarily pick one to render.
128
+ *
129
+ * **`resource_items` url / blob mutual-exclusion CHECK.** Same rationale
130
+ * as the image CHECK above, but stricter:
131
+ * `(url_id IS NULL) != (url_blob_id IS NULL)` requires EXACTLY one slot to be non-null (not
132
+ * "at most one") because a resource — unlike an `<img>` that can
133
+ * legitimately have neither `src` nor `currentSrc` — is always
134
+ * identified by some URL. `resolveUrlOrBlob` (writer) /
135
+ * `resolveUrlOrBlobFromMaps` (populate) are shared with `image_items`'
136
+ * routing so the two entities never disagree on which values count as
137
+ * "large data URI".
138
+ *
139
+ * **`page_meta.main_content_*` / `scroll_height_*` columns.** Denormalised
140
+ * aggregates derived from beholder's `MainContentsData` / `ScrollHeightData`
141
+ * (word/element counts, desktop+mobile scroll height), following the same
142
+ * write-once-at-scrape-time pattern as `tag_count` / `jsonld_count` so list
143
+ * / detail reads never re-derive them from the per-page child tables
144
+ * (`page_main_content_headings` etc., see `create-adjunct-tables.ts`).
145
+ * `main_content_node_name` / `_id` / `_role` / `_selector` / `_class_list`
146
+ * identify the detected main-content element; unlike `title_text_id` /
147
+ * `description_text_id` these are stored as plain `TEXT` rather than routed
148
+ * through `text_refs` — the values are page-specific diagnostics with low
149
+ * cross-page reuse, so the ref-table dedup machinery would add write-path
150
+ * cost without a corresponding storage win. `main_content_class_list` holds
151
+ * a JSON-encoded string array. `main_content_custom_element_count` is the
152
+ * one exception to "derived from beholder's `MainContentsData`" — beholder
153
+ * has no `customElements` category, so nitpicker captures Web Components
154
+ * itself (`@nitpicker/crawler`'s `crawler/capture-custom-elements.ts`) after `scrapeStart`
155
+ * returns, the same way it captures image dom-paths.
156
+ *
157
+ * ### Index rationale
158
+ *
159
+ * Every index below reflects a legacy-baseline single-column index that
160
+ * an existing hot path already relies on. `content_items` gets six
161
+ * indexes: `url_id` (via `UNIQUE` auto-index), `is_external`, `scraped`,
162
+ * `redirect_dest_id` (for the Page Detail inbound-redirect list),
163
+ * `content_type_id`, `crawl_order`, and `source` — all present on
164
+ * legacy `pages`. `page_meta` gets `og_type` and `robots_noindex`
165
+ * because both were indexed on legacy `pages` for the noindex /
166
+ * og:type filter hot paths; after the split those readers land on
167
+ * `page_meta` and need the indexes to remain sub-second. `resource_items` gets `url_id`
168
+ * (via `UNIQUE` auto-index) and `source`. `anchor_edges` gets one
169
+ * reverse-direction index (`idx_anchor_edges_href`); the UNIQUE
170
+ * auto-index covers the forward direction. `resource_ref_edges` needs
171
+ * an explicit reverse-direction index on `page_id` because the
172
+ * composite PK `(resource_id, page_id)` only satisfies the `resource_id`-
173
+ * first prefix; the legacy `resources-referrers` table had exactly
174
+ * this reverse-direction index. `image_items` gets one index on
175
+ * `page_id`. No summary / listfilter compound indexes are created here —
176
+ * they belong to the viewer read model built directly against these
177
+ * tables.
178
+ *
179
+ * ### Idempotency
180
+ *
181
+ * All statements use `CREATE TABLE IF NOT EXISTS` /
182
+ * `CREATE INDEX IF NOT EXISTS` so the primitive is safe to call multiple times against the
183
+ * same DB. Both call sites (`initSchema` and
184
+ * `migrateEntityTables`) still guard on their own sentinels,
185
+ * but the function itself no longer depends on the sentinel being
186
+ * checked first — this closes the partial-corruption gap where, say,
187
+ * `content_items` exists but `page_meta` was dropped by an external
188
+ * repair pass.
189
+ * @param instance - The Knex query builder instance connected to the database.
190
+ */
191
+ export declare function createEntityTables(instance: Knex): Promise<void>;
@@ -0,0 +1,387 @@
1
+ /**
2
+ * Creates the 6 core entity and edge tables of the 0.13 format (issue #192).
3
+ *
4
+ * These are the normalised entity / edge tables that replace the legacy
5
+ * write model (`pages`, `anchors`, `images`, `resources`, `resources-referrers`)
6
+ * in the 0.13 format. This migration is purely additive DDL — no existing table
7
+ * is modified and no row is inserted; the populate step
8
+ * (`populateEntityTables`) fills the tables from the legacy sources.
9
+ *
10
+ * Tables created:
11
+ *
12
+ * - `content_items` — replaces `pages` (core columns). The remaining
13
+ * per-page metadata splits into `page_meta`.
14
+ * - `page_meta` — page-specific metadata (title, description, meta tags,
15
+ * OpenGraph, Twitter, robots, denormalised aggregates, meta_extras JSON
16
+ * pointer). Split from `pages` so that filter / cursor queries against
17
+ * `content_items` scan a narrower row.
18
+ * - `resource_items` — replaces `resources`. Identity URL splits into
19
+ * `url_id` (regular URLs) vs `url_blob_id` (large `data:` URIs, routed
20
+ * via `blob_refs`) — a resource's own URL is captured verbatim from
21
+ * the network layer and, unlike a page's URL, can legally be a large
22
+ * inline `data:` URI (e.g. a CSS `background-image` sub-resource).
23
+ * - `anchor_edges` — replaces `anchors`. Deduped to distinct
24
+ * `(page_id, href_page_id)` pairs; `count` records how many instances
25
+ * were observed and `first_hash` / `first_text_id` capture the first
26
+ * instance's identity so the most important observable fact per link is
27
+ * preserved without every redundant row.
28
+ * - `resource_ref_edges` — replaces `resources-referrers`. Structural
29
+ * rename with an added `count` column; `WITHOUT ROWID` because the
30
+ * composite PK `(resource_id, page_id)` is the natural clustering key
31
+ * and every column is small — the same reasoning as `page_html_blobs`.
32
+ * - `image_items` — replaces `images`. `src` / `currentSrc` split into
33
+ * `*_url_id` (regular URLs) vs `*_blob_id` (large `data:` URIs, routed
34
+ * via `blob_refs`); `sourceCode` is replaced by `dom_path_text_id`,
35
+ * which the populate step derives from the `outerHTML` string.
36
+ *
37
+ * ### Key invariants
38
+ *
39
+ * **Same PK values as legacy.** `content_items.id`, `resource_items.id`,
40
+ * and `image_items.id` reuse the exact PK values from `pages.id`,
41
+ * `resources.id`, and `images.id` respectively. The populate step inserts
42
+ * rows with explicit IDs so every existing FK reference in `page_errors`,
43
+ * `page_tags`, `page_jsonld`, `page_html_ref`, and `resources-referrers`
44
+ * (before it becomes `resource_ref_edges`) survives the switch without
45
+ * any per-row UPDATE. `AUTOINCREMENT` is nevertheless applied on all four
46
+ * entity PKs (`content_items` / `resource_items` / `anchor_edges` /
47
+ * `image_items`) to match the legacy contract (`t.increments()` on
48
+ * `pages` / `resources` / `anchors` / `images`) — this prevents rowid
49
+ * reuse after DELETE, so external systems (viewer
50
+ * bookmarks, Sheets exports) keyed on `content_item.id` cannot be
51
+ * silently reassigned to a different record.
52
+ *
53
+ * **UNIQUE(url_id) on content_items and resource_items.** The legacy
54
+ * `pages.url UNIQUE` / `resources.url UNIQUE` guaranteed one row per
55
+ * URL string. Under the new model the URL string is stored once in
56
+ * `url_refs` and each entity references `url_refs.id` via `url_id` —
57
+ * but `url_refs.url UNIQUE` only guarantees "one URL string → one
58
+ * ref id", it does NOT prevent two entity rows from claiming the same
59
+ * ref id. `UNIQUE(url_id)` on both `content_items` and `resource_items`
60
+ * re-establishes that guarantee at the entity level — without it a
61
+ * populate bug could attach two entity rows to the same URL, and every
62
+ * by-URL reader would silently return an arbitrary one. The UNIQUE
63
+ * constraint's auto-index also serves the by-URL seek path, so no
64
+ * separate `CREATE INDEX ... ON content_items(url_id)` is needed.
65
+ * `resource_items.url_id` is nullable (unlike `content_items.url_id`)
66
+ * because a resource's identity URL can itself be blob-routed — see the
67
+ * `resource_items url / blob mutual-exclusion CHECK` invariant below.
68
+ * `UNIQUE` on a nullable SQLite column only dedups the non-NULL values,
69
+ * so the guarantee still holds for every resource that does have a
70
+ * `url_id`.
71
+ *
72
+ * **`redirect_dest_id` self-reference is DEFERRABLE INITIALLY DEFERRED.**
73
+ * `content_items.redirect_dest_id` references `content_items(id)` (not
74
+ * `pages(id)`), mirroring the legacy `pages.redirectDestId → pages.id`
75
+ * self-reference. In the real archive shape, a redirect source can be
76
+ * discovered as an anchor (assigned a low `pages.id`) BEFORE its
77
+ * destination is crawled (higher `pages.id`), so a straight
78
+ * `ORDER BY id ASC` populate would violate the FK on the source row.
79
+ * Making the FK deferred lets the populate step commit all `content_items`
80
+ * inserts inside one transaction without any per-row ordering
81
+ * discipline — SQLite validates the constraint only at COMMIT time.
82
+ *
83
+ * **`page_meta.page_id` PK == FK ON DELETE CASCADE.** `page_meta` uses
84
+ * `page_id` as both the primary key and the FK back to `content_items(id)`.
85
+ * This is a 1:1 relation (every content_item has at most one meta row),
86
+ * so a separate autoincrement id would only bloat the row. The cascade
87
+ * mirrors the legacy `page_html_ref` / `page_tags` / `page_jsonld` FKs
88
+ * to `pages(id)` so a future cleanup pass can DELETE from
89
+ * `content_items` without leaving orphan meta rows.
90
+ *
91
+ * **`content_items.source` and `resource_items.source` DEFAULT 'crawled'.**
92
+ * The legacy `pages.source` / `resources.source` columns were
93
+ * `NOT NULL DEFAULT 'crawled'`, and multiple existing writer paths rely
94
+ * on the default (redirect-source insert, per-chunk resource insert, and
95
+ * `markBrowserScrape`). Preserving the default keeps those callsites
96
+ * working when the 0.13 write path re-points them at the new tables — dropping
97
+ * the default would turn a routine crawl into an immediate hard failure
98
+ * the first time a callsite omits `source`.
99
+ *
100
+ * **`anchor_edges` dedup shape.** `unique(page_id, href_page_id)` enforces
101
+ * the collapse from ≈ 13M legacy `anchors` rows to ≈ 9.7M `anchor_edges`
102
+ * rows (~25 % reduction on the reference archive).
103
+ * `first_hash` and `first_text_id` capture the anchor `hash` and
104
+ * `textContent` of the FIRST instance encountered (lowest `anchors.id`
105
+ * for the pair); duplicate observations are counted via `count` without
106
+ * retaining their bodies. The UNIQUE constraint's auto-index on
107
+ * `(page_id, href_page_id)` also serves any `WHERE page_id = ?` seek via
108
+ * SQLite's leading-prefix rule, so no separate
109
+ * `CREATE INDEX ... ON anchor_edges(page_id)` is needed; only the reverse-direction
110
+ * `idx_anchor_edges_href` on `href_page_id` alone is added.
111
+ *
112
+ * **`image_items.dom_path_text_id NOT NULL`.** Every image row must
113
+ * resolve to a `text_refs` entry describing its DOM position. The
114
+ * image-items populate derives the path from `images.sourceCode` (the
115
+ * stored `outerHTML`); an
116
+ * image whose `sourceCode` is empty falls back to the synthetic label
117
+ * `img[unknown]` (via the image-items populate) so the FK is never violated.
118
+ *
119
+ * **`image_items` src / blob mutual-exclusion CHECK.** `src_url_id` and
120
+ * `src_blob_id` (and their `current_src_*` mirror) are separate nullable
121
+ * columns because a `<img>` value can be either a plain URL or a large
122
+ * `data:` URI. A single legacy `images.src` TEXT column could not
123
+ * express the ambiguity; the new schema splits the two but adds a CHECK
124
+ * so at most one slot per (src, currentSrc) pair is non-null. Without
125
+ * the CHECK a populate bug or future writer could silently write both,
126
+ * and the viewer would arbitrarily pick one to render.
127
+ *
128
+ * **`resource_items` url / blob mutual-exclusion CHECK.** Same rationale
129
+ * as the image CHECK above, but stricter:
130
+ * `(url_id IS NULL) != (url_blob_id IS NULL)` requires EXACTLY one slot to be non-null (not
131
+ * "at most one") because a resource — unlike an `<img>` that can
132
+ * legitimately have neither `src` nor `currentSrc` — is always
133
+ * identified by some URL. `resolveUrlOrBlob` (writer) /
134
+ * `resolveUrlOrBlobFromMaps` (populate) are shared with `image_items`'
135
+ * routing so the two entities never disagree on which values count as
136
+ * "large data URI".
137
+ *
138
+ * **`page_meta.main_content_*` / `scroll_height_*` columns.** Denormalised
139
+ * aggregates derived from beholder's `MainContentsData` / `ScrollHeightData`
140
+ * (word/element counts, desktop+mobile scroll height), following the same
141
+ * write-once-at-scrape-time pattern as `tag_count` / `jsonld_count` so list
142
+ * / detail reads never re-derive them from the per-page child tables
143
+ * (`page_main_content_headings` etc., see `create-adjunct-tables.ts`).
144
+ * `main_content_node_name` / `_id` / `_role` / `_selector` / `_class_list`
145
+ * identify the detected main-content element; unlike `title_text_id` /
146
+ * `description_text_id` these are stored as plain `TEXT` rather than routed
147
+ * through `text_refs` — the values are page-specific diagnostics with low
148
+ * cross-page reuse, so the ref-table dedup machinery would add write-path
149
+ * cost without a corresponding storage win. `main_content_class_list` holds
150
+ * a JSON-encoded string array. `main_content_custom_element_count` is the
151
+ * one exception to "derived from beholder's `MainContentsData`" — beholder
152
+ * has no `customElements` category, so nitpicker captures Web Components
153
+ * itself (`@nitpicker/crawler`'s `crawler/capture-custom-elements.ts`) after `scrapeStart`
154
+ * returns, the same way it captures image dom-paths.
155
+ *
156
+ * ### Index rationale
157
+ *
158
+ * Every index below reflects a legacy-baseline single-column index that
159
+ * an existing hot path already relies on. `content_items` gets six
160
+ * indexes: `url_id` (via `UNIQUE` auto-index), `is_external`, `scraped`,
161
+ * `redirect_dest_id` (for the Page Detail inbound-redirect list),
162
+ * `content_type_id`, `crawl_order`, and `source` — all present on
163
+ * legacy `pages`. `page_meta` gets `og_type` and `robots_noindex`
164
+ * because both were indexed on legacy `pages` for the noindex /
165
+ * og:type filter hot paths; after the split those readers land on
166
+ * `page_meta` and need the indexes to remain sub-second. `resource_items` gets `url_id`
167
+ * (via `UNIQUE` auto-index) and `source`. `anchor_edges` gets one
168
+ * reverse-direction index (`idx_anchor_edges_href`); the UNIQUE
169
+ * auto-index covers the forward direction. `resource_ref_edges` needs
170
+ * an explicit reverse-direction index on `page_id` because the
171
+ * composite PK `(resource_id, page_id)` only satisfies the `resource_id`-
172
+ * first prefix; the legacy `resources-referrers` table had exactly
173
+ * this reverse-direction index. `image_items` gets one index on
174
+ * `page_id`. No summary / listfilter compound indexes are created here —
175
+ * they belong to the viewer read model built directly against these
176
+ * tables.
177
+ *
178
+ * ### Idempotency
179
+ *
180
+ * All statements use `CREATE TABLE IF NOT EXISTS` /
181
+ * `CREATE INDEX IF NOT EXISTS` so the primitive is safe to call multiple times against the
182
+ * same DB. Both call sites (`initSchema` and
183
+ * `migrateEntityTables`) still guard on their own sentinels,
184
+ * but the function itself no longer depends on the sentinel being
185
+ * checked first — this closes the partial-corruption gap where, say,
186
+ * `content_items` exists but `page_meta` was dropped by an external
187
+ * repair pass.
188
+ * @param instance - The Knex query builder instance connected to the database.
189
+ */
190
+ export async function createEntityTables(instance) {
191
+ await instance.raw(`
192
+ CREATE TABLE IF NOT EXISTS content_items (
193
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
194
+ url_id INTEGER NOT NULL UNIQUE REFERENCES url_refs(id),
195
+ is_external INTEGER NOT NULL,
196
+ scraped INTEGER NOT NULL,
197
+ is_target INTEGER NOT NULL,
198
+ is_metadata_only INTEGER NOT NULL DEFAULT 0,
199
+ status INTEGER,
200
+ status_text TEXT,
201
+ content_type_id INTEGER REFERENCES content_type_refs(id),
202
+ content_length INTEGER,
203
+ header_set_id INTEGER REFERENCES header_sets(id),
204
+ redirect_dest_id INTEGER REFERENCES content_items(id) DEFERRABLE INITIALLY DEFERRED,
205
+ alias_of_id INTEGER REFERENCES content_items(id) DEFERRABLE INITIALLY DEFERRED,
206
+ dedupe_cap_event_id INTEGER REFERENCES dedupe_cap_events(id) DEFERRABLE INITIALLY DEFERRED,
207
+ source TEXT NOT NULL DEFAULT 'crawled',
208
+ first_crawled_at INTEGER,
209
+ last_crawled_at INTEGER,
210
+ crawl_order INTEGER,
211
+ is_skipped INTEGER,
212
+ skip_reason TEXT
213
+ )
214
+ `);
215
+ await instance.raw('CREATE INDEX IF NOT EXISTS idx_content_items_external ON content_items(is_external)');
216
+ await instance.raw('CREATE INDEX IF NOT EXISTS idx_content_items_scraped ON content_items(scraped)');
217
+ await instance.raw('CREATE INDEX IF NOT EXISTS idx_content_items_redirect_dest_id ON content_items(redirect_dest_id)');
218
+ // `idx_content_items_alias_of_id` is NOT created here even though
219
+ // `alias_of_id` is: this DDL runs unconditionally on every archive open
220
+ // (including legacy archives that still lack the column at this point,
221
+ // before `migrateContentItemsAliasOfId` adds it), so an unconditional
222
+ // `CREATE INDEX ... alias_of_id` here would fail with `no such column`
223
+ // on any archive that predates this feature. The index is created in
224
+ // `migrateContentItemsAliasOfId` instead, which runs after the
225
+ // column-add guard for both fresh and legacy archives (same reasoning as
226
+ // `page_meta.body_hash`'s index).
227
+ //
228
+ // `dedupe_cap_event_id` gets no index anywhere, not even in its own
229
+ // migration (`migrateContentItemsDedupeCapEventId`) — unlike
230
+ // `alias_of_id`, there is no known hot read path filtering on this
231
+ // column yet (`--dedupe-cap` is opt-in and the marked row count is
232
+ // small: capped shapes × matching URLs). Adding a speculative index
233
+ // without a measured query to justify it violates this archive's
234
+ // "no speculative index" rule; add one later with `EXPLAIN QUERY PLAN`
235
+ // evidence if a real hot path emerges.
236
+ await instance.raw('CREATE INDEX IF NOT EXISTS idx_content_items_content_type_id ON content_items(content_type_id)');
237
+ await instance.raw('CREATE INDEX IF NOT EXISTS idx_content_items_crawl_order ON content_items(crawl_order)');
238
+ await instance.raw('CREATE INDEX IF NOT EXISTS idx_content_items_source ON content_items(source)');
239
+ await instance.raw(`
240
+ CREATE TABLE IF NOT EXISTS page_meta (
241
+ page_id INTEGER PRIMARY KEY REFERENCES content_items(id) ON DELETE CASCADE,
242
+ lang TEXT,
243
+ dir TEXT,
244
+ charset TEXT,
245
+ base_href TEXT,
246
+ viewport_raw TEXT,
247
+ theme_color TEXT,
248
+ application_name TEXT,
249
+ author TEXT,
250
+ generator TEXT,
251
+ publisher TEXT,
252
+ title_text_id INTEGER REFERENCES text_refs(id),
253
+ description_text_id INTEGER REFERENCES text_refs(id),
254
+ keywords_text_id INTEGER REFERENCES text_refs(id),
255
+ robots_raw_text_id INTEGER REFERENCES text_refs(id),
256
+ robots_noindex INTEGER,
257
+ robots_nofollow INTEGER,
258
+ robots_noarchive INTEGER,
259
+ robots_noimageindex INTEGER,
260
+ googlebot TEXT,
261
+ canonical_url_id INTEGER REFERENCES url_refs(id),
262
+ amphtml_url_id INTEGER REFERENCES url_refs(id),
263
+ manifest_url_id INTEGER REFERENCES url_refs(id),
264
+ icon_url_id INTEGER REFERENCES url_refs(id),
265
+ apple_touch_icon_url_id INTEGER REFERENCES url_refs(id),
266
+ og_type TEXT,
267
+ og_title_text_id INTEGER REFERENCES text_refs(id),
268
+ og_description_text_id INTEGER REFERENCES text_refs(id),
269
+ og_url_id INTEGER REFERENCES url_refs(id),
270
+ og_image_url_id INTEGER REFERENCES url_refs(id),
271
+ og_site_name TEXT,
272
+ og_image_alt TEXT,
273
+ og_image_width TEXT,
274
+ og_image_height TEXT,
275
+ og_locale TEXT,
276
+ og_article_published_time TEXT,
277
+ og_article_modified_time TEXT,
278
+ twitter_card TEXT,
279
+ twitter_site TEXT,
280
+ twitter_creator TEXT,
281
+ twitter_title_text_id INTEGER REFERENCES text_refs(id),
282
+ twitter_description_text_id INTEGER REFERENCES text_refs(id),
283
+ twitter_image_url_id INTEGER REFERENCES url_refs(id),
284
+ fb_app_id TEXT,
285
+ verification_google TEXT,
286
+ format_detection_telephone INTEGER,
287
+ tag_count INTEGER,
288
+ jsonld_count INTEGER,
289
+ tags_providers_csv TEXT,
290
+ meta_extras_json_id INTEGER REFERENCES json_refs(id),
291
+ main_content_node_name TEXT,
292
+ main_content_id TEXT,
293
+ main_content_role TEXT,
294
+ main_content_selector TEXT,
295
+ main_content_class_list TEXT,
296
+ main_content_word_count INTEGER,
297
+ main_content_body_word_count INTEGER,
298
+ main_content_heading_count INTEGER,
299
+ main_content_image_count INTEGER,
300
+ main_content_table_count INTEGER,
301
+ main_content_button_count INTEGER,
302
+ main_content_iframe_count INTEGER,
303
+ main_content_video_count INTEGER,
304
+ main_content_audio_count INTEGER,
305
+ main_content_canvas_count INTEGER,
306
+ main_content_custom_element_count INTEGER,
307
+ scroll_height_desktop INTEGER,
308
+ scroll_height_mobile INTEGER,
309
+ image_scan_desktop INTEGER,
310
+ image_scan_mobile INTEGER,
311
+ body_hash BLOB,
312
+ console_error_count INTEGER
313
+ )
314
+ `);
315
+ await instance.raw('CREATE INDEX IF NOT EXISTS idx_page_meta_og_type ON page_meta(og_type)');
316
+ // `idx_page_meta_body_hash` is NOT created here even though `body_hash`
317
+ // is: this DDL runs unconditionally on every archive open (including
318
+ // legacy archives that still lack the column at this point, before
319
+ // `migratePageMetaBodyHash` adds it), so an unconditional
320
+ // `CREATE INDEX ... body_hash` here would fail with `no such column` on
321
+ // any archive that predates this feature. The index is created in
322
+ // `migratePageMetaBodyHash` instead, which runs after the column-add
323
+ // guard for both fresh and legacy archives.
324
+ await instance.raw('CREATE INDEX IF NOT EXISTS idx_page_meta_robots_noindex ON page_meta(robots_noindex)');
325
+ await instance.raw(`
326
+ CREATE TABLE IF NOT EXISTS resource_items (
327
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
328
+ url_id INTEGER UNIQUE REFERENCES url_refs(id),
329
+ url_blob_id INTEGER UNIQUE REFERENCES blob_refs(id),
330
+ is_external INTEGER NOT NULL,
331
+ status INTEGER,
332
+ status_text TEXT,
333
+ content_type_id INTEGER REFERENCES content_type_refs(id),
334
+ content_length INTEGER,
335
+ header_set_id INTEGER REFERENCES header_sets(id),
336
+ compress TEXT,
337
+ cdn TEXT,
338
+ source TEXT NOT NULL DEFAULT 'crawled',
339
+ CHECK ((url_id IS NULL) != (url_blob_id IS NULL))
340
+ )
341
+ `);
342
+ await instance.raw('CREATE INDEX IF NOT EXISTS idx_resource_items_source ON resource_items(source)');
343
+ await instance.raw(`
344
+ CREATE TABLE IF NOT EXISTS anchor_edges (
345
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
346
+ page_id INTEGER NOT NULL REFERENCES content_items(id),
347
+ href_page_id INTEGER NOT NULL REFERENCES content_items(id),
348
+ count INTEGER NOT NULL,
349
+ first_hash TEXT,
350
+ first_text_id INTEGER REFERENCES text_refs(id),
351
+ UNIQUE(page_id, href_page_id)
352
+ )
353
+ `);
354
+ await instance.raw('CREATE INDEX IF NOT EXISTS idx_anchor_edges_href ON anchor_edges(href_page_id)');
355
+ await instance.raw(`
356
+ CREATE TABLE IF NOT EXISTS resource_ref_edges (
357
+ resource_id INTEGER NOT NULL REFERENCES resource_items(id),
358
+ page_id INTEGER NOT NULL REFERENCES content_items(id),
359
+ count INTEGER NOT NULL DEFAULT 1,
360
+ PRIMARY KEY(resource_id, page_id)
361
+ ) WITHOUT ROWID
362
+ `);
363
+ await instance.raw('CREATE INDEX IF NOT EXISTS idx_resource_ref_edges_page ON resource_ref_edges(page_id)');
364
+ await instance.raw(`
365
+ CREATE TABLE IF NOT EXISTS image_items (
366
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
367
+ page_id INTEGER NOT NULL REFERENCES content_items(id),
368
+ src_url_id INTEGER REFERENCES url_refs(id),
369
+ current_src_url_id INTEGER REFERENCES url_refs(id),
370
+ src_blob_id INTEGER REFERENCES blob_refs(id),
371
+ current_src_blob_id INTEGER REFERENCES blob_refs(id),
372
+ alt_text_id INTEGER REFERENCES text_refs(id),
373
+ width REAL,
374
+ height REAL,
375
+ natural_width INTEGER,
376
+ natural_height INTEGER,
377
+ is_lazy INTEGER,
378
+ viewport_width INTEGER,
379
+ dom_path_text_id INTEGER NOT NULL REFERENCES text_refs(id),
380
+ CHECK (
381
+ (src_url_id IS NULL OR src_blob_id IS NULL)
382
+ AND (current_src_url_id IS NULL OR current_src_blob_id IS NULL)
383
+ )
384
+ )
385
+ `);
386
+ await instance.raw('CREATE INDEX IF NOT EXISTS idx_image_items_page ON image_items(page_id)');
387
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Emits a human-readable progress line for a long-running populate step.
3
+ * Injected the same way as `PageDomPathResolver`
4
+ * (`populate-entity-tables/populate-image-items.ts`) — the crawler
5
+ * package stays silent by default for library consumers, while
6
+ * `scripts/migrate-to-0.13.mjs` supplies a `console.log`-backed callback.
7
+ */
8
+ export type ProgressCallback = (message: string) => void;
9
+ /**
10
+ * Returns a `report(processed)` function that calls `onProgress` at most
11
+ * once per 5%-of-`total` tier crossed, so a keyset-paginated loop over a
12
+ * multi-million-row table can report progress every chunk without
13
+ * flooding the log with one line per chunk.
14
+ * @param label - Prefix identifying which populate step / source table
15
+ * this reporter tracks, e.g. `"url_refs (resources)"`.
16
+ * @param total - Total row/page count the loop will scan, precomputed by
17
+ * the caller via a `COUNT(*)`.
18
+ * @param onProgress - Caller-supplied sink, or `undefined` to disable
19
+ * reporting entirely (zero overhead — `report` becomes a no-op).
20
+ * @returns `report(processed)` — call after each chunk with the
21
+ * cumulative count processed so far.
22
+ * @example
23
+ * const total = Number((await trx('url_refs').count({ n: '*' }))[0]?.n ?? 0);
24
+ * const report = createProgressReporter('url_refs', total, onProgress);
25
+ * let processed = 0;
26
+ * // ...inside the read-chunk loop...
27
+ * processed += rows.length;
28
+ * report(processed);
29
+ */
30
+ export declare function createProgressReporter(label: string, total: number, onProgress: ProgressCallback | undefined): (processed: number) => void;
@@ -0,0 +1,38 @@
1
+ /** Progress tiers per run — one report per 5% of `total`, so a 13M-row table produces ~20 lines, not one per chunk. */
2
+ const TIERS = 20;
3
+ /**
4
+ * Returns a `report(processed)` function that calls `onProgress` at most
5
+ * once per 5%-of-`total` tier crossed, so a keyset-paginated loop over a
6
+ * multi-million-row table can report progress every chunk without
7
+ * flooding the log with one line per chunk.
8
+ * @param label - Prefix identifying which populate step / source table
9
+ * this reporter tracks, e.g. `"url_refs (resources)"`.
10
+ * @param total - Total row/page count the loop will scan, precomputed by
11
+ * the caller via a `COUNT(*)`.
12
+ * @param onProgress - Caller-supplied sink, or `undefined` to disable
13
+ * reporting entirely (zero overhead — `report` becomes a no-op).
14
+ * @returns `report(processed)` — call after each chunk with the
15
+ * cumulative count processed so far.
16
+ * @example
17
+ * const total = Number((await trx('url_refs').count({ n: '*' }))[0]?.n ?? 0);
18
+ * const report = createProgressReporter('url_refs', total, onProgress);
19
+ * let processed = 0;
20
+ * // ...inside the read-chunk loop...
21
+ * processed += rows.length;
22
+ * report(processed);
23
+ */
24
+ export function createProgressReporter(label, total, onProgress) {
25
+ let lastTier = 0;
26
+ return (processed) => {
27
+ if (onProgress === undefined || total === 0) {
28
+ return;
29
+ }
30
+ const tier = Math.floor((processed / total) * TIERS);
31
+ if (tier <= lastTier) {
32
+ return;
33
+ }
34
+ lastTier = tier;
35
+ const percent = Math.min(100, Math.round((processed / total) * 100));
36
+ onProgress(`${label}: ${processed}/${total} (${percent}%)`);
37
+ };
38
+ }