@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
@@ -0,0 +1,208 @@
1
+ import { computeContentHash } from './compute-content-hash.js';
2
+ import { computeHeaderFlags } from './compute-header-flags.js';
3
+ import { headerValueCacheKey } from './header-value-cache-key.js';
4
+ /**
5
+ * Rows inserted per INSERT statement into `header_set_entries`. Each row
6
+ * binds 5 params so 500 rows = 2500 params — safely under SQLite's
7
+ * default variable limit.
8
+ */
9
+ const ENTRY_INSERT_CHUNK_SIZE = 500;
10
+ /**
11
+ * Upserts one decomposed header set and its entries + flags, returning
12
+ * the `header_sets.id`. Shared by the bulk archive populate
13
+ * ({@link ./populate-header-tables.ts}) and the crawler's per-response
14
+ * write path, so both produce byte-identical header rows for the same
15
+ * raw `responseHeaders` value.
16
+ *
17
+ * Set-id resolution order:
18
+ *
19
+ * 1. `raw_json_hash` cache — same JSON key ordering as a previous row.
20
+ * 2. `raw_hash` cache — same sorted-entries identity, different JSON key
21
+ * ordering. This branch links the new `raw_json_hash` to the existing
22
+ * setId in the in-process map so subsequent same-JSON hits fast-path.
23
+ * 3. Otherwise INSERT a new `header_sets` row.
24
+ *
25
+ * Entries + flags are inserted once per `setId` per process (guarded by
26
+ * `setIdsProcessedThisRun`); already-inserted rows short-circuit
27
+ * cheaply, and preloaded-but-unprocessed setIds (partial prior run) get
28
+ * their entries / flags repaired via `INSERT OR IGNORE`.
29
+ * @param trx - Knex instance or transaction connected to the archive DB.
30
+ * @param decomposed - Result of `decomposeHeaderSet` (never `null` — the
31
+ * caller short-circuits null decompositions to `header_set_id = null`).
32
+ * @param caches - The in-process caches, mutated in place. Create via
33
+ * {@link ./create-header-table-caches.ts}.
34
+ * @returns The `header_sets.id` for this set.
35
+ * @example
36
+ * const decomposed = decomposeHeaderSet(rawJson);
37
+ * if (decomposed !== null) {
38
+ * const setId = await upsertOneHeaderSet(knex, decomposed, caches);
39
+ * }
40
+ */
41
+ export async function upsertOneHeaderSet(trx, decomposed, caches) {
42
+ const rawJsonHashHex = decomposed.rawJsonHash.toString('hex');
43
+ const rawHashHex = decomposed.rawHash.toString('hex');
44
+ let setId = caches.setIdByRawJsonHash.get(rawJsonHashHex);
45
+ if (setId === undefined) {
46
+ setId = caches.setIdByRawHash.get(rawHashHex);
47
+ if (setId === undefined) {
48
+ setId = await insertHeaderSet(trx, decomposed);
49
+ caches.setIdByRawJsonHash.set(rawJsonHashHex, setId);
50
+ caches.setIdByRawHash.set(rawHashHex, setId);
51
+ }
52
+ else {
53
+ // Same sorted-entries identity as an existing row, different JSON
54
+ // key ordering. Reuse the existing setId; the raw_json_hash of
55
+ // this variant has no persistent home in the 0.13 schema
56
+ // (raw_json_hash is UNIQUE per row) — linking it in the
57
+ // in-process map is enough for id resolution.
58
+ caches.setIdByRawJsonHash.set(rawJsonHashHex, setId);
59
+ }
60
+ }
61
+ if (caches.setIdsProcessedThisRun.has(setId)) {
62
+ return setId;
63
+ }
64
+ const nameIds = await resolveNameIds(trx, decomposed.entries, caches.nameIdCache);
65
+ const valueIds = await resolveValueIds(trx, decomposed.entries, caches.valueIdCache);
66
+ const entryRows = decomposed.entries.map((entry, index) => ({
67
+ header_set_id: setId,
68
+ name_id: nameIds[index],
69
+ occurrence: entry.occurrence,
70
+ value_id: valueIds[index],
71
+ is_volatile: entry.isVolatile ? 1 : 0,
72
+ }));
73
+ for (let index = 0; index < entryRows.length; index += ENTRY_INSERT_CHUNK_SIZE) {
74
+ const chunk = entryRows.slice(index, index + ENTRY_INSERT_CHUNK_SIZE);
75
+ await trx('header_set_entries')
76
+ .insert(chunk)
77
+ .onConflict(['header_set_id', 'name_id', 'occurrence'])
78
+ .ignore();
79
+ }
80
+ const flags = computeHeaderFlags(decomposed.entries);
81
+ await trx('header_flags')
82
+ .insert({ header_set_id: setId, ...flags })
83
+ .onConflict('header_set_id')
84
+ .ignore();
85
+ caches.setIdsProcessedThisRun.add(setId);
86
+ return setId;
87
+ }
88
+ /**
89
+ * Inserts a new `header_sets` row and returns its id. Neither
90
+ * `raw_json_hash` nor `raw_hash` collided with an existing row when
91
+ * this is called — the caller has already checked both caches.
92
+ * @param trx - Knex instance.
93
+ * @param decomposed - Result of `decomposeHeaderSet`.
94
+ * @returns The newly-inserted `header_sets.id`.
95
+ */
96
+ async function insertHeaderSet(trx, decomposed) {
97
+ const rows = await trx('header_sets')
98
+ .insert({
99
+ raw_json_hash: decomposed.rawJsonHash,
100
+ raw_hash: decomposed.rawHash,
101
+ stable_hash: decomposed.stableHash,
102
+ volatile_hash: decomposed.volatileHash,
103
+ entry_count: decomposed.entryCount,
104
+ stable_entry_count: decomposed.stableEntryCount,
105
+ })
106
+ .returning('id');
107
+ const first = rows[0];
108
+ if (first === undefined) {
109
+ throw new Error('upsertOneHeaderSet: header_sets INSERT returned no rows despite absent conflict');
110
+ }
111
+ return first.id;
112
+ }
113
+ /**
114
+ * Resolves the `name_id` for every entry in `entries`, inserting new
115
+ * names into `header_name_refs` as needed. Mutates `cache` with any new
116
+ * ids.
117
+ * @param trx - Knex instance.
118
+ * @param entries - Decomposed entries.
119
+ * @param cache - Name → id cache; mutated in place.
120
+ * @returns Parallel array of name ids (same order as `entries`).
121
+ */
122
+ async function resolveNameIds(trx, entries, cache) {
123
+ const missing = new Set();
124
+ for (const entry of entries) {
125
+ if (!cache.has(entry.name)) {
126
+ missing.add(entry.name);
127
+ }
128
+ }
129
+ if (missing.size > 0) {
130
+ const missingNames = [...missing];
131
+ // Chunked like the entries insert below: knex compiles a multi-row
132
+ // insert-with-onConflict into a compound SELECT, and SQLite rejects
133
+ // more than 500 compound terms per statement.
134
+ for (let index = 0; index < missingNames.length; index += ENTRY_INSERT_CHUNK_SIZE) {
135
+ const chunk = missingNames.slice(index, index + ENTRY_INSERT_CHUNK_SIZE);
136
+ await trx('header_name_refs')
137
+ .insert(chunk.map((name) => ({ name })))
138
+ .onConflict('name')
139
+ .ignore();
140
+ const inserted = await trx('header_name_refs')
141
+ .select('id', 'name')
142
+ .whereIn('name', chunk);
143
+ for (const row of inserted) {
144
+ cache.set(row.name, row.id);
145
+ }
146
+ }
147
+ }
148
+ return entries.map((entry) => {
149
+ const id = cache.get(entry.name);
150
+ if (id === undefined) {
151
+ throw new Error(`upsertOneHeaderSet: name_id not resolved for ${entry.name}`);
152
+ }
153
+ return id;
154
+ });
155
+ }
156
+ /**
157
+ * Resolves the `value_id` for every entry in `entries`, inserting new
158
+ * values into `header_value_refs` as needed. Values are hashed once and
159
+ * deduped by `(hash, value)` per the 0.13 UNIQUE constraint.
160
+ *
161
+ * The read-back after INSERT narrows on `.whereIn('value', ...)` — the
162
+ * string values just written — instead of binding the Buffer hashes into
163
+ * a `WHERE hash IN (...)`: a Buffer[] IN would return the correct rows
164
+ * in theory but leans on libsql's BLOB-parameter round-trip behaviour,
165
+ * while string values compare reliably. The cache key still includes the
166
+ * hash, so hash-distinct entries stay disambiguated.
167
+ * @param trx - Knex instance.
168
+ * @param entries - Decomposed entries.
169
+ * @param cache - `hexHash|value → id` cache; mutated in place.
170
+ * @returns Parallel array of value ids (same order as `entries`).
171
+ */
172
+ async function resolveValueIds(trx, entries, cache) {
173
+ const hashByEntryIndex = entries.map((entry) => computeContentHash(entry.value));
174
+ const missing = [];
175
+ const missingKeys = new Set();
176
+ for (const [i, entry] of entries.entries()) {
177
+ const hash = hashByEntryIndex[i];
178
+ const key = headerValueCacheKey(hash, entry.value);
179
+ if (!cache.has(key) && !missingKeys.has(key)) {
180
+ missing.push({ key, hash, value: entry.value });
181
+ missingKeys.add(key);
182
+ }
183
+ }
184
+ // Chunked like the entries insert: knex compiles a multi-row
185
+ // insert-with-onConflict into a compound SELECT, and SQLite rejects
186
+ // more than 500 compound terms per statement.
187
+ for (let index = 0; index < missing.length; index += ENTRY_INSERT_CHUNK_SIZE) {
188
+ const chunk = missing.slice(index, index + ENTRY_INSERT_CHUNK_SIZE);
189
+ await trx('header_value_refs')
190
+ .insert(chunk.map(({ hash, value }) => ({ hash, value })))
191
+ .onConflict(['hash', 'value'])
192
+ .ignore();
193
+ const inserted = await trx('header_value_refs')
194
+ .select('id', 'hash', 'value')
195
+ .whereIn('value', chunk.map((m) => m.value));
196
+ for (const row of inserted) {
197
+ cache.set(headerValueCacheKey(Buffer.from(row.hash), row.value), row.id);
198
+ }
199
+ }
200
+ return entries.map((entry, i) => {
201
+ const key = headerValueCacheKey(hashByEntryIndex[i], entry.value);
202
+ const id = cache.get(key);
203
+ if (id === undefined) {
204
+ throw new Error(`upsertOneHeaderSet: value_id not resolved for ${entry.value.slice(0, 40)}…`);
205
+ }
206
+ return id;
207
+ });
208
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Header names — always lower-cased — that are EXCLUDED from `stable_hash`.
3
+ * These change on every response (timestamps / request IDs / cache
4
+ * telemetry) and would defeat the dedup goal if hashed alongside the
5
+ * stable set.
6
+ *
7
+ * `set-cookie` sits here because per-session cookies rotate constantly on
8
+ * authenticated sites — it is deliberately classified as volatile even
9
+ * though it is technically a stable security signal.
10
+ *
11
+ * Any header not in this set is
12
+ * treated as **stable** by {@link ./header-stability.ts:isVolatileHeader}
13
+ * — the safer default because a genuinely volatile header misclassified
14
+ * as stable only weakens dedup (its per-response values fork
15
+ * otherwise-identical stable profiles into separate `stable_hash`
16
+ * clusters), while a stable header misclassified as volatile would drop
17
+ * a meaningful signal from `stable_hash` and falsely cluster distinct
18
+ * header configurations together.
19
+ */
20
+ export declare const VOLATILE_HEADER_NAMES: ReadonlySet<string>;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Header names — always lower-cased — that are EXCLUDED from `stable_hash`.
3
+ * These change on every response (timestamps / request IDs / cache
4
+ * telemetry) and would defeat the dedup goal if hashed alongside the
5
+ * stable set.
6
+ *
7
+ * `set-cookie` sits here because per-session cookies rotate constantly on
8
+ * authenticated sites — it is deliberately classified as volatile even
9
+ * though it is technically a stable security signal.
10
+ *
11
+ * Any header not in this set is
12
+ * treated as **stable** by {@link ./header-stability.ts:isVolatileHeader}
13
+ * — the safer default because a genuinely volatile header misclassified
14
+ * as stable only weakens dedup (its per-response values fork
15
+ * otherwise-identical stable profiles into separate `stable_hash`
16
+ * clusters), while a stable header misclassified as volatile would drop
17
+ * a meaningful signal from `stable_hash` and falsely cluster distinct
18
+ * header configurations together.
19
+ */
20
+ export const VOLATILE_HEADER_NAMES = new Set([
21
+ 'date',
22
+ 'expires',
23
+ 'last-modified',
24
+ 'etag',
25
+ 'age',
26
+ 'via',
27
+ 'x-cache',
28
+ 'cf-ray',
29
+ 'x-request-id',
30
+ 'set-cookie',
31
+ 'server-timing',
32
+ 'x-amz-request-id',
33
+ ]);
@@ -0,0 +1,9 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Returns a Knex subquery builder that joins `content_items` with their
4
+ * redirect destinations (resolved via `url_refs` for both sides). When
5
+ * `includeNull` is true, also includes pages without redirects
6
+ * (self-referencing).
7
+ * @param includeNull - Whether to include non-redirected pages in the result. Defaults to `true`.
8
+ */
9
+ export declare function redirectTable(includeNull?: boolean): (qb: Knex.QueryBuilder<Record<string, unknown>, unknown>) => Promise<void>;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Returns a Knex subquery builder that joins `content_items` with their
3
+ * redirect destinations (resolved via `url_refs` for both sides). When
4
+ * `includeNull` is true, also includes pages without redirects
5
+ * (self-referencing).
6
+ * @param includeNull - Whether to include non-redirected pages in the result. Defaults to `true`.
7
+ */
8
+ export function redirectTable(includeNull = true) {
9
+ return async (qb) => {
10
+ const list = qb
11
+ .select('A.id as fromId', 'A_url.url as from', 'B_url.url as to', 'B.id as toId')
12
+ .from('content_items as A')
13
+ .join('url_refs as A_url', 'A.url_id', 'A_url.id')
14
+ .join('content_items as B', (j) => {
15
+ j.on('A.redirect_dest_id', '=', 'B.id').andOnNotNull('A.redirect_dest_id');
16
+ })
17
+ .join('url_refs as B_url', 'B.url_id', 'B_url.id');
18
+ if (includeNull) {
19
+ await list.union(async (qb) => {
20
+ await qb
21
+ .select('A.id as fromId', 'A_url.url as from', 'A_url.url as to', 'A.id as toId')
22
+ .from('content_items as A')
23
+ .join('url_refs as A_url', 'A.url_id', 'A_url.id')
24
+ .whereNull('A.redirect_dest_id');
25
+ });
26
+ }
27
+ };
28
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Gives the event loop one turn so that the native memory of SQL statements
3
+ * that already finished is freed before the next statement runs.
4
+ *
5
+ * The libsql binding (`libsql-dialect.ts` runs Knex on it) keeps each
6
+ * statement's compiled program and bound values, and a `SELECT`'s row cursor
7
+ * with its in-memory sort / `GROUP BY` tree, until the JavaScript wrapper
8
+ * object is finalized. Node runs those N-API finalizers from a `setImmediate`,
9
+ * not inside garbage collection itself, so a loop that only ever awaits
10
+ * synchronous libsql calls (every Knex call on this driver resolves through
11
+ * promise microtasks, never through the macrotask queue) can collect the
12
+ * wrappers and still release nothing: the finalizers wait for a turn of the
13
+ * loop that the loop never gets. Measured on the viewer read model build
14
+ * (one transaction, one statement per 500-row chunk): the native side grew by
15
+ * hundreds of MiB per bulk-insert phase and only shrank at `COMMIT`; forcing
16
+ * garbage collection after every chunk did not change that, one turn of the
17
+ * event loop after every chunk did. `scripts/bench-read-model-build.mjs`
18
+ * reproduces both sides of that with `--gc` and `--regions` (see
19
+ * `scripts/README.md`).
20
+ *
21
+ * The rule for callers: a loop that runs statements awaits this once per
22
+ * iteration, after the iteration's statements. An iteration may run more
23
+ * than one statement (a chunk's `INSERT` and the upsert derived from it); the
24
+ * turn at its end releases all of them, and a statement that runs once
25
+ * outside any loop is released by the next loop's turn.
26
+ *
27
+ * Why not reuse one prepared statement per table instead: the row cursors of
28
+ * chunked `SELECT`s hold their sort trees the same way, and every bulk path
29
+ * goes through Knex, which prepares a new statement per call. One turn per
30
+ * iteration covers both, costs microseconds, and changes no SQL.
31
+ *
32
+ * Why not in `libsql-dialect.ts` for every query: a transaction that yields
33
+ * between statements is fine for the archive (one connection, no
34
+ * interleaving), but every caller would pay the turn, including per-request
35
+ * viewer queries that run one statement and hold nothing worth a turn.
36
+ * @example
37
+ * for (const chunk of chunks) {
38
+ * await trx('viewer_pages').insert(chunk);
39
+ * await releaseFinishedStatements();
40
+ * }
41
+ */
42
+ export declare function releaseFinishedStatements(): Promise<void>;
@@ -0,0 +1,45 @@
1
+ import { setImmediate as nextTurn } from 'node:timers/promises';
2
+ /**
3
+ * Gives the event loop one turn so that the native memory of SQL statements
4
+ * that already finished is freed before the next statement runs.
5
+ *
6
+ * The libsql binding (`libsql-dialect.ts` runs Knex on it) keeps each
7
+ * statement's compiled program and bound values, and a `SELECT`'s row cursor
8
+ * with its in-memory sort / `GROUP BY` tree, until the JavaScript wrapper
9
+ * object is finalized. Node runs those N-API finalizers from a `setImmediate`,
10
+ * not inside garbage collection itself, so a loop that only ever awaits
11
+ * synchronous libsql calls (every Knex call on this driver resolves through
12
+ * promise microtasks, never through the macrotask queue) can collect the
13
+ * wrappers and still release nothing: the finalizers wait for a turn of the
14
+ * loop that the loop never gets. Measured on the viewer read model build
15
+ * (one transaction, one statement per 500-row chunk): the native side grew by
16
+ * hundreds of MiB per bulk-insert phase and only shrank at `COMMIT`; forcing
17
+ * garbage collection after every chunk did not change that, one turn of the
18
+ * event loop after every chunk did. `scripts/bench-read-model-build.mjs`
19
+ * reproduces both sides of that with `--gc` and `--regions` (see
20
+ * `scripts/README.md`).
21
+ *
22
+ * The rule for callers: a loop that runs statements awaits this once per
23
+ * iteration, after the iteration's statements. An iteration may run more
24
+ * than one statement (a chunk's `INSERT` and the upsert derived from it); the
25
+ * turn at its end releases all of them, and a statement that runs once
26
+ * outside any loop is released by the next loop's turn.
27
+ *
28
+ * Why not reuse one prepared statement per table instead: the row cursors of
29
+ * chunked `SELECT`s hold their sort trees the same way, and every bulk path
30
+ * goes through Knex, which prepares a new statement per call. One turn per
31
+ * iteration covers both, costs microseconds, and changes no SQL.
32
+ *
33
+ * Why not in `libsql-dialect.ts` for every query: a transaction that yields
34
+ * between statements is fine for the archive (one connection, no
35
+ * interleaving), but every caller would pay the turn, including per-request
36
+ * viewer queries that run one statement and hold nothing worth a turn.
37
+ * @example
38
+ * for (const chunk of chunks) {
39
+ * await trx('viewer_pages').insert(chunk);
40
+ * await releaseFinishedStatements();
41
+ * }
42
+ */
43
+ export async function releaseFinishedStatements() {
44
+ await nextTurn();
45
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The destination of a redirect chain and the source URLs that point at it.
3
+ */
4
+ export interface RedirectChain {
5
+ /** The final destination URL the chain lands on (normalised). */
6
+ destUrl: string;
7
+ /**
8
+ * The source URLs that redirect to {@link RedirectChain.destUrl}: the originally requested
9
+ * URL followed by every intermediate hop. Empty when the page was not
10
+ * redirected at all.
11
+ */
12
+ sources: string[];
13
+ }
14
+ /**
15
+ * Splits a page's redirect chain into its final destination and the list of
16
+ * source URLs that point at it.
17
+ *
18
+ * The archive stores redirects as edges: every source URL carries a
19
+ * `redirectDestId` pointing at the destination page, and only the destination
20
+ * holds content. This helper applies the shared convention — the last entry of
21
+ * `redirectPaths` is the destination, while the originally requested URL plus
22
+ * every intermediate hop are the sources. When the page was not redirected,
23
+ * the destination is the page URL itself and there are no sources.
24
+ *
25
+ * Used by both `Database.updatePage` (which renders and stores the
26
+ * destination) and `Database.recordRedirect` (the #73 convergence
27
+ * optimisation, which records the edge for a destination already rendered
28
+ * elsewhere without touching its content).
29
+ * @param pageUrl - The originally requested URL (normalised, without hash/auth).
30
+ * @param redirectPaths - The redirect hop URLs captured during fetch, in order.
31
+ * @returns The destination URL and the source URLs pointing to it.
32
+ */
33
+ export declare function resolveRedirectChain(pageUrl: string, redirectPaths: readonly string[]): RedirectChain;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Splits a page's redirect chain into its final destination and the list of
3
+ * source URLs that point at it.
4
+ *
5
+ * The archive stores redirects as edges: every source URL carries a
6
+ * `redirectDestId` pointing at the destination page, and only the destination
7
+ * holds content. This helper applies the shared convention — the last entry of
8
+ * `redirectPaths` is the destination, while the originally requested URL plus
9
+ * every intermediate hop are the sources. When the page was not redirected,
10
+ * the destination is the page URL itself and there are no sources.
11
+ *
12
+ * Used by both `Database.updatePage` (which renders and stores the
13
+ * destination) and `Database.recordRedirect` (the #73 convergence
14
+ * optimisation, which records the edge for a destination already rendered
15
+ * elsewhere without touching its content).
16
+ * @param pageUrl - The originally requested URL (normalised, without hash/auth).
17
+ * @param redirectPaths - The redirect hop URLs captured during fetch, in order.
18
+ * @returns The destination URL and the source URLs pointing to it.
19
+ */
20
+ export function resolveRedirectChain(pageUrl, redirectPaths) {
21
+ if (redirectPaths.length === 0) {
22
+ return { destUrl: pageUrl, sources: [] };
23
+ }
24
+ const paths = [...redirectPaths];
25
+ const destUrl = paths.pop();
26
+ return { destUrl, sources: [pageUrl, ...paths] };
27
+ }
@@ -0,0 +1,46 @@
1
+ import type { ArchiveAccessor } from './archive-accessor.js';
2
+ import type { DB_Resource } from './types.js';
3
+ /**
4
+ * Represents a sub-resource (CSS, JS, image, font, etc.) stored in the archive.
5
+ *
6
+ * Provides access to the resource's HTTP metadata and referrer information.
7
+ * Instances are created by {@link ArchiveAccessor.getResources}.
8
+ */
9
+ export default class Resource {
10
+ #private;
11
+ /**
12
+ * The content length of the resource in bytes, or null if unknown.
13
+ */
14
+ get contentLength(): number | null;
15
+ /**
16
+ * The MIME content type of the resource (e.g., `"text/css"`, `"application/javascript"`), or null if unknown.
17
+ */
18
+ get contentType(): string | null;
19
+ /**
20
+ * Whether this resource is hosted on an external domain.
21
+ */
22
+ get isExternal(): boolean;
23
+ /**
24
+ * The HTTP response status code, or null if not yet fetched.
25
+ */
26
+ get status(): number | null;
27
+ /**
28
+ * The HTTP response status text (e.g., `"OK"`, `"Not Found"`), or null if not yet fetched.
29
+ */
30
+ get statusText(): string | null;
31
+ /**
32
+ * The URL of the resource.
33
+ */
34
+ get url(): string | null;
35
+ /**
36
+ * Creates a new Resource instance.
37
+ * @param archive - The ArchiveAccessor used for querying referrer data.
38
+ * @param raw - The raw database row for this resource.
39
+ */
40
+ constructor(archive: ArchiveAccessor, raw: DB_Resource);
41
+ /**
42
+ * Retrieves the page URLs that reference this resource.
43
+ * @returns An array of page URL strings that include or reference this resource.
44
+ */
45
+ getReferrers(): Promise<string[]>;
46
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Represents a sub-resource (CSS, JS, image, font, etc.) stored in the archive.
3
+ *
4
+ * Provides access to the resource's HTTP metadata and referrer information.
5
+ * Instances are created by {@link ArchiveAccessor.getResources}.
6
+ */
7
+ export default class Resource {
8
+ #archive;
9
+ #raw;
10
+ /**
11
+ * The content length of the resource in bytes, or null if unknown.
12
+ */
13
+ get contentLength() {
14
+ return this.#raw.contentLength;
15
+ }
16
+ /**
17
+ * The MIME content type of the resource (e.g., `"text/css"`, `"application/javascript"`), or null if unknown.
18
+ */
19
+ get contentType() {
20
+ return this.#raw.contentType;
21
+ }
22
+ /**
23
+ * Whether this resource is hosted on an external domain.
24
+ */
25
+ get isExternal() {
26
+ return !!this.#raw.isExternal;
27
+ }
28
+ /**
29
+ * The HTTP response status code, or null if not yet fetched.
30
+ */
31
+ get status() {
32
+ return this.#raw.status;
33
+ }
34
+ /**
35
+ * The HTTP response status text (e.g., `"OK"`, `"Not Found"`), or null if not yet fetched.
36
+ */
37
+ get statusText() {
38
+ return this.#raw.statusText;
39
+ }
40
+ /**
41
+ * The URL of the resource.
42
+ */
43
+ get url() {
44
+ return this.#raw.url;
45
+ }
46
+ /**
47
+ * Creates a new Resource instance.
48
+ * @param archive - The ArchiveAccessor used for querying referrer data.
49
+ * @param raw - The raw database row for this resource.
50
+ */
51
+ constructor(archive, raw) {
52
+ this.#archive = archive;
53
+ this.#raw = raw;
54
+ }
55
+ /**
56
+ * Retrieves the page URLs that reference this resource.
57
+ * @returns An array of page URL strings that include or reference this resource.
58
+ */
59
+ async getReferrers() {
60
+ return this.#archive.getReferrersOfResource(this.#raw.id);
61
+ }
62
+ }
@@ -0,0 +1,61 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Rewrites the FK declarations of the adjunct tables from the legacy
4
+ * `pages(id)` to `content_items(id)` by rebuilding each table, converts
5
+ * `page_tags` (if present) into `technology_signals` / `page_technologies`,
6
+ * AND drops the legacy `analysis_violations` / `analysis_text_refs` tables
7
+ * (analyze output that that no reader or writer uses).
8
+ * SQLite has no `ALTER TABLE … DROP CONSTRAINT`, so the only way to change
9
+ * an FK target is to recreate the table:
10
+ *
11
+ * 1. Stage each {@link RETARGET_TABLES} table's rows into a constraint-free
12
+ * `<table>__retarget` copy (`CREATE TABLE … AS SELECT *`) and drop the
13
+ * original, freeing its index names. `page_tags`, if present, is read
14
+ * into memory here too (converted via `convertLegacyPageTagsToInserts` —
15
+ * the same helper `migrate-page-tags-to-page-technologies.ts` uses for
16
+ * already-0.13+ archives) but NOT staged the same way: it has no
17
+ * current-schema table to retarget onto, so there is nothing to copy
18
+ * back — only something to drop, once its data lives in the tables
19
+ * from step 2.
20
+ * 2. Recreate every {@link RETARGET_TABLES} table through
21
+ * {@link createAdjunctTables} — the same DDL fresh archives get, so
22
+ * migrated archives end up identical in shape and index naming.
23
+ * Rebuilding the DDL inline here instead would recreate the exact
24
+ * drift this function repairs. This same call also creates
25
+ * `technology_signals` / `page_technologies` (idempotent
26
+ * `hasTable`-guarded DDL — a no-op if a prior partial run already
27
+ * created them).
28
+ * 3. Copy the staged {@link RETARGET_TABLES} rows back using the recreated
29
+ * table's own column list (read via `pragma_table_info`). A column the
30
+ * canonical DDL has but the input archive lacks aborts the INSERT with
31
+ * a clear error — never a silent data drop. The converted `page_tags`
32
+ * signals/technologies are inserted here too, then `page_tags` itself
33
+ * is dropped (not recreated).
34
+ *
35
+ * A rename-based recipe (`ALTER TABLE x RENAME TO x__retarget`, skip
36
+ * copy #1) is deliberately NOT used: SQLite keeps the renamed table's
37
+ * indexes attached under their original names, which collide with the
38
+ * index names {@link createAdjunctTables} declares — and the old index
39
+ * names vary by the era of the archive's original provisioning, so
40
+ * dropping them first would require enumerating unknown names. The
41
+ * copy-out is cheap at these tables' scale (a handful of rows per page).
42
+ *
43
+ * Adjunct tables that do not exist on the input archive are simply created
44
+ * empty by step 2.
45
+ *
46
+ * The migrated-archive PK-preservation contract makes the copy safe:
47
+ * `content_items.id` reuses the legacy `pages.id` values verbatim, so
48
+ * every staged `pageId` / `page_id` resolves to the same row under the
49
+ * new FK target. Run inside a transaction with `PRAGMA foreign_keys = ON`
50
+ * so the copy-back doubles as a row-level FK validation — a stale id
51
+ * aborts the transaction here rather than surfacing later as a
52
+ * `foreign_key_check` finding.
53
+ * @param trx - Knex transaction on the archive being migrated
54
+ * (`scripts/migrate-to-0.13.mjs` is the caller).
55
+ * @example
56
+ * await db.transaction(async (trx) => {
57
+ * await retargetLegacyFkTables(trx);
58
+ * });
59
+ * // pragma_foreign_key_list('page_errors') now reports content_items.
60
+ */
61
+ export declare function retargetLegacyFkTables(trx: Knex): Promise<void>;