@nitpicker/archive 0.0.0 → 0.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (739) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +106 -0
  3. package/lib/apply-connection-pragmas.d.ts +18 -0
  4. package/lib/apply-connection-pragmas.js +40 -0
  5. package/lib/archive-accessor.d.ts +265 -0
  6. package/lib/archive-accessor.js +477 -0
  7. package/lib/archive-lock.d.ts +45 -0
  8. package/lib/archive-lock.js +154 -0
  9. package/lib/archive.d.ts +736 -0
  10. package/lib/archive.js +1055 -0
  11. package/lib/body-hash/compute-body-hash.d.ts +32 -0
  12. package/lib/body-hash/compute-body-hash.js +35 -0
  13. package/lib/cache/clear-archive-cache-entry.d.ts +18 -0
  14. package/lib/cache/clear-archive-cache-entry.js +24 -0
  15. package/lib/cache/clear-archive-cache-root.d.ts +26 -0
  16. package/lib/cache/clear-archive-cache-root.js +32 -0
  17. package/lib/cache/compute-archive-cache-key.d.ts +39 -0
  18. package/lib/cache/compute-archive-cache-key.js +95 -0
  19. package/lib/cache/extract-archive-to-cache.d.ts +57 -0
  20. package/lib/cache/extract-archive-to-cache.js +326 -0
  21. package/lib/cache/get-archive-cache-root.d.ts +20 -0
  22. package/lib/cache/get-archive-cache-root.js +53 -0
  23. package/lib/cache/is-archive-cache-disabled.d.ts +24 -0
  24. package/lib/cache/is-archive-cache-disabled.js +34 -0
  25. package/lib/cache/list-archive-cache-entries.d.ts +23 -0
  26. package/lib/cache/list-archive-cache-entries.js +130 -0
  27. package/lib/cache/path-exists.d.ts +9 -0
  28. package/lib/cache/path-exists.js +18 -0
  29. package/lib/cache/resolve-archive-cache-dir.d.ts +26 -0
  30. package/lib/cache/resolve-archive-cache-dir.js +32 -0
  31. package/lib/cache/types.d.ts +33 -0
  32. package/lib/cache/types.js +1 -0
  33. package/lib/content-type/is-html-content-type.d.ts +17 -0
  34. package/lib/content-type/is-html-content-type.js +19 -0
  35. package/lib/content-type/normalize-content-type.d.ts +14 -0
  36. package/lib/content-type/normalize-content-type.js +20 -0
  37. package/lib/create-adjunct-tables.d.ts +66 -0
  38. package/lib/create-adjunct-tables.js +510 -0
  39. package/lib/create-entity-tables.d.ts +191 -0
  40. package/lib/create-entity-tables.js +387 -0
  41. package/lib/create-progress-reporter.d.ts +30 -0
  42. package/lib/create-progress-reporter.js +38 -0
  43. package/lib/create-ref-tables.d.ts +35 -0
  44. package/lib/create-ref-tables.js +185 -0
  45. package/lib/create-template-tables.d.ts +28 -0
  46. package/lib/create-template-tables.js +92 -0
  47. package/lib/database.d.ts +549 -0
  48. package/lib/database.js +803 -0
  49. package/lib/db-ops/_shared/clear-write-ref-caches.d.ts +27 -0
  50. package/lib/db-ops/_shared/clear-write-ref-caches.js +35 -0
  51. package/lib/db-ops/_shared/compress-payload.d.ts +26 -0
  52. package/lib/db-ops/_shared/compress-payload.js +30 -0
  53. package/lib/db-ops/_shared/create-write-ref-caches.d.ts +17 -0
  54. package/lib/db-ops/_shared/create-write-ref-caches.js +27 -0
  55. package/lib/db-ops/_shared/decode-json-ref.d.ts +17 -0
  56. package/lib/db-ops/_shared/decode-json-ref.js +31 -0
  57. package/lib/db-ops/_shared/keyset-paginate-by-id.d.ts +49 -0
  58. package/lib/db-ops/_shared/keyset-paginate-by-id.js +69 -0
  59. package/lib/db-ops/_shared/load-response-headers-by-set-ids.d.ts +20 -0
  60. package/lib/db-ops/_shared/load-response-headers-by-set-ids.js +53 -0
  61. package/lib/db-ops/_shared/resolve-content-item-id.d.ts +62 -0
  62. package/lib/db-ops/_shared/resolve-content-item-id.js +143 -0
  63. package/lib/db-ops/_shared/resolve-url-or-blob.d.ts +23 -0
  64. package/lib/db-ops/_shared/resolve-url-or-blob.js +29 -0
  65. package/lib/db-ops/_shared/retry-setting.d.ts +16 -0
  66. package/lib/db-ops/_shared/retry-setting.js +18 -0
  67. package/lib/db-ops/_shared/safe-parse-json.d.ts +11 -0
  68. package/lib/db-ops/_shared/safe-parse-json.js +18 -0
  69. package/lib/db-ops/_shared/types.d.ts +94 -0
  70. package/lib/db-ops/_shared/types.js +1 -0
  71. package/lib/db-ops/_shared/upsert-blob-ref.d.ts +25 -0
  72. package/lib/db-ops/_shared/upsert-blob-ref.js +48 -0
  73. package/lib/db-ops/_shared/upsert-content-type-ref.d.ts +30 -0
  74. package/lib/db-ops/_shared/upsert-content-type-ref.js +45 -0
  75. package/lib/db-ops/_shared/upsert-json-ref.d.ts +22 -0
  76. package/lib/db-ops/_shared/upsert-json-ref.js +41 -0
  77. package/lib/db-ops/_shared/upsert-response-headers.d.ts +35 -0
  78. package/lib/db-ops/_shared/upsert-response-headers.js +49 -0
  79. package/lib/db-ops/_shared/upsert-url-ref.d.ts +39 -0
  80. package/lib/db-ops/_shared/upsert-url-ref.js +62 -0
  81. package/lib/db-ops/anchors/get-anchors-on-page.d.ts +10 -0
  82. package/lib/db-ops/anchors/get-anchors-on-page.js +21 -0
  83. package/lib/db-ops/config/get-base-url.d.ts +8 -0
  84. package/lib/db-ops/config/get-base-url.js +14 -0
  85. package/lib/db-ops/config/get-config.d.ts +10 -0
  86. package/lib/db-ops/config/get-config.js +29 -0
  87. package/lib/db-ops/config/get-created-cwd.d.ts +11 -0
  88. package/lib/db-ops/config/get-created-cwd.js +13 -0
  89. package/lib/db-ops/config/get-name.d.ts +8 -0
  90. package/lib/db-ops/config/get-name.js +14 -0
  91. package/lib/db-ops/config/info-column-allowlist.d.ts +7 -0
  92. package/lib/db-ops/config/info-column-allowlist.js +29 -0
  93. package/lib/db-ops/config/info-json-columns.d.ts +5 -0
  94. package/lib/db-ops/config/info-json-columns.js +11 -0
  95. package/lib/db-ops/config/set-config.d.ts +12 -0
  96. package/lib/db-ops/config/set-config.js +21 -0
  97. package/lib/db-ops/config/update-config.d.ts +17 -0
  98. package/lib/db-ops/config/update-config.js +36 -0
  99. package/lib/db-ops/console-logs/compute-console-log-hash.d.ts +19 -0
  100. package/lib/db-ops/console-logs/compute-console-log-hash.js +30 -0
  101. package/lib/db-ops/console-logs/replace-console-logs.d.ts +34 -0
  102. package/lib/db-ops/console-logs/replace-console-logs.js +123 -0
  103. package/lib/db-ops/console-logs/stringify-console-log-args.d.ts +16 -0
  104. package/lib/db-ops/console-logs/stringify-console-log-args.js +26 -0
  105. package/lib/db-ops/console-logs/types.d.ts +38 -0
  106. package/lib/db-ops/console-logs/types.js +1 -0
  107. package/lib/db-ops/console-logs/upsert-console-log-item.d.ts +29 -0
  108. package/lib/db-ops/console-logs/upsert-console-log-item.js +52 -0
  109. package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.d.ts +18 -0
  110. package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.js +23 -0
  111. package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.d.ts +12 -0
  112. package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.js +15 -0
  113. package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.d.ts +14 -0
  114. package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.js +30 -0
  115. package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.d.ts +57 -0
  116. package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.js +87 -0
  117. package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.d.ts +21 -0
  118. package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.js +27 -0
  119. package/lib/db-ops/errors/insert-crawl-error.d.ts +15 -0
  120. package/lib/db-ops/errors/insert-crawl-error.js +21 -0
  121. package/lib/db-ops/errors/insert-page-error.d.ts +21 -0
  122. package/lib/db-ops/errors/insert-page-error.js +30 -0
  123. package/lib/db-ops/errors/list-dns-burned-host-candidates.d.ts +33 -0
  124. package/lib/db-ops/errors/list-dns-burned-host-candidates.js +158 -0
  125. package/lib/db-ops/html/read-page-html-blob.d.ts +17 -0
  126. package/lib/db-ops/html/read-page-html-blob.js +20 -0
  127. package/lib/db-ops/lifecycle/checkpoint.d.ts +8 -0
  128. package/lib/db-ops/lifecycle/checkpoint.js +9 -0
  129. package/lib/db-ops/lifecycle/destroy.d.ts +6 -0
  130. package/lib/db-ops/lifecycle/destroy.js +7 -0
  131. package/lib/db-ops/lifecycle/init.d.ts +58 -0
  132. package/lib/db-ops/lifecycle/init.js +122 -0
  133. package/lib/db-ops/list-reconcile/record-list-reconcile-run.d.ts +22 -0
  134. package/lib/db-ops/list-reconcile/record-list-reconcile-run.js +41 -0
  135. package/lib/db-ops/meta/get-audios-of-page.d.ts +11 -0
  136. package/lib/db-ops/meta/get-audios-of-page.js +15 -0
  137. package/lib/db-ops/meta/get-buttons-of-page.d.ts +11 -0
  138. package/lib/db-ops/meta/get-buttons-of-page.js +15 -0
  139. package/lib/db-ops/meta/get-canvases-of-page.d.ts +11 -0
  140. package/lib/db-ops/meta/get-canvases-of-page.js +15 -0
  141. package/lib/db-ops/meta/get-custom-elements-of-page.d.ts +11 -0
  142. package/lib/db-ops/meta/get-custom-elements-of-page.js +15 -0
  143. package/lib/db-ops/meta/get-headings-of-page.d.ts +11 -0
  144. package/lib/db-ops/meta/get-headings-of-page.js +15 -0
  145. package/lib/db-ops/meta/get-iframes-of-page.d.ts +11 -0
  146. package/lib/db-ops/meta/get-iframes-of-page.js +15 -0
  147. package/lib/db-ops/meta/get-jsonld-of-page.d.ts +13 -0
  148. package/lib/db-ops/meta/get-jsonld-of-page.js +27 -0
  149. package/lib/db-ops/meta/get-main-content-images-of-page.d.ts +11 -0
  150. package/lib/db-ops/meta/get-main-content-images-of-page.js +15 -0
  151. package/lib/db-ops/meta/get-main-content-tables-of-page.d.ts +11 -0
  152. package/lib/db-ops/meta/get-main-content-tables-of-page.js +15 -0
  153. package/lib/db-ops/meta/get-page-technologies-of-page.d.ts +11 -0
  154. package/lib/db-ops/meta/get-page-technologies-of-page.js +15 -0
  155. package/lib/db-ops/meta/get-technology-signals-of-page.d.ts +11 -0
  156. package/lib/db-ops/meta/get-technology-signals-of-page.js +15 -0
  157. package/lib/db-ops/meta/get-videos-of-page.d.ts +11 -0
  158. package/lib/db-ops/meta/get-videos-of-page.js +15 -0
  159. package/lib/db-ops/outages/close-network-outage.d.ts +12 -0
  160. package/lib/db-ops/outages/close-network-outage.js +15 -0
  161. package/lib/db-ops/outages/close-stale-open-network-outages.d.ts +26 -0
  162. package/lib/db-ops/outages/close-stale-open-network-outages.js +42 -0
  163. package/lib/db-ops/outages/compute-outage-clamp-timestamp.d.ts +26 -0
  164. package/lib/db-ops/outages/compute-outage-clamp-timestamp.js +31 -0
  165. package/lib/db-ops/outages/insert-network-outage.d.ts +14 -0
  166. package/lib/db-ops/outages/insert-network-outage.js +29 -0
  167. package/lib/db-ops/outages/list-network-outages.d.ts +28 -0
  168. package/lib/db-ops/outages/list-network-outages.js +42 -0
  169. package/lib/db-ops/pages/order/set-url-order.d.ts +13 -0
  170. package/lib/db-ops/pages/order/set-url-order.js +38 -0
  171. package/lib/db-ops/pages/read/build-page-query.d.ts +18 -0
  172. package/lib/db-ops/pages/read/build-page-query.js +40 -0
  173. package/lib/db-ops/pages/read/get-crawling-state.d.ts +117 -0
  174. package/lib/db-ops/pages/read/get-crawling-state.js +161 -0
  175. package/lib/db-ops/pages/read/get-existing-page-urls.d.ts +15 -0
  176. package/lib/db-ops/pages/read/get-existing-page-urls.js +30 -0
  177. package/lib/db-ops/pages/read/get-page-count.d.ts +12 -0
  178. package/lib/db-ops/pages/read/get-page-count.js +21 -0
  179. package/lib/db-ops/pages/read/get-page-source-by-url.d.ts +24 -0
  180. package/lib/db-ops/pages/read/get-page-source-by-url.js +28 -0
  181. package/lib/db-ops/pages/read/get-pages-with-rels.d.ts +38 -0
  182. package/lib/db-ops/pages/read/get-pages-with-rels.js +107 -0
  183. package/lib/db-ops/pages/read/get-pages.d.ts +11 -0
  184. package/lib/db-ops/pages/read/get-pages.js +51 -0
  185. package/lib/db-ops/pages/read/get-scraped-html-page-count.d.ts +18 -0
  186. package/lib/db-ops/pages/read/get-scraped-html-page-count.js +25 -0
  187. package/lib/db-ops/pages/read/reconstruct-page-rows.d.ts +31 -0
  188. package/lib/db-ops/pages/read/reconstruct-page-rows.js +32 -0
  189. package/lib/db-ops/pages/reset/clear-page-derived-rows.d.ts +20 -0
  190. package/lib/db-ops/pages/reset/clear-page-derived-rows.js +37 -0
  191. package/lib/db-ops/pages/reset/repromote-external-pages.d.ts +30 -0
  192. package/lib/db-ops/pages/reset/repromote-external-pages.js +91 -0
  193. package/lib/db-ops/pages/reset/reset-failed-pages.d.ts +88 -0
  194. package/lib/db-ops/pages/reset/reset-failed-pages.js +216 -0
  195. package/lib/db-ops/pages/reset/reset-pages-by-urls.d.ts +80 -0
  196. package/lib/db-ops/pages/reset/reset-pages-by-urls.js +151 -0
  197. package/lib/db-ops/pages/reset/retryable-image-scan-codes.d.ts +24 -0
  198. package/lib/db-ops/pages/reset/retryable-image-scan-codes.js +24 -0
  199. package/lib/db-ops/pages/write/insert-audios.d.ts +14 -0
  200. package/lib/db-ops/pages/write/insert-audios.js +25 -0
  201. package/lib/db-ops/pages/write/insert-buttons.d.ts +14 -0
  202. package/lib/db-ops/pages/write/insert-buttons.js +29 -0
  203. package/lib/db-ops/pages/write/insert-canvases.d.ts +14 -0
  204. package/lib/db-ops/pages/write/insert-canvases.js +26 -0
  205. package/lib/db-ops/pages/write/insert-custom-elements.d.ts +27 -0
  206. package/lib/db-ops/pages/write/insert-custom-elements.js +40 -0
  207. package/lib/db-ops/pages/write/insert-headings.d.ts +15 -0
  208. package/lib/db-ops/pages/write/insert-headings.js +27 -0
  209. package/lib/db-ops/pages/write/insert-iframes.d.ts +14 -0
  210. package/lib/db-ops/pages/write/insert-iframes.js +28 -0
  211. package/lib/db-ops/pages/write/insert-inventory-content-items.d.ts +38 -0
  212. package/lib/db-ops/pages/write/insert-inventory-content-items.js +60 -0
  213. package/lib/db-ops/pages/write/insert-inventory-seeds.d.ts +36 -0
  214. package/lib/db-ops/pages/write/insert-inventory-seeds.js +48 -0
  215. package/lib/db-ops/pages/write/insert-inventory-skipped-pages.d.ts +42 -0
  216. package/lib/db-ops/pages/write/insert-inventory-skipped-pages.js +56 -0
  217. package/lib/db-ops/pages/write/insert-jsonld.d.ts +17 -0
  218. package/lib/db-ops/pages/write/insert-jsonld.js +49 -0
  219. package/lib/db-ops/pages/write/insert-main-content-images.d.ts +20 -0
  220. package/lib/db-ops/pages/write/insert-main-content-images.js +32 -0
  221. package/lib/db-ops/pages/write/insert-main-content-tables.d.ts +14 -0
  222. package/lib/db-ops/pages/write/insert-main-content-tables.js +29 -0
  223. package/lib/db-ops/pages/write/insert-page.d.ts +56 -0
  224. package/lib/db-ops/pages/write/insert-page.js +259 -0
  225. package/lib/db-ops/pages/write/insert-technologies.d.ts +25 -0
  226. package/lib/db-ops/pages/write/insert-technologies.js +45 -0
  227. package/lib/db-ops/pages/write/insert-videos.d.ts +14 -0
  228. package/lib/db-ops/pages/write/insert-videos.js +28 -0
  229. package/lib/db-ops/pages/write/link-redirect-sources.d.ts +42 -0
  230. package/lib/db-ops/pages/write/link-redirect-sources.js +101 -0
  231. package/lib/db-ops/pages/write/record-redirect.d.ts +35 -0
  232. package/lib/db-ops/pages/write/record-redirect.js +100 -0
  233. package/lib/db-ops/pages/write/set-skipped-page.d.ts +13 -0
  234. package/lib/db-ops/pages/write/set-skipped-page.js +24 -0
  235. package/lib/db-ops/pages/write/update-page.d.ts +40 -0
  236. package/lib/db-ops/pages/write/update-page.js +419 -0
  237. package/lib/db-ops/pages/write/write-page-html-blob.d.ts +19 -0
  238. package/lib/db-ops/pages/write/write-page-html-blob.js +41 -0
  239. package/lib/db-ops/referrers/get-redirects-for-pages.d.ts +9 -0
  240. package/lib/db-ops/referrers/get-redirects-for-pages.js +15 -0
  241. package/lib/db-ops/referrers/get-referrers-of-page.d.ts +17 -0
  242. package/lib/db-ops/referrers/get-referrers-of-page.js +32 -0
  243. package/lib/db-ops/referrers/get-referrers-of-resource.d.ts +8 -0
  244. package/lib/db-ops/referrers/get-referrers-of-resource.js +15 -0
  245. package/lib/db-ops/resources/build-resource-query.d.ts +25 -0
  246. package/lib/db-ops/resources/build-resource-query.js +29 -0
  247. package/lib/db-ops/resources/get-existing-resource-urls.d.ts +9 -0
  248. package/lib/db-ops/resources/get-existing-resource-urls.js +24 -0
  249. package/lib/db-ops/resources/get-resource-by-url.d.ts +13 -0
  250. package/lib/db-ops/resources/get-resource-by-url.js +22 -0
  251. package/lib/db-ops/resources/get-resource-url-list.d.ts +17 -0
  252. package/lib/db-ops/resources/get-resource-url-list.js +26 -0
  253. package/lib/db-ops/resources/get-resources.d.ts +8 -0
  254. package/lib/db-ops/resources/get-resources.js +11 -0
  255. package/lib/db-ops/resources/insert-inventory-resources.d.ts +24 -0
  256. package/lib/db-ops/resources/insert-inventory-resources.js +64 -0
  257. package/lib/db-ops/resources/insert-resource-referrers.d.ts +15 -0
  258. package/lib/db-ops/resources/insert-resource-referrers.js +54 -0
  259. package/lib/db-ops/resources/insert-resource.d.ts +34 -0
  260. package/lib/db-ops/resources/insert-resource.js +73 -0
  261. package/lib/db-ops/resources/reconstruct-resource-rows.d.ts +26 -0
  262. package/lib/db-ops/resources/reconstruct-resource-rows.js +30 -0
  263. package/lib/db-ops/templates/assign-template-labels.d.ts +60 -0
  264. package/lib/db-ops/templates/assign-template-labels.js +187 -0
  265. package/lib/db-ops/templates/replace-page-templates.d.ts +44 -0
  266. package/lib/db-ops/templates/replace-page-templates.js +174 -0
  267. package/lib/db-ops/templates/serialize-template-cluster-reason.d.ts +16 -0
  268. package/lib/db-ops/templates/serialize-template-cluster-reason.js +17 -0
  269. package/lib/db-ops/templates/types.d.ts +103 -0
  270. package/lib/db-ops/templates/types.js +1 -0
  271. package/lib/debug.d.ts +8 -0
  272. package/lib/debug.js +9 -0
  273. package/lib/decode-html-blob.d.ts +20 -0
  274. package/lib/decode-html-blob.js +23 -0
  275. package/lib/decode-page-html-blob-bytes.d.ts +25 -0
  276. package/lib/decode-page-html-blob-bytes.js +29 -0
  277. package/lib/decode-stored-blob-bytes.d.ts +25 -0
  278. package/lib/decode-stored-blob-bytes.js +47 -0
  279. package/lib/derive-lineage-from-parent.d.ts +37 -0
  280. package/lib/derive-lineage-from-parent.js +42 -0
  281. package/lib/drop-legacy-tables.d.ts +45 -0
  282. package/lib/drop-legacy-tables.js +56 -0
  283. package/lib/error-kind/classify-error-kind.d.ts +20 -0
  284. package/lib/error-kind/classify-error-kind.js +136 -0
  285. package/lib/error-kind/network-related-error-kinds.d.ts +23 -0
  286. package/lib/error-kind/network-related-error-kinds.js +28 -0
  287. package/lib/error-kind/permanent-error-kinds.d.ts +48 -0
  288. package/lib/error-kind/permanent-error-kinds.js +54 -0
  289. package/lib/error-kind/types.d.ts +54 -0
  290. package/lib/error-kind/types.js +1 -0
  291. package/lib/filesystem/append-text.d.ts +9 -0
  292. package/lib/filesystem/append-text.js +14 -0
  293. package/lib/filesystem/copy-dir-sync.d.ts +6 -0
  294. package/lib/filesystem/copy-dir-sync.js +9 -0
  295. package/lib/filesystem/copy-dir.d.ts +7 -0
  296. package/lib/filesystem/copy-dir.js +13 -0
  297. package/lib/filesystem/copy-file-with-progress.d.ts +20 -0
  298. package/lib/filesystem/copy-file-with-progress.js +34 -0
  299. package/lib/filesystem/exists.d.ts +6 -0
  300. package/lib/filesystem/exists.js +9 -0
  301. package/lib/filesystem/get-file-list.d.ts +8 -0
  302. package/lib/filesystem/get-file-list.js +12 -0
  303. package/lib/filesystem/is-dir.d.ts +6 -0
  304. package/lib/filesystem/is-dir.js +10 -0
  305. package/lib/filesystem/mkdir.d.ts +8 -0
  306. package/lib/filesystem/mkdir.js +15 -0
  307. package/lib/filesystem/output-binary.d.ts +12 -0
  308. package/lib/filesystem/output-binary.js +17 -0
  309. package/lib/filesystem/output-json.d.ts +9 -0
  310. package/lib/filesystem/output-json.js +14 -0
  311. package/lib/filesystem/output-text.d.ts +11 -0
  312. package/lib/filesystem/output-text.js +32 -0
  313. package/lib/filesystem/parse-pax-path.d.ts +18 -0
  314. package/lib/filesystem/parse-pax-path.js +45 -0
  315. package/lib/filesystem/parse-tar-size-field.d.ts +13 -0
  316. package/lib/filesystem/parse-tar-size-field.js +37 -0
  317. package/lib/filesystem/peek-tar-top-dir.d.ts +35 -0
  318. package/lib/filesystem/peek-tar-top-dir.js +215 -0
  319. package/lib/filesystem/read-json.d.ts +7 -0
  320. package/lib/filesystem/read-json.js +11 -0
  321. package/lib/filesystem/read-text.d.ts +6 -0
  322. package/lib/filesystem/read-text.js +10 -0
  323. package/lib/filesystem/readline.d.ts +11 -0
  324. package/lib/filesystem/readline.js +26 -0
  325. package/lib/filesystem/remove.d.ts +5 -0
  326. package/lib/filesystem/remove.js +10 -0
  327. package/lib/filesystem/rename.d.ts +16 -0
  328. package/lib/filesystem/rename.js +48 -0
  329. package/lib/filesystem/tar.d.ts +23 -0
  330. package/lib/filesystem/tar.js +78 -0
  331. package/lib/filesystem/untar.d.ts +33 -0
  332. package/lib/filesystem/untar.js +84 -0
  333. package/lib/get-failed-page-messages.d.ts +56 -0
  334. package/lib/get-failed-page-messages.js +146 -0
  335. package/lib/get-json.d.ts +10 -0
  336. package/lib/get-json.js +25 -0
  337. package/lib/html-snapshot/match-selector-html.d.ts +25 -0
  338. package/lib/html-snapshot/match-selector-html.js +28 -0
  339. package/lib/html-snapshot/match-selector-snapshots.d.ts +33 -0
  340. package/lib/html-snapshot/match-selector-snapshots.js +33 -0
  341. package/lib/html-snapshot/search-html-document.d.ts +29 -0
  342. package/lib/html-snapshot/search-html-document.js +27 -0
  343. package/lib/html-snapshot/search-html-snapshots.d.ts +36 -0
  344. package/lib/html-snapshot/search-html-snapshots.js +35 -0
  345. package/lib/html-snapshot/types.d.ts +111 -0
  346. package/lib/html-snapshot/types.js +7 -0
  347. package/lib/html-snapshot/validate-search-pattern.d.ts +15 -0
  348. package/lib/html-snapshot/validate-search-pattern.js +17 -0
  349. package/lib/init-schema.d.ts +48 -0
  350. package/lib/init-schema.js +124 -0
  351. package/lib/is-inventory-source.d.ts +21 -0
  352. package/lib/is-inventory-source.js +22 -0
  353. package/lib/is-within-outage-window.d.ts +49 -0
  354. package/lib/is-within-outage-window.js +33 -0
  355. package/lib/isolated-cluster/create-isolated-cluster-run.d.ts +24 -0
  356. package/lib/isolated-cluster/create-isolated-cluster-run.js +26 -0
  357. package/lib/libsql-dialect.d.ts +115 -0
  358. package/lib/libsql-dialect.js +116 -0
  359. package/lib/limited-page-ids.d.ts +9 -0
  360. package/lib/limited-page-ids.js +18 -0
  361. package/lib/meta/assert-compatible-version.d.ts +60 -0
  362. package/lib/meta/assert-compatible-version.js +93 -0
  363. package/lib/meta/classify-jsonld-type.d.ts +23 -0
  364. package/lib/meta/classify-jsonld-type.js +43 -0
  365. package/lib/meta/compare-semver.d.ts +23 -0
  366. package/lib/meta/compare-semver.js +51 -0
  367. package/lib/meta/compute-main-contents-denormalized.d.ts +41 -0
  368. package/lib/meta/compute-main-contents-denormalized.js +88 -0
  369. package/lib/meta/compute-page-denormalized.d.ts +20 -0
  370. package/lib/meta/compute-page-denormalized.js +35 -0
  371. package/lib/meta/derive-flat-from-meta.d.ts +34 -0
  372. package/lib/meta/derive-flat-from-meta.js +158 -0
  373. package/lib/meta/derive-meta-extras.d.ts +20 -0
  374. package/lib/meta/derive-meta-extras.js +23 -0
  375. package/lib/meta/extract-tags-for-archive.d.ts +17 -0
  376. package/lib/meta/extract-tags-for-archive.js +36 -0
  377. package/lib/meta/parse-main-content-class-list.d.ts +19 -0
  378. package/lib/meta/parse-main-content-class-list.js +34 -0
  379. package/lib/meta/summarize-jsonld.d.ts +17 -0
  380. package/lib/meta/summarize-jsonld.js +29 -0
  381. package/lib/meta/technologies/combine-technology-confidence.d.ts +46 -0
  382. package/lib/meta/technologies/combine-technology-confidence.js +93 -0
  383. package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.d.ts +45 -0
  384. package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.js +53 -0
  385. package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.d.ts +33 -0
  386. package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.js +46 -0
  387. package/lib/meta/technologies/extract-technologies-for-archive.d.ts +33 -0
  388. package/lib/meta/technologies/extract-technologies-for-archive.js +30 -0
  389. package/lib/meta/technologies/match-js-license-comment-signal.d.ts +21 -0
  390. package/lib/meta/technologies/match-js-license-comment-signal.js +23 -0
  391. package/lib/meta/technologies/match-structural-technology-signals.d.ts +26 -0
  392. package/lib/meta/technologies/match-structural-technology-signals.js +48 -0
  393. package/lib/meta/technologies/normalize-wappalyzer-entries.d.ts +25 -0
  394. package/lib/meta/technologies/normalize-wappalyzer-entries.js +35 -0
  395. package/lib/meta/technologies/technology-signal-definitions.d.ts +44 -0
  396. package/lib/meta/technologies/technology-signal-definitions.js +60 -0
  397. package/lib/meta/technologies/types.d.ts +70 -0
  398. package/lib/meta/technologies/types.js +13 -0
  399. package/lib/meta/types.d.ts +1490 -0
  400. package/lib/meta/types.js +65 -0
  401. package/lib/migrate-content-items-alias-of-id.d.ts +52 -0
  402. package/lib/migrate-content-items-alias-of-id.js +69 -0
  403. package/lib/migrate-content-items-dedupe-cap-event-id.d.ts +46 -0
  404. package/lib/migrate-content-items-dedupe-cap-event-id.js +62 -0
  405. package/lib/migrate-content-items-is-metadata-only.d.ts +44 -0
  406. package/lib/migrate-content-items-is-metadata-only.js +60 -0
  407. package/lib/migrate-entity-tables.d.ts +55 -0
  408. package/lib/migrate-entity-tables.js +66 -0
  409. package/lib/migrate-info-created-cwd.d.ts +17 -0
  410. package/lib/migrate-info-created-cwd.js +36 -0
  411. package/lib/migrate-info-main-content-selector.d.ts +16 -0
  412. package/lib/migrate-info-main-content-selector.js +35 -0
  413. package/lib/migrate-info-request-header-names.d.ts +16 -0
  414. package/lib/migrate-info-request-header-names.js +35 -0
  415. package/lib/migrate-info-roots.d.ts +20 -0
  416. package/lib/migrate-info-roots.js +52 -0
  417. package/lib/migrate-inventory-runs-to-list-reconcile-runs.d.ts +34 -0
  418. package/lib/migrate-inventory-runs-to-list-reconcile-runs.js +51 -0
  419. package/lib/migrate-list-reconcile-runs-exclude-skipped.d.ts +25 -0
  420. package/lib/migrate-list-reconcile-runs-exclude-skipped.js +44 -0
  421. package/lib/migrate-list-reconcile-runs-invalid-skipped.d.ts +16 -0
  422. package/lib/migrate-list-reconcile-runs-invalid-skipped.js +35 -0
  423. package/lib/migrate-main-contents-columns.d.ts +26 -0
  424. package/lib/migrate-main-contents-columns.js +61 -0
  425. package/lib/migrate-page-meta-body-hash.d.ts +44 -0
  426. package/lib/migrate-page-meta-body-hash.js +63 -0
  427. package/lib/migrate-page-meta-console-error-count.d.ts +27 -0
  428. package/lib/migrate-page-meta-console-error-count.js +45 -0
  429. package/lib/migrate-page-meta-custom-element-count.d.ts +33 -0
  430. package/lib/migrate-page-meta-custom-element-count.js +51 -0
  431. package/lib/migrate-page-meta-image-scan.d.ts +27 -0
  432. package/lib/migrate-page-meta-image-scan.js +52 -0
  433. package/lib/migrate-page-tags-to-page-technologies.d.ts +39 -0
  434. package/lib/migrate-page-tags-to-page-technologies.js +79 -0
  435. package/lib/migrate-ref-tables.d.ts +25 -0
  436. package/lib/migrate-ref-tables.js +38 -0
  437. package/lib/native-executor/check-native-executor-config.d.ts +17 -0
  438. package/lib/native-executor/check-native-executor-config.js +20 -0
  439. package/lib/page-meta-column-maps.d.ts +32 -0
  440. package/lib/page-meta-column-maps.js +43 -0
  441. package/lib/page.d.ts +546 -0
  442. package/lib/page.js +764 -0
  443. package/lib/peek-archive-lock.d.ts +40 -0
  444. package/lib/peek-archive-lock.js +62 -0
  445. package/lib/populate-entity-tables/collapse-anchor-rows.d.ts +41 -0
  446. package/lib/populate-entity-tables/collapse-anchor-rows.js +87 -0
  447. package/lib/populate-entity-tables/derive-dom-path.d.ts +35 -0
  448. package/lib/populate-entity-tables/derive-dom-path.js +72 -0
  449. package/lib/populate-entity-tables/is-blob-ref-value.d.ts +16 -0
  450. package/lib/populate-entity-tables/is-blob-ref-value.js +19 -0
  451. package/lib/populate-entity-tables/match-images-to-dom-paths.d.ts +66 -0
  452. package/lib/populate-entity-tables/match-images-to-dom-paths.js +96 -0
  453. package/lib/populate-entity-tables/populate-anchor-edges.d.ts +33 -0
  454. package/lib/populate-entity-tables/populate-anchor-edges.js +153 -0
  455. package/lib/populate-entity-tables/populate-content-items.d.ts +40 -0
  456. package/lib/populate-entity-tables/populate-content-items.js +141 -0
  457. package/lib/populate-entity-tables/populate-entities.d.ts +81 -0
  458. package/lib/populate-entity-tables/populate-entities.js +110 -0
  459. package/lib/populate-entity-tables/populate-image-items.d.ts +91 -0
  460. package/lib/populate-entity-tables/populate-image-items.js +226 -0
  461. package/lib/populate-entity-tables/populate-page-meta.d.ts +33 -0
  462. package/lib/populate-entity-tables/populate-page-meta.js +267 -0
  463. package/lib/populate-entity-tables/populate-resource-items.d.ts +22 -0
  464. package/lib/populate-entity-tables/populate-resource-items.js +114 -0
  465. package/lib/populate-entity-tables/populate-resource-ref-edges.d.ts +31 -0
  466. package/lib/populate-entity-tables/populate-resource-ref-edges.js +33 -0
  467. package/lib/populate-entity-tables/resolve-blob-refs.d.ts +31 -0
  468. package/lib/populate-entity-tables/resolve-blob-refs.js +100 -0
  469. package/lib/populate-entity-tables/resolve-content-type-refs.d.ts +22 -0
  470. package/lib/populate-entity-tables/resolve-content-type-refs.js +27 -0
  471. package/lib/populate-entity-tables/resolve-header-sets.d.ts +49 -0
  472. package/lib/populate-entity-tables/resolve-header-sets.js +122 -0
  473. package/lib/populate-entity-tables/resolve-json-refs.d.ts +25 -0
  474. package/lib/populate-entity-tables/resolve-json-refs.js +67 -0
  475. package/lib/populate-entity-tables/resolve-text-refs.d.ts +30 -0
  476. package/lib/populate-entity-tables/resolve-text-refs.js +61 -0
  477. package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.d.ts +21 -0
  478. package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.js +27 -0
  479. package/lib/populate-entity-tables/resolve-url-refs.d.ts +33 -0
  480. package/lib/populate-entity-tables/resolve-url-refs.js +60 -0
  481. package/lib/populate-entity-tables/test-utils/count-rows.d.ts +17 -0
  482. package/lib/populate-entity-tables/test-utils/count-rows.js +20 -0
  483. package/lib/populate-entity-tables/test-utils/seed-content-items.d.ts +25 -0
  484. package/lib/populate-entity-tables/test-utils/seed-content-items.js +42 -0
  485. package/lib/populate-entity-tables/test-utils/setup-entities-db.d.ts +30 -0
  486. package/lib/populate-entity-tables/test-utils/setup-entities-db.js +175 -0
  487. package/lib/populate-entity-tables/types.d.ts +157 -0
  488. package/lib/populate-entity-tables/types.js +12 -0
  489. package/lib/populate-entity-tables/upsert-text-refs.d.ts +38 -0
  490. package/lib/populate-entity-tables/upsert-text-refs.js +78 -0
  491. package/lib/populate-ref-tables/classify-content-type.d.ts +16 -0
  492. package/lib/populate-ref-tables/classify-content-type.js +52 -0
  493. package/lib/populate-ref-tables/compute-content-hash.d.ts +22 -0
  494. package/lib/populate-ref-tables/compute-content-hash.js +26 -0
  495. package/lib/populate-ref-tables/compute-header-flags.d.ts +16 -0
  496. package/lib/populate-ref-tables/compute-header-flags.js +70 -0
  497. package/lib/populate-ref-tables/content-type-rules.d.ts +38 -0
  498. package/lib/populate-ref-tables/content-type-rules.js +133 -0
  499. package/lib/populate-ref-tables/create-header-table-caches.d.ts +25 -0
  500. package/lib/populate-ref-tables/create-header-table-caches.js +49 -0
  501. package/lib/populate-ref-tables/data-uri-url-refs-limit.d.ts +15 -0
  502. package/lib/populate-ref-tables/data-uri-url-refs-limit.js +15 -0
  503. package/lib/populate-ref-tables/decode-data-uri.d.ts +21 -0
  504. package/lib/populate-ref-tables/decode-data-uri.js +126 -0
  505. package/lib/populate-ref-tables/decompose-header-set.d.ts +29 -0
  506. package/lib/populate-ref-tables/decompose-header-set.js +157 -0
  507. package/lib/populate-ref-tables/decompose-url.d.ts +25 -0
  508. package/lib/populate-ref-tables/decompose-url.js +70 -0
  509. package/lib/populate-ref-tables/header-stability.d.ts +19 -0
  510. package/lib/populate-ref-tables/header-stability.js +22 -0
  511. package/lib/populate-ref-tables/header-value-cache-key.d.ts +17 -0
  512. package/lib/populate-ref-tables/header-value-cache-key.js +19 -0
  513. package/lib/populate-ref-tables/normalize-mime.d.ts +24 -0
  514. package/lib/populate-ref-tables/normalize-mime.js +36 -0
  515. package/lib/populate-ref-tables/populate-blob-refs.d.ts +38 -0
  516. package/lib/populate-ref-tables/populate-blob-refs.js +134 -0
  517. package/lib/populate-ref-tables/populate-content-type-refs.d.ts +27 -0
  518. package/lib/populate-ref-tables/populate-content-type-refs.js +70 -0
  519. package/lib/populate-ref-tables/populate-header-tables.d.ts +35 -0
  520. package/lib/populate-ref-tables/populate-header-tables.js +80 -0
  521. package/lib/populate-ref-tables/populate-json-refs.d.ts +29 -0
  522. package/lib/populate-ref-tables/populate-json-refs.js +101 -0
  523. package/lib/populate-ref-tables/populate-refs.d.ts +51 -0
  524. package/lib/populate-ref-tables/populate-refs.js +62 -0
  525. package/lib/populate-ref-tables/populate-text-refs.d.ts +32 -0
  526. package/lib/populate-ref-tables/populate-text-refs.js +133 -0
  527. package/lib/populate-ref-tables/populate-url-refs.d.ts +28 -0
  528. package/lib/populate-ref-tables/populate-url-refs.js +148 -0
  529. package/lib/populate-ref-tables/test-utils/count-rows.d.ts +15 -0
  530. package/lib/populate-ref-tables/test-utils/count-rows.js +17 -0
  531. package/lib/populate-ref-tables/types.d.ts +197 -0
  532. package/lib/populate-ref-tables/types.js +7 -0
  533. package/lib/populate-ref-tables/upsert-one-header-set.d.ts +34 -0
  534. package/lib/populate-ref-tables/upsert-one-header-set.js +208 -0
  535. package/lib/populate-ref-tables/volatile-header-names.d.ts +20 -0
  536. package/lib/populate-ref-tables/volatile-header-names.js +33 -0
  537. package/lib/redirect-table.d.ts +9 -0
  538. package/lib/redirect-table.js +28 -0
  539. package/lib/release-finished-statements.d.ts +42 -0
  540. package/lib/release-finished-statements.js +45 -0
  541. package/lib/resolve-redirect-chain.d.ts +33 -0
  542. package/lib/resolve-redirect-chain.js +27 -0
  543. package/lib/resource.d.ts +46 -0
  544. package/lib/resource.js +62 -0
  545. package/lib/retarget-legacy-fk-tables.d.ts +61 -0
  546. package/lib/retarget-legacy-fk-tables.js +137 -0
  547. package/lib/safe-path.d.ts +9 -0
  548. package/lib/safe-path.js +17 -0
  549. package/lib/scope/build-scope-map.d.ts +21 -0
  550. package/lib/scope/build-scope-map.js +32 -0
  551. package/lib/scope/find-scope-entry.d.ts +25 -0
  552. package/lib/scope/find-scope-entry.js +45 -0
  553. package/lib/template-classification/classify-archive-page-templates.d.ts +42 -0
  554. package/lib/template-classification/classify-archive-page-templates.js +70 -0
  555. package/lib/template-classification/classify-page-templates.d.ts +33 -0
  556. package/lib/template-classification/classify-page-templates.js +60 -0
  557. package/lib/template-classification/collect-page-ids-with-html.d.ts +24 -0
  558. package/lib/template-classification/collect-page-ids-with-html.js +30 -0
  559. package/lib/template-classification/collect-page-stylesheet-urls.d.ts +32 -0
  560. package/lib/template-classification/collect-page-stylesheet-urls.js +132 -0
  561. package/lib/template-classification/create-content-root-hint.d.ts +41 -0
  562. package/lib/template-classification/create-content-root-hint.js +51 -0
  563. package/lib/template-classification/create-page-cluster-factory.d.ts +36 -0
  564. package/lib/template-classification/create-page-cluster-factory.js +52 -0
  565. package/lib/template-classification/load-page-cluster-candidates.d.ts +32 -0
  566. package/lib/template-classification/load-page-cluster-candidates.js +93 -0
  567. package/lib/template-classification/page-cluster/resolve-page-cluster-keys.d.ts +34 -0
  568. package/lib/template-classification/page-cluster/resolve-page-cluster-keys.js +236 -0
  569. package/lib/template-classification/page-cluster/types.d.ts +123 -0
  570. package/lib/template-classification/page-cluster/types.js +1 -0
  571. package/lib/template-classification/types.d.ts +234 -0
  572. package/lib/template-classification/types.js +1 -0
  573. package/lib/test-utils/build-full-schema-test-db.d.ts +34 -0
  574. package/lib/test-utils/build-full-schema-test-db.js +74 -0
  575. package/lib/test-utils/compare-strings.d.ts +12 -0
  576. package/lib/test-utils/compare-strings.js +14 -0
  577. package/lib/test-utils/create-legacy-analysis-tables.d.ts +13 -0
  578. package/lib/test-utils/create-legacy-analysis-tables.js +37 -0
  579. package/lib/test-utils/fk-parent-tables.d.ts +15 -0
  580. package/lib/test-utils/fk-parent-tables.js +19 -0
  581. package/lib/test-utils/seed-content-item.d.ts +35 -0
  582. package/lib/test-utils/seed-content-item.js +42 -0
  583. package/lib/test-utils/setup-legacy-fk-db.d.ts +34 -0
  584. package/lib/test-utils/setup-legacy-fk-db.js +271 -0
  585. package/lib/transfer/attach-source-database.d.ts +31 -0
  586. package/lib/transfer/attach-source-database.js +40 -0
  587. package/lib/transfer/build-split-config.d.ts +30 -0
  588. package/lib/transfer/build-split-config.js +42 -0
  589. package/lib/transfer/clear-replaced-page-rows.d.ts +23 -0
  590. package/lib/transfer/clear-replaced-page-rows.js +61 -0
  591. package/lib/transfer/concat-archives.d.ts +55 -0
  592. package/lib/transfer/concat-archives.js +95 -0
  593. package/lib/transfer/concat-source-transfer-phases.d.ts +10 -0
  594. package/lib/transfer/concat-source-transfer-phases.js +17 -0
  595. package/lib/transfer/content-item-rank-sql.d.ts +21 -0
  596. package/lib/transfer/content-item-rank-sql.js +23 -0
  597. package/lib/transfer/copy-anchor-edges.d.ts +28 -0
  598. package/lib/transfer/copy-anchor-edges.js +42 -0
  599. package/lib/transfer/copy-dictionaries-for-concat.d.ts +39 -0
  600. package/lib/transfer/copy-dictionaries-for-concat.js +81 -0
  601. package/lib/transfer/copy-dictionaries-for-split.d.ts +29 -0
  602. package/lib/transfer/copy-dictionaries-for-split.js +224 -0
  603. package/lib/transfer/copy-header-set-children.d.ts +27 -0
  604. package/lib/transfer/copy-header-set-children.js +51 -0
  605. package/lib/transfer/copy-image-items.d.ts +21 -0
  606. package/lib/transfer/copy-image-items.js +62 -0
  607. package/lib/transfer/copy-inventory-source-lists.d.ts +30 -0
  608. package/lib/transfer/copy-inventory-source-lists.js +61 -0
  609. package/lib/transfer/copy-journal-tables.d.ts +30 -0
  610. package/lib/transfer/copy-journal-tables.js +56 -0
  611. package/lib/transfer/copy-page-console-logs.d.ts +16 -0
  612. package/lib/transfer/copy-page-console-logs.js +27 -0
  613. package/lib/transfer/copy-page-html-blobs.d.ts +31 -0
  614. package/lib/transfer/copy-page-html-blobs.js +43 -0
  615. package/lib/transfer/copy-page-meta.d.ts +27 -0
  616. package/lib/transfer/copy-page-meta.js +68 -0
  617. package/lib/transfer/copy-page-template-clusters.d.ts +31 -0
  618. package/lib/transfer/copy-page-template-clusters.js +56 -0
  619. package/lib/transfer/copy-page-template-labels.d.ts +34 -0
  620. package/lib/transfer/copy-page-template-labels.js +88 -0
  621. package/lib/transfer/copy-resource-items.d.ts +29 -0
  622. package/lib/transfer/copy-resource-items.js +89 -0
  623. package/lib/transfer/copy-resource-ref-edges.d.ts +20 -0
  624. package/lib/transfer/copy-resource-ref-edges.js +33 -0
  625. package/lib/transfer/copy-simple-page-scoped-tables.d.ts +15 -0
  626. package/lib/transfer/copy-simple-page-scoped-tables.js +34 -0
  627. package/lib/transfer/count-external-pages-in-scope.d.ts +26 -0
  628. package/lib/transfer/count-external-pages-in-scope.js +40 -0
  629. package/lib/transfer/create-transfer-temp-tables.d.ts +30 -0
  630. package/lib/transfer/create-transfer-temp-tables.js +59 -0
  631. package/lib/transfer/dictionary-copy-specs.d.ts +32 -0
  632. package/lib/transfer/dictionary-copy-specs.js +28 -0
  633. package/lib/transfer/drop-transfer-temp-tables.d.ts +9 -0
  634. package/lib/transfer/drop-transfer-temp-tables.js +18 -0
  635. package/lib/transfer/flatten-redirect-chains.d.ts +44 -0
  636. package/lib/transfer/flatten-redirect-chains.js +74 -0
  637. package/lib/transfer/insert-content-items.d.ts +35 -0
  638. package/lib/transfer/insert-content-items.js +116 -0
  639. package/lib/transfer/list-transfer-columns.d.ts +35 -0
  640. package/lib/transfer/list-transfer-columns.js +45 -0
  641. package/lib/transfer/mark-in-scope-content-items.d.ts +31 -0
  642. package/lib/transfer/mark-in-scope-content-items.js +54 -0
  643. package/lib/transfer/merge-archive-configs.d.ts +51 -0
  644. package/lib/transfer/merge-archive-configs.js +85 -0
  645. package/lib/transfer/plan-content-items-for-concat.d.ts +33 -0
  646. package/lib/transfer/plan-content-items-for-concat.js +51 -0
  647. package/lib/transfer/plan-content-items-for-split.d.ts +42 -0
  648. package/lib/transfer/plan-content-items-for-split.js +83 -0
  649. package/lib/transfer/plan-resource-items.d.ts +40 -0
  650. package/lib/transfer/plan-resource-items.js +69 -0
  651. package/lib/transfer/quote-transfer-identifier.d.ts +18 -0
  652. package/lib/transfer/quote-transfer-identifier.js +20 -0
  653. package/lib/transfer/reclassify-resource-externality.d.ts +37 -0
  654. package/lib/transfer/reclassify-resource-externality.js +66 -0
  655. package/lib/transfer/remap-redirect-dest-ids.d.ts +34 -0
  656. package/lib/transfer/remap-redirect-dest-ids.js +51 -0
  657. package/lib/transfer/replace-content-items.d.ts +39 -0
  658. package/lib/transfer/replace-content-items.js +83 -0
  659. package/lib/transfer/simple-page-scoped-tables.d.ts +25 -0
  660. package/lib/transfer/simple-page-scoped-tables.js +38 -0
  661. package/lib/transfer/split-archive.d.ts +55 -0
  662. package/lib/transfer/split-archive.js +98 -0
  663. package/lib/transfer/split-source-transfer-phases.d.ts +11 -0
  664. package/lib/transfer/split-source-transfer-phases.js +18 -0
  665. package/lib/transfer/transfer-action.d.ts +34 -0
  666. package/lib/transfer/transfer-action.js +32 -0
  667. package/lib/transfer/transfer-archive-rows.d.ts +65 -0
  668. package/lib/transfer/transfer-archive-rows.js +156 -0
  669. package/lib/transfer/transfer-dictionary-tables.d.ts +12 -0
  670. package/lib/transfer/transfer-dictionary-tables.js +22 -0
  671. package/lib/transfer/transfer-post-phases.d.ts +10 -0
  672. package/lib/transfer/transfer-post-phases.js +13 -0
  673. package/lib/transfer/transfer-source-alias.d.ts +9 -0
  674. package/lib/transfer/transfer-source-alias.js +9 -0
  675. package/lib/transfer/types.d.ts +111 -0
  676. package/lib/transfer/types.js +35 -0
  677. package/lib/types.d.ts +772 -0
  678. package/lib/types.js +1 -0
  679. package/lib/url-alias/compute-tier-a-alias-key.d.ts +44 -0
  680. package/lib/url-alias/compute-tier-a-alias-key.js +47 -0
  681. package/lib/url-alias/compute-tier-b-alias-key.d.ts +23 -0
  682. package/lib/url-alias/compute-tier-b-alias-key.js +26 -0
  683. package/lib/url-alias/group-alias-candidates.d.ts +27 -0
  684. package/lib/url-alias/group-alias-candidates.js +29 -0
  685. package/lib/url-alias/types.d.ts +12 -0
  686. package/lib/url-alias/types.js +1 -0
  687. package/lib/url-pattern/compute-shape-key.d.ts +58 -0
  688. package/lib/url-pattern/compute-shape-key.js +129 -0
  689. package/lib/url-pattern/decompose-url.d.ts +33 -0
  690. package/lib/url-pattern/decompose-url.js +79 -0
  691. package/lib/url-pattern/reconstruct-url.d.ts +15 -0
  692. package/lib/url-pattern/reconstruct-url.js +33 -0
  693. package/lib/url-sort/compute-url-sort-ranks.d.ts +30 -0
  694. package/lib/url-sort/compute-url-sort-ranks.js +33 -0
  695. package/lib/utils/array/each-splitted.d.ts +10 -0
  696. package/lib/utils/array/each-splitted.js +14 -0
  697. package/lib/utils/debug.d.ts +8 -0
  698. package/lib/utils/debug.js +8 -0
  699. package/lib/utils/error/emit-error-with-retry.d.ts +40 -0
  700. package/lib/utils/error/emit-error-with-retry.js +44 -0
  701. package/lib/utils/error/emit-error.d.ts +39 -0
  702. package/lib/utils/error/emit-error.js +41 -0
  703. package/lib/utils/object/parse-response-headers.d.ts +12 -0
  704. package/lib/utils/object/parse-response-headers.js +26 -0
  705. package/lib/utils/object/redact-request-headers.d.ts +15 -0
  706. package/lib/utils/object/redact-request-headers.js +27 -0
  707. package/lib/utils/types/types.d.ts +383 -0
  708. package/lib/utils/types/types.js +1 -0
  709. package/lib/verify-migration/capture-rejection.d.ts +24 -0
  710. package/lib/verify-migration/capture-rejection.js +31 -0
  711. package/lib/verify-migration/check-anchor-edges-count.d.ts +34 -0
  712. package/lib/verify-migration/check-anchor-edges-count.js +72 -0
  713. package/lib/verify-migration/check-anchor-edges-sum.d.ts +13 -0
  714. package/lib/verify-migration/check-anchor-edges-sum.js +27 -0
  715. package/lib/verify-migration/check-content-items-count.d.ts +16 -0
  716. package/lib/verify-migration/check-content-items-count.js +30 -0
  717. package/lib/verify-migration/check-content-type-preservation.d.ts +22 -0
  718. package/lib/verify-migration/check-content-type-preservation.js +40 -0
  719. package/lib/verify-migration/check-foreign-key-integrity.d.ts +31 -0
  720. package/lib/verify-migration/check-foreign-key-integrity.js +47 -0
  721. package/lib/verify-migration/check-image-items-count.d.ts +12 -0
  722. package/lib/verify-migration/check-image-items-count.js +26 -0
  723. package/lib/verify-migration/check-page-meta-count.d.ts +15 -0
  724. package/lib/verify-migration/check-page-meta-count.js +31 -0
  725. package/lib/verify-migration/check-reader-parity.d.ts +23 -0
  726. package/lib/verify-migration/check-reader-parity.js +182 -0
  727. package/lib/verify-migration/check-resource-items-count.d.ts +17 -0
  728. package/lib/verify-migration/check-resource-items-count.js +33 -0
  729. package/lib/verify-migration/check-url-round-trip.d.ts +43 -0
  730. package/lib/verify-migration/check-url-round-trip.js +112 -0
  731. package/lib/verify-migration/types.d.ts +70 -0
  732. package/lib/verify-migration/types.js +63 -0
  733. package/lib/verify-migration/verify-migration.d.ts +41 -0
  734. package/lib/verify-migration/verify-migration.js +120 -0
  735. package/lib/with-bulk-write-pragmas.d.ts +51 -0
  736. package/lib/with-bulk-write-pragmas.js +132 -0
  737. package/lib/write-queue.d.ts +32 -0
  738. package/lib/write-queue.js +55 -0
  739. package/package.json +350 -3
