@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,132 @@
|
|
|
1
|
+
import { tryParseUrl as parseUrl } from '@d-zero/shared/parse-url';
|
|
2
|
+
import { eachSplitted } from '../utils/array/each-splitted.js';
|
|
3
|
+
/**
|
|
4
|
+
* SQLite has a hard cap of 999 bound variables per statement. A real archive
|
|
5
|
+
* can have far more than 999 CSS-referencing edges or pages, so every
|
|
6
|
+
* `whereIn` below is chunked at this size.
|
|
7
|
+
*
|
|
8
|
+
* Independently duplicated (not shared/imported) from `@nitpicker/query`'s
|
|
9
|
+
* `compute-isolated-clusters.ts`, which defines the identical
|
|
10
|
+
* `SQLITE_IN_CHUNK = 500` for the same reason. If this margin below 999 ever
|
|
11
|
+
* needs revisiting, update both — there is no shared module either package
|
|
12
|
+
* depends on to hold one copy.
|
|
13
|
+
*/
|
|
14
|
+
const SQLITE_IN_CHUNK = 500;
|
|
15
|
+
/**
|
|
16
|
+
* Collects, for every page that references at least one CSS stylesheet, the
|
|
17
|
+
* set of stylesheet URLs it references.
|
|
18
|
+
*
|
|
19
|
+
* Reads in three narrow passes instead of one wide JOIN, to avoid
|
|
20
|
+
* materializing the full page×stylesheet edge set at once — a real
|
|
21
|
+
* 486,000-page archive has ~2.5 million such edges, and a single JOIN
|
|
22
|
+
* projecting both URL strings for all of them is a transient allocation
|
|
23
|
+
* spike well beyond what any single page's data actually needs:
|
|
24
|
+
*
|
|
25
|
+
* 1. Resolve which `resource_items` rows are classified `'css'`
|
|
26
|
+
* (`content_type_refs.category`) and their stylesheet URL.
|
|
27
|
+
* 2. Resolve `resource_ref_edges` for just those CSS resource ids, in
|
|
28
|
+
* chunks, projecting only the two integer ids per row.
|
|
29
|
+
* 3. Resolve the page ids collected in step 2 to their URLs.
|
|
30
|
+
*
|
|
31
|
+
* Identical stylesheet-URL arrays are interned across pages: pages sharing a
|
|
32
|
+
* template share the same CSS set, so the number of distinct arrays
|
|
33
|
+
* converges to a few hundred even across hundreds of thousands of pages.
|
|
34
|
+
* @param archive - The archive to read from.
|
|
35
|
+
* @returns Map from page URL (parseUrl-normalized `href`, matching
|
|
36
|
+
* `Page.url.href`) to the stylesheet URLs it references. Pages that
|
|
37
|
+
* reference no CSS resource have no entry — callers should default to an
|
|
38
|
+
* empty array on a missed lookup.
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* const stylesheetsByUrl = await collectPageStylesheetUrls(archive);
|
|
42
|
+
* const hrefs = stylesheetsByUrl.get(page.url.href) ?? [];
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export async function collectPageStylesheetUrls(archive) {
|
|
46
|
+
const knex = archive.getKnex();
|
|
47
|
+
const cssResources = await knex('resource_items as ri')
|
|
48
|
+
.join('content_type_refs as ctr', 'ctr.id', 'ri.content_type_id')
|
|
49
|
+
.where('ctr.category', 'css')
|
|
50
|
+
.select('ri.id as id', 'ri.url_id as urlId');
|
|
51
|
+
// A CSS resource identified by a `data:` URI (routed to `blob_refs`
|
|
52
|
+
// instead of `url_refs`, `resource_items.url_blob_id`) has no stylesheet
|
|
53
|
+
// URL to report — skip it rather than passing a `null` into `whereIn`.
|
|
54
|
+
const cssResourcesWithUrl = cssResources.filter((r) => r.urlId != null);
|
|
55
|
+
if (cssResourcesWithUrl.length === 0) {
|
|
56
|
+
return new Map();
|
|
57
|
+
}
|
|
58
|
+
const cssUrlById = new Map();
|
|
59
|
+
await eachSplitted(cssResourcesWithUrl.map((r) => r.urlId), SQLITE_IN_CHUNK, async (chunk) => {
|
|
60
|
+
const rows = await knex('url_refs')
|
|
61
|
+
.whereIn('id', chunk)
|
|
62
|
+
.select('id', 'url');
|
|
63
|
+
for (const row of rows) {
|
|
64
|
+
cssUrlById.set(row.id, row.url);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
const cssUrlByResourceId = new Map();
|
|
68
|
+
for (const r of cssResourcesWithUrl) {
|
|
69
|
+
const url = cssUrlById.get(r.urlId);
|
|
70
|
+
if (url) {
|
|
71
|
+
cssUrlByResourceId.set(r.id, url);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const resourceIdsByPageId = new Map();
|
|
75
|
+
await eachSplitted(cssResourcesWithUrl.map((r) => r.id), SQLITE_IN_CHUNK, async (chunk) => {
|
|
76
|
+
const rows = await knex('resource_ref_edges')
|
|
77
|
+
.whereIn('resource_id', chunk)
|
|
78
|
+
.select('resource_id as resourceId', 'page_id as pageId');
|
|
79
|
+
// Avoid `push(...rows)`: on large real archives this chunk array can
|
|
80
|
+
// be large enough to overflow V8's argument-spread limit even though
|
|
81
|
+
// the underlying data itself fits in memory.
|
|
82
|
+
for (const row of rows) {
|
|
83
|
+
const existing = resourceIdsByPageId.get(row.pageId);
|
|
84
|
+
if (existing) {
|
|
85
|
+
existing.push(row.resourceId);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
resourceIdsByPageId.set(row.pageId, [row.resourceId]);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
if (resourceIdsByPageId.size === 0) {
|
|
93
|
+
return new Map();
|
|
94
|
+
}
|
|
95
|
+
const pageUrlById = new Map();
|
|
96
|
+
await eachSplitted([...resourceIdsByPageId.keys()], SQLITE_IN_CHUNK, async (chunk) => {
|
|
97
|
+
const rows = await knex('content_items as ci')
|
|
98
|
+
.join('url_refs as ur', 'ur.id', 'ci.url_id')
|
|
99
|
+
.whereIn('ci.id', chunk)
|
|
100
|
+
.select('ci.id as id', 'ur.url as url');
|
|
101
|
+
for (const row of rows) {
|
|
102
|
+
pageUrlById.set(row.id, row.url);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
const internedSets = new Map();
|
|
106
|
+
const result = new Map();
|
|
107
|
+
for (const [pageId, resourceIds] of resourceIdsByPageId) {
|
|
108
|
+
const pageUrlRaw = pageUrlById.get(pageId);
|
|
109
|
+
if (!pageUrlRaw) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const parsed = parseUrl(pageUrlRaw);
|
|
113
|
+
if (!parsed) {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
const urls = resourceIds
|
|
117
|
+
.map((id) => cssUrlByResourceId.get(id))
|
|
118
|
+
.filter((url) => url != null)
|
|
119
|
+
.toSorted();
|
|
120
|
+
if (urls.length === 0) {
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const internKey = urls.join(' ');
|
|
124
|
+
let interned = internedSets.get(internKey);
|
|
125
|
+
if (!interned) {
|
|
126
|
+
interned = Object.freeze(urls);
|
|
127
|
+
internedSets.set(internKey, interned);
|
|
128
|
+
}
|
|
129
|
+
result.set(parsed.href, interned);
|
|
130
|
+
}
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { ContentRootSource } from './types.js';
|
|
2
|
+
import type { ContentRootHint } from '@nitpicker/core/types';
|
|
3
|
+
/**
|
|
4
|
+
* Builds the `contentRoot` hint page-cluster anchors its
|
|
5
|
+
* content-depth cap on, from the main-content element the crawler recorded
|
|
6
|
+
* for a page (`page_meta.main_content_*`, detected at crawl time by
|
|
7
|
+
* `@d-zero/beholder` or forced with `--main-content-selector`).
|
|
8
|
+
*
|
|
9
|
+
* Sites without `<main>` / `role="main"` — the case the hint exists for —
|
|
10
|
+
* otherwise leave the library with no anchor for its cap, so freeform body
|
|
11
|
+
* content dominates the comparison and one template fragments into many
|
|
12
|
+
* clusters. The crawler already knows which element holds the page-specific
|
|
13
|
+
* content; this hands that element's identity over instead of having the
|
|
14
|
+
* library guess it.
|
|
15
|
+
*
|
|
16
|
+
* Fields the crawler left empty are dropped: `nodeName` is lower-cased (the
|
|
17
|
+
* DOM reports `'DIV'`, the library compares against the parser's `'div'`), and
|
|
18
|
+
* an empty id / role / class list is omitted, since the library treats
|
|
19
|
+
* "given but empty" and "absent" the same and a hint with nothing left
|
|
20
|
+
* matches nothing. Returns `undefined` when the page has no detected main
|
|
21
|
+
* content (never rendered, or no candidate element) or nothing usable is
|
|
22
|
+
* left, so the factory can leave the field off the page entirely.
|
|
23
|
+
*
|
|
24
|
+
* Deliberately not built from `mainContentSelector`: it is a diagnostic
|
|
25
|
+
* `tag#id.class` string that is not guaranteed unique and would need a CSS
|
|
26
|
+
* selector parser on the library side; the four structured columns carry the
|
|
27
|
+
* same information without parsing.
|
|
28
|
+
* @param source - The four main-content values of a page; a `Page` satisfies it.
|
|
29
|
+
* @returns The hint, or `undefined` when there is nothing to anchor on.
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* createContentRootHint({
|
|
33
|
+
* mainContentNodeName: 'DIV',
|
|
34
|
+
* mainContentId: 'main',
|
|
35
|
+
* mainContentRole: null,
|
|
36
|
+
* mainContentClassList: ['spc'],
|
|
37
|
+
* });
|
|
38
|
+
* // { tagName: 'div', id: 'main', classList: ['spc'] }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare function createContentRootHint(source: ContentRootSource): ContentRootHint | undefined;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds the `contentRoot` hint page-cluster anchors its
|
|
3
|
+
* content-depth cap on, from the main-content element the crawler recorded
|
|
4
|
+
* for a page (`page_meta.main_content_*`, detected at crawl time by
|
|
5
|
+
* `@d-zero/beholder` or forced with `--main-content-selector`).
|
|
6
|
+
*
|
|
7
|
+
* Sites without `<main>` / `role="main"` — the case the hint exists for —
|
|
8
|
+
* otherwise leave the library with no anchor for its cap, so freeform body
|
|
9
|
+
* content dominates the comparison and one template fragments into many
|
|
10
|
+
* clusters. The crawler already knows which element holds the page-specific
|
|
11
|
+
* content; this hands that element's identity over instead of having the
|
|
12
|
+
* library guess it.
|
|
13
|
+
*
|
|
14
|
+
* Fields the crawler left empty are dropped: `nodeName` is lower-cased (the
|
|
15
|
+
* DOM reports `'DIV'`, the library compares against the parser's `'div'`), and
|
|
16
|
+
* an empty id / role / class list is omitted, since the library treats
|
|
17
|
+
* "given but empty" and "absent" the same and a hint with nothing left
|
|
18
|
+
* matches nothing. Returns `undefined` when the page has no detected main
|
|
19
|
+
* content (never rendered, or no candidate element) or nothing usable is
|
|
20
|
+
* left, so the factory can leave the field off the page entirely.
|
|
21
|
+
*
|
|
22
|
+
* Deliberately not built from `mainContentSelector`: it is a diagnostic
|
|
23
|
+
* `tag#id.class` string that is not guaranteed unique and would need a CSS
|
|
24
|
+
* selector parser on the library side; the four structured columns carry the
|
|
25
|
+
* same information without parsing.
|
|
26
|
+
* @param source - The four main-content values of a page; a `Page` satisfies it.
|
|
27
|
+
* @returns The hint, or `undefined` when there is nothing to anchor on.
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* createContentRootHint({
|
|
31
|
+
* mainContentNodeName: 'DIV',
|
|
32
|
+
* mainContentId: 'main',
|
|
33
|
+
* mainContentRole: null,
|
|
34
|
+
* mainContentClassList: ['spc'],
|
|
35
|
+
* });
|
|
36
|
+
* // { tagName: 'div', id: 'main', classList: ['spc'] }
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export function createContentRootHint(source) {
|
|
40
|
+
const tagName = source.mainContentNodeName?.toLowerCase();
|
|
41
|
+
const id = source.mainContentId;
|
|
42
|
+
const role = source.mainContentRole;
|
|
43
|
+
const classList = source.mainContentClassList;
|
|
44
|
+
const hint = {
|
|
45
|
+
...(tagName ? { tagName } : {}),
|
|
46
|
+
...(id ? { id } : {}),
|
|
47
|
+
...(role ? { role } : {}),
|
|
48
|
+
...(classList && classList.length > 0 ? { classList } : {}),
|
|
49
|
+
};
|
|
50
|
+
return Object.keys(hint).length > 0 ? hint : undefined;
|
|
51
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { PageFactory } from './page-cluster/types.js';
|
|
2
|
+
import type { CreatePageClusterFactoryOptions } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Builds the `PageFactory` that page-cluster's `resolvePageClusterKeys`
|
|
5
|
+
* reads the corpus through, and the URLs of the pages it yields, in order.
|
|
6
|
+
*
|
|
7
|
+
* It yields exactly the candidates it is given — internal HTML pages with a
|
|
8
|
+
* non-empty stored HTML snapshot, decided upfront by
|
|
9
|
+
* `loadPageClusterCandidates` from `collectPageIdsWithHtml` (one query that
|
|
10
|
+
* decompresses nothing). So the set is fixed before the first read and
|
|
11
|
+
* identical on every read, as the engine requires, and each page's HTML is
|
|
12
|
+
* decompressed only on the reads that use it (`getHtml`, by page id) instead
|
|
13
|
+
* of on every read just to see whether it is empty.
|
|
14
|
+
*
|
|
15
|
+
* Each yielded page carries its `paths`, `stylesheetHrefs`, `host`, and —
|
|
16
|
+
* when the crawler detected a main-content element for it — the `contentRoot`
|
|
17
|
+
* hint the candidate holds, which the classifier anchors its content-depth
|
|
18
|
+
* cap on. The factory holds each page's id and these signals only.
|
|
19
|
+
* @param options - See {@link CreatePageClusterFactoryOptions}.
|
|
20
|
+
* @returns `factory` to pass to `resolvePageClusterKeys`, and `urls`: the
|
|
21
|
+
* yielded pages' `href`, in the order of the keys it returns.
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* const { factory, urls } = createPageClusterFactory({
|
|
25
|
+
* archive,
|
|
26
|
+
* candidates,
|
|
27
|
+
* stylesheetsByUrl,
|
|
28
|
+
* });
|
|
29
|
+
* const { keys } = await resolvePageClusterKeys(factory);
|
|
30
|
+
* // keys[i] is the template key of urls[i]
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare function createPageClusterFactory(options: CreatePageClusterFactoryOptions): {
|
|
34
|
+
factory: PageFactory;
|
|
35
|
+
urls: readonly string[];
|
|
36
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds the `PageFactory` that page-cluster's `resolvePageClusterKeys`
|
|
3
|
+
* reads the corpus through, and the URLs of the pages it yields, in order.
|
|
4
|
+
*
|
|
5
|
+
* It yields exactly the candidates it is given — internal HTML pages with a
|
|
6
|
+
* non-empty stored HTML snapshot, decided upfront by
|
|
7
|
+
* `loadPageClusterCandidates` from `collectPageIdsWithHtml` (one query that
|
|
8
|
+
* decompresses nothing). So the set is fixed before the first read and
|
|
9
|
+
* identical on every read, as the engine requires, and each page's HTML is
|
|
10
|
+
* decompressed only on the reads that use it (`getHtml`, by page id) instead
|
|
11
|
+
* of on every read just to see whether it is empty.
|
|
12
|
+
*
|
|
13
|
+
* Each yielded page carries its `paths`, `stylesheetHrefs`, `host`, and —
|
|
14
|
+
* when the crawler detected a main-content element for it — the `contentRoot`
|
|
15
|
+
* hint the candidate holds, which the classifier anchors its content-depth
|
|
16
|
+
* cap on. The factory holds each page's id and these signals only.
|
|
17
|
+
* @param options - See {@link CreatePageClusterFactoryOptions}.
|
|
18
|
+
* @returns `factory` to pass to `resolvePageClusterKeys`, and `urls`: the
|
|
19
|
+
* yielded pages' `href`, in the order of the keys it returns.
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* const { factory, urls } = createPageClusterFactory({
|
|
23
|
+
* archive,
|
|
24
|
+
* candidates,
|
|
25
|
+
* stylesheetsByUrl,
|
|
26
|
+
* });
|
|
27
|
+
* const { keys } = await resolvePageClusterKeys(factory);
|
|
28
|
+
* // keys[i] is the template key of urls[i]
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export function createPageClusterFactory(options) {
|
|
32
|
+
const { archive, candidates, stylesheetsByUrl } = options;
|
|
33
|
+
const corpus = candidates.map((candidate) => ({
|
|
34
|
+
paths: candidate.paths,
|
|
35
|
+
stylesheetHrefs: stylesheetsByUrl.get(candidate.href) ?? [],
|
|
36
|
+
host: candidate.host,
|
|
37
|
+
...(candidate.contentRoot ? { contentRoot: candidate.contentRoot } : {}),
|
|
38
|
+
getHtml: async () => {
|
|
39
|
+
const html = await archive.getHtmlOfPage(candidate.id);
|
|
40
|
+
if (!html) {
|
|
41
|
+
// The archive does not change during a classification, so a
|
|
42
|
+
// page found with HTML upfront always reads back with it.
|
|
43
|
+
throw new Error(`createPageClusterFactory: ${candidate.href} has no stored HTML, but collectPageIdsWithHtml listed it`);
|
|
44
|
+
}
|
|
45
|
+
return html;
|
|
46
|
+
},
|
|
47
|
+
}));
|
|
48
|
+
return {
|
|
49
|
+
factory: () => corpus,
|
|
50
|
+
urls: candidates.map((candidate) => candidate.href),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { LoadPageClusterCandidatesOptions, PageClusterCandidate } from './types.js';
|
|
2
|
+
import type Archive from '../archive.js';
|
|
3
|
+
/**
|
|
4
|
+
* Loads the internal HTML pages of the archive that have a stored HTML
|
|
5
|
+
* snapshot as {@link PageClusterCandidate}s: each page's id and the signals
|
|
6
|
+
* template classification reads without HTML, and nothing else.
|
|
7
|
+
*
|
|
8
|
+
* It reads only the page's id, its url and the four `main_content_*` columns
|
|
9
|
+
* the content-root hint is built from, straight from `content_items` /
|
|
10
|
+
* `page_meta`, in `content_items.id` order, one keyset batch at a time, and
|
|
11
|
+
* keeps a page only when its id is in `pageIdsWithHtml`. It deliberately
|
|
12
|
+
* builds no `Page`: a `Page` carries the page's whole row (every meta column,
|
|
13
|
+
* joined from many meta tables), which is far more than classification reads and
|
|
14
|
+
* would stay resident for every page until the clustering ends.
|
|
15
|
+
*
|
|
16
|
+
* "Internal HTML page" is `Page.isInternalPage()` evaluated in SQL — content
|
|
17
|
+
* type `text/html` and not external, the same selection as `getPages`'
|
|
18
|
+
* `'internal-page'` filter (`load-page-cluster-candidates.spec.ts` asserts
|
|
19
|
+
* the two return the same pages). The URL is parsed as
|
|
20
|
+
* `Page.url` does with queries kept (`disableQueries: false`).
|
|
21
|
+
* @param archive - The archive to read from.
|
|
22
|
+
* @param options - See {@link LoadPageClusterCandidatesOptions}.
|
|
23
|
+
* @returns The candidates, in `content_items.id` order.
|
|
24
|
+
* @throws {Error} When a stored URL cannot be parsed, or a stored
|
|
25
|
+
* `main_content_class_list` is not a JSON array of strings.
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* const pageIdsWithHtml = await collectPageIdsWithHtml(archive);
|
|
29
|
+
* const candidates = await loadPageClusterCandidates(archive, { pageIdsWithHtml });
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare function loadPageClusterCandidates(archive: Archive, options: LoadPageClusterCandidatesOptions): Promise<PageClusterCandidate[]>;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { tryParseUrl as parseUrl } from '@d-zero/shared/parse-url';
|
|
2
|
+
import { parseMainContentClassList } from '../meta/parse-main-content-class-list.js';
|
|
3
|
+
import { createContentRootHint } from './create-content-root-hint.js';
|
|
4
|
+
/**
|
|
5
|
+
* Rows read per query. Each batch's rows are turned into candidates and
|
|
6
|
+
* dropped before the next is read, so this bounds the transient garbage of
|
|
7
|
+
* one query, not what stays resident.
|
|
8
|
+
*/
|
|
9
|
+
const DEFAULT_BATCH_SIZE = 10_000;
|
|
10
|
+
/**
|
|
11
|
+
* Loads the internal HTML pages of the archive that have a stored HTML
|
|
12
|
+
* snapshot as {@link PageClusterCandidate}s: each page's id and the signals
|
|
13
|
+
* template classification reads without HTML, and nothing else.
|
|
14
|
+
*
|
|
15
|
+
* It reads only the page's id, its url and the four `main_content_*` columns
|
|
16
|
+
* the content-root hint is built from, straight from `content_items` /
|
|
17
|
+
* `page_meta`, in `content_items.id` order, one keyset batch at a time, and
|
|
18
|
+
* keeps a page only when its id is in `pageIdsWithHtml`. It deliberately
|
|
19
|
+
* builds no `Page`: a `Page` carries the page's whole row (every meta column,
|
|
20
|
+
* joined from many meta tables), which is far more than classification reads and
|
|
21
|
+
* would stay resident for every page until the clustering ends.
|
|
22
|
+
*
|
|
23
|
+
* "Internal HTML page" is `Page.isInternalPage()` evaluated in SQL — content
|
|
24
|
+
* type `text/html` and not external, the same selection as `getPages`'
|
|
25
|
+
* `'internal-page'` filter (`load-page-cluster-candidates.spec.ts` asserts
|
|
26
|
+
* the two return the same pages). The URL is parsed as
|
|
27
|
+
* `Page.url` does with queries kept (`disableQueries: false`).
|
|
28
|
+
* @param archive - The archive to read from.
|
|
29
|
+
* @param options - See {@link LoadPageClusterCandidatesOptions}.
|
|
30
|
+
* @returns The candidates, in `content_items.id` order.
|
|
31
|
+
* @throws {Error} When a stored URL cannot be parsed, or a stored
|
|
32
|
+
* `main_content_class_list` is not a JSON array of strings.
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* const pageIdsWithHtml = await collectPageIdsWithHtml(archive);
|
|
36
|
+
* const candidates = await loadPageClusterCandidates(archive, { pageIdsWithHtml });
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export async function loadPageClusterCandidates(archive, options) {
|
|
40
|
+
const { pageIdsWithHtml, onProgress, batchSize = DEFAULT_BATCH_SIZE } = options;
|
|
41
|
+
const knex = archive.getKnex();
|
|
42
|
+
const internalHtml = () => knex('content_items as ci')
|
|
43
|
+
.join('content_type_refs as ctr', 'ctr.id', 'ci.content_type_id')
|
|
44
|
+
.where('ctr.raw', 'text/html')
|
|
45
|
+
.andWhere('ci.is_external', 0);
|
|
46
|
+
// Only for progress: counted once up front. The archive is not written
|
|
47
|
+
// while it is classified, so `done` ends at `total`.
|
|
48
|
+
const countRow = (await internalHtml().count({ count: '*' }).first());
|
|
49
|
+
const total = Number(countRow?.count ?? 0);
|
|
50
|
+
const candidates = [];
|
|
51
|
+
let lastId = 0;
|
|
52
|
+
let done = 0;
|
|
53
|
+
while (true) {
|
|
54
|
+
const rows = await internalHtml()
|
|
55
|
+
.join('url_refs as ur', 'ur.id', 'ci.url_id')
|
|
56
|
+
.leftJoin('page_meta as pm', 'pm.page_id', 'ci.id')
|
|
57
|
+
.andWhere('ci.id', '>', lastId)
|
|
58
|
+
.orderBy('ci.id')
|
|
59
|
+
.limit(batchSize)
|
|
60
|
+
.select('ci.id as id', 'ur.url as url', 'pm.main_content_node_name as main_content_node_name', 'pm.main_content_id as main_content_id', 'pm.main_content_role as main_content_role', 'pm.main_content_class_list as main_content_class_list');
|
|
61
|
+
if (rows.length === 0) {
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
for (const row of rows) {
|
|
65
|
+
if (!pageIdsWithHtml.has(row.id)) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const url = parseUrl(row.url, { disableQueries: false });
|
|
69
|
+
if (!url) {
|
|
70
|
+
throw new Error(`loadPageClusterCandidates: cannot parse the stored URL ${row.url}`);
|
|
71
|
+
}
|
|
72
|
+
const contentRoot = createContentRootHint({
|
|
73
|
+
mainContentNodeName: row.main_content_node_name,
|
|
74
|
+
mainContentId: row.main_content_id,
|
|
75
|
+
mainContentRole: row.main_content_role,
|
|
76
|
+
mainContentClassList: parseMainContentClassList(row.main_content_class_list),
|
|
77
|
+
});
|
|
78
|
+
candidates.push({
|
|
79
|
+
id: row.id,
|
|
80
|
+
href: url.href,
|
|
81
|
+
paths: url.paths,
|
|
82
|
+
host: url.port ? `${url.hostname}:${url.port}` : url.hostname,
|
|
83
|
+
// Left off entirely (not `undefined`) for pages with no detected
|
|
84
|
+
// main content, so the candidate carries no undefined-valued key.
|
|
85
|
+
...(contentRoot ? { contentRoot } : {}),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
lastId = rows.at(-1).id;
|
|
89
|
+
done += rows.length;
|
|
90
|
+
onProgress?.({ phase: 'loading-pages', done, total });
|
|
91
|
+
}
|
|
92
|
+
return candidates;
|
|
93
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { PageClusterKeys, PageFactory, ResolvePageClusterKeysOptions } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Clusters pages into templates by DOM structure, in the native addon
|
|
4
|
+
* (`@nitpicker/core`'s `createTemplateClassificationRun`):
|
|
5
|
+
*
|
|
6
|
+
* - **Pass 0** splits the corpus into blocks by URL section and first-party
|
|
7
|
+
* stylesheets, from the signals alone — no HTML.
|
|
8
|
+
* - **Stage A** clusters each block: landmark chrome is cut out, the content
|
|
9
|
+
* depth is capped at the block's knee, and complete-linkage clustering
|
|
10
|
+
* with a max-gap cut splits the block.
|
|
11
|
+
* - **Stage B** merges clusters across blocks and explains each final one.
|
|
12
|
+
*
|
|
13
|
+
* A block is clustered whole unless its Stage A similarity table
|
|
14
|
+
* (`n * (n - 1) / 2 * 8` bytes for `n` pages) exceeds `options.memoryBudget`,
|
|
15
|
+
* or the blocks clustered whole would hold more than
|
|
16
|
+
* `TEMPLATE_EXACT_PAGE_LIMIT` pages together (the largest are then sampled
|
|
17
|
+
* until they fit); a sampled block is clustered on a sample and a further
|
|
18
|
+
* read assigns its other pages. The factory is read twice (signals, HTML)
|
|
19
|
+
* or, with a sampled block that has pages outside its sample, three times; each page's HTML is read
|
|
20
|
+
* once, and JavaScript never holds the whole corpus's HTML.
|
|
21
|
+
* @param pages
|
|
22
|
+
* @param options
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* const { keys, reasons } = await resolvePageClusterKeys(() => [
|
|
26
|
+
* { paths: ['news', '1'], stylesheetHrefs: [], getHtml: () => '<body><article>one</article></body>' },
|
|
27
|
+
* { paths: ['news', '2'], stylesheetHrefs: [], getHtml: () => '<body><article>two</article></body>' },
|
|
28
|
+
* { paths: ['about'], stylesheetHrefs: [], getHtml: () => '<body><section>about</section></body>' },
|
|
29
|
+
* ]);
|
|
30
|
+
* // keys: ['["path:news","cluster:0"]', '["path:news","cluster:0"]', '["path:about","cluster:0"]']
|
|
31
|
+
* // reasons: one per cluster key, e.g. reasons.get('["path:about","cluster:0"]')?.memberCount === 1
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function resolvePageClusterKeys(pages: PageFactory, options?: Partial<ResolvePageClusterKeysOptions>): Promise<PageClusterKeys>;
|