@nitpicker/archive 0.0.0 → 0.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +106 -0
- package/lib/apply-connection-pragmas.d.ts +18 -0
- package/lib/apply-connection-pragmas.js +40 -0
- package/lib/archive-accessor.d.ts +265 -0
- package/lib/archive-accessor.js +477 -0
- package/lib/archive-lock.d.ts +45 -0
- package/lib/archive-lock.js +154 -0
- package/lib/archive.d.ts +736 -0
- package/lib/archive.js +1055 -0
- package/lib/body-hash/compute-body-hash.d.ts +32 -0
- package/lib/body-hash/compute-body-hash.js +35 -0
- package/lib/cache/clear-archive-cache-entry.d.ts +18 -0
- package/lib/cache/clear-archive-cache-entry.js +24 -0
- package/lib/cache/clear-archive-cache-root.d.ts +26 -0
- package/lib/cache/clear-archive-cache-root.js +32 -0
- package/lib/cache/compute-archive-cache-key.d.ts +39 -0
- package/lib/cache/compute-archive-cache-key.js +95 -0
- package/lib/cache/extract-archive-to-cache.d.ts +57 -0
- package/lib/cache/extract-archive-to-cache.js +326 -0
- package/lib/cache/get-archive-cache-root.d.ts +20 -0
- package/lib/cache/get-archive-cache-root.js +53 -0
- package/lib/cache/is-archive-cache-disabled.d.ts +24 -0
- package/lib/cache/is-archive-cache-disabled.js +34 -0
- package/lib/cache/list-archive-cache-entries.d.ts +23 -0
- package/lib/cache/list-archive-cache-entries.js +130 -0
- package/lib/cache/path-exists.d.ts +9 -0
- package/lib/cache/path-exists.js +18 -0
- package/lib/cache/resolve-archive-cache-dir.d.ts +26 -0
- package/lib/cache/resolve-archive-cache-dir.js +32 -0
- package/lib/cache/types.d.ts +33 -0
- package/lib/cache/types.js +1 -0
- package/lib/content-type/is-html-content-type.d.ts +17 -0
- package/lib/content-type/is-html-content-type.js +19 -0
- package/lib/content-type/normalize-content-type.d.ts +14 -0
- package/lib/content-type/normalize-content-type.js +20 -0
- package/lib/create-adjunct-tables.d.ts +66 -0
- package/lib/create-adjunct-tables.js +510 -0
- package/lib/create-entity-tables.d.ts +191 -0
- package/lib/create-entity-tables.js +387 -0
- package/lib/create-progress-reporter.d.ts +30 -0
- package/lib/create-progress-reporter.js +38 -0
- package/lib/create-ref-tables.d.ts +35 -0
- package/lib/create-ref-tables.js +185 -0
- package/lib/create-template-tables.d.ts +28 -0
- package/lib/create-template-tables.js +92 -0
- package/lib/database.d.ts +549 -0
- package/lib/database.js +803 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.d.ts +27 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.js +35 -0
- package/lib/db-ops/_shared/compress-payload.d.ts +26 -0
- package/lib/db-ops/_shared/compress-payload.js +30 -0
- package/lib/db-ops/_shared/create-write-ref-caches.d.ts +17 -0
- package/lib/db-ops/_shared/create-write-ref-caches.js +27 -0
- package/lib/db-ops/_shared/decode-json-ref.d.ts +17 -0
- package/lib/db-ops/_shared/decode-json-ref.js +31 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.d.ts +49 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.js +69 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.d.ts +20 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.js +53 -0
- package/lib/db-ops/_shared/resolve-content-item-id.d.ts +62 -0
- package/lib/db-ops/_shared/resolve-content-item-id.js +143 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.d.ts +23 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.js +29 -0
- package/lib/db-ops/_shared/retry-setting.d.ts +16 -0
- package/lib/db-ops/_shared/retry-setting.js +18 -0
- package/lib/db-ops/_shared/safe-parse-json.d.ts +11 -0
- package/lib/db-ops/_shared/safe-parse-json.js +18 -0
- package/lib/db-ops/_shared/types.d.ts +94 -0
- package/lib/db-ops/_shared/types.js +1 -0
- package/lib/db-ops/_shared/upsert-blob-ref.d.ts +25 -0
- package/lib/db-ops/_shared/upsert-blob-ref.js +48 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.d.ts +30 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.js +45 -0
- package/lib/db-ops/_shared/upsert-json-ref.d.ts +22 -0
- package/lib/db-ops/_shared/upsert-json-ref.js +41 -0
- package/lib/db-ops/_shared/upsert-response-headers.d.ts +35 -0
- package/lib/db-ops/_shared/upsert-response-headers.js +49 -0
- package/lib/db-ops/_shared/upsert-url-ref.d.ts +39 -0
- package/lib/db-ops/_shared/upsert-url-ref.js +62 -0
- package/lib/db-ops/anchors/get-anchors-on-page.d.ts +10 -0
- package/lib/db-ops/anchors/get-anchors-on-page.js +21 -0
- package/lib/db-ops/config/get-base-url.d.ts +8 -0
- package/lib/db-ops/config/get-base-url.js +14 -0
- package/lib/db-ops/config/get-config.d.ts +10 -0
- package/lib/db-ops/config/get-config.js +29 -0
- package/lib/db-ops/config/get-created-cwd.d.ts +11 -0
- package/lib/db-ops/config/get-created-cwd.js +13 -0
- package/lib/db-ops/config/get-name.d.ts +8 -0
- package/lib/db-ops/config/get-name.js +14 -0
- package/lib/db-ops/config/info-column-allowlist.d.ts +7 -0
- package/lib/db-ops/config/info-column-allowlist.js +29 -0
- package/lib/db-ops/config/info-json-columns.d.ts +5 -0
- package/lib/db-ops/config/info-json-columns.js +11 -0
- package/lib/db-ops/config/set-config.d.ts +12 -0
- package/lib/db-ops/config/set-config.js +21 -0
- package/lib/db-ops/config/update-config.d.ts +17 -0
- package/lib/db-ops/config/update-config.js +36 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.d.ts +19 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.js +30 -0
- package/lib/db-ops/console-logs/replace-console-logs.d.ts +34 -0
- package/lib/db-ops/console-logs/replace-console-logs.js +123 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.d.ts +16 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.js +26 -0
- package/lib/db-ops/console-logs/types.d.ts +38 -0
- package/lib/db-ops/console-logs/types.js +1 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.d.ts +29 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.js +52 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.d.ts +18 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.js +23 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.d.ts +12 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.js +15 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.d.ts +14 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.js +30 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.d.ts +57 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.js +87 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.d.ts +21 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.js +27 -0
- package/lib/db-ops/errors/insert-crawl-error.d.ts +15 -0
- package/lib/db-ops/errors/insert-crawl-error.js +21 -0
- package/lib/db-ops/errors/insert-page-error.d.ts +21 -0
- package/lib/db-ops/errors/insert-page-error.js +30 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.d.ts +33 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.js +158 -0
- package/lib/db-ops/html/read-page-html-blob.d.ts +17 -0
- package/lib/db-ops/html/read-page-html-blob.js +20 -0
- package/lib/db-ops/lifecycle/checkpoint.d.ts +8 -0
- package/lib/db-ops/lifecycle/checkpoint.js +9 -0
- package/lib/db-ops/lifecycle/destroy.d.ts +6 -0
- package/lib/db-ops/lifecycle/destroy.js +7 -0
- package/lib/db-ops/lifecycle/init.d.ts +58 -0
- package/lib/db-ops/lifecycle/init.js +122 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.d.ts +22 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.js +41 -0
- package/lib/db-ops/meta/get-audios-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-audios-of-page.js +15 -0
- package/lib/db-ops/meta/get-buttons-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-buttons-of-page.js +15 -0
- package/lib/db-ops/meta/get-canvases-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-canvases-of-page.js +15 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.js +15 -0
- package/lib/db-ops/meta/get-headings-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-headings-of-page.js +15 -0
- package/lib/db-ops/meta/get-iframes-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-iframes-of-page.js +15 -0
- package/lib/db-ops/meta/get-jsonld-of-page.d.ts +13 -0
- package/lib/db-ops/meta/get-jsonld-of-page.js +27 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.js +15 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.js +15 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.js +15 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.js +15 -0
- package/lib/db-ops/meta/get-videos-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-videos-of-page.js +15 -0
- package/lib/db-ops/outages/close-network-outage.d.ts +12 -0
- package/lib/db-ops/outages/close-network-outage.js +15 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.d.ts +26 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.js +42 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.d.ts +26 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.js +31 -0
- package/lib/db-ops/outages/insert-network-outage.d.ts +14 -0
- package/lib/db-ops/outages/insert-network-outage.js +29 -0
- package/lib/db-ops/outages/list-network-outages.d.ts +28 -0
- package/lib/db-ops/outages/list-network-outages.js +42 -0
- package/lib/db-ops/pages/order/set-url-order.d.ts +13 -0
- package/lib/db-ops/pages/order/set-url-order.js +38 -0
- package/lib/db-ops/pages/read/build-page-query.d.ts +18 -0
- package/lib/db-ops/pages/read/build-page-query.js +40 -0
- package/lib/db-ops/pages/read/get-crawling-state.d.ts +117 -0
- package/lib/db-ops/pages/read/get-crawling-state.js +161 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.d.ts +15 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.js +30 -0
- package/lib/db-ops/pages/read/get-page-count.d.ts +12 -0
- package/lib/db-ops/pages/read/get-page-count.js +21 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.d.ts +24 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.js +28 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.d.ts +38 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.js +107 -0
- package/lib/db-ops/pages/read/get-pages.d.ts +11 -0
- package/lib/db-ops/pages/read/get-pages.js +51 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.d.ts +18 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.js +25 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.d.ts +31 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.js +32 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.d.ts +20 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.js +37 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.d.ts +30 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.js +91 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.d.ts +88 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.js +216 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.d.ts +80 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.js +151 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.d.ts +24 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.js +24 -0
- package/lib/db-ops/pages/write/insert-audios.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-audios.js +25 -0
- package/lib/db-ops/pages/write/insert-buttons.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-buttons.js +29 -0
- package/lib/db-ops/pages/write/insert-canvases.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-canvases.js +26 -0
- package/lib/db-ops/pages/write/insert-custom-elements.d.ts +27 -0
- package/lib/db-ops/pages/write/insert-custom-elements.js +40 -0
- package/lib/db-ops/pages/write/insert-headings.d.ts +15 -0
- package/lib/db-ops/pages/write/insert-headings.js +27 -0
- package/lib/db-ops/pages/write/insert-iframes.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-iframes.js +28 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.d.ts +38 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.js +60 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.d.ts +36 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.js +48 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.d.ts +42 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.js +56 -0
- package/lib/db-ops/pages/write/insert-jsonld.d.ts +17 -0
- package/lib/db-ops/pages/write/insert-jsonld.js +49 -0
- package/lib/db-ops/pages/write/insert-main-content-images.d.ts +20 -0
- package/lib/db-ops/pages/write/insert-main-content-images.js +32 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.js +29 -0
- package/lib/db-ops/pages/write/insert-page.d.ts +56 -0
- package/lib/db-ops/pages/write/insert-page.js +259 -0
- package/lib/db-ops/pages/write/insert-technologies.d.ts +25 -0
- package/lib/db-ops/pages/write/insert-technologies.js +45 -0
- package/lib/db-ops/pages/write/insert-videos.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-videos.js +28 -0
- package/lib/db-ops/pages/write/link-redirect-sources.d.ts +42 -0
- package/lib/db-ops/pages/write/link-redirect-sources.js +101 -0
- package/lib/db-ops/pages/write/record-redirect.d.ts +35 -0
- package/lib/db-ops/pages/write/record-redirect.js +100 -0
- package/lib/db-ops/pages/write/set-skipped-page.d.ts +13 -0
- package/lib/db-ops/pages/write/set-skipped-page.js +24 -0
- package/lib/db-ops/pages/write/update-page.d.ts +40 -0
- package/lib/db-ops/pages/write/update-page.js +419 -0
- package/lib/db-ops/pages/write/write-page-html-blob.d.ts +19 -0
- package/lib/db-ops/pages/write/write-page-html-blob.js +41 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.d.ts +9 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.js +15 -0
- package/lib/db-ops/referrers/get-referrers-of-page.d.ts +17 -0
- package/lib/db-ops/referrers/get-referrers-of-page.js +32 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.d.ts +8 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.js +15 -0
- package/lib/db-ops/resources/build-resource-query.d.ts +25 -0
- package/lib/db-ops/resources/build-resource-query.js +29 -0
- package/lib/db-ops/resources/get-existing-resource-urls.d.ts +9 -0
- package/lib/db-ops/resources/get-existing-resource-urls.js +24 -0
- package/lib/db-ops/resources/get-resource-by-url.d.ts +13 -0
- package/lib/db-ops/resources/get-resource-by-url.js +22 -0
- package/lib/db-ops/resources/get-resource-url-list.d.ts +17 -0
- package/lib/db-ops/resources/get-resource-url-list.js +26 -0
- package/lib/db-ops/resources/get-resources.d.ts +8 -0
- package/lib/db-ops/resources/get-resources.js +11 -0
- package/lib/db-ops/resources/insert-inventory-resources.d.ts +24 -0
- package/lib/db-ops/resources/insert-inventory-resources.js +64 -0
- package/lib/db-ops/resources/insert-resource-referrers.d.ts +15 -0
- package/lib/db-ops/resources/insert-resource-referrers.js +54 -0
- package/lib/db-ops/resources/insert-resource.d.ts +34 -0
- package/lib/db-ops/resources/insert-resource.js +73 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.d.ts +26 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.js +30 -0
- package/lib/db-ops/templates/assign-template-labels.d.ts +60 -0
- package/lib/db-ops/templates/assign-template-labels.js +187 -0
- package/lib/db-ops/templates/replace-page-templates.d.ts +44 -0
- package/lib/db-ops/templates/replace-page-templates.js +174 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.d.ts +16 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.js +17 -0
- package/lib/db-ops/templates/types.d.ts +103 -0
- package/lib/db-ops/templates/types.js +1 -0
- package/lib/debug.d.ts +8 -0
- package/lib/debug.js +9 -0
- package/lib/decode-html-blob.d.ts +20 -0
- package/lib/decode-html-blob.js +23 -0
- package/lib/decode-page-html-blob-bytes.d.ts +25 -0
- package/lib/decode-page-html-blob-bytes.js +29 -0
- package/lib/decode-stored-blob-bytes.d.ts +25 -0
- package/lib/decode-stored-blob-bytes.js +47 -0
- package/lib/derive-lineage-from-parent.d.ts +37 -0
- package/lib/derive-lineage-from-parent.js +42 -0
- package/lib/drop-legacy-tables.d.ts +45 -0
- package/lib/drop-legacy-tables.js +56 -0
- package/lib/error-kind/classify-error-kind.d.ts +20 -0
- package/lib/error-kind/classify-error-kind.js +136 -0
- package/lib/error-kind/network-related-error-kinds.d.ts +23 -0
- package/lib/error-kind/network-related-error-kinds.js +28 -0
- package/lib/error-kind/permanent-error-kinds.d.ts +48 -0
- package/lib/error-kind/permanent-error-kinds.js +54 -0
- package/lib/error-kind/types.d.ts +54 -0
- package/lib/error-kind/types.js +1 -0
- package/lib/filesystem/append-text.d.ts +9 -0
- package/lib/filesystem/append-text.js +14 -0
- package/lib/filesystem/copy-dir-sync.d.ts +6 -0
- package/lib/filesystem/copy-dir-sync.js +9 -0
- package/lib/filesystem/copy-dir.d.ts +7 -0
- package/lib/filesystem/copy-dir.js +13 -0
- package/lib/filesystem/copy-file-with-progress.d.ts +20 -0
- package/lib/filesystem/copy-file-with-progress.js +34 -0
- package/lib/filesystem/exists.d.ts +6 -0
- package/lib/filesystem/exists.js +9 -0
- package/lib/filesystem/get-file-list.d.ts +8 -0
- package/lib/filesystem/get-file-list.js +12 -0
- package/lib/filesystem/is-dir.d.ts +6 -0
- package/lib/filesystem/is-dir.js +10 -0
- package/lib/filesystem/mkdir.d.ts +8 -0
- package/lib/filesystem/mkdir.js +15 -0
- package/lib/filesystem/output-binary.d.ts +12 -0
- package/lib/filesystem/output-binary.js +17 -0
- package/lib/filesystem/output-json.d.ts +9 -0
- package/lib/filesystem/output-json.js +14 -0
- package/lib/filesystem/output-text.d.ts +11 -0
- package/lib/filesystem/output-text.js +32 -0
- package/lib/filesystem/parse-pax-path.d.ts +18 -0
- package/lib/filesystem/parse-pax-path.js +45 -0
- package/lib/filesystem/parse-tar-size-field.d.ts +13 -0
- package/lib/filesystem/parse-tar-size-field.js +37 -0
- package/lib/filesystem/peek-tar-top-dir.d.ts +35 -0
- package/lib/filesystem/peek-tar-top-dir.js +215 -0
- package/lib/filesystem/read-json.d.ts +7 -0
- package/lib/filesystem/read-json.js +11 -0
- package/lib/filesystem/read-text.d.ts +6 -0
- package/lib/filesystem/read-text.js +10 -0
- package/lib/filesystem/readline.d.ts +11 -0
- package/lib/filesystem/readline.js +26 -0
- package/lib/filesystem/remove.d.ts +5 -0
- package/lib/filesystem/remove.js +10 -0
- package/lib/filesystem/rename.d.ts +16 -0
- package/lib/filesystem/rename.js +48 -0
- package/lib/filesystem/tar.d.ts +23 -0
- package/lib/filesystem/tar.js +78 -0
- package/lib/filesystem/untar.d.ts +33 -0
- package/lib/filesystem/untar.js +84 -0
- package/lib/get-failed-page-messages.d.ts +56 -0
- package/lib/get-failed-page-messages.js +146 -0
- package/lib/get-json.d.ts +10 -0
- package/lib/get-json.js +25 -0
- package/lib/html-snapshot/match-selector-html.d.ts +25 -0
- package/lib/html-snapshot/match-selector-html.js +28 -0
- package/lib/html-snapshot/match-selector-snapshots.d.ts +33 -0
- package/lib/html-snapshot/match-selector-snapshots.js +33 -0
- package/lib/html-snapshot/search-html-document.d.ts +29 -0
- package/lib/html-snapshot/search-html-document.js +27 -0
- package/lib/html-snapshot/search-html-snapshots.d.ts +36 -0
- package/lib/html-snapshot/search-html-snapshots.js +35 -0
- package/lib/html-snapshot/types.d.ts +111 -0
- package/lib/html-snapshot/types.js +7 -0
- package/lib/html-snapshot/validate-search-pattern.d.ts +15 -0
- package/lib/html-snapshot/validate-search-pattern.js +17 -0
- package/lib/init-schema.d.ts +48 -0
- package/lib/init-schema.js +124 -0
- package/lib/is-inventory-source.d.ts +21 -0
- package/lib/is-inventory-source.js +22 -0
- package/lib/is-within-outage-window.d.ts +49 -0
- package/lib/is-within-outage-window.js +33 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.d.ts +24 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.js +26 -0
- package/lib/libsql-dialect.d.ts +115 -0
- package/lib/libsql-dialect.js +116 -0
- package/lib/limited-page-ids.d.ts +9 -0
- package/lib/limited-page-ids.js +18 -0
- package/lib/meta/assert-compatible-version.d.ts +60 -0
- package/lib/meta/assert-compatible-version.js +93 -0
- package/lib/meta/classify-jsonld-type.d.ts +23 -0
- package/lib/meta/classify-jsonld-type.js +43 -0
- package/lib/meta/compare-semver.d.ts +23 -0
- package/lib/meta/compare-semver.js +51 -0
- package/lib/meta/compute-main-contents-denormalized.d.ts +41 -0
- package/lib/meta/compute-main-contents-denormalized.js +88 -0
- package/lib/meta/compute-page-denormalized.d.ts +20 -0
- package/lib/meta/compute-page-denormalized.js +35 -0
- package/lib/meta/derive-flat-from-meta.d.ts +34 -0
- package/lib/meta/derive-flat-from-meta.js +158 -0
- package/lib/meta/derive-meta-extras.d.ts +20 -0
- package/lib/meta/derive-meta-extras.js +23 -0
- package/lib/meta/extract-tags-for-archive.d.ts +17 -0
- package/lib/meta/extract-tags-for-archive.js +36 -0
- package/lib/meta/parse-main-content-class-list.d.ts +19 -0
- package/lib/meta/parse-main-content-class-list.js +34 -0
- package/lib/meta/summarize-jsonld.d.ts +17 -0
- package/lib/meta/summarize-jsonld.js +29 -0
- package/lib/meta/technologies/combine-technology-confidence.d.ts +46 -0
- package/lib/meta/technologies/combine-technology-confidence.js +93 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.d.ts +45 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.js +53 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.d.ts +33 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.js +46 -0
- package/lib/meta/technologies/extract-technologies-for-archive.d.ts +33 -0
- package/lib/meta/technologies/extract-technologies-for-archive.js +30 -0
- package/lib/meta/technologies/match-js-license-comment-signal.d.ts +21 -0
- package/lib/meta/technologies/match-js-license-comment-signal.js +23 -0
- package/lib/meta/technologies/match-structural-technology-signals.d.ts +26 -0
- package/lib/meta/technologies/match-structural-technology-signals.js +48 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.d.ts +25 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.js +35 -0
- package/lib/meta/technologies/technology-signal-definitions.d.ts +44 -0
- package/lib/meta/technologies/technology-signal-definitions.js +60 -0
- package/lib/meta/technologies/types.d.ts +70 -0
- package/lib/meta/technologies/types.js +13 -0
- package/lib/meta/types.d.ts +1490 -0
- package/lib/meta/types.js +65 -0
- package/lib/migrate-content-items-alias-of-id.d.ts +52 -0
- package/lib/migrate-content-items-alias-of-id.js +69 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.d.ts +46 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.js +62 -0
- package/lib/migrate-content-items-is-metadata-only.d.ts +44 -0
- package/lib/migrate-content-items-is-metadata-only.js +60 -0
- package/lib/migrate-entity-tables.d.ts +55 -0
- package/lib/migrate-entity-tables.js +66 -0
- package/lib/migrate-info-created-cwd.d.ts +17 -0
- package/lib/migrate-info-created-cwd.js +36 -0
- package/lib/migrate-info-main-content-selector.d.ts +16 -0
- package/lib/migrate-info-main-content-selector.js +35 -0
- package/lib/migrate-info-request-header-names.d.ts +16 -0
- package/lib/migrate-info-request-header-names.js +35 -0
- package/lib/migrate-info-roots.d.ts +20 -0
- package/lib/migrate-info-roots.js +52 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.d.ts +34 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.js +51 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.d.ts +25 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.js +44 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.d.ts +16 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.js +35 -0
- package/lib/migrate-main-contents-columns.d.ts +26 -0
- package/lib/migrate-main-contents-columns.js +61 -0
- package/lib/migrate-page-meta-body-hash.d.ts +44 -0
- package/lib/migrate-page-meta-body-hash.js +63 -0
- package/lib/migrate-page-meta-console-error-count.d.ts +27 -0
- package/lib/migrate-page-meta-console-error-count.js +45 -0
- package/lib/migrate-page-meta-custom-element-count.d.ts +33 -0
- package/lib/migrate-page-meta-custom-element-count.js +51 -0
- package/lib/migrate-page-meta-image-scan.d.ts +27 -0
- package/lib/migrate-page-meta-image-scan.js +52 -0
- package/lib/migrate-page-tags-to-page-technologies.d.ts +39 -0
- package/lib/migrate-page-tags-to-page-technologies.js +79 -0
- package/lib/migrate-ref-tables.d.ts +25 -0
- package/lib/migrate-ref-tables.js +38 -0
- package/lib/native-executor/check-native-executor-config.d.ts +17 -0
- package/lib/native-executor/check-native-executor-config.js +20 -0
- package/lib/page-meta-column-maps.d.ts +32 -0
- package/lib/page-meta-column-maps.js +43 -0
- package/lib/page.d.ts +546 -0
- package/lib/page.js +764 -0
- package/lib/peek-archive-lock.d.ts +40 -0
- package/lib/peek-archive-lock.js +62 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.d.ts +41 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.js +87 -0
- package/lib/populate-entity-tables/derive-dom-path.d.ts +35 -0
- package/lib/populate-entity-tables/derive-dom-path.js +72 -0
- package/lib/populate-entity-tables/is-blob-ref-value.d.ts +16 -0
- package/lib/populate-entity-tables/is-blob-ref-value.js +19 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.d.ts +66 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.js +96 -0
- package/lib/populate-entity-tables/populate-anchor-edges.d.ts +33 -0
- package/lib/populate-entity-tables/populate-anchor-edges.js +153 -0
- package/lib/populate-entity-tables/populate-content-items.d.ts +40 -0
- package/lib/populate-entity-tables/populate-content-items.js +141 -0
- package/lib/populate-entity-tables/populate-entities.d.ts +81 -0
- package/lib/populate-entity-tables/populate-entities.js +110 -0
- package/lib/populate-entity-tables/populate-image-items.d.ts +91 -0
- package/lib/populate-entity-tables/populate-image-items.js +226 -0
- package/lib/populate-entity-tables/populate-page-meta.d.ts +33 -0
- package/lib/populate-entity-tables/populate-page-meta.js +267 -0
- package/lib/populate-entity-tables/populate-resource-items.d.ts +22 -0
- package/lib/populate-entity-tables/populate-resource-items.js +114 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.d.ts +31 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.js +33 -0
- package/lib/populate-entity-tables/resolve-blob-refs.d.ts +31 -0
- package/lib/populate-entity-tables/resolve-blob-refs.js +100 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.d.ts +22 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.js +27 -0
- package/lib/populate-entity-tables/resolve-header-sets.d.ts +49 -0
- package/lib/populate-entity-tables/resolve-header-sets.js +122 -0
- package/lib/populate-entity-tables/resolve-json-refs.d.ts +25 -0
- package/lib/populate-entity-tables/resolve-json-refs.js +67 -0
- package/lib/populate-entity-tables/resolve-text-refs.d.ts +30 -0
- package/lib/populate-entity-tables/resolve-text-refs.js +61 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.d.ts +21 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.js +27 -0
- package/lib/populate-entity-tables/resolve-url-refs.d.ts +33 -0
- package/lib/populate-entity-tables/resolve-url-refs.js +60 -0
- package/lib/populate-entity-tables/test-utils/count-rows.d.ts +17 -0
- package/lib/populate-entity-tables/test-utils/count-rows.js +20 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.d.ts +25 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.js +42 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.d.ts +30 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.js +175 -0
- package/lib/populate-entity-tables/types.d.ts +157 -0
- package/lib/populate-entity-tables/types.js +12 -0
- package/lib/populate-entity-tables/upsert-text-refs.d.ts +38 -0
- package/lib/populate-entity-tables/upsert-text-refs.js +78 -0
- package/lib/populate-ref-tables/classify-content-type.d.ts +16 -0
- package/lib/populate-ref-tables/classify-content-type.js +52 -0
- package/lib/populate-ref-tables/compute-content-hash.d.ts +22 -0
- package/lib/populate-ref-tables/compute-content-hash.js +26 -0
- package/lib/populate-ref-tables/compute-header-flags.d.ts +16 -0
- package/lib/populate-ref-tables/compute-header-flags.js +70 -0
- package/lib/populate-ref-tables/content-type-rules.d.ts +38 -0
- package/lib/populate-ref-tables/content-type-rules.js +133 -0
- package/lib/populate-ref-tables/create-header-table-caches.d.ts +25 -0
- package/lib/populate-ref-tables/create-header-table-caches.js +49 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.d.ts +15 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.js +15 -0
- package/lib/populate-ref-tables/decode-data-uri.d.ts +21 -0
- package/lib/populate-ref-tables/decode-data-uri.js +126 -0
- package/lib/populate-ref-tables/decompose-header-set.d.ts +29 -0
- package/lib/populate-ref-tables/decompose-header-set.js +157 -0
- package/lib/populate-ref-tables/decompose-url.d.ts +25 -0
- package/lib/populate-ref-tables/decompose-url.js +70 -0
- package/lib/populate-ref-tables/header-stability.d.ts +19 -0
- package/lib/populate-ref-tables/header-stability.js +22 -0
- package/lib/populate-ref-tables/header-value-cache-key.d.ts +17 -0
- package/lib/populate-ref-tables/header-value-cache-key.js +19 -0
- package/lib/populate-ref-tables/normalize-mime.d.ts +24 -0
- package/lib/populate-ref-tables/normalize-mime.js +36 -0
- package/lib/populate-ref-tables/populate-blob-refs.d.ts +38 -0
- package/lib/populate-ref-tables/populate-blob-refs.js +134 -0
- package/lib/populate-ref-tables/populate-content-type-refs.d.ts +27 -0
- package/lib/populate-ref-tables/populate-content-type-refs.js +70 -0
- package/lib/populate-ref-tables/populate-header-tables.d.ts +35 -0
- package/lib/populate-ref-tables/populate-header-tables.js +80 -0
- package/lib/populate-ref-tables/populate-json-refs.d.ts +29 -0
- package/lib/populate-ref-tables/populate-json-refs.js +101 -0
- package/lib/populate-ref-tables/populate-refs.d.ts +51 -0
- package/lib/populate-ref-tables/populate-refs.js +62 -0
- package/lib/populate-ref-tables/populate-text-refs.d.ts +32 -0
- package/lib/populate-ref-tables/populate-text-refs.js +133 -0
- package/lib/populate-ref-tables/populate-url-refs.d.ts +28 -0
- package/lib/populate-ref-tables/populate-url-refs.js +148 -0
- package/lib/populate-ref-tables/test-utils/count-rows.d.ts +15 -0
- package/lib/populate-ref-tables/test-utils/count-rows.js +17 -0
- package/lib/populate-ref-tables/types.d.ts +197 -0
- package/lib/populate-ref-tables/types.js +7 -0
- package/lib/populate-ref-tables/upsert-one-header-set.d.ts +34 -0
- package/lib/populate-ref-tables/upsert-one-header-set.js +208 -0
- package/lib/populate-ref-tables/volatile-header-names.d.ts +20 -0
- package/lib/populate-ref-tables/volatile-header-names.js +33 -0
- package/lib/redirect-table.d.ts +9 -0
- package/lib/redirect-table.js +28 -0
- package/lib/release-finished-statements.d.ts +42 -0
- package/lib/release-finished-statements.js +45 -0
- package/lib/resolve-redirect-chain.d.ts +33 -0
- package/lib/resolve-redirect-chain.js +27 -0
- package/lib/resource.d.ts +46 -0
- package/lib/resource.js +62 -0
- package/lib/retarget-legacy-fk-tables.d.ts +61 -0
- package/lib/retarget-legacy-fk-tables.js +137 -0
- package/lib/safe-path.d.ts +9 -0
- package/lib/safe-path.js +17 -0
- package/lib/scope/build-scope-map.d.ts +21 -0
- package/lib/scope/build-scope-map.js +32 -0
- package/lib/scope/find-scope-entry.d.ts +25 -0
- package/lib/scope/find-scope-entry.js +45 -0
- package/lib/template-classification/classify-archive-page-templates.d.ts +42 -0
- package/lib/template-classification/classify-archive-page-templates.js +70 -0
- package/lib/template-classification/classify-page-templates.d.ts +33 -0
- package/lib/template-classification/classify-page-templates.js +60 -0
- package/lib/template-classification/collect-page-ids-with-html.d.ts +24 -0
- package/lib/template-classification/collect-page-ids-with-html.js +30 -0
- package/lib/template-classification/collect-page-stylesheet-urls.d.ts +32 -0
- package/lib/template-classification/collect-page-stylesheet-urls.js +132 -0
- package/lib/template-classification/create-content-root-hint.d.ts +41 -0
- package/lib/template-classification/create-content-root-hint.js +51 -0
- package/lib/template-classification/create-page-cluster-factory.d.ts +36 -0
- package/lib/template-classification/create-page-cluster-factory.js +52 -0
- package/lib/template-classification/load-page-cluster-candidates.d.ts +32 -0
- package/lib/template-classification/load-page-cluster-candidates.js +93 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.d.ts +34 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.js +236 -0
- package/lib/template-classification/page-cluster/types.d.ts +123 -0
- package/lib/template-classification/page-cluster/types.js +1 -0
- package/lib/template-classification/types.d.ts +234 -0
- package/lib/template-classification/types.js +1 -0
- package/lib/test-utils/build-full-schema-test-db.d.ts +34 -0
- package/lib/test-utils/build-full-schema-test-db.js +74 -0
- package/lib/test-utils/compare-strings.d.ts +12 -0
- package/lib/test-utils/compare-strings.js +14 -0
- package/lib/test-utils/create-legacy-analysis-tables.d.ts +13 -0
- package/lib/test-utils/create-legacy-analysis-tables.js +37 -0
- package/lib/test-utils/fk-parent-tables.d.ts +15 -0
- package/lib/test-utils/fk-parent-tables.js +19 -0
- package/lib/test-utils/seed-content-item.d.ts +35 -0
- package/lib/test-utils/seed-content-item.js +42 -0
- package/lib/test-utils/setup-legacy-fk-db.d.ts +34 -0
- package/lib/test-utils/setup-legacy-fk-db.js +271 -0
- package/lib/transfer/attach-source-database.d.ts +31 -0
- package/lib/transfer/attach-source-database.js +40 -0
- package/lib/transfer/build-split-config.d.ts +30 -0
- package/lib/transfer/build-split-config.js +42 -0
- package/lib/transfer/clear-replaced-page-rows.d.ts +23 -0
- package/lib/transfer/clear-replaced-page-rows.js +61 -0
- package/lib/transfer/concat-archives.d.ts +55 -0
- package/lib/transfer/concat-archives.js +95 -0
- package/lib/transfer/concat-source-transfer-phases.d.ts +10 -0
- package/lib/transfer/concat-source-transfer-phases.js +17 -0
- package/lib/transfer/content-item-rank-sql.d.ts +21 -0
- package/lib/transfer/content-item-rank-sql.js +23 -0
- package/lib/transfer/copy-anchor-edges.d.ts +28 -0
- package/lib/transfer/copy-anchor-edges.js +42 -0
- package/lib/transfer/copy-dictionaries-for-concat.d.ts +39 -0
- package/lib/transfer/copy-dictionaries-for-concat.js +81 -0
- package/lib/transfer/copy-dictionaries-for-split.d.ts +29 -0
- package/lib/transfer/copy-dictionaries-for-split.js +224 -0
- package/lib/transfer/copy-header-set-children.d.ts +27 -0
- package/lib/transfer/copy-header-set-children.js +51 -0
- package/lib/transfer/copy-image-items.d.ts +21 -0
- package/lib/transfer/copy-image-items.js +62 -0
- package/lib/transfer/copy-inventory-source-lists.d.ts +30 -0
- package/lib/transfer/copy-inventory-source-lists.js +61 -0
- package/lib/transfer/copy-journal-tables.d.ts +30 -0
- package/lib/transfer/copy-journal-tables.js +56 -0
- package/lib/transfer/copy-page-console-logs.d.ts +16 -0
- package/lib/transfer/copy-page-console-logs.js +27 -0
- package/lib/transfer/copy-page-html-blobs.d.ts +31 -0
- package/lib/transfer/copy-page-html-blobs.js +43 -0
- package/lib/transfer/copy-page-meta.d.ts +27 -0
- package/lib/transfer/copy-page-meta.js +68 -0
- package/lib/transfer/copy-page-template-clusters.d.ts +31 -0
- package/lib/transfer/copy-page-template-clusters.js +56 -0
- package/lib/transfer/copy-page-template-labels.d.ts +34 -0
- package/lib/transfer/copy-page-template-labels.js +88 -0
- package/lib/transfer/copy-resource-items.d.ts +29 -0
- package/lib/transfer/copy-resource-items.js +89 -0
- package/lib/transfer/copy-resource-ref-edges.d.ts +20 -0
- package/lib/transfer/copy-resource-ref-edges.js +33 -0
- package/lib/transfer/copy-simple-page-scoped-tables.d.ts +15 -0
- package/lib/transfer/copy-simple-page-scoped-tables.js +34 -0
- package/lib/transfer/count-external-pages-in-scope.d.ts +26 -0
- package/lib/transfer/count-external-pages-in-scope.js +40 -0
- package/lib/transfer/create-transfer-temp-tables.d.ts +30 -0
- package/lib/transfer/create-transfer-temp-tables.js +59 -0
- package/lib/transfer/dictionary-copy-specs.d.ts +32 -0
- package/lib/transfer/dictionary-copy-specs.js +28 -0
- package/lib/transfer/drop-transfer-temp-tables.d.ts +9 -0
- package/lib/transfer/drop-transfer-temp-tables.js +18 -0
- package/lib/transfer/flatten-redirect-chains.d.ts +44 -0
- package/lib/transfer/flatten-redirect-chains.js +74 -0
- package/lib/transfer/insert-content-items.d.ts +35 -0
- package/lib/transfer/insert-content-items.js +116 -0
- package/lib/transfer/list-transfer-columns.d.ts +35 -0
- package/lib/transfer/list-transfer-columns.js +45 -0
- package/lib/transfer/mark-in-scope-content-items.d.ts +31 -0
- package/lib/transfer/mark-in-scope-content-items.js +54 -0
- package/lib/transfer/merge-archive-configs.d.ts +51 -0
- package/lib/transfer/merge-archive-configs.js +85 -0
- package/lib/transfer/plan-content-items-for-concat.d.ts +33 -0
- package/lib/transfer/plan-content-items-for-concat.js +51 -0
- package/lib/transfer/plan-content-items-for-split.d.ts +42 -0
- package/lib/transfer/plan-content-items-for-split.js +83 -0
- package/lib/transfer/plan-resource-items.d.ts +40 -0
- package/lib/transfer/plan-resource-items.js +69 -0
- package/lib/transfer/quote-transfer-identifier.d.ts +18 -0
- package/lib/transfer/quote-transfer-identifier.js +20 -0
- package/lib/transfer/reclassify-resource-externality.d.ts +37 -0
- package/lib/transfer/reclassify-resource-externality.js +66 -0
- package/lib/transfer/remap-redirect-dest-ids.d.ts +34 -0
- package/lib/transfer/remap-redirect-dest-ids.js +51 -0
- package/lib/transfer/replace-content-items.d.ts +39 -0
- package/lib/transfer/replace-content-items.js +83 -0
- package/lib/transfer/simple-page-scoped-tables.d.ts +25 -0
- package/lib/transfer/simple-page-scoped-tables.js +38 -0
- package/lib/transfer/split-archive.d.ts +55 -0
- package/lib/transfer/split-archive.js +98 -0
- package/lib/transfer/split-source-transfer-phases.d.ts +11 -0
- package/lib/transfer/split-source-transfer-phases.js +18 -0
- package/lib/transfer/transfer-action.d.ts +34 -0
- package/lib/transfer/transfer-action.js +32 -0
- package/lib/transfer/transfer-archive-rows.d.ts +65 -0
- package/lib/transfer/transfer-archive-rows.js +156 -0
- package/lib/transfer/transfer-dictionary-tables.d.ts +12 -0
- package/lib/transfer/transfer-dictionary-tables.js +22 -0
- package/lib/transfer/transfer-post-phases.d.ts +10 -0
- package/lib/transfer/transfer-post-phases.js +13 -0
- package/lib/transfer/transfer-source-alias.d.ts +9 -0
- package/lib/transfer/transfer-source-alias.js +9 -0
- package/lib/transfer/types.d.ts +111 -0
- package/lib/transfer/types.js +35 -0
- package/lib/types.d.ts +772 -0
- package/lib/types.js +1 -0
- package/lib/url-alias/compute-tier-a-alias-key.d.ts +44 -0
- package/lib/url-alias/compute-tier-a-alias-key.js +47 -0
- package/lib/url-alias/compute-tier-b-alias-key.d.ts +23 -0
- package/lib/url-alias/compute-tier-b-alias-key.js +26 -0
- package/lib/url-alias/group-alias-candidates.d.ts +27 -0
- package/lib/url-alias/group-alias-candidates.js +29 -0
- package/lib/url-alias/types.d.ts +12 -0
- package/lib/url-alias/types.js +1 -0
- package/lib/url-pattern/compute-shape-key.d.ts +58 -0
- package/lib/url-pattern/compute-shape-key.js +129 -0
- package/lib/url-pattern/decompose-url.d.ts +33 -0
- package/lib/url-pattern/decompose-url.js +79 -0
- package/lib/url-pattern/reconstruct-url.d.ts +15 -0
- package/lib/url-pattern/reconstruct-url.js +33 -0
- package/lib/url-sort/compute-url-sort-ranks.d.ts +30 -0
- package/lib/url-sort/compute-url-sort-ranks.js +33 -0
- package/lib/utils/array/each-splitted.d.ts +10 -0
- package/lib/utils/array/each-splitted.js +14 -0
- package/lib/utils/debug.d.ts +8 -0
- package/lib/utils/debug.js +8 -0
- package/lib/utils/error/emit-error-with-retry.d.ts +40 -0
- package/lib/utils/error/emit-error-with-retry.js +44 -0
- package/lib/utils/error/emit-error.d.ts +39 -0
- package/lib/utils/error/emit-error.js +41 -0
- package/lib/utils/object/parse-response-headers.d.ts +12 -0
- package/lib/utils/object/parse-response-headers.js +26 -0
- package/lib/utils/object/redact-request-headers.d.ts +15 -0
- package/lib/utils/object/redact-request-headers.js +27 -0
- package/lib/utils/types/types.d.ts +383 -0
- package/lib/utils/types/types.js +1 -0
- package/lib/verify-migration/capture-rejection.d.ts +24 -0
- package/lib/verify-migration/capture-rejection.js +31 -0
- package/lib/verify-migration/check-anchor-edges-count.d.ts +34 -0
- package/lib/verify-migration/check-anchor-edges-count.js +72 -0
- package/lib/verify-migration/check-anchor-edges-sum.d.ts +13 -0
- package/lib/verify-migration/check-anchor-edges-sum.js +27 -0
- package/lib/verify-migration/check-content-items-count.d.ts +16 -0
- package/lib/verify-migration/check-content-items-count.js +30 -0
- package/lib/verify-migration/check-content-type-preservation.d.ts +22 -0
- package/lib/verify-migration/check-content-type-preservation.js +40 -0
- package/lib/verify-migration/check-foreign-key-integrity.d.ts +31 -0
- package/lib/verify-migration/check-foreign-key-integrity.js +47 -0
- package/lib/verify-migration/check-image-items-count.d.ts +12 -0
- package/lib/verify-migration/check-image-items-count.js +26 -0
- package/lib/verify-migration/check-page-meta-count.d.ts +15 -0
- package/lib/verify-migration/check-page-meta-count.js +31 -0
- package/lib/verify-migration/check-reader-parity.d.ts +23 -0
- package/lib/verify-migration/check-reader-parity.js +182 -0
- package/lib/verify-migration/check-resource-items-count.d.ts +17 -0
- package/lib/verify-migration/check-resource-items-count.js +33 -0
- package/lib/verify-migration/check-url-round-trip.d.ts +43 -0
- package/lib/verify-migration/check-url-round-trip.js +112 -0
- package/lib/verify-migration/types.d.ts +70 -0
- package/lib/verify-migration/types.js +63 -0
- package/lib/verify-migration/verify-migration.d.ts +41 -0
- package/lib/verify-migration/verify-migration.js +120 -0
- package/lib/with-bulk-write-pragmas.d.ts +51 -0
- package/lib/with-bulk-write-pragmas.js +132 -0
- package/lib/write-queue.d.ts +32 -0
- package/lib/write-queue.js +55 -0
- package/package.json +350 -3
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retrieves the base URL of the crawl session from the `info` table.
|
|
3
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
4
|
+
* @returns The base URL string.
|
|
5
|
+
* @throws {Error} If no base URL is found in the database.
|
|
6
|
+
*/
|
|
7
|
+
export async function getBaseUrl(knex) {
|
|
8
|
+
const selected = await knex.select('baseUrl').from('info');
|
|
9
|
+
if (!selected[0]) {
|
|
10
|
+
throw new Error('No baseUrl');
|
|
11
|
+
}
|
|
12
|
+
const [{ baseUrl }] = selected;
|
|
13
|
+
return baseUrl || '';
|
|
14
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Config } from '../../types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Retrieves the full crawl configuration from the `info` table.
|
|
5
|
+
* Deserializes JSON-encoded fields (`roots`, `excludes`, `excludeKeywords`, `excludeUrls`, `requestHeaderNames`).
|
|
6
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
7
|
+
* @returns The parsed {@link Config} object.
|
|
8
|
+
* @throws {Error} If no configuration is found in the database.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getConfig(knex: Knex): Promise<Config>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { dbLog } from '../../debug.js';
|
|
2
|
+
import { getJSON } from '../../get-json.js';
|
|
3
|
+
/**
|
|
4
|
+
* Retrieves the full crawl configuration from the `info` table.
|
|
5
|
+
* Deserializes JSON-encoded fields (`roots`, `excludes`, `excludeKeywords`, `excludeUrls`, `requestHeaderNames`).
|
|
6
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
7
|
+
* @returns The parsed {@link Config} object.
|
|
8
|
+
* @throws {Error} If no configuration is found in the database.
|
|
9
|
+
*/
|
|
10
|
+
export async function getConfig(knex) {
|
|
11
|
+
const [config] = await knex.select('*').from('info');
|
|
12
|
+
if (!config) {
|
|
13
|
+
throw new Error('No config');
|
|
14
|
+
}
|
|
15
|
+
const opt = {
|
|
16
|
+
...config,
|
|
17
|
+
excludes: getJSON(config.excludes, []),
|
|
18
|
+
excludeKeywords: getJSON(config.excludeKeywords, []),
|
|
19
|
+
excludeUrls: getJSON(config.excludeUrls, []),
|
|
20
|
+
roots: getJSON(config.roots, []),
|
|
21
|
+
requestHeaderNames: getJSON(config.requestHeaderNames, []),
|
|
22
|
+
retry: config.retry ?? 3,
|
|
23
|
+
maxExcludedDepth: config.maxExcludedDepth ?? 0,
|
|
24
|
+
};
|
|
25
|
+
// @ts-expect-error — `id` is the primary key, not part of the public Config shape
|
|
26
|
+
delete opt.id;
|
|
27
|
+
dbLog('Table `info`: %O => %O', config, opt);
|
|
28
|
+
return opt;
|
|
29
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Retrieves the working directory recorded when this stub's crawl session
|
|
4
|
+
* was created, so {@link import('../../archive.js').default.resume} can
|
|
5
|
+
* reconstruct the completed archive's output path independent of the
|
|
6
|
+
* directory `crawl --resume` happens to be invoked from.
|
|
7
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
8
|
+
* @returns The recorded cwd, or `null` for a stub created before this column
|
|
9
|
+
* existed (or created by a code path that never stamps it, i.e. `resume`).
|
|
10
|
+
*/
|
|
11
|
+
export declare function getCreatedCwd(knex: Knex): Promise<string | null>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retrieves the working directory recorded when this stub's crawl session
|
|
3
|
+
* was created, so {@link import('../../archive.js').default.resume} can
|
|
4
|
+
* reconstruct the completed archive's output path independent of the
|
|
5
|
+
* directory `crawl --resume` happens to be invoked from.
|
|
6
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
7
|
+
* @returns The recorded cwd, or `null` for a stub created before this column
|
|
8
|
+
* existed (or created by a code path that never stamps it, i.e. `resume`).
|
|
9
|
+
*/
|
|
10
|
+
export async function getCreatedCwd(knex) {
|
|
11
|
+
const [row] = await knex.select('createdCwd').from('info');
|
|
12
|
+
return row?.createdCwd ?? null;
|
|
13
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Retrieves the crawl session name from the `info` table.
|
|
4
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
5
|
+
* @returns The name string.
|
|
6
|
+
* @throws {Error} If no name is found in the database.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getName(knex: Knex): Promise<string>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retrieves the crawl session name from the `info` table.
|
|
3
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
4
|
+
* @returns The name string.
|
|
5
|
+
* @throws {Error} If no name is found in the database.
|
|
6
|
+
*/
|
|
7
|
+
export async function getName(knex) {
|
|
8
|
+
const selected = await knex.select('name').from('info');
|
|
9
|
+
if (!selected[0]) {
|
|
10
|
+
throw new Error('No name');
|
|
11
|
+
}
|
|
12
|
+
const [{ name }] = selected;
|
|
13
|
+
return name;
|
|
14
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Columns of the `info` table that `setConfig` / `updateConfig` are allowed to
|
|
3
|
+
* write. Any key outside this set is silently dropped so callers can splat a
|
|
4
|
+
* wider runtime config (with extras like `cwd`) without hitting "no such
|
|
5
|
+
* column" at the SQL layer.
|
|
6
|
+
*/
|
|
7
|
+
export declare const INFO_COLUMN_ALLOWLIST: ReadonlySet<string>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Columns of the `info` table that `setConfig` / `updateConfig` are allowed to
|
|
3
|
+
* write. Any key outside this set is silently dropped so callers can splat a
|
|
4
|
+
* wider runtime config (with extras like `cwd`) without hitting "no such
|
|
5
|
+
* column" at the SQL layer.
|
|
6
|
+
*/
|
|
7
|
+
export const INFO_COLUMN_ALLOWLIST = new Set([
|
|
8
|
+
'version',
|
|
9
|
+
'name',
|
|
10
|
+
'baseUrl',
|
|
11
|
+
'roots',
|
|
12
|
+
'recursive',
|
|
13
|
+
'interval',
|
|
14
|
+
'image',
|
|
15
|
+
'fetchExternal',
|
|
16
|
+
'parallels',
|
|
17
|
+
'excludes',
|
|
18
|
+
'excludeKeywords',
|
|
19
|
+
'excludeUrls',
|
|
20
|
+
'maxExcludedDepth',
|
|
21
|
+
'retry',
|
|
22
|
+
'fromList',
|
|
23
|
+
'disableQueries',
|
|
24
|
+
'userAgent',
|
|
25
|
+
'ignoreRobots',
|
|
26
|
+
'mainContentSelector',
|
|
27
|
+
'requestHeaderNames',
|
|
28
|
+
'createdCwd',
|
|
29
|
+
]);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subset of {@link ./info-column-allowlist.ts} that is stored as a JSON-encoded
|
|
3
|
+
* string and therefore needs `JSON.stringify` on write.
|
|
4
|
+
*/
|
|
5
|
+
export const INFO_JSON_COLUMNS = new Set([
|
|
6
|
+
'roots',
|
|
7
|
+
'excludes',
|
|
8
|
+
'excludeKeywords',
|
|
9
|
+
'excludeUrls',
|
|
10
|
+
'requestHeaderNames',
|
|
11
|
+
]);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Config } from '../../types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Stores the crawl configuration in the `info` table.
|
|
5
|
+
* Only fields in {@link ./info-column-allowlist.ts} are forwarded — any extra
|
|
6
|
+
* runtime-only field on the input is silently dropped so callers can splat
|
|
7
|
+
* a wider config object without producing SQL errors. JSON-array fields
|
|
8
|
+
* are serialized via `JSON.stringify`.
|
|
9
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
10
|
+
* @param config - The {@link Config} object to store.
|
|
11
|
+
*/
|
|
12
|
+
export declare function setConfig(knex: Knex, config: Config): Promise<number[]>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { INFO_COLUMN_ALLOWLIST } from './info-column-allowlist.js';
|
|
2
|
+
import { INFO_JSON_COLUMNS } from './info-json-columns.js';
|
|
3
|
+
/**
|
|
4
|
+
* Stores the crawl configuration in the `info` table.
|
|
5
|
+
* Only fields in {@link ./info-column-allowlist.ts} are forwarded — any extra
|
|
6
|
+
* runtime-only field on the input is silently dropped so callers can splat
|
|
7
|
+
* a wider config object without producing SQL errors. JSON-array fields
|
|
8
|
+
* are serialized via `JSON.stringify`.
|
|
9
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
10
|
+
* @param config - The {@link Config} object to store.
|
|
11
|
+
*/
|
|
12
|
+
export async function setConfig(knex, config) {
|
|
13
|
+
const payload = {};
|
|
14
|
+
for (const [key, value] of Object.entries(config)) {
|
|
15
|
+
if (!INFO_COLUMN_ALLOWLIST.has(key)) {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
payload[key] = INFO_JSON_COLUMNS.has(key) ? JSON.stringify(value) : value;
|
|
19
|
+
}
|
|
20
|
+
return knex.from('info').insert(payload);
|
|
21
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Config } from '../../types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Update the single row in the `info` table with a partial config patch.
|
|
5
|
+
*
|
|
6
|
+
* Used by the append flow to extend `roots` (and any other tweakable
|
|
7
|
+
* field) without replacing the entire row. JSON-array fields are serialized on
|
|
8
|
+
* the fly; primitive fields are written verbatim. Unspecified fields stay as-is.
|
|
9
|
+
*
|
|
10
|
+
* Unknown keys (anything outside the allow-list of `info`-table columns) are
|
|
11
|
+
* silently dropped instead of being passed to SQL, so callers that splat a
|
|
12
|
+
* wider runtime config (e.g. `CrawlConfig` with `cwd` / `executablePath`)
|
|
13
|
+
* cannot accidentally trigger a "no such column" SQL error.
|
|
14
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
15
|
+
* @param patch - Partial {@link Config} fields to overwrite. `undefined` values are skipped.
|
|
16
|
+
*/
|
|
17
|
+
export declare function updateConfig(knex: Knex, patch: Partial<Config>): Promise<void>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { INFO_COLUMN_ALLOWLIST } from './info-column-allowlist.js';
|
|
2
|
+
import { INFO_JSON_COLUMNS } from './info-json-columns.js';
|
|
3
|
+
/**
|
|
4
|
+
* Update the single row in the `info` table with a partial config patch.
|
|
5
|
+
*
|
|
6
|
+
* Used by the append flow to extend `roots` (and any other tweakable
|
|
7
|
+
* field) without replacing the entire row. JSON-array fields are serialized on
|
|
8
|
+
* the fly; primitive fields are written verbatim. Unspecified fields stay as-is.
|
|
9
|
+
*
|
|
10
|
+
* Unknown keys (anything outside the allow-list of `info`-table columns) are
|
|
11
|
+
* silently dropped instead of being passed to SQL, so callers that splat a
|
|
12
|
+
* wider runtime config (e.g. `CrawlConfig` with `cwd` / `executablePath`)
|
|
13
|
+
* cannot accidentally trigger a "no such column" SQL error.
|
|
14
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
15
|
+
* @param patch - Partial {@link Config} fields to overwrite. `undefined` values are skipped.
|
|
16
|
+
*/
|
|
17
|
+
export async function updateConfig(knex, patch) {
|
|
18
|
+
const payload = {};
|
|
19
|
+
for (const [key, value] of Object.entries(patch)) {
|
|
20
|
+
if (value === undefined) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (!INFO_COLUMN_ALLOWLIST.has(key)) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (INFO_JSON_COLUMNS.has(key)) {
|
|
27
|
+
payload[key] = JSON.stringify(value);
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
payload[key] = value;
|
|
31
|
+
}
|
|
32
|
+
if (Object.keys(payload).length === 0) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
await knex.from('info').update(payload);
|
|
36
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ConsoleLogContent } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Computes the `console_log_items.hash` for one console log entry's content.
|
|
4
|
+
*
|
|
5
|
+
* Hashing over the raw content fields (not their resolved ref ids) keeps the
|
|
6
|
+
* dictionary row's identity independent of ref-table state, matching
|
|
7
|
+
* `text_refs` / `json_refs` / `url_refs`, whose hash columns are likewise
|
|
8
|
+
* computed from source content rather than downstream ids. The same
|
|
9
|
+
* message logged by a shared framework on every page therefore hashes to
|
|
10
|
+
* the same value regardless of insertion order or which page's scrape
|
|
11
|
+
* resolves the dictionary row first.
|
|
12
|
+
* @param entry - The content fields to hash. `argsJson` must already be
|
|
13
|
+
* `stringifyConsoleLogArgs`'s output — this function does not
|
|
14
|
+
* re-serialize `args` itself.
|
|
15
|
+
* @returns 32-byte SHA-256 hash, ready for the `hash BLOB UNIQUE` column.
|
|
16
|
+
* @example
|
|
17
|
+
* const hash = computeConsoleLogHash({ type: 'error', text: 'boom', argsJson: null });
|
|
18
|
+
*/
|
|
19
|
+
export declare function computeConsoleLogHash(entry: ConsoleLogContent): Buffer;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { computeContentHash } from '../../populate-ref-tables/compute-content-hash.js';
|
|
2
|
+
/**
|
|
3
|
+
* Computes the `console_log_items.hash` for one console log entry's content.
|
|
4
|
+
*
|
|
5
|
+
* Hashing over the raw content fields (not their resolved ref ids) keeps the
|
|
6
|
+
* dictionary row's identity independent of ref-table state, matching
|
|
7
|
+
* `text_refs` / `json_refs` / `url_refs`, whose hash columns are likewise
|
|
8
|
+
* computed from source content rather than downstream ids. The same
|
|
9
|
+
* message logged by a shared framework on every page therefore hashes to
|
|
10
|
+
* the same value regardless of insertion order or which page's scrape
|
|
11
|
+
* resolves the dictionary row first.
|
|
12
|
+
* @param entry - The content fields to hash. `argsJson` must already be
|
|
13
|
+
* `stringifyConsoleLogArgs`'s output — this function does not
|
|
14
|
+
* re-serialize `args` itself.
|
|
15
|
+
* @returns 32-byte SHA-256 hash, ready for the `hash BLOB UNIQUE` column.
|
|
16
|
+
* @example
|
|
17
|
+
* const hash = computeConsoleLogHash({ type: 'error', text: 'boom', argsJson: null });
|
|
18
|
+
*/
|
|
19
|
+
export function computeConsoleLogHash(entry) {
|
|
20
|
+
const canonical = JSON.stringify([
|
|
21
|
+
entry.type,
|
|
22
|
+
entry.text,
|
|
23
|
+
entry.argsJson,
|
|
24
|
+
entry.location?.url ?? null,
|
|
25
|
+
entry.location?.lineNumber ?? null,
|
|
26
|
+
entry.location?.columnNumber ?? null,
|
|
27
|
+
entry.stack ?? null,
|
|
28
|
+
]);
|
|
29
|
+
return computeContentHash(canonical);
|
|
30
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ConsoleLogEntry } from '../../utils/types/types.js';
|
|
2
|
+
import type { WriteRefCaches } from '../_shared/types.js';
|
|
3
|
+
import type { Knex } from 'knex';
|
|
4
|
+
/**
|
|
5
|
+
* Replaces one page's `page_console_logs` rows wholesale with a freshly
|
|
6
|
+
* captured set of console messages / page errors (issue #228).
|
|
7
|
+
*
|
|
8
|
+
* Scoped-Replace, the same pattern as `replaceAnchorEdges` /
|
|
9
|
+
* `replaceImageItems`: the page's existing rows are deleted and the new
|
|
10
|
+
* set is inserted in the same transaction, so a re-scrape (`--append` /
|
|
11
|
+
* `--retry-failed` / re-render) never accumulates duplicate occurrences.
|
|
12
|
+
* Unlike those two, there is no non-empty guard on the DELETE here — the
|
|
13
|
+
* caller (`Crawler#handleConsoleLogs`) already skips emitting the event
|
|
14
|
+
* entirely when `entries` is empty, which is what keeps a degraded
|
|
15
|
+
* re-scrape from wiping out a prior good capture.
|
|
16
|
+
*
|
|
17
|
+
* `pageUrl` is the originally-requested URL (matching `updatePage`'s
|
|
18
|
+
* `page.url.withoutHashAndAuth` contract), not necessarily the page that
|
|
19
|
+
* ends up holding the content: `resolveRedirectChain` derives the same
|
|
20
|
+
* redirect destination `updatePage` writes content under, so console logs
|
|
21
|
+
* attach to the row that actually carries the page's `page_meta`, not to
|
|
22
|
+
* an empty placeholder for the pre-redirect URL.
|
|
23
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
24
|
+
* @param caches - The connection's write-side id caches.
|
|
25
|
+
* @param pageUrl - The originally-requested URL, normalised
|
|
26
|
+
* (`withoutHashAndAuth` form).
|
|
27
|
+
* @param redirectPaths - The redirect chain hops captured during fetch, in
|
|
28
|
+
* order (empty when the page was not redirected).
|
|
29
|
+
* @param entries - The console log entries to persist. Must be non-empty —
|
|
30
|
+
* callers should skip calling this function entirely for an empty list.
|
|
31
|
+
* @example
|
|
32
|
+
* await replaceConsoleLogs(knex, caches, page.url.withoutHashAndAuth, page.redirectPaths, entries);
|
|
33
|
+
*/
|
|
34
|
+
export declare function replaceConsoleLogs(knex: Knex, caches: WriteRefCaches, pageUrl: string, redirectPaths: readonly string[], entries: readonly ConsoleLogEntry[]): Promise<void>;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { upsertTextRefs } from '../../populate-entity-tables/upsert-text-refs.js';
|
|
2
|
+
import { resolveRedirectChain } from '../../resolve-redirect-chain.js';
|
|
3
|
+
import { clearWriteRefCaches } from '../_shared/clear-write-ref-caches.js';
|
|
4
|
+
import { resolveContentItemId } from '../_shared/resolve-content-item-id.js';
|
|
5
|
+
import { upsertJsonRef } from '../_shared/upsert-json-ref.js';
|
|
6
|
+
import { upsertUrlRef } from '../_shared/upsert-url-ref.js';
|
|
7
|
+
import { computeConsoleLogHash } from './compute-console-log-hash.js';
|
|
8
|
+
import { stringifyConsoleLogArgs } from './stringify-console-log-args.js';
|
|
9
|
+
import { upsertConsoleLogItem } from './upsert-console-log-item.js';
|
|
10
|
+
/** Rows sent per `INSERT INTO page_console_logs ... VALUES (...)` statement. */
|
|
11
|
+
const INSERT_CHUNK_SIZE = 500;
|
|
12
|
+
/**
|
|
13
|
+
* Replaces one page's `page_console_logs` rows wholesale with a freshly
|
|
14
|
+
* captured set of console messages / page errors (issue #228).
|
|
15
|
+
*
|
|
16
|
+
* Scoped-Replace, the same pattern as `replaceAnchorEdges` /
|
|
17
|
+
* `replaceImageItems`: the page's existing rows are deleted and the new
|
|
18
|
+
* set is inserted in the same transaction, so a re-scrape (`--append` /
|
|
19
|
+
* `--retry-failed` / re-render) never accumulates duplicate occurrences.
|
|
20
|
+
* Unlike those two, there is no non-empty guard on the DELETE here — the
|
|
21
|
+
* caller (`Crawler#handleConsoleLogs`) already skips emitting the event
|
|
22
|
+
* entirely when `entries` is empty, which is what keeps a degraded
|
|
23
|
+
* re-scrape from wiping out a prior good capture.
|
|
24
|
+
*
|
|
25
|
+
* `pageUrl` is the originally-requested URL (matching `updatePage`'s
|
|
26
|
+
* `page.url.withoutHashAndAuth` contract), not necessarily the page that
|
|
27
|
+
* ends up holding the content: `resolveRedirectChain` derives the same
|
|
28
|
+
* redirect destination `updatePage` writes content under, so console logs
|
|
29
|
+
* attach to the row that actually carries the page's `page_meta`, not to
|
|
30
|
+
* an empty placeholder for the pre-redirect URL.
|
|
31
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
32
|
+
* @param caches - The connection's write-side id caches.
|
|
33
|
+
* @param pageUrl - The originally-requested URL, normalised
|
|
34
|
+
* (`withoutHashAndAuth` form).
|
|
35
|
+
* @param redirectPaths - The redirect chain hops captured during fetch, in
|
|
36
|
+
* order (empty when the page was not redirected).
|
|
37
|
+
* @param entries - The console log entries to persist. Must be non-empty —
|
|
38
|
+
* callers should skip calling this function entirely for an empty list.
|
|
39
|
+
* @example
|
|
40
|
+
* await replaceConsoleLogs(knex, caches, page.url.withoutHashAndAuth, page.redirectPaths, entries);
|
|
41
|
+
*/
|
|
42
|
+
export async function replaceConsoleLogs(knex, caches, pageUrl, redirectPaths, entries) {
|
|
43
|
+
const { destUrl } = resolveRedirectChain(pageUrl, redirectPaths);
|
|
44
|
+
try {
|
|
45
|
+
await knex.transaction(async (trx) => {
|
|
46
|
+
const pageId = await resolveContentItemId(trx, caches, destUrl);
|
|
47
|
+
await trx('page_console_logs').where('pageId', pageId).delete();
|
|
48
|
+
const texts = new Set();
|
|
49
|
+
for (const entry of entries) {
|
|
50
|
+
// `text_refs` never stores the empty string (its upsert
|
|
51
|
+
// treats `''` as "nothing to dedupe" and skips it) — a
|
|
52
|
+
// `console.log()` call with zero arguments reports `text:
|
|
53
|
+
// ''`, so that entry resolves to `textId: null` below
|
|
54
|
+
// instead of looking it up.
|
|
55
|
+
if (entry.text !== '') {
|
|
56
|
+
texts.add(entry.text);
|
|
57
|
+
}
|
|
58
|
+
if (entry.stack) {
|
|
59
|
+
texts.add(entry.stack);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const textIds = await upsertTextRefs(trx, texts);
|
|
63
|
+
const rows = [];
|
|
64
|
+
for (const entry of entries) {
|
|
65
|
+
let textId = null;
|
|
66
|
+
if (entry.text !== '') {
|
|
67
|
+
const resolved = textIds.get(entry.text);
|
|
68
|
+
if (resolved === undefined) {
|
|
69
|
+
throw new Error(`replaceConsoleLogs: text_refs id not resolved for "${entry.text}"`);
|
|
70
|
+
}
|
|
71
|
+
textId = resolved;
|
|
72
|
+
}
|
|
73
|
+
const stackTextId = entry.stack ? (textIds.get(entry.stack) ?? null) : null;
|
|
74
|
+
const argsJson = stringifyConsoleLogArgs(entry.args);
|
|
75
|
+
const argsJsonId = argsJson === null ? null : await upsertJsonRef(trx, caches, argsJson);
|
|
76
|
+
const locUrlId = entry.location?.url === undefined
|
|
77
|
+
? null
|
|
78
|
+
: await upsertUrlRef(trx, caches, entry.location.url);
|
|
79
|
+
const consoleLogId = await upsertConsoleLogItem(trx, caches, {
|
|
80
|
+
hash: computeConsoleLogHash({
|
|
81
|
+
type: entry.type,
|
|
82
|
+
text: entry.text,
|
|
83
|
+
argsJson,
|
|
84
|
+
location: entry.location,
|
|
85
|
+
stack: entry.stack,
|
|
86
|
+
}),
|
|
87
|
+
type: entry.type,
|
|
88
|
+
textId,
|
|
89
|
+
argsJsonId,
|
|
90
|
+
locUrlId,
|
|
91
|
+
locLine: entry.location?.lineNumber ?? null,
|
|
92
|
+
locColumn: entry.location?.columnNumber ?? null,
|
|
93
|
+
stackTextId,
|
|
94
|
+
});
|
|
95
|
+
rows.push({ pageId, consoleLogId, ts: entry.ts });
|
|
96
|
+
}
|
|
97
|
+
for (let index = 0; index < rows.length; index += INSERT_CHUNK_SIZE) {
|
|
98
|
+
await trx('page_console_logs').insert(rows.slice(index, index + INSERT_CHUNK_SIZE));
|
|
99
|
+
}
|
|
100
|
+
// Denormalised onto `page_meta` (the same write-once-at-scrape-time
|
|
101
|
+
// pattern as `tag_count` / `jsonld_count`) so the Pages list can
|
|
102
|
+
// display and sort by it without a live JOIN + COUNT per row.
|
|
103
|
+
// Computed from `entries` directly rather than re-querying the rows
|
|
104
|
+
// just inserted above — the data is already in hand. A `page_meta`
|
|
105
|
+
// row may not exist yet for a `'skipped'` / `'error'` scrape; the
|
|
106
|
+
// UPDATE then simply affects zero rows rather than throwing.
|
|
107
|
+
const errorCount = entries.filter((entry) => entry.type === 'error' || entry.type === 'pageerror').length;
|
|
108
|
+
await trx('page_meta').where('page_id', pageId).update({
|
|
109
|
+
console_error_count: errorCount,
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
// A rolled-back transaction can leave ids cached that no longer
|
|
115
|
+
// correspond to any row (AUTOINCREMENT never rewinds) — same
|
|
116
|
+
// cache-poisoning hazard `updatePage` / `recordRedirect` guard
|
|
117
|
+
// against. A full clear (not a partial one) is required because
|
|
118
|
+
// this function shares `caches` with every other write path on
|
|
119
|
+
// the same connection.
|
|
120
|
+
clearWriteRefCaches(caches);
|
|
121
|
+
throw error;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serializes a console call's argument array to a JSON string, or `null`
|
|
3
|
+
* when there is nothing worth storing.
|
|
4
|
+
*
|
|
5
|
+
* Two cases collapse to `null` rather than an empty/degenerate string:
|
|
6
|
+
* an empty `args` array (most commonly a `"pageerror"` entry, which
|
|
7
|
+
* beholder always reports with `args: []`) and a `JSON.stringify` failure
|
|
8
|
+
* (e.g. a circular reference in a logged object) — both mean "no
|
|
9
|
+
* additional structured payload beyond `text`", not "a malformed one".
|
|
10
|
+
* @param args - The `ConsoleLogEntry.args` array to serialize.
|
|
11
|
+
* @returns The JSON string, or `null` when empty or unserializable.
|
|
12
|
+
* @example
|
|
13
|
+
* stringifyConsoleLogArgs(['a', 1]); // '["a",1]'
|
|
14
|
+
* stringifyConsoleLogArgs([]); // null
|
|
15
|
+
*/
|
|
16
|
+
export declare function stringifyConsoleLogArgs(args: readonly unknown[]): string | null;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serializes a console call's argument array to a JSON string, or `null`
|
|
3
|
+
* when there is nothing worth storing.
|
|
4
|
+
*
|
|
5
|
+
* Two cases collapse to `null` rather than an empty/degenerate string:
|
|
6
|
+
* an empty `args` array (most commonly a `"pageerror"` entry, which
|
|
7
|
+
* beholder always reports with `args: []`) and a `JSON.stringify` failure
|
|
8
|
+
* (e.g. a circular reference in a logged object) — both mean "no
|
|
9
|
+
* additional structured payload beyond `text`", not "a malformed one".
|
|
10
|
+
* @param args - The `ConsoleLogEntry.args` array to serialize.
|
|
11
|
+
* @returns The JSON string, or `null` when empty or unserializable.
|
|
12
|
+
* @example
|
|
13
|
+
* stringifyConsoleLogArgs(['a', 1]); // '["a",1]'
|
|
14
|
+
* stringifyConsoleLogArgs([]); // null
|
|
15
|
+
*/
|
|
16
|
+
export function stringifyConsoleLogArgs(args) {
|
|
17
|
+
if (args.length === 0) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
return JSON.stringify(args);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The content fields of a `ConsoleLogEntry` that determine its identity in
|
|
3
|
+
* `console_log_items` — everything except `pageUrl` / `ts`, which are
|
|
4
|
+
* per-occurrence rather than per-content (see `page_console_logs`).
|
|
5
|
+
*/
|
|
6
|
+
export interface ConsoleLogContent {
|
|
7
|
+
type: string;
|
|
8
|
+
text: string;
|
|
9
|
+
/**
|
|
10
|
+
* Pre-stringified `args` (via `stringifyConsoleLogArgs`), or `null` for
|
|
11
|
+
* an empty/unserializable args array. Callers compute this once and
|
|
12
|
+
* reuse it both for hashing here and for the `json_refs` storage
|
|
13
|
+
* decision, rather than calling `stringifyConsoleLogArgs` on the same
|
|
14
|
+
* `args` array twice.
|
|
15
|
+
*/
|
|
16
|
+
argsJson: string | null;
|
|
17
|
+
location?: {
|
|
18
|
+
url?: string;
|
|
19
|
+
lineNumber?: number;
|
|
20
|
+
columnNumber?: number;
|
|
21
|
+
};
|
|
22
|
+
stack?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The resolved ref ids and scalar fields that make up one
|
|
26
|
+
* `console_log_items` row, computed by the caller before the upsert runs.
|
|
27
|
+
*/
|
|
28
|
+
export interface ConsoleLogItemRow {
|
|
29
|
+
hash: Buffer;
|
|
30
|
+
type: string;
|
|
31
|
+
/** `null` when `text` is the empty string — `text_refs` never stores `''`. */
|
|
32
|
+
textId: number | null;
|
|
33
|
+
argsJsonId: number | null;
|
|
34
|
+
locUrlId: number | null;
|
|
35
|
+
locLine: number | null;
|
|
36
|
+
locColumn: number | null;
|
|
37
|
+
stackTextId: number | null;
|
|
38
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ConsoleLogItemRow } from './types.js';
|
|
2
|
+
import type { WriteRefCaches } from '../_shared/types.js';
|
|
3
|
+
import type { Knex } from 'knex';
|
|
4
|
+
/**
|
|
5
|
+
* Resolves the `console_log_items.id` for one console log entry's content,
|
|
6
|
+
* inserting the dictionary row when the hash is not yet known.
|
|
7
|
+
*
|
|
8
|
+
* Same no-op-update-for-`RETURNING` idiom as `upsertUrlRef` / `upsertJsonRef`:
|
|
9
|
+
* `INSERT ... ON CONFLICT(hash) DO UPDATE SET hash = hash RETURNING id`
|
|
10
|
+
* yields the existing row's id on a hash collision without a separate
|
|
11
|
+
* SELECT round trip, and (unlike `INSERT OR IGNORE ... RETURNING`) still
|
|
12
|
+
* returns a row when the insert itself is the no-op.
|
|
13
|
+
* @param qb - Knex instance or transaction connected to the archive DB.
|
|
14
|
+
* @param caches - The connection's write-side id caches; mutated in place.
|
|
15
|
+
* @param row - The content hash plus every resolved ref id / scalar column.
|
|
16
|
+
* @returns The `console_log_items.id` of the existing or newly inserted row.
|
|
17
|
+
* @example
|
|
18
|
+
* const id = await upsertConsoleLogItem(trx, caches, {
|
|
19
|
+
* hash: computeConsoleLogHash(entry),
|
|
20
|
+
* type: entry.type,
|
|
21
|
+
* textId,
|
|
22
|
+
* argsJsonId: null,
|
|
23
|
+
* locUrlId: null,
|
|
24
|
+
* locLine: null,
|
|
25
|
+
* locColumn: null,
|
|
26
|
+
* stackTextId: null,
|
|
27
|
+
* });
|
|
28
|
+
*/
|
|
29
|
+
export declare function upsertConsoleLogItem(qb: Knex | Knex.Transaction, caches: WriteRefCaches, row: ConsoleLogItemRow): Promise<number>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves the `console_log_items.id` for one console log entry's content,
|
|
3
|
+
* inserting the dictionary row when the hash is not yet known.
|
|
4
|
+
*
|
|
5
|
+
* Same no-op-update-for-`RETURNING` idiom as `upsertUrlRef` / `upsertJsonRef`:
|
|
6
|
+
* `INSERT ... ON CONFLICT(hash) DO UPDATE SET hash = hash RETURNING id`
|
|
7
|
+
* yields the existing row's id on a hash collision without a separate
|
|
8
|
+
* SELECT round trip, and (unlike `INSERT OR IGNORE ... RETURNING`) still
|
|
9
|
+
* returns a row when the insert itself is the no-op.
|
|
10
|
+
* @param qb - Knex instance or transaction connected to the archive DB.
|
|
11
|
+
* @param caches - The connection's write-side id caches; mutated in place.
|
|
12
|
+
* @param row - The content hash plus every resolved ref id / scalar column.
|
|
13
|
+
* @returns The `console_log_items.id` of the existing or newly inserted row.
|
|
14
|
+
* @example
|
|
15
|
+
* const id = await upsertConsoleLogItem(trx, caches, {
|
|
16
|
+
* hash: computeConsoleLogHash(entry),
|
|
17
|
+
* type: entry.type,
|
|
18
|
+
* textId,
|
|
19
|
+
* argsJsonId: null,
|
|
20
|
+
* locUrlId: null,
|
|
21
|
+
* locLine: null,
|
|
22
|
+
* locColumn: null,
|
|
23
|
+
* stackTextId: null,
|
|
24
|
+
* });
|
|
25
|
+
*/
|
|
26
|
+
export async function upsertConsoleLogItem(qb, caches, row) {
|
|
27
|
+
const hex = row.hash.toString('hex');
|
|
28
|
+
const cached = caches.consoleLogIds.get(hex);
|
|
29
|
+
if (cached !== undefined) {
|
|
30
|
+
return cached;
|
|
31
|
+
}
|
|
32
|
+
const rows = await qb.raw(`INSERT INTO console_log_items
|
|
33
|
+
(hash, type, text_id, args_json_id, loc_url_id, loc_line, loc_column, stack_text_id)
|
|
34
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
35
|
+
ON CONFLICT(hash) DO UPDATE SET hash = hash
|
|
36
|
+
RETURNING id`, [
|
|
37
|
+
row.hash,
|
|
38
|
+
row.type,
|
|
39
|
+
row.textId,
|
|
40
|
+
row.argsJsonId,
|
|
41
|
+
row.locUrlId,
|
|
42
|
+
row.locLine,
|
|
43
|
+
row.locColumn,
|
|
44
|
+
row.stackTextId,
|
|
45
|
+
]);
|
|
46
|
+
const first = rows[0];
|
|
47
|
+
if (first === undefined) {
|
|
48
|
+
throw new Error('upsertConsoleLogItem: RETURNING yielded no row');
|
|
49
|
+
}
|
|
50
|
+
caches.consoleLogIds.set(hex, first.id);
|
|
51
|
+
return first.id;
|
|
52
|
+
}
|