@nitpicker/archive 0.0.0-stage → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (737) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +105 -2
  3. package/lib/apply-connection-pragmas.d.ts +18 -0
  4. package/lib/apply-connection-pragmas.js +40 -0
  5. package/lib/archive-accessor.d.ts +265 -0
  6. package/lib/archive-accessor.js +477 -0
  7. package/lib/archive-lock.d.ts +45 -0
  8. package/lib/archive-lock.js +154 -0
  9. package/lib/archive.d.ts +736 -0
  10. package/lib/archive.js +1056 -0
  11. package/lib/body-hash/compute-body-hash.d.ts +32 -0
  12. package/lib/body-hash/compute-body-hash.js +35 -0
  13. package/lib/cache/clear-archive-cache-entry.d.ts +18 -0
  14. package/lib/cache/clear-archive-cache-entry.js +24 -0
  15. package/lib/cache/clear-archive-cache-root.d.ts +26 -0
  16. package/lib/cache/clear-archive-cache-root.js +32 -0
  17. package/lib/cache/compute-archive-cache-key.d.ts +39 -0
  18. package/lib/cache/compute-archive-cache-key.js +95 -0
  19. package/lib/cache/extract-archive-to-cache.d.ts +57 -0
  20. package/lib/cache/extract-archive-to-cache.js +326 -0
  21. package/lib/cache/get-archive-cache-root.d.ts +20 -0
  22. package/lib/cache/get-archive-cache-root.js +53 -0
  23. package/lib/cache/is-archive-cache-disabled.d.ts +24 -0
  24. package/lib/cache/is-archive-cache-disabled.js +34 -0
  25. package/lib/cache/list-archive-cache-entries.d.ts +23 -0
  26. package/lib/cache/list-archive-cache-entries.js +130 -0
  27. package/lib/cache/path-exists.d.ts +9 -0
  28. package/lib/cache/path-exists.js +18 -0
  29. package/lib/cache/resolve-archive-cache-dir.d.ts +26 -0
  30. package/lib/cache/resolve-archive-cache-dir.js +32 -0
  31. package/lib/cache/types.d.ts +33 -0
  32. package/lib/cache/types.js +1 -0
  33. package/lib/content-type/is-html-content-type.d.ts +17 -0
  34. package/lib/content-type/is-html-content-type.js +19 -0
  35. package/lib/content-type/normalize-content-type.d.ts +14 -0
  36. package/lib/content-type/normalize-content-type.js +20 -0
  37. package/lib/create-adjunct-tables.d.ts +66 -0
  38. package/lib/create-adjunct-tables.js +510 -0
  39. package/lib/create-entity-tables.d.ts +191 -0
  40. package/lib/create-entity-tables.js +387 -0
  41. package/lib/create-progress-reporter.d.ts +30 -0
  42. package/lib/create-progress-reporter.js +38 -0
  43. package/lib/create-ref-tables.d.ts +35 -0
  44. package/lib/create-ref-tables.js +185 -0
  45. package/lib/create-template-tables.d.ts +28 -0
  46. package/lib/create-template-tables.js +92 -0
  47. package/lib/database.d.ts +549 -0
  48. package/lib/database.js +804 -0
  49. package/lib/db-ops/_shared/clear-write-ref-caches.d.ts +27 -0
  50. package/lib/db-ops/_shared/clear-write-ref-caches.js +35 -0
  51. package/lib/db-ops/_shared/compress-payload.d.ts +26 -0
  52. package/lib/db-ops/_shared/compress-payload.js +30 -0
  53. package/lib/db-ops/_shared/create-write-ref-caches.d.ts +17 -0
  54. package/lib/db-ops/_shared/create-write-ref-caches.js +27 -0
  55. package/lib/db-ops/_shared/decode-json-ref.d.ts +17 -0
  56. package/lib/db-ops/_shared/decode-json-ref.js +31 -0
  57. package/lib/db-ops/_shared/keyset-paginate-by-id.d.ts +49 -0
  58. package/lib/db-ops/_shared/keyset-paginate-by-id.js +69 -0
  59. package/lib/db-ops/_shared/load-response-headers-by-set-ids.d.ts +20 -0
  60. package/lib/db-ops/_shared/load-response-headers-by-set-ids.js +53 -0
  61. package/lib/db-ops/_shared/resolve-content-item-id.d.ts +62 -0
  62. package/lib/db-ops/_shared/resolve-content-item-id.js +143 -0
  63. package/lib/db-ops/_shared/resolve-url-or-blob.d.ts +23 -0
  64. package/lib/db-ops/_shared/resolve-url-or-blob.js +29 -0
  65. package/lib/db-ops/_shared/retry-setting.d.ts +16 -0
  66. package/lib/db-ops/_shared/retry-setting.js +18 -0
  67. package/lib/db-ops/_shared/safe-parse-json.d.ts +11 -0
  68. package/lib/db-ops/_shared/safe-parse-json.js +18 -0
  69. package/lib/db-ops/_shared/types.d.ts +94 -0
  70. package/lib/db-ops/_shared/types.js +1 -0
  71. package/lib/db-ops/_shared/upsert-blob-ref.d.ts +25 -0
  72. package/lib/db-ops/_shared/upsert-blob-ref.js +48 -0
  73. package/lib/db-ops/_shared/upsert-content-type-ref.d.ts +30 -0
  74. package/lib/db-ops/_shared/upsert-content-type-ref.js +45 -0
  75. package/lib/db-ops/_shared/upsert-json-ref.d.ts +22 -0
  76. package/lib/db-ops/_shared/upsert-json-ref.js +41 -0
  77. package/lib/db-ops/_shared/upsert-response-headers.d.ts +35 -0
  78. package/lib/db-ops/_shared/upsert-response-headers.js +49 -0
  79. package/lib/db-ops/_shared/upsert-url-ref.d.ts +39 -0
  80. package/lib/db-ops/_shared/upsert-url-ref.js +62 -0
  81. package/lib/db-ops/anchors/get-anchors-on-page.d.ts +10 -0
  82. package/lib/db-ops/anchors/get-anchors-on-page.js +21 -0
  83. package/lib/db-ops/config/get-base-url.d.ts +8 -0
  84. package/lib/db-ops/config/get-base-url.js +14 -0
  85. package/lib/db-ops/config/get-config.d.ts +10 -0
  86. package/lib/db-ops/config/get-config.js +29 -0
  87. package/lib/db-ops/config/get-created-cwd.d.ts +11 -0
  88. package/lib/db-ops/config/get-created-cwd.js +13 -0
  89. package/lib/db-ops/config/get-name.d.ts +8 -0
  90. package/lib/db-ops/config/get-name.js +14 -0
  91. package/lib/db-ops/config/info-column-allowlist.d.ts +7 -0
  92. package/lib/db-ops/config/info-column-allowlist.js +29 -0
  93. package/lib/db-ops/config/info-json-columns.d.ts +5 -0
  94. package/lib/db-ops/config/info-json-columns.js +11 -0
  95. package/lib/db-ops/config/set-config.d.ts +12 -0
  96. package/lib/db-ops/config/set-config.js +21 -0
  97. package/lib/db-ops/config/update-config.d.ts +17 -0
  98. package/lib/db-ops/config/update-config.js +36 -0
  99. package/lib/db-ops/console-logs/compute-console-log-hash.d.ts +19 -0
  100. package/lib/db-ops/console-logs/compute-console-log-hash.js +30 -0
  101. package/lib/db-ops/console-logs/replace-console-logs.d.ts +34 -0
  102. package/lib/db-ops/console-logs/replace-console-logs.js +123 -0
  103. package/lib/db-ops/console-logs/stringify-console-log-args.d.ts +16 -0
  104. package/lib/db-ops/console-logs/stringify-console-log-args.js +26 -0
  105. package/lib/db-ops/console-logs/types.d.ts +38 -0
  106. package/lib/db-ops/console-logs/types.js +1 -0
  107. package/lib/db-ops/console-logs/upsert-console-log-item.d.ts +29 -0
  108. package/lib/db-ops/console-logs/upsert-console-log-item.js +52 -0
  109. package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.d.ts +18 -0
  110. package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.js +23 -0
  111. package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.d.ts +12 -0
  112. package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.js +15 -0
  113. package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.d.ts +14 -0
  114. package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.js +30 -0
  115. package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.d.ts +57 -0
  116. package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.js +87 -0
  117. package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.d.ts +21 -0
  118. package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.js +27 -0
  119. package/lib/db-ops/errors/insert-crawl-error.d.ts +15 -0
  120. package/lib/db-ops/errors/insert-crawl-error.js +21 -0
  121. package/lib/db-ops/errors/insert-page-error.d.ts +21 -0
  122. package/lib/db-ops/errors/insert-page-error.js +30 -0
  123. package/lib/db-ops/errors/list-dns-burned-host-candidates.d.ts +33 -0
  124. package/lib/db-ops/errors/list-dns-burned-host-candidates.js +158 -0
  125. package/lib/db-ops/html/read-page-html-blob.d.ts +17 -0
  126. package/lib/db-ops/html/read-page-html-blob.js +20 -0
  127. package/lib/db-ops/lifecycle/checkpoint.d.ts +8 -0
  128. package/lib/db-ops/lifecycle/checkpoint.js +9 -0
  129. package/lib/db-ops/lifecycle/destroy.d.ts +6 -0
  130. package/lib/db-ops/lifecycle/destroy.js +7 -0
  131. package/lib/db-ops/lifecycle/init.d.ts +58 -0
  132. package/lib/db-ops/lifecycle/init.js +122 -0
  133. package/lib/db-ops/list-reconcile/record-list-reconcile-run.d.ts +22 -0
  134. package/lib/db-ops/list-reconcile/record-list-reconcile-run.js +41 -0
  135. package/lib/db-ops/meta/get-audios-of-page.d.ts +11 -0
  136. package/lib/db-ops/meta/get-audios-of-page.js +15 -0
  137. package/lib/db-ops/meta/get-buttons-of-page.d.ts +11 -0
  138. package/lib/db-ops/meta/get-buttons-of-page.js +15 -0
  139. package/lib/db-ops/meta/get-canvases-of-page.d.ts +11 -0
  140. package/lib/db-ops/meta/get-canvases-of-page.js +15 -0
  141. package/lib/db-ops/meta/get-custom-elements-of-page.d.ts +11 -0
  142. package/lib/db-ops/meta/get-custom-elements-of-page.js +15 -0
  143. package/lib/db-ops/meta/get-headings-of-page.d.ts +11 -0
  144. package/lib/db-ops/meta/get-headings-of-page.js +15 -0
  145. package/lib/db-ops/meta/get-iframes-of-page.d.ts +11 -0
  146. package/lib/db-ops/meta/get-iframes-of-page.js +15 -0
  147. package/lib/db-ops/meta/get-jsonld-of-page.d.ts +13 -0
  148. package/lib/db-ops/meta/get-jsonld-of-page.js +27 -0
  149. package/lib/db-ops/meta/get-main-content-images-of-page.d.ts +11 -0
  150. package/lib/db-ops/meta/get-main-content-images-of-page.js +15 -0
  151. package/lib/db-ops/meta/get-main-content-tables-of-page.d.ts +11 -0
  152. package/lib/db-ops/meta/get-main-content-tables-of-page.js +15 -0
  153. package/lib/db-ops/meta/get-page-technologies-of-page.d.ts +11 -0
  154. package/lib/db-ops/meta/get-page-technologies-of-page.js +15 -0
  155. package/lib/db-ops/meta/get-technology-signals-of-page.d.ts +11 -0
  156. package/lib/db-ops/meta/get-technology-signals-of-page.js +15 -0
  157. package/lib/db-ops/meta/get-videos-of-page.d.ts +11 -0
  158. package/lib/db-ops/meta/get-videos-of-page.js +15 -0
  159. package/lib/db-ops/outages/close-network-outage.d.ts +12 -0
  160. package/lib/db-ops/outages/close-network-outage.js +15 -0
  161. package/lib/db-ops/outages/close-stale-open-network-outages.d.ts +26 -0
  162. package/lib/db-ops/outages/close-stale-open-network-outages.js +42 -0
  163. package/lib/db-ops/outages/compute-outage-clamp-timestamp.d.ts +26 -0
  164. package/lib/db-ops/outages/compute-outage-clamp-timestamp.js +31 -0
  165. package/lib/db-ops/outages/insert-network-outage.d.ts +14 -0
  166. package/lib/db-ops/outages/insert-network-outage.js +29 -0
  167. package/lib/db-ops/outages/list-network-outages.d.ts +28 -0
  168. package/lib/db-ops/outages/list-network-outages.js +42 -0
  169. package/lib/db-ops/pages/order/set-url-order.d.ts +13 -0
  170. package/lib/db-ops/pages/order/set-url-order.js +38 -0
  171. package/lib/db-ops/pages/read/build-page-query.d.ts +18 -0
  172. package/lib/db-ops/pages/read/build-page-query.js +40 -0
  173. package/lib/db-ops/pages/read/get-crawling-state.d.ts +117 -0
  174. package/lib/db-ops/pages/read/get-crawling-state.js +161 -0
  175. package/lib/db-ops/pages/read/get-existing-page-urls.d.ts +15 -0
  176. package/lib/db-ops/pages/read/get-existing-page-urls.js +30 -0
  177. package/lib/db-ops/pages/read/get-page-count.d.ts +12 -0
  178. package/lib/db-ops/pages/read/get-page-count.js +21 -0
  179. package/lib/db-ops/pages/read/get-page-source-by-url.d.ts +24 -0
  180. package/lib/db-ops/pages/read/get-page-source-by-url.js +28 -0
  181. package/lib/db-ops/pages/read/get-pages-with-rels.d.ts +38 -0
  182. package/lib/db-ops/pages/read/get-pages-with-rels.js +107 -0
  183. package/lib/db-ops/pages/read/get-pages.d.ts +11 -0
  184. package/lib/db-ops/pages/read/get-pages.js +51 -0
  185. package/lib/db-ops/pages/read/get-scraped-html-page-count.d.ts +18 -0
  186. package/lib/db-ops/pages/read/get-scraped-html-page-count.js +25 -0
  187. package/lib/db-ops/pages/read/reconstruct-page-rows.d.ts +31 -0
  188. package/lib/db-ops/pages/read/reconstruct-page-rows.js +32 -0
  189. package/lib/db-ops/pages/reset/clear-page-derived-rows.d.ts +20 -0
  190. package/lib/db-ops/pages/reset/clear-page-derived-rows.js +37 -0
  191. package/lib/db-ops/pages/reset/repromote-external-pages.d.ts +30 -0
  192. package/lib/db-ops/pages/reset/repromote-external-pages.js +91 -0
  193. package/lib/db-ops/pages/reset/reset-failed-pages.d.ts +88 -0
  194. package/lib/db-ops/pages/reset/reset-failed-pages.js +216 -0
  195. package/lib/db-ops/pages/reset/reset-pages-by-urls.d.ts +80 -0
  196. package/lib/db-ops/pages/reset/reset-pages-by-urls.js +151 -0
  197. package/lib/db-ops/pages/reset/retryable-image-scan-codes.d.ts +24 -0
  198. package/lib/db-ops/pages/reset/retryable-image-scan-codes.js +24 -0
  199. package/lib/db-ops/pages/write/insert-audios.d.ts +14 -0
  200. package/lib/db-ops/pages/write/insert-audios.js +25 -0
  201. package/lib/db-ops/pages/write/insert-buttons.d.ts +14 -0
  202. package/lib/db-ops/pages/write/insert-buttons.js +29 -0
  203. package/lib/db-ops/pages/write/insert-canvases.d.ts +14 -0
  204. package/lib/db-ops/pages/write/insert-canvases.js +26 -0
  205. package/lib/db-ops/pages/write/insert-custom-elements.d.ts +27 -0
  206. package/lib/db-ops/pages/write/insert-custom-elements.js +40 -0
  207. package/lib/db-ops/pages/write/insert-headings.d.ts +15 -0
  208. package/lib/db-ops/pages/write/insert-headings.js +27 -0
  209. package/lib/db-ops/pages/write/insert-iframes.d.ts +14 -0
  210. package/lib/db-ops/pages/write/insert-iframes.js +28 -0
  211. package/lib/db-ops/pages/write/insert-inventory-content-items.d.ts +38 -0
  212. package/lib/db-ops/pages/write/insert-inventory-content-items.js +60 -0
  213. package/lib/db-ops/pages/write/insert-inventory-seeds.d.ts +36 -0
  214. package/lib/db-ops/pages/write/insert-inventory-seeds.js +48 -0
  215. package/lib/db-ops/pages/write/insert-inventory-skipped-pages.d.ts +42 -0
  216. package/lib/db-ops/pages/write/insert-inventory-skipped-pages.js +56 -0
  217. package/lib/db-ops/pages/write/insert-jsonld.d.ts +17 -0
  218. package/lib/db-ops/pages/write/insert-jsonld.js +49 -0
  219. package/lib/db-ops/pages/write/insert-main-content-images.d.ts +20 -0
  220. package/lib/db-ops/pages/write/insert-main-content-images.js +32 -0
  221. package/lib/db-ops/pages/write/insert-main-content-tables.d.ts +14 -0
  222. package/lib/db-ops/pages/write/insert-main-content-tables.js +29 -0
  223. package/lib/db-ops/pages/write/insert-page.d.ts +56 -0
  224. package/lib/db-ops/pages/write/insert-page.js +259 -0
  225. package/lib/db-ops/pages/write/insert-technologies.d.ts +25 -0
  226. package/lib/db-ops/pages/write/insert-technologies.js +45 -0
  227. package/lib/db-ops/pages/write/insert-videos.d.ts +14 -0
  228. package/lib/db-ops/pages/write/insert-videos.js +28 -0
  229. package/lib/db-ops/pages/write/link-redirect-sources.d.ts +42 -0
  230. package/lib/db-ops/pages/write/link-redirect-sources.js +101 -0
  231. package/lib/db-ops/pages/write/record-redirect.d.ts +35 -0
  232. package/lib/db-ops/pages/write/record-redirect.js +100 -0
  233. package/lib/db-ops/pages/write/set-skipped-page.d.ts +13 -0
  234. package/lib/db-ops/pages/write/set-skipped-page.js +24 -0
  235. package/lib/db-ops/pages/write/update-page.d.ts +40 -0
  236. package/lib/db-ops/pages/write/update-page.js +419 -0
  237. package/lib/db-ops/pages/write/write-page-html-blob.d.ts +19 -0
  238. package/lib/db-ops/pages/write/write-page-html-blob.js +41 -0
  239. package/lib/db-ops/referrers/get-redirects-for-pages.d.ts +9 -0
  240. package/lib/db-ops/referrers/get-redirects-for-pages.js +15 -0
  241. package/lib/db-ops/referrers/get-referrers-of-page.d.ts +17 -0
  242. package/lib/db-ops/referrers/get-referrers-of-page.js +32 -0
  243. package/lib/db-ops/referrers/get-referrers-of-resource.d.ts +8 -0
  244. package/lib/db-ops/referrers/get-referrers-of-resource.js +15 -0
  245. package/lib/db-ops/resources/build-resource-query.d.ts +25 -0
  246. package/lib/db-ops/resources/build-resource-query.js +29 -0
  247. package/lib/db-ops/resources/get-existing-resource-urls.d.ts +9 -0
  248. package/lib/db-ops/resources/get-existing-resource-urls.js +24 -0
  249. package/lib/db-ops/resources/get-resource-by-url.d.ts +13 -0
  250. package/lib/db-ops/resources/get-resource-by-url.js +22 -0
  251. package/lib/db-ops/resources/get-resource-url-list.d.ts +17 -0
  252. package/lib/db-ops/resources/get-resource-url-list.js +26 -0
  253. package/lib/db-ops/resources/get-resources.d.ts +8 -0
  254. package/lib/db-ops/resources/get-resources.js +11 -0
  255. package/lib/db-ops/resources/insert-inventory-resources.d.ts +24 -0
  256. package/lib/db-ops/resources/insert-inventory-resources.js +64 -0
  257. package/lib/db-ops/resources/insert-resource-referrers.d.ts +15 -0
  258. package/lib/db-ops/resources/insert-resource-referrers.js +54 -0
  259. package/lib/db-ops/resources/insert-resource.d.ts +34 -0
  260. package/lib/db-ops/resources/insert-resource.js +73 -0
  261. package/lib/db-ops/resources/reconstruct-resource-rows.d.ts +26 -0
  262. package/lib/db-ops/resources/reconstruct-resource-rows.js +30 -0
  263. package/lib/db-ops/templates/assign-template-labels.d.ts +60 -0
  264. package/lib/db-ops/templates/assign-template-labels.js +187 -0
  265. package/lib/db-ops/templates/replace-page-templates.d.ts +44 -0
  266. package/lib/db-ops/templates/replace-page-templates.js +174 -0
  267. package/lib/db-ops/templates/serialize-template-cluster-reason.d.ts +16 -0
  268. package/lib/db-ops/templates/serialize-template-cluster-reason.js +17 -0
  269. package/lib/db-ops/templates/types.d.ts +103 -0
  270. package/lib/db-ops/templates/types.js +1 -0
  271. package/lib/debug.d.ts +8 -0
  272. package/lib/debug.js +9 -0
  273. package/lib/decode-html-blob.d.ts +20 -0
  274. package/lib/decode-html-blob.js +23 -0
  275. package/lib/decode-page-html-blob-bytes.d.ts +25 -0
  276. package/lib/decode-page-html-blob-bytes.js +29 -0
  277. package/lib/decode-stored-blob-bytes.d.ts +25 -0
  278. package/lib/decode-stored-blob-bytes.js +47 -0
  279. package/lib/derive-lineage-from-parent.d.ts +37 -0
  280. package/lib/derive-lineage-from-parent.js +42 -0
  281. package/lib/drop-legacy-tables.d.ts +45 -0
  282. package/lib/drop-legacy-tables.js +56 -0
  283. package/lib/error-kind/classify-error-kind.d.ts +20 -0
  284. package/lib/error-kind/classify-error-kind.js +136 -0
  285. package/lib/error-kind/network-related-error-kinds.d.ts +23 -0
  286. package/lib/error-kind/network-related-error-kinds.js +28 -0
  287. package/lib/error-kind/permanent-error-kinds.d.ts +48 -0
  288. package/lib/error-kind/permanent-error-kinds.js +54 -0
  289. package/lib/error-kind/types.d.ts +54 -0
  290. package/lib/error-kind/types.js +1 -0
  291. package/lib/filesystem/append-text.d.ts +9 -0
  292. package/lib/filesystem/append-text.js +14 -0
  293. package/lib/filesystem/copy-dir-sync.d.ts +6 -0
  294. package/lib/filesystem/copy-dir-sync.js +9 -0
  295. package/lib/filesystem/copy-dir.d.ts +7 -0
  296. package/lib/filesystem/copy-dir.js +13 -0
  297. package/lib/filesystem/copy-file-with-progress.d.ts +20 -0
  298. package/lib/filesystem/copy-file-with-progress.js +34 -0
  299. package/lib/filesystem/exists.d.ts +6 -0
  300. package/lib/filesystem/exists.js +9 -0
  301. package/lib/filesystem/get-file-list.d.ts +8 -0
  302. package/lib/filesystem/get-file-list.js +12 -0
  303. package/lib/filesystem/is-dir.d.ts +6 -0
  304. package/lib/filesystem/is-dir.js +10 -0
  305. package/lib/filesystem/mkdir.d.ts +8 -0
  306. package/lib/filesystem/mkdir.js +15 -0
  307. package/lib/filesystem/output-binary.d.ts +12 -0
  308. package/lib/filesystem/output-binary.js +17 -0
  309. package/lib/filesystem/output-json.d.ts +9 -0
  310. package/lib/filesystem/output-json.js +14 -0
  311. package/lib/filesystem/output-text.d.ts +11 -0
  312. package/lib/filesystem/output-text.js +32 -0
  313. package/lib/filesystem/parse-pax-path.d.ts +18 -0
  314. package/lib/filesystem/parse-pax-path.js +47 -0
  315. package/lib/filesystem/parse-tar-size-field.d.ts +13 -0
  316. package/lib/filesystem/parse-tar-size-field.js +40 -0
  317. package/lib/filesystem/peek-tar-top-dir.d.ts +35 -0
  318. package/lib/filesystem/peek-tar-top-dir.js +215 -0
  319. package/lib/filesystem/read-json.d.ts +7 -0
  320. package/lib/filesystem/read-json.js +11 -0
  321. package/lib/filesystem/read-text.d.ts +6 -0
  322. package/lib/filesystem/read-text.js +10 -0
  323. package/lib/filesystem/readline.d.ts +11 -0
  324. package/lib/filesystem/readline.js +26 -0
  325. package/lib/filesystem/remove.d.ts +5 -0
  326. package/lib/filesystem/remove.js +10 -0
  327. package/lib/filesystem/rename.d.ts +16 -0
  328. package/lib/filesystem/rename.js +48 -0
  329. package/lib/filesystem/tar.d.ts +23 -0
  330. package/lib/filesystem/tar.js +78 -0
  331. package/lib/filesystem/untar.d.ts +33 -0
  332. package/lib/filesystem/untar.js +84 -0
  333. package/lib/get-failed-page-messages.d.ts +56 -0
  334. package/lib/get-failed-page-messages.js +146 -0
  335. package/lib/get-json.d.ts +10 -0
  336. package/lib/get-json.js +25 -0
  337. package/lib/html-snapshot/match-selector-html.d.ts +25 -0
  338. package/lib/html-snapshot/match-selector-html.js +28 -0
  339. package/lib/html-snapshot/match-selector-snapshots.d.ts +33 -0
  340. package/lib/html-snapshot/match-selector-snapshots.js +33 -0
  341. package/lib/html-snapshot/search-html-document.d.ts +29 -0
  342. package/lib/html-snapshot/search-html-document.js +27 -0
  343. package/lib/html-snapshot/search-html-snapshots.d.ts +36 -0
  344. package/lib/html-snapshot/search-html-snapshots.js +35 -0
  345. package/lib/html-snapshot/types.d.ts +111 -0
  346. package/lib/html-snapshot/types.js +7 -0
  347. package/lib/html-snapshot/validate-search-pattern.d.ts +15 -0
  348. package/lib/html-snapshot/validate-search-pattern.js +17 -0
  349. package/lib/init-schema.d.ts +48 -0
  350. package/lib/init-schema.js +124 -0
  351. package/lib/is-inventory-source.d.ts +21 -0
  352. package/lib/is-inventory-source.js +22 -0
  353. package/lib/is-within-outage-window.d.ts +49 -0
  354. package/lib/is-within-outage-window.js +33 -0
  355. package/lib/isolated-cluster/create-isolated-cluster-run.d.ts +24 -0
  356. package/lib/isolated-cluster/create-isolated-cluster-run.js +26 -0
  357. package/lib/libsql-dialect.d.ts +115 -0
  358. package/lib/libsql-dialect.js +116 -0
  359. package/lib/limited-page-ids.d.ts +9 -0
  360. package/lib/limited-page-ids.js +18 -0
  361. package/lib/meta/assert-compatible-version.d.ts +60 -0
  362. package/lib/meta/assert-compatible-version.js +93 -0
  363. package/lib/meta/classify-jsonld-type.d.ts +23 -0
  364. package/lib/meta/classify-jsonld-type.js +43 -0
  365. package/lib/meta/compare-semver.d.ts +23 -0
  366. package/lib/meta/compare-semver.js +51 -0
  367. package/lib/meta/compute-main-contents-denormalized.d.ts +41 -0
  368. package/lib/meta/compute-main-contents-denormalized.js +88 -0
  369. package/lib/meta/compute-page-denormalized.d.ts +20 -0
  370. package/lib/meta/compute-page-denormalized.js +35 -0
  371. package/lib/meta/derive-flat-from-meta.d.ts +34 -0
  372. package/lib/meta/derive-flat-from-meta.js +158 -0
  373. package/lib/meta/derive-meta-extras.d.ts +20 -0
  374. package/lib/meta/derive-meta-extras.js +23 -0
  375. package/lib/meta/extract-tags-for-archive.d.ts +17 -0
  376. package/lib/meta/extract-tags-for-archive.js +36 -0
  377. package/lib/meta/parse-main-content-class-list.d.ts +19 -0
  378. package/lib/meta/parse-main-content-class-list.js +34 -0
  379. package/lib/meta/summarize-jsonld.d.ts +17 -0
  380. package/lib/meta/summarize-jsonld.js +29 -0
  381. package/lib/meta/technologies/combine-technology-confidence.d.ts +46 -0
  382. package/lib/meta/technologies/combine-technology-confidence.js +93 -0
  383. package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.d.ts +45 -0
  384. package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.js +53 -0
  385. package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.d.ts +33 -0
  386. package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.js +46 -0
  387. package/lib/meta/technologies/extract-technologies-for-archive.d.ts +33 -0
  388. package/lib/meta/technologies/extract-technologies-for-archive.js +30 -0
  389. package/lib/meta/technologies/match-js-license-comment-signal.d.ts +21 -0
  390. package/lib/meta/technologies/match-js-license-comment-signal.js +23 -0
  391. package/lib/meta/technologies/match-structural-technology-signals.d.ts +26 -0
  392. package/lib/meta/technologies/match-structural-technology-signals.js +48 -0
  393. package/lib/meta/technologies/normalize-wappalyzer-entries.d.ts +25 -0
  394. package/lib/meta/technologies/normalize-wappalyzer-entries.js +35 -0
  395. package/lib/meta/technologies/technology-signal-definitions.d.ts +44 -0
  396. package/lib/meta/technologies/technology-signal-definitions.js +60 -0
  397. package/lib/meta/technologies/types.d.ts +70 -0
  398. package/lib/meta/technologies/types.js +13 -0
  399. package/lib/meta/types.d.ts +1490 -0
  400. package/lib/meta/types.js +65 -0
  401. package/lib/migrate-content-items-alias-of-id.d.ts +52 -0
  402. package/lib/migrate-content-items-alias-of-id.js +69 -0
  403. package/lib/migrate-content-items-dedupe-cap-event-id.d.ts +46 -0
  404. package/lib/migrate-content-items-dedupe-cap-event-id.js +62 -0
  405. package/lib/migrate-content-items-is-metadata-only.d.ts +44 -0
  406. package/lib/migrate-content-items-is-metadata-only.js +60 -0
  407. package/lib/migrate-entity-tables.d.ts +55 -0
  408. package/lib/migrate-entity-tables.js +66 -0
  409. package/lib/migrate-info-created-cwd.d.ts +17 -0
  410. package/lib/migrate-info-created-cwd.js +36 -0
  411. package/lib/migrate-info-main-content-selector.d.ts +16 -0
  412. package/lib/migrate-info-main-content-selector.js +35 -0
  413. package/lib/migrate-info-request-header-names.d.ts +16 -0
  414. package/lib/migrate-info-request-header-names.js +35 -0
  415. package/lib/migrate-info-roots.d.ts +20 -0
  416. package/lib/migrate-info-roots.js +52 -0
  417. package/lib/migrate-inventory-runs-to-list-reconcile-runs.d.ts +34 -0
  418. package/lib/migrate-inventory-runs-to-list-reconcile-runs.js +51 -0
  419. package/lib/migrate-list-reconcile-runs-exclude-skipped.d.ts +25 -0
  420. package/lib/migrate-list-reconcile-runs-exclude-skipped.js +44 -0
  421. package/lib/migrate-list-reconcile-runs-invalid-skipped.d.ts +16 -0
  422. package/lib/migrate-list-reconcile-runs-invalid-skipped.js +35 -0
  423. package/lib/migrate-main-contents-columns.d.ts +26 -0
  424. package/lib/migrate-main-contents-columns.js +61 -0
  425. package/lib/migrate-page-meta-body-hash.d.ts +44 -0
  426. package/lib/migrate-page-meta-body-hash.js +63 -0
  427. package/lib/migrate-page-meta-console-error-count.d.ts +27 -0
  428. package/lib/migrate-page-meta-console-error-count.js +45 -0
  429. package/lib/migrate-page-meta-custom-element-count.d.ts +33 -0
  430. package/lib/migrate-page-meta-custom-element-count.js +51 -0
  431. package/lib/migrate-page-meta-image-scan.d.ts +27 -0
  432. package/lib/migrate-page-meta-image-scan.js +52 -0
  433. package/lib/migrate-page-tags-to-page-technologies.d.ts +39 -0
  434. package/lib/migrate-page-tags-to-page-technologies.js +79 -0
  435. package/lib/migrate-ref-tables.d.ts +25 -0
  436. package/lib/migrate-ref-tables.js +38 -0
  437. package/lib/native-executor/check-native-executor-config.d.ts +17 -0
  438. package/lib/native-executor/check-native-executor-config.js +20 -0
  439. package/lib/page-meta-column-maps.d.ts +32 -0
  440. package/lib/page-meta-column-maps.js +43 -0
  441. package/lib/page.d.ts +546 -0
  442. package/lib/page.js +764 -0
  443. package/lib/peek-archive-lock.d.ts +40 -0
  444. package/lib/peek-archive-lock.js +62 -0
  445. package/lib/populate-entity-tables/collapse-anchor-rows.d.ts +41 -0
  446. package/lib/populate-entity-tables/collapse-anchor-rows.js +87 -0
  447. package/lib/populate-entity-tables/derive-dom-path.d.ts +35 -0
  448. package/lib/populate-entity-tables/derive-dom-path.js +72 -0
  449. package/lib/populate-entity-tables/is-blob-ref-value.d.ts +16 -0
  450. package/lib/populate-entity-tables/is-blob-ref-value.js +19 -0
  451. package/lib/populate-entity-tables/match-images-to-dom-paths.d.ts +66 -0
  452. package/lib/populate-entity-tables/match-images-to-dom-paths.js +96 -0
  453. package/lib/populate-entity-tables/populate-anchor-edges.d.ts +33 -0
  454. package/lib/populate-entity-tables/populate-anchor-edges.js +153 -0
  455. package/lib/populate-entity-tables/populate-content-items.d.ts +40 -0
  456. package/lib/populate-entity-tables/populate-content-items.js +141 -0
  457. package/lib/populate-entity-tables/populate-entities.d.ts +81 -0
  458. package/lib/populate-entity-tables/populate-entities.js +110 -0
  459. package/lib/populate-entity-tables/populate-image-items.d.ts +91 -0
  460. package/lib/populate-entity-tables/populate-image-items.js +226 -0
  461. package/lib/populate-entity-tables/populate-page-meta.d.ts +33 -0
  462. package/lib/populate-entity-tables/populate-page-meta.js +267 -0
  463. package/lib/populate-entity-tables/populate-resource-items.d.ts +22 -0
  464. package/lib/populate-entity-tables/populate-resource-items.js +114 -0
  465. package/lib/populate-entity-tables/populate-resource-ref-edges.d.ts +31 -0
  466. package/lib/populate-entity-tables/populate-resource-ref-edges.js +33 -0
  467. package/lib/populate-entity-tables/resolve-blob-refs.d.ts +31 -0
  468. package/lib/populate-entity-tables/resolve-blob-refs.js +100 -0
  469. package/lib/populate-entity-tables/resolve-content-type-refs.d.ts +22 -0
  470. package/lib/populate-entity-tables/resolve-content-type-refs.js +27 -0
  471. package/lib/populate-entity-tables/resolve-header-sets.d.ts +49 -0
  472. package/lib/populate-entity-tables/resolve-header-sets.js +122 -0
  473. package/lib/populate-entity-tables/resolve-json-refs.d.ts +25 -0
  474. package/lib/populate-entity-tables/resolve-json-refs.js +67 -0
  475. package/lib/populate-entity-tables/resolve-text-refs.d.ts +30 -0
  476. package/lib/populate-entity-tables/resolve-text-refs.js +61 -0
  477. package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.d.ts +21 -0
  478. package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.js +27 -0
  479. package/lib/populate-entity-tables/resolve-url-refs.d.ts +33 -0
  480. package/lib/populate-entity-tables/resolve-url-refs.js +60 -0
  481. package/lib/populate-entity-tables/test-utils/count-rows.d.ts +17 -0
  482. package/lib/populate-entity-tables/test-utils/count-rows.js +20 -0
  483. package/lib/populate-entity-tables/test-utils/seed-content-items.d.ts +25 -0
  484. package/lib/populate-entity-tables/test-utils/seed-content-items.js +42 -0
  485. package/lib/populate-entity-tables/test-utils/setup-entities-db.d.ts +30 -0
  486. package/lib/populate-entity-tables/test-utils/setup-entities-db.js +175 -0
  487. package/lib/populate-entity-tables/types.d.ts +157 -0
  488. package/lib/populate-entity-tables/types.js +12 -0
  489. package/lib/populate-entity-tables/upsert-text-refs.d.ts +38 -0
  490. package/lib/populate-entity-tables/upsert-text-refs.js +78 -0
  491. package/lib/populate-ref-tables/classify-content-type.d.ts +16 -0
  492. package/lib/populate-ref-tables/classify-content-type.js +52 -0
  493. package/lib/populate-ref-tables/compute-content-hash.d.ts +22 -0
  494. package/lib/populate-ref-tables/compute-content-hash.js +26 -0
  495. package/lib/populate-ref-tables/compute-header-flags.d.ts +16 -0
  496. package/lib/populate-ref-tables/compute-header-flags.js +70 -0
  497. package/lib/populate-ref-tables/content-type-rules.d.ts +38 -0
  498. package/lib/populate-ref-tables/content-type-rules.js +133 -0
  499. package/lib/populate-ref-tables/create-header-table-caches.d.ts +25 -0
  500. package/lib/populate-ref-tables/create-header-table-caches.js +49 -0
  501. package/lib/populate-ref-tables/data-uri-url-refs-limit.d.ts +15 -0
  502. package/lib/populate-ref-tables/data-uri-url-refs-limit.js +15 -0
  503. package/lib/populate-ref-tables/decode-data-uri.d.ts +21 -0
  504. package/lib/populate-ref-tables/decode-data-uri.js +126 -0
  505. package/lib/populate-ref-tables/decompose-header-set.d.ts +29 -0
  506. package/lib/populate-ref-tables/decompose-header-set.js +157 -0
  507. package/lib/populate-ref-tables/decompose-url.d.ts +25 -0
  508. package/lib/populate-ref-tables/decompose-url.js +70 -0
  509. package/lib/populate-ref-tables/header-stability.d.ts +19 -0
  510. package/lib/populate-ref-tables/header-stability.js +22 -0
  511. package/lib/populate-ref-tables/header-value-cache-key.d.ts +17 -0
  512. package/lib/populate-ref-tables/header-value-cache-key.js +19 -0
  513. package/lib/populate-ref-tables/normalize-mime.d.ts +24 -0
  514. package/lib/populate-ref-tables/normalize-mime.js +36 -0
  515. package/lib/populate-ref-tables/populate-blob-refs.d.ts +38 -0
  516. package/lib/populate-ref-tables/populate-blob-refs.js +134 -0
  517. package/lib/populate-ref-tables/populate-content-type-refs.d.ts +27 -0
  518. package/lib/populate-ref-tables/populate-content-type-refs.js +70 -0
  519. package/lib/populate-ref-tables/populate-header-tables.d.ts +35 -0
  520. package/lib/populate-ref-tables/populate-header-tables.js +80 -0
  521. package/lib/populate-ref-tables/populate-json-refs.d.ts +29 -0
  522. package/lib/populate-ref-tables/populate-json-refs.js +101 -0
  523. package/lib/populate-ref-tables/populate-refs.d.ts +51 -0
  524. package/lib/populate-ref-tables/populate-refs.js +62 -0
  525. package/lib/populate-ref-tables/populate-text-refs.d.ts +32 -0
  526. package/lib/populate-ref-tables/populate-text-refs.js +133 -0
  527. package/lib/populate-ref-tables/populate-url-refs.d.ts +28 -0
  528. package/lib/populate-ref-tables/populate-url-refs.js +148 -0
  529. package/lib/populate-ref-tables/test-utils/count-rows.d.ts +15 -0
  530. package/lib/populate-ref-tables/test-utils/count-rows.js +17 -0
  531. package/lib/populate-ref-tables/types.d.ts +197 -0
  532. package/lib/populate-ref-tables/types.js +7 -0
  533. package/lib/populate-ref-tables/upsert-one-header-set.d.ts +34 -0
  534. package/lib/populate-ref-tables/upsert-one-header-set.js +208 -0
  535. package/lib/populate-ref-tables/volatile-header-names.d.ts +20 -0
  536. package/lib/populate-ref-tables/volatile-header-names.js +33 -0
  537. package/lib/redirect-table.d.ts +9 -0
  538. package/lib/redirect-table.js +28 -0
  539. package/lib/release-finished-statements.d.ts +42 -0
  540. package/lib/release-finished-statements.js +45 -0
  541. package/lib/resolve-redirect-chain.d.ts +33 -0
  542. package/lib/resolve-redirect-chain.js +27 -0
  543. package/lib/resource.d.ts +46 -0
  544. package/lib/resource.js +62 -0
  545. package/lib/retarget-legacy-fk-tables.d.ts +61 -0
  546. package/lib/retarget-legacy-fk-tables.js +137 -0
  547. package/lib/safe-path.d.ts +9 -0
  548. package/lib/safe-path.js +17 -0
  549. package/lib/scope/build-scope-map.d.ts +21 -0
  550. package/lib/scope/build-scope-map.js +32 -0
  551. package/lib/scope/find-scope-entry.d.ts +25 -0
  552. package/lib/scope/find-scope-entry.js +45 -0
  553. package/lib/template-classification/classify-archive-page-templates.d.ts +42 -0
  554. package/lib/template-classification/classify-archive-page-templates.js +70 -0
  555. package/lib/template-classification/classify-page-templates.d.ts +33 -0
  556. package/lib/template-classification/classify-page-templates.js +60 -0
  557. package/lib/template-classification/collect-page-ids-with-html.d.ts +24 -0
  558. package/lib/template-classification/collect-page-ids-with-html.js +30 -0
  559. package/lib/template-classification/collect-page-stylesheet-urls.d.ts +32 -0
  560. package/lib/template-classification/collect-page-stylesheet-urls.js +130 -0
  561. package/lib/template-classification/create-content-root-hint.d.ts +41 -0
  562. package/lib/template-classification/create-content-root-hint.js +51 -0
  563. package/lib/template-classification/create-page-cluster-factory.d.ts +36 -0
  564. package/lib/template-classification/create-page-cluster-factory.js +52 -0
  565. package/lib/template-classification/load-page-cluster-candidates.d.ts +32 -0
  566. package/lib/template-classification/load-page-cluster-candidates.js +93 -0
  567. package/lib/template-classification/page-cluster/resolve-page-cluster-keys.d.ts +34 -0
  568. package/lib/template-classification/page-cluster/resolve-page-cluster-keys.js +236 -0
  569. package/lib/template-classification/page-cluster/types.d.ts +123 -0
  570. package/lib/template-classification/page-cluster/types.js +1 -0
  571. package/lib/template-classification/types.d.ts +234 -0
  572. package/lib/template-classification/types.js +1 -0
  573. package/lib/test-utils/build-full-schema-test-db.d.ts +34 -0
  574. package/lib/test-utils/build-full-schema-test-db.js +74 -0
  575. package/lib/test-utils/create-legacy-analysis-tables.d.ts +13 -0
  576. package/lib/test-utils/create-legacy-analysis-tables.js +37 -0
  577. package/lib/test-utils/fk-parent-tables.d.ts +15 -0
  578. package/lib/test-utils/fk-parent-tables.js +19 -0
  579. package/lib/test-utils/seed-content-item.d.ts +35 -0
  580. package/lib/test-utils/seed-content-item.js +42 -0
  581. package/lib/test-utils/setup-legacy-fk-db.d.ts +34 -0
  582. package/lib/test-utils/setup-legacy-fk-db.js +271 -0
  583. package/lib/transfer/attach-source-database.d.ts +31 -0
  584. package/lib/transfer/attach-source-database.js +40 -0
  585. package/lib/transfer/build-split-config.d.ts +30 -0
  586. package/lib/transfer/build-split-config.js +42 -0
  587. package/lib/transfer/clear-replaced-page-rows.d.ts +23 -0
  588. package/lib/transfer/clear-replaced-page-rows.js +61 -0
  589. package/lib/transfer/concat-archives.d.ts +55 -0
  590. package/lib/transfer/concat-archives.js +95 -0
  591. package/lib/transfer/concat-source-transfer-phases.d.ts +10 -0
  592. package/lib/transfer/concat-source-transfer-phases.js +17 -0
  593. package/lib/transfer/content-item-rank-sql.d.ts +21 -0
  594. package/lib/transfer/content-item-rank-sql.js +23 -0
  595. package/lib/transfer/copy-anchor-edges.d.ts +28 -0
  596. package/lib/transfer/copy-anchor-edges.js +42 -0
  597. package/lib/transfer/copy-dictionaries-for-concat.d.ts +39 -0
  598. package/lib/transfer/copy-dictionaries-for-concat.js +81 -0
  599. package/lib/transfer/copy-dictionaries-for-split.d.ts +29 -0
  600. package/lib/transfer/copy-dictionaries-for-split.js +224 -0
  601. package/lib/transfer/copy-header-set-children.d.ts +27 -0
  602. package/lib/transfer/copy-header-set-children.js +51 -0
  603. package/lib/transfer/copy-image-items.d.ts +21 -0
  604. package/lib/transfer/copy-image-items.js +62 -0
  605. package/lib/transfer/copy-inventory-source-lists.d.ts +30 -0
  606. package/lib/transfer/copy-inventory-source-lists.js +61 -0
  607. package/lib/transfer/copy-journal-tables.d.ts +30 -0
  608. package/lib/transfer/copy-journal-tables.js +56 -0
  609. package/lib/transfer/copy-page-console-logs.d.ts +16 -0
  610. package/lib/transfer/copy-page-console-logs.js +27 -0
  611. package/lib/transfer/copy-page-html-blobs.d.ts +31 -0
  612. package/lib/transfer/copy-page-html-blobs.js +43 -0
  613. package/lib/transfer/copy-page-meta.d.ts +27 -0
  614. package/lib/transfer/copy-page-meta.js +68 -0
  615. package/lib/transfer/copy-page-template-clusters.d.ts +31 -0
  616. package/lib/transfer/copy-page-template-clusters.js +56 -0
  617. package/lib/transfer/copy-page-template-labels.d.ts +34 -0
  618. package/lib/transfer/copy-page-template-labels.js +88 -0
  619. package/lib/transfer/copy-resource-items.d.ts +29 -0
  620. package/lib/transfer/copy-resource-items.js +89 -0
  621. package/lib/transfer/copy-resource-ref-edges.d.ts +20 -0
  622. package/lib/transfer/copy-resource-ref-edges.js +33 -0
  623. package/lib/transfer/copy-simple-page-scoped-tables.d.ts +15 -0
  624. package/lib/transfer/copy-simple-page-scoped-tables.js +34 -0
  625. package/lib/transfer/count-external-pages-in-scope.d.ts +26 -0
  626. package/lib/transfer/count-external-pages-in-scope.js +40 -0
  627. package/lib/transfer/create-transfer-temp-tables.d.ts +30 -0
  628. package/lib/transfer/create-transfer-temp-tables.js +59 -0
  629. package/lib/transfer/dictionary-copy-specs.d.ts +32 -0
  630. package/lib/transfer/dictionary-copy-specs.js +28 -0
  631. package/lib/transfer/drop-transfer-temp-tables.d.ts +9 -0
  632. package/lib/transfer/drop-transfer-temp-tables.js +18 -0
  633. package/lib/transfer/flatten-redirect-chains.d.ts +44 -0
  634. package/lib/transfer/flatten-redirect-chains.js +74 -0
  635. package/lib/transfer/insert-content-items.d.ts +35 -0
  636. package/lib/transfer/insert-content-items.js +116 -0
  637. package/lib/transfer/list-transfer-columns.d.ts +35 -0
  638. package/lib/transfer/list-transfer-columns.js +45 -0
  639. package/lib/transfer/mark-in-scope-content-items.d.ts +31 -0
  640. package/lib/transfer/mark-in-scope-content-items.js +54 -0
  641. package/lib/transfer/merge-archive-configs.d.ts +51 -0
  642. package/lib/transfer/merge-archive-configs.js +85 -0
  643. package/lib/transfer/plan-content-items-for-concat.d.ts +33 -0
  644. package/lib/transfer/plan-content-items-for-concat.js +51 -0
  645. package/lib/transfer/plan-content-items-for-split.d.ts +42 -0
  646. package/lib/transfer/plan-content-items-for-split.js +83 -0
  647. package/lib/transfer/plan-resource-items.d.ts +40 -0
  648. package/lib/transfer/plan-resource-items.js +69 -0
  649. package/lib/transfer/quote-transfer-identifier.d.ts +18 -0
  650. package/lib/transfer/quote-transfer-identifier.js +20 -0
  651. package/lib/transfer/reclassify-resource-externality.d.ts +37 -0
  652. package/lib/transfer/reclassify-resource-externality.js +66 -0
  653. package/lib/transfer/remap-redirect-dest-ids.d.ts +34 -0
  654. package/lib/transfer/remap-redirect-dest-ids.js +51 -0
  655. package/lib/transfer/replace-content-items.d.ts +39 -0
  656. package/lib/transfer/replace-content-items.js +83 -0
  657. package/lib/transfer/simple-page-scoped-tables.d.ts +25 -0
  658. package/lib/transfer/simple-page-scoped-tables.js +38 -0
  659. package/lib/transfer/split-archive.d.ts +55 -0
  660. package/lib/transfer/split-archive.js +98 -0
  661. package/lib/transfer/split-source-transfer-phases.d.ts +11 -0
  662. package/lib/transfer/split-source-transfer-phases.js +18 -0
  663. package/lib/transfer/transfer-action.d.ts +34 -0
  664. package/lib/transfer/transfer-action.js +32 -0
  665. package/lib/transfer/transfer-archive-rows.d.ts +65 -0
  666. package/lib/transfer/transfer-archive-rows.js +156 -0
  667. package/lib/transfer/transfer-dictionary-tables.d.ts +12 -0
  668. package/lib/transfer/transfer-dictionary-tables.js +22 -0
  669. package/lib/transfer/transfer-post-phases.d.ts +10 -0
  670. package/lib/transfer/transfer-post-phases.js +13 -0
  671. package/lib/transfer/transfer-source-alias.d.ts +9 -0
  672. package/lib/transfer/transfer-source-alias.js +9 -0
  673. package/lib/transfer/types.d.ts +111 -0
  674. package/lib/transfer/types.js +35 -0
  675. package/lib/types.d.ts +772 -0
  676. package/lib/types.js +1 -0
  677. package/lib/url-alias/compute-tier-a-alias-key.d.ts +44 -0
  678. package/lib/url-alias/compute-tier-a-alias-key.js +47 -0
  679. package/lib/url-alias/compute-tier-b-alias-key.d.ts +23 -0
  680. package/lib/url-alias/compute-tier-b-alias-key.js +26 -0
  681. package/lib/url-alias/group-alias-candidates.d.ts +27 -0
  682. package/lib/url-alias/group-alias-candidates.js +29 -0
  683. package/lib/url-alias/types.d.ts +12 -0
  684. package/lib/url-alias/types.js +1 -0
  685. package/lib/url-pattern/compute-shape-key.d.ts +58 -0
  686. package/lib/url-pattern/compute-shape-key.js +129 -0
  687. package/lib/url-pattern/decompose-url.d.ts +33 -0
  688. package/lib/url-pattern/decompose-url.js +79 -0
  689. package/lib/url-pattern/reconstruct-url.d.ts +15 -0
  690. package/lib/url-pattern/reconstruct-url.js +33 -0
  691. package/lib/url-sort/compute-url-sort-ranks.d.ts +30 -0
  692. package/lib/url-sort/compute-url-sort-ranks.js +33 -0
  693. package/lib/utils/array/each-splitted.d.ts +10 -0
  694. package/lib/utils/array/each-splitted.js +14 -0
  695. package/lib/utils/debug.d.ts +8 -0
  696. package/lib/utils/debug.js +8 -0
  697. package/lib/utils/error/emit-error-with-retry.d.ts +40 -0
  698. package/lib/utils/error/emit-error-with-retry.js +44 -0
  699. package/lib/utils/error/emit-error.d.ts +39 -0
  700. package/lib/utils/error/emit-error.js +41 -0
  701. package/lib/utils/object/parse-response-headers.d.ts +12 -0
  702. package/lib/utils/object/parse-response-headers.js +26 -0
  703. package/lib/utils/object/redact-request-headers.d.ts +15 -0
  704. package/lib/utils/object/redact-request-headers.js +27 -0
  705. package/lib/utils/types/types.d.ts +383 -0
  706. package/lib/utils/types/types.js +1 -0
  707. package/lib/verify-migration/capture-rejection.d.ts +24 -0
  708. package/lib/verify-migration/capture-rejection.js +31 -0
  709. package/lib/verify-migration/check-anchor-edges-count.d.ts +34 -0
  710. package/lib/verify-migration/check-anchor-edges-count.js +72 -0
  711. package/lib/verify-migration/check-anchor-edges-sum.d.ts +13 -0
  712. package/lib/verify-migration/check-anchor-edges-sum.js +27 -0
  713. package/lib/verify-migration/check-content-items-count.d.ts +16 -0
  714. package/lib/verify-migration/check-content-items-count.js +30 -0
  715. package/lib/verify-migration/check-content-type-preservation.d.ts +22 -0
  716. package/lib/verify-migration/check-content-type-preservation.js +40 -0
  717. package/lib/verify-migration/check-foreign-key-integrity.d.ts +31 -0
  718. package/lib/verify-migration/check-foreign-key-integrity.js +47 -0
  719. package/lib/verify-migration/check-image-items-count.d.ts +12 -0
  720. package/lib/verify-migration/check-image-items-count.js +26 -0
  721. package/lib/verify-migration/check-page-meta-count.d.ts +15 -0
  722. package/lib/verify-migration/check-page-meta-count.js +31 -0
  723. package/lib/verify-migration/check-reader-parity.d.ts +23 -0
  724. package/lib/verify-migration/check-reader-parity.js +182 -0
  725. package/lib/verify-migration/check-resource-items-count.d.ts +17 -0
  726. package/lib/verify-migration/check-resource-items-count.js +33 -0
  727. package/lib/verify-migration/check-url-round-trip.d.ts +43 -0
  728. package/lib/verify-migration/check-url-round-trip.js +112 -0
  729. package/lib/verify-migration/types.d.ts +70 -0
  730. package/lib/verify-migration/types.js +63 -0
  731. package/lib/verify-migration/verify-migration.d.ts +41 -0
  732. package/lib/verify-migration/verify-migration.js +120 -0
  733. package/lib/with-bulk-write-pragmas.d.ts +51 -0
  734. package/lib/with-bulk-write-pragmas.js +132 -0
  735. package/lib/write-queue.d.ts +32 -0
  736. package/lib/write-queue.js +55 -0
  737. package/package.json +360 -5
