@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,236 @@
|
|
|
1
|
+
import { createTemplateClassificationRun } from '@nitpicker/core/create-template-classification-run';
|
|
2
|
+
/** Pages whose signals are handed to the run per call. */
|
|
3
|
+
const SIGNALS_PER_BATCH = 1000;
|
|
4
|
+
/**
|
|
5
|
+
* Pages a read uses handed to the native run per call (the pages it does
|
|
6
|
+
* not use ride along without counting): enough to keep its thread pool busy
|
|
7
|
+
* on one call, few enough that the next batch is read while it runs. Only
|
|
8
|
+
* throughput depends on it, never the keys.
|
|
9
|
+
*/
|
|
10
|
+
const PAGES_PER_BATCH = 64;
|
|
11
|
+
/**
|
|
12
|
+
* HTML (in UTF-16 code units) handed to the native run per call, at most, so
|
|
13
|
+
* a batch of unusually large pages does not hold their copies all at once.
|
|
14
|
+
* Only memory and throughput depend on it, never the keys.
|
|
15
|
+
*/
|
|
16
|
+
const HTML_PER_BATCH = 32 * 1024 * 1024;
|
|
17
|
+
/**
|
|
18
|
+
* Pages whose HTML is being read at once, ahead of the one the batch takes
|
|
19
|
+
* next. Each read is a database query and a decompression, so one at a time
|
|
20
|
+
* leaves the native run waiting for the next batch (on a ~178,000-page
|
|
21
|
+
* archive, reading ahead took classification from 139 s to 110 s); a few at
|
|
22
|
+
* a time keeps it busy while bounding the HTML held in flight. Only
|
|
23
|
+
* throughput and memory depend on it, never the keys (pages still enter
|
|
24
|
+
* batches in order).
|
|
25
|
+
*/
|
|
26
|
+
const HTML_READ_AHEAD = 16;
|
|
27
|
+
/** What a page a read does not use is handed over as. */
|
|
28
|
+
const UNUSED_PAGE = Object.freeze({ html: '' });
|
|
29
|
+
/**
|
|
30
|
+
* The error for a factory that yields a different corpus on a later read.
|
|
31
|
+
* @param produced How many pages the read produced: its exact count, or
|
|
32
|
+
* `{ moreThan }` the first read's count when it was cut short at the
|
|
33
|
+
* first page beyond it (the rest is not read).
|
|
34
|
+
* @param expected
|
|
35
|
+
*/
|
|
36
|
+
function factoryMismatch(produced, expected) {
|
|
37
|
+
const producedText = typeof produced === 'number'
|
|
38
|
+
? `${produced} pages`
|
|
39
|
+
: `more than ${produced.moreThan} pages`;
|
|
40
|
+
return new Error(`resolvePageClusterKeys: a read of the page factory produced ${producedText} but the first read saw ${expected} — the factory must produce the same pages in the same order on every call`);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The page as one read hands it to the run: its HTML and content-root hint
|
|
44
|
+
* when the read uses it, the shared empty page otherwise.
|
|
45
|
+
* @param page
|
|
46
|
+
* @param used
|
|
47
|
+
*/
|
|
48
|
+
async function toPageHtml(page, used) {
|
|
49
|
+
if (!used) {
|
|
50
|
+
// A page the read does not use costs the run nothing, so it only holds
|
|
51
|
+
// its place in the corpus order.
|
|
52
|
+
return UNUSED_PAGE;
|
|
53
|
+
}
|
|
54
|
+
const html = await page.getHtml();
|
|
55
|
+
return {
|
|
56
|
+
html,
|
|
57
|
+
...(page.contentRoot ? { contentRoot: page.contentRoot } : {}),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Reads `pages` once and hands them to `push` in batches, reading the HTML
|
|
62
|
+
* only of the pages `mask` marks (the others go with empty HTML, which the
|
|
63
|
+
* run does not read). The HTML of up to {@link HTML_READ_AHEAD} pages is read
|
|
64
|
+
* at once, and a batch is read while the previous one is processed (the
|
|
65
|
+
* native run works off Node's main thread); each push is awaited before the
|
|
66
|
+
* next one starts, as the run requires.
|
|
67
|
+
*
|
|
68
|
+
* Only the page count is checked against the first read: a factory yielding
|
|
69
|
+
* as many pages but different ones, or in another order, goes unnoticed.
|
|
70
|
+
* @param read
|
|
71
|
+
* @param read.pages
|
|
72
|
+
* @param read.mask The run's `pageMask()` for this read; its length is the
|
|
73
|
+
* page count of the first read.
|
|
74
|
+
* @param read.push
|
|
75
|
+
*/
|
|
76
|
+
async function streamPages(read) {
|
|
77
|
+
const { pages, mask, push } = read;
|
|
78
|
+
let inFlight = Promise.resolve();
|
|
79
|
+
let batch = [];
|
|
80
|
+
let usedInBatch = 0;
|
|
81
|
+
let batchLength = 0;
|
|
82
|
+
let pagesRead = 0;
|
|
83
|
+
const reading = [];
|
|
84
|
+
let pushFailure;
|
|
85
|
+
const flush = async () => {
|
|
86
|
+
await inFlight;
|
|
87
|
+
inFlight = push(batch);
|
|
88
|
+
// Read on while it runs; a rejection is noted here (so it does not
|
|
89
|
+
// count as unhandled) and stops the reading at the next page.
|
|
90
|
+
inFlight.catch((error) => {
|
|
91
|
+
pushFailure ??= { error };
|
|
92
|
+
});
|
|
93
|
+
batch = [];
|
|
94
|
+
usedInBatch = 0;
|
|
95
|
+
batchLength = 0;
|
|
96
|
+
};
|
|
97
|
+
const takeNext = async () => {
|
|
98
|
+
const entry = await reading.shift();
|
|
99
|
+
batch.push(entry);
|
|
100
|
+
if (entry === UNUSED_PAGE)
|
|
101
|
+
return;
|
|
102
|
+
usedInBatch++;
|
|
103
|
+
batchLength += entry.html.length;
|
|
104
|
+
if (usedInBatch >= PAGES_PER_BATCH || batchLength >= HTML_PER_BATCH) {
|
|
105
|
+
await flush();
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
try {
|
|
109
|
+
for await (const page of pages()) {
|
|
110
|
+
if (pushFailure)
|
|
111
|
+
throw pushFailure.error;
|
|
112
|
+
if (pagesRead >= mask.length) {
|
|
113
|
+
throw factoryMismatch({ moreThan: mask.length }, mask.length);
|
|
114
|
+
}
|
|
115
|
+
const entry = toPageHtml(page, mask[pagesRead] === 1);
|
|
116
|
+
// Awaited in order by `takeNext`; until then a rejection must not
|
|
117
|
+
// count as unhandled.
|
|
118
|
+
entry.catch(() => { });
|
|
119
|
+
reading.push(entry);
|
|
120
|
+
pagesRead++;
|
|
121
|
+
if (reading.length > HTML_READ_AHEAD) {
|
|
122
|
+
await takeNext();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
while (reading.length > 0) {
|
|
126
|
+
await takeNext();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
// Let the running call and the HTML reads already started settle
|
|
131
|
+
// before the caller cancels the run (and perhaps closes the archive),
|
|
132
|
+
// so nothing is left working on a run that is being given up.
|
|
133
|
+
await inFlight.catch(() => { });
|
|
134
|
+
await Promise.allSettled(reading);
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
if (batch.length > 0) {
|
|
138
|
+
await flush();
|
|
139
|
+
}
|
|
140
|
+
await inFlight;
|
|
141
|
+
if (pagesRead !== mask.length) {
|
|
142
|
+
throw factoryMismatch(pagesRead, mask.length);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Reads every page's blocking signals into `run`, reporting every 1,000
|
|
147
|
+
* pages.
|
|
148
|
+
* @param read
|
|
149
|
+
* @param read.pages
|
|
150
|
+
* @param read.run
|
|
151
|
+
* @param read.onProgress
|
|
152
|
+
*/
|
|
153
|
+
async function pushSignals(read) {
|
|
154
|
+
const { pages, run, onProgress } = read;
|
|
155
|
+
let pagesSeen = 0;
|
|
156
|
+
let batch = [];
|
|
157
|
+
for await (const page of pages()) {
|
|
158
|
+
if (onProgress && pagesSeen > 0 && pagesSeen % SIGNALS_PER_BATCH === 0) {
|
|
159
|
+
onProgress({ phase: 'pass0-signals', pagesSeen });
|
|
160
|
+
}
|
|
161
|
+
pagesSeen++;
|
|
162
|
+
batch.push(page);
|
|
163
|
+
if (batch.length >= SIGNALS_PER_BATCH) {
|
|
164
|
+
run.pushSignals(batch);
|
|
165
|
+
batch = [];
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
run.pushSignals(batch);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Clusters pages into templates by DOM structure, in the native addon
|
|
172
|
+
* (`@nitpicker/core`'s `createTemplateClassificationRun`):
|
|
173
|
+
*
|
|
174
|
+
* - **Pass 0** splits the corpus into blocks by URL section and first-party
|
|
175
|
+
* stylesheets, from the signals alone — no HTML.
|
|
176
|
+
* - **Stage A** clusters each block: landmark chrome is cut out, the content
|
|
177
|
+
* depth is capped at the block's knee, and complete-linkage clustering
|
|
178
|
+
* with a max-gap cut splits the block.
|
|
179
|
+
* - **Stage B** merges clusters across blocks and explains each final one.
|
|
180
|
+
*
|
|
181
|
+
* A block is clustered whole unless its Stage A similarity table
|
|
182
|
+
* (`n * (n - 1) / 2 * 8` bytes for `n` pages) exceeds `options.memoryBudget`,
|
|
183
|
+
* or the blocks clustered whole would hold more than
|
|
184
|
+
* `TEMPLATE_EXACT_PAGE_LIMIT` pages together (the largest are then sampled
|
|
185
|
+
* until they fit); a sampled block is clustered on a sample and a further
|
|
186
|
+
* read assigns its other pages. The factory is read twice (signals, HTML)
|
|
187
|
+
* or, with a sampled block that has pages outside its sample, three times; each page's HTML is read
|
|
188
|
+
* once, and JavaScript never holds the whole corpus's HTML.
|
|
189
|
+
* @param pages
|
|
190
|
+
* @param options
|
|
191
|
+
* @example
|
|
192
|
+
* ```ts
|
|
193
|
+
* const { keys, reasons } = await resolvePageClusterKeys(() => [
|
|
194
|
+
* { paths: ['news', '1'], stylesheetHrefs: [], getHtml: () => '<body><article>one</article></body>' },
|
|
195
|
+
* { paths: ['news', '2'], stylesheetHrefs: [], getHtml: () => '<body><article>two</article></body>' },
|
|
196
|
+
* { paths: ['about'], stylesheetHrefs: [], getHtml: () => '<body><section>about</section></body>' },
|
|
197
|
+
* ]);
|
|
198
|
+
* // keys: ['["path:news","cluster:0"]', '["path:news","cluster:0"]', '["path:about","cluster:0"]']
|
|
199
|
+
* // reasons: one per cluster key, e.g. reasons.get('["path:about","cluster:0"]')?.memberCount === 1
|
|
200
|
+
* ```
|
|
201
|
+
*/
|
|
202
|
+
export async function resolvePageClusterKeys(pages, options) {
|
|
203
|
+
const onProgress = options?.onProgress;
|
|
204
|
+
const memoryBudget = options?.memoryBudget;
|
|
205
|
+
const run = createTemplateClassificationRun({
|
|
206
|
+
...(memoryBudget === undefined ? {} : { memoryBudget }),
|
|
207
|
+
...(onProgress ? { onProgress } : {}),
|
|
208
|
+
});
|
|
209
|
+
try {
|
|
210
|
+
await pushSignals({ pages, run, onProgress });
|
|
211
|
+
await run.block();
|
|
212
|
+
await streamPages({
|
|
213
|
+
pages,
|
|
214
|
+
mask: run.pageMask(),
|
|
215
|
+
push: (batch) => run.pushPages(batch),
|
|
216
|
+
});
|
|
217
|
+
await run.finishPages();
|
|
218
|
+
if (run.needsAssignment()) {
|
|
219
|
+
await streamPages({
|
|
220
|
+
pages,
|
|
221
|
+
mask: run.pageMask(),
|
|
222
|
+
push: (batch) => run.pushAssignmentPages(batch),
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
const output = await run.takeOutput();
|
|
226
|
+
return {
|
|
227
|
+
keys: Array.from(output.keyOfPage, (key) => output.keys[key]),
|
|
228
|
+
reasons: output.reasons,
|
|
229
|
+
sampledBlocks: output.sampledBlocks,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
run.cancel();
|
|
234
|
+
throw error;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import type { ContentRootHint, TemplateClassificationRun, TemplateClusterReason, TemplatePageHtml, TemplateSampledBlock } from '@nitpicker/core/types';
|
|
2
|
+
/**
|
|
3
|
+
* One page as `resolvePageClusterKeys` reads it: the blocking signals, read
|
|
4
|
+
* on every pass, and the HTML, read only on the passes that use the page.
|
|
5
|
+
*/
|
|
6
|
+
export interface PageClusterPage {
|
|
7
|
+
/** The page URL's path segments (`ExURL.paths`). */
|
|
8
|
+
readonly paths: readonly string[];
|
|
9
|
+
/** Absolute hrefs of the page's stylesheets. */
|
|
10
|
+
readonly stylesheetHrefs: readonly string[];
|
|
11
|
+
/**
|
|
12
|
+
* The page URL's host (hostname, optionally `:port` — `new URL(pageUrl).host`).
|
|
13
|
+
* Stylesheets on other hosts take no part in blocking.
|
|
14
|
+
*/
|
|
15
|
+
readonly host?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Identity of the page's content-root element, as a crawler detected it.
|
|
18
|
+
* Anchors the per-block content depth cap on sites without
|
|
19
|
+
* `<main>`/`role="main"`; without it the cap falls back to
|
|
20
|
+
* `<main>`/`role="main"` and then the built-in `#main`, `#content`, … list.
|
|
21
|
+
*/
|
|
22
|
+
readonly contentRoot?: ContentRootHint;
|
|
23
|
+
/**
|
|
24
|
+
* The page's HTML, non-empty. Called only on the reads that use the page
|
|
25
|
+
* (every page of a block clustered whole, and the sampled pages of a
|
|
26
|
+
* sampled block, on the first read; the other pages of the sampled blocks
|
|
27
|
+
* on the second), so a page's HTML is decompressed once however many
|
|
28
|
+
* times the corpus is read.
|
|
29
|
+
*/
|
|
30
|
+
getHtml(): string | Promise<string>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Factory returning an iterator over the corpus. Called once per read — the
|
|
34
|
+
* signals, then the HTML, and, when a block was sampled, the HTML again for
|
|
35
|
+
* the pages outside the samples. Every call must yield the same pages in the
|
|
36
|
+
* same order; a corpus that changes size between reads is rejected.
|
|
37
|
+
*
|
|
38
|
+
* A factory rather than an `AsyncIterable`: one returned once cannot be
|
|
39
|
+
* traversed a second time, while a factory lets the caller re-issue its
|
|
40
|
+
* archive query per read, so no read holds the corpus's HTML at once.
|
|
41
|
+
*/
|
|
42
|
+
export type PageFactory = () => Iterable<PageClusterPage> | AsyncIterable<PageClusterPage>;
|
|
43
|
+
/**
|
|
44
|
+
* Progress of `resolvePageClusterKeys`, a union on `phase`:
|
|
45
|
+
* - `pass0-signals`: reading the blocking signals; every 1,000 pages.
|
|
46
|
+
* - `block-sampled`: a block will be clustered from a sample, because its
|
|
47
|
+
* similarity table exceeds the memory budget or because the blocks
|
|
48
|
+
* clustered whole would hold more than `@nitpicker/core`'s
|
|
49
|
+
* `TEMPLATE_EXACT_PAGE_LIMIT` pages and it is among the largest; once per
|
|
50
|
+
* such block, before any HTML is read.
|
|
51
|
+
* - `pass1-block-complete`: one block's clusters are done.
|
|
52
|
+
* - `pass1b-assign`: only with a sampled block; every 1,000 pages assigned to
|
|
53
|
+
* the sampled clusters.
|
|
54
|
+
* - `stage-b-start`: the merge across blocks began; once per call.
|
|
55
|
+
*/
|
|
56
|
+
export type ProgressEvent = {
|
|
57
|
+
readonly phase: 'pass0-signals';
|
|
58
|
+
readonly pagesSeen: number;
|
|
59
|
+
} | {
|
|
60
|
+
readonly phase: 'block-sampled';
|
|
61
|
+
readonly blockKey: string;
|
|
62
|
+
readonly pageCount: number;
|
|
63
|
+
readonly pairBytes: number;
|
|
64
|
+
readonly budget: number;
|
|
65
|
+
readonly reason: 'table-over-budget' | 'pages-over-limit';
|
|
66
|
+
} | {
|
|
67
|
+
readonly phase: 'pass1-block-complete';
|
|
68
|
+
readonly blockKey: string;
|
|
69
|
+
readonly blocksProcessed: number;
|
|
70
|
+
readonly totalBlocks: number;
|
|
71
|
+
} | {
|
|
72
|
+
readonly phase: 'pass1b-assign';
|
|
73
|
+
readonly pagesAssigned: number;
|
|
74
|
+
readonly pagesToAssign: number;
|
|
75
|
+
} | {
|
|
76
|
+
readonly phase: 'stage-b-start';
|
|
77
|
+
readonly unitCount: number;
|
|
78
|
+
};
|
|
79
|
+
/** Options of `resolvePageClusterKeys`. */
|
|
80
|
+
export interface ResolvePageClusterKeysOptions {
|
|
81
|
+
/**
|
|
82
|
+
* Bytes a block's Stage A similarity table may take before the block is
|
|
83
|
+
* clustered from a sample instead (`@nitpicker/core`'s
|
|
84
|
+
* `TEMPLATE_MEMORY_BUDGET` by default; `0` samples every block).
|
|
85
|
+
*/
|
|
86
|
+
readonly memoryBudget: number;
|
|
87
|
+
/** Receives every {@link ProgressEvent}. */
|
|
88
|
+
readonly onProgress: (event: ProgressEvent) => void;
|
|
89
|
+
}
|
|
90
|
+
/** What `resolvePageClusterKeys` returns. */
|
|
91
|
+
export interface PageClusterKeys {
|
|
92
|
+
/** Each page's cluster key, in corpus order. */
|
|
93
|
+
readonly keys: string[];
|
|
94
|
+
/**
|
|
95
|
+
* Each final cluster's reason, by key. Built from the clusters' retained
|
|
96
|
+
* members (the samples, for a sampled block), sized by cluster count, not
|
|
97
|
+
* page count.
|
|
98
|
+
*/
|
|
99
|
+
readonly reasons: ReadonlyMap<string, TemplateClusterReason>;
|
|
100
|
+
/** The blocks clustered from a sample, in block order. */
|
|
101
|
+
readonly sampledBlocks: readonly TemplateSampledBlock[];
|
|
102
|
+
}
|
|
103
|
+
/** One read of the corpus's HTML, as the driver hands it to the run. */
|
|
104
|
+
export interface HtmlRead {
|
|
105
|
+
/** The corpus. */
|
|
106
|
+
readonly pages: PageFactory;
|
|
107
|
+
/**
|
|
108
|
+
* The run's `pageMask()` for this read: which pages it uses; its length
|
|
109
|
+
* is the page count of the first read.
|
|
110
|
+
*/
|
|
111
|
+
readonly mask: Uint8Array;
|
|
112
|
+
/** Hands a batch to the run (`pushPages` or `pushAssignmentPages`). */
|
|
113
|
+
readonly push: (batch: TemplatePageHtml[]) => Promise<void>;
|
|
114
|
+
}
|
|
115
|
+
/** The read of every page's blocking signals into a run. */
|
|
116
|
+
export interface SignalsRead {
|
|
117
|
+
/** The corpus. */
|
|
118
|
+
readonly pages: PageFactory;
|
|
119
|
+
/** The run the signals go to. */
|
|
120
|
+
readonly run: TemplateClassificationRun;
|
|
121
|
+
/** Receives the `pass0-signals` events. */
|
|
122
|
+
readonly onProgress: ((event: ProgressEvent) => void) | undefined;
|
|
123
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import type Archive from '../archive.js';
|
|
2
|
+
import type { TemplateClusterReason } from '../db-ops/templates/types.js';
|
|
3
|
+
import type { ContentRootHint } from '@nitpicker/core/types';
|
|
4
|
+
/**
|
|
5
|
+
* The four values of a page's detected main-content element that
|
|
6
|
+
* `createContentRootHint` builds the classifier's content-root hint from.
|
|
7
|
+
* Structurally the matching getters of `Page`, and the decoded
|
|
8
|
+
* `page_meta.main_content_*` columns `loadPageClusterCandidates` reads.
|
|
9
|
+
*/
|
|
10
|
+
export interface ContentRootSource {
|
|
11
|
+
/** The element's DOM node name (`'DIV'`), or `null`. */
|
|
12
|
+
readonly mainContentNodeName: string | null;
|
|
13
|
+
/** The element's `id`, or `null`. */
|
|
14
|
+
readonly mainContentId: string | null;
|
|
15
|
+
/** The element's `role`, or `null`. */
|
|
16
|
+
readonly mainContentRole: string | null;
|
|
17
|
+
/** The element's CSS classes, or `null` when no main region was detected. */
|
|
18
|
+
readonly mainContentClassList: readonly string[] | null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* What template classification keeps of one internal HTML page while it
|
|
22
|
+
* waits for the clustering: the page's id (to read its HTML by) and the
|
|
23
|
+
* signals the classifier reads without HTML. Deliberately not a `Page` — a
|
|
24
|
+
* `Page` holds the page's whole row (every meta column), and holding one per
|
|
25
|
+
* page of a several-hundred-thousand-page archive is what this type avoids.
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* const candidate: PageClusterCandidate = {
|
|
29
|
+
* id: 12,
|
|
30
|
+
* href: 'https://example.com/news/1',
|
|
31
|
+
* paths: ['news', '1'],
|
|
32
|
+
* host: 'example.com',
|
|
33
|
+
* };
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export interface PageClusterCandidate {
|
|
37
|
+
/** `Page.id`; the key the page's HTML is read by. */
|
|
38
|
+
readonly id: number;
|
|
39
|
+
/** The page's `url.href`; the key of its result and of its stylesheet references. */
|
|
40
|
+
readonly href: string;
|
|
41
|
+
/** The page's URL path segments. */
|
|
42
|
+
readonly paths: readonly string[];
|
|
43
|
+
/** `hostname`, or `hostname:port` when the URL has a port. */
|
|
44
|
+
readonly host: string;
|
|
45
|
+
/** The crawler-detected main-content hint; absent when none was detected. */
|
|
46
|
+
readonly contentRoot?: ContentRootHint;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Progress of the clustering step itself. A copy of the page-cluster
|
|
50
|
+
* driver's `ProgressEvent` (`./page-cluster/resolve-page-cluster-keys.ts`,
|
|
51
|
+
* structurally assignable to this type), kept independent of it so
|
|
52
|
+
* `@nitpicker/cli` formats progress against a type archive exports rather
|
|
53
|
+
* than against the driver's internals, which are not part of archive's
|
|
54
|
+
* `exports` — the same reason {@link TemplateClusterReason} mirrors
|
|
55
|
+
* `@nitpicker/core`'s reason type.
|
|
56
|
+
*/
|
|
57
|
+
export type TemplateClusteringProgress = {
|
|
58
|
+
readonly phase: 'pass0-signals';
|
|
59
|
+
readonly pagesSeen: number;
|
|
60
|
+
} | {
|
|
61
|
+
readonly phase: 'block-sampled';
|
|
62
|
+
readonly blockKey: string;
|
|
63
|
+
readonly pageCount: number;
|
|
64
|
+
readonly pairBytes: number;
|
|
65
|
+
readonly budget: number;
|
|
66
|
+
readonly reason: 'table-over-budget' | 'pages-over-limit';
|
|
67
|
+
} | {
|
|
68
|
+
readonly phase: 'pass1-block-complete';
|
|
69
|
+
readonly blockKey: string;
|
|
70
|
+
readonly blocksProcessed: number;
|
|
71
|
+
readonly totalBlocks: number;
|
|
72
|
+
} | {
|
|
73
|
+
readonly phase: 'pass1b-assign';
|
|
74
|
+
readonly pagesAssigned: number;
|
|
75
|
+
readonly pagesToAssign: number;
|
|
76
|
+
} | {
|
|
77
|
+
readonly phase: 'stage-b-start';
|
|
78
|
+
readonly unitCount: number;
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Progress of the whole crawl-end classification
|
|
82
|
+
* ({@link import('./classify-archive-page-templates.js').classifyArchivePageTemplates}):
|
|
83
|
+
* listing the pages with stored HTML, loading their signals out of the
|
|
84
|
+
* archive, gathering stylesheet references, the clustering phases, then
|
|
85
|
+
* writing the result.
|
|
86
|
+
*
|
|
87
|
+
* `loading-pages-start`, `collecting-stylesheets`, `listing-html-snapshots`
|
|
88
|
+
* and `writing-results` carry no count: each is a step with no natural
|
|
89
|
+
* progress unit (a count query followed by keyset batches that report their
|
|
90
|
+
* own `loading-pages` counts, three chained SQL passes, one join query, one
|
|
91
|
+
* write transaction), so they only announce that the step began — otherwise
|
|
92
|
+
* the previous step's last message would stay on screen and look like a stall.
|
|
93
|
+
*/
|
|
94
|
+
export type TemplateClassificationProgress = {
|
|
95
|
+
readonly phase: 'loading-pages-start';
|
|
96
|
+
} | {
|
|
97
|
+
readonly phase: 'loading-pages';
|
|
98
|
+
readonly done: number;
|
|
99
|
+
readonly total: number;
|
|
100
|
+
} | {
|
|
101
|
+
readonly phase: 'collecting-stylesheets';
|
|
102
|
+
} | {
|
|
103
|
+
readonly phase: 'listing-html-snapshots';
|
|
104
|
+
} | TemplateClusteringProgress | {
|
|
105
|
+
readonly phase: 'writing-results';
|
|
106
|
+
readonly templateCount: number;
|
|
107
|
+
};
|
|
108
|
+
/**
|
|
109
|
+
* A block clustered from a sample of its pages. Mirrors `@nitpicker/core`'s
|
|
110
|
+
* `TemplateSampledBlock`, for the same reason {@link TemplateClusterReason}
|
|
111
|
+
* mirrors its reason type.
|
|
112
|
+
* @example
|
|
113
|
+
* ```ts
|
|
114
|
+
* const block: SampledTemplateBlock = {
|
|
115
|
+
* blockKey: 'path:news',
|
|
116
|
+
* pageCount: 30_000,
|
|
117
|
+
* pairBytes: 3_599_880_000,
|
|
118
|
+
* reason: 'table-over-budget',
|
|
119
|
+
* };
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
export interface SampledTemplateBlock {
|
|
123
|
+
/** The block's key. */
|
|
124
|
+
readonly blockKey: string;
|
|
125
|
+
/** Its pages. */
|
|
126
|
+
readonly pageCount: number;
|
|
127
|
+
/** Bytes its similarity table would have taken. */
|
|
128
|
+
readonly pairBytes: number;
|
|
129
|
+
/**
|
|
130
|
+
* Why it was sampled: its table exceeds the memory budget, or the blocks
|
|
131
|
+
* clustered whole would hold more than `@nitpicker/core`'s
|
|
132
|
+
* `TEMPLATE_EXACT_PAGE_LIMIT` pages and it is among the largest.
|
|
133
|
+
*/
|
|
134
|
+
readonly reason: 'table-over-budget' | 'pages-over-limit';
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Options for {@link import('./classify-page-templates.js').classifyPageTemplates}.
|
|
138
|
+
*/
|
|
139
|
+
export interface ClassifyPageTemplatesOptions {
|
|
140
|
+
/** The archive to read stylesheet references and the stored-HTML listing from. */
|
|
141
|
+
archive: Archive;
|
|
142
|
+
/**
|
|
143
|
+
* Every internal HTML page of the archive that has a stored HTML snapshot
|
|
144
|
+
* (`loadPageClusterCandidates`).
|
|
145
|
+
* Classification is a corpus-wide batch computation: template keys are
|
|
146
|
+
* only comparable within one call, so the pages must never be passed in
|
|
147
|
+
* per-batch slices.
|
|
148
|
+
*/
|
|
149
|
+
candidates: readonly PageClusterCandidate[];
|
|
150
|
+
/**
|
|
151
|
+
* Bytes a block's Stage A similarity table may take before the block is
|
|
152
|
+
* clustered from a sample instead; see `resolvePageClusterKeys`. Defaults
|
|
153
|
+
* to `@nitpicker/core`'s `TEMPLATE_MEMORY_BUDGET`; `0` samples every block.
|
|
154
|
+
*/
|
|
155
|
+
memoryBudget?: number;
|
|
156
|
+
/**
|
|
157
|
+
* Receives every {@link TemplateClassificationProgress} event of the call,
|
|
158
|
+
* including the clustering phases `resolvePageClusterKeys` reports, so
|
|
159
|
+
* long-running classification on large archives isn't silently
|
|
160
|
+
* unresponsive.
|
|
161
|
+
*/
|
|
162
|
+
onProgress?: (event: TemplateClassificationProgress) => void;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Options for {@link import('./load-page-cluster-candidates.js').loadPageClusterCandidates}.
|
|
166
|
+
*/
|
|
167
|
+
export interface LoadPageClusterCandidatesOptions {
|
|
168
|
+
/**
|
|
169
|
+
* Output of `collectPageIdsWithHtml`: only pages whose id is in it are
|
|
170
|
+
* loaded, so pages with no stored HTML never take part (nor stay resident).
|
|
171
|
+
*/
|
|
172
|
+
readonly pageIdsWithHtml: ReadonlySet<number>;
|
|
173
|
+
/** Receives a `loading-pages` event after each batch. */
|
|
174
|
+
readonly onProgress?: (event: TemplateClassificationProgress) => void;
|
|
175
|
+
/** Rows read per query. Defaults to 10,000; a bound on one query's transient garbage only. */
|
|
176
|
+
readonly batchSize?: number;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Options for {@link import('./create-page-cluster-factory.js').createPageClusterFactory}.
|
|
180
|
+
*/
|
|
181
|
+
export interface CreatePageClusterFactoryOptions {
|
|
182
|
+
/** Reads each page's HTML by id, only on the reads that use it. */
|
|
183
|
+
readonly archive: Pick<Archive, 'getHtmlOfPage'>;
|
|
184
|
+
/**
|
|
185
|
+
* The pages to cluster, as `loadPageClusterCandidates` returned them
|
|
186
|
+
* (already limited to pages with a stored HTML snapshot).
|
|
187
|
+
*/
|
|
188
|
+
readonly candidates: readonly PageClusterCandidate[];
|
|
189
|
+
/** Output of `collectPageStylesheetUrls`, keyed by `url.href`. */
|
|
190
|
+
readonly stylesheetsByUrl: ReadonlyMap<string, readonly string[]>;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Result of {@link import('./classify-page-templates.js').classifyPageTemplates}.
|
|
194
|
+
*/
|
|
195
|
+
export interface PageTemplateClassification {
|
|
196
|
+
/**
|
|
197
|
+
* Page URL (`page.url.href`) → template key. Only internal HTML pages
|
|
198
|
+
* with retrievable HTML have an entry.
|
|
199
|
+
*/
|
|
200
|
+
readonly templateKeysByUrl: ReadonlyMap<string, string>;
|
|
201
|
+
/**
|
|
202
|
+
* Template key → the classifier's cluster-selection evidence for that
|
|
203
|
+
* key, one per final cluster. Built from each cluster's retained members
|
|
204
|
+
* (the samples, for a sampled block), so `memberCount` can be smaller
|
|
205
|
+
* than the cluster's page count.
|
|
206
|
+
*/
|
|
207
|
+
readonly clusterReasonsByTemplateKey: ReadonlyMap<string, TemplateClusterReason>;
|
|
208
|
+
/** The blocks clustered from a sample, in block order. */
|
|
209
|
+
readonly sampledBlocks: readonly SampledTemplateBlock[];
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Options for {@link import('./classify-archive-page-templates.js').classifyArchivePageTemplates}.
|
|
213
|
+
*/
|
|
214
|
+
export interface ClassifyArchivePageTemplatesOptions {
|
|
215
|
+
/**
|
|
216
|
+
* Bytes a block's Stage A similarity table may take before the block is
|
|
217
|
+
* clustered from a sample instead; see `resolvePageClusterKeys`. Defaults
|
|
218
|
+
* to `@nitpicker/core`'s `TEMPLATE_MEMORY_BUDGET`; `0` samples every block.
|
|
219
|
+
*/
|
|
220
|
+
readonly memoryBudget?: number;
|
|
221
|
+
/** Receives loading and clustering progress; omit for a silent run. */
|
|
222
|
+
readonly onProgress?: (event: TemplateClassificationProgress) => void;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Result of {@link import('./classify-archive-page-templates.js').classifyArchivePageTemplates}.
|
|
226
|
+
*/
|
|
227
|
+
export interface ClassifyArchivePageTemplatesResult {
|
|
228
|
+
/** Number of pages that received a template key. */
|
|
229
|
+
readonly classifiedPageCount: number;
|
|
230
|
+
/** Number of distinct template keys among them. */
|
|
231
|
+
readonly templateCount: number;
|
|
232
|
+
/** The blocks clustered from a sample, in block order; empty when none was. */
|
|
233
|
+
readonly sampledBlocks: readonly SampledTemplateBlock[];
|
|
234
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Config } from '../types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Builds a file-backed knex connection against the FULL current archive
|
|
5
|
+
* schema (every ref/entity/adjunct table, including columns only a
|
|
6
|
+
* migration adds to a legacy archive — `alias_of_id`, `dedupe_cap_event_id`,
|
|
7
|
+
* `body_hash`, …) by running the exact same {@link init} boot sequence a
|
|
8
|
+
* real `Archive.create`/`Archive.open` uses. Shared by every
|
|
9
|
+
* `archive/transfer/` spec that needs a realistic source or destination
|
|
10
|
+
* database — hand-rolling `createRefTables`/`createEntityTables`/
|
|
11
|
+
* `createAdjunctTables` directly would produce the schema `initSchema`
|
|
12
|
+
* creates but skip the migrations that add columns for archives created
|
|
13
|
+
* before those features existed (which happen to be a no-op on a fresh
|
|
14
|
+
* DB today, but drift is exactly the risk this helper avoids).
|
|
15
|
+
*
|
|
16
|
+
* A DB file must be used (not `:memory:`) because `ATTACH DATABASE` in
|
|
17
|
+
* the transfer primitives needs a real path — see `attach-source-database.ts`.
|
|
18
|
+
* @param filename - Absolute path to the SQLite file. The caller is
|
|
19
|
+
* responsible for removing it (`afterEach`) — see existing specs for the
|
|
20
|
+
* convention.
|
|
21
|
+
* @param config - Overrides merged over {@link DEFAULT_TEST_CONFIG} and
|
|
22
|
+
* written via `setConfig` once the schema exists. Pass `null` to skip
|
|
23
|
+
* writing an `info` row entirely (some specs seed `content_items`
|
|
24
|
+
* directly and never read `getConfig()`).
|
|
25
|
+
* @returns The connected knex instance, on the current schema, with an
|
|
26
|
+
* `info` row unless `config` is `null`.
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* const db = await buildFullSchemaTestDb(path.resolve(workingDir, 'source.sqlite'), {
|
|
30
|
+
* roots: ['https://a.example.com/'],
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function buildFullSchemaTestDb(filename: string, config?: Partial<Config> | null): Promise<Knex>;
|