@nitpicker/archive 0.0.0 → 0.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +106 -0
- package/lib/apply-connection-pragmas.d.ts +18 -0
- package/lib/apply-connection-pragmas.js +40 -0
- package/lib/archive-accessor.d.ts +265 -0
- package/lib/archive-accessor.js +477 -0
- package/lib/archive-lock.d.ts +45 -0
- package/lib/archive-lock.js +154 -0
- package/lib/archive.d.ts +736 -0
- package/lib/archive.js +1055 -0
- package/lib/body-hash/compute-body-hash.d.ts +32 -0
- package/lib/body-hash/compute-body-hash.js +35 -0
- package/lib/cache/clear-archive-cache-entry.d.ts +18 -0
- package/lib/cache/clear-archive-cache-entry.js +24 -0
- package/lib/cache/clear-archive-cache-root.d.ts +26 -0
- package/lib/cache/clear-archive-cache-root.js +32 -0
- package/lib/cache/compute-archive-cache-key.d.ts +39 -0
- package/lib/cache/compute-archive-cache-key.js +95 -0
- package/lib/cache/extract-archive-to-cache.d.ts +57 -0
- package/lib/cache/extract-archive-to-cache.js +326 -0
- package/lib/cache/get-archive-cache-root.d.ts +20 -0
- package/lib/cache/get-archive-cache-root.js +53 -0
- package/lib/cache/is-archive-cache-disabled.d.ts +24 -0
- package/lib/cache/is-archive-cache-disabled.js +34 -0
- package/lib/cache/list-archive-cache-entries.d.ts +23 -0
- package/lib/cache/list-archive-cache-entries.js +130 -0
- package/lib/cache/path-exists.d.ts +9 -0
- package/lib/cache/path-exists.js +18 -0
- package/lib/cache/resolve-archive-cache-dir.d.ts +26 -0
- package/lib/cache/resolve-archive-cache-dir.js +32 -0
- package/lib/cache/types.d.ts +33 -0
- package/lib/cache/types.js +1 -0
- package/lib/content-type/is-html-content-type.d.ts +17 -0
- package/lib/content-type/is-html-content-type.js +19 -0
- package/lib/content-type/normalize-content-type.d.ts +14 -0
- package/lib/content-type/normalize-content-type.js +20 -0
- package/lib/create-adjunct-tables.d.ts +66 -0
- package/lib/create-adjunct-tables.js +510 -0
- package/lib/create-entity-tables.d.ts +191 -0
- package/lib/create-entity-tables.js +387 -0
- package/lib/create-progress-reporter.d.ts +30 -0
- package/lib/create-progress-reporter.js +38 -0
- package/lib/create-ref-tables.d.ts +35 -0
- package/lib/create-ref-tables.js +185 -0
- package/lib/create-template-tables.d.ts +28 -0
- package/lib/create-template-tables.js +92 -0
- package/lib/database.d.ts +549 -0
- package/lib/database.js +803 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.d.ts +27 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.js +35 -0
- package/lib/db-ops/_shared/compress-payload.d.ts +26 -0
- package/lib/db-ops/_shared/compress-payload.js +30 -0
- package/lib/db-ops/_shared/create-write-ref-caches.d.ts +17 -0
- package/lib/db-ops/_shared/create-write-ref-caches.js +27 -0
- package/lib/db-ops/_shared/decode-json-ref.d.ts +17 -0
- package/lib/db-ops/_shared/decode-json-ref.js +31 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.d.ts +49 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.js +69 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.d.ts +20 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.js +53 -0
- package/lib/db-ops/_shared/resolve-content-item-id.d.ts +62 -0
- package/lib/db-ops/_shared/resolve-content-item-id.js +143 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.d.ts +23 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.js +29 -0
- package/lib/db-ops/_shared/retry-setting.d.ts +16 -0
- package/lib/db-ops/_shared/retry-setting.js +18 -0
- package/lib/db-ops/_shared/safe-parse-json.d.ts +11 -0
- package/lib/db-ops/_shared/safe-parse-json.js +18 -0
- package/lib/db-ops/_shared/types.d.ts +94 -0
- package/lib/db-ops/_shared/types.js +1 -0
- package/lib/db-ops/_shared/upsert-blob-ref.d.ts +25 -0
- package/lib/db-ops/_shared/upsert-blob-ref.js +48 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.d.ts +30 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.js +45 -0
- package/lib/db-ops/_shared/upsert-json-ref.d.ts +22 -0
- package/lib/db-ops/_shared/upsert-json-ref.js +41 -0
- package/lib/db-ops/_shared/upsert-response-headers.d.ts +35 -0
- package/lib/db-ops/_shared/upsert-response-headers.js +49 -0
- package/lib/db-ops/_shared/upsert-url-ref.d.ts +39 -0
- package/lib/db-ops/_shared/upsert-url-ref.js +62 -0
- package/lib/db-ops/anchors/get-anchors-on-page.d.ts +10 -0
- package/lib/db-ops/anchors/get-anchors-on-page.js +21 -0
- package/lib/db-ops/config/get-base-url.d.ts +8 -0
- package/lib/db-ops/config/get-base-url.js +14 -0
- package/lib/db-ops/config/get-config.d.ts +10 -0
- package/lib/db-ops/config/get-config.js +29 -0
- package/lib/db-ops/config/get-created-cwd.d.ts +11 -0
- package/lib/db-ops/config/get-created-cwd.js +13 -0
- package/lib/db-ops/config/get-name.d.ts +8 -0
- package/lib/db-ops/config/get-name.js +14 -0
- package/lib/db-ops/config/info-column-allowlist.d.ts +7 -0
- package/lib/db-ops/config/info-column-allowlist.js +29 -0
- package/lib/db-ops/config/info-json-columns.d.ts +5 -0
- package/lib/db-ops/config/info-json-columns.js +11 -0
- package/lib/db-ops/config/set-config.d.ts +12 -0
- package/lib/db-ops/config/set-config.js +21 -0
- package/lib/db-ops/config/update-config.d.ts +17 -0
- package/lib/db-ops/config/update-config.js +36 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.d.ts +19 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.js +30 -0
- package/lib/db-ops/console-logs/replace-console-logs.d.ts +34 -0
- package/lib/db-ops/console-logs/replace-console-logs.js +123 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.d.ts +16 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.js +26 -0
- package/lib/db-ops/console-logs/types.d.ts +38 -0
- package/lib/db-ops/console-logs/types.js +1 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.d.ts +29 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.js +52 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.d.ts +18 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.js +23 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.d.ts +12 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.js +15 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.d.ts +14 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.js +30 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.d.ts +57 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.js +87 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.d.ts +21 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.js +27 -0
- package/lib/db-ops/errors/insert-crawl-error.d.ts +15 -0
- package/lib/db-ops/errors/insert-crawl-error.js +21 -0
- package/lib/db-ops/errors/insert-page-error.d.ts +21 -0
- package/lib/db-ops/errors/insert-page-error.js +30 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.d.ts +33 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.js +158 -0
- package/lib/db-ops/html/read-page-html-blob.d.ts +17 -0
- package/lib/db-ops/html/read-page-html-blob.js +20 -0
- package/lib/db-ops/lifecycle/checkpoint.d.ts +8 -0
- package/lib/db-ops/lifecycle/checkpoint.js +9 -0
- package/lib/db-ops/lifecycle/destroy.d.ts +6 -0
- package/lib/db-ops/lifecycle/destroy.js +7 -0
- package/lib/db-ops/lifecycle/init.d.ts +58 -0
- package/lib/db-ops/lifecycle/init.js +122 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.d.ts +22 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.js +41 -0
- package/lib/db-ops/meta/get-audios-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-audios-of-page.js +15 -0
- package/lib/db-ops/meta/get-buttons-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-buttons-of-page.js +15 -0
- package/lib/db-ops/meta/get-canvases-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-canvases-of-page.js +15 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.js +15 -0
- package/lib/db-ops/meta/get-headings-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-headings-of-page.js +15 -0
- package/lib/db-ops/meta/get-iframes-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-iframes-of-page.js +15 -0
- package/lib/db-ops/meta/get-jsonld-of-page.d.ts +13 -0
- package/lib/db-ops/meta/get-jsonld-of-page.js +27 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.js +15 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.js +15 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.js +15 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.js +15 -0
- package/lib/db-ops/meta/get-videos-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-videos-of-page.js +15 -0
- package/lib/db-ops/outages/close-network-outage.d.ts +12 -0
- package/lib/db-ops/outages/close-network-outage.js +15 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.d.ts +26 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.js +42 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.d.ts +26 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.js +31 -0
- package/lib/db-ops/outages/insert-network-outage.d.ts +14 -0
- package/lib/db-ops/outages/insert-network-outage.js +29 -0
- package/lib/db-ops/outages/list-network-outages.d.ts +28 -0
- package/lib/db-ops/outages/list-network-outages.js +42 -0
- package/lib/db-ops/pages/order/set-url-order.d.ts +13 -0
- package/lib/db-ops/pages/order/set-url-order.js +38 -0
- package/lib/db-ops/pages/read/build-page-query.d.ts +18 -0
- package/lib/db-ops/pages/read/build-page-query.js +40 -0
- package/lib/db-ops/pages/read/get-crawling-state.d.ts +117 -0
- package/lib/db-ops/pages/read/get-crawling-state.js +161 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.d.ts +15 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.js +30 -0
- package/lib/db-ops/pages/read/get-page-count.d.ts +12 -0
- package/lib/db-ops/pages/read/get-page-count.js +21 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.d.ts +24 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.js +28 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.d.ts +38 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.js +107 -0
- package/lib/db-ops/pages/read/get-pages.d.ts +11 -0
- package/lib/db-ops/pages/read/get-pages.js +51 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.d.ts +18 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.js +25 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.d.ts +31 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.js +32 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.d.ts +20 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.js +37 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.d.ts +30 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.js +91 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.d.ts +88 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.js +216 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.d.ts +80 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.js +151 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.d.ts +24 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.js +24 -0
- package/lib/db-ops/pages/write/insert-audios.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-audios.js +25 -0
- package/lib/db-ops/pages/write/insert-buttons.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-buttons.js +29 -0
- package/lib/db-ops/pages/write/insert-canvases.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-canvases.js +26 -0
- package/lib/db-ops/pages/write/insert-custom-elements.d.ts +27 -0
- package/lib/db-ops/pages/write/insert-custom-elements.js +40 -0
- package/lib/db-ops/pages/write/insert-headings.d.ts +15 -0
- package/lib/db-ops/pages/write/insert-headings.js +27 -0
- package/lib/db-ops/pages/write/insert-iframes.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-iframes.js +28 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.d.ts +38 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.js +60 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.d.ts +36 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.js +48 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.d.ts +42 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.js +56 -0
- package/lib/db-ops/pages/write/insert-jsonld.d.ts +17 -0
- package/lib/db-ops/pages/write/insert-jsonld.js +49 -0
- package/lib/db-ops/pages/write/insert-main-content-images.d.ts +20 -0
- package/lib/db-ops/pages/write/insert-main-content-images.js +32 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.js +29 -0
- package/lib/db-ops/pages/write/insert-page.d.ts +56 -0
- package/lib/db-ops/pages/write/insert-page.js +259 -0
- package/lib/db-ops/pages/write/insert-technologies.d.ts +25 -0
- package/lib/db-ops/pages/write/insert-technologies.js +45 -0
- package/lib/db-ops/pages/write/insert-videos.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-videos.js +28 -0
- package/lib/db-ops/pages/write/link-redirect-sources.d.ts +42 -0
- package/lib/db-ops/pages/write/link-redirect-sources.js +101 -0
- package/lib/db-ops/pages/write/record-redirect.d.ts +35 -0
- package/lib/db-ops/pages/write/record-redirect.js +100 -0
- package/lib/db-ops/pages/write/set-skipped-page.d.ts +13 -0
- package/lib/db-ops/pages/write/set-skipped-page.js +24 -0
- package/lib/db-ops/pages/write/update-page.d.ts +40 -0
- package/lib/db-ops/pages/write/update-page.js +419 -0
- package/lib/db-ops/pages/write/write-page-html-blob.d.ts +19 -0
- package/lib/db-ops/pages/write/write-page-html-blob.js +41 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.d.ts +9 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.js +15 -0
- package/lib/db-ops/referrers/get-referrers-of-page.d.ts +17 -0
- package/lib/db-ops/referrers/get-referrers-of-page.js +32 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.d.ts +8 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.js +15 -0
- package/lib/db-ops/resources/build-resource-query.d.ts +25 -0
- package/lib/db-ops/resources/build-resource-query.js +29 -0
- package/lib/db-ops/resources/get-existing-resource-urls.d.ts +9 -0
- package/lib/db-ops/resources/get-existing-resource-urls.js +24 -0
- package/lib/db-ops/resources/get-resource-by-url.d.ts +13 -0
- package/lib/db-ops/resources/get-resource-by-url.js +22 -0
- package/lib/db-ops/resources/get-resource-url-list.d.ts +17 -0
- package/lib/db-ops/resources/get-resource-url-list.js +26 -0
- package/lib/db-ops/resources/get-resources.d.ts +8 -0
- package/lib/db-ops/resources/get-resources.js +11 -0
- package/lib/db-ops/resources/insert-inventory-resources.d.ts +24 -0
- package/lib/db-ops/resources/insert-inventory-resources.js +64 -0
- package/lib/db-ops/resources/insert-resource-referrers.d.ts +15 -0
- package/lib/db-ops/resources/insert-resource-referrers.js +54 -0
- package/lib/db-ops/resources/insert-resource.d.ts +34 -0
- package/lib/db-ops/resources/insert-resource.js +73 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.d.ts +26 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.js +30 -0
- package/lib/db-ops/templates/assign-template-labels.d.ts +60 -0
- package/lib/db-ops/templates/assign-template-labels.js +187 -0
- package/lib/db-ops/templates/replace-page-templates.d.ts +44 -0
- package/lib/db-ops/templates/replace-page-templates.js +174 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.d.ts +16 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.js +17 -0
- package/lib/db-ops/templates/types.d.ts +103 -0
- package/lib/db-ops/templates/types.js +1 -0
- package/lib/debug.d.ts +8 -0
- package/lib/debug.js +9 -0
- package/lib/decode-html-blob.d.ts +20 -0
- package/lib/decode-html-blob.js +23 -0
- package/lib/decode-page-html-blob-bytes.d.ts +25 -0
- package/lib/decode-page-html-blob-bytes.js +29 -0
- package/lib/decode-stored-blob-bytes.d.ts +25 -0
- package/lib/decode-stored-blob-bytes.js +47 -0
- package/lib/derive-lineage-from-parent.d.ts +37 -0
- package/lib/derive-lineage-from-parent.js +42 -0
- package/lib/drop-legacy-tables.d.ts +45 -0
- package/lib/drop-legacy-tables.js +56 -0
- package/lib/error-kind/classify-error-kind.d.ts +20 -0
- package/lib/error-kind/classify-error-kind.js +136 -0
- package/lib/error-kind/network-related-error-kinds.d.ts +23 -0
- package/lib/error-kind/network-related-error-kinds.js +28 -0
- package/lib/error-kind/permanent-error-kinds.d.ts +48 -0
- package/lib/error-kind/permanent-error-kinds.js +54 -0
- package/lib/error-kind/types.d.ts +54 -0
- package/lib/error-kind/types.js +1 -0
- package/lib/filesystem/append-text.d.ts +9 -0
- package/lib/filesystem/append-text.js +14 -0
- package/lib/filesystem/copy-dir-sync.d.ts +6 -0
- package/lib/filesystem/copy-dir-sync.js +9 -0
- package/lib/filesystem/copy-dir.d.ts +7 -0
- package/lib/filesystem/copy-dir.js +13 -0
- package/lib/filesystem/copy-file-with-progress.d.ts +20 -0
- package/lib/filesystem/copy-file-with-progress.js +34 -0
- package/lib/filesystem/exists.d.ts +6 -0
- package/lib/filesystem/exists.js +9 -0
- package/lib/filesystem/get-file-list.d.ts +8 -0
- package/lib/filesystem/get-file-list.js +12 -0
- package/lib/filesystem/is-dir.d.ts +6 -0
- package/lib/filesystem/is-dir.js +10 -0
- package/lib/filesystem/mkdir.d.ts +8 -0
- package/lib/filesystem/mkdir.js +15 -0
- package/lib/filesystem/output-binary.d.ts +12 -0
- package/lib/filesystem/output-binary.js +17 -0
- package/lib/filesystem/output-json.d.ts +9 -0
- package/lib/filesystem/output-json.js +14 -0
- package/lib/filesystem/output-text.d.ts +11 -0
- package/lib/filesystem/output-text.js +32 -0
- package/lib/filesystem/parse-pax-path.d.ts +18 -0
- package/lib/filesystem/parse-pax-path.js +45 -0
- package/lib/filesystem/parse-tar-size-field.d.ts +13 -0
- package/lib/filesystem/parse-tar-size-field.js +37 -0
- package/lib/filesystem/peek-tar-top-dir.d.ts +35 -0
- package/lib/filesystem/peek-tar-top-dir.js +215 -0
- package/lib/filesystem/read-json.d.ts +7 -0
- package/lib/filesystem/read-json.js +11 -0
- package/lib/filesystem/read-text.d.ts +6 -0
- package/lib/filesystem/read-text.js +10 -0
- package/lib/filesystem/readline.d.ts +11 -0
- package/lib/filesystem/readline.js +26 -0
- package/lib/filesystem/remove.d.ts +5 -0
- package/lib/filesystem/remove.js +10 -0
- package/lib/filesystem/rename.d.ts +16 -0
- package/lib/filesystem/rename.js +48 -0
- package/lib/filesystem/tar.d.ts +23 -0
- package/lib/filesystem/tar.js +78 -0
- package/lib/filesystem/untar.d.ts +33 -0
- package/lib/filesystem/untar.js +84 -0
- package/lib/get-failed-page-messages.d.ts +56 -0
- package/lib/get-failed-page-messages.js +146 -0
- package/lib/get-json.d.ts +10 -0
- package/lib/get-json.js +25 -0
- package/lib/html-snapshot/match-selector-html.d.ts +25 -0
- package/lib/html-snapshot/match-selector-html.js +28 -0
- package/lib/html-snapshot/match-selector-snapshots.d.ts +33 -0
- package/lib/html-snapshot/match-selector-snapshots.js +33 -0
- package/lib/html-snapshot/search-html-document.d.ts +29 -0
- package/lib/html-snapshot/search-html-document.js +27 -0
- package/lib/html-snapshot/search-html-snapshots.d.ts +36 -0
- package/lib/html-snapshot/search-html-snapshots.js +35 -0
- package/lib/html-snapshot/types.d.ts +111 -0
- package/lib/html-snapshot/types.js +7 -0
- package/lib/html-snapshot/validate-search-pattern.d.ts +15 -0
- package/lib/html-snapshot/validate-search-pattern.js +17 -0
- package/lib/init-schema.d.ts +48 -0
- package/lib/init-schema.js +124 -0
- package/lib/is-inventory-source.d.ts +21 -0
- package/lib/is-inventory-source.js +22 -0
- package/lib/is-within-outage-window.d.ts +49 -0
- package/lib/is-within-outage-window.js +33 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.d.ts +24 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.js +26 -0
- package/lib/libsql-dialect.d.ts +115 -0
- package/lib/libsql-dialect.js +116 -0
- package/lib/limited-page-ids.d.ts +9 -0
- package/lib/limited-page-ids.js +18 -0
- package/lib/meta/assert-compatible-version.d.ts +60 -0
- package/lib/meta/assert-compatible-version.js +93 -0
- package/lib/meta/classify-jsonld-type.d.ts +23 -0
- package/lib/meta/classify-jsonld-type.js +43 -0
- package/lib/meta/compare-semver.d.ts +23 -0
- package/lib/meta/compare-semver.js +51 -0
- package/lib/meta/compute-main-contents-denormalized.d.ts +41 -0
- package/lib/meta/compute-main-contents-denormalized.js +88 -0
- package/lib/meta/compute-page-denormalized.d.ts +20 -0
- package/lib/meta/compute-page-denormalized.js +35 -0
- package/lib/meta/derive-flat-from-meta.d.ts +34 -0
- package/lib/meta/derive-flat-from-meta.js +158 -0
- package/lib/meta/derive-meta-extras.d.ts +20 -0
- package/lib/meta/derive-meta-extras.js +23 -0
- package/lib/meta/extract-tags-for-archive.d.ts +17 -0
- package/lib/meta/extract-tags-for-archive.js +36 -0
- package/lib/meta/parse-main-content-class-list.d.ts +19 -0
- package/lib/meta/parse-main-content-class-list.js +34 -0
- package/lib/meta/summarize-jsonld.d.ts +17 -0
- package/lib/meta/summarize-jsonld.js +29 -0
- package/lib/meta/technologies/combine-technology-confidence.d.ts +46 -0
- package/lib/meta/technologies/combine-technology-confidence.js +93 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.d.ts +45 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.js +53 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.d.ts +33 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.js +46 -0
- package/lib/meta/technologies/extract-technologies-for-archive.d.ts +33 -0
- package/lib/meta/technologies/extract-technologies-for-archive.js +30 -0
- package/lib/meta/technologies/match-js-license-comment-signal.d.ts +21 -0
- package/lib/meta/technologies/match-js-license-comment-signal.js +23 -0
- package/lib/meta/technologies/match-structural-technology-signals.d.ts +26 -0
- package/lib/meta/technologies/match-structural-technology-signals.js +48 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.d.ts +25 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.js +35 -0
- package/lib/meta/technologies/technology-signal-definitions.d.ts +44 -0
- package/lib/meta/technologies/technology-signal-definitions.js +60 -0
- package/lib/meta/technologies/types.d.ts +70 -0
- package/lib/meta/technologies/types.js +13 -0
- package/lib/meta/types.d.ts +1490 -0
- package/lib/meta/types.js +65 -0
- package/lib/migrate-content-items-alias-of-id.d.ts +52 -0
- package/lib/migrate-content-items-alias-of-id.js +69 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.d.ts +46 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.js +62 -0
- package/lib/migrate-content-items-is-metadata-only.d.ts +44 -0
- package/lib/migrate-content-items-is-metadata-only.js +60 -0
- package/lib/migrate-entity-tables.d.ts +55 -0
- package/lib/migrate-entity-tables.js +66 -0
- package/lib/migrate-info-created-cwd.d.ts +17 -0
- package/lib/migrate-info-created-cwd.js +36 -0
- package/lib/migrate-info-main-content-selector.d.ts +16 -0
- package/lib/migrate-info-main-content-selector.js +35 -0
- package/lib/migrate-info-request-header-names.d.ts +16 -0
- package/lib/migrate-info-request-header-names.js +35 -0
- package/lib/migrate-info-roots.d.ts +20 -0
- package/lib/migrate-info-roots.js +52 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.d.ts +34 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.js +51 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.d.ts +25 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.js +44 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.d.ts +16 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.js +35 -0
- package/lib/migrate-main-contents-columns.d.ts +26 -0
- package/lib/migrate-main-contents-columns.js +61 -0
- package/lib/migrate-page-meta-body-hash.d.ts +44 -0
- package/lib/migrate-page-meta-body-hash.js +63 -0
- package/lib/migrate-page-meta-console-error-count.d.ts +27 -0
- package/lib/migrate-page-meta-console-error-count.js +45 -0
- package/lib/migrate-page-meta-custom-element-count.d.ts +33 -0
- package/lib/migrate-page-meta-custom-element-count.js +51 -0
- package/lib/migrate-page-meta-image-scan.d.ts +27 -0
- package/lib/migrate-page-meta-image-scan.js +52 -0
- package/lib/migrate-page-tags-to-page-technologies.d.ts +39 -0
- package/lib/migrate-page-tags-to-page-technologies.js +79 -0
- package/lib/migrate-ref-tables.d.ts +25 -0
- package/lib/migrate-ref-tables.js +38 -0
- package/lib/native-executor/check-native-executor-config.d.ts +17 -0
- package/lib/native-executor/check-native-executor-config.js +20 -0
- package/lib/page-meta-column-maps.d.ts +32 -0
- package/lib/page-meta-column-maps.js +43 -0
- package/lib/page.d.ts +546 -0
- package/lib/page.js +764 -0
- package/lib/peek-archive-lock.d.ts +40 -0
- package/lib/peek-archive-lock.js +62 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.d.ts +41 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.js +87 -0
- package/lib/populate-entity-tables/derive-dom-path.d.ts +35 -0
- package/lib/populate-entity-tables/derive-dom-path.js +72 -0
- package/lib/populate-entity-tables/is-blob-ref-value.d.ts +16 -0
- package/lib/populate-entity-tables/is-blob-ref-value.js +19 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.d.ts +66 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.js +96 -0
- package/lib/populate-entity-tables/populate-anchor-edges.d.ts +33 -0
- package/lib/populate-entity-tables/populate-anchor-edges.js +153 -0
- package/lib/populate-entity-tables/populate-content-items.d.ts +40 -0
- package/lib/populate-entity-tables/populate-content-items.js +141 -0
- package/lib/populate-entity-tables/populate-entities.d.ts +81 -0
- package/lib/populate-entity-tables/populate-entities.js +110 -0
- package/lib/populate-entity-tables/populate-image-items.d.ts +91 -0
- package/lib/populate-entity-tables/populate-image-items.js +226 -0
- package/lib/populate-entity-tables/populate-page-meta.d.ts +33 -0
- package/lib/populate-entity-tables/populate-page-meta.js +267 -0
- package/lib/populate-entity-tables/populate-resource-items.d.ts +22 -0
- package/lib/populate-entity-tables/populate-resource-items.js +114 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.d.ts +31 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.js +33 -0
- package/lib/populate-entity-tables/resolve-blob-refs.d.ts +31 -0
- package/lib/populate-entity-tables/resolve-blob-refs.js +100 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.d.ts +22 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.js +27 -0
- package/lib/populate-entity-tables/resolve-header-sets.d.ts +49 -0
- package/lib/populate-entity-tables/resolve-header-sets.js +122 -0
- package/lib/populate-entity-tables/resolve-json-refs.d.ts +25 -0
- package/lib/populate-entity-tables/resolve-json-refs.js +67 -0
- package/lib/populate-entity-tables/resolve-text-refs.d.ts +30 -0
- package/lib/populate-entity-tables/resolve-text-refs.js +61 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.d.ts +21 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.js +27 -0
- package/lib/populate-entity-tables/resolve-url-refs.d.ts +33 -0
- package/lib/populate-entity-tables/resolve-url-refs.js +60 -0
- package/lib/populate-entity-tables/test-utils/count-rows.d.ts +17 -0
- package/lib/populate-entity-tables/test-utils/count-rows.js +20 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.d.ts +25 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.js +42 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.d.ts +30 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.js +175 -0
- package/lib/populate-entity-tables/types.d.ts +157 -0
- package/lib/populate-entity-tables/types.js +12 -0
- package/lib/populate-entity-tables/upsert-text-refs.d.ts +38 -0
- package/lib/populate-entity-tables/upsert-text-refs.js +78 -0
- package/lib/populate-ref-tables/classify-content-type.d.ts +16 -0
- package/lib/populate-ref-tables/classify-content-type.js +52 -0
- package/lib/populate-ref-tables/compute-content-hash.d.ts +22 -0
- package/lib/populate-ref-tables/compute-content-hash.js +26 -0
- package/lib/populate-ref-tables/compute-header-flags.d.ts +16 -0
- package/lib/populate-ref-tables/compute-header-flags.js +70 -0
- package/lib/populate-ref-tables/content-type-rules.d.ts +38 -0
- package/lib/populate-ref-tables/content-type-rules.js +133 -0
- package/lib/populate-ref-tables/create-header-table-caches.d.ts +25 -0
- package/lib/populate-ref-tables/create-header-table-caches.js +49 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.d.ts +15 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.js +15 -0
- package/lib/populate-ref-tables/decode-data-uri.d.ts +21 -0
- package/lib/populate-ref-tables/decode-data-uri.js +126 -0
- package/lib/populate-ref-tables/decompose-header-set.d.ts +29 -0
- package/lib/populate-ref-tables/decompose-header-set.js +157 -0
- package/lib/populate-ref-tables/decompose-url.d.ts +25 -0
- package/lib/populate-ref-tables/decompose-url.js +70 -0
- package/lib/populate-ref-tables/header-stability.d.ts +19 -0
- package/lib/populate-ref-tables/header-stability.js +22 -0
- package/lib/populate-ref-tables/header-value-cache-key.d.ts +17 -0
- package/lib/populate-ref-tables/header-value-cache-key.js +19 -0
- package/lib/populate-ref-tables/normalize-mime.d.ts +24 -0
- package/lib/populate-ref-tables/normalize-mime.js +36 -0
- package/lib/populate-ref-tables/populate-blob-refs.d.ts +38 -0
- package/lib/populate-ref-tables/populate-blob-refs.js +134 -0
- package/lib/populate-ref-tables/populate-content-type-refs.d.ts +27 -0
- package/lib/populate-ref-tables/populate-content-type-refs.js +70 -0
- package/lib/populate-ref-tables/populate-header-tables.d.ts +35 -0
- package/lib/populate-ref-tables/populate-header-tables.js +80 -0
- package/lib/populate-ref-tables/populate-json-refs.d.ts +29 -0
- package/lib/populate-ref-tables/populate-json-refs.js +101 -0
- package/lib/populate-ref-tables/populate-refs.d.ts +51 -0
- package/lib/populate-ref-tables/populate-refs.js +62 -0
- package/lib/populate-ref-tables/populate-text-refs.d.ts +32 -0
- package/lib/populate-ref-tables/populate-text-refs.js +133 -0
- package/lib/populate-ref-tables/populate-url-refs.d.ts +28 -0
- package/lib/populate-ref-tables/populate-url-refs.js +148 -0
- package/lib/populate-ref-tables/test-utils/count-rows.d.ts +15 -0
- package/lib/populate-ref-tables/test-utils/count-rows.js +17 -0
- package/lib/populate-ref-tables/types.d.ts +197 -0
- package/lib/populate-ref-tables/types.js +7 -0
- package/lib/populate-ref-tables/upsert-one-header-set.d.ts +34 -0
- package/lib/populate-ref-tables/upsert-one-header-set.js +208 -0
- package/lib/populate-ref-tables/volatile-header-names.d.ts +20 -0
- package/lib/populate-ref-tables/volatile-header-names.js +33 -0
- package/lib/redirect-table.d.ts +9 -0
- package/lib/redirect-table.js +28 -0
- package/lib/release-finished-statements.d.ts +42 -0
- package/lib/release-finished-statements.js +45 -0
- package/lib/resolve-redirect-chain.d.ts +33 -0
- package/lib/resolve-redirect-chain.js +27 -0
- package/lib/resource.d.ts +46 -0
- package/lib/resource.js +62 -0
- package/lib/retarget-legacy-fk-tables.d.ts +61 -0
- package/lib/retarget-legacy-fk-tables.js +137 -0
- package/lib/safe-path.d.ts +9 -0
- package/lib/safe-path.js +17 -0
- package/lib/scope/build-scope-map.d.ts +21 -0
- package/lib/scope/build-scope-map.js +32 -0
- package/lib/scope/find-scope-entry.d.ts +25 -0
- package/lib/scope/find-scope-entry.js +45 -0
- package/lib/template-classification/classify-archive-page-templates.d.ts +42 -0
- package/lib/template-classification/classify-archive-page-templates.js +70 -0
- package/lib/template-classification/classify-page-templates.d.ts +33 -0
- package/lib/template-classification/classify-page-templates.js +60 -0
- package/lib/template-classification/collect-page-ids-with-html.d.ts +24 -0
- package/lib/template-classification/collect-page-ids-with-html.js +30 -0
- package/lib/template-classification/collect-page-stylesheet-urls.d.ts +32 -0
- package/lib/template-classification/collect-page-stylesheet-urls.js +132 -0
- package/lib/template-classification/create-content-root-hint.d.ts +41 -0
- package/lib/template-classification/create-content-root-hint.js +51 -0
- package/lib/template-classification/create-page-cluster-factory.d.ts +36 -0
- package/lib/template-classification/create-page-cluster-factory.js +52 -0
- package/lib/template-classification/load-page-cluster-candidates.d.ts +32 -0
- package/lib/template-classification/load-page-cluster-candidates.js +93 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.d.ts +34 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.js +236 -0
- package/lib/template-classification/page-cluster/types.d.ts +123 -0
- package/lib/template-classification/page-cluster/types.js +1 -0
- package/lib/template-classification/types.d.ts +234 -0
- package/lib/template-classification/types.js +1 -0
- package/lib/test-utils/build-full-schema-test-db.d.ts +34 -0
- package/lib/test-utils/build-full-schema-test-db.js +74 -0
- package/lib/test-utils/compare-strings.d.ts +12 -0
- package/lib/test-utils/compare-strings.js +14 -0
- package/lib/test-utils/create-legacy-analysis-tables.d.ts +13 -0
- package/lib/test-utils/create-legacy-analysis-tables.js +37 -0
- package/lib/test-utils/fk-parent-tables.d.ts +15 -0
- package/lib/test-utils/fk-parent-tables.js +19 -0
- package/lib/test-utils/seed-content-item.d.ts +35 -0
- package/lib/test-utils/seed-content-item.js +42 -0
- package/lib/test-utils/setup-legacy-fk-db.d.ts +34 -0
- package/lib/test-utils/setup-legacy-fk-db.js +271 -0
- package/lib/transfer/attach-source-database.d.ts +31 -0
- package/lib/transfer/attach-source-database.js +40 -0
- package/lib/transfer/build-split-config.d.ts +30 -0
- package/lib/transfer/build-split-config.js +42 -0
- package/lib/transfer/clear-replaced-page-rows.d.ts +23 -0
- package/lib/transfer/clear-replaced-page-rows.js +61 -0
- package/lib/transfer/concat-archives.d.ts +55 -0
- package/lib/transfer/concat-archives.js +95 -0
- package/lib/transfer/concat-source-transfer-phases.d.ts +10 -0
- package/lib/transfer/concat-source-transfer-phases.js +17 -0
- package/lib/transfer/content-item-rank-sql.d.ts +21 -0
- package/lib/transfer/content-item-rank-sql.js +23 -0
- package/lib/transfer/copy-anchor-edges.d.ts +28 -0
- package/lib/transfer/copy-anchor-edges.js +42 -0
- package/lib/transfer/copy-dictionaries-for-concat.d.ts +39 -0
- package/lib/transfer/copy-dictionaries-for-concat.js +81 -0
- package/lib/transfer/copy-dictionaries-for-split.d.ts +29 -0
- package/lib/transfer/copy-dictionaries-for-split.js +224 -0
- package/lib/transfer/copy-header-set-children.d.ts +27 -0
- package/lib/transfer/copy-header-set-children.js +51 -0
- package/lib/transfer/copy-image-items.d.ts +21 -0
- package/lib/transfer/copy-image-items.js +62 -0
- package/lib/transfer/copy-inventory-source-lists.d.ts +30 -0
- package/lib/transfer/copy-inventory-source-lists.js +61 -0
- package/lib/transfer/copy-journal-tables.d.ts +30 -0
- package/lib/transfer/copy-journal-tables.js +56 -0
- package/lib/transfer/copy-page-console-logs.d.ts +16 -0
- package/lib/transfer/copy-page-console-logs.js +27 -0
- package/lib/transfer/copy-page-html-blobs.d.ts +31 -0
- package/lib/transfer/copy-page-html-blobs.js +43 -0
- package/lib/transfer/copy-page-meta.d.ts +27 -0
- package/lib/transfer/copy-page-meta.js +68 -0
- package/lib/transfer/copy-page-template-clusters.d.ts +31 -0
- package/lib/transfer/copy-page-template-clusters.js +56 -0
- package/lib/transfer/copy-page-template-labels.d.ts +34 -0
- package/lib/transfer/copy-page-template-labels.js +88 -0
- package/lib/transfer/copy-resource-items.d.ts +29 -0
- package/lib/transfer/copy-resource-items.js +89 -0
- package/lib/transfer/copy-resource-ref-edges.d.ts +20 -0
- package/lib/transfer/copy-resource-ref-edges.js +33 -0
- package/lib/transfer/copy-simple-page-scoped-tables.d.ts +15 -0
- package/lib/transfer/copy-simple-page-scoped-tables.js +34 -0
- package/lib/transfer/count-external-pages-in-scope.d.ts +26 -0
- package/lib/transfer/count-external-pages-in-scope.js +40 -0
- package/lib/transfer/create-transfer-temp-tables.d.ts +30 -0
- package/lib/transfer/create-transfer-temp-tables.js +59 -0
- package/lib/transfer/dictionary-copy-specs.d.ts +32 -0
- package/lib/transfer/dictionary-copy-specs.js +28 -0
- package/lib/transfer/drop-transfer-temp-tables.d.ts +9 -0
- package/lib/transfer/drop-transfer-temp-tables.js +18 -0
- package/lib/transfer/flatten-redirect-chains.d.ts +44 -0
- package/lib/transfer/flatten-redirect-chains.js +74 -0
- package/lib/transfer/insert-content-items.d.ts +35 -0
- package/lib/transfer/insert-content-items.js +116 -0
- package/lib/transfer/list-transfer-columns.d.ts +35 -0
- package/lib/transfer/list-transfer-columns.js +45 -0
- package/lib/transfer/mark-in-scope-content-items.d.ts +31 -0
- package/lib/transfer/mark-in-scope-content-items.js +54 -0
- package/lib/transfer/merge-archive-configs.d.ts +51 -0
- package/lib/transfer/merge-archive-configs.js +85 -0
- package/lib/transfer/plan-content-items-for-concat.d.ts +33 -0
- package/lib/transfer/plan-content-items-for-concat.js +51 -0
- package/lib/transfer/plan-content-items-for-split.d.ts +42 -0
- package/lib/transfer/plan-content-items-for-split.js +83 -0
- package/lib/transfer/plan-resource-items.d.ts +40 -0
- package/lib/transfer/plan-resource-items.js +69 -0
- package/lib/transfer/quote-transfer-identifier.d.ts +18 -0
- package/lib/transfer/quote-transfer-identifier.js +20 -0
- package/lib/transfer/reclassify-resource-externality.d.ts +37 -0
- package/lib/transfer/reclassify-resource-externality.js +66 -0
- package/lib/transfer/remap-redirect-dest-ids.d.ts +34 -0
- package/lib/transfer/remap-redirect-dest-ids.js +51 -0
- package/lib/transfer/replace-content-items.d.ts +39 -0
- package/lib/transfer/replace-content-items.js +83 -0
- package/lib/transfer/simple-page-scoped-tables.d.ts +25 -0
- package/lib/transfer/simple-page-scoped-tables.js +38 -0
- package/lib/transfer/split-archive.d.ts +55 -0
- package/lib/transfer/split-archive.js +98 -0
- package/lib/transfer/split-source-transfer-phases.d.ts +11 -0
- package/lib/transfer/split-source-transfer-phases.js +18 -0
- package/lib/transfer/transfer-action.d.ts +34 -0
- package/lib/transfer/transfer-action.js +32 -0
- package/lib/transfer/transfer-archive-rows.d.ts +65 -0
- package/lib/transfer/transfer-archive-rows.js +156 -0
- package/lib/transfer/transfer-dictionary-tables.d.ts +12 -0
- package/lib/transfer/transfer-dictionary-tables.js +22 -0
- package/lib/transfer/transfer-post-phases.d.ts +10 -0
- package/lib/transfer/transfer-post-phases.js +13 -0
- package/lib/transfer/transfer-source-alias.d.ts +9 -0
- package/lib/transfer/transfer-source-alias.js +9 -0
- package/lib/transfer/types.d.ts +111 -0
- package/lib/transfer/types.js +35 -0
- package/lib/types.d.ts +772 -0
- package/lib/types.js +1 -0
- package/lib/url-alias/compute-tier-a-alias-key.d.ts +44 -0
- package/lib/url-alias/compute-tier-a-alias-key.js +47 -0
- package/lib/url-alias/compute-tier-b-alias-key.d.ts +23 -0
- package/lib/url-alias/compute-tier-b-alias-key.js +26 -0
- package/lib/url-alias/group-alias-candidates.d.ts +27 -0
- package/lib/url-alias/group-alias-candidates.js +29 -0
- package/lib/url-alias/types.d.ts +12 -0
- package/lib/url-alias/types.js +1 -0
- package/lib/url-pattern/compute-shape-key.d.ts +58 -0
- package/lib/url-pattern/compute-shape-key.js +129 -0
- package/lib/url-pattern/decompose-url.d.ts +33 -0
- package/lib/url-pattern/decompose-url.js +79 -0
- package/lib/url-pattern/reconstruct-url.d.ts +15 -0
- package/lib/url-pattern/reconstruct-url.js +33 -0
- package/lib/url-sort/compute-url-sort-ranks.d.ts +30 -0
- package/lib/url-sort/compute-url-sort-ranks.js +33 -0
- package/lib/utils/array/each-splitted.d.ts +10 -0
- package/lib/utils/array/each-splitted.js +14 -0
- package/lib/utils/debug.d.ts +8 -0
- package/lib/utils/debug.js +8 -0
- package/lib/utils/error/emit-error-with-retry.d.ts +40 -0
- package/lib/utils/error/emit-error-with-retry.js +44 -0
- package/lib/utils/error/emit-error.d.ts +39 -0
- package/lib/utils/error/emit-error.js +41 -0
- package/lib/utils/object/parse-response-headers.d.ts +12 -0
- package/lib/utils/object/parse-response-headers.js +26 -0
- package/lib/utils/object/redact-request-headers.d.ts +15 -0
- package/lib/utils/object/redact-request-headers.js +27 -0
- package/lib/utils/types/types.d.ts +383 -0
- package/lib/utils/types/types.js +1 -0
- package/lib/verify-migration/capture-rejection.d.ts +24 -0
- package/lib/verify-migration/capture-rejection.js +31 -0
- package/lib/verify-migration/check-anchor-edges-count.d.ts +34 -0
- package/lib/verify-migration/check-anchor-edges-count.js +72 -0
- package/lib/verify-migration/check-anchor-edges-sum.d.ts +13 -0
- package/lib/verify-migration/check-anchor-edges-sum.js +27 -0
- package/lib/verify-migration/check-content-items-count.d.ts +16 -0
- package/lib/verify-migration/check-content-items-count.js +30 -0
- package/lib/verify-migration/check-content-type-preservation.d.ts +22 -0
- package/lib/verify-migration/check-content-type-preservation.js +40 -0
- package/lib/verify-migration/check-foreign-key-integrity.d.ts +31 -0
- package/lib/verify-migration/check-foreign-key-integrity.js +47 -0
- package/lib/verify-migration/check-image-items-count.d.ts +12 -0
- package/lib/verify-migration/check-image-items-count.js +26 -0
- package/lib/verify-migration/check-page-meta-count.d.ts +15 -0
- package/lib/verify-migration/check-page-meta-count.js +31 -0
- package/lib/verify-migration/check-reader-parity.d.ts +23 -0
- package/lib/verify-migration/check-reader-parity.js +182 -0
- package/lib/verify-migration/check-resource-items-count.d.ts +17 -0
- package/lib/verify-migration/check-resource-items-count.js +33 -0
- package/lib/verify-migration/check-url-round-trip.d.ts +43 -0
- package/lib/verify-migration/check-url-round-trip.js +112 -0
- package/lib/verify-migration/types.d.ts +70 -0
- package/lib/verify-migration/types.js +63 -0
- package/lib/verify-migration/verify-migration.d.ts +41 -0
- package/lib/verify-migration/verify-migration.js +120 -0
- package/lib/with-bulk-write-pragmas.d.ts +51 -0
- package/lib/with-bulk-write-pragmas.js +132 -0
- package/lib/write-queue.d.ts +32 -0
- package/lib/write-queue.js +55 -0
- package/package.json +350 -3
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deletes every Scoped-Replace derived row for the given page ids, across the
|
|
3
|
+
* 17 tables a page's re-scrape needs to start clean.
|
|
4
|
+
*
|
|
5
|
+
* Shared by {@link resetFailedPages} and {@link repromoteExternalPages} —
|
|
6
|
+
* both un-scrape a page back to `scraped = 0` and need the same "delete this
|
|
7
|
+
* page's derived rows so the re-scrape can re-insert fresh data without
|
|
8
|
+
* duplicates" sweep. `page_errors` is deliberately NOT included here:
|
|
9
|
+
* `repromoteExternalPages` never cleared it (an external page's prior error
|
|
10
|
+
* history stays visible after being promoted back into scope), and folding
|
|
11
|
+
* it into this shared helper would silently change that existing behaviour.
|
|
12
|
+
* Callers that do want `page_errors` cleared (`resetFailedPages`) delete it
|
|
13
|
+
* themselves alongside this call.
|
|
14
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
15
|
+
* @param pageIds - `content_items.id` values whose derived rows should be
|
|
16
|
+
* deleted. Expected to already be chunked below
|
|
17
|
+
* `SQLITE_LIMIT_VARIABLE_NUMBER` by the caller.
|
|
18
|
+
*/
|
|
19
|
+
export async function clearPageDerivedRows(knex, pageIds) {
|
|
20
|
+
await knex('page_meta').whereIn('page_id', pageIds).delete();
|
|
21
|
+
await knex('anchor_edges').whereIn('page_id', pageIds).delete();
|
|
22
|
+
await knex('image_items').whereIn('page_id', pageIds).delete();
|
|
23
|
+
await knex('resource_ref_edges').whereIn('page_id', pageIds).delete();
|
|
24
|
+
await knex('page_html_ref').whereIn('page_id', pageIds).delete();
|
|
25
|
+
await knex('technology_signals').whereIn('pageId', pageIds).delete();
|
|
26
|
+
await knex('page_technologies').whereIn('pageId', pageIds).delete();
|
|
27
|
+
await knex('page_jsonld').whereIn('pageId', pageIds).delete();
|
|
28
|
+
await knex('page_main_content_headings').whereIn('pageId', pageIds).delete();
|
|
29
|
+
await knex('page_main_content_images').whereIn('pageId', pageIds).delete();
|
|
30
|
+
await knex('page_main_content_tables').whereIn('pageId', pageIds).delete();
|
|
31
|
+
await knex('page_main_content_buttons').whereIn('pageId', pageIds).delete();
|
|
32
|
+
await knex('page_main_content_iframes').whereIn('pageId', pageIds).delete();
|
|
33
|
+
await knex('page_main_content_videos').whereIn('pageId', pageIds).delete();
|
|
34
|
+
await knex('page_main_content_audios').whereIn('pageId', pageIds).delete();
|
|
35
|
+
await knex('page_main_content_canvases').whereIn('pageId', pageIds).delete();
|
|
36
|
+
await knex('page_main_content_custom_elements').whereIn('pageId', pageIds).delete();
|
|
37
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ExURL, ParseURLOptions } from '@d-zero/shared/parse-url';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Promote previously-external pages whose URL falls under any of the new scope
|
|
5
|
+
* entries back to a "needs scraping" state so that the next crawl picks them up
|
|
6
|
+
* as full internal pages.
|
|
7
|
+
*
|
|
8
|
+
* For each matching page:
|
|
9
|
+
* - clears the scrape metadata (status, headers, snapshot path, etc.) by
|
|
10
|
+
* deleting the `page_meta` row outright (a re-scrape re-inserts it fresh),
|
|
11
|
+
* - flips `is_external` to `0` and `scraped` to `0` on `content_items`,
|
|
12
|
+
* - removes stale `anchor_edges`, `image_items`, and `resource_ref_edges`
|
|
13
|
+
* rows so that the re-scrape can re-insert fresh ones without duplicates.
|
|
14
|
+
*
|
|
15
|
+
* The page row itself is kept (id is preserved) so existing referrers via
|
|
16
|
+
* `anchor_edges.href_page_id` remain valid. SELECT and UPDATE/DELETE
|
|
17
|
+
* statements are chunked to stay below SQLite's
|
|
18
|
+
* `SQLITE_LIMIT_VARIABLE_NUMBER`.
|
|
19
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
20
|
+
* @param scopes - The hostname-indexed scope map after the new roots are merged.
|
|
21
|
+
* @param options - URL parsing options forwarded to {@link findScopeEntry}.
|
|
22
|
+
* @param onProgress - Called after each chunk's DELETE/UPDATE statements
|
|
23
|
+
* complete, with the pages processed so far and the total to promote
|
|
24
|
+
* (issue #294: a large `--append` can promote thousands of pages across
|
|
25
|
+
* `content_items` plus the 17 tables {@link clearPageDerivedRows} clears,
|
|
26
|
+
* running for seconds to minutes with no other signal it hasn't hung).
|
|
27
|
+
* Omit for no reporting (the default; e.g. tests).
|
|
28
|
+
* @returns The URLs of the pages that were promoted.
|
|
29
|
+
*/
|
|
30
|
+
export declare function repromoteExternalPages(knex: Knex, scopes: ReadonlyMap<string, readonly ExURL[]>, options?: ParseURLOptions, onProgress?: (processed: number, total: number) => void): Promise<string[]>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { tryParseUrl as parseUrl } from '@d-zero/shared/parse-url';
|
|
2
|
+
import { dbLog } from '../../../debug.js';
|
|
3
|
+
import { findScopeEntry } from '../../../scope/find-scope-entry.js';
|
|
4
|
+
import { clearPageDerivedRows } from './clear-page-derived-rows.js';
|
|
5
|
+
/**
|
|
6
|
+
* Promote previously-external pages whose URL falls under any of the new scope
|
|
7
|
+
* entries back to a "needs scraping" state so that the next crawl picks them up
|
|
8
|
+
* as full internal pages.
|
|
9
|
+
*
|
|
10
|
+
* For each matching page:
|
|
11
|
+
* - clears the scrape metadata (status, headers, snapshot path, etc.) by
|
|
12
|
+
* deleting the `page_meta` row outright (a re-scrape re-inserts it fresh),
|
|
13
|
+
* - flips `is_external` to `0` and `scraped` to `0` on `content_items`,
|
|
14
|
+
* - removes stale `anchor_edges`, `image_items`, and `resource_ref_edges`
|
|
15
|
+
* rows so that the re-scrape can re-insert fresh ones without duplicates.
|
|
16
|
+
*
|
|
17
|
+
* The page row itself is kept (id is preserved) so existing referrers via
|
|
18
|
+
* `anchor_edges.href_page_id` remain valid. SELECT and UPDATE/DELETE
|
|
19
|
+
* statements are chunked to stay below SQLite's
|
|
20
|
+
* `SQLITE_LIMIT_VARIABLE_NUMBER`.
|
|
21
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
22
|
+
* @param scopes - The hostname-indexed scope map after the new roots are merged.
|
|
23
|
+
* @param options - URL parsing options forwarded to {@link findScopeEntry}.
|
|
24
|
+
* @param onProgress - Called after each chunk's DELETE/UPDATE statements
|
|
25
|
+
* complete, with the pages processed so far and the total to promote
|
|
26
|
+
* (issue #294: a large `--append` can promote thousands of pages across
|
|
27
|
+
* `content_items` plus the 17 tables {@link clearPageDerivedRows} clears,
|
|
28
|
+
* running for seconds to minutes with no other signal it hasn't hung).
|
|
29
|
+
* Omit for no reporting (the default; e.g. tests).
|
|
30
|
+
* @returns The URLs of the pages that were promoted.
|
|
31
|
+
*/
|
|
32
|
+
export async function repromoteExternalPages(knex, scopes, options, onProgress) {
|
|
33
|
+
if (scopes.size === 0) {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
const candidates = await knex('content_items')
|
|
37
|
+
.join('url_refs', 'content_items.url_id', 'url_refs.id')
|
|
38
|
+
.select('content_items.id as id', 'url_refs.url as url')
|
|
39
|
+
.where('content_items.is_external', 1);
|
|
40
|
+
const promotedIds = [];
|
|
41
|
+
const promotedUrls = [];
|
|
42
|
+
for (const row of candidates) {
|
|
43
|
+
const parsed = parseUrl(row.url, options);
|
|
44
|
+
if (!parsed) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (findScopeEntry(parsed, scopes, options) === null) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
promotedIds.push(row.id);
|
|
51
|
+
promotedUrls.push(row.url);
|
|
52
|
+
}
|
|
53
|
+
if (promotedIds.length === 0) {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
const chunkSize = 500;
|
|
57
|
+
for (let i = 0; i < promotedIds.length; i += chunkSize) {
|
|
58
|
+
const chunk = promotedIds.slice(i, i + chunkSize);
|
|
59
|
+
await knex('content_items').whereIn('id', chunk).update({
|
|
60
|
+
scraped: 0,
|
|
61
|
+
is_external: 0,
|
|
62
|
+
is_skipped: 0,
|
|
63
|
+
skip_reason: null,
|
|
64
|
+
status: null,
|
|
65
|
+
status_text: null,
|
|
66
|
+
content_type_id: null,
|
|
67
|
+
content_length: null,
|
|
68
|
+
header_set_id: null,
|
|
69
|
+
redirect_dest_id: null,
|
|
70
|
+
// `first_crawled_at` / `last_crawled_at` are deliberately
|
|
71
|
+
// left untouched — the last-success timestamp survives the
|
|
72
|
+
// demotion.
|
|
73
|
+
});
|
|
74
|
+
// Clear the prior crawl's data for the repromoted pages via the
|
|
75
|
+
// shared sweep (also used by `resetFailedPages` / `resetPagesByUrls`).
|
|
76
|
+
// `updatePage` also replaces anchor_edges/image_items/tags/jsonld/
|
|
77
|
+
// page_main_content_* when it re-scrapes them, but only when the new
|
|
78
|
+
// scrape is non-empty — so this pre-clear is still load-bearing for
|
|
79
|
+
// pages that get repromoted but then re-scrape to nothing (or are
|
|
80
|
+
// never reached again), and it is the only place `resource_ref_edges`
|
|
81
|
+
// is cleared for this operation. Deleting the `page_meta` row (rather
|
|
82
|
+
// than nulling every column) clears title / description / og:* /
|
|
83
|
+
// twitter:* / meta_extras / main_content_* in one statement; a
|
|
84
|
+
// re-scrape re-inserts it via `ON CONFLICT(page_id) DO UPDATE`.
|
|
85
|
+
// Orphan blobs in `page_html_blobs` are left behind; #23 will add GC.
|
|
86
|
+
await clearPageDerivedRows(knex, chunk);
|
|
87
|
+
onProgress?.(Math.min(i + chunkSize, promotedIds.length), promotedIds.length);
|
|
88
|
+
}
|
|
89
|
+
dbLog('Repromoted %d external pages back to pending', promotedUrls.length);
|
|
90
|
+
return promotedUrls;
|
|
91
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Reset previously-attempted pages that ended in a recoverable failure so a
|
|
4
|
+
* follow-up crawl can re-fetch them from scratch.
|
|
5
|
+
*
|
|
6
|
+
* A page qualifies as a recoverable failure when it was already scraped
|
|
7
|
+
* (`scraped = 1`), is not a redirect source (`redirect_dest_id IS NULL`), was
|
|
8
|
+
* not intentionally skipped (`is_skipped` is not `1`), and one of the
|
|
9
|
+
* following holds:
|
|
10
|
+
*
|
|
11
|
+
* - `status = -1` — the sentinel a hard scrape failure (network error,
|
|
12
|
+
* timeout, browser crash) is recorded with (see `handle-scrape-error.ts`);
|
|
13
|
+
* - `status IS NULL` — no status was ever stored for the row;
|
|
14
|
+
* - the row has no `content_type_refs` link — the content type could not be
|
|
15
|
+
* determined;
|
|
16
|
+
* - `status` is in the `5xx` range — a (frequently transient) server error;
|
|
17
|
+
* - `page_meta.image_scan_desktop` or `image_scan_mobile` is one of
|
|
18
|
+
* {@link RETRYABLE_IMAGE_SCAN_CODES} — `@d-zero/beholder` abandoned that
|
|
19
|
+
* viewport's `<img>` scan for a transient reason (navigation never
|
|
20
|
+
* settled, or the frame/session was lost mid-scan), independent of the
|
|
21
|
+
* page's own HTTP `status` (a page can score `status = 200` and still
|
|
22
|
+
* have failed its mobile image scan).
|
|
23
|
+
*
|
|
24
|
+
* Definitive `4xx` responses are intentionally excluded: re-fetching a 404
|
|
25
|
+
* almost always yields the same answer.
|
|
26
|
+
*
|
|
27
|
+
* A second exclusion runs in JS after the SQL candidate scan: any page whose
|
|
28
|
+
* latest recorded `page_errors` / `crawl_errors` message classifies into a
|
|
29
|
+
* permanent {@link PERMANENT_ERROR_KINDS} kind (dns / tls / client-blocked /
|
|
30
|
+
* parse-error / connection-refused) is left as-is rather than reset to
|
|
31
|
+
* pending. Without this filter, `--retry-failed` never converges: NXDOMAIN
|
|
32
|
+
* hosts, expired-cert hosts, and `ERR_BLOCKED_BY_CLIENT` ad pixels would be
|
|
33
|
+
* reset every iteration, re-attempted, fail identically, and rejoin the
|
|
34
|
+
* candidate pool for the next iteration. The exclusion keeps the retry
|
|
35
|
+
* target shrinking across `--retry-failed` passes by leaving deterministic
|
|
36
|
+
* dead-ends alone.
|
|
37
|
+
*
|
|
38
|
+
* **Outage override**: before applying the permanent-kind exclusion, the
|
|
39
|
+
* message's `createdAt` is checked against every recorded
|
|
40
|
+
* `network_outages` window (see `is-within-outage-window.ts`). A `dns` (or
|
|
41
|
+
* any other permanent-kind) failure whose timestamp falls inside a window
|
|
42
|
+
* is treated as retryable regardless — `dns` is only a permanent,
|
|
43
|
+
* site-specific verdict when nothing else explains it; inside a confirmed
|
|
44
|
+
* operator-network outage, the same `getaddrinfo ENOTFOUND` message is
|
|
45
|
+
* evidence about the CRAWLER's connectivity, not the target site, and
|
|
46
|
+
* excluding it from retry would strand a perfectly reachable host as a
|
|
47
|
+
* false permanent failure for the rest of the archive's life. An archive
|
|
48
|
+
* with no recorded outages (`listNetworkOutages` returns `[]`) behaves
|
|
49
|
+
* exactly as before this override existed.
|
|
50
|
+
*
|
|
51
|
+
* **Confirmed same-cluster trap exclusion**: a third pass drops any
|
|
52
|
+
* remaining candidate whose URL shape (`computeShapeKey`) matches a
|
|
53
|
+
* `dedupe_cap_events.shape_key` already recorded in this archive (see
|
|
54
|
+
* `DedupeCapTracker`). A trap page frequently fails outright (timeout / 5xx)
|
|
55
|
+
* rather than rendering a comparable body, so it never reaches
|
|
56
|
+
* `DedupeCapTracker#observe` during the crawl that hit it — without this
|
|
57
|
+
* exclusion, `--retry-failed` would keep re-queueing the very pages the cap
|
|
58
|
+
* already exists to suppress, re-inflating the pending count on every pass
|
|
59
|
+
* for a shape this archive has already confirmed is not worth the cost of
|
|
60
|
+
* re-discovering. Left as a failed row rather than rewritten to a skip —
|
|
61
|
+
* post-hoc marking (`content_items.dedupe_cap_event_id`, computed at
|
|
62
|
+
* `viewer-build`) is what surfaces these pages as capped, not this reset
|
|
63
|
+
* path. An archive with no recorded cap events (`listDedupeCapShapeKeys`
|
|
64
|
+
* returns `[]`) behaves exactly as before this exclusion existed.
|
|
65
|
+
*
|
|
66
|
+
* Matching rows — internal and external alike — are demoted back to pending
|
|
67
|
+
* (`scraped = 0`) and have their stale scrape metadata cleared (the
|
|
68
|
+
* `page_meta` row is deleted outright rather than nulled column-by-column).
|
|
69
|
+
* The page row itself is kept (id preserved) so existing
|
|
70
|
+
* `anchor_edges.href_page_id` referrers stay valid, and `is_external` is
|
|
71
|
+
* left untouched so the next pass re-classifies each page from the crawl
|
|
72
|
+
* scope. Related `anchor_edges`, `image_items`, `resource_ref_edges`,
|
|
73
|
+
* `page_errors`, and the `page_main_content_*` child tables are deleted so
|
|
74
|
+
* the re-scrape can re-insert fresh data without duplicates — kept in sync
|
|
75
|
+
* with the `page_meta` row deletion above so a reset page's `main_content_*`
|
|
76
|
+
* counts and its child-table detail never disagree.
|
|
77
|
+
*
|
|
78
|
+
* SELECT and UPDATE/DELETE statements are chunked to stay below SQLite's
|
|
79
|
+
* `SQLITE_LIMIT_VARIABLE_NUMBER`.
|
|
80
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
81
|
+
* @param onProgress - Called after each chunk's DELETE/UPDATE statements
|
|
82
|
+
* complete, with the pages processed so far and the total to reset (issue
|
|
83
|
+
* #294: a large `--retry-failed` can reset thousands of pages across 13
|
|
84
|
+
* tables, running for seconds to minutes with no other signal it hasn't
|
|
85
|
+
* hung). Omit for no reporting (the default; e.g. tests).
|
|
86
|
+
* @returns The URLs of the pages that were reset to pending.
|
|
87
|
+
*/
|
|
88
|
+
export declare function resetFailedPages(knex: Knex, onProgress?: (processed: number, total: number) => void): Promise<string[]>;
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { dbLog } from '../../../debug.js';
|
|
2
|
+
import { classifyErrorKind } from '../../../error-kind/classify-error-kind.js';
|
|
3
|
+
import { PERMANENT_ERROR_KINDS } from '../../../error-kind/permanent-error-kinds.js';
|
|
4
|
+
import { getFailedPageMessages } from '../../../get-failed-page-messages.js';
|
|
5
|
+
import { isWithinOutageWindow } from '../../../is-within-outage-window.js';
|
|
6
|
+
import { computeShapeKey } from '../../../url-pattern/compute-shape-key.js';
|
|
7
|
+
import { listDedupeCapShapeKeys } from '../../dedupe-cap/list-dedupe-cap-shape-keys.js';
|
|
8
|
+
import { listNetworkOutages } from '../../outages/list-network-outages.js';
|
|
9
|
+
import { clearPageDerivedRows } from './clear-page-derived-rows.js';
|
|
10
|
+
import { RETRYABLE_IMAGE_SCAN_CODES } from './retryable-image-scan-codes.js';
|
|
11
|
+
/**
|
|
12
|
+
* Reset previously-attempted pages that ended in a recoverable failure so a
|
|
13
|
+
* follow-up crawl can re-fetch them from scratch.
|
|
14
|
+
*
|
|
15
|
+
* A page qualifies as a recoverable failure when it was already scraped
|
|
16
|
+
* (`scraped = 1`), is not a redirect source (`redirect_dest_id IS NULL`), was
|
|
17
|
+
* not intentionally skipped (`is_skipped` is not `1`), and one of the
|
|
18
|
+
* following holds:
|
|
19
|
+
*
|
|
20
|
+
* - `status = -1` — the sentinel a hard scrape failure (network error,
|
|
21
|
+
* timeout, browser crash) is recorded with (see `handle-scrape-error.ts`);
|
|
22
|
+
* - `status IS NULL` — no status was ever stored for the row;
|
|
23
|
+
* - the row has no `content_type_refs` link — the content type could not be
|
|
24
|
+
* determined;
|
|
25
|
+
* - `status` is in the `5xx` range — a (frequently transient) server error;
|
|
26
|
+
* - `page_meta.image_scan_desktop` or `image_scan_mobile` is one of
|
|
27
|
+
* {@link RETRYABLE_IMAGE_SCAN_CODES} — `@d-zero/beholder` abandoned that
|
|
28
|
+
* viewport's `<img>` scan for a transient reason (navigation never
|
|
29
|
+
* settled, or the frame/session was lost mid-scan), independent of the
|
|
30
|
+
* page's own HTTP `status` (a page can score `status = 200` and still
|
|
31
|
+
* have failed its mobile image scan).
|
|
32
|
+
*
|
|
33
|
+
* Definitive `4xx` responses are intentionally excluded: re-fetching a 404
|
|
34
|
+
* almost always yields the same answer.
|
|
35
|
+
*
|
|
36
|
+
* A second exclusion runs in JS after the SQL candidate scan: any page whose
|
|
37
|
+
* latest recorded `page_errors` / `crawl_errors` message classifies into a
|
|
38
|
+
* permanent {@link PERMANENT_ERROR_KINDS} kind (dns / tls / client-blocked /
|
|
39
|
+
* parse-error / connection-refused) is left as-is rather than reset to
|
|
40
|
+
* pending. Without this filter, `--retry-failed` never converges: NXDOMAIN
|
|
41
|
+
* hosts, expired-cert hosts, and `ERR_BLOCKED_BY_CLIENT` ad pixels would be
|
|
42
|
+
* reset every iteration, re-attempted, fail identically, and rejoin the
|
|
43
|
+
* candidate pool for the next iteration. The exclusion keeps the retry
|
|
44
|
+
* target shrinking across `--retry-failed` passes by leaving deterministic
|
|
45
|
+
* dead-ends alone.
|
|
46
|
+
*
|
|
47
|
+
* **Outage override**: before applying the permanent-kind exclusion, the
|
|
48
|
+
* message's `createdAt` is checked against every recorded
|
|
49
|
+
* `network_outages` window (see `is-within-outage-window.ts`). A `dns` (or
|
|
50
|
+
* any other permanent-kind) failure whose timestamp falls inside a window
|
|
51
|
+
* is treated as retryable regardless — `dns` is only a permanent,
|
|
52
|
+
* site-specific verdict when nothing else explains it; inside a confirmed
|
|
53
|
+
* operator-network outage, the same `getaddrinfo ENOTFOUND` message is
|
|
54
|
+
* evidence about the CRAWLER's connectivity, not the target site, and
|
|
55
|
+
* excluding it from retry would strand a perfectly reachable host as a
|
|
56
|
+
* false permanent failure for the rest of the archive's life. An archive
|
|
57
|
+
* with no recorded outages (`listNetworkOutages` returns `[]`) behaves
|
|
58
|
+
* exactly as before this override existed.
|
|
59
|
+
*
|
|
60
|
+
* **Confirmed same-cluster trap exclusion**: a third pass drops any
|
|
61
|
+
* remaining candidate whose URL shape (`computeShapeKey`) matches a
|
|
62
|
+
* `dedupe_cap_events.shape_key` already recorded in this archive (see
|
|
63
|
+
* `DedupeCapTracker`). A trap page frequently fails outright (timeout / 5xx)
|
|
64
|
+
* rather than rendering a comparable body, so it never reaches
|
|
65
|
+
* `DedupeCapTracker#observe` during the crawl that hit it — without this
|
|
66
|
+
* exclusion, `--retry-failed` would keep re-queueing the very pages the cap
|
|
67
|
+
* already exists to suppress, re-inflating the pending count on every pass
|
|
68
|
+
* for a shape this archive has already confirmed is not worth the cost of
|
|
69
|
+
* re-discovering. Left as a failed row rather than rewritten to a skip —
|
|
70
|
+
* post-hoc marking (`content_items.dedupe_cap_event_id`, computed at
|
|
71
|
+
* `viewer-build`) is what surfaces these pages as capped, not this reset
|
|
72
|
+
* path. An archive with no recorded cap events (`listDedupeCapShapeKeys`
|
|
73
|
+
* returns `[]`) behaves exactly as before this exclusion existed.
|
|
74
|
+
*
|
|
75
|
+
* Matching rows — internal and external alike — are demoted back to pending
|
|
76
|
+
* (`scraped = 0`) and have their stale scrape metadata cleared (the
|
|
77
|
+
* `page_meta` row is deleted outright rather than nulled column-by-column).
|
|
78
|
+
* The page row itself is kept (id preserved) so existing
|
|
79
|
+
* `anchor_edges.href_page_id` referrers stay valid, and `is_external` is
|
|
80
|
+
* left untouched so the next pass re-classifies each page from the crawl
|
|
81
|
+
* scope. Related `anchor_edges`, `image_items`, `resource_ref_edges`,
|
|
82
|
+
* `page_errors`, and the `page_main_content_*` child tables are deleted so
|
|
83
|
+
* the re-scrape can re-insert fresh data without duplicates — kept in sync
|
|
84
|
+
* with the `page_meta` row deletion above so a reset page's `main_content_*`
|
|
85
|
+
* counts and its child-table detail never disagree.
|
|
86
|
+
*
|
|
87
|
+
* SELECT and UPDATE/DELETE statements are chunked to stay below SQLite's
|
|
88
|
+
* `SQLITE_LIMIT_VARIABLE_NUMBER`.
|
|
89
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
90
|
+
* @param onProgress - Called after each chunk's DELETE/UPDATE statements
|
|
91
|
+
* complete, with the pages processed so far and the total to reset (issue
|
|
92
|
+
* #294: a large `--retry-failed` can reset thousands of pages across 13
|
|
93
|
+
* tables, running for seconds to minutes with no other signal it hasn't
|
|
94
|
+
* hung). Omit for no reporting (the default; e.g. tests).
|
|
95
|
+
* @returns The URLs of the pages that were reset to pending.
|
|
96
|
+
*/
|
|
97
|
+
export async function resetFailedPages(knex, onProgress) {
|
|
98
|
+
const candidates = await knex('content_items')
|
|
99
|
+
.join('url_refs', 'content_items.url_id', 'url_refs.id')
|
|
100
|
+
.leftJoin('page_meta', 'content_items.id', 'page_meta.page_id')
|
|
101
|
+
.select('content_items.id as id', 'url_refs.url as url', 'content_items.status as status', 'content_items.content_type_id as contentTypeId')
|
|
102
|
+
.where('content_items.scraped', 1)
|
|
103
|
+
.whereNull('content_items.redirect_dest_id')
|
|
104
|
+
.where((qb) => {
|
|
105
|
+
qb.where('content_items.is_skipped', 0).orWhereNull('content_items.is_skipped');
|
|
106
|
+
})
|
|
107
|
+
.where((qb) => {
|
|
108
|
+
qb.whereNull('content_items.status')
|
|
109
|
+
.orWhere('content_items.status', -1)
|
|
110
|
+
.orWhereNull('content_items.content_type_id')
|
|
111
|
+
.orWhereBetween('content_items.status', [500, 599])
|
|
112
|
+
.orWhereIn('page_meta.image_scan_desktop', RETRYABLE_IMAGE_SCAN_CODES)
|
|
113
|
+
.orWhereIn('page_meta.image_scan_mobile', RETRYABLE_IMAGE_SCAN_CODES);
|
|
114
|
+
});
|
|
115
|
+
if (candidates.length === 0) {
|
|
116
|
+
return [];
|
|
117
|
+
}
|
|
118
|
+
// Diagnostic only: how many candidates matched solely because of an
|
|
119
|
+
// image-scan outcome, not the pre-existing status-based conditions —
|
|
120
|
+
// i.e. a page whose HTTP status looks fine but whose mobile/desktop
|
|
121
|
+
// `<img>` scan was abandoned for a transient reason.
|
|
122
|
+
const imageScanOnlyCount = candidates.filter((row) => {
|
|
123
|
+
const statusQualifies = row.status === null ||
|
|
124
|
+
row.status === -1 ||
|
|
125
|
+
row.contentTypeId === null ||
|
|
126
|
+
(row.status >= 500 && row.status <= 599);
|
|
127
|
+
return !statusQualifies;
|
|
128
|
+
}).length;
|
|
129
|
+
if (imageScanOnlyCount > 0) {
|
|
130
|
+
dbLog('%d of %d retry candidate(s) matched via image-scan degradation only', imageScanOnlyCount, candidates.length);
|
|
131
|
+
}
|
|
132
|
+
const candidateIds = candidates.map((row) => row.id);
|
|
133
|
+
const candidateUrls = candidates.map((row) => row.url);
|
|
134
|
+
// Three unrelated reads (page_errors/crawl_errors, network_outages,
|
|
135
|
+
// dedupe_cap_events) with no data dependency between them — run
|
|
136
|
+
// concurrently instead of paying three sequential round-trips on every
|
|
137
|
+
// `--retry-failed` pass.
|
|
138
|
+
const [messages, outageWindows, cappedShapeKeys] = await Promise.all([
|
|
139
|
+
getFailedPageMessages(knex, candidateIds, candidateUrls),
|
|
140
|
+
listNetworkOutages(knex),
|
|
141
|
+
listDedupeCapShapeKeys(knex).then((shapeKeys) => new Set(shapeKeys)),
|
|
142
|
+
]);
|
|
143
|
+
// Drop candidates whose latest recorded message classifies as permanent —
|
|
144
|
+
// UNLESS that message's timestamp falls inside a recorded network outage,
|
|
145
|
+
// in which case the permanent-kind verdict is overridden (see the
|
|
146
|
+
// "Outage override" section of this function's docstring). An
|
|
147
|
+
// empty/absent message stays in the retry pool regardless — we keep
|
|
148
|
+
// retrying when we don't know it's permanent, erring on the side of
|
|
149
|
+
// investigation.
|
|
150
|
+
const retryable = candidates.filter((row) => {
|
|
151
|
+
const resolved = messages.get(row.id);
|
|
152
|
+
if (resolved === undefined || resolved.message === '') {
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
if (!PERMANENT_ERROR_KINDS.has(classifyErrorKind(resolved.message))) {
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
return isWithinOutageWindow(resolved.createdAt, outageWindows);
|
|
159
|
+
});
|
|
160
|
+
const excludedCount = candidates.length - retryable.length;
|
|
161
|
+
if (excludedCount > 0) {
|
|
162
|
+
dbLog('Excluded %d page(s) from retry — permanent failure kinds (dns/tls/client-blocked/parse-error/connection-refused)', excludedCount);
|
|
163
|
+
}
|
|
164
|
+
// Drop candidates whose URL shape already has a confirmed same-cluster
|
|
165
|
+
// trap recorded (see the "Confirmed same-cluster trap exclusion" section
|
|
166
|
+
// of this function's docstring). A row whose shape cannot be computed
|
|
167
|
+
// (`computeShapeKey` returns `null`) stays in the retry pool — no signal
|
|
168
|
+
// either way, so err on the side of retrying it.
|
|
169
|
+
const notCapped = cappedShapeKeys.size === 0
|
|
170
|
+
? retryable
|
|
171
|
+
: retryable.filter((row) => {
|
|
172
|
+
const shapeKey = computeShapeKey(row.url);
|
|
173
|
+
return shapeKey === null || !cappedShapeKeys.has(shapeKey);
|
|
174
|
+
});
|
|
175
|
+
const excludedCappedCount = retryable.length - notCapped.length;
|
|
176
|
+
if (excludedCappedCount > 0) {
|
|
177
|
+
dbLog('Excluded %d page(s) from retry — confirmed same-cluster trap shape', excludedCappedCount);
|
|
178
|
+
}
|
|
179
|
+
if (notCapped.length === 0) {
|
|
180
|
+
return [];
|
|
181
|
+
}
|
|
182
|
+
const ids = notCapped.map((row) => row.id);
|
|
183
|
+
const urls = notCapped.map((row) => row.url);
|
|
184
|
+
const chunkSize = 500;
|
|
185
|
+
for (let i = 0; i < ids.length; i += chunkSize) {
|
|
186
|
+
const chunk = ids.slice(i, i + chunkSize);
|
|
187
|
+
await knex('content_items').whereIn('id', chunk).update({
|
|
188
|
+
scraped: 0,
|
|
189
|
+
status: null,
|
|
190
|
+
status_text: null,
|
|
191
|
+
content_type_id: null,
|
|
192
|
+
content_length: null,
|
|
193
|
+
header_set_id: null,
|
|
194
|
+
// `first_crawled_at` / `last_crawled_at` are deliberately left
|
|
195
|
+
// untouched so the last-success timestamp records survive the
|
|
196
|
+
// demotion (the within-archive observation axis for #11/#17/#19).
|
|
197
|
+
});
|
|
198
|
+
// Clear the prior crawl's per-page data so the re-scrape starts clean,
|
|
199
|
+
// via the shared sweep (also used by `repromoteExternalPages` /
|
|
200
|
+
// `resetPagesByUrls`) plus `page_errors`, which that sweep
|
|
201
|
+
// deliberately excludes (see its JSDoc). `updatePage` only replaces
|
|
202
|
+
// anchor_edges/image_items/tags/jsonld when the new scrape is
|
|
203
|
+
// non-empty, so this pre-clear is load-bearing for pages that reset
|
|
204
|
+
// but then fail again (or are never reached), and it is the only
|
|
205
|
+
// place `resource_ref_edges` and `page_errors` are cleared for this
|
|
206
|
+
// operation. Deleting the `page_meta` row (rather than nulling every
|
|
207
|
+
// column) clears title / description / og:* / twitter:* /
|
|
208
|
+
// meta_extras in one statement; a re-scrape re-inserts it via
|
|
209
|
+
// `ON CONFLICT(page_id) DO UPDATE`.
|
|
210
|
+
await knex('page_errors').whereIn('pageId', chunk).delete();
|
|
211
|
+
await clearPageDerivedRows(knex, chunk);
|
|
212
|
+
onProgress?.(Math.min(i + chunkSize, ids.length), ids.length);
|
|
213
|
+
}
|
|
214
|
+
dbLog('Reset %d failed pages back to pending', urls.length);
|
|
215
|
+
return urls;
|
|
216
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { ResetPagesByUrlsResult } from '../../../types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Reset pages matching an operator-supplied URL list back to pending, so a
|
|
5
|
+
* follow-up crawl re-fetches them from scratch — the un-scrape half of
|
|
6
|
+
* `crawl --recrawl`.
|
|
7
|
+
*
|
|
8
|
+
* Unlike {@link resetFailedPages}, this function does not filter by prior
|
|
9
|
+
* failure kind: a URL named explicitly by the operator is reset regardless
|
|
10
|
+
* of what its last observation was, including a definitive `4xx`/`5xx` — the
|
|
11
|
+
* whole point of `--recrawl` is to catch a page that used to 404 and is now
|
|
12
|
+
* live. The only requirement on the raw candidate scan is `scraped = 1` (a
|
|
13
|
+
* page never scraped has nothing to reset; it is the caller's "novel URL"
|
|
14
|
+
* path instead).
|
|
15
|
+
*
|
|
16
|
+
* Three conservative guards then apply — matching content follows the same
|
|
17
|
+
* union used to skip `resetFailedPages`'s permanent-failure filter had none:
|
|
18
|
+
* a matched row is excluded (not reset) rather than silently promoted, and
|
|
19
|
+
* the exclusion is reported back to the caller by category:
|
|
20
|
+
*
|
|
21
|
+
* - **Redirect source** (`redirect_dest_id` is set): resetting it would
|
|
22
|
+
* discard a real, previously-observed 3xx. If the operator wants the
|
|
23
|
+
* redirect re-verified, that is `--retry-failed`'s job (which does NOT
|
|
24
|
+
* exclude redirect sources from a permanent-failure reset — a different
|
|
25
|
+
* operation with a different default).
|
|
26
|
+
* - **Intentionally skipped** (`is_skipped = 1`): the row was excluded by
|
|
27
|
+
* `excludes`/`excludeUrls` at ingestion or fetch time. `--recrawl` does not
|
|
28
|
+
* second-guess that configuration; re-running the crawl with a changed
|
|
29
|
+
* exclude list is the supported path to un-skip a page.
|
|
30
|
+
* - **External** (`is_external = 1`): bringing a scope-external URL back
|
|
31
|
+
* into scope is `--append`'s job (`repromoteExternalPages`), which also
|
|
32
|
+
* updates the scope map. `--recrawl` only re-fetches in-scope pages.
|
|
33
|
+
*
|
|
34
|
+
* Deliberately does NOT exclude candidates whose URL shape already has a
|
|
35
|
+
* confirmed same-cluster trap recorded (`dedupe_cap_events.shape_key`) — the
|
|
36
|
+
* exclusion {@link resetFailedPages} applies for exactly that reason (see its
|
|
37
|
+
* own JSDoc). The two functions differ on what "the operator asked for this"
|
|
38
|
+
* means: `resetFailedPages` widens an automatic, unattended SQL scan
|
|
39
|
+
* (`--retry-failed`), so a known trap is safe to silently skip re-admitting.
|
|
40
|
+
* `resetPagesByUrls` resets URLs the operator named one-by-one in a file —
|
|
41
|
+
* the same reasoning that already exempts explicit URLs from the
|
|
42
|
+
* failure-kind filter above applies here too: an operator who names a
|
|
43
|
+
* specific trap-shaped URL is not "re-discovering" it by accident, and
|
|
44
|
+
* silently refusing to reset a row they explicitly listed would be a more
|
|
45
|
+
* surprising failure mode than honouring the request.
|
|
46
|
+
*
|
|
47
|
+
* A URL that matches no `content_items` row at all (not yet known to the
|
|
48
|
+
* archive) is silently absent from every array on the result — the caller
|
|
49
|
+
* treats it as a novel URL, the same "not yet known" path `--inventory`
|
|
50
|
+
* takes. A URL matching a row with `scraped = 0` is likewise absent from
|
|
51
|
+
* every array: it is already pending, so there is nothing to reset.
|
|
52
|
+
*
|
|
53
|
+
* On a match, `content_items` is UPDATEd exactly like
|
|
54
|
+
* {@link resetFailedPages} (`scraped`/`status`/`status_text`/
|
|
55
|
+
* `content_type_id`/`content_length`/`header_set_id` cleared,
|
|
56
|
+
* `first_crawled_at`/`last_crawled_at` preserved), and every derived row is
|
|
57
|
+
* cleared via {@link clearPageDerivedRows} plus `page_errors` and
|
|
58
|
+
* the legacy `analysis_violations` table when an archive still carries it.
|
|
59
|
+
* Current archives no longer create that table, but an archive written by
|
|
60
|
+
* an earlier version keeps it (FK to `content_items(id)`). The reset only
|
|
61
|
+
* UPDATEs `content_items`, so no FK violation is reachable here; the stale
|
|
62
|
+
* violation rows of a re-fetched page are removed because they describe
|
|
63
|
+
* content that is about to be replaced. The delete is guarded by `hasTable`.
|
|
64
|
+
* `analysis_text_refs` is a content-hash dictionary shared across pages and
|
|
65
|
+
* is not touched; an orphaned entry is a harmless, unreferenced row, the
|
|
66
|
+
* same trade-off already made for `page_html_blobs`.
|
|
67
|
+
*
|
|
68
|
+
* SELECT and UPDATE/DELETE statements are chunked to stay below SQLite's
|
|
69
|
+
* `SQLITE_LIMIT_VARIABLE_NUMBER`.
|
|
70
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
71
|
+
* @param urls - URL strings to match against `content_items`, already in
|
|
72
|
+
* `withoutHashAndAuth` form (mirrors every other URL-list comparison in
|
|
73
|
+
* this package, e.g. `getExistingPageUrls`).
|
|
74
|
+
* @param onProgress - Called after each chunk's DELETE/UPDATE statements
|
|
75
|
+
* complete, with the pages processed so far and the total to reset. Omit
|
|
76
|
+
* for no reporting (the default; e.g. tests).
|
|
77
|
+
* @returns The reset URLs, plus the excluded URLs grouped by exclusion
|
|
78
|
+
* reason — see {@link ResetPagesByUrlsResult}.
|
|
79
|
+
*/
|
|
80
|
+
export declare function resetPagesByUrls(knex: Knex, urls: readonly string[], onProgress?: (processed: number, total: number) => void): Promise<ResetPagesByUrlsResult>;
|