@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,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decodes a stored HTML body BLOB to its UTF-8 bytes according to its codec
|
|
3
|
+
* marker, without building a JavaScript string.
|
|
4
|
+
*
|
|
5
|
+
* For consumers that hand the HTML straight to byte-oriented code (the
|
|
6
|
+
* `@nitpicker/core` native addon): going through `decodeStoredBlob`'s string
|
|
7
|
+
* would decode to UTF-16 and immediately re-encode to the same bytes, two
|
|
8
|
+
* full-size copies per page. Stored blobs are always `Buffer.from(html)`
|
|
9
|
+
* output, so the bytes are valid UTF-8 and identical to that round-trip.
|
|
10
|
+
*
|
|
11
|
+
* A zstd blob may decompress to at most `MAX_DECODED_SNAPSHOT_BYTES`, the
|
|
12
|
+
* same limit the native HTML scans apply, so a document that one path can
|
|
13
|
+
* decompress is one every path can. The error names no row; a reader that
|
|
14
|
+
* knows the page uses `decodePageHtmlBlobBytes`.
|
|
15
|
+
* @param body - Raw bytes as stored in `page_html_blobs.body`.
|
|
16
|
+
* @param codec - The `codec` column value (e.g. `'zstd'`, `'none'`).
|
|
17
|
+
* @returns The HTML as UTF-8 bytes.
|
|
18
|
+
* @throws {Error} If the codec is not recognised, or a zstd blob decompresses past the limit.
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* const bytes = decodeStoredBlobBytes(row.body, row.codec);
|
|
22
|
+
* computeBodyHash(bytes);
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare function decodeStoredBlobBytes(body: Uint8Array, codec: string): Buffer;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { zstdDecompressSync } from 'node:zlib';
|
|
2
|
+
import { MAX_DECODED_SNAPSHOT_BYTES } from '@nitpicker/core/max-decoded-snapshot-bytes';
|
|
3
|
+
/**
|
|
4
|
+
* Decodes a stored HTML body BLOB to its UTF-8 bytes according to its codec
|
|
5
|
+
* marker, without building a JavaScript string.
|
|
6
|
+
*
|
|
7
|
+
* For consumers that hand the HTML straight to byte-oriented code (the
|
|
8
|
+
* `@nitpicker/core` native addon): going through `decodeStoredBlob`'s string
|
|
9
|
+
* would decode to UTF-16 and immediately re-encode to the same bytes, two
|
|
10
|
+
* full-size copies per page. Stored blobs are always `Buffer.from(html)`
|
|
11
|
+
* output, so the bytes are valid UTF-8 and identical to that round-trip.
|
|
12
|
+
*
|
|
13
|
+
* A zstd blob may decompress to at most `MAX_DECODED_SNAPSHOT_BYTES`, the
|
|
14
|
+
* same limit the native HTML scans apply, so a document that one path can
|
|
15
|
+
* decompress is one every path can. The error names no row; a reader that
|
|
16
|
+
* knows the page uses `decodePageHtmlBlobBytes`.
|
|
17
|
+
* @param body - Raw bytes as stored in `page_html_blobs.body`.
|
|
18
|
+
* @param codec - The `codec` column value (e.g. `'zstd'`, `'none'`).
|
|
19
|
+
* @returns The HTML as UTF-8 bytes.
|
|
20
|
+
* @throws {Error} If the codec is not recognised, or a zstd blob decompresses past the limit.
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* const bytes = decodeStoredBlobBytes(row.body, row.codec);
|
|
24
|
+
* computeBodyHash(bytes);
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export function decodeStoredBlobBytes(body, codec) {
|
|
28
|
+
// `Buffer.from(buffer)` accepts Uint8Array, Buffer, and array-like
|
|
29
|
+
// shapes uniformly; libsql may hand back any of these for a BLOB
|
|
30
|
+
// column depending on the row encoding.
|
|
31
|
+
const buffer = Buffer.from(body);
|
|
32
|
+
if (codec === 'zstd') {
|
|
33
|
+
try {
|
|
34
|
+
return zstdDecompressSync(buffer, { maxOutputLength: MAX_DECODED_SNAPSHOT_BYTES });
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
if (error.code === 'ERR_BUFFER_TOO_LARGE') {
|
|
38
|
+
throw new Error(`The page_html_blobs blob decompresses to more than ${MAX_DECODED_SNAPSHOT_BYTES} bytes, the limit on one snapshot`, { cause: error });
|
|
39
|
+
}
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (codec === 'none') {
|
|
44
|
+
return buffer;
|
|
45
|
+
}
|
|
46
|
+
throw new Error(`Unknown page_html_blobs.codec: ${codec}`);
|
|
47
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { PageSource } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Decide which {@link PageSource} label a child row reached through the
|
|
4
|
+
* crawl graph (anchor placeholder, sub-resource, redirect chain
|
|
5
|
+
* intermediate) should inherit from its parent.
|
|
6
|
+
*
|
|
7
|
+
* Two simple rules, expressed once so anchor / redirect / sub-resource
|
|
8
|
+
* call sites stay in lockstep:
|
|
9
|
+
*
|
|
10
|
+
* 1. If the parent is in the inventory chain
|
|
11
|
+
* ({@link isInventorySource}) → propagate
|
|
12
|
+
* `'inventory-discovered'`. The child is itself a transitively
|
|
13
|
+
* reached node in the inventory chain; it is NOT a new seed (the
|
|
14
|
+
* seed label is reserved for URLs the operator listed in
|
|
15
|
+
* `--inventory ./list.txt`).
|
|
16
|
+
*
|
|
17
|
+
* 2. Otherwise → return `fallback`. The two production fallbacks differ
|
|
18
|
+
* by call site:
|
|
19
|
+
*
|
|
20
|
+
* - Anchor lineage passes `'crawled'` explicitly so the crawled-wins
|
|
21
|
+
* downgrade inside `resolveContentItemId` fires when the anchor reaches an
|
|
22
|
+
* existing `'inventory-*'` row.
|
|
23
|
+
* - Sub-resource emit passes `undefined` so the DB DEFAULT
|
|
24
|
+
* `'crawled'` lands on the freshly INSERTed `resources` row (the
|
|
25
|
+
* `setResources` path is INSERT-only with `onConflict.ignore()`, so
|
|
26
|
+
* no downgrade is needed).
|
|
27
|
+
* - Redirect chain intermediate uses `'crawled'` (same reason as
|
|
28
|
+
* anchor): an existing inventory-* intermediate reached by a
|
|
29
|
+
* crawled redirect chain must be downgraded.
|
|
30
|
+
*
|
|
31
|
+
* Pure function — keeps the lineage decision testable in isolation from
|
|
32
|
+
* the database transaction / event-emitter wiring that consumes it.
|
|
33
|
+
* @param parentSource - The parent page's stored `source` column (or `undefined` when no parent row exists).
|
|
34
|
+
* @param fallback - The label to return when the parent is NOT in the inventory chain. Pass `'crawled'` to enable the crawled-wins downgrade, or `undefined` to let the DB DEFAULT apply.
|
|
35
|
+
* @returns The lineage label to attach to the child row.
|
|
36
|
+
*/
|
|
37
|
+
export declare function deriveLineageFromParent(parentSource: PageSource | undefined, fallback: PageSource | undefined): PageSource | undefined;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { isInventorySource } from './is-inventory-source.js';
|
|
2
|
+
/**
|
|
3
|
+
* Decide which {@link PageSource} label a child row reached through the
|
|
4
|
+
* crawl graph (anchor placeholder, sub-resource, redirect chain
|
|
5
|
+
* intermediate) should inherit from its parent.
|
|
6
|
+
*
|
|
7
|
+
* Two simple rules, expressed once so anchor / redirect / sub-resource
|
|
8
|
+
* call sites stay in lockstep:
|
|
9
|
+
*
|
|
10
|
+
* 1. If the parent is in the inventory chain
|
|
11
|
+
* ({@link isInventorySource}) → propagate
|
|
12
|
+
* `'inventory-discovered'`. The child is itself a transitively
|
|
13
|
+
* reached node in the inventory chain; it is NOT a new seed (the
|
|
14
|
+
* seed label is reserved for URLs the operator listed in
|
|
15
|
+
* `--inventory ./list.txt`).
|
|
16
|
+
*
|
|
17
|
+
* 2. Otherwise → return `fallback`. The two production fallbacks differ
|
|
18
|
+
* by call site:
|
|
19
|
+
*
|
|
20
|
+
* - Anchor lineage passes `'crawled'` explicitly so the crawled-wins
|
|
21
|
+
* downgrade inside `resolveContentItemId` fires when the anchor reaches an
|
|
22
|
+
* existing `'inventory-*'` row.
|
|
23
|
+
* - Sub-resource emit passes `undefined` so the DB DEFAULT
|
|
24
|
+
* `'crawled'` lands on the freshly INSERTed `resources` row (the
|
|
25
|
+
* `setResources` path is INSERT-only with `onConflict.ignore()`, so
|
|
26
|
+
* no downgrade is needed).
|
|
27
|
+
* - Redirect chain intermediate uses `'crawled'` (same reason as
|
|
28
|
+
* anchor): an existing inventory-* intermediate reached by a
|
|
29
|
+
* crawled redirect chain must be downgraded.
|
|
30
|
+
*
|
|
31
|
+
* Pure function — keeps the lineage decision testable in isolation from
|
|
32
|
+
* the database transaction / event-emitter wiring that consumes it.
|
|
33
|
+
* @param parentSource - The parent page's stored `source` column (or `undefined` when no parent row exists).
|
|
34
|
+
* @param fallback - The label to return when the parent is NOT in the inventory chain. Pass `'crawled'` to enable the crawled-wins downgrade, or `undefined` to let the DB DEFAULT apply.
|
|
35
|
+
* @returns The lineage label to attach to the child row.
|
|
36
|
+
*/
|
|
37
|
+
export function deriveLineageFromParent(parentSource, fallback) {
|
|
38
|
+
if (isInventorySource(parentSource)) {
|
|
39
|
+
return 'inventory-discovered';
|
|
40
|
+
}
|
|
41
|
+
return fallback;
|
|
42
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Drops the five legacy write-model tables from a migrated archive. Reader
|
|
4
|
+
* and writer both operate exclusively on the entity / ref tables, so once
|
|
5
|
+
* the 0.13 populate has copied everything across (and
|
|
6
|
+
* `retargetLegacyFkTables` has repointed the adjunct FKs at
|
|
7
|
+
* `content_items`), the legacy tables are pure dead weight — dropping them
|
|
8
|
+
* reclaims the duplicated storage and removes the last consumers of the
|
|
9
|
+
* `pages(id)` id-space.
|
|
10
|
+
*
|
|
11
|
+
* **Requires `PRAGMA foreign_keys = OFF`** (asserted at runtime, because a
|
|
12
|
+
* caller that forgets the toggle would fail nondeterministically instead
|
|
13
|
+
* of loudly). Two reasons for the requirement:
|
|
14
|
+
*
|
|
15
|
+
* 1. `pages.redirectDestId` is a self-referential FK. With enforcement ON,
|
|
16
|
+
* `DROP TABLE` performs an implicit `DELETE FROM`, and deleting a
|
|
17
|
+
* redirect-destination row before its source row trips the constraint —
|
|
18
|
+
* whether the drop survives depends on row order, so archives with
|
|
19
|
+
* redirect chains can fail nondeterministically.
|
|
20
|
+
* 2. With enforcement OFF the implicit `DELETE FROM` is skipped entirely
|
|
21
|
+
* and SQLite reclaims each table as a whole b-tree — O(pages) row
|
|
22
|
+
* deletions become O(1) truncations, which matters at the several
|
|
23
|
+
* hundred-thousand-row scale real archives reach.
|
|
24
|
+
*
|
|
25
|
+
* The drops still run children-first (`resources-referrers` / `anchors` /
|
|
26
|
+
* `images` reference `pages` / `resources`) as defence in depth. Missing
|
|
27
|
+
* tables are skipped so the function is idempotent.
|
|
28
|
+
*
|
|
29
|
+
* Data-integrity of the surviving tables is asserted separately by
|
|
30
|
+
* `checkForeignKeyIntegrity` (`PRAGMA foreign_key_check` ignores the
|
|
31
|
+
* `foreign_keys` setting), which the migration script runs right after
|
|
32
|
+
* this function.
|
|
33
|
+
* @param trx - Knex transaction on the archive being migrated
|
|
34
|
+
* (`scripts/migrate-to-0.13.mjs` is the caller).
|
|
35
|
+
* @throws {Error} when the connection still has `PRAGMA foreign_keys = ON`
|
|
36
|
+
* (`foreign_keys` cannot change inside a transaction, so the caller must
|
|
37
|
+
* toggle it off before opening the transaction).
|
|
38
|
+
* @example
|
|
39
|
+
* await db.raw('PRAGMA foreign_keys = OFF');
|
|
40
|
+
* await db.transaction(async (trx) => {
|
|
41
|
+
* await dropLegacyTables(trx);
|
|
42
|
+
* });
|
|
43
|
+
* await db.raw('PRAGMA foreign_keys = ON');
|
|
44
|
+
*/
|
|
45
|
+
export declare function dropLegacyTables(trx: Knex): Promise<void>;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drops the five legacy write-model tables from a migrated archive. Reader
|
|
3
|
+
* and writer both operate exclusively on the entity / ref tables, so once
|
|
4
|
+
* the 0.13 populate has copied everything across (and
|
|
5
|
+
* `retargetLegacyFkTables` has repointed the adjunct FKs at
|
|
6
|
+
* `content_items`), the legacy tables are pure dead weight — dropping them
|
|
7
|
+
* reclaims the duplicated storage and removes the last consumers of the
|
|
8
|
+
* `pages(id)` id-space.
|
|
9
|
+
*
|
|
10
|
+
* **Requires `PRAGMA foreign_keys = OFF`** (asserted at runtime, because a
|
|
11
|
+
* caller that forgets the toggle would fail nondeterministically instead
|
|
12
|
+
* of loudly). Two reasons for the requirement:
|
|
13
|
+
*
|
|
14
|
+
* 1. `pages.redirectDestId` is a self-referential FK. With enforcement ON,
|
|
15
|
+
* `DROP TABLE` performs an implicit `DELETE FROM`, and deleting a
|
|
16
|
+
* redirect-destination row before its source row trips the constraint —
|
|
17
|
+
* whether the drop survives depends on row order, so archives with
|
|
18
|
+
* redirect chains can fail nondeterministically.
|
|
19
|
+
* 2. With enforcement OFF the implicit `DELETE FROM` is skipped entirely
|
|
20
|
+
* and SQLite reclaims each table as a whole b-tree — O(pages) row
|
|
21
|
+
* deletions become O(1) truncations, which matters at the several
|
|
22
|
+
* hundred-thousand-row scale real archives reach.
|
|
23
|
+
*
|
|
24
|
+
* The drops still run children-first (`resources-referrers` / `anchors` /
|
|
25
|
+
* `images` reference `pages` / `resources`) as defence in depth. Missing
|
|
26
|
+
* tables are skipped so the function is idempotent.
|
|
27
|
+
*
|
|
28
|
+
* Data-integrity of the surviving tables is asserted separately by
|
|
29
|
+
* `checkForeignKeyIntegrity` (`PRAGMA foreign_key_check` ignores the
|
|
30
|
+
* `foreign_keys` setting), which the migration script runs right after
|
|
31
|
+
* this function.
|
|
32
|
+
* @param trx - Knex transaction on the archive being migrated
|
|
33
|
+
* (`scripts/migrate-to-0.13.mjs` is the caller).
|
|
34
|
+
* @throws {Error} when the connection still has `PRAGMA foreign_keys = ON`
|
|
35
|
+
* (`foreign_keys` cannot change inside a transaction, so the caller must
|
|
36
|
+
* toggle it off before opening the transaction).
|
|
37
|
+
* @example
|
|
38
|
+
* await db.raw('PRAGMA foreign_keys = OFF');
|
|
39
|
+
* await db.transaction(async (trx) => {
|
|
40
|
+
* await dropLegacyTables(trx);
|
|
41
|
+
* });
|
|
42
|
+
* await db.raw('PRAGMA foreign_keys = ON');
|
|
43
|
+
*/
|
|
44
|
+
export async function dropLegacyTables(trx) {
|
|
45
|
+
const pragma = await trx.raw('PRAGMA foreign_keys');
|
|
46
|
+
if (pragma[0]?.foreign_keys === 1) {
|
|
47
|
+
throw new Error('dropLegacyTables: PRAGMA foreign_keys is ON — turn it OFF before the transaction. ' +
|
|
48
|
+
'With enforcement ON, dropping `pages` runs an implicit DELETE whose row order ' +
|
|
49
|
+
'can trip the redirectDestId self-FK nondeterministically.');
|
|
50
|
+
}
|
|
51
|
+
await trx.raw('DROP TABLE IF EXISTS "resources-referrers"');
|
|
52
|
+
await trx.raw('DROP TABLE IF EXISTS "anchors"');
|
|
53
|
+
await trx.raw('DROP TABLE IF EXISTS "images"');
|
|
54
|
+
await trx.raw('DROP TABLE IF EXISTS "resources"');
|
|
55
|
+
await trx.raw('DROP TABLE IF EXISTS "pages"');
|
|
56
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ErrorKind } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Classify a raw crawler/scraper error message into a coarse {@link ErrorKind}.
|
|
4
|
+
*
|
|
5
|
+
* Pure and deterministic: the same message always yields the same kind, which
|
|
6
|
+
* is why the kind is derived on read rather than persisted — it can be applied
|
|
7
|
+
* uniformly to freshly captured `crawl_errors`, legacy `error.log` lines, and
|
|
8
|
+
* `page_errors` alike.
|
|
9
|
+
* @param message - The raw error message (a single line is sufficient; the
|
|
10
|
+
* cause token such as `ENOTFOUND` or `Navigation timeout` lives there).
|
|
11
|
+
* @returns The matched kind, or `unknown` when no matcher applies.
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* classifyErrorKind('getaddrinfo ENOTFOUND www.example.com'); // 'dns'
|
|
15
|
+
* classifyErrorKind('gave up after 3 retries — Race 180,000ms'); // 'timeout'
|
|
16
|
+
* classifyErrorKind('Protocol error (Page.reload): Target closed'); // 'protocol'
|
|
17
|
+
* classifyErrorKind('Maximum number of redirects exceeded'); // 'redirect-loop'
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function classifyErrorKind(message: string): ErrorKind;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ordered message matchers. The first pattern that matches wins, so more
|
|
3
|
+
* specific transport causes (DNS, TLS, connection-*) are tested before the
|
|
4
|
+
* broader `protocol` / `timeout` buckets — e.g. `ETIMEDOUT` must classify as
|
|
5
|
+
* `connection-timeout`, not the page-level `timeout`, and a puppeteer
|
|
6
|
+
* `Protocol error` must not be swallowed by the `timeout` matcher.
|
|
7
|
+
*/
|
|
8
|
+
const MATCHERS = [
|
|
9
|
+
// `dns-transient` must be evaluated before `dns`: an `EAI_AGAIN` line also
|
|
10
|
+
// carries the `getaddrinfo` token, so the more specific transient pattern
|
|
11
|
+
// has to win. Splitting it out from `dns` keeps the DNS-burned host cache
|
|
12
|
+
// (which marks on `kind === 'dns'`) from punishing a host whose only sin
|
|
13
|
+
// was a local resolver hiccup.
|
|
14
|
+
{ kind: 'dns-transient', pattern: /EAI_AGAIN|\bEREFUSED\b/i },
|
|
15
|
+
{
|
|
16
|
+
kind: 'dns',
|
|
17
|
+
pattern: /ENOTFOUND|getaddrinfo|ERR_NAME_NOT_RESOLVED|ERR_NAME_RESOLUTION_FAILED/i,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
kind: 'tls',
|
|
21
|
+
// `Hostname/IP does not match certificate's altnames` is Node's
|
|
22
|
+
// node:tls hostname mismatch error and is emphatically a TLS issue;
|
|
23
|
+
// adding it here (alongside the OpenSSL / Chromium tokens) keeps
|
|
24
|
+
// hosts that serve the wrong-name cert (common with misconfigured
|
|
25
|
+
// edge / load-balancer setups) out of `unknown`. `altnames` is
|
|
26
|
+
// anchored to the preceding `certificate` token so a request whose
|
|
27
|
+
// error message merely mentions a path containing the substring
|
|
28
|
+
// `altnames` (e.g. `https://api.example.com/altnames/lookup` in a
|
|
29
|
+
// 5xx body) does NOT get misclassified into `tls` (which is a
|
|
30
|
+
// `PERMANENT_ERROR_KINDS` member — a false-positive would
|
|
31
|
+
// permanently exclude that page from `--retry-failed`).
|
|
32
|
+
pattern: /ERR_CERT|ERR_SSL|\bCERT_|SSL routines|ERR_BAD_SSL|UNABLE_TO_VERIFY|unable to verify|self.signed certificate|certificate has expired\s*$|\bERR_TLS|Hostname\/IP does not match certificate|certificate'?s? altnames/i,
|
|
33
|
+
},
|
|
34
|
+
{ kind: 'connection-refused', pattern: /ECONNREFUSED|ERR_CONNECTION_REFUSED/i },
|
|
35
|
+
{
|
|
36
|
+
kind: 'connection-reset',
|
|
37
|
+
pattern: /ECONNRESET|socket hang up|ERR_CONNECTION_RESET|ERR_CONNECTION_CLOSED|ERR_EMPTY_RESPONSE/i,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
kind: 'connection-timeout',
|
|
41
|
+
pattern: /ETIMEDOUT|ERR_CONNECTION_TIMED_OUT|ERR_TIMED_OUT/i,
|
|
42
|
+
},
|
|
43
|
+
// `local-network` is evaluated AFTER the connection-* matchers so a
|
|
44
|
+
// concrete cause (refused / reset / timeout) wins when both apply. Only
|
|
45
|
+
// "local network is unreachable / changed" symptoms — and the OS-level
|
|
46
|
+
// errors that surface them — land here. Short tokens (`EPIPE`, `EREFUSED`)
|
|
47
|
+
// are word-bounded so unrelated identifiers don't false-positive.
|
|
48
|
+
{
|
|
49
|
+
kind: 'local-network',
|
|
50
|
+
pattern: /ERR_INTERNET_DISCONNECTED|ERR_NETWORK_CHANGED|ERR_NETWORK_IO_SUSPENDED|ERR_ADDRESS_UNREACHABLE|ERR_NETWORK_UNREACHABLE|ENETUNREACH|EHOSTUNREACH|EADDRNOTAVAIL|ENOTCONN|\bEPIPE\b/i,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
kind: 'parse-error',
|
|
54
|
+
pattern: /Parse Error|Expected HTTP\/|Unexpected end of stream/i,
|
|
55
|
+
},
|
|
56
|
+
// `follow-redirects` (pinned at 1.16.0, `fetch-destination.ts`'s HEAD/GET
|
|
57
|
+
// pre-flight) throws exactly "Maximum number of redirects exceeded" —
|
|
58
|
+
// no cause token, no URL — when a chain never terminates within its
|
|
59
|
+
// `maxRedirects` budget. `ERR_TOO_MANY_REDIRECTS` is the equivalent
|
|
60
|
+
// Chromium net-error code, covering the same symptom surfaced through a
|
|
61
|
+
// puppeteer navigation instead of the Node HTTP client. Both mean the
|
|
62
|
+
// SAME thing: the site's own redirect configuration loops and will loop
|
|
63
|
+
// again on any future fetch, which is why this is deterministic (not a
|
|
64
|
+
// transient network condition) — see `PERMANENT_ERROR_KINDS`.
|
|
65
|
+
{
|
|
66
|
+
kind: 'redirect-loop',
|
|
67
|
+
pattern: /Maximum number of redirects exceeded|ERR_TOO_MANY_REDIRECTS/i,
|
|
68
|
+
},
|
|
69
|
+
// `client-blocked` covers Chromium's ERR_BLOCKED_* family — the browser
|
|
70
|
+
// actively decided to reject the request (ad/tracker heuristics, CSP,
|
|
71
|
+
// CORB / ORB, administrator block list, fingerprinting protection,
|
|
72
|
+
// cleartext policy, …). Per the upstream `net/base/net_error_list.h`,
|
|
73
|
+
// `ERR_BLOCKED_BY_CLIENT` is documented as "The client chose to block
|
|
74
|
+
// the request." — i.e. the server was never the deciding party. Listed
|
|
75
|
+
// before `protocol` so puppeteer's generic "Protocol error" wrapper
|
|
76
|
+
// (which sometimes embeds the underlying net error code) is correctly
|
|
77
|
+
// attributed to the blocked layer rather than the protocol layer.
|
|
78
|
+
{
|
|
79
|
+
kind: 'client-blocked',
|
|
80
|
+
pattern: /ERR_BLOCKED_BY_CLIENT|ERR_BLOCKED_BY_ADMINISTRATOR|ERR_BLOCKED_IN_INCOGNITO_BY_ADMINISTRATOR|ERR_BLOCKED_BY_RESPONSE|ERR_BLOCKED_BY_CSP|ERR_BLOCKED_BY_ORB|ERR_BLOCKED_BY_FINGERPRINTING_PROTECTION|ERR_CLEARTEXT_NOT_PERMITTED|ERR_NETWORK_ACCESS_REVOKED/i,
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
kind: 'protocol',
|
|
84
|
+
// `detached frame` is anchored to puppeteer's exact prefix
|
|
85
|
+
// `Attempted to use detached Frame` (its current Frame.ts
|
|
86
|
+
// emitter; the `i` flag below catches the lowercase variant
|
|
87
|
+
// automatically), not the bare two-token substring. The bare
|
|
88
|
+
// form would match unrelated diagnostics like a console message
|
|
89
|
+
// "detached frame ref leaked" echoed through a logger. The older
|
|
90
|
+
// Page-domain `frame (?:was |got )?detached` form is kept as a
|
|
91
|
+
// separate alternative because Chromium still surfaces that
|
|
92
|
+
// phrasing in some legacy code paths. Without one of these, the
|
|
93
|
+
// "Attempted to use detached Frame ..." messages observed on a
|
|
94
|
+
// real archive would slip into `unknown`.
|
|
95
|
+
pattern: /Protocol error|Target closed|Session closed|Execution context was destroyed|frame (?:was |got )?detached|Attempted to use detached frame|Navigating frame was detached|Cannot find context|Node with given id|Page\.\w+ returned/i,
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
kind: 'timeout',
|
|
99
|
+
// `Timeout: https?:` matches the NetTimeoutError "Timeout: <url>"
|
|
100
|
+
// form. Looking for the URL-shaped tail (rather than anchoring at
|
|
101
|
+
// line start) is what lets us catch the beholder-wrapped variant
|
|
102
|
+
// `[Retried N times] Timeout: https://...` that gets stored in
|
|
103
|
+
// `crawl_errors` / `error.log` after retry exhaustion — the bare
|
|
104
|
+
// `^Timeout:` form would only fire on the immediate failure and
|
|
105
|
+
// miss every retry-exhausted record (the ones that actually land
|
|
106
|
+
// in the archive). Required for slow-server timeouts that
|
|
107
|
+
// previously fell into `unknown`.
|
|
108
|
+
pattern: /Race \d|Navigation timeout|timeout of \d+\s*ms exceeded|TimeoutError|Timed out|Timeout: https?:/i,
|
|
109
|
+
},
|
|
110
|
+
];
|
|
111
|
+
/**
|
|
112
|
+
* Classify a raw crawler/scraper error message into a coarse {@link ErrorKind}.
|
|
113
|
+
*
|
|
114
|
+
* Pure and deterministic: the same message always yields the same kind, which
|
|
115
|
+
* is why the kind is derived on read rather than persisted — it can be applied
|
|
116
|
+
* uniformly to freshly captured `crawl_errors`, legacy `error.log` lines, and
|
|
117
|
+
* `page_errors` alike.
|
|
118
|
+
* @param message - The raw error message (a single line is sufficient; the
|
|
119
|
+
* cause token such as `ENOTFOUND` or `Navigation timeout` lives there).
|
|
120
|
+
* @returns The matched kind, or `unknown` when no matcher applies.
|
|
121
|
+
* @example
|
|
122
|
+
* ```ts
|
|
123
|
+
* classifyErrorKind('getaddrinfo ENOTFOUND www.example.com'); // 'dns'
|
|
124
|
+
* classifyErrorKind('gave up after 3 retries — Race 180,000ms'); // 'timeout'
|
|
125
|
+
* classifyErrorKind('Protocol error (Page.reload): Target closed'); // 'protocol'
|
|
126
|
+
* classifyErrorKind('Maximum number of redirects exceeded'); // 'redirect-loop'
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
129
|
+
export function classifyErrorKind(message) {
|
|
130
|
+
for (const { kind, pattern } of MATCHERS) {
|
|
131
|
+
if (pattern.test(message)) {
|
|
132
|
+
return kind;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return 'unknown';
|
|
136
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ErrorKind } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* `ErrorKind`s that plausibly indicate trouble with the operator's own
|
|
4
|
+
* network path rather than a genuinely dead or misconfigured target site.
|
|
5
|
+
*
|
|
6
|
+
* Single source of truth shared by two consumers that must agree on
|
|
7
|
+
* exactly the same set:
|
|
8
|
+
*
|
|
9
|
+
* - `NetworkOutageDetector` — only these kinds contribute to the sliding
|
|
10
|
+
* window that detects a suspect outage.
|
|
11
|
+
* - `evict-network-classified-destination-cache-entries.ts` — on recovery,
|
|
12
|
+
* only `destinationCache` entries whose cached `Error` classifies into
|
|
13
|
+
* one of these kinds are evicted (a cached `tls` or `client-blocked`
|
|
14
|
+
* failure is a site-specific fact and must survive an outage recovery
|
|
15
|
+
* unrelated to it).
|
|
16
|
+
*
|
|
17
|
+
* `dns` is included despite `permanent-error-kinds.ts` treating it as a
|
|
18
|
+
* permanent, site-specific verdict in isolation — that classification is
|
|
19
|
+
* exactly what outage detection exists to override when the surrounding
|
|
20
|
+
* evidence (many hosts, tight time window) points to the local network
|
|
21
|
+
* instead.
|
|
22
|
+
*/
|
|
23
|
+
export declare const NETWORK_RELATED_ERROR_KINDS: ReadonlySet<ErrorKind>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ErrorKind`s that plausibly indicate trouble with the operator's own
|
|
3
|
+
* network path rather than a genuinely dead or misconfigured target site.
|
|
4
|
+
*
|
|
5
|
+
* Single source of truth shared by two consumers that must agree on
|
|
6
|
+
* exactly the same set:
|
|
7
|
+
*
|
|
8
|
+
* - `NetworkOutageDetector` — only these kinds contribute to the sliding
|
|
9
|
+
* window that detects a suspect outage.
|
|
10
|
+
* - `evict-network-classified-destination-cache-entries.ts` — on recovery,
|
|
11
|
+
* only `destinationCache` entries whose cached `Error` classifies into
|
|
12
|
+
* one of these kinds are evicted (a cached `tls` or `client-blocked`
|
|
13
|
+
* failure is a site-specific fact and must survive an outage recovery
|
|
14
|
+
* unrelated to it).
|
|
15
|
+
*
|
|
16
|
+
* `dns` is included despite `permanent-error-kinds.ts` treating it as a
|
|
17
|
+
* permanent, site-specific verdict in isolation — that classification is
|
|
18
|
+
* exactly what outage detection exists to override when the surrounding
|
|
19
|
+
* evidence (many hosts, tight time window) points to the local network
|
|
20
|
+
* instead.
|
|
21
|
+
*/
|
|
22
|
+
export const NETWORK_RELATED_ERROR_KINDS = new Set([
|
|
23
|
+
'dns',
|
|
24
|
+
'dns-transient',
|
|
25
|
+
'local-network',
|
|
26
|
+
'connection-timeout',
|
|
27
|
+
'connection-reset',
|
|
28
|
+
]);
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { ErrorKind } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Error kinds whose failure mode is **persistent** — re-fetching the same URL
|
|
4
|
+
* (without changing the network, the certificate, the destination host, or the
|
|
5
|
+
* browser's block-list state) will almost certainly produce the same failure.
|
|
6
|
+
*
|
|
7
|
+
* Used by `resetFailedPages` to exclude pages whose latest recorded error
|
|
8
|
+
* falls in this set, so `--retry-failed` actually converges: without the
|
|
9
|
+
* exclusion, NXDOMAIN / TLS mismatch / `ERR_BLOCKED_BY_CLIENT` /
|
|
10
|
+
* `ECONNREFUSED` / HTTP parse-error / redirect-loop pages would be reset to
|
|
11
|
+
* pending on every iteration, the crawler would re-attempt them, they would
|
|
12
|
+
* fail again the same way, and the retry-target count would stay constant
|
|
13
|
+
* forever.
|
|
14
|
+
*
|
|
15
|
+
* Why these six and not others:
|
|
16
|
+
* - **dns** — `ENOTFOUND` / `ERR_NAME_NOT_RESOLVED` are authoritative DNS
|
|
17
|
+
* answers; the host is gone (or never existed). EAI_AGAIN is split out as
|
|
18
|
+
* `dns-transient` precisely so it is NOT in this set.
|
|
19
|
+
* - **tls** — cert expiry / SAN mismatch / SSL protocol errors require the
|
|
20
|
+
* server operator to fix something; retrying within the same archive run
|
|
21
|
+
* cannot succeed.
|
|
22
|
+
* - **client-blocked** — Chromium's `ERR_BLOCKED_*` family is a deliberate
|
|
23
|
+
* browser-side rejection; the request will be blocked identically every
|
|
24
|
+
* time the browser sees the same URL.
|
|
25
|
+
* - **parse-error** — the server's HTTP response is malformed (`Expected
|
|
26
|
+
* HTTP/, RTSP/ or ICE/`, `Unexpected end of stream`). Retrying the same
|
|
27
|
+
* request hits the same parser failure.
|
|
28
|
+
* - **connection-refused** — `ECONNREFUSED` is an authoritative TCP RST from
|
|
29
|
+
* the listener; either no process is listening on the port or its accept
|
|
30
|
+
* queue rejected the connection. Either way the answer is final until the
|
|
31
|
+
* server operator intervenes.
|
|
32
|
+
* - **redirect-loop** — `Maximum number of redirects exceeded` /
|
|
33
|
+
* `ERR_TOO_MANY_REDIRECTS` means the site's own redirect chain never
|
|
34
|
+
* terminates; the exact same chain is served on every future fetch until
|
|
35
|
+
* the site operator fixes it.
|
|
36
|
+
*
|
|
37
|
+
* Notably absent (intentionally retryable):
|
|
38
|
+
* - `connection-reset` / `connection-timeout` — could be middlebox or
|
|
39
|
+
* transient overload
|
|
40
|
+
* - `dns-transient` (EAI_AGAIN / EREFUSED) — local resolver hiccup
|
|
41
|
+
* - `local-network` — operator-side connectivity loss
|
|
42
|
+
* - `timeout` — slow but reachable server (HEAD-timeout escalation gives
|
|
43
|
+
* these a real chance)
|
|
44
|
+
* - `protocol` — puppeteer lifecycle race, often recovers on retry
|
|
45
|
+
* - `unknown` — by definition we don't know it's permanent, so we keep
|
|
46
|
+
* retrying (errs on the side of investigating)
|
|
47
|
+
*/
|
|
48
|
+
export declare const PERMANENT_ERROR_KINDS: ReadonlySet<ErrorKind>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error kinds whose failure mode is **persistent** — re-fetching the same URL
|
|
3
|
+
* (without changing the network, the certificate, the destination host, or the
|
|
4
|
+
* browser's block-list state) will almost certainly produce the same failure.
|
|
5
|
+
*
|
|
6
|
+
* Used by `resetFailedPages` to exclude pages whose latest recorded error
|
|
7
|
+
* falls in this set, so `--retry-failed` actually converges: without the
|
|
8
|
+
* exclusion, NXDOMAIN / TLS mismatch / `ERR_BLOCKED_BY_CLIENT` /
|
|
9
|
+
* `ECONNREFUSED` / HTTP parse-error / redirect-loop pages would be reset to
|
|
10
|
+
* pending on every iteration, the crawler would re-attempt them, they would
|
|
11
|
+
* fail again the same way, and the retry-target count would stay constant
|
|
12
|
+
* forever.
|
|
13
|
+
*
|
|
14
|
+
* Why these six and not others:
|
|
15
|
+
* - **dns** — `ENOTFOUND` / `ERR_NAME_NOT_RESOLVED` are authoritative DNS
|
|
16
|
+
* answers; the host is gone (or never existed). EAI_AGAIN is split out as
|
|
17
|
+
* `dns-transient` precisely so it is NOT in this set.
|
|
18
|
+
* - **tls** — cert expiry / SAN mismatch / SSL protocol errors require the
|
|
19
|
+
* server operator to fix something; retrying within the same archive run
|
|
20
|
+
* cannot succeed.
|
|
21
|
+
* - **client-blocked** — Chromium's `ERR_BLOCKED_*` family is a deliberate
|
|
22
|
+
* browser-side rejection; the request will be blocked identically every
|
|
23
|
+
* time the browser sees the same URL.
|
|
24
|
+
* - **parse-error** — the server's HTTP response is malformed (`Expected
|
|
25
|
+
* HTTP/, RTSP/ or ICE/`, `Unexpected end of stream`). Retrying the same
|
|
26
|
+
* request hits the same parser failure.
|
|
27
|
+
* - **connection-refused** — `ECONNREFUSED` is an authoritative TCP RST from
|
|
28
|
+
* the listener; either no process is listening on the port or its accept
|
|
29
|
+
* queue rejected the connection. Either way the answer is final until the
|
|
30
|
+
* server operator intervenes.
|
|
31
|
+
* - **redirect-loop** — `Maximum number of redirects exceeded` /
|
|
32
|
+
* `ERR_TOO_MANY_REDIRECTS` means the site's own redirect chain never
|
|
33
|
+
* terminates; the exact same chain is served on every future fetch until
|
|
34
|
+
* the site operator fixes it.
|
|
35
|
+
*
|
|
36
|
+
* Notably absent (intentionally retryable):
|
|
37
|
+
* - `connection-reset` / `connection-timeout` — could be middlebox or
|
|
38
|
+
* transient overload
|
|
39
|
+
* - `dns-transient` (EAI_AGAIN / EREFUSED) — local resolver hiccup
|
|
40
|
+
* - `local-network` — operator-side connectivity loss
|
|
41
|
+
* - `timeout` — slow but reachable server (HEAD-timeout escalation gives
|
|
42
|
+
* these a real chance)
|
|
43
|
+
* - `protocol` — puppeteer lifecycle race, often recovers on retry
|
|
44
|
+
* - `unknown` — by definition we don't know it's permanent, so we keep
|
|
45
|
+
* retrying (errs on the side of investigating)
|
|
46
|
+
*/
|
|
47
|
+
export const PERMANENT_ERROR_KINDS = new Set([
|
|
48
|
+
'dns',
|
|
49
|
+
'tls',
|
|
50
|
+
'client-blocked',
|
|
51
|
+
'parse-error',
|
|
52
|
+
'connection-refused',
|
|
53
|
+
'redirect-loop',
|
|
54
|
+
]);
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coarse cause of a crawl/scrape failure.
|
|
3
|
+
*
|
|
4
|
+
* The crawler stores only the raw error message (in `crawl_errors`,
|
|
5
|
+
* `page_errors`, or `error.log`); the cause is derived on read by
|
|
6
|
+
* `classifyErrorKind`, so existing archives gain classification without a
|
|
7
|
+
* re-crawl.
|
|
8
|
+
*
|
|
9
|
+
* Owned by the archive package because the crawler (for DNS-burned host
|
|
10
|
+
* caching), the archive layer itself (`--retry-failed` candidate selection)
|
|
11
|
+
* and `@nitpicker/query` (for `getErrorKinds` / `getSummary`) all need to
|
|
12
|
+
* classify error messages, and both crawler and query depend on archive
|
|
13
|
+
* (crawler cannot depend on query).
|
|
14
|
+
*
|
|
15
|
+
* ### transient vs persistent
|
|
16
|
+
*
|
|
17
|
+
* | kind | transient? | DNS-burn? | notes |
|
|
18
|
+
* | --- | --- | --- | --- |
|
|
19
|
+
* | `dns` | no | yes | NXDOMAIN; the host does not resolve at all |
|
|
20
|
+
* | `dns-transient` | **yes** | no | `EAI_AGAIN`; local resolver hiccup, retry often recovers |
|
|
21
|
+
* | `tls` | no | no | certificate issue, usually persistent until cert rotates |
|
|
22
|
+
* | `connection-refused` | mostly persistent | no | server actively rejecting on this port |
|
|
23
|
+
* | `connection-reset` | yes | no | TCP reset mid-stream, often transient |
|
|
24
|
+
* | `connection-timeout` | yes | no | TCP-level timeout (`ETIMEDOUT`); slow but reachable |
|
|
25
|
+
* | `local-network` | **yes** | no | local machine's network is unreachable / changed (WiFi, sleep, ICMP-unreachable, …) |
|
|
26
|
+
* | `parse-error` | mostly persistent | no | HTTP response could not be parsed (proxy, garbage, MITM) |
|
|
27
|
+
* | `client-blocked` | persistent (per browser) | no | Chromium-side `ERR_BLOCKED_BY_*` family — the browser actively refused the request (ad/tracker heuristics, CSP, CORP, administrator block list, …) |
|
|
28
|
+
* | `redirect-loop` | no | no | the redirect chain exceeded `follow-redirects`' `maxRedirects` limit — the site's own redirect configuration never converges |
|
|
29
|
+
* | `protocol` | yes | no | puppeteer protocol layer (frame detached, target closed, …) |
|
|
30
|
+
* | `timeout` | yes | no | puppeteer navigation timeout or HEAD pre-flight race timeout (`Timeout: <url>`) |
|
|
31
|
+
* | `unknown` | unknown | no | catch-all for messages no matcher recognised |
|
|
32
|
+
*
|
|
33
|
+
* Only `dns` is mark-target for the DNS-burned host cache; everything else is
|
|
34
|
+
* either too transient to burn (network glitch / browser hiccup) or too
|
|
35
|
+
* server-specific to extrapolate to "this whole host is dead."
|
|
36
|
+
*
|
|
37
|
+
* ### Derived constants that MUST be reviewed when this union changes
|
|
38
|
+
*
|
|
39
|
+
* - `PERMANENT_ERROR_KINDS` (`permanent-error-kinds.ts`) — the set of kinds
|
|
40
|
+
* excluded from `--retry-failed` so retry iterations actually converge.
|
|
41
|
+
* A new kind that is deterministically permanent (server-state, cert,
|
|
42
|
+
* browser-block, …) likely belongs here.
|
|
43
|
+
* - `PUPPETEER_FALLBACK_KINDS` (`@nitpicker/crawler`'s
|
|
44
|
+
* `crawler/is-puppeteer-fallback-candidate.ts`) — the set of kinds where
|
|
45
|
+
* one puppeteer attempt has a realistic chance of succeeding after
|
|
46
|
+
* HEAD+GET pre-flight exhausted retries. A new kind modelling a
|
|
47
|
+
* middlebox / WAF / slow-server quirk likely belongs here.
|
|
48
|
+
*
|
|
49
|
+
* Adding a kind without reviewing both sets risks a silent regression:
|
|
50
|
+
* `--retry-failed` re-trying a permanent failure forever (no PERMANENT
|
|
51
|
+
* entry), or a recoverable URL never reaching the puppeteer fallback (no
|
|
52
|
+
* PUPPETEER_FALLBACK entry).
|
|
53
|
+
*/
|
|
54
|
+
export type ErrorKind = 'dns' | 'dns-transient' | 'connection-refused' | 'connection-reset' | 'connection-timeout' | 'tls' | 'local-network' | 'parse-error' | 'client-blocked' | 'redirect-loop' | 'timeout' | 'protocol' | 'unknown';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Appends text data to a file at the specified path.
|
|
3
|
+
*
|
|
4
|
+
* Creates parent directories if they do not exist.
|
|
5
|
+
* A newline character is prepended to the data before appending.
|
|
6
|
+
* @param filePath - The absolute or relative path to the file to append to.
|
|
7
|
+
* @param data - The text content to append to the file.
|
|
8
|
+
*/
|
|
9
|
+
export declare function appendText(filePath: string, data: string): Promise<void>;
|