@@ -0,0 +1,215 @@
1
+ import { open } from 'node:fs/promises';
2
+ import { list } from 'tar';
3
+ import { parsePaxPath } from './parse-pax-path.js';
4
+ import { parseTarSizeField } from './parse-tar-size-field.js';
5
+ /** Bytes per tar header/data block (fixed by the tar format). */
6
+ const BLOCK_SIZE = 512;
7
+ /** Defensive cap on entries scanned before giving up and falling back to `list()`. */
8
+ const MAX_ENTRIES = 100_000;
9
+ /** Cap on PAX/GNU-longname payload size read into memory; larger is treated as malformed. */
10
+ const MAX_EXTENDED_PAYLOAD_SIZE = 1_000_000;
11
+ /**
12
+ * Reads the top-level directory name from a `.nitpicker` tar archive.
13
+ *
14
+ * Why: a `.nitpicker` is a tar that wraps `<basename>/db.sqlite` (and
15
+ * historically other files). `Archive.write()` names the inner directory
16
+ * from the file's basename at write time, but users routinely rename
17
+ * `.nitpicker` files after the fact (e.g. `mv X.migrated.nitpicker
18
+ * X.nitpicker`) — a perfectly reasonable filesystem operation that breaks
19
+ * any code that recomputes the inner-dir name from the outer filename.
20
+ *
21
+ * This helper scans the tar's entry list and returns the first top-level
22
+ * directory it sees, so callers (`Archive.open`, the migration script) can
23
+ * use the actual inner name regardless of what the outer file is called.
24
+ *
25
+ * Parses raw tar headers directly (ustar fixed fields, PAX extended headers,
26
+ * GNU longname/longlink) instead of using the `tar` package's `list()` —
27
+ * `list()` reads the entire archive stream to completion even after
28
+ * `onReadEntry` has found what it needs (no internal early-abort), so on a
29
+ * 15 GB+ archive it was a second full read on top of `untar()`'s own read
30
+ * (issue #294). The fast path here stops at the first top-level directory
31
+ * entry, typically reading well under 1 KB. Falls back to the original
32
+ * `list()`-based scan on anything it doesn't recognize (unknown typeflag
33
+ * sequence, truncated read, non-tar content) — safety over speed for
34
+ * archives this function has never been exercised against.
35
+ * @param tarFilePath - Path to the `.nitpicker` tar file.
36
+ * @returns The first top-level directory name found in the archive.
37
+ * @throws {Error} When the tar contains no top-level directory entry
38
+ * (e.g. file is empty, corrupted, or non-tar). The error message
39
+ * identifies the path for diagnostics.
40
+ * @example
41
+ * // The user renamed `original.nitpicker` to `renamed.nitpicker`. The
42
+ * // inner directory was baked in at write time and is unaffected:
43
+ * await peekTarTopDir('renamed.nitpicker'); // → 'original'
44
+ */
45
+ export async function peekTarTopDir(tarFilePath) {
46
+ const fast = await peekTarTopDirFast(tarFilePath);
47
+ if (fast !== null) {
48
+ return fast;
49
+ }
50
+ return await peekTarTopDirViaList(tarFilePath);
51
+ }
52
+ /**
53
+ * Returns `true` for a top-level directory name that should be skipped: an
54
+ * AppleDouble resource-fork sidecar (`._foo`, from macOS BSD tar) or a PAX
55
+ * header directory (`PaxHeaders.NNN`/`@PaxHeader`). Real `.nitpicker`
56
+ * archives never name their actual top dir with these prefixes. Shared by
57
+ * both the fast path and the `list()` fallback so the two can't drift into
58
+ * accepting different names for the same archive.
59
+ * @param name - Candidate top-level directory name.
60
+ */
61
+ function isSkippableTopDirName(name) {
62
+ return (name.startsWith('._') ||
63
+ name.startsWith('PaxHeaders') ||
64
+ name.startsWith('@PaxHeader'));
65
+ }
66
+ /**
67
+ * Extracts the first path segment from a tar entry path, after stripping a
68
+ * leading `./` some tar producers prepend.
69
+ * @param entryPath - The raw path recorded in (or resolved for) a tar entry.
70
+ */
71
+ function topSegmentOf(entryPath) {
72
+ return entryPath.replace(/^\.\//, '').split('/')[0] ?? '';
73
+ }
74
+ /**
75
+ * Reads a NUL-terminated (or full-width, if no NUL) string field out of a
76
+ * tar header block.
77
+ * @param header - The 512-byte header block.
78
+ * @param start - Field start offset.
79
+ * @param length - Field length in bytes.
80
+ */
81
+ function readHeaderString(header, start, length) {
82
+ const field = header.subarray(start, start + length);
83
+ const nulIndex = field.indexOf(0);
84
+ const raw = nulIndex === -1 ? field : field.subarray(0, nulIndex);
85
+ return raw.toString('utf8');
86
+ }
87
+ /**
88
+ * Fast path for {@link peekTarTopDir}: reads raw 512-byte tar header blocks
89
+ * directly from the file, stopping at the first top-level directory entry.
90
+ * Understands ustar fixed headers, PAX extended headers (`path=`, the form
91
+ * `tar`/node-tar emits for UTF-8 or >100-byte names — verified empirically:
92
+ * see this function's test fixtures), and GNU longname (`typeflag 'L'`,
93
+ * treated the same as a PAX path override for the next entry — this
94
+ * codebase's own `tar()` never emits it, but a `.nitpicker` produced by a
95
+ * different tar implementation should still resolve correctly). GNU
96
+ * longlink (`typeflag 'K'`, a symlink target — irrelevant to a directory
97
+ * name lookup) is skipped without being applied to anything.
98
+ *
99
+ * Returns `null` — never throws — on anything unrecognized: truncated read,
100
+ * unparseable size field, entry count past {@link MAX_ENTRIES}, or reaching
101
+ * the end-of-archive marker without finding a directory. The caller falls
102
+ * back to the exhaustive `list()`-based scan in every `null` case.
103
+ * @param tarFilePath - Path to the `.nitpicker` tar file.
104
+ * @returns The first top-level directory name, or `null` to fall back.
105
+ */
106
+ async function peekTarTopDirFast(tarFilePath) {
107
+ let fileHandle;
108
+ try {
109
+ fileHandle = await open(tarFilePath, 'r');
110
+ const header = Buffer.alloc(BLOCK_SIZE);
111
+ let position = 0;
112
+ // Set by a preceding PAX ('x') or GNU longname ('L') entry; applies
113
+ // to the very next entry only, then is cleared.
114
+ let pendingPath = null;
115
+ for (let entryIndex = 0; entryIndex < MAX_ENTRIES; entryIndex++) {
116
+ const { bytesRead } = await fileHandle.read(header, 0, BLOCK_SIZE, position);
117
+ if (bytesRead < BLOCK_SIZE) {
118
+ return null;
119
+ }
120
+ position += BLOCK_SIZE;
121
+ if (header.every((byte) => byte === 0)) {
122
+ // End-of-archive marker reached with no directory found —
123
+ // genuinely absent, not a parse failure, but the caller's
124
+ // error message is clearer coming from the exhaustive path.
125
+ return null;
126
+ }
127
+ const typeflag = String.fromCodePoint(header[156] ?? 0);
128
+ const size = parseTarSizeField(header.subarray(124, 136));
129
+ if (size === null) {
130
+ return null;
131
+ }
132
+ const dataBlockCount = Math.ceil(size / BLOCK_SIZE);
133
+ const dataStart = position;
134
+ position += dataBlockCount * BLOCK_SIZE;
135
+ if (typeflag === 'x' || typeflag === 'L') {
136
+ if (size <= 0 || size > MAX_EXTENDED_PAYLOAD_SIZE) {
137
+ return null;
138
+ }
139
+ const payload = Buffer.alloc(size);
140
+ const { bytesRead: payloadBytesRead } = await fileHandle.read(payload, 0, size, dataStart);
141
+ if (payloadBytesRead !== size) {
142
+ return null;
143
+ }
144
+ pendingPath =
145
+ typeflag === 'x'
146
+ ? parsePaxPath(payload)
147
+ : payload.toString('utf8').replace(/\0.*$/, '');
148
+ continue;
149
+ }
150
+ if (typeflag === 'g' || typeflag === 'K') {
151
+ // PAX global header (applies archive-wide, never carries a
152
+ // per-entry path) / GNU longlink (symlink target, irrelevant
153
+ // to a directory name lookup) — skip without consuming
154
+ // `pendingPath`.
155
+ continue;
156
+ }
157
+ const magic = header.toString('latin1', 257, 263);
158
+ const nameField = readHeaderString(header, 0, 100);
159
+ const prefixField = magic.startsWith('ustar')
160
+ ? readHeaderString(header, 345, 155)
161
+ : '';
162
+ const entryPath = pendingPath ?? (prefixField ? `${prefixField}/${nameField}` : nameField);
163
+ pendingPath = null;
164
+ if (typeflag === '5') {
165
+ const top = topSegmentOf(entryPath);
166
+ if (top && !isSkippableTopDirName(top)) {
167
+ return top;
168
+ }
169
+ }
170
+ }
171
+ return null;
172
+ }
173
+ catch {
174
+ return null;
175
+ }
176
+ finally {
177
+ await fileHandle?.close();
178
+ }
179
+ }
180
+ /**
181
+ * Exhaustive fallback for {@link peekTarTopDir}: scans the tar's entry list
182
+ * via the `tar` package. Reads the archive to completion regardless of when
183
+ * a match is found (no early-abort in the `tar` package's `list()` API),
184
+ * which is exactly the cost {@link peekTarTopDirFast} exists to avoid — this
185
+ * path only runs when the fast path can't make sense of the header stream.
186
+ * @param tarFilePath - Path to the `.nitpicker` tar file.
187
+ * @returns The first top-level directory name found in the archive.
188
+ * @throws {Error} When the tar contains no top-level directory entry.
189
+ */
190
+ async function peekTarTopDirViaList(tarFilePath) {
191
+ let found = null;
192
+ await list({
193
+ file: tarFilePath,
194
+ onReadEntry: (entry) => {
195
+ if (found !== null)
196
+ return;
197
+ // Only Directory entries count. Files at the tar root would
198
+ // otherwise win — and macOS BSD tar embeds AppleDouble (`._*`)
199
+ // sidecar files at the tar root for resource forks; those are
200
+ // File entries that BSD `tar -tf` hides but Node's `tar`
201
+ // surfaces verbatim, so without this filter the resource-fork
202
+ // of the real top-level dir would win instead of the dir itself.
203
+ if (entry.type !== 'Directory')
204
+ return;
205
+ const top = topSegmentOf(entry.path);
206
+ if (!top || isSkippableTopDirName(top))
207
+ return;
208
+ found = top;
209
+ },
210
+ });
211
+ if (found === null) {
212
+ throw new Error(`Tar contains no top-level directory entry: ${tarFilePath}`);
213
+ }
214
+ return found;
215
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Reads and parses a JSON file from the specified path.
3
+ * @template T - The expected type of the parsed JSON content. Defaults to `unknown`.
4
+ * @param filePath - The absolute or relative path to the JSON file to read.
5
+ * @returns The parsed JSON content, cast to the specified generic type.
6
+ */
7
+ export declare function readJSON<T = unknown>(filePath: string): Promise<T>;
@@ -0,0 +1,11 @@
1
+ import { promises as fs } from 'node:fs';
2
+ /**
3
+ * Reads and parses a JSON file from the specified path.
4
+ * @template T - The expected type of the parsed JSON content. Defaults to `unknown`.
5
+ * @param filePath - The absolute or relative path to the JSON file to read.
6
+ * @returns The parsed JSON content, cast to the specified generic type.
7
+ */
8
+ export async function readJSON(filePath) {
9
+ const data = await fs.readFile(filePath, { encoding: 'utf8' });
10
+ return JSON.parse(data);
11
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Reads the entire contents of a text file as a UTF-8 string.
3
+ * @param filePath - The absolute or relative path to the text file to read.
4
+ * @returns The text content of the file.
5
+ */
6
+ export declare function readText(filePath: string): Promise<string>;
@@ -0,0 +1,10 @@
1
+ import { promises as fs } from 'node:fs';
2
+ /**
3
+ * Reads the entire contents of a text file as a UTF-8 string.
4
+ * @param filePath - The absolute or relative path to the text file to read.
5
+ * @returns The text content of the file.
6
+ */
7
+ export async function readText(filePath) {
8
+ const data = await fs.readFile(filePath, { encoding: 'utf8' });
9
+ return data;
10
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Reads a file line by line and invokes the callback for each line.
3
+ *
4
+ * The callback may return a Promise for asynchronous processing.
5
+ * All callback results are collected and awaited via `Promise.all` before returning.
6
+ * @param filePath - The path to the file to read line by line.
7
+ * @param callback - A function invoked for each line of the file.
8
+ * May return a Promise for asynchronous operations.
9
+ * @returns A promise that resolves when all line callbacks have completed.
10
+ */
11
+ export declare function readline(filePath: string, callback: (line: string) => Promise<void> | void): Promise<void[]>;
@@ -0,0 +1,26 @@
1
+ import { createReadStream } from 'node:fs';
2
+ import Readline from 'node:readline';
3
+ /**
4
+ * Reads a file line by line and invokes the callback for each line.
5
+ *
6
+ * The callback may return a Promise for asynchronous processing.
7
+ * All callback results are collected and awaited via `Promise.all` before returning.
8
+ * @param filePath - The path to the file to read line by line.
9
+ * @param callback - A function invoked for each line of the file.
10
+ * May return a Promise for asynchronous operations.
11
+ * @returns A promise that resolves when all line callbacks have completed.
12
+ */
13
+ export async function readline(filePath, callback) {
14
+ const stream = createReadStream(filePath);
15
+ const rLine = Readline.createInterface(stream);
16
+ const promiseBuffer = [];
17
+ await new Promise((resolve) => {
18
+ rLine.on('line', (line) => {
19
+ promiseBuffer.push(Promise.resolve(callback(line)));
20
+ });
21
+ rLine.on('close', () => {
22
+ resolve();
23
+ });
24
+ });
25
+ return Promise.all(promiseBuffer);
26
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Recursively removes a file or directory at the specified path.
3
+ * @param dirPath - The path of the file or directory to remove.
4
+ */
5
+ export declare function remove(dirPath: string): Promise<void>;
@@ -0,0 +1,10 @@
1
+ import { promises as fs } from 'node:fs';
2
+ /**
3
+ * Recursively removes a file or directory at the specified path.
4
+ * @param dirPath - The path of the file or directory to remove.
5
+ */
6
+ export async function remove(dirPath) {
7
+ await fs.rm(dirPath, {
8
+ recursive: true,
9
+ });
10
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Renames (moves) a file or directory from one path to another.
3
+ *
4
+ * If `override` is `true`, the destination is unconditionally removed
5
+ * before renaming. This avoids a TOCTOU race condition between
6
+ * checking existence and performing the removal.
7
+ *
8
+ * When `fs.rename` fails with `EPERM` (common on Windows due to file locks
9
+ * from antivirus or indexer processes) or `EXDEV` (cross-device move),
10
+ * falls back to a copy-then-remove strategy.
11
+ * @param oldPath - The current path of the file or directory.
12
+ * @param newPath - The new path for the file or directory.
13
+ * @param override - Whether to overwrite the destination if it already exists. Defaults to `false`.
14
+ * @returns A promise that resolves when the rename (or fallback copy-then-remove) is complete.
15
+ */
16
+ export declare function rename(oldPath: string, newPath: string, override?: boolean): Promise<void>;
@@ -0,0 +1,48 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import { remove } from './remove.js';
3
+ /**
4
+ * Checks whether a value is a `NodeJS.ErrnoException`.
5
+ * @param error - The value to check.
6
+ * @returns `true` if the value has a `code` property of type `string`.
7
+ */
8
+ function isNodeError(error) {
9
+ return (error instanceof Error && typeof error.code === 'string');
10
+ }
11
+ /**
12
+ * Renames (moves) a file or directory from one path to another.
13
+ *
14
+ * If `override` is `true`, the destination is unconditionally removed
15
+ * before renaming. This avoids a TOCTOU race condition between
16
+ * checking existence and performing the removal.
17
+ *
18
+ * When `fs.rename` fails with `EPERM` (common on Windows due to file locks
19
+ * from antivirus or indexer processes) or `EXDEV` (cross-device move),
20
+ * falls back to a copy-then-remove strategy.
21
+ * @param oldPath - The current path of the file or directory.
22
+ * @param newPath - The new path for the file or directory.
23
+ * @param override - Whether to overwrite the destination if it already exists. Defaults to `false`.
24
+ * @returns A promise that resolves when the rename (or fallback copy-then-remove) is complete.
25
+ */
26
+ export async function rename(oldPath, newPath, override = false) {
27
+ if (override) {
28
+ await remove(newPath).catch(() => { });
29
+ }
30
+ try {
31
+ await fs.rename(oldPath, newPath);
32
+ }
33
+ catch (error) {
34
+ if (isNodeError(error) && (error.code === 'EPERM' || error.code === 'EXDEV')) {
35
+ try {
36
+ await fs.cp(oldPath, newPath, { recursive: true });
37
+ }
38
+ catch (cpError) {
39
+ await remove(newPath).catch(() => { });
40
+ throw cpError;
41
+ }
42
+ await remove(oldPath);
43
+ }
44
+ else {
45
+ throw error;
46
+ }
47
+ }
48
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Creates an uncompressed TAR archive from a directory.
3
+ *
4
+ * The archive preserves the relative directory structure.
5
+ * The `dir` parameter is resolved relative to its parent directory
6
+ * so only the target directory name appears in the archive.
7
+ *
8
+ * When `onProgress` is given, the tar is produced through a manual stream
9
+ * pipe instead of tar's own `file` mode so the written byte count can be
10
+ * observed — a `.nitpicker` tar is dominated by the single giant `db.sqlite`
11
+ * entry (15 GB+ on large crawls), so per-entry callbacks would fire once and
12
+ * report nothing for minutes (issue #294). `totalBytes` is an estimate (the
13
+ * sum of the directory's file sizes; tar adds per-entry headers and padding
14
+ * on top), so `writtenBytes` is clamped to it and a final
15
+ * `(totalBytes, totalBytes)` call marks completion.
16
+ * @param dir - The absolute path of the directory to archive.
17
+ * @param outputPath - The file path where the TAR archive will be written.
18
+ * @param onProgress - Called as archive bytes are written, with the bytes
19
+ * written so far (clamped to the estimate) and the estimated total. Omit
20
+ * for the original silent, tar-managed-file creation.
21
+ * @returns A promise that resolves when the TAR archive has been created.
22
+ */
23
+ export declare function tar(dir: string, outputPath: string, onProgress?: (writtenBytes: number, totalBytes: number) => void): Promise<void>;
@@ -0,0 +1,78 @@
1
+ import { createWriteStream } from 'node:fs';
2
+ import { readdir, stat } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { create } from 'tar';
5
+ /**
6
+ * Creates an uncompressed TAR archive from a directory.
7
+ *
8
+ * The archive preserves the relative directory structure.
9
+ * The `dir` parameter is resolved relative to its parent directory
10
+ * so only the target directory name appears in the archive.
11
+ *
12
+ * When `onProgress` is given, the tar is produced through a manual stream
13
+ * pipe instead of tar's own `file` mode so the written byte count can be
14
+ * observed — a `.nitpicker` tar is dominated by the single giant `db.sqlite`
15
+ * entry (15 GB+ on large crawls), so per-entry callbacks would fire once and
16
+ * report nothing for minutes (issue #294). `totalBytes` is an estimate (the
17
+ * sum of the directory's file sizes; tar adds per-entry headers and padding
18
+ * on top), so `writtenBytes` is clamped to it and a final
19
+ * `(totalBytes, totalBytes)` call marks completion.
20
+ * @param dir - The absolute path of the directory to archive.
21
+ * @param outputPath - The file path where the TAR archive will be written.
22
+ * @param onProgress - Called as archive bytes are written, with the bytes
23
+ * written so far (clamped to the estimate) and the estimated total. Omit
24
+ * for the original silent, tar-managed-file creation.
25
+ * @returns A promise that resolves when the TAR archive has been created.
26
+ */
27
+ export async function tar(dir, outputPath, onProgress) {
28
+ const baseDir = path.dirname(dir);
29
+ const targetDir = path.relative(baseDir, dir);
30
+ if (!onProgress) {
31
+ await create({
32
+ gzip: false,
33
+ cwd: baseDir,
34
+ file: outputPath,
35
+ preservePaths: false,
36
+ }, [targetDir]);
37
+ return;
38
+ }
39
+ const entries = await readdir(dir, { recursive: true, withFileTypes: true });
40
+ let totalBytes = 0;
41
+ for (const entry of entries) {
42
+ if (!entry.isFile()) {
43
+ continue;
44
+ }
45
+ const { size } = await stat(path.join(entry.parentPath, entry.name));
46
+ totalBytes += size;
47
+ }
48
+ await new Promise((resolve, reject) => {
49
+ const source = create({
50
+ gzip: false,
51
+ cwd: baseDir,
52
+ preservePaths: false,
53
+ }, [targetDir]);
54
+ const sink = createWriteStream(outputPath);
55
+ let writtenBytes = 0;
56
+ source.on('data', (chunk) => {
57
+ writtenBytes += chunk.length;
58
+ onProgress(Math.min(writtenBytes, totalBytes), totalBytes);
59
+ });
60
+ // .pipe() does not destroy the other side on error, so an error on
61
+ // either stream would otherwise leave the write side dangling open.
62
+ source.on('error', (error) => {
63
+ const err = error instanceof Error ? error : new Error(String(error));
64
+ sink.destroy(err);
65
+ reject(err);
66
+ });
67
+ sink.on('error', (error) => {
68
+ const err = error instanceof Error ? error : new Error(String(error));
69
+ source.destroy(err);
70
+ reject(err);
71
+ });
72
+ sink.on('close', () => {
73
+ onProgress(totalBytes, totalBytes);
74
+ resolve();
75
+ });
76
+ source.pipe(sink);
77
+ });
78
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Extracts files from a TAR archive.
3
+ *
4
+ * Only files newer than existing files in the target directory are extracted
5
+ * (uses the `newer` option). Optionally restricts extraction to a specific
6
+ * working directory and/or a subset of files.
7
+ *
8
+ * When `onProgress` is given, the tar is read through a manual
9
+ * `createReadStream` pipe instead of tar's own `file` mode so the consumed
10
+ * byte count can be observed — a `.nitpicker` tar is dominated by the single
11
+ * giant `db.sqlite` entry (15 GB+ on large crawls), so per-entry callbacks
12
+ * would fire once and report nothing for minutes (issue #294). Byte
13
+ * granularity is the read-stream chunk size (~64 KB); callers wanting
14
+ * coarser updates (e.g. one per percent) throttle in their own callback.
15
+ * @param tarFilePath - The path to the TAR archive to extract.
16
+ * @param options - Optional extraction settings.
17
+ * @param options.cwd - The working directory to extract files into.
18
+ * If omitted, the current working directory is used.
19
+ * @param options.fileList - An array of specific file paths within the archive
20
+ * to extract. If omitted, all files in the archive are extracted.
21
+ * @param options.onProgress - Called as archive bytes are consumed, with the
22
+ * bytes read so far and the archive's total size. Omit for the original
23
+ * silent, tar-managed-file extraction.
24
+ * @returns A promise that resolves when extraction is complete.
25
+ */
26
+ export declare function untar(tarFilePath: string, options?: {
27
+ /** The working directory to extract files into. */
28
+ cwd?: string;
29
+ /** An array of specific file paths within the archive to extract. */
30
+ fileList?: string[];
31
+ /** Byte-level progress callback — see the function docs. */
32
+ onProgress?: (readBytes: number, totalBytes: number) => void;
33
+ }): Promise<void>;
@@ -0,0 +1,84 @@
1
+ import { createReadStream } from 'node:fs';
2
+ import { stat } from 'node:fs/promises';
3
+ import { extract } from 'tar';
4
+ /**
5
+ * Extracts files from a TAR archive.
6
+ *
7
+ * Only files newer than existing files in the target directory are extracted
8
+ * (uses the `newer` option). Optionally restricts extraction to a specific
9
+ * working directory and/or a subset of files.
10
+ *
11
+ * When `onProgress` is given, the tar is read through a manual
12
+ * `createReadStream` pipe instead of tar's own `file` mode so the consumed
13
+ * byte count can be observed — a `.nitpicker` tar is dominated by the single
14
+ * giant `db.sqlite` entry (15 GB+ on large crawls), so per-entry callbacks
15
+ * would fire once and report nothing for minutes (issue #294). Byte
16
+ * granularity is the read-stream chunk size (~64 KB); callers wanting
17
+ * coarser updates (e.g. one per percent) throttle in their own callback.
18
+ * @param tarFilePath - The path to the TAR archive to extract.
19
+ * @param options - Optional extraction settings.
20
+ * @param options.cwd - The working directory to extract files into.
21
+ * If omitted, the current working directory is used.
22
+ * @param options.fileList - An array of specific file paths within the archive
23
+ * to extract. If omitted, all files in the archive are extracted.
24
+ * @param options.onProgress - Called as archive bytes are consumed, with the
25
+ * bytes read so far and the archive's total size. Omit for the original
26
+ * silent, tar-managed-file extraction.
27
+ * @returns A promise that resolves when extraction is complete.
28
+ */
29
+ export async function untar(tarFilePath, options) {
30
+ const { cwd, fileList, onProgress } = options ?? {};
31
+ if (!onProgress) {
32
+ await extract({
33
+ file: tarFilePath,
34
+ newer: true,
35
+ cwd,
36
+ preservePaths: false,
37
+ noMtime: true,
38
+ }, fileList ?? []);
39
+ return;
40
+ }
41
+ const { size: totalBytes } = await stat(tarFilePath);
42
+ await new Promise((resolve, reject) => {
43
+ const source = createReadStream(tarFilePath);
44
+ let readBytes = 0;
45
+ source.on('data', (chunk) => {
46
+ readBytes += chunk.length;
47
+ onProgress(readBytes, totalBytes);
48
+ });
49
+ const sink = extract({
50
+ newer: true,
51
+ cwd,
52
+ preservePaths: false,
53
+ noMtime: true,
54
+ }, fileList ?? []);
55
+ // .pipe() does not destroy the other side on error, so an error on
56
+ // either stream would otherwise leave the write side dangling open.
57
+ // `Unpack` (`extends Parser extends EE`, a plain `EventEmitter`, NOT
58
+ // a Minipass/stream base class despite behaving like a writable
59
+ // stream) has no `destroy()` — `abort()` is its own equivalent:
60
+ // idempotent (guarded internally), and it emits its own 'error'
61
+ // (confirmed via `tar`'s `warnMethod` with `recoverable: false`),
62
+ // which re-enters the `sink.on('error', ...)` handler below —
63
+ // harmless, since `source.destroy()`/`reject()` are already
64
+ // idempotent no-ops on a second call.
65
+ source.on('error', (error) => {
66
+ const err = error instanceof Error ? error : new Error(String(error));
67
+ sink.abort(err);
68
+ reject(err);
69
+ });
70
+ sink.on('error', (error) => {
71
+ const err = error instanceof Error ? error : new Error(String(error));
72
+ source.destroy(err);
73
+ reject(err);
74
+ });
75
+ // node-tar's Unpack stream signals completion via 'close' (all entry
76
+ // writes flushed), not 'finish' (input fully consumed) — resolving on
77
+ // 'finish' could hand the caller a tmpDir whose db.sqlite is still
78
+ // being written.
79
+ sink.on('close', () => {
80
+ resolve();
81
+ });
82
+ source.pipe(sink);
83
+ });
84
+ }
@@ -0,0 +1,56 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * One resolved failure message, with the timestamp it was recorded at.
4
+ * `createdAt` is what lets a caller (`resetFailedPages`) decide whether the
5
+ * failure falls inside a `network_outages` window and should be treated as
6
+ * retryable regardless of its classified `ErrorKind` — see
7
+ * `is-within-outage-window.ts`.
8
+ */
9
+ export interface FailedPageMessage {
10
+ message: string;
11
+ /** Epoch ms the message was recorded (`page_errors.createdAt` or `crawl_errors.createdAt`). */
12
+ createdAt: number;
13
+ }
14
+ /**
15
+ * Bulk-resolve a raw error message (plus its timestamp) for each given page
16
+ * id, using only sources reachable from a {@link Knex} handle. Read order:
17
+ * `page_errors` (keyed by `pageId`, the most direct signal a scrape attempt
18
+ * recorded), then `crawl_errors` (keyed by `url`, the crawler-channel
19
+ * record for failures that happened before a page row was scraped).
20
+ *
21
+ * **Known limitation — pre-`crawl_errors` archives**: This helper does NOT
22
+ * read `error.log`. The `crawl_errors` table is created empty (by
23
+ * `initSchema` on fresh archives, by `scripts/migrate-to-0.13.mjs` on
24
+ * migrated ones) and historical lines from `error.log` are never
25
+ * back-filled, so an archive whose failures live only in `error.log`
26
+ * will resolve every id to "no message" here. The
27
+ * downstream `Database.resetFailedPages` treats absence as `unknown` (still
28
+ * retryable), so legacy archives lose the permanent-kind exclusion until a
29
+ * fresh crawl run populates `crawl_errors` / `page_errors`. The trade-off
30
+ * (no error.log parsing in the writer path) keeps the writer dependency
31
+ * surface narrow and avoids re-implementing the parser already living in
32
+ * `@nitpicker/query`'s `resolveFailedPageMessages` — which the crawler
33
+ * package cannot import (reverse-direction dependency). When this matters
34
+ * in practice, run the archive through one fresh `crawl --retry-failed`
35
+ * pass first to populate the structured tables.
36
+ *
37
+ * Pages with no message in any consulted source are simply absent from the
38
+ * returned map; callers treat the absence as "unclassifiable, keep retrying"
39
+ * (i.e. `unknown`).
40
+ * @param instance - The {@link Knex} handle.
41
+ * @param ids - Candidate `pages.id` values.
42
+ * @param urls - The corresponding `pages.url` values, in the same order as
43
+ * `ids`. Length and indexing MUST match `ids` so the page → url join can be
44
+ * reconstructed without a second `pages` round-trip.
45
+ * @returns `Map<pageId, FailedPageMessage>` populated only for ids whose
46
+ * message was found in one of the consulted tables.
47
+ * @example
48
+ * ```ts
49
+ * const messages = await getFailedPageMessages(
50
+ * instance,
51
+ * candidates.map(c => c.id),
52
+ * candidates.map(c => c.url),
53
+ * );
54
+ * ```
55
+ */
56
+ export declare function getFailedPageMessages(instance: Knex, ids: readonly number[], urls: readonly string[]): Promise<Map<number, FailedPageMessage>>;