@nitpicker/archive 0.0.0 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (737) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +106 -0
  3. package/lib/apply-connection-pragmas.d.ts +18 -0
  4. package/lib/apply-connection-pragmas.js +40 -0
  5. package/lib/archive-accessor.d.ts +265 -0
  6. package/lib/archive-accessor.js +477 -0
  7. package/lib/archive-lock.d.ts +45 -0
  8. package/lib/archive-lock.js +154 -0
  9. package/lib/archive.d.ts +736 -0
  10. package/lib/archive.js +1056 -0
  11. package/lib/body-hash/compute-body-hash.d.ts +32 -0
  12. package/lib/body-hash/compute-body-hash.js +35 -0
  13. package/lib/cache/clear-archive-cache-entry.d.ts +18 -0
  14. package/lib/cache/clear-archive-cache-entry.js +24 -0
  15. package/lib/cache/clear-archive-cache-root.d.ts +26 -0
  16. package/lib/cache/clear-archive-cache-root.js +32 -0
  17. package/lib/cache/compute-archive-cache-key.d.ts +39 -0
  18. package/lib/cache/compute-archive-cache-key.js +95 -0
  19. package/lib/cache/extract-archive-to-cache.d.ts +57 -0
  20. package/lib/cache/extract-archive-to-cache.js +326 -0
  21. package/lib/cache/get-archive-cache-root.d.ts +20 -0
  22. package/lib/cache/get-archive-cache-root.js +53 -0
  23. package/lib/cache/is-archive-cache-disabled.d.ts +24 -0
  24. package/lib/cache/is-archive-cache-disabled.js +34 -0
  25. package/lib/cache/list-archive-cache-entries.d.ts +23 -0
  26. package/lib/cache/list-archive-cache-entries.js +130 -0
  27. package/lib/cache/path-exists.d.ts +9 -0
  28. package/lib/cache/path-exists.js +18 -0
  29. package/lib/cache/resolve-archive-cache-dir.d.ts +26 -0
  30. package/lib/cache/resolve-archive-cache-dir.js +32 -0
  31. package/lib/cache/types.d.ts +33 -0
  32. package/lib/cache/types.js +1 -0
  33. package/lib/content-type/is-html-content-type.d.ts +17 -0
  34. package/lib/content-type/is-html-content-type.js +19 -0
  35. package/lib/content-type/normalize-content-type.d.ts +14 -0
  36. package/lib/content-type/normalize-content-type.js +20 -0
  37. package/lib/create-adjunct-tables.d.ts +66 -0
  38. package/lib/create-adjunct-tables.js +510 -0
  39. package/lib/create-entity-tables.d.ts +191 -0
  40. package/lib/create-entity-tables.js +387 -0
  41. package/lib/create-progress-reporter.d.ts +30 -0
  42. package/lib/create-progress-reporter.js +38 -0
  43. package/lib/create-ref-tables.d.ts +35 -0
  44. package/lib/create-ref-tables.js +185 -0
  45. package/lib/create-template-tables.d.ts +28 -0
  46. package/lib/create-template-tables.js +92 -0
  47. package/lib/database.d.ts +549 -0
  48. package/lib/database.js +804 -0
  49. package/lib/db-ops/_shared/clear-write-ref-caches.d.ts +27 -0
  50. package/lib/db-ops/_shared/clear-write-ref-caches.js +35 -0
  51. package/lib/db-ops/_shared/compress-payload.d.ts +26 -0
  52. package/lib/db-ops/_shared/compress-payload.js +30 -0
  53. package/lib/db-ops/_shared/create-write-ref-caches.d.ts +17 -0
  54. package/lib/db-ops/_shared/create-write-ref-caches.js +27 -0
  55. package/lib/db-ops/_shared/decode-json-ref.d.ts +17 -0
  56. package/lib/db-ops/_shared/decode-json-ref.js +31 -0
  57. package/lib/db-ops/_shared/keyset-paginate-by-id.d.ts +49 -0
  58. package/lib/db-ops/_shared/keyset-paginate-by-id.js +69 -0
  59. package/lib/db-ops/_shared/load-response-headers-by-set-ids.d.ts +20 -0
  60. package/lib/db-ops/_shared/load-response-headers-by-set-ids.js +53 -0
  61. package/lib/db-ops/_shared/resolve-content-item-id.d.ts +62 -0
  62. package/lib/db-ops/_shared/resolve-content-item-id.js +143 -0
  63. package/lib/db-ops/_shared/resolve-url-or-blob.d.ts +23 -0
  64. package/lib/db-ops/_shared/resolve-url-or-blob.js +29 -0
  65. package/lib/db-ops/_shared/retry-setting.d.ts +16 -0
  66. package/lib/db-ops/_shared/retry-setting.js +18 -0
  67. package/lib/db-ops/_shared/safe-parse-json.d.ts +11 -0
  68. package/lib/db-ops/_shared/safe-parse-json.js +18 -0
  69. package/lib/db-ops/_shared/types.d.ts +94 -0
  70. package/lib/db-ops/_shared/types.js +1 -0
  71. package/lib/db-ops/_shared/upsert-blob-ref.d.ts +25 -0
  72. package/lib/db-ops/_shared/upsert-blob-ref.js +48 -0
  73. package/lib/db-ops/_shared/upsert-content-type-ref.d.ts +30 -0
  74. package/lib/db-ops/_shared/upsert-content-type-ref.js +45 -0
  75. package/lib/db-ops/_shared/upsert-json-ref.d.ts +22 -0
  76. package/lib/db-ops/_shared/upsert-json-ref.js +41 -0
  77. package/lib/db-ops/_shared/upsert-response-headers.d.ts +35 -0
  78. package/lib/db-ops/_shared/upsert-response-headers.js +49 -0
  79. package/lib/db-ops/_shared/upsert-url-ref.d.ts +39 -0
  80. package/lib/db-ops/_shared/upsert-url-ref.js +62 -0
  81. package/lib/db-ops/anchors/get-anchors-on-page.d.ts +10 -0
  82. package/lib/db-ops/anchors/get-anchors-on-page.js +21 -0
  83. package/lib/db-ops/config/get-base-url.d.ts +8 -0
  84. package/lib/db-ops/config/get-base-url.js +14 -0
  85. package/lib/db-ops/config/get-config.d.ts +10 -0
  86. package/lib/db-ops/config/get-config.js +29 -0
  87. package/lib/db-ops/config/get-created-cwd.d.ts +11 -0
  88. package/lib/db-ops/config/get-created-cwd.js +13 -0
  89. package/lib/db-ops/config/get-name.d.ts +8 -0
  90. package/lib/db-ops/config/get-name.js +14 -0
  91. package/lib/db-ops/config/info-column-allowlist.d.ts +7 -0
  92. package/lib/db-ops/config/info-column-allowlist.js +29 -0
  93. package/lib/db-ops/config/info-json-columns.d.ts +5 -0
  94. package/lib/db-ops/config/info-json-columns.js +11 -0
  95. package/lib/db-ops/config/set-config.d.ts +12 -0
  96. package/lib/db-ops/config/set-config.js +21 -0
  97. package/lib/db-ops/config/update-config.d.ts +17 -0
  98. package/lib/db-ops/config/update-config.js +36 -0
  99. package/lib/db-ops/console-logs/compute-console-log-hash.d.ts +19 -0
  100. package/lib/db-ops/console-logs/compute-console-log-hash.js +30 -0
  101. package/lib/db-ops/console-logs/replace-console-logs.d.ts +34 -0
  102. package/lib/db-ops/console-logs/replace-console-logs.js +123 -0
  103. package/lib/db-ops/console-logs/stringify-console-log-args.d.ts +16 -0
  104. package/lib/db-ops/console-logs/stringify-console-log-args.js +26 -0
  105. package/lib/db-ops/console-logs/types.d.ts +38 -0
  106. package/lib/db-ops/console-logs/types.js +1 -0
  107. package/lib/db-ops/console-logs/upsert-console-log-item.d.ts +29 -0
  108. package/lib/db-ops/console-logs/upsert-console-log-item.js +52 -0
  109. package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.d.ts +18 -0
  110. package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.js +23 -0
  111. package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.d.ts +12 -0
  112. package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.js +15 -0
  113. package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.d.ts +14 -0
  114. package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.js +30 -0
  115. package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.d.ts +57 -0
  116. package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.js +87 -0
  117. package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.d.ts +21 -0
  118. package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.js +27 -0
  119. package/lib/db-ops/errors/insert-crawl-error.d.ts +15 -0
  120. package/lib/db-ops/errors/insert-crawl-error.js +21 -0
  121. package/lib/db-ops/errors/insert-page-error.d.ts +21 -0
  122. package/lib/db-ops/errors/insert-page-error.js +30 -0
  123. package/lib/db-ops/errors/list-dns-burned-host-candidates.d.ts +33 -0
  124. package/lib/db-ops/errors/list-dns-burned-host-candidates.js +158 -0
  125. package/lib/db-ops/html/read-page-html-blob.d.ts +17 -0
  126. package/lib/db-ops/html/read-page-html-blob.js +20 -0
  127. package/lib/db-ops/lifecycle/checkpoint.d.ts +8 -0
  128. package/lib/db-ops/lifecycle/checkpoint.js +9 -0
  129. package/lib/db-ops/lifecycle/destroy.d.ts +6 -0
  130. package/lib/db-ops/lifecycle/destroy.js +7 -0
  131. package/lib/db-ops/lifecycle/init.d.ts +58 -0
  132. package/lib/db-ops/lifecycle/init.js +122 -0
  133. package/lib/db-ops/list-reconcile/record-list-reconcile-run.d.ts +22 -0
  134. package/lib/db-ops/list-reconcile/record-list-reconcile-run.js +41 -0
  135. package/lib/db-ops/meta/get-audios-of-page.d.ts +11 -0
  136. package/lib/db-ops/meta/get-audios-of-page.js +15 -0
  137. package/lib/db-ops/meta/get-buttons-of-page.d.ts +11 -0
  138. package/lib/db-ops/meta/get-buttons-of-page.js +15 -0
  139. package/lib/db-ops/meta/get-canvases-of-page.d.ts +11 -0
  140. package/lib/db-ops/meta/get-canvases-of-page.js +15 -0
  141. package/lib/db-ops/meta/get-custom-elements-of-page.d.ts +11 -0
  142. package/lib/db-ops/meta/get-custom-elements-of-page.js +15 -0
  143. package/lib/db-ops/meta/get-headings-of-page.d.ts +11 -0
  144. package/lib/db-ops/meta/get-headings-of-page.js +15 -0
  145. package/lib/db-ops/meta/get-iframes-of-page.d.ts +11 -0
  146. package/lib/db-ops/meta/get-iframes-of-page.js +15 -0
  147. package/lib/db-ops/meta/get-jsonld-of-page.d.ts +13 -0
  148. package/lib/db-ops/meta/get-jsonld-of-page.js +27 -0
  149. package/lib/db-ops/meta/get-main-content-images-of-page.d.ts +11 -0
  150. package/lib/db-ops/meta/get-main-content-images-of-page.js +15 -0
  151. package/lib/db-ops/meta/get-main-content-tables-of-page.d.ts +11 -0
  152. package/lib/db-ops/meta/get-main-content-tables-of-page.js +15 -0
  153. package/lib/db-ops/meta/get-page-technologies-of-page.d.ts +11 -0
  154. package/lib/db-ops/meta/get-page-technologies-of-page.js +15 -0
  155. package/lib/db-ops/meta/get-technology-signals-of-page.d.ts +11 -0
  156. package/lib/db-ops/meta/get-technology-signals-of-page.js +15 -0
  157. package/lib/db-ops/meta/get-videos-of-page.d.ts +11 -0
  158. package/lib/db-ops/meta/get-videos-of-page.js +15 -0
  159. package/lib/db-ops/outages/close-network-outage.d.ts +12 -0
  160. package/lib/db-ops/outages/close-network-outage.js +15 -0
  161. package/lib/db-ops/outages/close-stale-open-network-outages.d.ts +26 -0
  162. package/lib/db-ops/outages/close-stale-open-network-outages.js +42 -0
  163. package/lib/db-ops/outages/compute-outage-clamp-timestamp.d.ts +26 -0
  164. package/lib/db-ops/outages/compute-outage-clamp-timestamp.js +31 -0
  165. package/lib/db-ops/outages/insert-network-outage.d.ts +14 -0
  166. package/lib/db-ops/outages/insert-network-outage.js +29 -0
  167. package/lib/db-ops/outages/list-network-outages.d.ts +28 -0
  168. package/lib/db-ops/outages/list-network-outages.js +42 -0
  169. package/lib/db-ops/pages/order/set-url-order.d.ts +13 -0
  170. package/lib/db-ops/pages/order/set-url-order.js +38 -0
  171. package/lib/db-ops/pages/read/build-page-query.d.ts +18 -0
  172. package/lib/db-ops/pages/read/build-page-query.js +40 -0
  173. package/lib/db-ops/pages/read/get-crawling-state.d.ts +117 -0
  174. package/lib/db-ops/pages/read/get-crawling-state.js +161 -0
  175. package/lib/db-ops/pages/read/get-existing-page-urls.d.ts +15 -0
  176. package/lib/db-ops/pages/read/get-existing-page-urls.js +30 -0
  177. package/lib/db-ops/pages/read/get-page-count.d.ts +12 -0
  178. package/lib/db-ops/pages/read/get-page-count.js +21 -0
  179. package/lib/db-ops/pages/read/get-page-source-by-url.d.ts +24 -0
  180. package/lib/db-ops/pages/read/get-page-source-by-url.js +28 -0
  181. package/lib/db-ops/pages/read/get-pages-with-rels.d.ts +38 -0
  182. package/lib/db-ops/pages/read/get-pages-with-rels.js +107 -0
  183. package/lib/db-ops/pages/read/get-pages.d.ts +11 -0
  184. package/lib/db-ops/pages/read/get-pages.js +51 -0
  185. package/lib/db-ops/pages/read/get-scraped-html-page-count.d.ts +18 -0
  186. package/lib/db-ops/pages/read/get-scraped-html-page-count.js +25 -0
  187. package/lib/db-ops/pages/read/reconstruct-page-rows.d.ts +31 -0
  188. package/lib/db-ops/pages/read/reconstruct-page-rows.js +32 -0
  189. package/lib/db-ops/pages/reset/clear-page-derived-rows.d.ts +20 -0
  190. package/lib/db-ops/pages/reset/clear-page-derived-rows.js +37 -0
  191. package/lib/db-ops/pages/reset/repromote-external-pages.d.ts +30 -0
  192. package/lib/db-ops/pages/reset/repromote-external-pages.js +91 -0
  193. package/lib/db-ops/pages/reset/reset-failed-pages.d.ts +88 -0
  194. package/lib/db-ops/pages/reset/reset-failed-pages.js +216 -0
  195. package/lib/db-ops/pages/reset/reset-pages-by-urls.d.ts +80 -0
  196. package/lib/db-ops/pages/reset/reset-pages-by-urls.js +151 -0
  197. package/lib/db-ops/pages/reset/retryable-image-scan-codes.d.ts +24 -0
  198. package/lib/db-ops/pages/reset/retryable-image-scan-codes.js +24 -0
  199. package/lib/db-ops/pages/write/insert-audios.d.ts +14 -0
  200. package/lib/db-ops/pages/write/insert-audios.js +25 -0
  201. package/lib/db-ops/pages/write/insert-buttons.d.ts +14 -0
  202. package/lib/db-ops/pages/write/insert-buttons.js +29 -0
  203. package/lib/db-ops/pages/write/insert-canvases.d.ts +14 -0
  204. package/lib/db-ops/pages/write/insert-canvases.js +26 -0
  205. package/lib/db-ops/pages/write/insert-custom-elements.d.ts +27 -0
  206. package/lib/db-ops/pages/write/insert-custom-elements.js +40 -0
  207. package/lib/db-ops/pages/write/insert-headings.d.ts +15 -0
  208. package/lib/db-ops/pages/write/insert-headings.js +27 -0
  209. package/lib/db-ops/pages/write/insert-iframes.d.ts +14 -0
  210. package/lib/db-ops/pages/write/insert-iframes.js +28 -0
  211. package/lib/db-ops/pages/write/insert-inventory-content-items.d.ts +38 -0
  212. package/lib/db-ops/pages/write/insert-inventory-content-items.js +60 -0
  213. package/lib/db-ops/pages/write/insert-inventory-seeds.d.ts +36 -0
  214. package/lib/db-ops/pages/write/insert-inventory-seeds.js +48 -0
  215. package/lib/db-ops/pages/write/insert-inventory-skipped-pages.d.ts +42 -0
  216. package/lib/db-ops/pages/write/insert-inventory-skipped-pages.js +56 -0
  217. package/lib/db-ops/pages/write/insert-jsonld.d.ts +17 -0
  218. package/lib/db-ops/pages/write/insert-jsonld.js +49 -0
  219. package/lib/db-ops/pages/write/insert-main-content-images.d.ts +20 -0
  220. package/lib/db-ops/pages/write/insert-main-content-images.js +32 -0
  221. package/lib/db-ops/pages/write/insert-main-content-tables.d.ts +14 -0
  222. package/lib/db-ops/pages/write/insert-main-content-tables.js +29 -0
  223. package/lib/db-ops/pages/write/insert-page.d.ts +56 -0
  224. package/lib/db-ops/pages/write/insert-page.js +259 -0
  225. package/lib/db-ops/pages/write/insert-technologies.d.ts +25 -0
  226. package/lib/db-ops/pages/write/insert-technologies.js +45 -0
  227. package/lib/db-ops/pages/write/insert-videos.d.ts +14 -0
  228. package/lib/db-ops/pages/write/insert-videos.js +28 -0
  229. package/lib/db-ops/pages/write/link-redirect-sources.d.ts +42 -0
  230. package/lib/db-ops/pages/write/link-redirect-sources.js +101 -0
  231. package/lib/db-ops/pages/write/record-redirect.d.ts +35 -0
  232. package/lib/db-ops/pages/write/record-redirect.js +100 -0
  233. package/lib/db-ops/pages/write/set-skipped-page.d.ts +13 -0
  234. package/lib/db-ops/pages/write/set-skipped-page.js +24 -0
  235. package/lib/db-ops/pages/write/update-page.d.ts +40 -0
  236. package/lib/db-ops/pages/write/update-page.js +419 -0
  237. package/lib/db-ops/pages/write/write-page-html-blob.d.ts +19 -0
  238. package/lib/db-ops/pages/write/write-page-html-blob.js +41 -0
  239. package/lib/db-ops/referrers/get-redirects-for-pages.d.ts +9 -0
  240. package/lib/db-ops/referrers/get-redirects-for-pages.js +15 -0
  241. package/lib/db-ops/referrers/get-referrers-of-page.d.ts +17 -0
  242. package/lib/db-ops/referrers/get-referrers-of-page.js +32 -0
  243. package/lib/db-ops/referrers/get-referrers-of-resource.d.ts +8 -0
  244. package/lib/db-ops/referrers/get-referrers-of-resource.js +15 -0
  245. package/lib/db-ops/resources/build-resource-query.d.ts +25 -0
  246. package/lib/db-ops/resources/build-resource-query.js +29 -0
  247. package/lib/db-ops/resources/get-existing-resource-urls.d.ts +9 -0
  248. package/lib/db-ops/resources/get-existing-resource-urls.js +24 -0
  249. package/lib/db-ops/resources/get-resource-by-url.d.ts +13 -0
  250. package/lib/db-ops/resources/get-resource-by-url.js +22 -0
  251. package/lib/db-ops/resources/get-resource-url-list.d.ts +17 -0
  252. package/lib/db-ops/resources/get-resource-url-list.js +26 -0
  253. package/lib/db-ops/resources/get-resources.d.ts +8 -0
  254. package/lib/db-ops/resources/get-resources.js +11 -0
  255. package/lib/db-ops/resources/insert-inventory-resources.d.ts +24 -0
  256. package/lib/db-ops/resources/insert-inventory-resources.js +64 -0
  257. package/lib/db-ops/resources/insert-resource-referrers.d.ts +15 -0
  258. package/lib/db-ops/resources/insert-resource-referrers.js +54 -0
  259. package/lib/db-ops/resources/insert-resource.d.ts +34 -0
  260. package/lib/db-ops/resources/insert-resource.js +73 -0
  261. package/lib/db-ops/resources/reconstruct-resource-rows.d.ts +26 -0
  262. package/lib/db-ops/resources/reconstruct-resource-rows.js +30 -0
  263. package/lib/db-ops/templates/assign-template-labels.d.ts +60 -0
  264. package/lib/db-ops/templates/assign-template-labels.js +187 -0
  265. package/lib/db-ops/templates/replace-page-templates.d.ts +44 -0
  266. package/lib/db-ops/templates/replace-page-templates.js +174 -0
  267. package/lib/db-ops/templates/serialize-template-cluster-reason.d.ts +16 -0
  268. package/lib/db-ops/templates/serialize-template-cluster-reason.js +17 -0
  269. package/lib/db-ops/templates/types.d.ts +103 -0
  270. package/lib/db-ops/templates/types.js +1 -0
  271. package/lib/debug.d.ts +8 -0
  272. package/lib/debug.js +9 -0
  273. package/lib/decode-html-blob.d.ts +20 -0
  274. package/lib/decode-html-blob.js +23 -0
  275. package/lib/decode-page-html-blob-bytes.d.ts +25 -0
  276. package/lib/decode-page-html-blob-bytes.js +29 -0
  277. package/lib/decode-stored-blob-bytes.d.ts +25 -0
  278. package/lib/decode-stored-blob-bytes.js +47 -0
  279. package/lib/derive-lineage-from-parent.d.ts +37 -0
  280. package/lib/derive-lineage-from-parent.js +42 -0
  281. package/lib/drop-legacy-tables.d.ts +45 -0
  282. package/lib/drop-legacy-tables.js +56 -0
  283. package/lib/error-kind/classify-error-kind.d.ts +20 -0
  284. package/lib/error-kind/classify-error-kind.js +136 -0
  285. package/lib/error-kind/network-related-error-kinds.d.ts +23 -0
  286. package/lib/error-kind/network-related-error-kinds.js +28 -0
  287. package/lib/error-kind/permanent-error-kinds.d.ts +48 -0
  288. package/lib/error-kind/permanent-error-kinds.js +54 -0
  289. package/lib/error-kind/types.d.ts +54 -0
  290. package/lib/error-kind/types.js +1 -0
  291. package/lib/filesystem/append-text.d.ts +9 -0
  292. package/lib/filesystem/append-text.js +14 -0
  293. package/lib/filesystem/copy-dir-sync.d.ts +6 -0
  294. package/lib/filesystem/copy-dir-sync.js +9 -0
  295. package/lib/filesystem/copy-dir.d.ts +7 -0
  296. package/lib/filesystem/copy-dir.js +13 -0
  297. package/lib/filesystem/copy-file-with-progress.d.ts +20 -0
  298. package/lib/filesystem/copy-file-with-progress.js +34 -0
  299. package/lib/filesystem/exists.d.ts +6 -0
  300. package/lib/filesystem/exists.js +9 -0
  301. package/lib/filesystem/get-file-list.d.ts +8 -0
  302. package/lib/filesystem/get-file-list.js +12 -0
  303. package/lib/filesystem/is-dir.d.ts +6 -0
  304. package/lib/filesystem/is-dir.js +10 -0
  305. package/lib/filesystem/mkdir.d.ts +8 -0
  306. package/lib/filesystem/mkdir.js +15 -0
  307. package/lib/filesystem/output-binary.d.ts +12 -0
  308. package/lib/filesystem/output-binary.js +17 -0
  309. package/lib/filesystem/output-json.d.ts +9 -0
  310. package/lib/filesystem/output-json.js +14 -0
  311. package/lib/filesystem/output-text.d.ts +11 -0
  312. package/lib/filesystem/output-text.js +32 -0
  313. package/lib/filesystem/parse-pax-path.d.ts +18 -0
  314. package/lib/filesystem/parse-pax-path.js +47 -0
  315. package/lib/filesystem/parse-tar-size-field.d.ts +13 -0
  316. package/lib/filesystem/parse-tar-size-field.js +40 -0
  317. package/lib/filesystem/peek-tar-top-dir.d.ts +35 -0
  318. package/lib/filesystem/peek-tar-top-dir.js +215 -0
  319. package/lib/filesystem/read-json.d.ts +7 -0
  320. package/lib/filesystem/read-json.js +11 -0
  321. package/lib/filesystem/read-text.d.ts +6 -0
  322. package/lib/filesystem/read-text.js +10 -0
  323. package/lib/filesystem/readline.d.ts +11 -0
  324. package/lib/filesystem/readline.js +26 -0
  325. package/lib/filesystem/remove.d.ts +5 -0
  326. package/lib/filesystem/remove.js +10 -0
  327. package/lib/filesystem/rename.d.ts +16 -0
  328. package/lib/filesystem/rename.js +48 -0
  329. package/lib/filesystem/tar.d.ts +23 -0
  330. package/lib/filesystem/tar.js +78 -0
  331. package/lib/filesystem/untar.d.ts +33 -0
  332. package/lib/filesystem/untar.js +84 -0
  333. package/lib/get-failed-page-messages.d.ts +56 -0
  334. package/lib/get-failed-page-messages.js +146 -0
  335. package/lib/get-json.d.ts +10 -0
  336. package/lib/get-json.js +25 -0
  337. package/lib/html-snapshot/match-selector-html.d.ts +25 -0
  338. package/lib/html-snapshot/match-selector-html.js +28 -0
  339. package/lib/html-snapshot/match-selector-snapshots.d.ts +33 -0
  340. package/lib/html-snapshot/match-selector-snapshots.js +33 -0
  341. package/lib/html-snapshot/search-html-document.d.ts +29 -0
  342. package/lib/html-snapshot/search-html-document.js +27 -0
  343. package/lib/html-snapshot/search-html-snapshots.d.ts +36 -0
  344. package/lib/html-snapshot/search-html-snapshots.js +35 -0
  345. package/lib/html-snapshot/types.d.ts +111 -0
  346. package/lib/html-snapshot/types.js +7 -0
  347. package/lib/html-snapshot/validate-search-pattern.d.ts +15 -0
  348. package/lib/html-snapshot/validate-search-pattern.js +17 -0
  349. package/lib/init-schema.d.ts +48 -0
  350. package/lib/init-schema.js +124 -0
  351. package/lib/is-inventory-source.d.ts +21 -0
  352. package/lib/is-inventory-source.js +22 -0
  353. package/lib/is-within-outage-window.d.ts +49 -0
  354. package/lib/is-within-outage-window.js +33 -0
  355. package/lib/isolated-cluster/create-isolated-cluster-run.d.ts +24 -0
  356. package/lib/isolated-cluster/create-isolated-cluster-run.js +26 -0
  357. package/lib/libsql-dialect.d.ts +115 -0
  358. package/lib/libsql-dialect.js +116 -0
  359. package/lib/limited-page-ids.d.ts +9 -0
  360. package/lib/limited-page-ids.js +18 -0
  361. package/lib/meta/assert-compatible-version.d.ts +60 -0
  362. package/lib/meta/assert-compatible-version.js +93 -0
  363. package/lib/meta/classify-jsonld-type.d.ts +23 -0
  364. package/lib/meta/classify-jsonld-type.js +43 -0
  365. package/lib/meta/compare-semver.d.ts +23 -0
  366. package/lib/meta/compare-semver.js +51 -0
  367. package/lib/meta/compute-main-contents-denormalized.d.ts +41 -0
  368. package/lib/meta/compute-main-contents-denormalized.js +88 -0
  369. package/lib/meta/compute-page-denormalized.d.ts +20 -0
  370. package/lib/meta/compute-page-denormalized.js +35 -0
  371. package/lib/meta/derive-flat-from-meta.d.ts +34 -0
  372. package/lib/meta/derive-flat-from-meta.js +158 -0
  373. package/lib/meta/derive-meta-extras.d.ts +20 -0
  374. package/lib/meta/derive-meta-extras.js +23 -0
  375. package/lib/meta/extract-tags-for-archive.d.ts +17 -0
  376. package/lib/meta/extract-tags-for-archive.js +36 -0
  377. package/lib/meta/parse-main-content-class-list.d.ts +19 -0
  378. package/lib/meta/parse-main-content-class-list.js +34 -0
  379. package/lib/meta/summarize-jsonld.d.ts +17 -0
  380. package/lib/meta/summarize-jsonld.js +29 -0
  381. package/lib/meta/technologies/combine-technology-confidence.d.ts +46 -0
  382. package/lib/meta/technologies/combine-technology-confidence.js +93 -0
  383. package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.d.ts +45 -0
  384. package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.js +53 -0
  385. package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.d.ts +33 -0
  386. package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.js +46 -0
  387. package/lib/meta/technologies/extract-technologies-for-archive.d.ts +33 -0
  388. package/lib/meta/technologies/extract-technologies-for-archive.js +30 -0
  389. package/lib/meta/technologies/match-js-license-comment-signal.d.ts +21 -0
  390. package/lib/meta/technologies/match-js-license-comment-signal.js +23 -0
  391. package/lib/meta/technologies/match-structural-technology-signals.d.ts +26 -0
  392. package/lib/meta/technologies/match-structural-technology-signals.js +48 -0
  393. package/lib/meta/technologies/normalize-wappalyzer-entries.d.ts +25 -0
  394. package/lib/meta/technologies/normalize-wappalyzer-entries.js +35 -0
  395. package/lib/meta/technologies/technology-signal-definitions.d.ts +44 -0
  396. package/lib/meta/technologies/technology-signal-definitions.js +60 -0
  397. package/lib/meta/technologies/types.d.ts +70 -0
  398. package/lib/meta/technologies/types.js +13 -0
  399. package/lib/meta/types.d.ts +1490 -0
  400. package/lib/meta/types.js +65 -0
  401. package/lib/migrate-content-items-alias-of-id.d.ts +52 -0
  402. package/lib/migrate-content-items-alias-of-id.js +69 -0
  403. package/lib/migrate-content-items-dedupe-cap-event-id.d.ts +46 -0
  404. package/lib/migrate-content-items-dedupe-cap-event-id.js +62 -0
  405. package/lib/migrate-content-items-is-metadata-only.d.ts +44 -0
  406. package/lib/migrate-content-items-is-metadata-only.js +60 -0
  407. package/lib/migrate-entity-tables.d.ts +55 -0
  408. package/lib/migrate-entity-tables.js +66 -0
  409. package/lib/migrate-info-created-cwd.d.ts +17 -0
  410. package/lib/migrate-info-created-cwd.js +36 -0
  411. package/lib/migrate-info-main-content-selector.d.ts +16 -0
  412. package/lib/migrate-info-main-content-selector.js +35 -0
  413. package/lib/migrate-info-request-header-names.d.ts +16 -0
  414. package/lib/migrate-info-request-header-names.js +35 -0
  415. package/lib/migrate-info-roots.d.ts +20 -0
  416. package/lib/migrate-info-roots.js +52 -0
  417. package/lib/migrate-inventory-runs-to-list-reconcile-runs.d.ts +34 -0
  418. package/lib/migrate-inventory-runs-to-list-reconcile-runs.js +51 -0
  419. package/lib/migrate-list-reconcile-runs-exclude-skipped.d.ts +25 -0
  420. package/lib/migrate-list-reconcile-runs-exclude-skipped.js +44 -0
  421. package/lib/migrate-list-reconcile-runs-invalid-skipped.d.ts +16 -0
  422. package/lib/migrate-list-reconcile-runs-invalid-skipped.js +35 -0
  423. package/lib/migrate-main-contents-columns.d.ts +26 -0
  424. package/lib/migrate-main-contents-columns.js +61 -0
  425. package/lib/migrate-page-meta-body-hash.d.ts +44 -0
  426. package/lib/migrate-page-meta-body-hash.js +63 -0
  427. package/lib/migrate-page-meta-console-error-count.d.ts +27 -0
  428. package/lib/migrate-page-meta-console-error-count.js +45 -0
  429. package/lib/migrate-page-meta-custom-element-count.d.ts +33 -0
  430. package/lib/migrate-page-meta-custom-element-count.js +51 -0
  431. package/lib/migrate-page-meta-image-scan.d.ts +27 -0
  432. package/lib/migrate-page-meta-image-scan.js +52 -0
  433. package/lib/migrate-page-tags-to-page-technologies.d.ts +39 -0
  434. package/lib/migrate-page-tags-to-page-technologies.js +79 -0
  435. package/lib/migrate-ref-tables.d.ts +25 -0
  436. package/lib/migrate-ref-tables.js +38 -0
  437. package/lib/native-executor/check-native-executor-config.d.ts +17 -0
  438. package/lib/native-executor/check-native-executor-config.js +20 -0
  439. package/lib/page-meta-column-maps.d.ts +32 -0
  440. package/lib/page-meta-column-maps.js +43 -0
  441. package/lib/page.d.ts +546 -0
  442. package/lib/page.js +764 -0
  443. package/lib/peek-archive-lock.d.ts +40 -0
  444. package/lib/peek-archive-lock.js +62 -0
  445. package/lib/populate-entity-tables/collapse-anchor-rows.d.ts +41 -0
  446. package/lib/populate-entity-tables/collapse-anchor-rows.js +87 -0
  447. package/lib/populate-entity-tables/derive-dom-path.d.ts +35 -0
  448. package/lib/populate-entity-tables/derive-dom-path.js +72 -0
  449. package/lib/populate-entity-tables/is-blob-ref-value.d.ts +16 -0
  450. package/lib/populate-entity-tables/is-blob-ref-value.js +19 -0
  451. package/lib/populate-entity-tables/match-images-to-dom-paths.d.ts +66 -0
  452. package/lib/populate-entity-tables/match-images-to-dom-paths.js +96 -0
  453. package/lib/populate-entity-tables/populate-anchor-edges.d.ts +33 -0
  454. package/lib/populate-entity-tables/populate-anchor-edges.js +153 -0
  455. package/lib/populate-entity-tables/populate-content-items.d.ts +40 -0
  456. package/lib/populate-entity-tables/populate-content-items.js +141 -0
  457. package/lib/populate-entity-tables/populate-entities.d.ts +81 -0
  458. package/lib/populate-entity-tables/populate-entities.js +110 -0
  459. package/lib/populate-entity-tables/populate-image-items.d.ts +91 -0
  460. package/lib/populate-entity-tables/populate-image-items.js +226 -0
  461. package/lib/populate-entity-tables/populate-page-meta.d.ts +33 -0
  462. package/lib/populate-entity-tables/populate-page-meta.js +267 -0
  463. package/lib/populate-entity-tables/populate-resource-items.d.ts +22 -0
  464. package/lib/populate-entity-tables/populate-resource-items.js +114 -0
  465. package/lib/populate-entity-tables/populate-resource-ref-edges.d.ts +31 -0
  466. package/lib/populate-entity-tables/populate-resource-ref-edges.js +33 -0
  467. package/lib/populate-entity-tables/resolve-blob-refs.d.ts +31 -0
  468. package/lib/populate-entity-tables/resolve-blob-refs.js +100 -0
  469. package/lib/populate-entity-tables/resolve-content-type-refs.d.ts +22 -0
  470. package/lib/populate-entity-tables/resolve-content-type-refs.js +27 -0
  471. package/lib/populate-entity-tables/resolve-header-sets.d.ts +49 -0
  472. package/lib/populate-entity-tables/resolve-header-sets.js +122 -0
  473. package/lib/populate-entity-tables/resolve-json-refs.d.ts +25 -0
  474. package/lib/populate-entity-tables/resolve-json-refs.js +67 -0
  475. package/lib/populate-entity-tables/resolve-text-refs.d.ts +30 -0
  476. package/lib/populate-entity-tables/resolve-text-refs.js +61 -0
  477. package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.d.ts +21 -0
  478. package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.js +27 -0
  479. package/lib/populate-entity-tables/resolve-url-refs.d.ts +33 -0
  480. package/lib/populate-entity-tables/resolve-url-refs.js +60 -0
  481. package/lib/populate-entity-tables/test-utils/count-rows.d.ts +17 -0
  482. package/lib/populate-entity-tables/test-utils/count-rows.js +20 -0
  483. package/lib/populate-entity-tables/test-utils/seed-content-items.d.ts +25 -0
  484. package/lib/populate-entity-tables/test-utils/seed-content-items.js +42 -0
  485. package/lib/populate-entity-tables/test-utils/setup-entities-db.d.ts +30 -0
  486. package/lib/populate-entity-tables/test-utils/setup-entities-db.js +175 -0
  487. package/lib/populate-entity-tables/types.d.ts +157 -0
  488. package/lib/populate-entity-tables/types.js +12 -0
  489. package/lib/populate-entity-tables/upsert-text-refs.d.ts +38 -0
  490. package/lib/populate-entity-tables/upsert-text-refs.js +78 -0
  491. package/lib/populate-ref-tables/classify-content-type.d.ts +16 -0
  492. package/lib/populate-ref-tables/classify-content-type.js +52 -0
  493. package/lib/populate-ref-tables/compute-content-hash.d.ts +22 -0
  494. package/lib/populate-ref-tables/compute-content-hash.js +26 -0
  495. package/lib/populate-ref-tables/compute-header-flags.d.ts +16 -0
  496. package/lib/populate-ref-tables/compute-header-flags.js +70 -0
  497. package/lib/populate-ref-tables/content-type-rules.d.ts +38 -0
  498. package/lib/populate-ref-tables/content-type-rules.js +133 -0
  499. package/lib/populate-ref-tables/create-header-table-caches.d.ts +25 -0
  500. package/lib/populate-ref-tables/create-header-table-caches.js +49 -0
  501. package/lib/populate-ref-tables/data-uri-url-refs-limit.d.ts +15 -0
  502. package/lib/populate-ref-tables/data-uri-url-refs-limit.js +15 -0
  503. package/lib/populate-ref-tables/decode-data-uri.d.ts +21 -0
  504. package/lib/populate-ref-tables/decode-data-uri.js +126 -0
  505. package/lib/populate-ref-tables/decompose-header-set.d.ts +29 -0
  506. package/lib/populate-ref-tables/decompose-header-set.js +157 -0
  507. package/lib/populate-ref-tables/decompose-url.d.ts +25 -0
  508. package/lib/populate-ref-tables/decompose-url.js +70 -0
  509. package/lib/populate-ref-tables/header-stability.d.ts +19 -0
  510. package/lib/populate-ref-tables/header-stability.js +22 -0
  511. package/lib/populate-ref-tables/header-value-cache-key.d.ts +17 -0
  512. package/lib/populate-ref-tables/header-value-cache-key.js +19 -0
  513. package/lib/populate-ref-tables/normalize-mime.d.ts +24 -0
  514. package/lib/populate-ref-tables/normalize-mime.js +36 -0
  515. package/lib/populate-ref-tables/populate-blob-refs.d.ts +38 -0
  516. package/lib/populate-ref-tables/populate-blob-refs.js +134 -0
  517. package/lib/populate-ref-tables/populate-content-type-refs.d.ts +27 -0
  518. package/lib/populate-ref-tables/populate-content-type-refs.js +70 -0
  519. package/lib/populate-ref-tables/populate-header-tables.d.ts +35 -0
  520. package/lib/populate-ref-tables/populate-header-tables.js +80 -0
  521. package/lib/populate-ref-tables/populate-json-refs.d.ts +29 -0
  522. package/lib/populate-ref-tables/populate-json-refs.js +101 -0
  523. package/lib/populate-ref-tables/populate-refs.d.ts +51 -0
  524. package/lib/populate-ref-tables/populate-refs.js +62 -0
  525. package/lib/populate-ref-tables/populate-text-refs.d.ts +32 -0
  526. package/lib/populate-ref-tables/populate-text-refs.js +133 -0
  527. package/lib/populate-ref-tables/populate-url-refs.d.ts +28 -0
  528. package/lib/populate-ref-tables/populate-url-refs.js +148 -0
  529. package/lib/populate-ref-tables/test-utils/count-rows.d.ts +15 -0
  530. package/lib/populate-ref-tables/test-utils/count-rows.js +17 -0
  531. package/lib/populate-ref-tables/types.d.ts +197 -0
  532. package/lib/populate-ref-tables/types.js +7 -0
  533. package/lib/populate-ref-tables/upsert-one-header-set.d.ts +34 -0
  534. package/lib/populate-ref-tables/upsert-one-header-set.js +208 -0
  535. package/lib/populate-ref-tables/volatile-header-names.d.ts +20 -0
  536. package/lib/populate-ref-tables/volatile-header-names.js +33 -0
  537. package/lib/redirect-table.d.ts +9 -0
  538. package/lib/redirect-table.js +28 -0
  539. package/lib/release-finished-statements.d.ts +42 -0
  540. package/lib/release-finished-statements.js +45 -0
  541. package/lib/resolve-redirect-chain.d.ts +33 -0
  542. package/lib/resolve-redirect-chain.js +27 -0
  543. package/lib/resource.d.ts +46 -0
  544. package/lib/resource.js +62 -0
  545. package/lib/retarget-legacy-fk-tables.d.ts +61 -0
  546. package/lib/retarget-legacy-fk-tables.js +137 -0
  547. package/lib/safe-path.d.ts +9 -0
  548. package/lib/safe-path.js +17 -0
  549. package/lib/scope/build-scope-map.d.ts +21 -0
  550. package/lib/scope/build-scope-map.js +32 -0
  551. package/lib/scope/find-scope-entry.d.ts +25 -0
  552. package/lib/scope/find-scope-entry.js +45 -0
  553. package/lib/template-classification/classify-archive-page-templates.d.ts +42 -0
  554. package/lib/template-classification/classify-archive-page-templates.js +70 -0
  555. package/lib/template-classification/classify-page-templates.d.ts +33 -0
  556. package/lib/template-classification/classify-page-templates.js +60 -0
  557. package/lib/template-classification/collect-page-ids-with-html.d.ts +24 -0
  558. package/lib/template-classification/collect-page-ids-with-html.js +30 -0
  559. package/lib/template-classification/collect-page-stylesheet-urls.d.ts +32 -0
  560. package/lib/template-classification/collect-page-stylesheet-urls.js +130 -0
  561. package/lib/template-classification/create-content-root-hint.d.ts +41 -0
  562. package/lib/template-classification/create-content-root-hint.js +51 -0
  563. package/lib/template-classification/create-page-cluster-factory.d.ts +36 -0
  564. package/lib/template-classification/create-page-cluster-factory.js +52 -0
  565. package/lib/template-classification/load-page-cluster-candidates.d.ts +32 -0
  566. package/lib/template-classification/load-page-cluster-candidates.js +93 -0
  567. package/lib/template-classification/page-cluster/resolve-page-cluster-keys.d.ts +34 -0
  568. package/lib/template-classification/page-cluster/resolve-page-cluster-keys.js +236 -0
  569. package/lib/template-classification/page-cluster/types.d.ts +123 -0
  570. package/lib/template-classification/page-cluster/types.js +1 -0
  571. package/lib/template-classification/types.d.ts +234 -0
  572. package/lib/template-classification/types.js +1 -0
  573. package/lib/test-utils/build-full-schema-test-db.d.ts +34 -0
  574. package/lib/test-utils/build-full-schema-test-db.js +74 -0
  575. package/lib/test-utils/create-legacy-analysis-tables.d.ts +13 -0
  576. package/lib/test-utils/create-legacy-analysis-tables.js +37 -0
  577. package/lib/test-utils/fk-parent-tables.d.ts +15 -0
  578. package/lib/test-utils/fk-parent-tables.js +19 -0
  579. package/lib/test-utils/seed-content-item.d.ts +35 -0
  580. package/lib/test-utils/seed-content-item.js +42 -0
  581. package/lib/test-utils/setup-legacy-fk-db.d.ts +34 -0
  582. package/lib/test-utils/setup-legacy-fk-db.js +271 -0
  583. package/lib/transfer/attach-source-database.d.ts +31 -0
  584. package/lib/transfer/attach-source-database.js +40 -0
  585. package/lib/transfer/build-split-config.d.ts +30 -0
  586. package/lib/transfer/build-split-config.js +42 -0
  587. package/lib/transfer/clear-replaced-page-rows.d.ts +23 -0
  588. package/lib/transfer/clear-replaced-page-rows.js +61 -0
  589. package/lib/transfer/concat-archives.d.ts +55 -0
  590. package/lib/transfer/concat-archives.js +95 -0
  591. package/lib/transfer/concat-source-transfer-phases.d.ts +10 -0
  592. package/lib/transfer/concat-source-transfer-phases.js +17 -0
  593. package/lib/transfer/content-item-rank-sql.d.ts +21 -0
  594. package/lib/transfer/content-item-rank-sql.js +23 -0
  595. package/lib/transfer/copy-anchor-edges.d.ts +28 -0
  596. package/lib/transfer/copy-anchor-edges.js +42 -0
  597. package/lib/transfer/copy-dictionaries-for-concat.d.ts +39 -0
  598. package/lib/transfer/copy-dictionaries-for-concat.js +81 -0
  599. package/lib/transfer/copy-dictionaries-for-split.d.ts +29 -0
  600. package/lib/transfer/copy-dictionaries-for-split.js +224 -0
  601. package/lib/transfer/copy-header-set-children.d.ts +27 -0
  602. package/lib/transfer/copy-header-set-children.js +51 -0
  603. package/lib/transfer/copy-image-items.d.ts +21 -0
  604. package/lib/transfer/copy-image-items.js +62 -0
  605. package/lib/transfer/copy-inventory-source-lists.d.ts +30 -0
  606. package/lib/transfer/copy-inventory-source-lists.js +61 -0
  607. package/lib/transfer/copy-journal-tables.d.ts +30 -0
  608. package/lib/transfer/copy-journal-tables.js +56 -0
  609. package/lib/transfer/copy-page-console-logs.d.ts +16 -0
  610. package/lib/transfer/copy-page-console-logs.js +27 -0
  611. package/lib/transfer/copy-page-html-blobs.d.ts +31 -0
  612. package/lib/transfer/copy-page-html-blobs.js +43 -0
  613. package/lib/transfer/copy-page-meta.d.ts +27 -0
  614. package/lib/transfer/copy-page-meta.js +68 -0
  615. package/lib/transfer/copy-page-template-clusters.d.ts +31 -0
  616. package/lib/transfer/copy-page-template-clusters.js +56 -0
  617. package/lib/transfer/copy-page-template-labels.d.ts +34 -0
  618. package/lib/transfer/copy-page-template-labels.js +88 -0
  619. package/lib/transfer/copy-resource-items.d.ts +29 -0
  620. package/lib/transfer/copy-resource-items.js +89 -0
  621. package/lib/transfer/copy-resource-ref-edges.d.ts +20 -0
  622. package/lib/transfer/copy-resource-ref-edges.js +33 -0
  623. package/lib/transfer/copy-simple-page-scoped-tables.d.ts +15 -0
  624. package/lib/transfer/copy-simple-page-scoped-tables.js +34 -0
  625. package/lib/transfer/count-external-pages-in-scope.d.ts +26 -0
  626. package/lib/transfer/count-external-pages-in-scope.js +40 -0
  627. package/lib/transfer/create-transfer-temp-tables.d.ts +30 -0
  628. package/lib/transfer/create-transfer-temp-tables.js +59 -0
  629. package/lib/transfer/dictionary-copy-specs.d.ts +32 -0
  630. package/lib/transfer/dictionary-copy-specs.js +28 -0
  631. package/lib/transfer/drop-transfer-temp-tables.d.ts +9 -0
  632. package/lib/transfer/drop-transfer-temp-tables.js +18 -0
  633. package/lib/transfer/flatten-redirect-chains.d.ts +44 -0
  634. package/lib/transfer/flatten-redirect-chains.js +74 -0
  635. package/lib/transfer/insert-content-items.d.ts +35 -0
  636. package/lib/transfer/insert-content-items.js +116 -0
  637. package/lib/transfer/list-transfer-columns.d.ts +35 -0
  638. package/lib/transfer/list-transfer-columns.js +45 -0
  639. package/lib/transfer/mark-in-scope-content-items.d.ts +31 -0
  640. package/lib/transfer/mark-in-scope-content-items.js +54 -0
  641. package/lib/transfer/merge-archive-configs.d.ts +51 -0
  642. package/lib/transfer/merge-archive-configs.js +85 -0
  643. package/lib/transfer/plan-content-items-for-concat.d.ts +33 -0
  644. package/lib/transfer/plan-content-items-for-concat.js +51 -0
  645. package/lib/transfer/plan-content-items-for-split.d.ts +42 -0
  646. package/lib/transfer/plan-content-items-for-split.js +83 -0
  647. package/lib/transfer/plan-resource-items.d.ts +40 -0
  648. package/lib/transfer/plan-resource-items.js +69 -0
  649. package/lib/transfer/quote-transfer-identifier.d.ts +18 -0
  650. package/lib/transfer/quote-transfer-identifier.js +20 -0
  651. package/lib/transfer/reclassify-resource-externality.d.ts +37 -0
  652. package/lib/transfer/reclassify-resource-externality.js +66 -0
  653. package/lib/transfer/remap-redirect-dest-ids.d.ts +34 -0
  654. package/lib/transfer/remap-redirect-dest-ids.js +51 -0
  655. package/lib/transfer/replace-content-items.d.ts +39 -0
  656. package/lib/transfer/replace-content-items.js +83 -0
  657. package/lib/transfer/simple-page-scoped-tables.d.ts +25 -0
  658. package/lib/transfer/simple-page-scoped-tables.js +38 -0
  659. package/lib/transfer/split-archive.d.ts +55 -0
  660. package/lib/transfer/split-archive.js +98 -0
  661. package/lib/transfer/split-source-transfer-phases.d.ts +11 -0
  662. package/lib/transfer/split-source-transfer-phases.js +18 -0
  663. package/lib/transfer/transfer-action.d.ts +34 -0
  664. package/lib/transfer/transfer-action.js +32 -0
  665. package/lib/transfer/transfer-archive-rows.d.ts +65 -0
  666. package/lib/transfer/transfer-archive-rows.js +156 -0
  667. package/lib/transfer/transfer-dictionary-tables.d.ts +12 -0
  668. package/lib/transfer/transfer-dictionary-tables.js +22 -0
  669. package/lib/transfer/transfer-post-phases.d.ts +10 -0
  670. package/lib/transfer/transfer-post-phases.js +13 -0
  671. package/lib/transfer/transfer-source-alias.d.ts +9 -0
  672. package/lib/transfer/transfer-source-alias.js +9 -0
  673. package/lib/transfer/types.d.ts +111 -0
  674. package/lib/transfer/types.js +35 -0
  675. package/lib/types.d.ts +772 -0
  676. package/lib/types.js +1 -0
  677. package/lib/url-alias/compute-tier-a-alias-key.d.ts +44 -0
  678. package/lib/url-alias/compute-tier-a-alias-key.js +47 -0
  679. package/lib/url-alias/compute-tier-b-alias-key.d.ts +23 -0
  680. package/lib/url-alias/compute-tier-b-alias-key.js +26 -0
  681. package/lib/url-alias/group-alias-candidates.d.ts +27 -0
  682. package/lib/url-alias/group-alias-candidates.js +29 -0
  683. package/lib/url-alias/types.d.ts +12 -0
  684. package/lib/url-alias/types.js +1 -0
  685. package/lib/url-pattern/compute-shape-key.d.ts +58 -0
  686. package/lib/url-pattern/compute-shape-key.js +129 -0
  687. package/lib/url-pattern/decompose-url.d.ts +33 -0
  688. package/lib/url-pattern/decompose-url.js +79 -0
  689. package/lib/url-pattern/reconstruct-url.d.ts +15 -0
  690. package/lib/url-pattern/reconstruct-url.js +33 -0
  691. package/lib/url-sort/compute-url-sort-ranks.d.ts +30 -0
  692. package/lib/url-sort/compute-url-sort-ranks.js +33 -0
  693. package/lib/utils/array/each-splitted.d.ts +10 -0
  694. package/lib/utils/array/each-splitted.js +14 -0
  695. package/lib/utils/debug.d.ts +8 -0
  696. package/lib/utils/debug.js +8 -0
  697. package/lib/utils/error/emit-error-with-retry.d.ts +40 -0
  698. package/lib/utils/error/emit-error-with-retry.js +44 -0
  699. package/lib/utils/error/emit-error.d.ts +39 -0
  700. package/lib/utils/error/emit-error.js +41 -0
  701. package/lib/utils/object/parse-response-headers.d.ts +12 -0
  702. package/lib/utils/object/parse-response-headers.js +26 -0
  703. package/lib/utils/object/redact-request-headers.d.ts +15 -0
  704. package/lib/utils/object/redact-request-headers.js +27 -0
  705. package/lib/utils/types/types.d.ts +383 -0
  706. package/lib/utils/types/types.js +1 -0
  707. package/lib/verify-migration/capture-rejection.d.ts +24 -0
  708. package/lib/verify-migration/capture-rejection.js +31 -0
  709. package/lib/verify-migration/check-anchor-edges-count.d.ts +34 -0
  710. package/lib/verify-migration/check-anchor-edges-count.js +72 -0
  711. package/lib/verify-migration/check-anchor-edges-sum.d.ts +13 -0
  712. package/lib/verify-migration/check-anchor-edges-sum.js +27 -0
  713. package/lib/verify-migration/check-content-items-count.d.ts +16 -0
  714. package/lib/verify-migration/check-content-items-count.js +30 -0
  715. package/lib/verify-migration/check-content-type-preservation.d.ts +22 -0
  716. package/lib/verify-migration/check-content-type-preservation.js +40 -0
  717. package/lib/verify-migration/check-foreign-key-integrity.d.ts +31 -0
  718. package/lib/verify-migration/check-foreign-key-integrity.js +47 -0
  719. package/lib/verify-migration/check-image-items-count.d.ts +12 -0
  720. package/lib/verify-migration/check-image-items-count.js +26 -0
  721. package/lib/verify-migration/check-page-meta-count.d.ts +15 -0
  722. package/lib/verify-migration/check-page-meta-count.js +31 -0
  723. package/lib/verify-migration/check-reader-parity.d.ts +23 -0
  724. package/lib/verify-migration/check-reader-parity.js +182 -0
  725. package/lib/verify-migration/check-resource-items-count.d.ts +17 -0
  726. package/lib/verify-migration/check-resource-items-count.js +33 -0
  727. package/lib/verify-migration/check-url-round-trip.d.ts +43 -0
  728. package/lib/verify-migration/check-url-round-trip.js +112 -0
  729. package/lib/verify-migration/types.d.ts +70 -0
  730. package/lib/verify-migration/types.js +63 -0
  731. package/lib/verify-migration/verify-migration.d.ts +41 -0
  732. package/lib/verify-migration/verify-migration.js +120 -0
  733. package/lib/with-bulk-write-pragmas.d.ts +51 -0
  734. package/lib/with-bulk-write-pragmas.js +132 -0
  735. package/lib/write-queue.d.ts +32 -0
  736. package/lib/write-queue.js +55 -0
  737. package/package.json +350 -3