package/lib/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Computes the Tier A alias key for `url`: two URLs share a Tier A key when
3
+ * they differ only by scheme (`http` vs `https` are folded together),
4
+ * host letter-casing, or a `/index.{ext}` path suffix — differences that
5
+ * are safe to treat as "the same resource" from the URL string alone, with
6
+ * no need to compare rendered content.
7
+ *
8
+ * This is a canonical-key function, not a pairwise comparator: grouping
9
+ * rows by exact string equality of this function's output is definitionally
10
+ * an equivalence relation (reflexive, symmetric, transitive). A pairwise
11
+ * "roughly equal" comparison would not be: non-transitivity is inherent to
12
+ * pairwise comparators (see ARCHITECTURE.md's "URL の自然順は、2 件ずつ比べる
13
+ * 比較関数ではなくバイト列キーの全順序で決める"), and does not apply to a
14
+ * canonical-key partition like this one.
15
+ *
16
+ * The query string is kept in the key as written — not normalized, reordered
17
+ * or dropped — so two URLs that differ only in their query never share a key:
18
+ * a query-string difference is not addressed by this feature (out of scope —
19
+ * see the `body_hash` masking, a separate content-hash-based mechanism, for
20
+ * detecting meaningless-parameter duplicates). The fragment is left out:
21
+ * fragments are client-side only and never affect server-rendered content.
22
+ *
23
+ * Each call crosses into the addon and parses the URL, and the addon builds
24
+ * both tiers' keys from that parse: to group many pages, use
25
+ * `groupAliasCandidates`, which parses each URL once for both keys, rather
26
+ * than calling this and `computeTierBAliasKey` per URL.
27
+ *
28
+ * The key is computed in the native addon (`@nitpicker/core`,
29
+ * `crates/nitpicker_url_key`). The JavaScript implementation
30
+ * (`parse-alias-key-parts.ts`, `format-alias-key.ts`) is not called from here
31
+ * and is excluded from the build: it is the oracle for
32
+ * `compute-alias-keys.parity.spec.ts`, which pins the addon to it, and so to
33
+ * the groupings existing archives already store (`content_items.alias_of_id`).
34
+ * @param url - The URL string to compute a key for.
35
+ * @returns The Tier A key, or `null` if `url` is not a parseable http(s) URL.
36
+ * @example
37
+ * ```ts
38
+ * computeTierAAliasKey('http://Example.com/about/index.html');
39
+ * // 'example.com/about/'
40
+ * computeTierAAliasKey('https://example.com/about/');
41
+ * // 'example.com/about/' -- same key: scheme and /index.html are folded
42
+ * ```
43
+ */
44
+ export declare function computeTierAAliasKey(url: string): string | null;
@@ -0,0 +1,47 @@
1
+ import { computeAliasKeys } from '@nitpicker/core/compute-alias-keys';
2
+ /**
3
+ * Computes the Tier A alias key for `url`: two URLs share a Tier A key when
4
+ * they differ only by scheme (`http` vs `https` are folded together),
5
+ * host letter-casing, or a `/index.{ext}` path suffix — differences that
6
+ * are safe to treat as "the same resource" from the URL string alone, with
7
+ * no need to compare rendered content.
8
+ *
9
+ * This is a canonical-key function, not a pairwise comparator: grouping
10
+ * rows by exact string equality of this function's output is definitionally
11
+ * an equivalence relation (reflexive, symmetric, transitive). A pairwise
12
+ * "roughly equal" comparison would not be: non-transitivity is inherent to
13
+ * pairwise comparators (see ARCHITECTURE.md's "URL の自然順は、2 件ずつ比べる
14
+ * 比較関数ではなくバイト列キーの全順序で決める"), and does not apply to a
15
+ * canonical-key partition like this one.
16
+ *
17
+ * The query string is kept in the key as written — not normalized, reordered
18
+ * or dropped — so two URLs that differ only in their query never share a key:
19
+ * a query-string difference is not addressed by this feature (out of scope —
20
+ * see the `body_hash` masking, a separate content-hash-based mechanism, for
21
+ * detecting meaningless-parameter duplicates). The fragment is left out:
22
+ * fragments are client-side only and never affect server-rendered content.
23
+ *
24
+ * Each call crosses into the addon and parses the URL, and the addon builds
25
+ * both tiers' keys from that parse: to group many pages, use
26
+ * `groupAliasCandidates`, which parses each URL once for both keys, rather
27
+ * than calling this and `computeTierBAliasKey` per URL.
28
+ *
29
+ * The key is computed in the native addon (`@nitpicker/core`,
30
+ * `crates/nitpicker_url_key`). The JavaScript implementation
31
+ * (`parse-alias-key-parts.ts`, `format-alias-key.ts`) is not called from here
32
+ * and is excluded from the build: it is the oracle for
33
+ * `compute-alias-keys.parity.spec.ts`, which pins the addon to it, and so to
34
+ * the groupings existing archives already store (`content_items.alias_of_id`).
35
+ * @param url - The URL string to compute a key for.
36
+ * @returns The Tier A key, or `null` if `url` is not a parseable http(s) URL.
37
+ * @example
38
+ * ```ts
39
+ * computeTierAAliasKey('http://Example.com/about/index.html');
40
+ * // 'example.com/about/'
41
+ * computeTierAAliasKey('https://example.com/about/');
42
+ * // 'example.com/about/' -- same key: scheme and /index.html are folded
43
+ * ```
44
+ */
45
+ export function computeTierAAliasKey(url) {
46
+ return computeAliasKeys(url)?.tierA ?? null;
47
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Computes the Tier B alias key for `url`: like `computeTierAAliasKey`,
3
+ * but additionally strips one trailing `/` from the path (the bare root
4
+ * path `/` is left alone). Two URLs sharing a Tier B key differ only by
5
+ * trailing-slash presence — a resource-identity signal considerably weaker
6
+ * than Tier A's (a web server can legitimately serve different content at
7
+ * `/foo` and `/foo/`), so callers must additionally require a matching
8
+ * `page_meta.body_hash` before treating a Tier B match as the same page.
9
+ *
10
+ * Computed in the native addon like the Tier A key — one call and one parse
11
+ * per URL, so to group many pages use `groupAliasCandidates` — see
12
+ * `computeTierAAliasKey` for what stays as the oracle.
13
+ * @param url - The URL string to compute a key for.
14
+ * @returns The Tier B key, or `null` if `url` is not a parseable http(s) URL.
15
+ * @example
16
+ * ```ts
17
+ * computeTierBAliasKey('https://example.com/foo');
18
+ * computeTierBAliasKey('https://example.com/foo/');
19
+ * // both: 'example.com/foo' -- same key, but the caller must still confirm
20
+ * // a matching body_hash before merging these as the same page.
21
+ * ```
22
+ */
23
+ export declare function computeTierBAliasKey(url: string): string | null;
@@ -0,0 +1,26 @@
1
+ import { computeAliasKeys } from '@nitpicker/core/compute-alias-keys';
2
+ /**
3
+ * Computes the Tier B alias key for `url`: like `computeTierAAliasKey`,
4
+ * but additionally strips one trailing `/` from the path (the bare root
5
+ * path `/` is left alone). Two URLs sharing a Tier B key differ only by
6
+ * trailing-slash presence — a resource-identity signal considerably weaker
7
+ * than Tier A's (a web server can legitimately serve different content at
8
+ * `/foo` and `/foo/`), so callers must additionally require a matching
9
+ * `page_meta.body_hash` before treating a Tier B match as the same page.
10
+ *
11
+ * Computed in the native addon like the Tier A key — one call and one parse
12
+ * per URL, so to group many pages use `groupAliasCandidates` — see
13
+ * `computeTierAAliasKey` for what stays as the oracle.
14
+ * @param url - The URL string to compute a key for.
15
+ * @returns The Tier B key, or `null` if `url` is not a parseable http(s) URL.
16
+ * @example
17
+ * ```ts
18
+ * computeTierBAliasKey('https://example.com/foo');
19
+ * computeTierBAliasKey('https://example.com/foo/');
20
+ * // both: 'example.com/foo' -- same key, but the caller must still confirm
21
+ * // a matching body_hash before merging these as the same page.
22
+ * ```
23
+ */
24
+ export function computeTierBAliasKey(url) {
25
+ return computeAliasKeys(url)?.tierB ?? null;
26
+ }
@@ -0,0 +1,27 @@
1
+ import type { AliasCandidate } from '@nitpicker/core/types';
2
+ /**
3
+ * Groups the pages that are the same page under another URL
4
+ * (`content_items.alias_of_id`) and elects each group's representative: the
5
+ * pages whose Tier A key (`computeTierAAliasKey`) and title match, or whose
6
+ * Tier B key (`computeTierBAliasKey`), title and body hash match, and the
7
+ * pages chained to them by either.
8
+ *
9
+ * `@nitpicker/query` reaches the native addon through this archive function
10
+ * (see ARCHITECTURE.md's dependency rule); the full grouping and election rules
11
+ * are the docs of `groupAliasCandidates` in `@nitpicker/core`, which this
12
+ * calls as it is. The persisted result is pinned to the JavaScript reference by
13
+ * `group-alias-candidates.parity.spec.ts` and `scripts/isolated-alias-golden.mjs`.
14
+ * @param candidates - The pages. `urlId` is `url_refs.id`: two candidates
15
+ * have the same URL exactly when they have the same id.
16
+ * @returns For each candidate, the index of its group's representative, or
17
+ * `-1` for a representative and for a candidate in a group of one.
18
+ * @example
19
+ * ```ts
20
+ * const page = { titleTextId: 1, canonicalUrlId: null, bodyHash: null };
21
+ * groupAliasCandidates([
22
+ * { ...page, url: 'https://example.com/about/index.html', urlId: 1 },
23
+ * { ...page, url: 'https://example.com/about/', urlId: 2 },
24
+ * ]); // Int32Array [1, -1]
25
+ * ```
26
+ */
27
+ export declare function groupAliasCandidates(candidates: readonly AliasCandidate[]): Int32Array;
@@ -0,0 +1,29 @@
1
+ import { groupAliasCandidates as groupAliasCandidatesNative } from '@nitpicker/core/group-alias-candidates';
2
+ /**
3
+ * Groups the pages that are the same page under another URL
4
+ * (`content_items.alias_of_id`) and elects each group's representative: the
5
+ * pages whose Tier A key (`computeTierAAliasKey`) and title match, or whose
6
+ * Tier B key (`computeTierBAliasKey`), title and body hash match, and the
7
+ * pages chained to them by either.
8
+ *
9
+ * `@nitpicker/query` reaches the native addon through this archive function
10
+ * (see ARCHITECTURE.md's dependency rule); the full grouping and election rules
11
+ * are the docs of `groupAliasCandidates` in `@nitpicker/core`, which this
12
+ * calls as it is. The persisted result is pinned to the JavaScript reference by
13
+ * `group-alias-candidates.parity.spec.ts` and `scripts/isolated-alias-golden.mjs`.
14
+ * @param candidates - The pages. `urlId` is `url_refs.id`: two candidates
15
+ * have the same URL exactly when they have the same id.
16
+ * @returns For each candidate, the index of its group's representative, or
17
+ * `-1` for a representative and for a candidate in a group of one.
18
+ * @example
19
+ * ```ts
20
+ * const page = { titleTextId: 1, canonicalUrlId: null, bodyHash: null };
21
+ * groupAliasCandidates([
22
+ * { ...page, url: 'https://example.com/about/index.html', urlId: 1 },
23
+ * { ...page, url: 'https://example.com/about/', urlId: 2 },
24
+ * ]); // Int32Array [1, -1]
25
+ * ```
26
+ */
27
+ export function groupAliasCandidates(candidates) {
28
+ return groupAliasCandidatesNative(candidates);
29
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Components a Tier A / Tier B alias key is built from. Used only by the
3
+ * JavaScript alias-key implementation (`parse-alias-key-parts.ts`,
4
+ * `format-alias-key.ts`), which is the parity oracle for the native keys and
5
+ * is excluded from the build (`tsconfig.json`).
6
+ */
7
+ export interface AliasKeyParts {
8
+ host: string;
9
+ port: string;
10
+ path: string;
11
+ search: string;
12
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Computes a URL "shape" key: the host plus path/query with every path
3
+ * segment that contains a digit collapsed to a fixed placeholder, and every
4
+ * query value (regardless of content) collapsed to a fixed placeholder.
5
+ *
6
+ * This absorbs both the "numeric pager" trap shape (`/news/date/2024/` and
7
+ * `/news/date/1.5e+32/` collapse to the same key) and the "query trap" shape
8
+ * (`?page=1` / `?page=2` / `?session=ab12cd` all collapse to the same key),
9
+ * without needing two separate `parentPath` definitions the way issue
10
+ * #208's original proposal did.
11
+ *
12
+ * Uses `./decompose-url.ts` (the pagination-detection one) — NOT
13
+ * `../populate-ref-tables/decompose-url.ts`, an unrelated same-named
14
+ * module with a different `DecomposedUrl` shape used for ref-table population.
15
+ *
16
+ * The masking rule here is the deliberate inverse of the body-hash mask
17
+ * (`@nitpicker/core`'s `crates/nitpicker_html_scan/src/mask_dynamic_ids.rs`,
18
+ * which `../body-hash/compute-body-hash.ts` runs): that mask leaves
19
+ * pure-digit tokens untouched (they are more likely stable content than a
20
+ * dynamic id) and only masks mixed alphanumeric runs. A shape key needs the
21
+ * opposite: ANY digit inside a path segment marks it as "probably a
22
+ * pagination/date/id token", so the whole segment is collapsed. Do not share
23
+ * masking logic between the two — they classify the same kind of text for
24
+ * opposite purposes.
25
+ *
26
+ * Query keys are additionally run through `flattenQueryKeys` before being
27
+ * folded into the key, because `ExURL`'s query normalization (`URLSearchParams`
28
+ * decode-then-re-encode round trip in `@d-zero/shared/parse-url`) means a
29
+ * site that double-encodes `&`/`=` inside a query value produces a URL whose
30
+ * query string still arrives here percent-encoded — `decomposeUrl`'s literal
31
+ * `&`/`=` split then sees ONE key that is itself a percent-encoded
32
+ * `key=value&key=value...` blob, with any variable content buried inside
33
+ * that key name rather than in a value. Without flattening, every such URL
34
+ * gets a distinct key name and therefore a distinct shape key, which
35
+ * silently defeats `--dedupe-cap` (issue #351) no matter the threshold.
36
+ *
37
+ * This changes the shape key computed for URLs that hit the flattening
38
+ * path. `dedupe_cap_events.shape_key` (see `archive/create-adjunct-tables.ts`)
39
+ * is an append-only value frozen at crawl time and never rewritten, so an
40
+ * archive crawled before this fix that happened to already have a
41
+ * `dedupe_cap_events` row for such a URL (rare, since the bug largely
42
+ * prevented capping from firing on it in the first place) will not
43
+ * re-match on the next `backfillDedupeCapEventId` recompute — the same
44
+ * self-healing-backfill trade-off any shape-key algorithm change makes.
45
+ * @param url - A URL string (protocol-agnostic `//host/...` or full
46
+ * `https://host/...`), typically `ExURL.withoutHashAndAuth`.
47
+ * @returns The shape key, or `null` if `url` cannot be decomposed.
48
+ * @example
49
+ * ```ts
50
+ * computeShapeKey('//example.com/news/date/2024/');
51
+ * // => 'example.com/news/date/{n}/'
52
+ * computeShapeKey('//example.com/news/date/1.5e+32/');
53
+ * // => 'example.com/news/date/{n}/' — same shape
54
+ * computeShapeKey('//example.com/list?page=1');
55
+ * // => 'example.com/list?page={v}'
56
+ * ```
57
+ */
58
+ export declare function computeShapeKey(url: string): string | null;
@@ -0,0 +1,129 @@
1
+ import { decodeURIComponentSafely } from '@d-zero/shared/decode-uri-safely';
2
+ import { decomposeUrl } from './decompose-url.js';
3
+ const DIGIT_CONTAINING_SEGMENT_PATTERN = /\d/;
4
+ const SEGMENT_PLACEHOLDER = '{n}';
5
+ const VALUE_PLACEHOLDER = '{v}';
6
+ /**
7
+ * Recursively decodes and re-splits a single query key that may itself be a
8
+ * percent-encoded `key=value&key=value...` blob (see the "query trap" case
9
+ * in `computeShapeKey`'s doc comment), peeling one layer of encoding at a
10
+ * time so a multiply-encoded blob (`%2526` → `%26` → `&`) still converges.
11
+ *
12
+ * Each call first decodes via `decodeURIComponentSafely` (falls back to the
13
+ * input unchanged on malformed `%` sequences). If decoding changed
14
+ * anything, there may be another layer underneath, so it recurses on the
15
+ * decoded string to peel further. Once decoding is a no-op (fully decoded,
16
+ * or undecodable), the value is at a fixed point: split on `&`/`=` if
17
+ * either is now present and recurse on the pieces (each piece may need its
18
+ * own decode chain); otherwise it's a leaf.
19
+ *
20
+ * Every recursive call operates on a string strictly shorter than its
21
+ * input — a successful decode always shrinks length (a `%XX` triplet never
22
+ * expands to more than 1 output character), and splitting on a delimiter
23
+ * that is present at a fixed point always yields a strictly shorter piece
24
+ * — so this terminates for any finite input without needing an explicit
25
+ * depth limit.
26
+ * @param key - A single raw query key, as returned by `decomposeUrl`.
27
+ * @returns The one or more sub-key names this key flattens to.
28
+ */
29
+ function flattenQueryKey(key) {
30
+ const decoded = decodeURIComponentSafely(key);
31
+ if (decoded !== key)
32
+ return flattenQueryKey(decoded);
33
+ if (!decoded.includes('=') && !decoded.includes('&'))
34
+ return [decoded];
35
+ return decoded.split('&').flatMap((pair) => flattenQueryKey(pair.split('=')[0] ?? ''));
36
+ }
37
+ /**
38
+ * Flattens and normalizes a list of query keys so that keys whose variable
39
+ * content leaked into the key name itself (via nested percent-encoding)
40
+ * still converge to the same set of sub-key names regardless of the
41
+ * variable values or the sub-pairs' original order.
42
+ *
43
+ * Deliberately does NOT deduplicate the flattened keys: a legitimate
44
+ * multi-value query (`?tag=a&tag=b`) must stay distinguishable from a
45
+ * single-value one (`?tag=a`) — collapsing repeated key names would fold
46
+ * pages with a different facet count into the same shape, which is a
47
+ * correctness regression unrelated to the encoding bug this function fixes.
48
+ * @param keys - Raw query keys, as returned by `decomposeUrl`.
49
+ * @returns The flattened, sorted key names.
50
+ */
51
+ function flattenQueryKeys(keys) {
52
+ return keys
53
+ .flatMap((key) => flattenQueryKey(key))
54
+ .toSorted((a, b) => a.localeCompare(b));
55
+ }
56
+ /**
57
+ * Computes a URL "shape" key: the host plus path/query with every path
58
+ * segment that contains a digit collapsed to a fixed placeholder, and every
59
+ * query value (regardless of content) collapsed to a fixed placeholder.
60
+ *
61
+ * This absorbs both the "numeric pager" trap shape (`/news/date/2024/` and
62
+ * `/news/date/1.5e+32/` collapse to the same key) and the "query trap" shape
63
+ * (`?page=1` / `?page=2` / `?session=ab12cd` all collapse to the same key),
64
+ * without needing two separate `parentPath` definitions the way issue
65
+ * #208's original proposal did.
66
+ *
67
+ * Uses `./decompose-url.ts` (the pagination-detection one) — NOT
68
+ * `../populate-ref-tables/decompose-url.ts`, an unrelated same-named
69
+ * module with a different `DecomposedUrl` shape used for ref-table population.
70
+ *
71
+ * The masking rule here is the deliberate inverse of the body-hash mask
72
+ * (`@nitpicker/core`'s `crates/nitpicker_html_scan/src/mask_dynamic_ids.rs`,
73
+ * which `../body-hash/compute-body-hash.ts` runs): that mask leaves
74
+ * pure-digit tokens untouched (they are more likely stable content than a
75
+ * dynamic id) and only masks mixed alphanumeric runs. A shape key needs the
76
+ * opposite: ANY digit inside a path segment marks it as "probably a
77
+ * pagination/date/id token", so the whole segment is collapsed. Do not share
78
+ * masking logic between the two — they classify the same kind of text for
79
+ * opposite purposes.
80
+ *
81
+ * Query keys are additionally run through `flattenQueryKeys` before being
82
+ * folded into the key, because `ExURL`'s query normalization (`URLSearchParams`
83
+ * decode-then-re-encode round trip in `@d-zero/shared/parse-url`) means a
84
+ * site that double-encodes `&`/`=` inside a query value produces a URL whose
85
+ * query string still arrives here percent-encoded — `decomposeUrl`'s literal
86
+ * `&`/`=` split then sees ONE key that is itself a percent-encoded
87
+ * `key=value&key=value...` blob, with any variable content buried inside
88
+ * that key name rather than in a value. Without flattening, every such URL
89
+ * gets a distinct key name and therefore a distinct shape key, which
90
+ * silently defeats `--dedupe-cap` (issue #351) no matter the threshold.
91
+ *
92
+ * This changes the shape key computed for URLs that hit the flattening
93
+ * path. `dedupe_cap_events.shape_key` (see `archive/create-adjunct-tables.ts`)
94
+ * is an append-only value frozen at crawl time and never rewritten, so an
95
+ * archive crawled before this fix that happened to already have a
96
+ * `dedupe_cap_events` row for such a URL (rare, since the bug largely
97
+ * prevented capping from firing on it in the first place) will not
98
+ * re-match on the next `backfillDedupeCapEventId` recompute — the same
99
+ * self-healing-backfill trade-off any shape-key algorithm change makes.
100
+ * @param url - A URL string (protocol-agnostic `//host/...` or full
101
+ * `https://host/...`), typically `ExURL.withoutHashAndAuth`.
102
+ * @returns The shape key, or `null` if `url` cannot be decomposed.
103
+ * @example
104
+ * ```ts
105
+ * computeShapeKey('//example.com/news/date/2024/');
106
+ * // => 'example.com/news/date/{n}/'
107
+ * computeShapeKey('//example.com/news/date/1.5e+32/');
108
+ * // => 'example.com/news/date/{n}/' — same shape
109
+ * computeShapeKey('//example.com/list?page=1');
110
+ * // => 'example.com/list?page={v}'
111
+ * ```
112
+ */
113
+ export function computeShapeKey(url) {
114
+ const decomposed = decomposeUrl(url);
115
+ if (!decomposed)
116
+ return null;
117
+ const { host, pathSegments, queryKeys } = decomposed;
118
+ const shapedSegments = pathSegments.map((segment) => DIGIT_CONTAINING_SEGMENT_PATTERN.test(segment) ? SEGMENT_PLACEHOLDER : segment);
119
+ let key = host;
120
+ if (shapedSegments.length > 0) {
121
+ key += `/${shapedSegments.join('/')}`;
122
+ }
123
+ if (queryKeys.length > 0) {
124
+ const flattenedKeys = flattenQueryKeys(queryKeys);
125
+ const pairs = flattenedKeys.map((k) => `${k}=${VALUE_PLACEHOLDER}`);
126
+ key += `?${pairs.join('&')}`;
127
+ }
128
+ return key;
129
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Intermediate representation of a URL split into comparable tokens.
3
+ * Used by pagination detection to identify which token changed between two URLs.
4
+ */
5
+ export interface DecomposedUrl {
6
+ /** Hostname including port (e.g. `"example.com:8080"`). */
7
+ host: string;
8
+ /** Path segments split by `/` (e.g. `["page", "2"]` for `/page/2`). */
9
+ pathSegments: string[];
10
+ /** Sorted query parameter keys. */
11
+ queryKeys: string[];
12
+ /** Query parameter values sorted by their corresponding key. */
13
+ queryValues: string[];
14
+ /** Protocol prefix (e.g. `"https:"`) or empty string if protocol-agnostic. */
15
+ protocol: string;
16
+ }
17
+ /**
18
+ * Decomposes a URL string into its constituent tokens for comparison.
19
+ * Handles both full URLs (`https://host/path?q=v`) and protocol-agnostic
20
+ * URLs (`//host/path?q=v`). Query parameters are sorted by key for
21
+ * consistent comparison. {@link import('./reconstruct-url.js').reconstructUrl}
22
+ * is the inverse (with one token replaced); the two are kept side by side so
23
+ * the `DecomposedUrl` shape cannot drift between them.
24
+ * @param url - The URL string to decompose
25
+ * @returns The decomposed URL, or `null` if the format is invalid
26
+ * @example
27
+ * ```ts
28
+ * decomposeUrl('//example.com/page/2?b=1&a=x');
29
+ * // { host: 'example.com', pathSegments: ['page', '2'],
30
+ * // queryKeys: ['a', 'b'], queryValues: ['x', '1'], protocol: '' }
31
+ * ```
32
+ */
33
+ export declare function decomposeUrl(url: string): DecomposedUrl | null;
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Decomposes a URL string into its constituent tokens for comparison.
3
+ * Handles both full URLs (`https://host/path?q=v`) and protocol-agnostic
4
+ * URLs (`//host/path?q=v`). Query parameters are sorted by key for
5
+ * consistent comparison. {@link import('./reconstruct-url.js').reconstructUrl}
6
+ * is the inverse (with one token replaced); the two are kept side by side so
7
+ * the `DecomposedUrl` shape cannot drift between them.
8
+ * @param url - The URL string to decompose
9
+ * @returns The decomposed URL, or `null` if the format is invalid
10
+ * @example
11
+ * ```ts
12
+ * decomposeUrl('//example.com/page/2?b=1&a=x');
13
+ * // { host: 'example.com', pathSegments: ['page', '2'],
14
+ * // queryKeys: ['a', 'b'], queryValues: ['x', '1'], protocol: '' }
15
+ * ```
16
+ */
17
+ export function decomposeUrl(url) {
18
+ // URL format: //host/path?query or //host?query (protocol-agnostic)
19
+ // Also handle protocol://host/path?query
20
+ let work = url;
21
+ let protocol = '';
22
+ // Strip protocol
23
+ const protoMatch = /^(https?:)?\/\//.exec(work);
24
+ if (!protoMatch)
25
+ return null;
26
+ protocol = protoMatch[1] ?? '';
27
+ work = work.slice(protoMatch[0].length);
28
+ // Split host from rest
29
+ const slashIdx = work.indexOf('/');
30
+ const qmarkIdx = work.indexOf('?');
31
+ let host;
32
+ let pathPart;
33
+ let queryPart;
34
+ if (slashIdx === -1 && qmarkIdx === -1) {
35
+ host = work;
36
+ pathPart = '';
37
+ queryPart = '';
38
+ }
39
+ else if (slashIdx === -1) {
40
+ host = work.slice(0, qmarkIdx);
41
+ pathPart = '';
42
+ queryPart = work.slice(qmarkIdx + 1);
43
+ }
44
+ else {
45
+ host = work.slice(0, slashIdx);
46
+ const pathAndQuery = work.slice(slashIdx + 1);
47
+ const pq = pathAndQuery.indexOf('?');
48
+ if (pq === -1) {
49
+ pathPart = pathAndQuery;
50
+ queryPart = '';
51
+ }
52
+ else {
53
+ pathPart = pathAndQuery.slice(0, pq);
54
+ queryPart = pathAndQuery.slice(pq + 1);
55
+ }
56
+ }
57
+ const pathSegments = pathPart ? pathPart.split('/') : [];
58
+ // Parse query into sorted key-value pairs
59
+ const queryPairs = [];
60
+ if (queryPart) {
61
+ for (const pair of queryPart.split('&')) {
62
+ const eqIdx = pair.indexOf('=');
63
+ if (eqIdx === -1) {
64
+ queryPairs.push([pair, '']);
65
+ }
66
+ else {
67
+ queryPairs.push([pair.slice(0, eqIdx), pair.slice(eqIdx + 1)]);
68
+ }
69
+ }
70
+ }
71
+ queryPairs.sort((a, b) => a[0].localeCompare(b[0]));
72
+ return {
73
+ host,
74
+ pathSegments,
75
+ queryKeys: queryPairs.map(([k]) => k),
76
+ queryValues: queryPairs.map(([, v]) => v),
77
+ protocol,
78
+ };
79
+ }
@@ -0,0 +1,15 @@
1
+ import type { DecomposedUrl } from './decompose-url.js';
2
+ /**
3
+ * Reconstructs a URL string from a decomposed representation with one
4
+ * token replaced at the specified index.
5
+ * @param decomposed - The decomposed URL to reconstruct
6
+ * @param tokenIndex - Index in the combined token array (path segments + query values)
7
+ * @param newValue - The replacement value for the token at `tokenIndex`
8
+ * @returns The reconstructed URL string
9
+ * @example
10
+ * ```ts
11
+ * const decomposed = decomposeUrl('//example.com/page/3')!;
12
+ * reconstructUrl(decomposed, 1, '4'); // '//example.com/page/4'
13
+ * ```
14
+ */
15
+ export declare function reconstructUrl(decomposed: DecomposedUrl, tokenIndex: number, newValue: string): string;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Reconstructs a URL string from a decomposed representation with one
3
+ * token replaced at the specified index.
4
+ * @param decomposed - The decomposed URL to reconstruct
5
+ * @param tokenIndex - Index in the combined token array (path segments + query values)
6
+ * @param newValue - The replacement value for the token at `tokenIndex`
7
+ * @returns The reconstructed URL string
8
+ * @example
9
+ * ```ts
10
+ * const decomposed = decomposeUrl('//example.com/page/3')!;
11
+ * reconstructUrl(decomposed, 1, '4'); // '//example.com/page/4'
12
+ * ```
13
+ */
14
+ export function reconstructUrl(decomposed, tokenIndex, newValue) {
15
+ const { host, pathSegments, queryKeys, queryValues, protocol } = decomposed;
16
+ const newPathSegments = [...pathSegments];
17
+ const newQueryValues = [...queryValues];
18
+ if (tokenIndex < pathSegments.length) {
19
+ newPathSegments[tokenIndex] = newValue;
20
+ }
21
+ else {
22
+ newQueryValues[tokenIndex - pathSegments.length] = newValue;
23
+ }
24
+ let url = `${protocol}//${host}`;
25
+ if (newPathSegments.length > 0) {
26
+ url += `/${newPathSegments.join('/')}`;
27
+ }
28
+ if (queryKeys.length > 0) {
29
+ const pairs = queryKeys.map((k, i) => `${encodeURIComponent(k)}=${encodeURIComponent(newQueryValues[i] ?? '')}`);
30
+ url += `?${pairs.join('&')}`;
31
+ }
32
+ return url;
33
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Ranks URLs in the natural order the viewer lists pages and resources in:
3
+ * numbers inside a path compare by value (`page2` before `page10`), letter
4
+ * case and percent-escapes do not split the order, a directory's own page
5
+ * comes before its index pages and its children, and the host decides before
6
+ * the path.
7
+ *
8
+ * The order is a total order — the same URLs in any input order get the same
9
+ * ranking — and it is persisted (`viewer_pages.natural_url_rank`,
10
+ * `viewer_url_sort_keys`), so a change to its definition needs a read model
11
+ * schema version bump. The definition lives in the native crate
12
+ * (`@nitpicker/core`, `crates/nitpicker_url_key`).
13
+ *
14
+ * Each URL is parsed once, natively. Memory is proportional to the URLs'
15
+ * total length — the UTF-8 bytes handed over plus native keys of roughly the
16
+ * same size again, on top of the caller's own copy of the strings — so a
17
+ * caller with a very large URL set ranks the distinct URLs only.
18
+ * @param urls - The URLs to rank; identical URLs rank in input order.
19
+ * @returns For each input position, the zero-based position that URL takes in
20
+ * the sorted list — a permutation of `0..urls.length`.
21
+ * @example
22
+ * ```ts
23
+ * computeUrlSortRanks([
24
+ * 'https://example.com/page10',
25
+ * 'https://example.com/page2',
26
+ * 'https://example.com/',
27
+ * ]); // Uint32Array [2, 1, 0]
28
+ * ```
29
+ */
30
+ export declare function computeUrlSortRanks(urls: readonly string[]): Uint32Array;
@@ -0,0 +1,33 @@
1
+ import { computeUrlSortRanks as computeUrlSortRanksNative } from '@nitpicker/core/compute-url-sort-ranks';
2
+ /**
3
+ * Ranks URLs in the natural order the viewer lists pages and resources in:
4
+ * numbers inside a path compare by value (`page2` before `page10`), letter
5
+ * case and percent-escapes do not split the order, a directory's own page
6
+ * comes before its index pages and its children, and the host decides before
7
+ * the path.
8
+ *
9
+ * The order is a total order — the same URLs in any input order get the same
10
+ * ranking — and it is persisted (`viewer_pages.natural_url_rank`,
11
+ * `viewer_url_sort_keys`), so a change to its definition needs a read model
12
+ * schema version bump. The definition lives in the native crate
13
+ * (`@nitpicker/core`, `crates/nitpicker_url_key`).
14
+ *
15
+ * Each URL is parsed once, natively. Memory is proportional to the URLs'
16
+ * total length — the UTF-8 bytes handed over plus native keys of roughly the
17
+ * same size again, on top of the caller's own copy of the strings — so a
18
+ * caller with a very large URL set ranks the distinct URLs only.
19
+ * @param urls - The URLs to rank; identical URLs rank in input order.
20
+ * @returns For each input position, the zero-based position that URL takes in
21
+ * the sorted list — a permutation of `0..urls.length`.
22
+ * @example
23
+ * ```ts
24
+ * computeUrlSortRanks([
25
+ * 'https://example.com/page10',
26
+ * 'https://example.com/page2',
27
+ * 'https://example.com/',
28
+ * ]); // Uint32Array [2, 1, 0]
29
+ * ```
30
+ */
31
+ export function computeUrlSortRanks(urls) {
32
+ return computeUrlSortRanksNative(urls);
33
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Splits an array into chunks of the specified size and executes a callback
3
+ * on each chunk in parallel using `Promise.all`.
4
+ * @template T - The element type of the array.
5
+ * @param a - The array to split into chunks.
6
+ * @param count - The maximum number of elements per chunk.
7
+ * @param callback - A function to invoke on each chunk. May be synchronous or asynchronous.
8
+ * @returns A promise that resolves when all chunk callbacks have completed.
9
+ */
10
+ export declare function eachSplitted<T>(a: readonly T[], count: number, callback: (items: T[]) => void | Promise<void>): Promise<void>;