@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,187 @@
1
+ /**
2
+ * Assigns every cluster of a fresh template classification its
3
+ * {@link TemplateLabel}, carrying labels forward from the previous
4
+ * classification wherever the same template survived the re-run.
5
+ *
6
+ * ## Inheritance
7
+ *
8
+ * A new cluster inherits an old cluster's label when the two share a
9
+ * **mutual majority** of pages: the overlap is more than half of the new
10
+ * cluster *and* more than half of the old one. Mutual majority means at
11
+ * most one new cluster can claim a given old label, and a cluster that
12
+ * merely absorbed a few pages of a much larger old template does not steal
13
+ * its name. A split keeps the old label on the half that holds most of the
14
+ * old pages; the other half is named afresh.
15
+ *
16
+ * The old cluster's size counts only pages that are classified in the new
17
+ * run too. Pages the crawl has since dropped (`--recrawl` turned them into
18
+ * redirects, errors, …) are not evidence that the template changed, so
19
+ * they must not dilute the old half of the majority — otherwise an old
20
+ * 7-page cluster whose 4 missing pages left 3 unchanged ones would fail
21
+ * `3 > 7/2` and be renamed for no reason.
22
+ *
23
+ * Page ids are the identity used for overlap (not URLs) because they are
24
+ * what `page_templates` stores and they survive `--append` / `--recrawl`
25
+ * without renumbering.
26
+ *
27
+ * ## Fresh labels
28
+ *
29
+ * Clusters left without an inherited label are numbered in page-count
30
+ * order (largest first, template key as a tie-break) so a first run reads
31
+ * naturally: `A` is the section's biggest template. Each takes the next
32
+ * ordinal **after every ordinal in `previousLabels` for its section**, so a
33
+ * letter is never re-issued to a different template — which would silently
34
+ * change what "events template B" means between two people's archives.
35
+ * That guarantee is only as good as `previousLabels`: `replacePageTemplates`
36
+ * keeps the rows of clusters that disappeared (retired labels) precisely so
37
+ * they stay in this set across any number of later runs.
38
+ *
39
+ * ## Section
40
+ *
41
+ * A cluster's section is the first path segment every member URL shares
42
+ * (`events` for `/events/...`). Members spread over several segments, or
43
+ * all at the site root, yield `null`: such a cluster is numbered in the
44
+ * site-wide sequence. An inherited label keeps its old section even if the
45
+ * cluster's members have since drifted — stability of the name wins over
46
+ * keeping the section literally accurate.
47
+ * @param params - See {@link AssignTemplateLabelsParams}.
48
+ * @returns Template key → label, one entry per cluster in `params.clusters`.
49
+ * @example
50
+ * ```ts
51
+ * const labels = assignTemplateLabels({
52
+ * clusters: new Map([['["path:events","cluster:0"]', { pageIds: [1, 2], urls: ['https://example.com/events/a', 'https://example.com/events/b'] }]]),
53
+ * previousMembership: new Map(),
54
+ * previousLabels: new Map(),
55
+ * });
56
+ * labels.get('["path:events","cluster:0"]'); // { section: 'events', ordinal: 1 }
57
+ * ```
58
+ */
59
+ export function assignTemplateLabels(params) {
60
+ const { clusters, previousMembership, previousLabels } = params;
61
+ const currentPageIds = new Set();
62
+ for (const cluster of clusters.values()) {
63
+ for (const pageId of cluster.pageIds) {
64
+ currentPageIds.add(pageId);
65
+ }
66
+ }
67
+ const previousKeyByPageId = new Map();
68
+ const previousSizeByKey = new Map();
69
+ for (const [key, pageIds] of previousMembership) {
70
+ let size = 0;
71
+ for (const pageId of pageIds) {
72
+ previousKeyByPageId.set(pageId, key);
73
+ if (currentPageIds.has(pageId)) {
74
+ size += 1;
75
+ }
76
+ }
77
+ previousSizeByKey.set(key, size);
78
+ }
79
+ // Every ordinal ever issued per section, seeded from the previous run so
80
+ // a vanished cluster's letter is retired rather than re-issued.
81
+ const usedOrdinals = new Map();
82
+ const markUsed = (label) => {
83
+ let set = usedOrdinals.get(label.section);
84
+ if (!set) {
85
+ set = new Set();
86
+ usedOrdinals.set(label.section, set);
87
+ }
88
+ set.add(label.ordinal);
89
+ };
90
+ for (const label of previousLabels.values()) {
91
+ markUsed(label);
92
+ }
93
+ const ordered = [...clusters].toSorted(([keyA, a], [keyB, b]) => b.pageIds.length - a.pageIds.length || keyA.localeCompare(keyB));
94
+ const labels = new Map();
95
+ const claimedPreviousKeys = new Set();
96
+ const unlabeled = [];
97
+ for (const entry of ordered) {
98
+ const [key, cluster] = entry;
99
+ const inherited = findInheritedLabel(cluster.pageIds, {
100
+ previousKeyByPageId,
101
+ previousSizeByKey,
102
+ previousLabels,
103
+ claimedPreviousKeys,
104
+ });
105
+ if (inherited) {
106
+ claimedPreviousKeys.add(inherited.previousKey);
107
+ labels.set(key, inherited.label);
108
+ }
109
+ else {
110
+ unlabeled.push(entry);
111
+ }
112
+ }
113
+ for (const [key, cluster] of unlabeled) {
114
+ const section = deriveSection(cluster.urls);
115
+ const used = usedOrdinals.get(section);
116
+ const ordinal = used ? Math.max(...used) + 1 : 1;
117
+ const label = { section, ordinal };
118
+ markUsed(label);
119
+ labels.set(key, label);
120
+ }
121
+ return labels;
122
+ }
123
+ /**
124
+ * Finds the previous cluster whose label the given members inherit, if any
125
+ * — the unclaimed, labeled previous cluster sharing a mutual majority of
126
+ * pages with them.
127
+ * @param pageIds - The new cluster's member page ids.
128
+ * @param context - Lookups built once by `assignTemplateLabels`.
129
+ * @param context.previousKeyByPageId - Page id → previous template key.
130
+ * @param context.previousSizeByKey - Previous template key → member count.
131
+ * @param context.previousLabels - Previous template key → label.
132
+ * @param context.claimedPreviousKeys - Previous keys already inherited by a larger new cluster.
133
+ * @returns The matched previous key and its label, or `null`.
134
+ */
135
+ function findInheritedLabel(pageIds, context) {
136
+ const overlapByKey = new Map();
137
+ for (const pageId of pageIds) {
138
+ const previousKey = context.previousKeyByPageId.get(pageId);
139
+ if (previousKey != null) {
140
+ overlapByKey.set(previousKey, (overlapByKey.get(previousKey) ?? 0) + 1);
141
+ }
142
+ }
143
+ let best = null;
144
+ for (const [previousKey, overlap] of overlapByKey) {
145
+ if (!best || overlap > best.overlap) {
146
+ best = { previousKey, overlap };
147
+ }
148
+ }
149
+ if (!best || context.claimedPreviousKeys.has(best.previousKey)) {
150
+ return null;
151
+ }
152
+ const label = context.previousLabels.get(best.previousKey);
153
+ if (!label) {
154
+ return null;
155
+ }
156
+ const previousSize = context.previousSizeByKey.get(best.previousKey) ?? 0;
157
+ if (best.overlap * 2 <= pageIds.length || best.overlap * 2 <= previousSize) {
158
+ return null;
159
+ }
160
+ return { previousKey: best.previousKey, label };
161
+ }
162
+ /**
163
+ * The first path segment shared by every URL, or `null` when they disagree
164
+ * or all sit at the site root. A URL that fails to parse counts as
165
+ * disagreeing — a cluster is not pinned to a section by guesswork.
166
+ * @param urls - The cluster's member page URLs.
167
+ * @returns The shared section name, or `null`.
168
+ */
169
+ function deriveSection(urls) {
170
+ let section;
171
+ for (const url of urls) {
172
+ let segment;
173
+ try {
174
+ segment = new URL(url).pathname.split('/')[1] ?? '';
175
+ }
176
+ catch {
177
+ return null;
178
+ }
179
+ if (section === undefined) {
180
+ section = segment;
181
+ }
182
+ else if (section !== segment) {
183
+ return null;
184
+ }
185
+ }
186
+ return section || null;
187
+ }
@@ -0,0 +1,44 @@
1
+ import type { ReplacePageTemplatesParams } from './types.js';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Replaces the stored DOM-structure template classification with a freshly
5
+ * generated set.
6
+ *
7
+ * Every classified page is a full-archive, all-or-nothing recomputation
8
+ * (see `classifyPageTemplates`), so this always deletes
9
+ * every existing row before inserting the new set — there is no per-page
10
+ * incremental update path. A page whose URL can't be
11
+ * resolved back to a `content_items` row is silently skipped rather than
12
+ * treated as a hard failure: losing one page's template classification
13
+ * (e.g. a URL-normalization mismatch between the in-memory `Page.url.href`
14
+ * and the stored `url_refs.url`) should not discard the rest of a
15
+ * potentially multi-thousand-page classification run.
16
+ *
17
+ * `page_template_clusters` is always cleared alongside `page_templates`
18
+ * regardless of whether `clusterReasonsByTemplateKey` is passed — "no
19
+ * reason" must mean "not captured for this run", never "carry over the
20
+ * previous run's reason". Reason rows are inserted for every key in
21
+ * `clusterReasonsByTemplateKey` even if some have no surviving member page
22
+ * in `templateKeysByUrl` after URL-resolution skips above — harmless
23
+ * (nothing joins `page_template_clusters` back to `page_templates` by FK;
24
+ * see the table's own JSDoc), and simpler than cross-filtering the two maps.
25
+ *
26
+ * `page_template_labels` is the one table that is **not** wholesale
27
+ * replaced: the human-facing label of each new cluster is carried forward
28
+ * from whichever previous cluster it shares most pages with
29
+ * (`assignTemplateLabels`), which is what lets "events template B" keep
30
+ * meaning the same template across re-runs, and the rows of clusters that
31
+ * disappeared are kept as *retired* labels so their letters are never
32
+ * re-issued to a different template on a later run (only the rows for the
33
+ * keys being written, and the old row of a label that moved to a new key,
34
+ * are removed). Readers look labels up by the keys
35
+ * currently in `page_templates`, so retired rows are invisible to them.
36
+ * The previous `page_templates` and `page_template_labels` rows are read
37
+ * inside the same transaction that writes — there is no window in which
38
+ * another writer could change what the labels were derived from. An empty
39
+ * `templateKeysByUrl` therefore clears the classification but leaves every
40
+ * label row in place.
41
+ * @param knex - Knex query builder connected to the archive DB.
42
+ * @param params - See {@link ReplacePageTemplatesParams}.
43
+ */
44
+ export declare function replacePageTemplates(knex: Knex, params: ReplacePageTemplatesParams): Promise<void>;
@@ -0,0 +1,174 @@
1
+ import { eachSplitted } from '../../utils/array/each-splitted.js';
2
+ import { compressPayload } from '../_shared/compress-payload.js';
3
+ import { assignTemplateLabels } from './assign-template-labels.js';
4
+ import { serializeTemplateClusterReason } from './serialize-template-cluster-reason.js';
5
+ /**
6
+ * Replaces the stored DOM-structure template classification with a freshly
7
+ * generated set.
8
+ *
9
+ * Every classified page is a full-archive, all-or-nothing recomputation
10
+ * (see `classifyPageTemplates`), so this always deletes
11
+ * every existing row before inserting the new set — there is no per-page
12
+ * incremental update path. A page whose URL can't be
13
+ * resolved back to a `content_items` row is silently skipped rather than
14
+ * treated as a hard failure: losing one page's template classification
15
+ * (e.g. a URL-normalization mismatch between the in-memory `Page.url.href`
16
+ * and the stored `url_refs.url`) should not discard the rest of a
17
+ * potentially multi-thousand-page classification run.
18
+ *
19
+ * `page_template_clusters` is always cleared alongside `page_templates`
20
+ * regardless of whether `clusterReasonsByTemplateKey` is passed — "no
21
+ * reason" must mean "not captured for this run", never "carry over the
22
+ * previous run's reason". Reason rows are inserted for every key in
23
+ * `clusterReasonsByTemplateKey` even if some have no surviving member page
24
+ * in `templateKeysByUrl` after URL-resolution skips above — harmless
25
+ * (nothing joins `page_template_clusters` back to `page_templates` by FK;
26
+ * see the table's own JSDoc), and simpler than cross-filtering the two maps.
27
+ *
28
+ * `page_template_labels` is the one table that is **not** wholesale
29
+ * replaced: the human-facing label of each new cluster is carried forward
30
+ * from whichever previous cluster it shares most pages with
31
+ * (`assignTemplateLabels`), which is what lets "events template B" keep
32
+ * meaning the same template across re-runs, and the rows of clusters that
33
+ * disappeared are kept as *retired* labels so their letters are never
34
+ * re-issued to a different template on a later run (only the rows for the
35
+ * keys being written, and the old row of a label that moved to a new key,
36
+ * are removed). Readers look labels up by the keys
37
+ * currently in `page_templates`, so retired rows are invisible to them.
38
+ * The previous `page_templates` and `page_template_labels` rows are read
39
+ * inside the same transaction that writes — there is no window in which
40
+ * another writer could change what the labels were derived from. An empty
41
+ * `templateKeysByUrl` therefore clears the classification but leaves every
42
+ * label row in place.
43
+ * @param knex - Knex query builder connected to the archive DB.
44
+ * @param params - See {@link ReplacePageTemplatesParams}.
45
+ */
46
+ export async function replacePageTemplates(knex, params) {
47
+ const { templateKeysByUrl, clusterReasonsByTemplateKey } = params;
48
+ // Compressing every reason is pure CPU work independent of the DB — done
49
+ // before opening the transaction below so it doesn't extend how long the
50
+ // SQLite write-lock is held for.
51
+ const reasonRows = clusterReasonsByTemplateKey && clusterReasonsByTemplateKey.size > 0
52
+ ? [...clusterReasonsByTemplateKey].map(([templateKey, reason]) => {
53
+ const { body, codec, sizeRaw, sizeStored } = compressPayload(Buffer.from(serializeTemplateClusterReason(reason), 'utf8'));
54
+ return {
55
+ template_key: templateKey,
56
+ member_count: reason.memberCount,
57
+ reason_json: body,
58
+ codec,
59
+ size_raw: sizeRaw,
60
+ size_stored: sizeStored,
61
+ };
62
+ })
63
+ : [];
64
+ await knex.transaction(async (trx) => {
65
+ // Resolve the new membership and read the previous one *before* the
66
+ // deletes below — label inheritance needs both sides.
67
+ const urls = [...templateKeysByUrl.keys()];
68
+ const pageIdByUrl = new Map();
69
+ await eachSplitted(urls, 500, async (chunk) => {
70
+ const pageRows = await trx('content_items')
71
+ .join('url_refs', 'url_refs.id', 'content_items.url_id')
72
+ .select('content_items.id as id', 'url_refs.url as url')
73
+ .whereIn('url_refs.url', chunk);
74
+ for (const row of pageRows) {
75
+ pageIdByUrl.set(row.url, row.id);
76
+ }
77
+ });
78
+ const rows = [];
79
+ const clusters = new Map();
80
+ for (const [url, templateKey] of templateKeysByUrl) {
81
+ const pageId = pageIdByUrl.get(url);
82
+ if (pageId == null) {
83
+ continue;
84
+ }
85
+ rows.push({ page_id: pageId, template_key: templateKey });
86
+ let cluster = clusters.get(templateKey);
87
+ if (!cluster) {
88
+ cluster = { pageIds: [], urls: [] };
89
+ clusters.set(templateKey, cluster);
90
+ }
91
+ cluster.pageIds.push(pageId);
92
+ cluster.urls.push(url);
93
+ }
94
+ const previousLabels = await loadPreviousLabels(trx);
95
+ const labels = assignTemplateLabels({
96
+ clusters,
97
+ previousMembership: await loadPreviousMembership(trx),
98
+ previousLabels,
99
+ });
100
+ // Rows to drop: the keys being (re)written, plus previous keys whose
101
+ // label was inherited by a new key — the label moved, so its old row
102
+ // would otherwise linger as a duplicate of the same name.
103
+ const writtenPairs = new Set([...labels.values()].map(labelPair));
104
+ const staleKeys = [...labels.keys()];
105
+ for (const [previousKey, label] of previousLabels) {
106
+ if (!labels.has(previousKey) && writtenPairs.has(labelPair(label))) {
107
+ staleKeys.push(previousKey);
108
+ }
109
+ }
110
+ await trx('page_templates').delete();
111
+ await trx('page_template_clusters').delete();
112
+ await eachSplitted(staleKeys, 500, async (chunk) => {
113
+ await trx('page_template_labels').whereIn('template_key', chunk).delete();
114
+ });
115
+ if (reasonRows.length > 0) {
116
+ await eachSplitted(reasonRows, 100, async (chunk) => {
117
+ await trx('page_template_clusters').insert(chunk);
118
+ });
119
+ }
120
+ if (rows.length === 0) {
121
+ return;
122
+ }
123
+ await eachSplitted(rows, 500, async (chunk) => {
124
+ await trx('page_templates').insert(chunk);
125
+ });
126
+ const labelRows = [...labels].map(([templateKey, label]) => ({
127
+ template_key: templateKey,
128
+ section: label.section,
129
+ ordinal: label.ordinal,
130
+ }));
131
+ await eachSplitted(labelRows, 500, async (chunk) => {
132
+ await trx('page_template_labels').insert(chunk);
133
+ });
134
+ });
135
+ }
136
+ /**
137
+ * The identity of a label as a name: its `(section, ordinal)` pair.
138
+ * @param label - The label.
139
+ * @returns A string key unique per name.
140
+ */
141
+ function labelPair(label) {
142
+ return `${label.section ?? '\0'}:${label.ordinal}`;
143
+ }
144
+ /**
145
+ * Reads the previous run's `page_templates` rows as template key → page ids.
146
+ * @param trx - The replacing transaction.
147
+ * @returns The previous membership; empty on a first run.
148
+ */
149
+ async function loadPreviousMembership(trx) {
150
+ const previousRows = (await trx('page_templates').select('page_id as pageId', 'template_key as templateKey'));
151
+ const membership = new Map();
152
+ for (const row of previousRows) {
153
+ const pageIds = membership.get(row.templateKey);
154
+ if (pageIds) {
155
+ pageIds.push(row.pageId);
156
+ }
157
+ else {
158
+ membership.set(row.templateKey, [row.pageId]);
159
+ }
160
+ }
161
+ return membership;
162
+ }
163
+ /**
164
+ * Reads the previous run's `page_template_labels` rows.
165
+ * @param trx - The replacing transaction.
166
+ * @returns Template key → label; empty on a first run.
167
+ */
168
+ async function loadPreviousLabels(trx) {
169
+ const labelRows = (await trx('page_template_labels').select('template_key as templateKey', 'section', 'ordinal'));
170
+ return new Map(labelRows.map((row) => [
171
+ row.templateKey,
172
+ { section: row.section, ordinal: row.ordinal },
173
+ ]));
174
+ }
@@ -0,0 +1,16 @@
1
+ import type { TemplateClusterReason } from './types.js';
2
+ /**
3
+ * Serializes a cluster reason to the JSON text that `page_template_clusters.reason_json`
4
+ * stores (before compression). The single definition of that format:
5
+ * `replacePageTemplates` writes it, and the template-classification golden
6
+ * pins it, so a change here shows up as a golden difference instead of
7
+ * silently diverging from what the golden claims to cover.
8
+ * @param reason - The reason.
9
+ * @returns The JSON text.
10
+ * @example
11
+ * ```ts
12
+ * const json = serializeTemplateClusterReason(reason);
13
+ * const { body } = compressPayload(Buffer.from(json, 'utf8'));
14
+ * ```
15
+ */
16
+ export declare function serializeTemplateClusterReason(reason: TemplateClusterReason): string;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Serializes a cluster reason to the JSON text that `page_template_clusters.reason_json`
3
+ * stores (before compression). The single definition of that format:
4
+ * `replacePageTemplates` writes it, and the template-classification golden
5
+ * pins it, so a change here shows up as a golden difference instead of
6
+ * silently diverging from what the golden claims to cover.
7
+ * @param reason - The reason.
8
+ * @returns The JSON text.
9
+ * @example
10
+ * ```ts
11
+ * const json = serializeTemplateClusterReason(reason);
12
+ * const { body } = compressPayload(Buffer.from(json, 'utf8'));
13
+ * ```
14
+ */
15
+ export function serializeTemplateClusterReason(reason) {
16
+ return JSON.stringify(reason);
17
+ }
@@ -0,0 +1,103 @@
1
+ /**
2
+ * The six landmark types a cluster reason's `landmarks` recognizes.
3
+ */
4
+ export type TemplateClusterLandmarkType = 'header' | 'footer' | 'nav' | 'aside' | 'form' | 'search';
5
+ /**
6
+ * Why a Pass-0 block (one of possibly several that merged into a final
7
+ * cluster) was formed — mirrors `@nitpicker/core`'s `TemplateBlockingReason`
8
+ * discriminated union.
9
+ */
10
+ export type TemplateClusterBlockingReason = {
11
+ readonly kind: 'css';
12
+ readonly distinctiveStylesheetHrefs: readonly string[];
13
+ } | {
14
+ readonly kind: 'path';
15
+ readonly pathKey: string;
16
+ } | {
17
+ readonly kind: 'orphanMerge';
18
+ readonly pathKey: string;
19
+ };
20
+ /** One block's blocking key and the reason it was formed. */
21
+ export interface TemplateClusterBlockingEvidence {
22
+ readonly blockKey: string;
23
+ readonly reason: TemplateClusterBlockingReason;
24
+ }
25
+ /** How common one landmark type is across a cluster's member pages. */
26
+ export interface TemplateClusterLandmarkProfile {
27
+ readonly presenceRate: number;
28
+ readonly chromeRate: number;
29
+ readonly shellTokens: readonly string[];
30
+ readonly memberCountWithInstance: number;
31
+ }
32
+ /**
33
+ * A copy of the classifier's reason shape (`@nitpicker/core`'s
34
+ * `TemplateClusterReason`, built by `createTemplateClassificationRun`). Kept
35
+ * independent of it (rather than importing its type directly) because this
36
+ * is the persisted contract of `page_template_clusters.reason` that
37
+ * `@nitpicker/query` and the browser-side viewer build type values against,
38
+ * and removing or retyping a field in core's shape surfaces as a compile
39
+ * error at the assignment in `classifyPageTemplates` instead of silently
40
+ * changing what older archives are read as. A field core *adds* is not
41
+ * caught there (structural assignability) and is persisted as-is in the
42
+ * JSON blob; mirror it here and in `@nitpicker/query`'s
43
+ * `isTemplateClusterReason` when it should be read back. Core's reason is
44
+ * structurally assignable to this type.
45
+ */
46
+ export interface TemplateClusterReason {
47
+ readonly memberCount: number;
48
+ readonly blocking: readonly TemplateClusterBlockingEvidence[];
49
+ readonly structuralCoreTokens: readonly string[];
50
+ readonly landmarks: Partial<Record<TemplateClusterLandmarkType, TemplateClusterLandmarkProfile>>;
51
+ readonly siblingClusterKeys: readonly string[];
52
+ }
53
+ /**
54
+ * The human-facing name of one template cluster, as stored in
55
+ * `page_template_labels`: rendered as `<section> template <letter>` (or
56
+ * `template <letter>` when `section` is `null`), where the letter is
57
+ * `ordinal` in A, B, …, Z, AA, AB, … form. Assigned by
58
+ * {@link import('./assign-template-labels.js').assignTemplateLabels}.
59
+ */
60
+ export interface TemplateLabel {
61
+ /**
62
+ * The top-level URL directory every member page sits under (`events` for
63
+ * `/events/...`), or `null` when members span several directories or all
64
+ * sit at the site root — the label is then numbered site-wide.
65
+ */
66
+ readonly section: string | null;
67
+ /** 1-based position within `section`'s label sequence. */
68
+ readonly ordinal: number;
69
+ }
70
+ /** One cluster's membership as {@link import('./assign-template-labels.js').assignTemplateLabels} sees it. */
71
+ export interface TemplateLabelClusterInput {
72
+ /** Resolved `content_items.id` of every member page. */
73
+ readonly pageIds: readonly number[];
74
+ /** URL of every member page, for deriving {@link TemplateLabel.section}. */
75
+ readonly urls: readonly string[];
76
+ }
77
+ /**
78
+ * Params for {@link import('./assign-template-labels.js').assignTemplateLabels}.
79
+ */
80
+ export interface AssignTemplateLabelsParams {
81
+ /** The new classification: template key → members. */
82
+ readonly clusters: ReadonlyMap<string, TemplateLabelClusterInput>;
83
+ /**
84
+ * The previous classification's `page_templates` rows: template key →
85
+ * member page ids. Empty on a first run.
86
+ */
87
+ readonly previousMembership: ReadonlyMap<string, readonly number[]>;
88
+ /** The previous classification's `page_template_labels` rows. Empty on a first run. */
89
+ readonly previousLabels: ReadonlyMap<string, TemplateLabel>;
90
+ }
91
+ /**
92
+ * Params for {@link import('./replace-page-templates.js').replacePageTemplates}.
93
+ */
94
+ export interface ReplacePageTemplatesParams {
95
+ /** Page URL → template key, as produced by `classifyPageTemplates`. */
96
+ readonly templateKeysByUrl: ReadonlyMap<string, string>;
97
+ /**
98
+ * Template key → page-cluster's cluster-selection evidence for
99
+ * that key, as produced by `classifyPageTemplates`. Omitted entirely (not
100
+ * just empty) when the caller didn't request reasons.
101
+ */
102
+ readonly clusterReasonsByTemplateKey?: ReadonlyMap<string, TemplateClusterReason>;
103
+ }
@@ -0,0 +1 @@
1
+ export {};
package/lib/debug.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ /** Debug logger for the archive package. Namespace: `Nitpicker:Utils:Archive`. */
2
+ export declare const log: import("debug").Debugger;
3
+ /** Debug logger for archive save operations. Namespace: `Nitpicker:Utils:Archive:Save`. */
4
+ export declare const saveLog: import("debug").Debugger;
5
+ /** Debug logger for database operations. Namespace: `Nitpicker:Utils:Archive:DB`. */
6
+ export declare const dbLog: import("debug").Debugger;
7
+ /** Debug logger for archive errors. Namespace: `Nitpicker:Utils:Archive:Error`. */
8
+ export declare const errorLog: import("debug").Debugger;
package/lib/debug.js ADDED
@@ -0,0 +1,9 @@
1
+ import { log as globalLog } from './utils/debug.js';
2
+ /** Debug logger for the archive package. Namespace: `Nitpicker:Utils:Archive`. */
3
+ export const log = globalLog.extend('Archive');
4
+ /** Debug logger for archive save operations. Namespace: `Nitpicker:Utils:Archive:Save`. */
5
+ export const saveLog = log.extend('Save');
6
+ /** Debug logger for database operations. Namespace: `Nitpicker:Utils:Archive:DB`. */
7
+ export const dbLog = log.extend('DB');
8
+ /** Debug logger for archive errors. Namespace: `Nitpicker:Utils:Archive:Error`. */
9
+ export const errorLog = log.extend('Error');
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Decodes a stored HTML body BLOB according to its codec marker. The codec
3
+ * column on `page_html_blobs` records which encoding was applied at write
4
+ * time so individual rows can be migrated to a different compression without
5
+ * a table-wide rewrite.
6
+ *
7
+ * Decodes the bytes alone, so an error names no row; a reader that knows the
8
+ * page (`getHtmlOfPageById`, the 0.13 migration's `populate-image-items.ts`)
9
+ * decodes through `decodePageHtmlBlobBytes` instead, which names the page and
10
+ * the blob hash.
11
+ * @param body - Raw bytes as stored in `page_html_blobs.body`.
12
+ * @param codec - The `codec` column value (e.g. `'zstd'`, `'none'`).
13
+ * @returns The decoded HTML string.
14
+ * @throws {Error} If the codec is not recognised, or a zstd blob decompresses past `MAX_DECODED_SNAPSHOT_BYTES`.
15
+ * @example
16
+ * ```ts
17
+ * const html = decodeStoredBlob(row.body, row.codec);
18
+ * ```
19
+ */
20
+ export declare function decodeStoredBlob(body: Uint8Array, codec: string): string;
@@ -0,0 +1,23 @@
1
+ import { decodeStoredBlobBytes } from './decode-stored-blob-bytes.js';
2
+ /**
3
+ * Decodes a stored HTML body BLOB according to its codec marker. The codec
4
+ * column on `page_html_blobs` records which encoding was applied at write
5
+ * time so individual rows can be migrated to a different compression without
6
+ * a table-wide rewrite.
7
+ *
8
+ * Decodes the bytes alone, so an error names no row; a reader that knows the
9
+ * page (`getHtmlOfPageById`, the 0.13 migration's `populate-image-items.ts`)
10
+ * decodes through `decodePageHtmlBlobBytes` instead, which names the page and
11
+ * the blob hash.
12
+ * @param body - Raw bytes as stored in `page_html_blobs.body`.
13
+ * @param codec - The `codec` column value (e.g. `'zstd'`, `'none'`).
14
+ * @returns The decoded HTML string.
15
+ * @throws {Error} If the codec is not recognised, or a zstd blob decompresses past `MAX_DECODED_SNAPSHOT_BYTES`.
16
+ * @example
17
+ * ```ts
18
+ * const html = decodeStoredBlob(row.body, row.codec);
19
+ * ```
20
+ */
21
+ export function decodeStoredBlob(body, codec) {
22
+ return decodeStoredBlobBytes(body, codec).toString('utf8');
23
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Decodes a page's stored HTML snapshot to its UTF-8 bytes, as
3
+ * {@link decodeStoredBlobBytes} does, naming the page and the blob when it
4
+ * cannot be decoded (corrupt zstd data, a zstd blob that decompresses past
5
+ * `MAX_DECODED_SNAPSHOT_BYTES`, or an unknown codec). The decoder sees only
6
+ * the bytes, so without the page and hash its error points at no row.
7
+ * @param row - The page and the `page_html_blobs` row it references.
8
+ * @param row.pageId - The page's id.
9
+ * @param row.hash - `page_html_blobs.hash`.
10
+ * @param row.body - `page_html_blobs.body`.
11
+ * @param row.codec - `page_html_blobs.codec`.
12
+ * @returns The HTML as UTF-8 bytes.
13
+ * @throws {Error} `HTML snapshot of page <id> (page_html_blobs hash <hex>) could not be decoded: <reason>`,
14
+ * with the decoder's error as its `cause`.
15
+ * @example
16
+ * ```ts
17
+ * const html = decodePageHtmlBlobBytes({ pageId, hash, body, codec }).toString('utf8');
18
+ * ```
19
+ */
20
+ export declare function decodePageHtmlBlobBytes(row: {
21
+ readonly pageId: number;
22
+ readonly hash: Uint8Array;
23
+ readonly body: Uint8Array;
24
+ readonly codec: string;
25
+ }): Buffer;
@@ -0,0 +1,29 @@
1
+ import { decodeStoredBlobBytes } from './decode-stored-blob-bytes.js';
2
+ /**
3
+ * Decodes a page's stored HTML snapshot to its UTF-8 bytes, as
4
+ * {@link decodeStoredBlobBytes} does, naming the page and the blob when it
5
+ * cannot be decoded (corrupt zstd data, a zstd blob that decompresses past
6
+ * `MAX_DECODED_SNAPSHOT_BYTES`, or an unknown codec). The decoder sees only
7
+ * the bytes, so without the page and hash its error points at no row.
8
+ * @param row - The page and the `page_html_blobs` row it references.
9
+ * @param row.pageId - The page's id.
10
+ * @param row.hash - `page_html_blobs.hash`.
11
+ * @param row.body - `page_html_blobs.body`.
12
+ * @param row.codec - `page_html_blobs.codec`.
13
+ * @returns The HTML as UTF-8 bytes.
14
+ * @throws {Error} `HTML snapshot of page <id> (page_html_blobs hash <hex>) could not be decoded: <reason>`,
15
+ * with the decoder's error as its `cause`.
16
+ * @example
17
+ * ```ts
18
+ * const html = decodePageHtmlBlobBytes({ pageId, hash, body, codec }).toString('utf8');
19
+ * ```
20
+ */
21
+ export function decodePageHtmlBlobBytes(row) {
22
+ try {
23
+ return decodeStoredBlobBytes(row.body, row.codec);
24
+ }
25
+ catch (error) {
26
+ const reason = error instanceof Error ? error.message : String(error);
27
+ throw new Error(`HTML snapshot of page ${row.pageId} (page_html_blobs hash ${Buffer.from(row.hash).toString('hex')}) could not be decoded: ${reason}`, { cause: error });
28
+ }
29
+ }