@@ -0,0 +1,137 @@
1
+ import { createAdjunctTables } from './create-adjunct-tables.js';
2
+ import { convertLegacyPageTagsToInserts } from './meta/technologies/convert-legacy-page-tags-to-inserts.js';
3
+ import { eachSplitted } from './utils/array/each-splitted.js';
4
+ /**
5
+ * The adjunct tables whose FK declarations may still point at the legacy
6
+ * `pages(id)` on migrated archives. Only names are listed — the column
7
+ * set is derived at runtime from the canonical table recreated by
8
+ * {@link createAdjunctTables}, so a future column addition there cannot
9
+ * silently drift from a hardcoded list (a missing column in the staged
10
+ * copy fails the copy-back INSERT loudly instead of dropping data).
11
+ *
12
+ * `page_tags` is deliberately NOT here — it has no current-schema
13
+ * equivalent to retarget onto (removed in favor of `technology_signals` /
14
+ * `page_technologies`). {@link retargetLegacyFkTables} handles it as a
15
+ * special case: convert its rows, then drop it outright rather than
16
+ * recreating it. See that function's JSDoc.
17
+ *
18
+ * `analysis_violations` / `analysis_text_refs` are likewise not listed: the
19
+ * current schema has no equivalent, so {@link retargetLegacyFkTables} drops
20
+ * them (and their rows) instead of retargeting.
21
+ */
22
+ const RETARGET_TABLES = [
23
+ 'page_html_ref',
24
+ 'page_jsonld',
25
+ 'page_errors',
26
+ ];
27
+ /**
28
+ * Rewrites the FK declarations of the adjunct tables from the legacy
29
+ * `pages(id)` to `content_items(id)` by rebuilding each table, converts
30
+ * `page_tags` (if present) into `technology_signals` / `page_technologies`,
31
+ * AND drops the legacy `analysis_violations` / `analysis_text_refs` tables
32
+ * (analyze output that that no reader or writer uses).
33
+ * SQLite has no `ALTER TABLE … DROP CONSTRAINT`, so the only way to change
34
+ * an FK target is to recreate the table:
35
+ *
36
+ * 1. Stage each {@link RETARGET_TABLES} table's rows into a constraint-free
37
+ * `<table>__retarget` copy (`CREATE TABLE … AS SELECT *`) and drop the
38
+ * original, freeing its index names. `page_tags`, if present, is read
39
+ * into memory here too (converted via `convertLegacyPageTagsToInserts` —
40
+ * the same helper `migrate-page-tags-to-page-technologies.ts` uses for
41
+ * already-0.13+ archives) but NOT staged the same way: it has no
42
+ * current-schema table to retarget onto, so there is nothing to copy
43
+ * back — only something to drop, once its data lives in the tables
44
+ * from step 2.
45
+ * 2. Recreate every {@link RETARGET_TABLES} table through
46
+ * {@link createAdjunctTables} — the same DDL fresh archives get, so
47
+ * migrated archives end up identical in shape and index naming.
48
+ * Rebuilding the DDL inline here instead would recreate the exact
49
+ * drift this function repairs. This same call also creates
50
+ * `technology_signals` / `page_technologies` (idempotent
51
+ * `hasTable`-guarded DDL — a no-op if a prior partial run already
52
+ * created them).
53
+ * 3. Copy the staged {@link RETARGET_TABLES} rows back using the recreated
54
+ * table's own column list (read via `pragma_table_info`). A column the
55
+ * canonical DDL has but the input archive lacks aborts the INSERT with
56
+ * a clear error — never a silent data drop. The converted `page_tags`
57
+ * signals/technologies are inserted here too, then `page_tags` itself
58
+ * is dropped (not recreated).
59
+ *
60
+ * A rename-based recipe (`ALTER TABLE x RENAME TO x__retarget`, skip
61
+ * copy #1) is deliberately NOT used: SQLite keeps the renamed table's
62
+ * indexes attached under their original names, which collide with the
63
+ * index names {@link createAdjunctTables} declares — and the old index
64
+ * names vary by the era of the archive's original provisioning, so
65
+ * dropping them first would require enumerating unknown names. The
66
+ * copy-out is cheap at these tables' scale (a handful of rows per page).
67
+ *
68
+ * Adjunct tables that do not exist on the input archive are simply created
69
+ * empty by step 2.
70
+ *
71
+ * The migrated-archive PK-preservation contract makes the copy safe:
72
+ * `content_items.id` reuses the legacy `pages.id` values verbatim, so
73
+ * every staged `pageId` / `page_id` resolves to the same row under the
74
+ * new FK target. Run inside a transaction with `PRAGMA foreign_keys = ON`
75
+ * so the copy-back doubles as a row-level FK validation — a stale id
76
+ * aborts the transaction here rather than surfacing later as a
77
+ * `foreign_key_check` finding.
78
+ * @param trx - Knex transaction on the archive being migrated
79
+ * (`scripts/migrate-to-0.13.mjs` is the caller).
80
+ * @example
81
+ * await db.transaction(async (trx) => {
82
+ * await retargetLegacyFkTables(trx);
83
+ * });
84
+ * // pragma_foreign_key_list('page_errors') now reports content_items.
85
+ */
86
+ export async function retargetLegacyFkTables(trx) {
87
+ // Legacy analyze output: no current-schema counterpart, so the rows are
88
+ // discarded. The child (`analysis_violations`, which references
89
+ // `analysis_text_refs`) goes first so the drop is legal under
90
+ // `PRAGMA foreign_keys = ON`.
91
+ await trx.raw('DROP TABLE IF EXISTS "analysis_violations"');
92
+ await trx.raw('DROP TABLE IF EXISTS "analysis_text_refs"');
93
+ const staged = [];
94
+ for (const table of RETARGET_TABLES) {
95
+ if (!(await trx.schema.hasTable(table))) {
96
+ continue;
97
+ }
98
+ await trx.raw(`CREATE TABLE "${table}__retarget" AS SELECT * FROM "${table}"`);
99
+ await trx.raw(`DROP TABLE "${table}"`);
100
+ staged.push(table);
101
+ }
102
+ // `page_tags` has no current-schema table to retarget onto (removed —
103
+ // see the module JSDoc), so its rows are converted to
104
+ // `technology_signals` / `page_technologies` shape HERE, while
105
+ // `page_tags` still exists, then only dropped (not staged/recreated)
106
+ // after `createAdjunctTables` below provisions the tables that will
107
+ // receive them.
108
+ const hasLegacyPageTags = await trx.schema.hasTable('page_tags');
109
+ const legacyTagRows = hasLegacyPageTags
110
+ ? await trx
111
+ .select('pageId', 'provider', 'version', 'confidence', 'categories')
112
+ .from('page_tags')
113
+ : [];
114
+ await createAdjunctTables(trx);
115
+ for (const table of staged) {
116
+ const columns = await trx
117
+ .select('name')
118
+ .from(trx.raw('pragma_table_info(?)', [table]));
119
+ const insertColumnList = columns.map((column) => `"${column.name}"`).join(', ');
120
+ await trx.raw(`INSERT INTO "${table}" (${insertColumnList}) SELECT ${insertColumnList} FROM "${table}__retarget"`);
121
+ await trx.raw(`DROP TABLE "${table}__retarget"`);
122
+ }
123
+ if (hasLegacyPageTags) {
124
+ const { signalInserts, technologyInserts } = convertLegacyPageTagsToInserts(legacyTagRows);
125
+ if (signalInserts.length > 0) {
126
+ await eachSplitted(signalInserts, 100, async (chunk) => {
127
+ await trx('technology_signals').insert(chunk);
128
+ });
129
+ }
130
+ if (technologyInserts.length > 0) {
131
+ await eachSplitted(technologyInserts, 100, async (chunk) => {
132
+ await trx('page_technologies').insert(chunk);
133
+ });
134
+ }
135
+ await trx.raw('DROP TABLE "page_tags"');
136
+ }
137
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Resolves and validates a file path to prevent path traversal attacks.
3
+ * Ensures the resolved path stays within the specified base directory.
4
+ * @param base - The base directory that all paths must stay within.
5
+ * @param segments - Path segments to resolve relative to the base.
6
+ * @returns The resolved absolute path.
7
+ * @throws {Error} If the resolved path escapes the base directory.
8
+ */
9
+ export declare function safePath(base: string, ...segments: string[]): string;
@@ -0,0 +1,17 @@
1
+ import path from 'node:path';
2
+ /**
3
+ * Resolves and validates a file path to prevent path traversal attacks.
4
+ * Ensures the resolved path stays within the specified base directory.
5
+ * @param base - The base directory that all paths must stay within.
6
+ * @param segments - Path segments to resolve relative to the base.
7
+ * @returns The resolved absolute path.
8
+ * @throws {Error} If the resolved path escapes the base directory.
9
+ */
10
+ export function safePath(base, ...segments) {
11
+ const resolvedBase = path.resolve(base);
12
+ const resolved = path.resolve(base, ...segments);
13
+ if (!resolved.startsWith(resolvedBase + path.sep) && resolved !== resolvedBase) {
14
+ throw new Error(`Path traversal detected: ${segments.join('/')}`);
15
+ }
16
+ return resolved;
17
+ }
@@ -0,0 +1,21 @@
1
+ import type { ExURL, ParseURLOptions } from '@d-zero/shared/parse-url';
2
+ /**
3
+ * Builds a hostname-indexed scope map from a list of root URL strings, for
4
+ * use with {@link findScopeEntry}.
5
+ *
6
+ * Each root that fails to parse is silently skipped (a malformed root can
7
+ * never match anything anyway) rather than throwing, matching the existing
8
+ * inline construction this replaces (`@nitpicker/crawler`'s `crawler-orchestrator.ts` `append`
9
+ * and inventory-classification call sites, `Crawler`'s own scope build).
10
+ * Roots sharing a hostname are grouped under one array entry so
11
+ * `findScopeEntry` can pick the most specific match among them.
12
+ * @param roots - Root URL strings (e.g. `Config.roots`).
13
+ * @param options - URL parsing options forwarded to {@link parseUrl}.
14
+ * @returns A hostname-indexed map of parsed root URLs.
15
+ * @example
16
+ * ```ts
17
+ * const scope = buildScopeMap(['https://example.com/blog/', 'https://example.com/docs/']);
18
+ * findScopeEntry(url, scope); // deepest matching root, or null if external
19
+ * ```
20
+ */
21
+ export declare function buildScopeMap(roots: readonly string[], options?: ParseURLOptions): Map<string, ExURL[]>;
@@ -0,0 +1,32 @@
1
+ import { tryParseUrl as parseUrl } from '@d-zero/shared/parse-url';
2
+ /**
3
+ * Builds a hostname-indexed scope map from a list of root URL strings, for
4
+ * use with {@link findScopeEntry}.
5
+ *
6
+ * Each root that fails to parse is silently skipped (a malformed root can
7
+ * never match anything anyway) rather than throwing, matching the existing
8
+ * inline construction this replaces (`@nitpicker/crawler`'s `crawler-orchestrator.ts` `append`
9
+ * and inventory-classification call sites, `Crawler`'s own scope build).
10
+ * Roots sharing a hostname are grouped under one array entry so
11
+ * `findScopeEntry` can pick the most specific match among them.
12
+ * @param roots - Root URL strings (e.g. `Config.roots`).
13
+ * @param options - URL parsing options forwarded to {@link parseUrl}.
14
+ * @returns A hostname-indexed map of parsed root URLs.
15
+ * @example
16
+ * ```ts
17
+ * const scope = buildScopeMap(['https://example.com/blog/', 'https://example.com/docs/']);
18
+ * findScopeEntry(url, scope); // deepest matching root, or null if external
19
+ * ```
20
+ */
21
+ export function buildScopeMap(roots, options) {
22
+ const scope = new Map();
23
+ for (const raw of roots) {
24
+ const parsed = parseUrl(raw, options);
25
+ if (!parsed) {
26
+ continue;
27
+ }
28
+ const existing = scope.get(parsed.hostname) ?? [];
29
+ scope.set(parsed.hostname, [...existing, parsed]);
30
+ }
31
+ return scope;
32
+ }
@@ -0,0 +1,25 @@
1
+ import type { ExURL, ParseURLOptions } from '@d-zero/shared/parse-url';
2
+ /**
3
+ * Find the most-specific scope entry that contains the given URL.
4
+ *
5
+ * A scope entry is an `(hostname, port, path)` triple. The target URL belongs
6
+ * to a scope entry when its hostname AND port match and its path is at the
7
+ * same level or deeper than the scope entry's path. Among all matching entries,
8
+ * the one with the greatest depth wins (e.g. `/blog/2024/` is preferred over
9
+ * `/blog/`). Port comparison uses the WHATWG-normalized `port` field, so
10
+ * default ports (`80` for http, `443` for https) collapse to an empty string
11
+ * and match each other regardless of whether the user wrote them explicitly.
12
+ * A non-default port like `:3000` only matches scope entries that also carry
13
+ * the same port — this prevents credentialed dev sites (`localhost:3000`)
14
+ * from leaking auth into siblings on the same hostname (`localhost:8080`).
15
+ *
16
+ * Returns `null` if no scope entry contains the URL — i.e. the URL is external.
17
+ * This single function replaces the previous trio of `isExternalUrl`,
18
+ * `isInAnyLowerLayer`, and `findBestMatchingScope`, performing a single
19
+ * hostname lookup and a single pass over the scope array.
20
+ * @param url - The target URL to classify.
21
+ * @param scope - Hostname-indexed map of scope URLs.
22
+ * @param options - URL parsing options forwarded to {@link isLowerLayer}.
23
+ * @returns The deepest matching scope URL, or `null` when the URL is external.
24
+ */
25
+ export declare function findScopeEntry(url: ExURL, scope: ReadonlyMap<string, readonly ExURL[]>, options?: ParseURLOptions): ExURL | null;
@@ -0,0 +1,45 @@
1
+ import { isLowerLayer } from '@d-zero/shared/is-lower-layer';
2
+ /**
3
+ * Find the most-specific scope entry that contains the given URL.
4
+ *
5
+ * A scope entry is an `(hostname, port, path)` triple. The target URL belongs
6
+ * to a scope entry when its hostname AND port match and its path is at the
7
+ * same level or deeper than the scope entry's path. Among all matching entries,
8
+ * the one with the greatest depth wins (e.g. `/blog/2024/` is preferred over
9
+ * `/blog/`). Port comparison uses the WHATWG-normalized `port` field, so
10
+ * default ports (`80` for http, `443` for https) collapse to an empty string
11
+ * and match each other regardless of whether the user wrote them explicitly.
12
+ * A non-default port like `:3000` only matches scope entries that also carry
13
+ * the same port — this prevents credentialed dev sites (`localhost:3000`)
14
+ * from leaking auth into siblings on the same hostname (`localhost:8080`).
15
+ *
16
+ * Returns `null` if no scope entry contains the URL — i.e. the URL is external.
17
+ * This single function replaces the previous trio of `isExternalUrl`,
18
+ * `isInAnyLowerLayer`, and `findBestMatchingScope`, performing a single
19
+ * hostname lookup and a single pass over the scope array.
20
+ * @param url - The target URL to classify.
21
+ * @param scope - Hostname-indexed map of scope URLs.
22
+ * @param options - URL parsing options forwarded to {@link isLowerLayer}.
23
+ * @returns The deepest matching scope URL, or `null` when the URL is external.
24
+ */
25
+ export function findScopeEntry(url, scope, options) {
26
+ const scopes = scope.get(url.hostname);
27
+ if (!scopes) {
28
+ return null;
29
+ }
30
+ let bestMatch = null;
31
+ let maxDepth = -1;
32
+ for (const entry of scopes) {
33
+ if (entry.port !== url.port) {
34
+ continue;
35
+ }
36
+ if (!isLowerLayer(url, entry, options)) {
37
+ continue;
38
+ }
39
+ if (entry.depth > maxDepth) {
40
+ bestMatch = entry;
41
+ maxDepth = entry.depth;
42
+ }
43
+ }
44
+ return bestMatch;
45
+ }
@@ -0,0 +1,42 @@
1
+ import type { ClassifyArchivePageTemplatesOptions, ClassifyArchivePageTemplatesResult } from './types.js';
2
+ import type Archive from '../archive.js';
3
+ /**
4
+ * Classifies every internal HTML page of the archive into a template group
5
+ * by DOM-structure similarity and persists the result to `page_templates`,
6
+ * `page_template_clusters` and `page_template_labels`.
7
+ *
8
+ * This is the crawl-end derived-data step (alongside the JS-resource scan
9
+ * and the viewer read-model build): the crawl command runs it before the
10
+ * archive is written, and `viewer-build` / `concat` / `split` re-run it on
11
+ * their archive. It is a corpus-wide batch computation (template keys are
12
+ * only comparable within one run), not a per-page one.
13
+ *
14
+ * The signals of every internal HTML page with a stored snapshot are loaded
15
+ * before clustering starts (`loadPageClusterCandidates`: ids and the few
16
+ * columns the classifier reads, no `Page` objects) and clustered **once**,
17
+ * never per loading batch: per-batch keys would only be comparable within
18
+ * their own batch.
19
+ *
20
+ * A run that classifies no page at all (no internal page has a stored HTML
21
+ * snapshot to cluster) leaves the stored classification untouched instead of
22
+ * replacing it with an empty one: nothing could be re-derived, and erasing a
23
+ * previous classification (e.g. rows `concat` copied from its sources) would
24
+ * lose data for no gain. Whenever at least one page is classified the stored
25
+ * classification is replaced wholesale; labels survive either way —
26
+ * `replacePageTemplates` carries them forward across runs and keeps retired
27
+ * ones.
28
+ * @param archive - A writable archive (crawl-end orchestrator archive, or one
29
+ * opened for `viewer-build` / created by `concat` / `split`).
30
+ * @param options - See {@link ClassifyArchivePageTemplatesOptions}.
31
+ * @returns See {@link ClassifyArchivePageTemplatesResult}.
32
+ * @throws {Error} Whatever page loading, clustering or the write throws — callers
33
+ * that treat classification as best-effort (all CLI paths) catch it.
34
+ * @example
35
+ * ```ts
36
+ * const { classifiedPageCount, templateCount } = await classifyArchivePageTemplates(
37
+ * archive,
38
+ * { onProgress: (event) => console.error(event.phase) },
39
+ * );
40
+ * ```
41
+ */
42
+ export declare function classifyArchivePageTemplates(archive: Archive, options?: ClassifyArchivePageTemplatesOptions): Promise<ClassifyArchivePageTemplatesResult>;
@@ -0,0 +1,70 @@
1
+ import { classifyPageTemplates } from './classify-page-templates.js';
2
+ import { collectPageIdsWithHtml } from './collect-page-ids-with-html.js';
3
+ import { loadPageClusterCandidates } from './load-page-cluster-candidates.js';
4
+ /**
5
+ * Classifies every internal HTML page of the archive into a template group
6
+ * by DOM-structure similarity and persists the result to `page_templates`,
7
+ * `page_template_clusters` and `page_template_labels`.
8
+ *
9
+ * This is the crawl-end derived-data step (alongside the JS-resource scan
10
+ * and the viewer read-model build): the crawl command runs it before the
11
+ * archive is written, and `viewer-build` / `concat` / `split` re-run it on
12
+ * their archive. It is a corpus-wide batch computation (template keys are
13
+ * only comparable within one run), not a per-page one.
14
+ *
15
+ * The signals of every internal HTML page with a stored snapshot are loaded
16
+ * before clustering starts (`loadPageClusterCandidates`: ids and the few
17
+ * columns the classifier reads, no `Page` objects) and clustered **once**,
18
+ * never per loading batch: per-batch keys would only be comparable within
19
+ * their own batch.
20
+ *
21
+ * A run that classifies no page at all (no internal page has a stored HTML
22
+ * snapshot to cluster) leaves the stored classification untouched instead of
23
+ * replacing it with an empty one: nothing could be re-derived, and erasing a
24
+ * previous classification (e.g. rows `concat` copied from its sources) would
25
+ * lose data for no gain. Whenever at least one page is classified the stored
26
+ * classification is replaced wholesale; labels survive either way —
27
+ * `replacePageTemplates` carries them forward across runs and keeps retired
28
+ * ones.
29
+ * @param archive - A writable archive (crawl-end orchestrator archive, or one
30
+ * opened for `viewer-build` / created by `concat` / `split`).
31
+ * @param options - See {@link ClassifyArchivePageTemplatesOptions}.
32
+ * @returns See {@link ClassifyArchivePageTemplatesResult}.
33
+ * @throws {Error} Whatever page loading, clustering or the write throws — callers
34
+ * that treat classification as best-effort (all CLI paths) catch it.
35
+ * @example
36
+ * ```ts
37
+ * const { classifiedPageCount, templateCount } = await classifyArchivePageTemplates(
38
+ * archive,
39
+ * { onProgress: (event) => console.error(event.phase) },
40
+ * );
41
+ * ```
42
+ */
43
+ export async function classifyArchivePageTemplates(archive, options = {}) {
44
+ const { memoryBudget, onProgress } = options;
45
+ onProgress?.({ phase: 'listing-html-snapshots' });
46
+ const pageIdsWithHtml = await collectPageIdsWithHtml(archive);
47
+ onProgress?.({ phase: 'loading-pages-start' });
48
+ const candidates = await loadPageClusterCandidates(archive, {
49
+ pageIdsWithHtml,
50
+ ...(onProgress ? { onProgress } : {}),
51
+ });
52
+ const classification = await classifyPageTemplates({
53
+ archive,
54
+ candidates,
55
+ ...(memoryBudget === undefined ? {} : { memoryBudget }),
56
+ onProgress,
57
+ });
58
+ if (classification.templateKeysByUrl.size > 0) {
59
+ onProgress?.({
60
+ phase: 'writing-results',
61
+ templateCount: new Set(classification.templateKeysByUrl.values()).size,
62
+ });
63
+ await archive.replacePageTemplates(classification.templateKeysByUrl, classification.clusterReasonsByTemplateKey);
64
+ }
65
+ return {
66
+ classifiedPageCount: classification.templateKeysByUrl.size,
67
+ templateCount: new Set(classification.templateKeysByUrl.values()).size,
68
+ sampledBlocks: classification.sampledBlocks,
69
+ };
70
+ }
@@ -0,0 +1,33 @@
1
+ import type { ClassifyPageTemplatesOptions, PageTemplateClassification } from './types.js';
2
+ /**
3
+ * Classifies every internal HTML page in the archive into a template group
4
+ * by DOM-structure similarity, using the classifier `./page-cluster/` drives
5
+ * in `@nitpicker/core`.
6
+ *
7
+ * The result is deliberately **not cached**. A cache keyed on the archive
8
+ * file's identity (path + size + mtime + page count) cannot be correct at the
9
+ * only point this runs — the end of a crawl, before the archive is written
10
+ * back: `archive.filePath` then still names the previous tar (or nothing), so
11
+ * a `--retry-failed` run that replaces a failed page's HTML without changing
12
+ * the page count would be served the previous classification. A crash during
13
+ * classification leaves the crawl's stub directory in place, and resuming it
14
+ * re-runs this step from scratch; the classifier has no mid-computation
15
+ * checkpoint to resume from either.
16
+ *
17
+ * Internally: the driver's `resolvePageClusterKeys` returns a `clusterKey`
18
+ * per page; this function's public naming is `templateKey`, to avoid
19
+ * colliding with nitpicker's unrelated pre-existing "isolated cluster"
20
+ * concept (`@nitpicker/query`'s `compute-isolated-clusters.ts`,
21
+ * link-reachability graph components — a completely different kind of
22
+ * grouping from DOM-structure similarity).
23
+ * @param options - See {@link ClassifyPageTemplatesOptions}.
24
+ * @returns See {@link PageTemplateClassification}.
25
+ * @example
26
+ * ```ts
27
+ * const pageIdsWithHtml = await collectPageIdsWithHtml(archive);
28
+ * const candidates = await loadPageClusterCandidates(archive, { pageIdsWithHtml });
29
+ * const { templateKeysByUrl } = await classifyPageTemplates({ archive, candidates });
30
+ * await archive.replacePageTemplates(templateKeysByUrl);
31
+ * ```
32
+ */
33
+ export declare function classifyPageTemplates(options: ClassifyPageTemplatesOptions): Promise<PageTemplateClassification>;
@@ -0,0 +1,60 @@
1
+ import { collectPageStylesheetUrls } from './collect-page-stylesheet-urls.js';
2
+ import { createPageClusterFactory } from './create-page-cluster-factory.js';
3
+ import { resolvePageClusterKeys } from './page-cluster/resolve-page-cluster-keys.js';
4
+ /**
5
+ * Classifies every internal HTML page in the archive into a template group
6
+ * by DOM-structure similarity, using the classifier `./page-cluster/` drives
7
+ * in `@nitpicker/core`.
8
+ *
9
+ * The result is deliberately **not cached**. A cache keyed on the archive
10
+ * file's identity (path + size + mtime + page count) cannot be correct at the
11
+ * only point this runs — the end of a crawl, before the archive is written
12
+ * back: `archive.filePath` then still names the previous tar (or nothing), so
13
+ * a `--retry-failed` run that replaces a failed page's HTML without changing
14
+ * the page count would be served the previous classification. A crash during
15
+ * classification leaves the crawl's stub directory in place, and resuming it
16
+ * re-runs this step from scratch; the classifier has no mid-computation
17
+ * checkpoint to resume from either.
18
+ *
19
+ * Internally: the driver's `resolvePageClusterKeys` returns a `clusterKey`
20
+ * per page; this function's public naming is `templateKey`, to avoid
21
+ * colliding with nitpicker's unrelated pre-existing "isolated cluster"
22
+ * concept (`@nitpicker/query`'s `compute-isolated-clusters.ts`,
23
+ * link-reachability graph components — a completely different kind of
24
+ * grouping from DOM-structure similarity).
25
+ * @param options - See {@link ClassifyPageTemplatesOptions}.
26
+ * @returns See {@link PageTemplateClassification}.
27
+ * @example
28
+ * ```ts
29
+ * const pageIdsWithHtml = await collectPageIdsWithHtml(archive);
30
+ * const candidates = await loadPageClusterCandidates(archive, { pageIdsWithHtml });
31
+ * const { templateKeysByUrl } = await classifyPageTemplates({ archive, candidates });
32
+ * await archive.replacePageTemplates(templateKeysByUrl);
33
+ * ```
34
+ */
35
+ export async function classifyPageTemplates(options) {
36
+ const { archive, candidates, memoryBudget, onProgress } = options;
37
+ onProgress?.({ phase: 'collecting-stylesheets' });
38
+ const stylesheetsByUrl = await collectPageStylesheetUrls(archive);
39
+ const { factory, urls } = createPageClusterFactory({
40
+ archive,
41
+ candidates,
42
+ stylesheetsByUrl,
43
+ });
44
+ const { keys, reasons, sampledBlocks } = await resolvePageClusterKeys(factory, {
45
+ ...(memoryBudget === undefined ? {} : { memoryBudget }),
46
+ ...(onProgress ? { onProgress } : {}),
47
+ });
48
+ if (keys.length !== urls.length) {
49
+ // Would silently mis-map template keys to the wrong URLs if allowed
50
+ // through; the driver returns one key per page read, so this guards a
51
+ // broken invariant loudly rather than assigning quietly.
52
+ throw new Error(`classifyPageTemplates: resolvePageClusterKeys returned ${keys.length} keys for ${urls.length} pages.`);
53
+ }
54
+ const templateKeysByUrl = new Map();
55
+ for (const [index, url] of urls.entries()) {
56
+ templateKeysByUrl.set(url, keys[index]);
57
+ }
58
+ const clusterReasonsByTemplateKey = reasons;
59
+ return { templateKeysByUrl, clusterReasonsByTemplateKey, sampledBlocks };
60
+ }
@@ -0,0 +1,24 @@
1
+ import type Archive from '../archive.js';
2
+ /**
3
+ * Collects the ids (`Page.id`) of the pages that have a non-empty HTML
4
+ * snapshot stored, without decompressing any of them.
5
+ *
6
+ * Template classification reads only pages with HTML, and its engine reads
7
+ * the corpus several times, decompressing each page only on the reads that
8
+ * use it. Which pages take part has to be known before the first read, the
9
+ * same on every read: deciding it by calling `Page.getHtml()` would
10
+ * decompress every page on every read. A snapshot is non-empty exactly when
11
+ * its raw UTF-8 size (`page_html_blobs.size_raw`, recorded when it was
12
+ * written) is above zero, and a page whose `page_html_ref` points at no blob
13
+ * reads back as `null` — both match what `Page.getHtml()` returns. Keyed by
14
+ * id, not URL, so the answer is the page's own, whatever its URL normalizes
15
+ * to.
16
+ * @param archive - The archive to read from.
17
+ * @returns The ids, in no particular order.
18
+ * @example
19
+ * ```ts
20
+ * const pageIdsWithHtml = await collectPageIdsWithHtml(archive);
21
+ * const pagesWithHtml = pages.filter((page) => pageIdsWithHtml.has(page.id));
22
+ * ```
23
+ */
24
+ export declare function collectPageIdsWithHtml(archive: Archive): Promise<Set<number>>;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Collects the ids (`Page.id`) of the pages that have a non-empty HTML
3
+ * snapshot stored, without decompressing any of them.
4
+ *
5
+ * Template classification reads only pages with HTML, and its engine reads
6
+ * the corpus several times, decompressing each page only on the reads that
7
+ * use it. Which pages take part has to be known before the first read, the
8
+ * same on every read: deciding it by calling `Page.getHtml()` would
9
+ * decompress every page on every read. A snapshot is non-empty exactly when
10
+ * its raw UTF-8 size (`page_html_blobs.size_raw`, recorded when it was
11
+ * written) is above zero, and a page whose `page_html_ref` points at no blob
12
+ * reads back as `null` — both match what `Page.getHtml()` returns. Keyed by
13
+ * id, not URL, so the answer is the page's own, whatever its URL normalizes
14
+ * to.
15
+ * @param archive - The archive to read from.
16
+ * @returns The ids, in no particular order.
17
+ * @example
18
+ * ```ts
19
+ * const pageIdsWithHtml = await collectPageIdsWithHtml(archive);
20
+ * const pagesWithHtml = pages.filter((page) => pageIdsWithHtml.has(page.id));
21
+ * ```
22
+ */
23
+ export async function collectPageIdsWithHtml(archive) {
24
+ const rows = (await archive
25
+ .getKnex()('page_html_ref as ref')
26
+ .join('page_html_blobs as blob', 'blob.hash', 'ref.hash')
27
+ .where('blob.size_raw', '>', 0)
28
+ .select('ref.page_id as pageId'));
29
+ return new Set(rows.map((row) => row.pageId));
30
+ }
@@ -0,0 +1,32 @@
1
+ import type Archive from '../archive.js';
2
+ /**
3
+ * Collects, for every page that references at least one CSS stylesheet, the
4
+ * set of stylesheet URLs it references.
5
+ *
6
+ * Reads in three narrow passes instead of one wide JOIN, to avoid
7
+ * materializing the full page×stylesheet edge set at once — a real
8
+ * 486,000-page archive has ~2.5 million such edges, and a single JOIN
9
+ * projecting both URL strings for all of them is a transient allocation
10
+ * spike well beyond what any single page's data actually needs:
11
+ *
12
+ * 1. Resolve which `resource_items` rows are classified `'css'`
13
+ * (`content_type_refs.category`) and their stylesheet URL.
14
+ * 2. Resolve `resource_ref_edges` for just those CSS resource ids, in
15
+ * chunks, projecting only the two integer ids per row.
16
+ * 3. Resolve the page ids collected in step 2 to their URLs.
17
+ *
18
+ * Identical stylesheet-URL arrays are interned across pages: pages sharing a
19
+ * template share the same CSS set, so the number of distinct arrays
20
+ * converges to a few hundred even across hundreds of thousands of pages.
21
+ * @param archive - The archive to read from.
22
+ * @returns Map from page URL (parseUrl-normalized `href`, matching
23
+ * `Page.url.href`) to the stylesheet URLs it references. Pages that
24
+ * reference no CSS resource have no entry — callers should default to an
25
+ * empty array on a missed lookup.
26
+ * @example
27
+ * ```ts
28
+ * const stylesheetsByUrl = await collectPageStylesheetUrls(archive);
29
+ * const hrefs = stylesheetsByUrl.get(page.url.href) ?? [];
30
+ * ```
31
+ */
32
+ export declare function collectPageStylesheetUrls(archive: Archive): Promise<Map<string, readonly string[]>>;