@nitpicker/archive 0.0.0-stage → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +105 -2
- 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 +360 -5
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { dbLog } from '../../../debug.js';
|
|
2
|
+
import { eachSplitted } from '../../../utils/array/each-splitted.js';
|
|
3
|
+
import { clearPageDerivedRows } from './clear-page-derived-rows.js';
|
|
4
|
+
/**
|
|
5
|
+
* Reset pages matching an operator-supplied URL list back to pending, so a
|
|
6
|
+
* follow-up crawl re-fetches them from scratch — the un-scrape half of
|
|
7
|
+
* `crawl --recrawl`.
|
|
8
|
+
*
|
|
9
|
+
* Unlike {@link resetFailedPages}, this function does not filter by prior
|
|
10
|
+
* failure kind: a URL named explicitly by the operator is reset regardless
|
|
11
|
+
* of what its last observation was, including a definitive `4xx`/`5xx` — the
|
|
12
|
+
* whole point of `--recrawl` is to catch a page that used to 404 and is now
|
|
13
|
+
* live. The only requirement on the raw candidate scan is `scraped = 1` (a
|
|
14
|
+
* page never scraped has nothing to reset; it is the caller's "novel URL"
|
|
15
|
+
* path instead).
|
|
16
|
+
*
|
|
17
|
+
* Three conservative guards then apply — matching content follows the same
|
|
18
|
+
* union used to skip `resetFailedPages`'s permanent-failure filter had none:
|
|
19
|
+
* a matched row is excluded (not reset) rather than silently promoted, and
|
|
20
|
+
* the exclusion is reported back to the caller by category:
|
|
21
|
+
*
|
|
22
|
+
* - **Redirect source** (`redirect_dest_id` is set): resetting it would
|
|
23
|
+
* discard a real, previously-observed 3xx. If the operator wants the
|
|
24
|
+
* redirect re-verified, that is `--retry-failed`'s job (which does NOT
|
|
25
|
+
* exclude redirect sources from a permanent-failure reset — a different
|
|
26
|
+
* operation with a different default).
|
|
27
|
+
* - **Intentionally skipped** (`is_skipped = 1`): the row was excluded by
|
|
28
|
+
* `excludes`/`excludeUrls` at ingestion or fetch time. `--recrawl` does not
|
|
29
|
+
* second-guess that configuration; re-running the crawl with a changed
|
|
30
|
+
* exclude list is the supported path to un-skip a page.
|
|
31
|
+
* - **External** (`is_external = 1`): bringing a scope-external URL back
|
|
32
|
+
* into scope is `--append`'s job (`repromoteExternalPages`), which also
|
|
33
|
+
* updates the scope map. `--recrawl` only re-fetches in-scope pages.
|
|
34
|
+
*
|
|
35
|
+
* Deliberately does NOT exclude candidates whose URL shape already has a
|
|
36
|
+
* confirmed same-cluster trap recorded (`dedupe_cap_events.shape_key`) — the
|
|
37
|
+
* exclusion {@link resetFailedPages} applies for exactly that reason (see its
|
|
38
|
+
* own JSDoc). The two functions differ on what "the operator asked for this"
|
|
39
|
+
* means: `resetFailedPages` widens an automatic, unattended SQL scan
|
|
40
|
+
* (`--retry-failed`), so a known trap is safe to silently skip re-admitting.
|
|
41
|
+
* `resetPagesByUrls` resets URLs the operator named one-by-one in a file —
|
|
42
|
+
* the same reasoning that already exempts explicit URLs from the
|
|
43
|
+
* failure-kind filter above applies here too: an operator who names a
|
|
44
|
+
* specific trap-shaped URL is not "re-discovering" it by accident, and
|
|
45
|
+
* silently refusing to reset a row they explicitly listed would be a more
|
|
46
|
+
* surprising failure mode than honouring the request.
|
|
47
|
+
*
|
|
48
|
+
* A URL that matches no `content_items` row at all (not yet known to the
|
|
49
|
+
* archive) is silently absent from every array on the result — the caller
|
|
50
|
+
* treats it as a novel URL, the same "not yet known" path `--inventory`
|
|
51
|
+
* takes. A URL matching a row with `scraped = 0` is likewise absent from
|
|
52
|
+
* every array: it is already pending, so there is nothing to reset.
|
|
53
|
+
*
|
|
54
|
+
* On a match, `content_items` is UPDATEd exactly like
|
|
55
|
+
* {@link resetFailedPages} (`scraped`/`status`/`status_text`/
|
|
56
|
+
* `content_type_id`/`content_length`/`header_set_id` cleared,
|
|
57
|
+
* `first_crawled_at`/`last_crawled_at` preserved), and every derived row is
|
|
58
|
+
* cleared via {@link clearPageDerivedRows} plus `page_errors` and
|
|
59
|
+
* the legacy `analysis_violations` table when an archive still carries it.
|
|
60
|
+
* Current archives no longer create that table, but an archive written by
|
|
61
|
+
* an earlier version keeps it (FK to `content_items(id)`). The reset only
|
|
62
|
+
* UPDATEs `content_items`, so no FK violation is reachable here; the stale
|
|
63
|
+
* violation rows of a re-fetched page are removed because they describe
|
|
64
|
+
* content that is about to be replaced. The delete is guarded by `hasTable`.
|
|
65
|
+
* `analysis_text_refs` is a content-hash dictionary shared across pages and
|
|
66
|
+
* is not touched; an orphaned entry is a harmless, unreferenced row, the
|
|
67
|
+
* same trade-off already made for `page_html_blobs`.
|
|
68
|
+
*
|
|
69
|
+
* SELECT and UPDATE/DELETE statements are chunked to stay below SQLite's
|
|
70
|
+
* `SQLITE_LIMIT_VARIABLE_NUMBER`.
|
|
71
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
72
|
+
* @param urls - URL strings to match against `content_items`, already in
|
|
73
|
+
* `withoutHashAndAuth` form (mirrors every other URL-list comparison in
|
|
74
|
+
* this package, e.g. `getExistingPageUrls`).
|
|
75
|
+
* @param onProgress - Called after each chunk's DELETE/UPDATE statements
|
|
76
|
+
* complete, with the pages processed so far and the total to reset. Omit
|
|
77
|
+
* for no reporting (the default; e.g. tests).
|
|
78
|
+
* @returns The reset URLs, plus the excluded URLs grouped by exclusion
|
|
79
|
+
* reason — see {@link ResetPagesByUrlsResult}.
|
|
80
|
+
*/
|
|
81
|
+
export async function resetPagesByUrls(knex, urls, onProgress) {
|
|
82
|
+
const empty = {
|
|
83
|
+
resetUrls: [],
|
|
84
|
+
excludedRedirects: [],
|
|
85
|
+
excludedSkipped: [],
|
|
86
|
+
excludedExternal: [],
|
|
87
|
+
};
|
|
88
|
+
if (urls.length === 0) {
|
|
89
|
+
return empty;
|
|
90
|
+
}
|
|
91
|
+
const candidates = [];
|
|
92
|
+
await eachSplitted([...urls], 500, async (chunk) => {
|
|
93
|
+
const rows = await knex('content_items')
|
|
94
|
+
.join('url_refs', 'url_refs.id', 'content_items.url_id')
|
|
95
|
+
.select('content_items.id as id', 'url_refs.url as url', 'content_items.redirect_dest_id as redirect_dest_id', 'content_items.is_skipped as is_skipped', 'content_items.is_external as is_external')
|
|
96
|
+
.where('content_items.scraped', 1)
|
|
97
|
+
.whereIn('url_refs.url', chunk);
|
|
98
|
+
candidates.push(...rows);
|
|
99
|
+
});
|
|
100
|
+
if (candidates.length === 0) {
|
|
101
|
+
return empty;
|
|
102
|
+
}
|
|
103
|
+
const resettable = [];
|
|
104
|
+
const excludedRedirects = [];
|
|
105
|
+
const excludedSkipped = [];
|
|
106
|
+
const excludedExternal = [];
|
|
107
|
+
for (const row of candidates) {
|
|
108
|
+
if (row.redirect_dest_id != null) {
|
|
109
|
+
excludedRedirects.push(row.url);
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (row.is_skipped) {
|
|
113
|
+
excludedSkipped.push(row.url);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (row.is_external) {
|
|
117
|
+
excludedExternal.push(row.url);
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
resettable.push(row);
|
|
121
|
+
}
|
|
122
|
+
if (resettable.length === 0) {
|
|
123
|
+
return { resetUrls: [], excludedRedirects, excludedSkipped, excludedExternal };
|
|
124
|
+
}
|
|
125
|
+
const ids = resettable.map((row) => row.id);
|
|
126
|
+
const resetUrls = resettable.map((row) => row.url);
|
|
127
|
+
const hasLegacyViolations = await knex.schema.hasTable('analysis_violations');
|
|
128
|
+
const chunkSize = 500;
|
|
129
|
+
for (let i = 0; i < ids.length; i += chunkSize) {
|
|
130
|
+
const chunk = ids.slice(i, i + chunkSize);
|
|
131
|
+
await knex('content_items').whereIn('id', chunk).update({
|
|
132
|
+
scraped: 0,
|
|
133
|
+
status: null,
|
|
134
|
+
status_text: null,
|
|
135
|
+
content_type_id: null,
|
|
136
|
+
content_length: null,
|
|
137
|
+
header_set_id: null,
|
|
138
|
+
// `first_crawled_at` / `last_crawled_at` are deliberately left
|
|
139
|
+
// untouched, matching `resetFailedPages` — the last-success
|
|
140
|
+
// timestamp records survive the demotion.
|
|
141
|
+
});
|
|
142
|
+
await knex('page_errors').whereIn('pageId', chunk).delete();
|
|
143
|
+
if (hasLegacyViolations) {
|
|
144
|
+
await knex('analysis_violations').whereIn('page_id', chunk).delete();
|
|
145
|
+
}
|
|
146
|
+
await clearPageDerivedRows(knex, chunk);
|
|
147
|
+
onProgress?.(Math.min(i + chunkSize, ids.length), ids.length);
|
|
148
|
+
}
|
|
149
|
+
dbLog('Reset %d page(s) matched by URL list back to pending', resetUrls.length);
|
|
150
|
+
return { resetUrls, excludedRedirects, excludedSkipped, excludedExternal };
|
|
151
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `page_meta.image_scan_desktop` / `image_scan_mobile` codes that qualify a
|
|
3
|
+
* page for `--retry-failed`, mirroring `@d-zero/beholder`'s `IMAGE_SCAN_CODE`
|
|
4
|
+
* (kept as a plain numeric literal list here rather than importing that
|
|
5
|
+
* constant, since the archive's `page_meta` columns persist across
|
|
6
|
+
* a `@d-zero/beholder` version bump and must keep meaning the same numbers
|
|
7
|
+
* even if a future crawler build pins an older beholder).
|
|
8
|
+
*
|
|
9
|
+
* - `2` (`nav-unsettled`) and `3` (`frame-lost`) are transient failures the
|
|
10
|
+
* scan itself could not recover from — a retry is likely to succeed.
|
|
11
|
+
* - `255` (`unknown`) is retried too, erring on the side of investigation,
|
|
12
|
+
* consistent with {@link import('../../../error-kind/classify-error-kind.js').classifyErrorKind}'s
|
|
13
|
+
* "unknown" kind never being treated as permanent.
|
|
14
|
+
*
|
|
15
|
+
* Deliberately excluded:
|
|
16
|
+
* - `0` (`ok`) and `1` (`degraded`) — the scan produced data.
|
|
17
|
+
* - `4` (`scroll-height-exceeded`) — a deterministic, page-shape-driven
|
|
18
|
+
* outcome that a retry cannot change.
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* qb.whereIn('page_meta.image_scan_desktop', RETRYABLE_IMAGE_SCAN_CODES);
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare const RETRYABLE_IMAGE_SCAN_CODES: readonly [2, 3, 255];
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `page_meta.image_scan_desktop` / `image_scan_mobile` codes that qualify a
|
|
3
|
+
* page for `--retry-failed`, mirroring `@d-zero/beholder`'s `IMAGE_SCAN_CODE`
|
|
4
|
+
* (kept as a plain numeric literal list here rather than importing that
|
|
5
|
+
* constant, since the archive's `page_meta` columns persist across
|
|
6
|
+
* a `@d-zero/beholder` version bump and must keep meaning the same numbers
|
|
7
|
+
* even if a future crawler build pins an older beholder).
|
|
8
|
+
*
|
|
9
|
+
* - `2` (`nav-unsettled`) and `3` (`frame-lost`) are transient failures the
|
|
10
|
+
* scan itself could not recover from — a retry is likely to succeed.
|
|
11
|
+
* - `255` (`unknown`) is retried too, erring on the side of investigation,
|
|
12
|
+
* consistent with {@link import('../../../error-kind/classify-error-kind.js').classifyErrorKind}'s
|
|
13
|
+
* "unknown" kind never being treated as permanent.
|
|
14
|
+
*
|
|
15
|
+
* Deliberately excluded:
|
|
16
|
+
* - `0` (`ok`) and `1` (`degraded`) — the scan produced data.
|
|
17
|
+
* - `4` (`scroll-height-exceeded`) — a deterministic, page-shape-driven
|
|
18
|
+
* outcome that a retry cannot change.
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* qb.whereIn('page_meta.image_scan_desktop', RETRYABLE_IMAGE_SCAN_CODES);
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export const RETRYABLE_IMAGE_SCAN_CODES = [2, 3, 255];
|
|
@@ -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_audios` 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 insertAudios(pageId: number, mainContents: MainContentsData, trx: Knex.Transaction): Promise<void>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { eachSplitted } from '../../../utils/array/each-splitted.js';
|
|
2
|
+
/**
|
|
3
|
+
* Replaces the page's `page_main_content_audios` 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 insertAudios(pageId, mainContents, trx) {
|
|
14
|
+
if (mainContents.audios.length === 0)
|
|
15
|
+
return;
|
|
16
|
+
const rows = mainContents.audios.map((audio, order) => ({
|
|
17
|
+
pageId,
|
|
18
|
+
order,
|
|
19
|
+
src: audio.src,
|
|
20
|
+
}));
|
|
21
|
+
await trx('page_main_content_audios').where('pageId', pageId).delete();
|
|
22
|
+
await eachSplitted(rows, 100, async (chunk) => {
|
|
23
|
+
await trx('page_main_content_audios').insert(chunk);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
@@ -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_buttons` 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 insertButtons(pageId: number, mainContents: MainContentsData, trx: Knex.Transaction): Promise<void>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { eachSplitted } from '../../../utils/array/each-splitted.js';
|
|
2
|
+
/**
|
|
3
|
+
* Replaces the page's `page_main_content_buttons` 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 insertButtons(pageId, mainContents, trx) {
|
|
14
|
+
if (mainContents.buttons.length === 0)
|
|
15
|
+
return;
|
|
16
|
+
const rows = mainContents.buttons.map((button, order) => ({
|
|
17
|
+
pageId,
|
|
18
|
+
order,
|
|
19
|
+
nodeName: button.nodeName,
|
|
20
|
+
role: button.role,
|
|
21
|
+
type: button.type,
|
|
22
|
+
text: button.text,
|
|
23
|
+
disabled: button.disabled,
|
|
24
|
+
}));
|
|
25
|
+
await trx('page_main_content_buttons').where('pageId', pageId).delete();
|
|
26
|
+
await eachSplitted(rows, 100, async (chunk) => {
|
|
27
|
+
await trx('page_main_content_buttons').insert(chunk);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
@@ -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_canvases` 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 insertCanvases(pageId: number, mainContents: MainContentsData, trx: Knex.Transaction): Promise<void>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { eachSplitted } from '../../../utils/array/each-splitted.js';
|
|
2
|
+
/**
|
|
3
|
+
* Replaces the page's `page_main_content_canvases` 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 insertCanvases(pageId, mainContents, trx) {
|
|
14
|
+
if (mainContents.canvases.length === 0)
|
|
15
|
+
return;
|
|
16
|
+
const rows = mainContents.canvases.map((canvas, order) => ({
|
|
17
|
+
pageId,
|
|
18
|
+
order,
|
|
19
|
+
width: canvas.width,
|
|
20
|
+
height: canvas.height,
|
|
21
|
+
}));
|
|
22
|
+
await trx('page_main_content_canvases').where('pageId', pageId).delete();
|
|
23
|
+
await eachSplitted(rows, 100, async (chunk) => {
|
|
24
|
+
await trx('page_main_content_canvases').insert(chunk);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { MainContentCustomElementCandidate } from '../../../types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Replaces the page's `page_main_content_custom_elements` rows with the
|
|
5
|
+
* freshly captured set. Called inside `updatePage`'s transaction, gated on
|
|
6
|
+
* `page.mainContentCustomElements !== undefined` by the caller — the caller
|
|
7
|
+
* must NOT call this with a defaulted `[]` when the capture itself failed
|
|
8
|
+
* (`undefined`), since this function cannot tell "capture found nothing"
|
|
9
|
+
* apart from "capture didn't run" once it receives a plain array.
|
|
10
|
+
*
|
|
11
|
+
* Unlike `insertButtons` / `insertHeadings` etc. (whose empty-array case is
|
|
12
|
+
* genuinely ambiguous — beholder's `MainContentsData` gives no way to tell
|
|
13
|
+
* "successfully found zero" from "degraded scrape" — this function always
|
|
14
|
+
* deletes existing rows once called, including for an empty array: because
|
|
15
|
+
* the caller already resolved that ambiguity via the `!== undefined` gate,
|
|
16
|
+
* an empty array here unambiguously means "capture succeeded, found none,"
|
|
17
|
+
* so stale rows from a previous crawl must be cleared.
|
|
18
|
+
*
|
|
19
|
+
* Unlike `insertButtons`, the input is nitpicker's own
|
|
20
|
+
* `MainContentCustomElementCandidate[]` (from `capture-custom-elements.ts`),
|
|
21
|
+
* not a slice of beholder's `MainContentsData` — there is no such category
|
|
22
|
+
* in `MainContentsData`.
|
|
23
|
+
* @param pageId - The owning `content_items.id`.
|
|
24
|
+
* @param customElements - The captured custom elements, in document order.
|
|
25
|
+
* @param trx - The active transaction.
|
|
26
|
+
*/
|
|
27
|
+
export declare function insertCustomElements(pageId: number, customElements: readonly MainContentCustomElementCandidate[], trx: Knex.Transaction): Promise<void>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { eachSplitted } from '../../../utils/array/each-splitted.js';
|
|
2
|
+
/**
|
|
3
|
+
* Replaces the page's `page_main_content_custom_elements` rows with the
|
|
4
|
+
* freshly captured set. Called inside `updatePage`'s transaction, gated on
|
|
5
|
+
* `page.mainContentCustomElements !== undefined` by the caller — the caller
|
|
6
|
+
* must NOT call this with a defaulted `[]` when the capture itself failed
|
|
7
|
+
* (`undefined`), since this function cannot tell "capture found nothing"
|
|
8
|
+
* apart from "capture didn't run" once it receives a plain array.
|
|
9
|
+
*
|
|
10
|
+
* Unlike `insertButtons` / `insertHeadings` etc. (whose empty-array case is
|
|
11
|
+
* genuinely ambiguous — beholder's `MainContentsData` gives no way to tell
|
|
12
|
+
* "successfully found zero" from "degraded scrape" — this function always
|
|
13
|
+
* deletes existing rows once called, including for an empty array: because
|
|
14
|
+
* the caller already resolved that ambiguity via the `!== undefined` gate,
|
|
15
|
+
* an empty array here unambiguously means "capture succeeded, found none,"
|
|
16
|
+
* so stale rows from a previous crawl must be cleared.
|
|
17
|
+
*
|
|
18
|
+
* Unlike `insertButtons`, the input is nitpicker's own
|
|
19
|
+
* `MainContentCustomElementCandidate[]` (from `capture-custom-elements.ts`),
|
|
20
|
+
* not a slice of beholder's `MainContentsData` — there is no such category
|
|
21
|
+
* in `MainContentsData`.
|
|
22
|
+
* @param pageId - The owning `content_items.id`.
|
|
23
|
+
* @param customElements - The captured custom elements, in document order.
|
|
24
|
+
* @param trx - The active transaction.
|
|
25
|
+
*/
|
|
26
|
+
export async function insertCustomElements(pageId, customElements, trx) {
|
|
27
|
+
await trx('page_main_content_custom_elements').where('pageId', pageId).delete();
|
|
28
|
+
if (customElements.length === 0)
|
|
29
|
+
return;
|
|
30
|
+
const rows = customElements.map((el, order) => ({
|
|
31
|
+
pageId,
|
|
32
|
+
order,
|
|
33
|
+
nodeName: el.nodeName,
|
|
34
|
+
elementId: el.elementId,
|
|
35
|
+
classList: JSON.stringify(el.classList),
|
|
36
|
+
}));
|
|
37
|
+
await eachSplitted(rows, 100, async (chunk) => {
|
|
38
|
+
await trx('page_main_content_custom_elements').insert(chunk);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { MainContentsData } from '../../../utils/types/types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Replaces the page's `page_main_content_headings` rows with the freshly
|
|
5
|
+
* captured set. Called inside `updatePage`'s transaction, gated on
|
|
6
|
+
* `mainContents !== null` (non-HTML / external / metadata-only scrapes have
|
|
7
|
+
* no main-content data to write).
|
|
8
|
+
*
|
|
9
|
+
* Same empty-guard as `insertTags` / `insertJsonLd`: an empty array does not
|
|
10
|
+
* wipe prior rows on a degraded re-scrape.
|
|
11
|
+
* @param pageId - The owning `content_items.id`.
|
|
12
|
+
* @param mainContents - Beholder's per-page main-content metrics.
|
|
13
|
+
* @param trx - The active transaction.
|
|
14
|
+
*/
|
|
15
|
+
export declare function insertHeadings(pageId: number, mainContents: MainContentsData, trx: Knex.Transaction): Promise<void>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { eachSplitted } from '../../../utils/array/each-splitted.js';
|
|
2
|
+
/**
|
|
3
|
+
* Replaces the page's `page_main_content_headings` rows with the freshly
|
|
4
|
+
* captured set. Called inside `updatePage`'s transaction, gated on
|
|
5
|
+
* `mainContents !== null` (non-HTML / external / metadata-only scrapes have
|
|
6
|
+
* no main-content data to write).
|
|
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 async function insertHeadings(pageId, mainContents, trx) {
|
|
15
|
+
if (mainContents.headings.length === 0)
|
|
16
|
+
return;
|
|
17
|
+
const rows = mainContents.headings.map((heading, order) => ({
|
|
18
|
+
pageId,
|
|
19
|
+
order,
|
|
20
|
+
text: heading.text,
|
|
21
|
+
level: heading.level,
|
|
22
|
+
}));
|
|
23
|
+
await trx('page_main_content_headings').where('pageId', pageId).delete();
|
|
24
|
+
await eachSplitted(rows, 100, async (chunk) => {
|
|
25
|
+
await trx('page_main_content_headings').insert(chunk);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
@@ -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_iframes` 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 insertIframes(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_iframes` 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 insertIframes(pageId, mainContents, trx) {
|
|
14
|
+
if (mainContents.iframes.length === 0)
|
|
15
|
+
return;
|
|
16
|
+
const rows = mainContents.iframes.map((iframe, order) => ({
|
|
17
|
+
pageId,
|
|
18
|
+
order,
|
|
19
|
+
src: iframe.src,
|
|
20
|
+
title: iframe.title,
|
|
21
|
+
width: iframe.width,
|
|
22
|
+
height: iframe.height,
|
|
23
|
+
}));
|
|
24
|
+
await trx('page_main_content_iframes').where('pageId', pageId).delete();
|
|
25
|
+
await eachSplitted(rows, 100, async (chunk) => {
|
|
26
|
+
await trx('page_main_content_iframes').insert(chunk);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { WriteRefCaches } from '../../_shared/types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Parameters for {@link insertInventoryContentItems}.
|
|
5
|
+
*/
|
|
6
|
+
export interface InsertInventoryContentItemsParams {
|
|
7
|
+
/** Knex query builder connected to the archive DB. */
|
|
8
|
+
readonly knex: Knex;
|
|
9
|
+
/** The connection's write-side id caches. */
|
|
10
|
+
readonly caches: WriteRefCaches;
|
|
11
|
+
/** URL strings already in `withoutHashAndAuth` form. */
|
|
12
|
+
readonly urls: readonly string[];
|
|
13
|
+
/** `content_items` column values shared by every inserted row (everything except `url_id`). */
|
|
14
|
+
readonly row: Readonly<Record<string, number | string>>;
|
|
15
|
+
/** Calling op's name, used to prefix the unresolved-url_ref error message. */
|
|
16
|
+
readonly opName: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Shared body of the inventory `content_items` bulk-insert ops
|
|
20
|
+
* (`insertInventorySeeds` / `insertInventorySkippedPages`): chunked
|
|
21
|
+
* `url_refs` upsert → id resolution → `content_items` insert-ignore →
|
|
22
|
+
* write-cache population. The two callers differ only in the row
|
|
23
|
+
* constants they stamp on every row, so the invariant-heavy plumbing
|
|
24
|
+
* lives here exactly once:
|
|
25
|
+
*
|
|
26
|
+
* - Chunked into 500-URL batches so SQLite's bound-parameter limit
|
|
27
|
+
* (`SQLITE_MAX_VARIABLE_NUMBER`) cannot be hit even on a
|
|
28
|
+
* tens-of-thousands inventory list.
|
|
29
|
+
* - Both inserts are `ON CONFLICT ... IGNORE`, so existing rows — in
|
|
30
|
+
* particular previously crawled pages — are never overwritten
|
|
31
|
+
* (crawled-wins), and within-list duplicates collapse to one row.
|
|
32
|
+
* - The `urlIds` / `contentItems` write caches are populated from what
|
|
33
|
+
* the DB actually holds after the insert (not from the attempted row
|
|
34
|
+
* values), keeping later cache-hits consistent with conflict-ignored
|
|
35
|
+
* rows.
|
|
36
|
+
* @param params - See {@link InsertInventoryContentItemsParams}.
|
|
37
|
+
*/
|
|
38
|
+
export declare function insertInventoryContentItems(params: InsertInventoryContentItemsParams): Promise<void>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { resolveUrlRefs } from '../../../populate-entity-tables/resolve-url-refs.js';
|
|
2
|
+
import { decomposeUrl } from '../../../populate-ref-tables/decompose-url.js';
|
|
3
|
+
import { eachSplitted } from '../../../utils/array/each-splitted.js';
|
|
4
|
+
/**
|
|
5
|
+
* Shared body of the inventory `content_items` bulk-insert ops
|
|
6
|
+
* (`insertInventorySeeds` / `insertInventorySkippedPages`): chunked
|
|
7
|
+
* `url_refs` upsert → id resolution → `content_items` insert-ignore →
|
|
8
|
+
* write-cache population. The two callers differ only in the row
|
|
9
|
+
* constants they stamp on every row, so the invariant-heavy plumbing
|
|
10
|
+
* lives here exactly once:
|
|
11
|
+
*
|
|
12
|
+
* - Chunked into 500-URL batches so SQLite's bound-parameter limit
|
|
13
|
+
* (`SQLITE_MAX_VARIABLE_NUMBER`) cannot be hit even on a
|
|
14
|
+
* tens-of-thousands inventory list.
|
|
15
|
+
* - Both inserts are `ON CONFLICT ... IGNORE`, so existing rows — in
|
|
16
|
+
* particular previously crawled pages — are never overwritten
|
|
17
|
+
* (crawled-wins), and within-list duplicates collapse to one row.
|
|
18
|
+
* - The `urlIds` / `contentItems` write caches are populated from what
|
|
19
|
+
* the DB actually holds after the insert (not from the attempted row
|
|
20
|
+
* values), keeping later cache-hits consistent with conflict-ignored
|
|
21
|
+
* rows.
|
|
22
|
+
* @param params - See {@link InsertInventoryContentItemsParams}.
|
|
23
|
+
*/
|
|
24
|
+
export async function insertInventoryContentItems(params) {
|
|
25
|
+
const { knex, caches, urls, row, opName } = params;
|
|
26
|
+
if (urls.length === 0) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
await eachSplitted([...urls], 500, async (chunk) => {
|
|
30
|
+
await knex('url_refs')
|
|
31
|
+
.insert(chunk.map((url) => ({ url, ...decomposeUrl(url) })))
|
|
32
|
+
.onConflict('url')
|
|
33
|
+
.ignore();
|
|
34
|
+
const urlIds = await resolveUrlRefs(knex, chunk);
|
|
35
|
+
const rows = chunk.map((url) => {
|
|
36
|
+
const urlId = urlIds.get(url);
|
|
37
|
+
if (urlId === undefined) {
|
|
38
|
+
throw new Error(`${opName}: url_refs.id not resolved for ${url}`);
|
|
39
|
+
}
|
|
40
|
+
caches.urlIds.set(url, urlId);
|
|
41
|
+
return {
|
|
42
|
+
url_id: urlId,
|
|
43
|
+
...row,
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
await knex('content_items').insert(rows).onConflict('url_id').ignore();
|
|
47
|
+
const inserted = (await knex
|
|
48
|
+
.select('ci.id', 'ci.source', 'ci.is_metadata_only', 'ur.url')
|
|
49
|
+
.from('content_items as ci')
|
|
50
|
+
.join('url_refs as ur', 'ur.id', 'ci.url_id')
|
|
51
|
+
.whereIn('ur.url', chunk));
|
|
52
|
+
for (const insertedRow of inserted) {
|
|
53
|
+
caches.contentItems.set(insertedRow.url, {
|
|
54
|
+
id: insertedRow.id,
|
|
55
|
+
source: insertedRow.source,
|
|
56
|
+
isMetadataOnly: insertedRow.is_metadata_only,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { WriteRefCaches } from '../../_shared/types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Pre-insert inventory HTML seeds into `content_items` as `scraped = 0`,
|
|
5
|
+
* `source = 'inventory-seed'` placeholders so the URL's existence in the
|
|
6
|
+
* archive is **durable before the scrape phase starts**.
|
|
7
|
+
*
|
|
8
|
+
* Why this is the linchpin of `--inventory` Ctrl+C tolerance: without
|
|
9
|
+
* pre-insertion, HTML seeds live only in the Crawler's in-memory
|
|
10
|
+
* `LinkList` until the dealer eventually calls `setPage`. A Ctrl+C /
|
|
11
|
+
* crash before that point loses the seed without trace, and `--resume`
|
|
12
|
+
* cannot recover it because `getCrawlingState`'s strict pending set
|
|
13
|
+
* requires a `content_items` row. Pre-inserting fills exactly that gap:
|
|
14
|
+
* the strict pending set picks these rows up via its
|
|
15
|
+
* `OR source != 'crawled'` clause, so `--resume` after an interrupted
|
|
16
|
+
* inventory pass picks every seed back up. See `getCrawlingState` for
|
|
17
|
+
* the strict-set rationale.
|
|
18
|
+
*
|
|
19
|
+
* Idempotent: both the `url_refs` and `content_items` inserts are
|
|
20
|
+
* `ON CONFLICT ... IGNORE`, keeping existing rows intact. The
|
|
21
|
+
* `resolveContentItemId` crawled-wins downgrade still fires later when a
|
|
22
|
+
* crawled-lineage anchor reaches one of these seeds — that's the right
|
|
23
|
+
* behaviour (a seed that turned out to be reachable is not an orphan
|
|
24
|
+
* and should not retain the inventory label).
|
|
25
|
+
*
|
|
26
|
+
* Called by `CrawlerOrchestrator.inventory` during the
|
|
27
|
+
* `.bak`-protected ingestion phase, so any failure here aborts the run
|
|
28
|
+
* and restores from backup — the operator reruns from scratch. The
|
|
29
|
+
* chunking / conflict-ignore / cache-population plumbing lives in
|
|
30
|
+
* {@link insertInventoryContentItems}, shared with
|
|
31
|
+
* `insertInventorySkippedPages`.
|
|
32
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
33
|
+
* @param caches - The connection's write-side id caches.
|
|
34
|
+
* @param urls - URL strings already in `withoutHashAndAuth` form.
|
|
35
|
+
*/
|
|
36
|
+
export declare function insertInventorySeeds(knex: Knex, caches: WriteRefCaches, urls: readonly string[]): Promise<void>;
|