@nitpicker/archive 0.0.0 → 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.
- 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 +1056 -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 +804 -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 +47 -0
- package/lib/filesystem/parse-tar-size-field.d.ts +13 -0
- package/lib/filesystem/parse-tar-size-field.js +40 -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 +130 -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/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,12 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Close an outage row by stamping `ended_at` — but ONLY if it is still
|
|
4
|
+
* open. The `whereNull('ended_at')` guard is what makes this idempotent: a
|
|
5
|
+
* second call (e.g. a duplicate recovery-probe success racing the first)
|
|
6
|
+
* matches zero rows and is a silent no-op, rather than overwriting an
|
|
7
|
+
* already-recorded `ended_at` with a later timestamp.
|
|
8
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
9
|
+
* @param id - The `network_outages.id` to close.
|
|
10
|
+
* @param endedAt - Epoch ms the outage is considered to have ended.
|
|
11
|
+
*/
|
|
12
|
+
export declare function closeNetworkOutage(knex: Knex, id: number, endedAt: number): Promise<void>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Close an outage row by stamping `ended_at` — but ONLY if it is still
|
|
3
|
+
* open. The `whereNull('ended_at')` guard is what makes this idempotent: a
|
|
4
|
+
* second call (e.g. a duplicate recovery-probe success racing the first)
|
|
5
|
+
* matches zero rows and is a silent no-op, rather than overwriting an
|
|
6
|
+
* already-recorded `ended_at` with a later timestamp.
|
|
7
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
8
|
+
* @param id - The `network_outages.id` to close.
|
|
9
|
+
* @param endedAt - Epoch ms the outage is considered to have ended.
|
|
10
|
+
*/
|
|
11
|
+
export async function closeNetworkOutage(knex, id, endedAt) {
|
|
12
|
+
await knex('network_outages').where({ id }).whereNull('ended_at').update({
|
|
13
|
+
ended_at: endedAt,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Durably close every `network_outages` row still `ended_at = NULL` at the
|
|
4
|
+
* start of a writer session.
|
|
5
|
+
*
|
|
6
|
+
* A row is left open only when the crawl process was killed (Ctrl-C / OOM
|
|
7
|
+
* / SIGKILL) mid-outage, before a recovery probe could close it. Called
|
|
8
|
+
* once from `db-ops/lifecycle/init.ts` — right after `initSchema` (which
|
|
9
|
+
* guarantees the table exists) and before anything else touches
|
|
10
|
+
* `network_outages` — so that by the time `resetFailedPages` /
|
|
11
|
+
* `listDnsBurnedHostCandidates` / any other reader runs, no row can still
|
|
12
|
+
* be open from a PRIOR session. (A row opened by THIS session cannot exist
|
|
13
|
+
* yet at this point in the boot sequence — the sliding-window detector
|
|
14
|
+
* only starts once the crawl loop begins.)
|
|
15
|
+
*
|
|
16
|
+
* This complements, but does not replace, `list-network-outages.ts`'s
|
|
17
|
+
* on-the-fly clamp: that read-side resolution stays in place as a
|
|
18
|
+
* defensive fallback, but after this runs there should be nothing left for
|
|
19
|
+
* it to resolve.
|
|
20
|
+
*
|
|
21
|
+
* Idempotent: a row closed by a previous call (or by a normal
|
|
22
|
+
* recovery-probe success) is simply absent from the `whereNull('ended_at')`
|
|
23
|
+
* scan, so re-running this on every writer open is always safe.
|
|
24
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
25
|
+
*/
|
|
26
|
+
export declare function closeStaleOpenNetworkOutages(knex: Knex): Promise<void>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { closeNetworkOutage } from './close-network-outage.js';
|
|
2
|
+
import { computeOutageClampTimestamp } from './compute-outage-clamp-timestamp.js';
|
|
3
|
+
/**
|
|
4
|
+
* Durably close every `network_outages` row still `ended_at = NULL` at the
|
|
5
|
+
* start of a writer session.
|
|
6
|
+
*
|
|
7
|
+
* A row is left open only when the crawl process was killed (Ctrl-C / OOM
|
|
8
|
+
* / SIGKILL) mid-outage, before a recovery probe could close it. Called
|
|
9
|
+
* once from `db-ops/lifecycle/init.ts` — right after `initSchema` (which
|
|
10
|
+
* guarantees the table exists) and before anything else touches
|
|
11
|
+
* `network_outages` — so that by the time `resetFailedPages` /
|
|
12
|
+
* `listDnsBurnedHostCandidates` / any other reader runs, no row can still
|
|
13
|
+
* be open from a PRIOR session. (A row opened by THIS session cannot exist
|
|
14
|
+
* yet at this point in the boot sequence — the sliding-window detector
|
|
15
|
+
* only starts once the crawl loop begins.)
|
|
16
|
+
*
|
|
17
|
+
* This complements, but does not replace, `list-network-outages.ts`'s
|
|
18
|
+
* on-the-fly clamp: that read-side resolution stays in place as a
|
|
19
|
+
* defensive fallback, but after this runs there should be nothing left for
|
|
20
|
+
* it to resolve.
|
|
21
|
+
*
|
|
22
|
+
* Idempotent: a row closed by a previous call (or by a normal
|
|
23
|
+
* recovery-probe success) is simply absent from the `whereNull('ended_at')`
|
|
24
|
+
* scan, so re-running this on every writer open is always safe.
|
|
25
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
26
|
+
*/
|
|
27
|
+
export async function closeStaleOpenNetworkOutages(knex) {
|
|
28
|
+
const hasTable = await knex.schema.hasTable('network_outages');
|
|
29
|
+
if (!hasTable) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const openRows = (await knex('network_outages')
|
|
33
|
+
.whereNull('ended_at')
|
|
34
|
+
.select('id', 'started_at'));
|
|
35
|
+
if (openRows.length === 0) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const clamp = await computeOutageClampTimestamp(knex);
|
|
39
|
+
for (const row of openRows) {
|
|
40
|
+
await closeNetworkOutage(knex, row.id, Math.max(clamp, row.started_at));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Compute the timestamp used to resolve an outage row whose `ended_at` is
|
|
4
|
+
* still `NULL` (the crawl process was killed before a recovery probe could
|
|
5
|
+
* close it) into a concrete, bounded window.
|
|
6
|
+
*
|
|
7
|
+
* The archive's own most-recent observations — the latest `crawl_errors`
|
|
8
|
+
* timestamp and the latest `content_items.last_crawled_at` — are the only
|
|
9
|
+
* evidence available for "when did activity in this archive last happen",
|
|
10
|
+
* so the later of the two stands in for "the outage cannot have lasted
|
|
11
|
+
* past this point, because the archive shows activity here". Using the
|
|
12
|
+
* LARGER of the two (not just `crawl_errors`) matters because a session
|
|
13
|
+
* that crashed mid-outage may have its last successful page write be more
|
|
14
|
+
* recent than its last recorded error, or vice versa.
|
|
15
|
+
*
|
|
16
|
+
* Both source tables are guaranteed to exist by the time this runs — this
|
|
17
|
+
* helper is only ever called from writer-context code (see
|
|
18
|
+
* `list-network-outages.ts` / the boot-time stale-open finalizer), and
|
|
19
|
+
* `initSchema` creates both `crawl_errors` and `content_items` before any
|
|
20
|
+
* writer session's first query.
|
|
21
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
22
|
+
* @returns The larger of `MAX(crawl_errors.createdAt)` and
|
|
23
|
+
* `MAX(content_items.last_crawled_at)`, or `0` if the archive has neither
|
|
24
|
+
* (a brand-new archive with no activity yet).
|
|
25
|
+
*/
|
|
26
|
+
export declare function computeOutageClampTimestamp(knex: Knex): Promise<number>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compute the timestamp used to resolve an outage row whose `ended_at` is
|
|
3
|
+
* still `NULL` (the crawl process was killed before a recovery probe could
|
|
4
|
+
* close it) into a concrete, bounded window.
|
|
5
|
+
*
|
|
6
|
+
* The archive's own most-recent observations — the latest `crawl_errors`
|
|
7
|
+
* timestamp and the latest `content_items.last_crawled_at` — are the only
|
|
8
|
+
* evidence available for "when did activity in this archive last happen",
|
|
9
|
+
* so the later of the two stands in for "the outage cannot have lasted
|
|
10
|
+
* past this point, because the archive shows activity here". Using the
|
|
11
|
+
* LARGER of the two (not just `crawl_errors`) matters because a session
|
|
12
|
+
* that crashed mid-outage may have its last successful page write be more
|
|
13
|
+
* recent than its last recorded error, or vice versa.
|
|
14
|
+
*
|
|
15
|
+
* Both source tables are guaranteed to exist by the time this runs — this
|
|
16
|
+
* helper is only ever called from writer-context code (see
|
|
17
|
+
* `list-network-outages.ts` / the boot-time stale-open finalizer), and
|
|
18
|
+
* `initSchema` creates both `crawl_errors` and `content_items` before any
|
|
19
|
+
* writer session's first query.
|
|
20
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
21
|
+
* @returns The larger of `MAX(crawl_errors.createdAt)` and
|
|
22
|
+
* `MAX(content_items.last_crawled_at)`, or `0` if the archive has neither
|
|
23
|
+
* (a brand-new archive with no activity yet).
|
|
24
|
+
*/
|
|
25
|
+
export async function computeOutageClampTimestamp(knex) {
|
|
26
|
+
const [crawlErrorsRow] = (await knex('crawl_errors').max('createdAt as maxCreatedAt'));
|
|
27
|
+
const [contentItemsRow] = (await knex('content_items').max('last_crawled_at as maxLastCrawledAt'));
|
|
28
|
+
const latestError = crawlErrorsRow?.maxCreatedAt ?? 0;
|
|
29
|
+
const latestCrawl = contentItemsRow?.maxLastCrawledAt ?? 0;
|
|
30
|
+
return Math.max(latestError, latestCrawl);
|
|
31
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { InsertNetworkOutageParams } from '../../types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Appends one row to the `network_outages` journal, with `ended_at` left
|
|
5
|
+
* `NULL` — the row starts life as an open outage.
|
|
6
|
+
*
|
|
7
|
+
* Called the moment a recovery probe CONFIRMS a suspect outage (i.e. the
|
|
8
|
+
* probe itself failed, not merely the sliding-window threshold trip). See
|
|
9
|
+
* `close-network-outage.ts` for how the row is later closed.
|
|
10
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
11
|
+
* @param params - The confirmed-outage fields to record.
|
|
12
|
+
* @returns The autoincremented `id` of the newly-inserted row.
|
|
13
|
+
*/
|
|
14
|
+
export declare function insertNetworkOutage(knex: Knex, params: InsertNetworkOutageParams): Promise<number>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Appends one row to the `network_outages` journal, with `ended_at` left
|
|
3
|
+
* `NULL` — the row starts life as an open outage.
|
|
4
|
+
*
|
|
5
|
+
* Called the moment a recovery probe CONFIRMS a suspect outage (i.e. the
|
|
6
|
+
* probe itself failed, not merely the sliding-window threshold trip). See
|
|
7
|
+
* `close-network-outage.ts` for how the row is later closed.
|
|
8
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
9
|
+
* @param params - The confirmed-outage fields to record.
|
|
10
|
+
* @returns The autoincremented `id` of the newly-inserted row.
|
|
11
|
+
*/
|
|
12
|
+
export async function insertNetworkOutage(knex, params) {
|
|
13
|
+
const inserted = await knex
|
|
14
|
+
.from('network_outages')
|
|
15
|
+
.insert({
|
|
16
|
+
started_at: params.startedAt,
|
|
17
|
+
detected_at: params.detectedAt,
|
|
18
|
+
ended_at: null,
|
|
19
|
+
probe_host: params.probeHost,
|
|
20
|
+
trigger_error_count: params.triggerErrorCount,
|
|
21
|
+
trigger_host_count: params.triggerHostCount,
|
|
22
|
+
})
|
|
23
|
+
.returning('id');
|
|
24
|
+
const id = inserted[0]?.id;
|
|
25
|
+
if (typeof id !== 'number') {
|
|
26
|
+
throw new TypeError('insertNetworkOutage: INSERT returned no row id');
|
|
27
|
+
}
|
|
28
|
+
return id;
|
|
29
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { OutageWindow } from '../../is-within-outage-window.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* List every recorded outage as a resolved (closed) {@link OutageWindow},
|
|
5
|
+
* suitable for `isWithinOutageWindow`.
|
|
6
|
+
*
|
|
7
|
+
* This is the crawler-internal counterpart to `@nitpicker/query`'s richer
|
|
8
|
+
* `listNetworkOutages` (full row shape, for CLI/MCP display) — this one
|
|
9
|
+
* exists purely to feed the three write-path consumers
|
|
10
|
+
* (`resetFailedPages`, `listDnsBurnedHostCandidates`, the gate itself) that
|
|
11
|
+
* only need "was this timestamp inside an outage", never the row's other
|
|
12
|
+
* columns.
|
|
13
|
+
*
|
|
14
|
+
* Any row whose `ended_at` is still `NULL` (the crawl process was killed
|
|
15
|
+
* before recovery) is resolved on the fly via
|
|
16
|
+
* {@link computeOutageClampTimestamp} rather than ever being returned as an
|
|
17
|
+
* unbounded window — see `is-within-outage-window.ts`'s `OutageWindow`
|
|
18
|
+
* docstring for why an open-ended window would be a correctness bug (every
|
|
19
|
+
* later error would retroactively read as network-caused, forever). This
|
|
20
|
+
* on-the-fly resolution does NOT persist to the row — it is a defensive
|
|
21
|
+
* fallback independent of whichever boot-time finalizer durably closes
|
|
22
|
+
* stale-open rows.
|
|
23
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
24
|
+
* @returns Resolved outage windows. Empty when the archive predates the
|
|
25
|
+
* `network_outages` table (self-healed on next writer open, so this is
|
|
26
|
+
* never a permanent state) or has recorded no outages.
|
|
27
|
+
*/
|
|
28
|
+
export declare function listNetworkOutages(knex: Knex): Promise<OutageWindow[]>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { computeOutageClampTimestamp } from './compute-outage-clamp-timestamp.js';
|
|
2
|
+
/**
|
|
3
|
+
* List every recorded outage as a resolved (closed) {@link OutageWindow},
|
|
4
|
+
* suitable for `isWithinOutageWindow`.
|
|
5
|
+
*
|
|
6
|
+
* This is the crawler-internal counterpart to `@nitpicker/query`'s richer
|
|
7
|
+
* `listNetworkOutages` (full row shape, for CLI/MCP display) — this one
|
|
8
|
+
* exists purely to feed the three write-path consumers
|
|
9
|
+
* (`resetFailedPages`, `listDnsBurnedHostCandidates`, the gate itself) that
|
|
10
|
+
* only need "was this timestamp inside an outage", never the row's other
|
|
11
|
+
* columns.
|
|
12
|
+
*
|
|
13
|
+
* Any row whose `ended_at` is still `NULL` (the crawl process was killed
|
|
14
|
+
* before recovery) is resolved on the fly via
|
|
15
|
+
* {@link computeOutageClampTimestamp} rather than ever being returned as an
|
|
16
|
+
* unbounded window — see `is-within-outage-window.ts`'s `OutageWindow`
|
|
17
|
+
* docstring for why an open-ended window would be a correctness bug (every
|
|
18
|
+
* later error would retroactively read as network-caused, forever). This
|
|
19
|
+
* on-the-fly resolution does NOT persist to the row — it is a defensive
|
|
20
|
+
* fallback independent of whichever boot-time finalizer durably closes
|
|
21
|
+
* stale-open rows.
|
|
22
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
23
|
+
* @returns Resolved outage windows. Empty when the archive predates the
|
|
24
|
+
* `network_outages` table (self-healed on next writer open, so this is
|
|
25
|
+
* never a permanent state) or has recorded no outages.
|
|
26
|
+
*/
|
|
27
|
+
export async function listNetworkOutages(knex) {
|
|
28
|
+
const hasTable = await knex.schema.hasTable('network_outages');
|
|
29
|
+
if (!hasTable) {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
const rows = (await knex('network_outages').select('started_at', 'ended_at'));
|
|
33
|
+
if (rows.length === 0) {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
const hasOpenRow = rows.some((row) => row.ended_at === null);
|
|
37
|
+
const clamp = hasOpenRow ? await computeOutageClampTimestamp(knex) : 0;
|
|
38
|
+
return rows.map((row) => ({
|
|
39
|
+
startedAt: row.started_at,
|
|
40
|
+
endedAt: row.ended_at ?? Math.max(clamp, row.started_at),
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Assigns natural URL sort order values (`content_items.crawl_order`) to
|
|
4
|
+
* all internal pages. Pages are sorted using {@link pathComparator} and
|
|
5
|
+
* assigned sequential order numbers.
|
|
6
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
7
|
+
* @param onProgress - Called after each chunk's UPDATE completes, with
|
|
8
|
+
* pages ordered so far and the total (issue #294: a large archive's page
|
|
9
|
+
* count can make this a multi-second-to-minutes pass — a single SELECT
|
|
10
|
+
* plus a JS sort followed by chunked UPDATEs — with no other signal it
|
|
11
|
+
* hasn't hung). Omit for no reporting (the default; e.g. tests).
|
|
12
|
+
*/
|
|
13
|
+
export declare function setUrlOrder(knex: Knex, onProgress?: (processed: number, total: number) => void): Promise<void>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { pathComparator } from '@d-zero/shared/sort/path';
|
|
2
|
+
import { dbLog } from '../../../debug.js';
|
|
3
|
+
/**
|
|
4
|
+
* Assigns natural URL sort order values (`content_items.crawl_order`) to
|
|
5
|
+
* all internal pages. Pages are sorted using {@link pathComparator} and
|
|
6
|
+
* assigned sequential order numbers.
|
|
7
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
8
|
+
* @param onProgress - Called after each chunk's UPDATE completes, with
|
|
9
|
+
* pages ordered so far and the total (issue #294: a large archive's page
|
|
10
|
+
* count can make this a multi-second-to-minutes pass — a single SELECT
|
|
11
|
+
* plus a JS sort followed by chunked UPDATEs — with no other signal it
|
|
12
|
+
* hasn't hung). Omit for no reporting (the default; e.g. tests).
|
|
13
|
+
*/
|
|
14
|
+
export async function setUrlOrder(knex, onProgress) {
|
|
15
|
+
dbLog('Set URL Order');
|
|
16
|
+
const res = (await knex
|
|
17
|
+
.select('ci.id', 'ur.url')
|
|
18
|
+
.from('content_items as ci')
|
|
19
|
+
.join('url_refs as ur', 'ur.id', 'ci.url_id')
|
|
20
|
+
.where('ci.is_external', '=', 0));
|
|
21
|
+
const sorted = res.toSorted((a, b) => pathComparator(a.url, b.url));
|
|
22
|
+
// Batch update using chunked CASE statements to avoid N+1 queries
|
|
23
|
+
const BATCH_SIZE = 500;
|
|
24
|
+
for (let i = 0; i < sorted.length; i += BATCH_SIZE) {
|
|
25
|
+
const batch = sorted.slice(i, i + BATCH_SIZE);
|
|
26
|
+
const ids = batch.map((row) => row.id);
|
|
27
|
+
const bindings = [];
|
|
28
|
+
const cases = batch
|
|
29
|
+
.map((row, j) => {
|
|
30
|
+
bindings.push(row.id, i + j + 1);
|
|
31
|
+
return 'WHEN ? THEN ?';
|
|
32
|
+
})
|
|
33
|
+
.join(' ');
|
|
34
|
+
const placeholders = ids.map(() => '?').join(',');
|
|
35
|
+
await knex.raw(`UPDATE content_items SET crawl_order = CASE id ${cases} END WHERE id IN (${placeholders})`, [...bindings, ...ids]);
|
|
36
|
+
onProgress?.(Math.min(i + BATCH_SIZE, sorted.length), sorted.length);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Builds a `content_items` query joined against `page_meta` and every ref
|
|
4
|
+
* table needed to reconstruct a flat, legacy-shaped page row. Selected
|
|
5
|
+
* columns are aliased to the `DB_Page` field names; `responseHeaders` and
|
|
6
|
+
* `meta_extras` are NOT reconstructed here (they need a second, batched
|
|
7
|
+
* pass — see {@link ../read/reconstruct-page-rows.js}) so this query stays
|
|
8
|
+
* a single-pass join with no N+1 subqueries. `headerSetId` and the
|
|
9
|
+
* `extras_body` / `extras_codec` pair are selected as intermediates for
|
|
10
|
+
* that second pass.
|
|
11
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
12
|
+
* @returns A query builder pre-configured with every join `get-pages.ts` /
|
|
13
|
+
* `get-pages-with-rels.ts` need; callers add `.where()` / `.limit()` /
|
|
14
|
+
* `.offset()` on top.
|
|
15
|
+
* @example
|
|
16
|
+
* const rows = await buildPageQuery(knex).where('ci.is_target', 1);
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildPageQuery(knex: Knex): Knex.QueryBuilder;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds a `content_items` query joined against `page_meta` and every ref
|
|
3
|
+
* table needed to reconstruct a flat, legacy-shaped page row. Selected
|
|
4
|
+
* columns are aliased to the `DB_Page` field names; `responseHeaders` and
|
|
5
|
+
* `meta_extras` are NOT reconstructed here (they need a second, batched
|
|
6
|
+
* pass — see {@link ../read/reconstruct-page-rows.js}) so this query stays
|
|
7
|
+
* a single-pass join with no N+1 subqueries. `headerSetId` and the
|
|
8
|
+
* `extras_body` / `extras_codec` pair are selected as intermediates for
|
|
9
|
+
* that second pass.
|
|
10
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
11
|
+
* @returns A query builder pre-configured with every join `get-pages.ts` /
|
|
12
|
+
* `get-pages-with-rels.ts` need; callers add `.where()` / `.limit()` /
|
|
13
|
+
* `.offset()` on top.
|
|
14
|
+
* @example
|
|
15
|
+
* const rows = await buildPageQuery(knex).where('ci.is_target', 1);
|
|
16
|
+
*/
|
|
17
|
+
export function buildPageQuery(knex) {
|
|
18
|
+
return knex('content_items as ci')
|
|
19
|
+
.join('url_refs as ur', 'ur.id', 'ci.url_id')
|
|
20
|
+
.leftJoin('content_type_refs as ctr', 'ctr.id', 'ci.content_type_id')
|
|
21
|
+
.leftJoin('page_meta as pm', 'pm.page_id', 'ci.id')
|
|
22
|
+
.leftJoin('text_refs as title_ref', 'title_ref.id', 'pm.title_text_id')
|
|
23
|
+
.leftJoin('text_refs as description_ref', 'description_ref.id', 'pm.description_text_id')
|
|
24
|
+
.leftJoin('text_refs as keywords_ref', 'keywords_ref.id', 'pm.keywords_text_id')
|
|
25
|
+
.leftJoin('text_refs as robots_raw_ref', 'robots_raw_ref.id', 'pm.robots_raw_text_id')
|
|
26
|
+
.leftJoin('text_refs as og_title_ref', 'og_title_ref.id', 'pm.og_title_text_id')
|
|
27
|
+
.leftJoin('text_refs as og_description_ref', 'og_description_ref.id', 'pm.og_description_text_id')
|
|
28
|
+
.leftJoin('text_refs as twitter_title_ref', 'twitter_title_ref.id', 'pm.twitter_title_text_id')
|
|
29
|
+
.leftJoin('text_refs as twitter_description_ref', 'twitter_description_ref.id', 'pm.twitter_description_text_id')
|
|
30
|
+
.leftJoin('url_refs as canonical_ur', 'canonical_ur.id', 'pm.canonical_url_id')
|
|
31
|
+
.leftJoin('url_refs as amphtml_ur', 'amphtml_ur.id', 'pm.amphtml_url_id')
|
|
32
|
+
.leftJoin('url_refs as manifest_ur', 'manifest_ur.id', 'pm.manifest_url_id')
|
|
33
|
+
.leftJoin('url_refs as icon_ur', 'icon_ur.id', 'pm.icon_url_id')
|
|
34
|
+
.leftJoin('url_refs as apple_ur', 'apple_ur.id', 'pm.apple_touch_icon_url_id')
|
|
35
|
+
.leftJoin('url_refs as og_url_ur', 'og_url_ur.id', 'pm.og_url_id')
|
|
36
|
+
.leftJoin('url_refs as og_image_ur', 'og_image_ur.id', 'pm.og_image_url_id')
|
|
37
|
+
.leftJoin('url_refs as twitter_image_ur', 'twitter_image_ur.id', 'pm.twitter_image_url_id')
|
|
38
|
+
.leftJoin('json_refs as extras_ref', 'extras_ref.id', 'pm.meta_extras_json_id')
|
|
39
|
+
.select('ci.id as id', 'ur.url as url', 'ci.redirect_dest_id as redirectDestId', 'ci.scraped as scraped', 'ci.is_target as isTarget', 'ci.is_external as isExternal', 'ci.status as status', 'ci.status_text as statusText', 'ctr.raw as contentType', 'ci.content_length as contentLength', 'ci.header_set_id as headerSetId', 'pm.lang as lang', 'pm.dir as dir', 'pm.charset as charset', 'pm.base_href as baseHref', 'pm.viewport_raw as viewport_raw', 'pm.theme_color as themeColor', 'pm.application_name as applicationName', 'pm.author as author', 'pm.generator as generator', 'pm.publisher as publisher', 'title_ref.text as title', 'description_ref.text as description', 'keywords_ref.text as keywords', 'robots_raw_ref.text as robots_raw', 'pm.robots_noindex as robots_noindex', 'pm.robots_nofollow as robots_nofollow', 'pm.robots_noarchive as robots_noarchive', 'pm.robots_noimageindex as robots_noimageindex', 'pm.googlebot as googlebot', 'canonical_ur.url as canonical', 'amphtml_ur.url as amphtml', 'manifest_ur.url as manifest', 'icon_ur.url as icon_href', 'apple_ur.url as appleTouchIcon_href', 'pm.og_type as og_type', 'og_title_ref.text as og_title', 'og_url_ur.url as og_url', 'pm.og_site_name as og_site_name', 'og_description_ref.text as og_description', 'og_image_ur.url as og_image', 'pm.og_image_alt as og_image_alt', 'pm.og_image_width as og_image_width', 'pm.og_image_height as og_image_height', 'pm.og_locale as og_locale', 'pm.og_article_published_time as og_article_published_time', 'pm.og_article_modified_time as og_article_modified_time', 'pm.twitter_card as twitter_card', 'pm.twitter_site as twitter_site', 'pm.twitter_creator as twitter_creator', 'twitter_title_ref.text as twitter_title', 'twitter_description_ref.text as twitter_description', 'twitter_image_ur.url as twitter_image', 'pm.fb_app_id as fb_app_id', 'pm.verification_google as verification_google', 'pm.format_detection_telephone as formatDetection_telephone', 'ci.first_crawled_at as firstCrawledAt', 'ci.last_crawled_at as lastCrawledAt', 'pm.tag_count as tag_count', 'pm.jsonld_count as jsonld_count', 'pm.tags_providers_csv as tags_providers_csv', 'pm.main_content_node_name as main_content_node_name', 'pm.main_content_id as main_content_id', 'pm.main_content_role as main_content_role', 'pm.main_content_selector as main_content_selector', 'pm.main_content_class_list as main_content_class_list', 'pm.main_content_word_count as main_content_word_count', 'pm.main_content_body_word_count as main_content_body_word_count', 'pm.main_content_heading_count as main_content_heading_count', 'pm.main_content_image_count as main_content_image_count', 'pm.main_content_table_count as main_content_table_count', 'pm.main_content_button_count as main_content_button_count', 'pm.main_content_iframe_count as main_content_iframe_count', 'pm.main_content_video_count as main_content_video_count', 'pm.main_content_audio_count as main_content_audio_count', 'pm.main_content_canvas_count as main_content_canvas_count', 'pm.main_content_custom_element_count as main_content_custom_element_count', 'pm.scroll_height_desktop as scroll_height_desktop', 'pm.scroll_height_mobile as scroll_height_mobile', 'pm.image_scan_desktop as image_scan_desktop', 'pm.image_scan_mobile as image_scan_mobile', 'extras_ref.json_text as extras_body', 'extras_ref.codec as extras_codec', 'ci.is_skipped as isSkipped', 'ci.skip_reason as skipReason', 'ci.crawl_order as order', 'ci.source as source');
|
|
40
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Retrieves the current crawling state by listing scraped and pending URLs.
|
|
4
|
+
*
|
|
5
|
+
* `scraped` is straightforward: every page row whose `scraped` flag is `1`
|
|
6
|
+
* — that is, every URL the crawl reached a terminal state on, including
|
|
7
|
+
* setSkippedPage / setExternalPage / outright setPage success or failure.
|
|
8
|
+
*
|
|
9
|
+
* `pending` is intentionally STRICT — not "every `scraped = 0` row".
|
|
10
|
+
* Four filters apply:
|
|
11
|
+
*
|
|
12
|
+
* 1. `scraped = 0` — work still incomplete.
|
|
13
|
+
* 2. `is_external = 0` — only in-scope work. External URLs go through a
|
|
14
|
+
* HEAD-only path that always lands on `scraped = 1` (either setPage or
|
|
15
|
+
* setExternalPage). A row with `is_external = 1 AND scraped = 0` is
|
|
16
|
+
* therefore a data anomaly, and resume / inventory / append have no
|
|
17
|
+
* business retrying it on the next session.
|
|
18
|
+
* 3. `EXISTS (anchor_edges with href_page_id = content_items.id) OR source
|
|
19
|
+
* != 'crawled'` — the row was either discovered as an anchor destination
|
|
20
|
+
* during a previous scrape OR was explicitly tagged with a non-default
|
|
21
|
+
* source label (`'inventory-seed'`, `'inventory-discovered'`, …). Both
|
|
22
|
+
* halves of the OR represent "deliberately enqueued, expected to be
|
|
23
|
+
* processed", which is exactly what `resume` should pick up.
|
|
24
|
+
*
|
|
25
|
+
* The orphan filter targets the **predicted-discard leak** in
|
|
26
|
+
* `@nitpicker/crawler`'s `crawler/crawler.ts` where `shouldDiscardPredicted` returns true but no
|
|
27
|
+
* `emit('skip')` follows. Such placeholders are inserted with the
|
|
28
|
+
* DB DEFAULT `source = 'crawled'` (no caller explicitly labels
|
|
29
|
+
* them) AND have no anchor referrer (predicted URLs are
|
|
30
|
+
* synthesised from pagination patterns, never anchored from a
|
|
31
|
+
* rendered page) — both halves of the OR are therefore false and
|
|
32
|
+
* the leak is excluded.
|
|
33
|
+
*
|
|
34
|
+
* The `source != 'crawled'` clause specifically saves the
|
|
35
|
+
* `--inventory` × `--retry-failed` interaction: an inventory-seed
|
|
36
|
+
* URL came from the operator's URL list (no anchor referrer) and
|
|
37
|
+
* `resetFailedPages` puts it back at `scraped = 0`. Without this
|
|
38
|
+
* clause those legitimate retries would be dropped on resume.
|
|
39
|
+
* 4. **Confirmed same-cluster trap exclusion** (issue #350): a row whose
|
|
40
|
+
* URL shape (`computeShapeKey`) matches a `dedupe_cap_events.shape_key`
|
|
41
|
+
* already recorded in this archive is dropped, UNLESS its `source` is
|
|
42
|
+
* `'inventory-seed'` (an operator-listed URL, not an anchor-discovered
|
|
43
|
+
* one — the same "explicit URL survives cap" carve-out `resetPagesByUrls`
|
|
44
|
+
* gives `--recrawl`). NOT the same as `resetFailedPages`'s own
|
|
45
|
+
* same-shape exclusion, which drops a matching candidate regardless of
|
|
46
|
+
* `source` — a `scraped=1, status=-1` inventory-seed row of a
|
|
47
|
+
* confirmed-capped shape is therefore excluded there too and never
|
|
48
|
+
* resets to `scraped=0` for `--retry-failed` to pick back up. That
|
|
49
|
+
* asymmetry pre-dates this filter and is unrelated to it (out of scope
|
|
50
|
+
* here): this filter only decides what `getCrawlingState` reports as
|
|
51
|
+
* `pending`, never whether a `scraped=1` row gets reset in the first
|
|
52
|
+
* place.
|
|
53
|
+
*
|
|
54
|
+
* Why this is needed: `--dedupe-cap`'s enqueue gate (`@nitpicker/crawler`'s `crawler/crawler.ts`
|
|
55
|
+
* `addUrl` closure) only stops a capped shape's anchor from being
|
|
56
|
+
* ADDED TO THE QUEUE in memory — it does not stop `replaceAnchorEdges`
|
|
57
|
+
* (`update-page.ts`) from writing a `scraped = 0` row for that same
|
|
58
|
+
* anchor (post-hoc marking, `content_items.dedupe_cap_event_id`,
|
|
59
|
+
* deliberately needs that row to exist). Before this filter, such a
|
|
60
|
+
* row still satisfied filter 3 (it has an anchor referrer) and entered
|
|
61
|
+
* `pending`, so `CrawlerOrchestrator#crawlUntilPendingClears`'s
|
|
62
|
+
* auto-retry loop (and any `--resume`/`--retry-failed`/`--append`) would
|
|
63
|
+
* requeue it — `Crawler#resume`'s `LinkList#resume` has no cap gate of
|
|
64
|
+
* its own — actually fetch the trap page, and its anchors would create
|
|
65
|
+
* a fresh batch of same-shape `scraped = 0` rows. Pending never shrank,
|
|
66
|
+
* so the loop ended in `PendingUrlsRemainError('no-progress')` even
|
|
67
|
+
* though nothing was actually wrong with the target site.
|
|
68
|
+
*
|
|
69
|
+
* Why not skip the row instead of merely omitting it from `pending`:
|
|
70
|
+
* this function is read-only — leaving `is_skipped`/`skip_reason`
|
|
71
|
+
* unset keeps `dedupe_cap_event_id` backfill (`viewer-build`) as the
|
|
72
|
+
* single place that judges a row "capped", matching the archive's
|
|
73
|
+
* existing dedupe-cap post-hoc-marking pattern rather than adding a
|
|
74
|
+
* second one here.
|
|
75
|
+
*
|
|
76
|
+
* A row whose shape cannot be computed (`computeShapeKey` returns
|
|
77
|
+
* `null`) stays in `pending` — no signal either way, same
|
|
78
|
+
* err-on-the-side-of-retrying choice `resetFailedPages` makes.
|
|
79
|
+
*
|
|
80
|
+
* The defensive shape is on purpose: the data source can drift into
|
|
81
|
+
* anomalous states under interruption, but the reader must never throw
|
|
82
|
+
* or feed garbage back into the dealer. A real in-scope URL that was
|
|
83
|
+
* truly interrupted mid-crawl will always have at least one anchor
|
|
84
|
+
* referrer (otherwise the dealer would not have queued it), so the
|
|
85
|
+
* strict filter loses no legitimate pending work.
|
|
86
|
+
*
|
|
87
|
+
* Seeds passed directly to `Crawler.start()` are NOT in the strict
|
|
88
|
+
* pending set when they were never picked by the dealer — they have no
|
|
89
|
+
* DB row at all in that case (`linkList.add` is purely in-memory until
|
|
90
|
+
* `setPage` runs). A Ctrl-C between dealer pick and `setPage` likewise
|
|
91
|
+
* leaves no row to recover. Recovery of un-picked seeds is the
|
|
92
|
+
* responsibility of the caller (e.g. re-running `--inventory ./list.txt`
|
|
93
|
+
* with the same URL list).
|
|
94
|
+
*
|
|
95
|
+
* The query uses an explicit `ci` alias on the `content_items` table so the
|
|
96
|
+
* correlated `EXISTS` subquery can join via `whereRaw('anchor_edges.href_page_id
|
|
97
|
+
* = ci.id')`. A future refactor that renames the alias must update both
|
|
98
|
+
* sites — the raw string in the subquery cannot be grep-resolved
|
|
99
|
+
* automatically. Read-only / stub viewer connections never call this
|
|
100
|
+
* method (they do not need to know about pending state), so the EXISTS
|
|
101
|
+
* shape is safe to use without the `migrate*` guards that other writer
|
|
102
|
+
* methods carry.
|
|
103
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
104
|
+
* @returns An object with `scraped` (completed URLs), `pending` (the
|
|
105
|
+
* strict set of in-scope, anchor-referenced, unfinished, non-capped
|
|
106
|
+
* URLs), and `pendingMetadataOnly` (the subset of `pending` whose
|
|
107
|
+
* `content_items.is_metadata_only` was persisted as `1` — see
|
|
108
|
+
* `replaceAnchorEdges`/`resolveContentItemId`). Callers that resume a
|
|
109
|
+
* crawl (`Crawler#resume` → `LinkList#resume`) pass this subset through
|
|
110
|
+
* so a metadata-only anchor discovered before an interruption is not
|
|
111
|
+
* silently promoted to a full-scrape target on resume (#369).
|
|
112
|
+
*/
|
|
113
|
+
export declare function getCrawlingState(knex: Knex): Promise<{
|
|
114
|
+
scraped: string[];
|
|
115
|
+
pending: string[];
|
|
116
|
+
pendingMetadataOnly: string[];
|
|
117
|
+
}>;
|