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