@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,45 @@
|
|
|
1
|
+
import { extractTechnologiesForArchive } from '../../../meta/technologies/extract-technologies-for-archive.js';
|
|
2
|
+
import { eachSplitted } from '../../../utils/array/each-splitted.js';
|
|
3
|
+
/**
|
|
4
|
+
* Replaces the page's `technology_signals` + `page_technologies` rows with
|
|
5
|
+
* the freshly extracted set. Called inside `updatePage`'s transaction
|
|
6
|
+
* unconditionally — the `wappalyzer` signal source draws on `<script src>` /
|
|
7
|
+
* `<iframe src>` / window globals / response headers, not the HTML body, so
|
|
8
|
+
* external pages that skip rendering still contribute technology signals
|
|
9
|
+
* (structural signals naturally find nothing against an empty `html`
|
|
10
|
+
* string, which is exactly what a skipped render leaves it as).
|
|
11
|
+
*
|
|
12
|
+
* Direct replacement for `insertTags` in the live crawl write path (that
|
|
13
|
+
* file is untouched — `scripts/migrate-to-0.10.mjs` still depends on it).
|
|
14
|
+
*
|
|
15
|
+
* Same empty-guard as `insertTags` / `insertJsonLd`: an empty array does
|
|
16
|
+
* not wipe prior rows on a degraded re-scrape. Both tables are always
|
|
17
|
+
* written together in this one call — see ARCHITECTURE.md's invariant
|
|
18
|
+
* that `technology_signals` and `page_technologies` are never updated
|
|
19
|
+
* independently.
|
|
20
|
+
* @param pageId
|
|
21
|
+
* @param html - The page's raw HTML string (empty for external/metadata-only scrapes).
|
|
22
|
+
* @param meta
|
|
23
|
+
* @param trx
|
|
24
|
+
*/
|
|
25
|
+
export async function insertTechnologies(pageId, html, meta, trx) {
|
|
26
|
+
const { signals, technologies } = extractTechnologiesForArchive(html, meta);
|
|
27
|
+
if (signals.length === 0)
|
|
28
|
+
return;
|
|
29
|
+
await trx('technology_signals').where('pageId', pageId).delete();
|
|
30
|
+
await trx('page_technologies').where('pageId', pageId).delete();
|
|
31
|
+
await eachSplitted(signals, 100, async (chunk) => {
|
|
32
|
+
await trx('technology_signals').insert(chunk.map((s) => ({
|
|
33
|
+
pageId,
|
|
34
|
+
technology: s.technology,
|
|
35
|
+
signalType: s.signalType,
|
|
36
|
+
evidence: s.evidence,
|
|
37
|
+
weight: s.weight,
|
|
38
|
+
})));
|
|
39
|
+
});
|
|
40
|
+
if (technologies.length > 0) {
|
|
41
|
+
await eachSplitted(technologies, 100, async (chunk) => {
|
|
42
|
+
await trx('page_technologies').insert(chunk.map((t) => ({ pageId, ...t })));
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { MainContentsData } from '../../../utils/types/types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Replaces the page's `page_main_content_videos` rows with the freshly
|
|
5
|
+
* captured set. Called inside `updatePage`'s transaction, gated on
|
|
6
|
+
* `mainContents !== null`.
|
|
7
|
+
*
|
|
8
|
+
* Same empty-guard as `insertTags` / `insertJsonLd`: an empty array does not
|
|
9
|
+
* wipe prior rows on a degraded re-scrape.
|
|
10
|
+
* @param pageId - The owning `content_items.id`.
|
|
11
|
+
* @param mainContents - Beholder's per-page main-content metrics.
|
|
12
|
+
* @param trx - The active transaction.
|
|
13
|
+
*/
|
|
14
|
+
export declare function insertVideos(pageId: number, mainContents: MainContentsData, trx: Knex.Transaction): Promise<void>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { eachSplitted } from '../../../utils/array/each-splitted.js';
|
|
2
|
+
/**
|
|
3
|
+
* Replaces the page's `page_main_content_videos` rows with the freshly
|
|
4
|
+
* captured set. Called inside `updatePage`'s transaction, gated on
|
|
5
|
+
* `mainContents !== null`.
|
|
6
|
+
*
|
|
7
|
+
* Same empty-guard as `insertTags` / `insertJsonLd`: an empty array does not
|
|
8
|
+
* wipe prior rows on a degraded re-scrape.
|
|
9
|
+
* @param pageId - The owning `content_items.id`.
|
|
10
|
+
* @param mainContents - Beholder's per-page main-content metrics.
|
|
11
|
+
* @param trx - The active transaction.
|
|
12
|
+
*/
|
|
13
|
+
export async function insertVideos(pageId, mainContents, trx) {
|
|
14
|
+
if (mainContents.videos.length === 0)
|
|
15
|
+
return;
|
|
16
|
+
const rows = mainContents.videos.map((video, order) => ({
|
|
17
|
+
pageId,
|
|
18
|
+
order,
|
|
19
|
+
src: video.src,
|
|
20
|
+
poster: video.poster,
|
|
21
|
+
width: video.width,
|
|
22
|
+
height: video.height,
|
|
23
|
+
}));
|
|
24
|
+
await trx('page_main_content_videos').where('pageId', pageId).delete();
|
|
25
|
+
await eachSplitted(rows, 100, async (chunk) => {
|
|
26
|
+
await trx('page_main_content_videos').insert(chunk);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { PageSource } from '../../../types.js';
|
|
2
|
+
import type { WriteRefCaches } from '../../_shared/types.js';
|
|
3
|
+
import type { Knex } from 'knex';
|
|
4
|
+
/**
|
|
5
|
+
* Points each redirect-source URL at the destination page, marking it scraped
|
|
6
|
+
* and clearing any content it owned in a former life.
|
|
7
|
+
*
|
|
8
|
+
* Shared by `updatePage` (which also renders and stores the destination)
|
|
9
|
+
* and `recordRedirect` (which only records the edge for a destination
|
|
10
|
+
* rendered elsewhere). Self-redirects (source equal to the destination) are
|
|
11
|
+
* skipped so a page is never marked as redirecting to itself — that would
|
|
12
|
+
* exclude it from reports via the `whereNull('redirect_dest_id')` filter.
|
|
13
|
+
* @param trx - The active transaction. All SQL below is executed exclusively
|
|
14
|
+
* through this transaction; there is no separate `knex` fallback because
|
|
15
|
+
* the callers (`updatePage` / `recordRedirect`) always invoke this helper
|
|
16
|
+
* from within a transaction.
|
|
17
|
+
* @param caches - The connection's write-side id caches.
|
|
18
|
+
* @param sources - Redirect-source URLs (normalised): the original URL plus
|
|
19
|
+
* any intermediate hops. Empty when the page was not redirected.
|
|
20
|
+
* @param destId - `content_items.id` of the redirect destination page.
|
|
21
|
+
* @param destUrlNormalized - Normalised destination URL, used to detect and
|
|
22
|
+
* skip self-redirects.
|
|
23
|
+
* @param isExternal - Whether the sources are external to the crawl scope, as
|
|
24
|
+
* a single value applied to every hop in `sources` — the same
|
|
25
|
+
* requester-describes-a-different-row shape `insertPage` guards against
|
|
26
|
+
* (see its docs in `insert-page.ts`), since a hop can independently be a
|
|
27
|
+
* real, already-scraped internal page in its own right (reached earlier as
|
|
28
|
+
* a direct crawl target) before it is later observed as an intermediate hop
|
|
29
|
+
* in some other chain. The UPDATE below carries the same CASE guard.
|
|
30
|
+
* @param chainLineageSource - Lineage label propagated to each intermediate
|
|
31
|
+
* hop's row (passed through to {@link resolveContentItemId}). Derived by
|
|
32
|
+
* the caller from the **originating** page's source (`page.url`), not from
|
|
33
|
+
* the destination — intermediates are reached transitively from the
|
|
34
|
+
* originating render, so they inherit its lineage. Pass `'inventory-discovered'`
|
|
35
|
+
* for chains rooted at inventory-seed/discovered pages so new intermediates
|
|
36
|
+
* stay in the inventory chain; pass `'crawled'` for crawled chains so the
|
|
37
|
+
* crawled-wins downgrade inside `resolveContentItemId` fires on existing
|
|
38
|
+
* `'inventory-*'` intermediates a crawled chain reaches. Pass `undefined`
|
|
39
|
+
* to fall back to the DB DEFAULT (`'crawled'`) on INSERT without
|
|
40
|
+
* triggering the downgrade on existing rows.
|
|
41
|
+
*/
|
|
42
|
+
export declare function linkRedirectSources(trx: Knex.Transaction, caches: WriteRefCaches, sources: readonly string[], destId: number, destUrlNormalized: string, isExternal: boolean, chainLineageSource?: PageSource): Promise<void>;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { dbLog } from '../../../debug.js';
|
|
2
|
+
import { resolveContentItemId } from '../../_shared/resolve-content-item-id.js';
|
|
3
|
+
/**
|
|
4
|
+
* Points each redirect-source URL at the destination page, marking it scraped
|
|
5
|
+
* and clearing any content it owned in a former life.
|
|
6
|
+
*
|
|
7
|
+
* Shared by `updatePage` (which also renders and stores the destination)
|
|
8
|
+
* and `recordRedirect` (which only records the edge for a destination
|
|
9
|
+
* rendered elsewhere). Self-redirects (source equal to the destination) are
|
|
10
|
+
* skipped so a page is never marked as redirecting to itself — that would
|
|
11
|
+
* exclude it from reports via the `whereNull('redirect_dest_id')` filter.
|
|
12
|
+
* @param trx - The active transaction. All SQL below is executed exclusively
|
|
13
|
+
* through this transaction; there is no separate `knex` fallback because
|
|
14
|
+
* the callers (`updatePage` / `recordRedirect`) always invoke this helper
|
|
15
|
+
* from within a transaction.
|
|
16
|
+
* @param caches - The connection's write-side id caches.
|
|
17
|
+
* @param sources - Redirect-source URLs (normalised): the original URL plus
|
|
18
|
+
* any intermediate hops. Empty when the page was not redirected.
|
|
19
|
+
* @param destId - `content_items.id` of the redirect destination page.
|
|
20
|
+
* @param destUrlNormalized - Normalised destination URL, used to detect and
|
|
21
|
+
* skip self-redirects.
|
|
22
|
+
* @param isExternal - Whether the sources are external to the crawl scope, as
|
|
23
|
+
* a single value applied to every hop in `sources` — the same
|
|
24
|
+
* requester-describes-a-different-row shape `insertPage` guards against
|
|
25
|
+
* (see its docs in `insert-page.ts`), since a hop can independently be a
|
|
26
|
+
* real, already-scraped internal page in its own right (reached earlier as
|
|
27
|
+
* a direct crawl target) before it is later observed as an intermediate hop
|
|
28
|
+
* in some other chain. The UPDATE below carries the same CASE guard.
|
|
29
|
+
* @param chainLineageSource - Lineage label propagated to each intermediate
|
|
30
|
+
* hop's row (passed through to {@link resolveContentItemId}). Derived by
|
|
31
|
+
* the caller from the **originating** page's source (`page.url`), not from
|
|
32
|
+
* the destination — intermediates are reached transitively from the
|
|
33
|
+
* originating render, so they inherit its lineage. Pass `'inventory-discovered'`
|
|
34
|
+
* for chains rooted at inventory-seed/discovered pages so new intermediates
|
|
35
|
+
* stay in the inventory chain; pass `'crawled'` for crawled chains so the
|
|
36
|
+
* crawled-wins downgrade inside `resolveContentItemId` fires on existing
|
|
37
|
+
* `'inventory-*'` intermediates a crawled chain reaches. Pass `undefined`
|
|
38
|
+
* to fall back to the DB DEFAULT (`'crawled'`) on INSERT without
|
|
39
|
+
* triggering the downgrade on existing rows.
|
|
40
|
+
*/
|
|
41
|
+
export async function linkRedirectSources(trx, caches, sources, destId, destUrlNormalized, isExternal, chainLineageSource) {
|
|
42
|
+
for (const redirect of sources) {
|
|
43
|
+
if (redirect === destUrlNormalized) {
|
|
44
|
+
dbLog('Skip self-redirect: %s', redirect);
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
dbLog('Set redirected url: %s -> id:%d', redirect, destId);
|
|
48
|
+
// Pass `chainLineageSource` through so a brand-new intermediate
|
|
49
|
+
// hop INSERTed here inherits the originating page's lineage label
|
|
50
|
+
// (inventory-discovered when the originating chain is in the
|
|
51
|
+
// inventory chain, undefined otherwise). The crawled-wins
|
|
52
|
+
// downgrade inside `resolveContentItemId` still fires when this
|
|
53
|
+
// argument is `'crawled'`, matching the anchor-lineage propagation
|
|
54
|
+
// contract — an existing inventory-* intermediate that is later
|
|
55
|
+
// traversed by a `'crawled'` chain gets downgraded.
|
|
56
|
+
const redirectId = await resolveContentItemId(trx, caches, redirect, {
|
|
57
|
+
source: chainLineageSource,
|
|
58
|
+
});
|
|
59
|
+
await trx('content_items')
|
|
60
|
+
.where('id', redirectId)
|
|
61
|
+
.update({
|
|
62
|
+
scraped: 1,
|
|
63
|
+
redirect_dest_id: destId,
|
|
64
|
+
is_external: trx.raw('CASE WHEN scraped = 1 AND is_external = 0 THEN 0 ELSE ? END', [isExternal ? 1 : 0]),
|
|
65
|
+
});
|
|
66
|
+
// Conditional `301 Moved Permanently` stamp — applied ONLY when the
|
|
67
|
+
// row carries no definitive status yet (NULL or the `-1`
|
|
68
|
+
// hard-failure sentinel). HEAD pre-flight does not retain each
|
|
69
|
+
// hop's individual status code (`redirectPaths` is a URL[] without
|
|
70
|
+
// statuses), so the only honest answer for an unknown-status hop is
|
|
71
|
+
// "some 3xx" — 301 is the canonical representative.
|
|
72
|
+
//
|
|
73
|
+
// We deliberately do NOT overwrite an existing definitive status
|
|
74
|
+
// (200 / 302 / 307 / etc.): a row that already captured a concrete
|
|
75
|
+
// status from a prior direct scrape would lose accuracy. The stamp
|
|
76
|
+
// only flips two cases:
|
|
77
|
+
// - NULL: a placeholder row created by `resolveContentItemId`
|
|
78
|
+
// because the URL was reached only as a redirect target / source,
|
|
79
|
+
// never directly scraped. Without the stamp the row is invisible
|
|
80
|
+
// on the Errors view's status distribution.
|
|
81
|
+
// - -1: a row that recorded a hard scrape failure (e.g. a puppeteer
|
|
82
|
+
// goto returned null on a HTTPS→HTTP downgrade redirect) BEFORE
|
|
83
|
+
// the chain was understood. That `-1` then conflated "real
|
|
84
|
+
// failure" with "actually a redirect source we now know about",
|
|
85
|
+
// polluting the `-1` bucket AND inflating the `--retry-failed`
|
|
86
|
+
// target (via the `whereNull('redirect_dest_id')` filter — the
|
|
87
|
+
// redirect_dest_id update above already excludes the row from
|
|
88
|
+
// retry; this stamp restores the visible identity).
|
|
89
|
+
await trx('content_items')
|
|
90
|
+
.where('id', redirectId)
|
|
91
|
+
.where((qb) => qb.whereNull('status').orWhere('status', -1))
|
|
92
|
+
.update({ status: 301, status_text: 'Moved Permanently' });
|
|
93
|
+
// A page that used to be scraped as content can later turn into a
|
|
94
|
+
// redirect source. It owns no content anymore, so drop any anchors /
|
|
95
|
+
// images it captured in its former life — otherwise they linger and
|
|
96
|
+
// leak into referrer / incoming-link reads (which do not filter out
|
|
97
|
+
// redirect sources).
|
|
98
|
+
await trx('anchor_edges').where('page_id', redirectId).delete();
|
|
99
|
+
await trx('image_items').where('page_id', redirectId).delete();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { PageSource } from '../../../types.js';
|
|
2
|
+
import type { PageData } from '../../../utils/types/types.js';
|
|
3
|
+
import type { WriteRefCaches } from '../../_shared/types.js';
|
|
4
|
+
import type { Knex } from 'knex';
|
|
5
|
+
/**
|
|
6
|
+
* Records a redirect edge (source → destination) **without** re-storing the
|
|
7
|
+
* destination's content.
|
|
8
|
+
*
|
|
9
|
+
* The crawler renders a many-to-one redirect destination exactly once. For
|
|
10
|
+
* every subsequent source URL that redirects to that already-rendered
|
|
11
|
+
* destination, it calls this instead of {@link ./update-page.ts} (#73).
|
|
12
|
+
* Routing a content-less HEAD result through `updatePage` would funnel it
|
|
13
|
+
* into `insertPage` and overwrite the destination's good title / meta with
|
|
14
|
+
* empty values, so the dedicated edge-only path is required.
|
|
15
|
+
*
|
|
16
|
+
* The destination row is resolved (created on demand if a concurrent
|
|
17
|
+
* in-flight render has not committed it yet) so the edge always points at a
|
|
18
|
+
* valid id; the single render fills in the destination's content under that
|
|
19
|
+
* same id. The destination's existing anchors / images are never touched
|
|
20
|
+
* here.
|
|
21
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
22
|
+
* @param caches - The connection's write-side id caches.
|
|
23
|
+
* @param page - HEAD-resolved page data carrying the redirect chain. Its
|
|
24
|
+
* `anchorList` / `imageList` are ignored (a redirect source owns no content).
|
|
25
|
+
* @param source - Inventory provenance forwarded by the orchestrator
|
|
26
|
+
* (`Archive.setRedirect` → here) for the redirect-edge fast path. Used
|
|
27
|
+
* as the fallback when the originating URL's row does NOT yet exist in
|
|
28
|
+
* the archive (`#73` convergence on first sight, js-redirect rescue
|
|
29
|
+
* before any prior write). When the originating row already exists
|
|
30
|
+
* (e.g. anchor-lineage INSERT from a prior pass), its stored `source`
|
|
31
|
+
* takes precedence so transitive lineage is preserved across resume /
|
|
32
|
+
* retry-failed sessions. `undefined` keeps the DB DEFAULT `'crawled'`
|
|
33
|
+
* on a brand-new destination row.
|
|
34
|
+
*/
|
|
35
|
+
export declare function recordRedirect(knex: Knex, caches: WriteRefCaches, page: PageData, source?: PageSource): Promise<void>;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { tryParseUrl as parseUrl } from '@d-zero/shared/parse-url';
|
|
2
|
+
import { dbLog } from '../../../debug.js';
|
|
3
|
+
import { deriveLineageFromParent } from '../../../derive-lineage-from-parent.js';
|
|
4
|
+
import { resolveRedirectChain } from '../../../resolve-redirect-chain.js';
|
|
5
|
+
import { clearWriteRefCaches } from '../../_shared/clear-write-ref-caches.js';
|
|
6
|
+
import { resolveContentItemId } from '../../_shared/resolve-content-item-id.js';
|
|
7
|
+
import { linkRedirectSources } from './link-redirect-sources.js';
|
|
8
|
+
/**
|
|
9
|
+
* Records a redirect edge (source → destination) **without** re-storing the
|
|
10
|
+
* destination's content.
|
|
11
|
+
*
|
|
12
|
+
* The crawler renders a many-to-one redirect destination exactly once. For
|
|
13
|
+
* every subsequent source URL that redirects to that already-rendered
|
|
14
|
+
* destination, it calls this instead of {@link ./update-page.ts} (#73).
|
|
15
|
+
* Routing a content-less HEAD result through `updatePage` would funnel it
|
|
16
|
+
* into `insertPage` and overwrite the destination's good title / meta with
|
|
17
|
+
* empty values, so the dedicated edge-only path is required.
|
|
18
|
+
*
|
|
19
|
+
* The destination row is resolved (created on demand if a concurrent
|
|
20
|
+
* in-flight render has not committed it yet) so the edge always points at a
|
|
21
|
+
* valid id; the single render fills in the destination's content under that
|
|
22
|
+
* same id. The destination's existing anchors / images are never touched
|
|
23
|
+
* here.
|
|
24
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
25
|
+
* @param caches - The connection's write-side id caches.
|
|
26
|
+
* @param page - HEAD-resolved page data carrying the redirect chain. Its
|
|
27
|
+
* `anchorList` / `imageList` are ignored (a redirect source owns no content).
|
|
28
|
+
* @param source - Inventory provenance forwarded by the orchestrator
|
|
29
|
+
* (`Archive.setRedirect` → here) for the redirect-edge fast path. Used
|
|
30
|
+
* as the fallback when the originating URL's row does NOT yet exist in
|
|
31
|
+
* the archive (`#73` convergence on first sight, js-redirect rescue
|
|
32
|
+
* before any prior write). When the originating row already exists
|
|
33
|
+
* (e.g. anchor-lineage INSERT from a prior pass), its stored `source`
|
|
34
|
+
* takes precedence so transitive lineage is preserved across resume /
|
|
35
|
+
* retry-failed sessions. `undefined` keeps the DB DEFAULT `'crawled'`
|
|
36
|
+
* on a brand-new destination row.
|
|
37
|
+
*/
|
|
38
|
+
export async function recordRedirect(knex, caches, page, source) {
|
|
39
|
+
const { destUrl, sources } = resolveRedirectChain(page.url.withoutHashAndAuth, page.redirectPaths);
|
|
40
|
+
// No redirect chain (the URL is itself the already-rendered destination,
|
|
41
|
+
// reached both directly and via a redirect) → there is no edge to write.
|
|
42
|
+
// Returning here avoids opening a transaction and, crucially, avoids
|
|
43
|
+
// `resolveContentItemId` inserting a content-less placeholder row for a
|
|
44
|
+
// destination that may not have been written yet.
|
|
45
|
+
if (sources.length === 0) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const destUrlObject = parseUrl(destUrl);
|
|
49
|
+
if (!destUrlObject) {
|
|
50
|
+
// A malformed redirect target should not abort the whole crawl (this
|
|
51
|
+
// runs inside the WriteQueue, whose rejection aborts the run). Recording
|
|
52
|
+
// a single redirect edge is best-effort, so skip it and move on. Unlike
|
|
53
|
+
// `updatePage`, there is no page content at stake here.
|
|
54
|
+
dbLog('recordRedirect: skip malformed destination URL: %s', destUrl);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
await knex.transaction(async (trx) => {
|
|
59
|
+
// Pass the caller-supplied `source` straight through so a brand-new
|
|
60
|
+
// destination row INSERTed here picks up the inventory lineage
|
|
61
|
+
// (instead of the DB DEFAULT `'crawled'`) when the caller is in the
|
|
62
|
+
// inventory chain — without the pass-through, inventory lineage
|
|
63
|
+
// would be laundered to `'crawled'` for js-redirect rescue / #73
|
|
64
|
+
// convergence destinations that have not yet been rendered.
|
|
65
|
+
const destId = await resolveContentItemId(trx, caches, destUrlObject.withoutHashAndAuth, { source });
|
|
66
|
+
// Chain lineage propagates FROM the originating URL (`page.url`),
|
|
67
|
+
// NOT from the destination. The originating URL is what initiated
|
|
68
|
+
// the redirect chain, so its lineage is what every intermediate hop
|
|
69
|
+
// transitively inherits. Reading from the destination would
|
|
70
|
+
// mis-propagate in "inventory-seed → ... → existing crawled dest"
|
|
71
|
+
// chains: the intermediates are reached only via the inventory
|
|
72
|
+
// chain, so they belong to the inventory chain even though the
|
|
73
|
+
// chain happens to land on a crawled URL. The `'crawled'` fallback
|
|
74
|
+
// arms the crawled-wins downgrade for existing `'inventory-*'`
|
|
75
|
+
// intermediates that a crawled chain reaches.
|
|
76
|
+
const cachedOriginating = caches.contentItems.get(page.url.withoutHashAndAuth);
|
|
77
|
+
let originatingSource = cachedOriginating?.source;
|
|
78
|
+
if (originatingSource === undefined) {
|
|
79
|
+
const [originatingRow] = (await trx
|
|
80
|
+
.select('ci.source')
|
|
81
|
+
.from('content_items as ci')
|
|
82
|
+
.join('url_refs as ur', 'ur.id', 'ci.url_id')
|
|
83
|
+
.where('ur.url', page.url.withoutHashAndAuth));
|
|
84
|
+
originatingSource = originatingRow?.source ?? source;
|
|
85
|
+
}
|
|
86
|
+
const chainLineageSource = deriveLineageFromParent(originatingSource, 'crawled');
|
|
87
|
+
await linkRedirectSources(trx, caches, sources, destId, destUrlObject.withoutHashAndAuth, page.isExternal, chainLineageSource);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
// A rolled-back transaction can leave ids cached that no longer
|
|
92
|
+
// correspond to any row (AUTOINCREMENT never rewinds) — see
|
|
93
|
+
// `clearWriteRefCaches` for why a full clear, not a partial one, is
|
|
94
|
+
// required. `emitErrorAndRetry` may retry this whole call, so the
|
|
95
|
+
// cache must be clean before the next attempt (same guard as
|
|
96
|
+
// `updatePage`).
|
|
97
|
+
clearWriteRefCaches(caches);
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { WriteRefCaches } from '../../_shared/types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Marks a page as skipped in the database with the given reason.
|
|
5
|
+
* Creates the `content_items` row (with its `url_refs` entry) if it does
|
|
6
|
+
* not already exist.
|
|
7
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
8
|
+
* @param caches - The connection's write-side id caches.
|
|
9
|
+
* @param url - The URL of the skipped page.
|
|
10
|
+
* @param reason - The reason the page was skipped.
|
|
11
|
+
* @param isExternal - Whether the page is on an external domain. Defaults to `false`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function setSkippedPage(knex: Knex, caches: WriteRefCaches, url: string, reason: string, isExternal?: boolean): Promise<void>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { resolveContentItemId } from '../../_shared/resolve-content-item-id.js';
|
|
2
|
+
/**
|
|
3
|
+
* Marks a page as skipped in the database with the given reason.
|
|
4
|
+
* Creates the `content_items` row (with its `url_refs` entry) if it does
|
|
5
|
+
* not already exist.
|
|
6
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
7
|
+
* @param caches - The connection's write-side id caches.
|
|
8
|
+
* @param url - The URL of the skipped page.
|
|
9
|
+
* @param reason - The reason the page was skipped.
|
|
10
|
+
* @param isExternal - Whether the page is on an external domain. Defaults to `false`.
|
|
11
|
+
*/
|
|
12
|
+
export async function setSkippedPage(knex, caches, url, reason, isExternal = false) {
|
|
13
|
+
const pageId = await resolveContentItemId(knex, caches, url, {
|
|
14
|
+
isExternal: isExternal ? 1 : 0,
|
|
15
|
+
});
|
|
16
|
+
await knex('content_items')
|
|
17
|
+
.where('id', pageId)
|
|
18
|
+
.update({
|
|
19
|
+
scraped: 1,
|
|
20
|
+
is_external: isExternal ? 1 : 0,
|
|
21
|
+
is_skipped: 1,
|
|
22
|
+
skip_reason: reason,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { PageDataWithDomPaths, PageSource } from '../../../types.js';
|
|
2
|
+
import type { WriteRefCaches } from '../../_shared/types.js';
|
|
3
|
+
import type { Knex } from 'knex';
|
|
4
|
+
/**
|
|
5
|
+
* Inserts or updates a crawled page — `content_items` + `page_meta` plus its
|
|
6
|
+
* redirect chain, `anchor_edges`, `image_items`, and (when `writeHtml`) its
|
|
7
|
+
* compressed HTML snapshot BLOB.
|
|
8
|
+
*
|
|
9
|
+
* Self-redirects (where the source URL equals the destination URL after
|
|
10
|
+
* normalization) are skipped to avoid marking a page as redirected to itself
|
|
11
|
+
* — a situation caused by authentication challenges (e.g. Basic Auth 302)
|
|
12
|
+
* that would otherwise exclude the page from reports via the
|
|
13
|
+
* `whereNull('redirect_dest_id')` filter.
|
|
14
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
15
|
+
* @param caches - The connection's write-side id caches.
|
|
16
|
+
* @param page - The page data to store, optionally carrying the in-browser
|
|
17
|
+
* dom-path capture (see {@link PageDataWithDomPaths}).
|
|
18
|
+
* @param writeHtml - When `true`, this call is allowed to insert (or clear)
|
|
19
|
+
* the page's HTML blob. `setExternalPage` passes `false` because external
|
|
20
|
+
* metadata-only scrapes never carry HTML and must not perturb an already
|
|
21
|
+
* stored body.
|
|
22
|
+
* @param isTarget - Whether this page is a crawl target.
|
|
23
|
+
* @param source - Provenance label written ONLY when the row is freshly
|
|
24
|
+
* inserted. Existing rows keep their original `source` (this is why a
|
|
25
|
+
* second `crawl --inventory` does not "demote" an `'inventory-seed'` row
|
|
26
|
+
* that was discovered earlier).
|
|
27
|
+
* @param bodyHash - Precomputed body hash for the page's HTML (see
|
|
28
|
+
* `CrawlerEventTypes.page.bodyHash`). `undefined`/`null` falls back to
|
|
29
|
+
* computing it from the HTML instead.
|
|
30
|
+
* @param recursive - The crawl session's `recursive` option, forwarded to
|
|
31
|
+
* `replaceAnchorEdges` so it can compute each discovered anchor's
|
|
32
|
+
* `is_metadata_only` value the same way `processAnchors`
|
|
33
|
+
* (`handle-scrape-end.ts`) decides whether to queue it for a full or
|
|
34
|
+
* metadata-only scrape (#369). Defaults to `true` (the historical,
|
|
35
|
+
* pre-#369 behaviour: never persist an anchor as metadata-only) for
|
|
36
|
+
* callers that do not track the option, such as `setExternalPage`, whose
|
|
37
|
+
* anchor list is always empty anyway.
|
|
38
|
+
* @returns The database `pageId` (`content_items.id`) of the inserted or updated row.
|
|
39
|
+
*/
|
|
40
|
+
export declare function updatePage(knex: Knex, caches: WriteRefCaches, page: PageDataWithDomPaths, writeHtml: boolean, isTarget: boolean, source?: PageSource, bodyHash?: Buffer | null, recursive?: boolean): Promise<number>;
|