@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,48 @@
1
+ import { insertInventoryContentItems } from './insert-inventory-content-items.js';
2
+ /**
3
+ * Pre-insert inventory HTML seeds into `content_items` as `scraped = 0`,
4
+ * `source = 'inventory-seed'` placeholders so the URL's existence in the
5
+ * archive is **durable before the scrape phase starts**.
6
+ *
7
+ * Why this is the linchpin of `--inventory` Ctrl+C tolerance: without
8
+ * pre-insertion, HTML seeds live only in the Crawler's in-memory
9
+ * `LinkList` until the dealer eventually calls `setPage`. A Ctrl+C /
10
+ * crash before that point loses the seed without trace, and `--resume`
11
+ * cannot recover it because `getCrawlingState`'s strict pending set
12
+ * requires a `content_items` row. Pre-inserting fills exactly that gap:
13
+ * the strict pending set picks these rows up via its
14
+ * `OR source != 'crawled'` clause, so `--resume` after an interrupted
15
+ * inventory pass picks every seed back up. See `getCrawlingState` for
16
+ * the strict-set rationale.
17
+ *
18
+ * Idempotent: both the `url_refs` and `content_items` inserts are
19
+ * `ON CONFLICT ... IGNORE`, keeping existing rows intact. The
20
+ * `resolveContentItemId` crawled-wins downgrade still fires later when a
21
+ * crawled-lineage anchor reaches one of these seeds — that's the right
22
+ * behaviour (a seed that turned out to be reachable is not an orphan
23
+ * and should not retain the inventory label).
24
+ *
25
+ * Called by `CrawlerOrchestrator.inventory` during the
26
+ * `.bak`-protected ingestion phase, so any failure here aborts the run
27
+ * and restores from backup — the operator reruns from scratch. The
28
+ * chunking / conflict-ignore / cache-population plumbing lives in
29
+ * {@link insertInventoryContentItems}, shared with
30
+ * `insertInventorySkippedPages`.
31
+ * @param knex - Knex query builder connected to the archive DB.
32
+ * @param caches - The connection's write-side id caches.
33
+ * @param urls - URL strings already in `withoutHashAndAuth` form.
34
+ */
35
+ export async function insertInventorySeeds(knex, caches, urls) {
36
+ await insertInventoryContentItems({
37
+ knex,
38
+ caches,
39
+ urls,
40
+ row: {
41
+ scraped: 0,
42
+ is_external: 0,
43
+ is_target: 0,
44
+ source: 'inventory-seed',
45
+ },
46
+ opName: 'insertInventorySeeds',
47
+ });
48
+ }
@@ -0,0 +1,42 @@
1
+ import type { WriteRefCaches } from '../../_shared/types.js';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Record exclude-matched inventory URLs into `content_items` as
5
+ * `scraped = 1`, `is_skipped = 1`, `skip_reason = 'excluded'`,
6
+ * `source = 'inventory-seed'` rows — the same terminal state the normal
7
+ * crawl's fetch-time `shouldSkipUrl` gate produces via `setSkippedPage`
8
+ * for link-discovered excluded URLs.
9
+ *
10
+ * Why a dedicated write path instead of routing these URLs through the
11
+ * crawler's gate: non-HTML inventory URLs never enter the crawler at all
12
+ * (they are recorded straight into `resources`), so the gate cannot see
13
+ * them, and pre-inserting HTML seeds only to have the dealer skip them
14
+ * wastes dealer slots for a verdict already known at ingestion time.
15
+ * Writing the terminal skipped state directly keeps the invariant "the
16
+ * same URL lands in the same archive state regardless of how it was
17
+ * discovered (anchor vs inventory list)" for both classifications
18
+ * (issue #260).
19
+ *
20
+ * `scraped = 1` is load-bearing: it keeps these rows out of
21
+ * `getCrawlingState`'s strict pending set, so `--resume` after an
22
+ * interrupted inventory pass does not try to fetch operator-excluded
23
+ * URLs.
24
+ *
25
+ * Idempotent: both the `url_refs` and `content_items` inserts are
26
+ * `ON CONFLICT ... IGNORE`, so an existing row — in particular a
27
+ * previously crawled page that now matches the exclusion config — is
28
+ * never downgraded to skipped by this path (crawled-wins). The
29
+ * orchestrator additionally filters known URLs out before calling this,
30
+ * so conflicts here are limited to within-list duplicates.
31
+ *
32
+ * Called by `CrawlerOrchestrator.inventory` during the `.bak`-protected
33
+ * ingestion phase, so any failure here aborts the run and restores from
34
+ * backup — the operator reruns from scratch. The chunking /
35
+ * conflict-ignore / cache-population plumbing lives in
36
+ * {@link insertInventoryContentItems}, shared with
37
+ * `insertInventorySeeds`.
38
+ * @param knex - Knex query builder connected to the archive DB.
39
+ * @param caches - The connection's write-side id caches.
40
+ * @param urls - URL strings already in `withoutHashAndAuth` form.
41
+ */
42
+ export declare function insertInventorySkippedPages(knex: Knex, caches: WriteRefCaches, urls: readonly string[]): Promise<void>;
@@ -0,0 +1,56 @@
1
+ import { insertInventoryContentItems } from './insert-inventory-content-items.js';
2
+ /**
3
+ * Record exclude-matched inventory URLs into `content_items` as
4
+ * `scraped = 1`, `is_skipped = 1`, `skip_reason = 'excluded'`,
5
+ * `source = 'inventory-seed'` rows — the same terminal state the normal
6
+ * crawl's fetch-time `shouldSkipUrl` gate produces via `setSkippedPage`
7
+ * for link-discovered excluded URLs.
8
+ *
9
+ * Why a dedicated write path instead of routing these URLs through the
10
+ * crawler's gate: non-HTML inventory URLs never enter the crawler at all
11
+ * (they are recorded straight into `resources`), so the gate cannot see
12
+ * them, and pre-inserting HTML seeds only to have the dealer skip them
13
+ * wastes dealer slots for a verdict already known at ingestion time.
14
+ * Writing the terminal skipped state directly keeps the invariant "the
15
+ * same URL lands in the same archive state regardless of how it was
16
+ * discovered (anchor vs inventory list)" for both classifications
17
+ * (issue #260).
18
+ *
19
+ * `scraped = 1` is load-bearing: it keeps these rows out of
20
+ * `getCrawlingState`'s strict pending set, so `--resume` after an
21
+ * interrupted inventory pass does not try to fetch operator-excluded
22
+ * URLs.
23
+ *
24
+ * Idempotent: both the `url_refs` and `content_items` inserts are
25
+ * `ON CONFLICT ... IGNORE`, so an existing row — in particular a
26
+ * previously crawled page that now matches the exclusion config — is
27
+ * never downgraded to skipped by this path (crawled-wins). The
28
+ * orchestrator additionally filters known URLs out before calling this,
29
+ * so conflicts here are limited to within-list duplicates.
30
+ *
31
+ * Called by `CrawlerOrchestrator.inventory` during the `.bak`-protected
32
+ * ingestion phase, so any failure here aborts the run and restores from
33
+ * backup — the operator reruns from scratch. The chunking /
34
+ * conflict-ignore / cache-population plumbing lives in
35
+ * {@link insertInventoryContentItems}, shared with
36
+ * `insertInventorySeeds`.
37
+ * @param knex - Knex query builder connected to the archive DB.
38
+ * @param caches - The connection's write-side id caches.
39
+ * @param urls - URL strings already in `withoutHashAndAuth` form.
40
+ */
41
+ export async function insertInventorySkippedPages(knex, caches, urls) {
42
+ await insertInventoryContentItems({
43
+ knex,
44
+ caches,
45
+ urls,
46
+ row: {
47
+ scraped: 1,
48
+ is_external: 0,
49
+ is_target: 0,
50
+ is_skipped: 1,
51
+ skip_reason: 'excluded',
52
+ source: 'inventory-seed',
53
+ },
54
+ opName: 'insertInventorySkippedPages',
55
+ });
56
+ }
@@ -0,0 +1,17 @@
1
+ import type { PageData } from '../../../utils/types/types.js';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Replaces the page's JSON-LD / SpeculationRules rows with the freshly
5
+ * captured set. Called inside `updatePage`'s transaction.
6
+ *
7
+ * `writeHtml = false` branches (`setExternalPage`, metadata-only) skip
8
+ * this entirely — JSON-LD lives inside the HTML body, so external pages
9
+ * that are not rendered have no entries to write. An empty array on a
10
+ * normally-rendered page is treated as a degraded re-scrape: prior rows
11
+ * are kept (same `delete-only-when-replacing` invariant as `anchors` /
12
+ * `images`).
13
+ * @param pageId
14
+ * @param meta
15
+ * @param trx
16
+ */
17
+ export declare function insertJsonLd(pageId: number, meta: PageData['meta'], trx: Knex.Transaction): Promise<void>;
@@ -0,0 +1,49 @@
1
+ import { classifyJsonLdType } from '../../../meta/classify-jsonld-type.js';
2
+ import { eachSplitted } from '../../../utils/array/each-splitted.js';
3
+ /**
4
+ * Replaces the page's JSON-LD / SpeculationRules rows with the freshly
5
+ * captured set. Called inside `updatePage`'s transaction.
6
+ *
7
+ * `writeHtml = false` branches (`setExternalPage`, metadata-only) skip
8
+ * this entirely — JSON-LD lives inside the HTML body, so external pages
9
+ * that are not rendered have no entries to write. An empty array on a
10
+ * normally-rendered page is treated as a degraded re-scrape: prior rows
11
+ * are kept (same `delete-only-when-replacing` invariant as `anchors` /
12
+ * `images`).
13
+ * @param pageId
14
+ * @param meta
15
+ * @param trx
16
+ */
17
+ export async function insertJsonLd(pageId, meta, trx) {
18
+ // `??` guards tolerate the legacy "minimal meta" shape from older test
19
+ // fixtures. Real beholder 3.0.0 always populates these required fields.
20
+ const jsonLd = meta.jsonLd ?? [];
21
+ const speculationRules = meta.speculationRules ?? [];
22
+ const rows = [];
23
+ for (const entry of jsonLd) {
24
+ rows.push({
25
+ pageId,
26
+ kind: 'ld+json',
27
+ type: classifyJsonLdType(entry),
28
+ raw: entry.raw,
29
+ parsed: entry.parsed === undefined ? null : JSON.stringify(entry.parsed),
30
+ parseError: entry.parseError ?? null,
31
+ });
32
+ }
33
+ for (const entry of speculationRules) {
34
+ rows.push({
35
+ pageId,
36
+ kind: 'speculationrules',
37
+ type: classifyJsonLdType(entry),
38
+ raw: entry.raw,
39
+ parsed: entry.parsed === undefined ? null : JSON.stringify(entry.parsed),
40
+ parseError: entry.parseError ?? null,
41
+ });
42
+ }
43
+ if (rows.length === 0)
44
+ return;
45
+ await trx('page_jsonld').where('pageId', pageId).delete();
46
+ await eachSplitted(rows, 100, async (chunk) => {
47
+ await trx('page_jsonld').insert(chunk);
48
+ });
49
+ }
@@ -0,0 +1,20 @@
1
+ import type { MainContentsData } from '../../../utils/types/types.js';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Replaces the page's `page_main_content_images` rows with the freshly
5
+ * captured set. Called inside `updatePage`'s transaction, gated on
6
+ * `mainContents !== null`.
7
+ *
8
+ * Distinct from `image_items` (the whole-page image scan, `replaceImageItems`):
9
+ * this table only covers images inside the detected main-content region, so
10
+ * `src` is stored as a plain string rather than routed through
11
+ * `url_refs` / `blob_refs` — same low-cross-page-reuse rationale as the
12
+ * `page_meta.main_content_*` columns.
13
+ *
14
+ * Same empty-guard as `insertTags` / `insertJsonLd`: an empty array does not
15
+ * wipe prior rows on a degraded re-scrape.
16
+ * @param pageId - The owning `content_items.id`.
17
+ * @param mainContents - Beholder's per-page main-content metrics.
18
+ * @param trx - The active transaction.
19
+ */
20
+ export declare function insertMainContentImages(pageId: number, mainContents: MainContentsData, trx: Knex.Transaction): Promise<void>;
@@ -0,0 +1,32 @@
1
+ import { eachSplitted } from '../../../utils/array/each-splitted.js';
2
+ /**
3
+ * Replaces the page's `page_main_content_images` rows with the freshly
4
+ * captured set. Called inside `updatePage`'s transaction, gated on
5
+ * `mainContents !== null`.
6
+ *
7
+ * Distinct from `image_items` (the whole-page image scan, `replaceImageItems`):
8
+ * this table only covers images inside the detected main-content region, so
9
+ * `src` is stored as a plain string rather than routed through
10
+ * `url_refs` / `blob_refs` — same low-cross-page-reuse rationale as the
11
+ * `page_meta.main_content_*` columns.
12
+ *
13
+ * Same empty-guard as `insertTags` / `insertJsonLd`: an empty array does not
14
+ * wipe prior rows on a degraded re-scrape.
15
+ * @param pageId - The owning `content_items.id`.
16
+ * @param mainContents - Beholder's per-page main-content metrics.
17
+ * @param trx - The active transaction.
18
+ */
19
+ export async function insertMainContentImages(pageId, mainContents, trx) {
20
+ if (mainContents.images.length === 0)
21
+ return;
22
+ const rows = mainContents.images.map((image, order) => ({
23
+ pageId,
24
+ order,
25
+ src: image.src,
26
+ alt: image.alt,
27
+ }));
28
+ await trx('page_main_content_images').where('pageId', pageId).delete();
29
+ await eachSplitted(rows, 100, async (chunk) => {
30
+ await trx('page_main_content_images').insert(chunk);
31
+ });
32
+ }
@@ -0,0 +1,14 @@
1
+ import type { MainContentsData } from '../../../utils/types/types.js';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Replaces the page's `page_main_content_tables` rows with the freshly
5
+ * captured set. Called inside `updatePage`'s transaction, gated on
6
+ * `mainContents !== null`.
7
+ *
8
+ * Same empty-guard as `insertTags` / `insertJsonLd`: an empty array does not
9
+ * wipe prior rows on a degraded re-scrape.
10
+ * @param pageId - The owning `content_items.id`.
11
+ * @param mainContents - Beholder's per-page main-content metrics.
12
+ * @param trx - The active transaction.
13
+ */
14
+ export declare function insertMainContentTables(pageId: number, mainContents: MainContentsData, trx: Knex.Transaction): Promise<void>;
@@ -0,0 +1,29 @@
1
+ import { eachSplitted } from '../../../utils/array/each-splitted.js';
2
+ /**
3
+ * Replaces the page's `page_main_content_tables` rows with the freshly
4
+ * captured set. Called inside `updatePage`'s transaction, gated on
5
+ * `mainContents !== null`.
6
+ *
7
+ * Same empty-guard as `insertTags` / `insertJsonLd`: an empty array does not
8
+ * wipe prior rows on a degraded re-scrape.
9
+ * @param pageId - The owning `content_items.id`.
10
+ * @param mainContents - Beholder's per-page main-content metrics.
11
+ * @param trx - The active transaction.
12
+ */
13
+ export async function insertMainContentTables(pageId, mainContents, trx) {
14
+ if (mainContents.tables.length === 0)
15
+ return;
16
+ const rows = mainContents.tables.map((table, order) => ({
17
+ pageId,
18
+ order,
19
+ rows: table.rows,
20
+ cols: table.cols,
21
+ hasHeader: table.hasHeader,
22
+ hasFooter: table.hasFooter,
23
+ hasMergedCell: table.hasMergedCell,
24
+ }));
25
+ await trx('page_main_content_tables').where('pageId', pageId).delete();
26
+ await eachSplitted(rows, 100, async (chunk) => {
27
+ await trx('page_main_content_tables').insert(chunk);
28
+ });
29
+ }
@@ -0,0 +1,56 @@
1
+ import type { PageDataWithDomPaths, PageSource } from '../../../types.js';
2
+ import type { WriteRefCaches } from '../../_shared/types.js';
3
+ import type { Knex } from 'knex';
4
+ /**
5
+ * Upserts page data into `content_items` + `page_meta` (inserts the
6
+ * identity row if new, updates if existing).
7
+ *
8
+ * `source` is intentionally NOT in the UPDATE clause — provenance is set
9
+ * once at INSERT time inside `resolveContentItemId`, and existing rows
10
+ * keep whatever label they were first inserted with, except for the
11
+ * priority lattice applied below: `'crawled'` > `'inventory-seed'` >
12
+ * `'inventory-discovered'`. The inventory feature exists to surface
13
+ * orphans (= URLs NOT reachable from the original crawl roots), so
14
+ * anything reachable via the crawled chain must be labelled `'crawled'`
15
+ * even if previously labelled `'inventory-*'`.
16
+ *
17
+ * `is_external`, by contrast, IS overwritten on every call — but demotion is
18
+ * guarded. `updatePage` keys the row by the redirect DESTINATION url while
19
+ * passing the REQUESTING url's `isExternal`, so the value written here
20
+ * describes the requester, not necessarily this row. Inheriting it is
21
+ * deliberate when PROMOTING (an out-of-scope soft-404 page reached from an
22
+ * in-scope request counts as covered by the crawl, and the viewer relies on
23
+ * that — see `@nitpicker/query`'s `build-directory-tree-rows.ts`). It would be
24
+ * wrong when DEMOTING: an out-of-scope url redirecting to an in-scope page
25
+ * that was already taken on as a target must not flip that page to
26
+ * `is_external = 1` — no reading of the column justifies erasing a real
27
+ * observation with an inherited one. `@nitpicker/crawler`'s `Crawler#scrapedDestinations`
28
+ * blocks this within one run, but that is per-`#runDeal` memory, so a later
29
+ * `--append` / `--retry-failed` process starts blind to what the DB already
30
+ * knows — hence the CASE below, which checks the ROW's own prior state
31
+ * instead: once `scraped = 1 AND is_external = 0` is true, no later call can
32
+ * flip it back to `1`. Promotion (`0 → 1` before the row has been scraped, or
33
+ * `1 → 0` at any time) is untouched. This mirrors how `first_crawled_at`'s `COALESCE` below
34
+ * protects an established value — deliberately NOT by re-deriving scope from
35
+ * the destination url, which would also kill the wanted promoting case.
36
+ *
37
+ * The page's response headers are decomposed and written into the
38
+ * header dictionary tables here — per response, not deferred to
39
+ * crawl-end — and the resulting `header_set_id` lands on the same
40
+ * `content_items` UPDATE. Meta text / URL / JSON values are interned
41
+ * into `text_refs` / `url_refs` / `json_refs` and `page_meta` stores
42
+ * only the FK ids; on a re-scrape the `page_meta` row is fully replaced
43
+ * (`ON CONFLICT(page_id) DO UPDATE` over every column) exactly as the
44
+ * legacy flat-column UPDATE overwrote every column.
45
+ * @param knex - Knex query builder connected to the archive DB. Used as the
46
+ * fallback when `trx` is not provided.
47
+ * @param caches - The connection's write-side id caches.
48
+ * @param page - The scraped page data, optionally carrying nitpicker's own
49
+ * in-browser custom-element capture (see {@link PageDataWithDomPaths}).
50
+ * @param isTarget - Whether this page is a crawl target.
51
+ * @param trx - Optional transaction all statements run through.
52
+ * @param source - Inventory provenance for the INSERT path. Ignored on UPDATE
53
+ * except through the priority lattice described above.
54
+ * @returns The `content_items.id` of the inserted or updated row.
55
+ */
56
+ export declare function insertPage(knex: Knex, caches: WriteRefCaches, page: PageDataWithDomPaths, isTarget: boolean, trx?: Knex.Transaction, source?: PageSource): Promise<number>;
@@ -0,0 +1,259 @@
1
+ import { normalizeContentType } from '../../../content-type/normalize-content-type.js';
2
+ import { computeMainContentsDenormalized } from '../../../meta/compute-main-contents-denormalized.js';
3
+ import { computePageDenormalized } from '../../../meta/compute-page-denormalized.js';
4
+ import { deriveFlatFromMeta } from '../../../meta/derive-flat-from-meta.js';
5
+ import { deriveMetaExtras } from '../../../meta/derive-meta-extras.js';
6
+ import { PAGE_META_COLUMN_MAPS } from '../../../page-meta-column-maps.js';
7
+ import { upsertTextRefs } from '../../../populate-entity-tables/upsert-text-refs.js';
8
+ import { DATA_URI_URL_REFS_LIMIT } from '../../../populate-ref-tables/data-uri-url-refs-limit.js';
9
+ import { resolveContentItemId } from '../../_shared/resolve-content-item-id.js';
10
+ import { upsertContentTypeRef } from '../../_shared/upsert-content-type-ref.js';
11
+ import { upsertJsonRef } from '../../_shared/upsert-json-ref.js';
12
+ import { upsertResponseHeaders } from '../../_shared/upsert-response-headers.js';
13
+ import { upsertUrlRef } from '../../_shared/upsert-url-ref.js';
14
+ /**
15
+ * Upserts page data into `content_items` + `page_meta` (inserts the
16
+ * identity row if new, updates if existing).
17
+ *
18
+ * `source` is intentionally NOT in the UPDATE clause — provenance is set
19
+ * once at INSERT time inside `resolveContentItemId`, and existing rows
20
+ * keep whatever label they were first inserted with, except for the
21
+ * priority lattice applied below: `'crawled'` > `'inventory-seed'` >
22
+ * `'inventory-discovered'`. The inventory feature exists to surface
23
+ * orphans (= URLs NOT reachable from the original crawl roots), so
24
+ * anything reachable via the crawled chain must be labelled `'crawled'`
25
+ * even if previously labelled `'inventory-*'`.
26
+ *
27
+ * `is_external`, by contrast, IS overwritten on every call — but demotion is
28
+ * guarded. `updatePage` keys the row by the redirect DESTINATION url while
29
+ * passing the REQUESTING url's `isExternal`, so the value written here
30
+ * describes the requester, not necessarily this row. Inheriting it is
31
+ * deliberate when PROMOTING (an out-of-scope soft-404 page reached from an
32
+ * in-scope request counts as covered by the crawl, and the viewer relies on
33
+ * that — see `@nitpicker/query`'s `build-directory-tree-rows.ts`). It would be
34
+ * wrong when DEMOTING: an out-of-scope url redirecting to an in-scope page
35
+ * that was already taken on as a target must not flip that page to
36
+ * `is_external = 1` — no reading of the column justifies erasing a real
37
+ * observation with an inherited one. `@nitpicker/crawler`'s `Crawler#scrapedDestinations`
38
+ * blocks this within one run, but that is per-`#runDeal` memory, so a later
39
+ * `--append` / `--retry-failed` process starts blind to what the DB already
40
+ * knows — hence the CASE below, which checks the ROW's own prior state
41
+ * instead: once `scraped = 1 AND is_external = 0` is true, no later call can
42
+ * flip it back to `1`. Promotion (`0 → 1` before the row has been scraped, or
43
+ * `1 → 0` at any time) is untouched. This mirrors how `first_crawled_at`'s `COALESCE` below
44
+ * protects an established value — deliberately NOT by re-deriving scope from
45
+ * the destination url, which would also kill the wanted promoting case.
46
+ *
47
+ * The page's response headers are decomposed and written into the
48
+ * header dictionary tables here — per response, not deferred to
49
+ * crawl-end — and the resulting `header_set_id` lands on the same
50
+ * `content_items` UPDATE. Meta text / URL / JSON values are interned
51
+ * into `text_refs` / `url_refs` / `json_refs` and `page_meta` stores
52
+ * only the FK ids; on a re-scrape the `page_meta` row is fully replaced
53
+ * (`ON CONFLICT(page_id) DO UPDATE` over every column) exactly as the
54
+ * legacy flat-column UPDATE overwrote every column.
55
+ * @param knex - Knex query builder connected to the archive DB. Used as the
56
+ * fallback when `trx` is not provided.
57
+ * @param caches - The connection's write-side id caches.
58
+ * @param page - The scraped page data, optionally carrying nitpicker's own
59
+ * in-browser custom-element capture (see {@link PageDataWithDomPaths}).
60
+ * @param isTarget - Whether this page is a crawl target.
61
+ * @param trx - Optional transaction all statements run through.
62
+ * @param source - Inventory provenance for the INSERT path. Ignored on UPDATE
63
+ * except through the priority lattice described above.
64
+ * @returns The `content_items.id` of the inserted or updated row.
65
+ */
66
+ export async function insertPage(knex, caches, page, isTarget, trx, source) {
67
+ const qb = trx ?? knex;
68
+ const pageId = await resolveContentItemId(qb, caches, page.url.withoutHashAndAuth, {
69
+ source,
70
+ });
71
+ const flat = deriveFlatFromMeta(page.meta, page.url.href);
72
+ const denorm = computePageDenormalized(page.meta);
73
+ const mainContentsDenorm = computeMainContentsDenormalized(page.mainContents, page.scrollHeight, page.mainContentCustomElements?.length, page.imageScan);
74
+ const extras = deriveMetaExtras(page.meta);
75
+ const now = Date.now();
76
+ // Canonicalize so the stored dictionary value matches the exact-string
77
+ // page-ness predicate (`content_type_refs.raw = 'text/html'`) used by
78
+ // the read layer and the case-insensitive `isHtmlContentType` used in
79
+ // code. Responses are recorded verbatim upstream, so `Text/HTML` /
80
+ // `text/html ` can otherwise fork dictionary rows and silently
81
+ // misclassify.
82
+ const contentType = normalizeContentType(page.contentType);
83
+ const contentTypeId = contentType == null || contentType === ''
84
+ ? null
85
+ : await upsertContentTypeRef(qb, caches, contentType);
86
+ const headerSetId = await upsertResponseHeaders(qb, caches, page.responseHeaders);
87
+ // Source priority on UPDATE: 'crawled' > 'inventory-seed' >
88
+ // 'inventory-discovered'. In current callers, `source` only arrives as
89
+ // `'inventory-seed'` / `'inventory-discovered'` / `undefined`
90
+ // (`derivePageSource` never emits `'crawled'`, and outside inventory
91
+ // mode `source` is `undefined` so this CASE never runs). The
92
+ // `? = 'crawled'` branch is therefore reachable only via a future
93
+ // call site that wants to explicitly assert a crawled lineage —
94
+ // today the actual crawled-wins downgrade fires in
95
+ // `resolveContentItemId` when an anchor lineage `'crawled'` lands on
96
+ // an existing `'inventory-*'` row. The branch is kept so the CASE
97
+ // completely describes the priority lattice in one place.
98
+ const sourceUpdate = source === undefined
99
+ ? {}
100
+ : {
101
+ source: qb.raw(`CASE
102
+ WHEN source = 'crawled' OR ? = 'crawled' THEN 'crawled'
103
+ WHEN source = 'inventory-seed' OR ? = 'inventory-seed' THEN 'inventory-seed'
104
+ WHEN source = 'inventory-discovered' OR ? = 'inventory-discovered' THEN 'inventory-discovered'
105
+ ELSE source
106
+ END`, [source, source, source]),
107
+ };
108
+ await qb('content_items')
109
+ .where('id', pageId)
110
+ .update({
111
+ scraped: 1,
112
+ // Once a row has been scraped as a real crawl target, no later call
113
+ // may flip it back off — same inheritance-from-the-requester bug as
114
+ // `is_external` below (`setExternalPage` always passes `isTarget:
115
+ // false`), and the same fix: guard on the row's own prior state
116
+ // instead of per-run memory. Demoting is_target away from an
117
+ // established value would under-count `getScrapedHtmlPageCount`'s
118
+ // resume offset and silently break the "isTarget=1 means covered by
119
+ // the crawl" contract `accessor.getPages('page')` documents.
120
+ is_target: qb.raw('CASE WHEN scraped = 1 AND is_target = 1 THEN 1 ELSE ? END', [
121
+ isTarget ? 1 : 0,
122
+ ]),
123
+ // Once a row has been scraped as internal, no later call may flip it
124
+ // back to external — see this function's docs for why the write this
125
+ // guards against happens at all.
126
+ is_external: qb.raw('CASE WHEN scraped = 1 AND is_external = 0 THEN 0 ELSE ? END', [
127
+ page.isExternal ? 1 : 0,
128
+ ]),
129
+ status: page.status,
130
+ status_text: page.statusText,
131
+ content_type_id: contentTypeId,
132
+ content_length: page.contentLength,
133
+ header_set_id: headerSetId,
134
+ // Timestamps: `first_crawled_at` is set only on first scrape —
135
+ // `COALESCE` preserves the existing value so a re-scrape
136
+ // (`--append`, `--retry-failed`) does not erase the discovery time.
137
+ // `last_crawled_at` is updated every successful scrape.
138
+ first_crawled_at: qb.raw('COALESCE(first_crawled_at, ?)', [now]),
139
+ last_crawled_at: now,
140
+ is_skipped: page.isSkipped ? 1 : 0,
141
+ ...sourceUpdate,
142
+ });
143
+ // The cache's `source` mirror only tracks the resolveContentItemId
144
+ // lattice; when the CASE above rewrites the column, refresh the cache
145
+ // from the caller-supplied label so a later crawled-wins check sees
146
+ // the current value. (`'crawled'` never arrives here today — see the
147
+ // CASE comment — so the only observable effect is seed-over-discovered
148
+ // promotion, which the lattice below reproduces.)
149
+ if (source !== undefined) {
150
+ const entry = caches.contentItems.get(page.url.withoutHashAndAuth);
151
+ if (entry !== undefined && entry.source === 'inventory-discovered') {
152
+ entry.source = source;
153
+ }
154
+ }
155
+ await upsertPageMeta(qb, caches, pageId, flat, denorm, page.mainContents == null ? null : mainContentsDenorm, extras);
156
+ return pageId;
157
+ }
158
+ /**
159
+ * Builds and upserts the `page_meta` row for one scraped page: interns
160
+ * text / URL / JSON values into their ref tables, then fully replaces
161
+ * the row (every column participates in the `DO UPDATE`) so a re-scrape
162
+ * behaves exactly like the legacy per-column UPDATE.
163
+ * @param qb - Knex instance or transaction.
164
+ * @param caches - The connection's write-side id caches.
165
+ * @param pageId - The owning `content_items.id`.
166
+ * @param flat - Flat meta columns from `deriveFlatFromMeta`.
167
+ * @param denorm - Denormalised aggregates from `computePageDenormalized`.
168
+ * @param mainContentsDenorm - Denormalised `main_content_*` / `scroll_height_*`
169
+ * aggregates from `computeMainContentsDenormalized`, or `null` when the
170
+ * page's `mainContents` was `null` (degraded / non-HTML scrape). `null`
171
+ * here omits all seventeen columns from the upsert entirely — on
172
+ * `ON CONFLICT DO UPDATE` this leaves a previous full scrape's values
173
+ * untouched rather than overwriting them with NULL, mirroring the
174
+ * `page_main_content_*` child-table writers' same no-op-on-null guard.
175
+ * @param extras - Nested-Meta catch-all from `deriveMetaExtras`.
176
+ */
177
+ async function upsertPageMeta(qb, caches, pageId, flat, denorm, mainContentsDenorm, extras) {
178
+ const texts = new Set();
179
+ for (const { source } of PAGE_META_COLUMN_MAPS.text) {
180
+ const value = flat[source];
181
+ if (typeof value === 'string' && value !== '') {
182
+ texts.add(value);
183
+ }
184
+ }
185
+ const textIds = await upsertTextRefs(qb, texts);
186
+ const row = {
187
+ page_id: pageId,
188
+ lang: flat.lang,
189
+ dir: flat.dir,
190
+ charset: flat.charset,
191
+ base_href: flat.baseHref,
192
+ viewport_raw: flat.viewport_raw,
193
+ theme_color: flat.themeColor,
194
+ application_name: flat.applicationName,
195
+ author: flat.author,
196
+ generator: flat.generator,
197
+ publisher: flat.publisher,
198
+ robots_noindex: flat.robots_noindex,
199
+ robots_nofollow: flat.robots_nofollow,
200
+ robots_noarchive: flat.robots_noarchive,
201
+ robots_noimageindex: flat.robots_noimageindex,
202
+ googlebot: flat.googlebot,
203
+ og_type: flat.og_type,
204
+ og_site_name: flat.og_site_name,
205
+ og_image_alt: flat.og_image_alt,
206
+ og_image_width: flat.og_image_width,
207
+ og_image_height: flat.og_image_height,
208
+ og_locale: flat.og_locale,
209
+ og_article_published_time: flat.og_article_published_time,
210
+ og_article_modified_time: flat.og_article_modified_time,
211
+ twitter_card: flat.twitter_card,
212
+ twitter_site: flat.twitter_site,
213
+ twitter_creator: flat.twitter_creator,
214
+ fb_app_id: flat.fb_app_id,
215
+ verification_google: flat.verification_google,
216
+ format_detection_telephone: flat.formatDetection_telephone,
217
+ // Denormalised aggregates: written once at scrape time so list reads
218
+ // (Sheets, page-detail summary) can answer "how many JSON-LD
219
+ // entries?" and "which Wappalyzer providers?" by selecting a single
220
+ // column rather than running a GROUP BY join on every read.
221
+ tag_count: denorm.tag_count,
222
+ jsonld_count: denorm.jsonld_count,
223
+ tags_providers_csv: denorm.tags_providers_csv,
224
+ // Omitted entirely (not set to null) when mainContentsDenorm is null —
225
+ // see the parameter doc above for why this preserves prior values on
226
+ // ON CONFLICT DO UPDATE instead of erasing them.
227
+ ...mainContentsDenorm,
228
+ };
229
+ for (const { source, target } of PAGE_META_COLUMN_MAPS.text) {
230
+ const value = flat[source];
231
+ row[target] =
232
+ typeof value === 'string' && value !== '' ? (textIds.get(value) ?? null) : null;
233
+ }
234
+ for (const { source, target } of PAGE_META_COLUMN_MAPS.url) {
235
+ const value = flat[source];
236
+ if (typeof value !== 'string' || value === '' || isLargeDataUri(value)) {
237
+ // `page_meta` has no `*_blob_id` companion columns, so a large
238
+ // data URI in a URL slot (a base64 favicon, typically) is
239
+ // dropped rather than ballooning `url_refs` with an opaque
240
+ // payload — matching the archive-migration behaviour.
241
+ row[target] = null;
242
+ continue;
243
+ }
244
+ row[target] = await upsertUrlRef(qb, caches, value);
245
+ }
246
+ const extrasJson = JSON.stringify(extras);
247
+ row.meta_extras_json_id =
248
+ extrasJson === '' ? null : await upsertJsonRef(qb, caches, extrasJson);
249
+ await qb('page_meta').insert(row).onConflict('page_id').merge();
250
+ }
251
+ /**
252
+ * Returns `true` when `value` is a `data:` URI larger than the routing
253
+ * threshold — the same rule that routes image `src` values to
254
+ * `blob_refs` instead of `url_refs`.
255
+ * @param value - Raw URL column value.
256
+ */
257
+ function isLargeDataUri(value) {
258
+ return value.startsWith('data:') && value.length > DATA_URI_URL_REFS_LIMIT;
259
+ }
@@ -0,0 +1,25 @@
1
+ import type { PageData } from '../../../utils/types/types.js';
2
+ import type { Knex } from 'knex';
3
+ /**
4
+ * Replaces the page's `technology_signals` + `page_technologies` rows with
5
+ * the freshly extracted set. Called inside `updatePage`'s transaction
6
+ * unconditionally — the `wappalyzer` signal source draws on `<script src>` /
7
+ * `<iframe src>` / window globals / response headers, not the HTML body, so
8
+ * external pages that skip rendering still contribute technology signals
9
+ * (structural signals naturally find nothing against an empty `html`
10
+ * string, which is exactly what a skipped render leaves it as).
11
+ *
12
+ * Direct replacement for `insertTags` in the live crawl write path (that
13
+ * file is untouched — `scripts/migrate-to-0.10.mjs` still depends on it).
14
+ *
15
+ * Same empty-guard as `insertTags` / `insertJsonLd`: an empty array does
16
+ * not wipe prior rows on a degraded re-scrape. Both tables are always
17
+ * written together in this one call — see ARCHITECTURE.md's invariant
18
+ * that `technology_signals` and `page_technologies` are never updated
19
+ * independently.
20
+ * @param pageId
21
+ * @param html - The page's raw HTML string (empty for external/metadata-only scrapes).
22
+ * @param meta
23
+ * @param trx
24
+ */
25
+ export declare function insertTechnologies(pageId: number, html: string, meta: PageData['meta'], trx: Knex.Transaction): Promise<void>;