@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,137 @@
|
|
|
1
|
+
import { createAdjunctTables } from './create-adjunct-tables.js';
|
|
2
|
+
import { convertLegacyPageTagsToInserts } from './meta/technologies/convert-legacy-page-tags-to-inserts.js';
|
|
3
|
+
import { eachSplitted } from './utils/array/each-splitted.js';
|
|
4
|
+
/**
|
|
5
|
+
* The adjunct tables whose FK declarations may still point at the legacy
|
|
6
|
+
* `pages(id)` on migrated archives. Only names are listed — the column
|
|
7
|
+
* set is derived at runtime from the canonical table recreated by
|
|
8
|
+
* {@link createAdjunctTables}, so a future column addition there cannot
|
|
9
|
+
* silently drift from a hardcoded list (a missing column in the staged
|
|
10
|
+
* copy fails the copy-back INSERT loudly instead of dropping data).
|
|
11
|
+
*
|
|
12
|
+
* `page_tags` is deliberately NOT here — it has no current-schema
|
|
13
|
+
* equivalent to retarget onto (removed in favor of `technology_signals` /
|
|
14
|
+
* `page_technologies`). {@link retargetLegacyFkTables} handles it as a
|
|
15
|
+
* special case: convert its rows, then drop it outright rather than
|
|
16
|
+
* recreating it. See that function's JSDoc.
|
|
17
|
+
*
|
|
18
|
+
* `analysis_violations` / `analysis_text_refs` are likewise not listed: the
|
|
19
|
+
* current schema has no equivalent, so {@link retargetLegacyFkTables} drops
|
|
20
|
+
* them (and their rows) instead of retargeting.
|
|
21
|
+
*/
|
|
22
|
+
const RETARGET_TABLES = [
|
|
23
|
+
'page_html_ref',
|
|
24
|
+
'page_jsonld',
|
|
25
|
+
'page_errors',
|
|
26
|
+
];
|
|
27
|
+
/**
|
|
28
|
+
* Rewrites the FK declarations of the adjunct tables from the legacy
|
|
29
|
+
* `pages(id)` to `content_items(id)` by rebuilding each table, converts
|
|
30
|
+
* `page_tags` (if present) into `technology_signals` / `page_technologies`,
|
|
31
|
+
* AND drops the legacy `analysis_violations` / `analysis_text_refs` tables
|
|
32
|
+
* (analyze output that that no reader or writer uses).
|
|
33
|
+
* SQLite has no `ALTER TABLE … DROP CONSTRAINT`, so the only way to change
|
|
34
|
+
* an FK target is to recreate the table:
|
|
35
|
+
*
|
|
36
|
+
* 1. Stage each {@link RETARGET_TABLES} table's rows into a constraint-free
|
|
37
|
+
* `<table>__retarget` copy (`CREATE TABLE … AS SELECT *`) and drop the
|
|
38
|
+
* original, freeing its index names. `page_tags`, if present, is read
|
|
39
|
+
* into memory here too (converted via `convertLegacyPageTagsToInserts` —
|
|
40
|
+
* the same helper `migrate-page-tags-to-page-technologies.ts` uses for
|
|
41
|
+
* already-0.13+ archives) but NOT staged the same way: it has no
|
|
42
|
+
* current-schema table to retarget onto, so there is nothing to copy
|
|
43
|
+
* back — only something to drop, once its data lives in the tables
|
|
44
|
+
* from step 2.
|
|
45
|
+
* 2. Recreate every {@link RETARGET_TABLES} table through
|
|
46
|
+
* {@link createAdjunctTables} — the same DDL fresh archives get, so
|
|
47
|
+
* migrated archives end up identical in shape and index naming.
|
|
48
|
+
* Rebuilding the DDL inline here instead would recreate the exact
|
|
49
|
+
* drift this function repairs. This same call also creates
|
|
50
|
+
* `technology_signals` / `page_technologies` (idempotent
|
|
51
|
+
* `hasTable`-guarded DDL — a no-op if a prior partial run already
|
|
52
|
+
* created them).
|
|
53
|
+
* 3. Copy the staged {@link RETARGET_TABLES} rows back using the recreated
|
|
54
|
+
* table's own column list (read via `pragma_table_info`). A column the
|
|
55
|
+
* canonical DDL has but the input archive lacks aborts the INSERT with
|
|
56
|
+
* a clear error — never a silent data drop. The converted `page_tags`
|
|
57
|
+
* signals/technologies are inserted here too, then `page_tags` itself
|
|
58
|
+
* is dropped (not recreated).
|
|
59
|
+
*
|
|
60
|
+
* A rename-based recipe (`ALTER TABLE x RENAME TO x__retarget`, skip
|
|
61
|
+
* copy #1) is deliberately NOT used: SQLite keeps the renamed table's
|
|
62
|
+
* indexes attached under their original names, which collide with the
|
|
63
|
+
* index names {@link createAdjunctTables} declares — and the old index
|
|
64
|
+
* names vary by the era of the archive's original provisioning, so
|
|
65
|
+
* dropping them first would require enumerating unknown names. The
|
|
66
|
+
* copy-out is cheap at these tables' scale (a handful of rows per page).
|
|
67
|
+
*
|
|
68
|
+
* Adjunct tables that do not exist on the input archive are simply created
|
|
69
|
+
* empty by step 2.
|
|
70
|
+
*
|
|
71
|
+
* The migrated-archive PK-preservation contract makes the copy safe:
|
|
72
|
+
* `content_items.id` reuses the legacy `pages.id` values verbatim, so
|
|
73
|
+
* every staged `pageId` / `page_id` resolves to the same row under the
|
|
74
|
+
* new FK target. Run inside a transaction with `PRAGMA foreign_keys = ON`
|
|
75
|
+
* so the copy-back doubles as a row-level FK validation — a stale id
|
|
76
|
+
* aborts the transaction here rather than surfacing later as a
|
|
77
|
+
* `foreign_key_check` finding.
|
|
78
|
+
* @param trx - Knex transaction on the archive being migrated
|
|
79
|
+
* (`scripts/migrate-to-0.13.mjs` is the caller).
|
|
80
|
+
* @example
|
|
81
|
+
* await db.transaction(async (trx) => {
|
|
82
|
+
* await retargetLegacyFkTables(trx);
|
|
83
|
+
* });
|
|
84
|
+
* // pragma_foreign_key_list('page_errors') now reports content_items.
|
|
85
|
+
*/
|
|
86
|
+
export async function retargetLegacyFkTables(trx) {
|
|
87
|
+
// Legacy analyze output: no current-schema counterpart, so the rows are
|
|
88
|
+
// discarded. The child (`analysis_violations`, which references
|
|
89
|
+
// `analysis_text_refs`) goes first so the drop is legal under
|
|
90
|
+
// `PRAGMA foreign_keys = ON`.
|
|
91
|
+
await trx.raw('DROP TABLE IF EXISTS "analysis_violations"');
|
|
92
|
+
await trx.raw('DROP TABLE IF EXISTS "analysis_text_refs"');
|
|
93
|
+
const staged = [];
|
|
94
|
+
for (const table of RETARGET_TABLES) {
|
|
95
|
+
if (!(await trx.schema.hasTable(table))) {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
await trx.raw(`CREATE TABLE "${table}__retarget" AS SELECT * FROM "${table}"`);
|
|
99
|
+
await trx.raw(`DROP TABLE "${table}"`);
|
|
100
|
+
staged.push(table);
|
|
101
|
+
}
|
|
102
|
+
// `page_tags` has no current-schema table to retarget onto (removed —
|
|
103
|
+
// see the module JSDoc), so its rows are converted to
|
|
104
|
+
// `technology_signals` / `page_technologies` shape HERE, while
|
|
105
|
+
// `page_tags` still exists, then only dropped (not staged/recreated)
|
|
106
|
+
// after `createAdjunctTables` below provisions the tables that will
|
|
107
|
+
// receive them.
|
|
108
|
+
const hasLegacyPageTags = await trx.schema.hasTable('page_tags');
|
|
109
|
+
const legacyTagRows = hasLegacyPageTags
|
|
110
|
+
? await trx
|
|
111
|
+
.select('pageId', 'provider', 'version', 'confidence', 'categories')
|
|
112
|
+
.from('page_tags')
|
|
113
|
+
: [];
|
|
114
|
+
await createAdjunctTables(trx);
|
|
115
|
+
for (const table of staged) {
|
|
116
|
+
const columns = await trx
|
|
117
|
+
.select('name')
|
|
118
|
+
.from(trx.raw('pragma_table_info(?)', [table]));
|
|
119
|
+
const insertColumnList = columns.map((column) => `"${column.name}"`).join(', ');
|
|
120
|
+
await trx.raw(`INSERT INTO "${table}" (${insertColumnList}) SELECT ${insertColumnList} FROM "${table}__retarget"`);
|
|
121
|
+
await trx.raw(`DROP TABLE "${table}__retarget"`);
|
|
122
|
+
}
|
|
123
|
+
if (hasLegacyPageTags) {
|
|
124
|
+
const { signalInserts, technologyInserts } = convertLegacyPageTagsToInserts(legacyTagRows);
|
|
125
|
+
if (signalInserts.length > 0) {
|
|
126
|
+
await eachSplitted(signalInserts, 100, async (chunk) => {
|
|
127
|
+
await trx('technology_signals').insert(chunk);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
if (technologyInserts.length > 0) {
|
|
131
|
+
await eachSplitted(technologyInserts, 100, async (chunk) => {
|
|
132
|
+
await trx('page_technologies').insert(chunk);
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
await trx.raw('DROP TABLE "page_tags"');
|
|
136
|
+
}
|
|
137
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves and validates a file path to prevent path traversal attacks.
|
|
3
|
+
* Ensures the resolved path stays within the specified base directory.
|
|
4
|
+
* @param base - The base directory that all paths must stay within.
|
|
5
|
+
* @param segments - Path segments to resolve relative to the base.
|
|
6
|
+
* @returns The resolved absolute path.
|
|
7
|
+
* @throws {Error} If the resolved path escapes the base directory.
|
|
8
|
+
*/
|
|
9
|
+
export declare function safePath(base: string, ...segments: string[]): string;
|
package/lib/safe-path.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
/**
|
|
3
|
+
* Resolves and validates a file path to prevent path traversal attacks.
|
|
4
|
+
* Ensures the resolved path stays within the specified base directory.
|
|
5
|
+
* @param base - The base directory that all paths must stay within.
|
|
6
|
+
* @param segments - Path segments to resolve relative to the base.
|
|
7
|
+
* @returns The resolved absolute path.
|
|
8
|
+
* @throws {Error} If the resolved path escapes the base directory.
|
|
9
|
+
*/
|
|
10
|
+
export function safePath(base, ...segments) {
|
|
11
|
+
const resolvedBase = path.resolve(base);
|
|
12
|
+
const resolved = path.resolve(base, ...segments);
|
|
13
|
+
if (!resolved.startsWith(resolvedBase + path.sep) && resolved !== resolvedBase) {
|
|
14
|
+
throw new Error(`Path traversal detected: ${segments.join('/')}`);
|
|
15
|
+
}
|
|
16
|
+
return resolved;
|
|
17
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ExURL, ParseURLOptions } from '@d-zero/shared/parse-url';
|
|
2
|
+
/**
|
|
3
|
+
* Builds a hostname-indexed scope map from a list of root URL strings, for
|
|
4
|
+
* use with {@link findScopeEntry}.
|
|
5
|
+
*
|
|
6
|
+
* Each root that fails to parse is silently skipped (a malformed root can
|
|
7
|
+
* never match anything anyway) rather than throwing, matching the existing
|
|
8
|
+
* inline construction this replaces (`@nitpicker/crawler`'s `crawler-orchestrator.ts` `append`
|
|
9
|
+
* and inventory-classification call sites, `Crawler`'s own scope build).
|
|
10
|
+
* Roots sharing a hostname are grouped under one array entry so
|
|
11
|
+
* `findScopeEntry` can pick the most specific match among them.
|
|
12
|
+
* @param roots - Root URL strings (e.g. `Config.roots`).
|
|
13
|
+
* @param options - URL parsing options forwarded to {@link parseUrl}.
|
|
14
|
+
* @returns A hostname-indexed map of parsed root URLs.
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* const scope = buildScopeMap(['https://example.com/blog/', 'https://example.com/docs/']);
|
|
18
|
+
* findScopeEntry(url, scope); // deepest matching root, or null if external
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function buildScopeMap(roots: readonly string[], options?: ParseURLOptions): Map<string, ExURL[]>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { tryParseUrl as parseUrl } from '@d-zero/shared/parse-url';
|
|
2
|
+
/**
|
|
3
|
+
* Builds a hostname-indexed scope map from a list of root URL strings, for
|
|
4
|
+
* use with {@link findScopeEntry}.
|
|
5
|
+
*
|
|
6
|
+
* Each root that fails to parse is silently skipped (a malformed root can
|
|
7
|
+
* never match anything anyway) rather than throwing, matching the existing
|
|
8
|
+
* inline construction this replaces (`@nitpicker/crawler`'s `crawler-orchestrator.ts` `append`
|
|
9
|
+
* and inventory-classification call sites, `Crawler`'s own scope build).
|
|
10
|
+
* Roots sharing a hostname are grouped under one array entry so
|
|
11
|
+
* `findScopeEntry` can pick the most specific match among them.
|
|
12
|
+
* @param roots - Root URL strings (e.g. `Config.roots`).
|
|
13
|
+
* @param options - URL parsing options forwarded to {@link parseUrl}.
|
|
14
|
+
* @returns A hostname-indexed map of parsed root URLs.
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* const scope = buildScopeMap(['https://example.com/blog/', 'https://example.com/docs/']);
|
|
18
|
+
* findScopeEntry(url, scope); // deepest matching root, or null if external
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export function buildScopeMap(roots, options) {
|
|
22
|
+
const scope = new Map();
|
|
23
|
+
for (const raw of roots) {
|
|
24
|
+
const parsed = parseUrl(raw, options);
|
|
25
|
+
if (!parsed) {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
const existing = scope.get(parsed.hostname) ?? [];
|
|
29
|
+
scope.set(parsed.hostname, [...existing, parsed]);
|
|
30
|
+
}
|
|
31
|
+
return scope;
|
|
32
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ExURL, ParseURLOptions } from '@d-zero/shared/parse-url';
|
|
2
|
+
/**
|
|
3
|
+
* Find the most-specific scope entry that contains the given URL.
|
|
4
|
+
*
|
|
5
|
+
* A scope entry is an `(hostname, port, path)` triple. The target URL belongs
|
|
6
|
+
* to a scope entry when its hostname AND port match and its path is at the
|
|
7
|
+
* same level or deeper than the scope entry's path. Among all matching entries,
|
|
8
|
+
* the one with the greatest depth wins (e.g. `/blog/2024/` is preferred over
|
|
9
|
+
* `/blog/`). Port comparison uses the WHATWG-normalized `port` field, so
|
|
10
|
+
* default ports (`80` for http, `443` for https) collapse to an empty string
|
|
11
|
+
* and match each other regardless of whether the user wrote them explicitly.
|
|
12
|
+
* A non-default port like `:3000` only matches scope entries that also carry
|
|
13
|
+
* the same port — this prevents credentialed dev sites (`localhost:3000`)
|
|
14
|
+
* from leaking auth into siblings on the same hostname (`localhost:8080`).
|
|
15
|
+
*
|
|
16
|
+
* Returns `null` if no scope entry contains the URL — i.e. the URL is external.
|
|
17
|
+
* This single function replaces the previous trio of `isExternalUrl`,
|
|
18
|
+
* `isInAnyLowerLayer`, and `findBestMatchingScope`, performing a single
|
|
19
|
+
* hostname lookup and a single pass over the scope array.
|
|
20
|
+
* @param url - The target URL to classify.
|
|
21
|
+
* @param scope - Hostname-indexed map of scope URLs.
|
|
22
|
+
* @param options - URL parsing options forwarded to {@link isLowerLayer}.
|
|
23
|
+
* @returns The deepest matching scope URL, or `null` when the URL is external.
|
|
24
|
+
*/
|
|
25
|
+
export declare function findScopeEntry(url: ExURL, scope: ReadonlyMap<string, readonly ExURL[]>, options?: ParseURLOptions): ExURL | null;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { isLowerLayer } from '@d-zero/shared/is-lower-layer';
|
|
2
|
+
/**
|
|
3
|
+
* Find the most-specific scope entry that contains the given URL.
|
|
4
|
+
*
|
|
5
|
+
* A scope entry is an `(hostname, port, path)` triple. The target URL belongs
|
|
6
|
+
* to a scope entry when its hostname AND port match and its path is at the
|
|
7
|
+
* same level or deeper than the scope entry's path. Among all matching entries,
|
|
8
|
+
* the one with the greatest depth wins (e.g. `/blog/2024/` is preferred over
|
|
9
|
+
* `/blog/`). Port comparison uses the WHATWG-normalized `port` field, so
|
|
10
|
+
* default ports (`80` for http, `443` for https) collapse to an empty string
|
|
11
|
+
* and match each other regardless of whether the user wrote them explicitly.
|
|
12
|
+
* A non-default port like `:3000` only matches scope entries that also carry
|
|
13
|
+
* the same port — this prevents credentialed dev sites (`localhost:3000`)
|
|
14
|
+
* from leaking auth into siblings on the same hostname (`localhost:8080`).
|
|
15
|
+
*
|
|
16
|
+
* Returns `null` if no scope entry contains the URL — i.e. the URL is external.
|
|
17
|
+
* This single function replaces the previous trio of `isExternalUrl`,
|
|
18
|
+
* `isInAnyLowerLayer`, and `findBestMatchingScope`, performing a single
|
|
19
|
+
* hostname lookup and a single pass over the scope array.
|
|
20
|
+
* @param url - The target URL to classify.
|
|
21
|
+
* @param scope - Hostname-indexed map of scope URLs.
|
|
22
|
+
* @param options - URL parsing options forwarded to {@link isLowerLayer}.
|
|
23
|
+
* @returns The deepest matching scope URL, or `null` when the URL is external.
|
|
24
|
+
*/
|
|
25
|
+
export function findScopeEntry(url, scope, options) {
|
|
26
|
+
const scopes = scope.get(url.hostname);
|
|
27
|
+
if (!scopes) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
let bestMatch = null;
|
|
31
|
+
let maxDepth = -1;
|
|
32
|
+
for (const entry of scopes) {
|
|
33
|
+
if (entry.port !== url.port) {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (!isLowerLayer(url, entry, options)) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (entry.depth > maxDepth) {
|
|
40
|
+
bestMatch = entry;
|
|
41
|
+
maxDepth = entry.depth;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return bestMatch;
|
|
45
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { ClassifyArchivePageTemplatesOptions, ClassifyArchivePageTemplatesResult } from './types.js';
|
|
2
|
+
import type Archive from '../archive.js';
|
|
3
|
+
/**
|
|
4
|
+
* Classifies every internal HTML page of the archive into a template group
|
|
5
|
+
* by DOM-structure similarity and persists the result to `page_templates`,
|
|
6
|
+
* `page_template_clusters` and `page_template_labels`.
|
|
7
|
+
*
|
|
8
|
+
* This is the crawl-end derived-data step (alongside the JS-resource scan
|
|
9
|
+
* and the viewer read-model build): the crawl command runs it before the
|
|
10
|
+
* archive is written, and `viewer-build` / `concat` / `split` re-run it on
|
|
11
|
+
* their archive. It is a corpus-wide batch computation (template keys are
|
|
12
|
+
* only comparable within one run), not a per-page one.
|
|
13
|
+
*
|
|
14
|
+
* The signals of every internal HTML page with a stored snapshot are loaded
|
|
15
|
+
* before clustering starts (`loadPageClusterCandidates`: ids and the few
|
|
16
|
+
* columns the classifier reads, no `Page` objects) and clustered **once**,
|
|
17
|
+
* never per loading batch: per-batch keys would only be comparable within
|
|
18
|
+
* their own batch.
|
|
19
|
+
*
|
|
20
|
+
* A run that classifies no page at all (no internal page has a stored HTML
|
|
21
|
+
* snapshot to cluster) leaves the stored classification untouched instead of
|
|
22
|
+
* replacing it with an empty one: nothing could be re-derived, and erasing a
|
|
23
|
+
* previous classification (e.g. rows `concat` copied from its sources) would
|
|
24
|
+
* lose data for no gain. Whenever at least one page is classified the stored
|
|
25
|
+
* classification is replaced wholesale; labels survive either way —
|
|
26
|
+
* `replacePageTemplates` carries them forward across runs and keeps retired
|
|
27
|
+
* ones.
|
|
28
|
+
* @param archive - A writable archive (crawl-end orchestrator archive, or one
|
|
29
|
+
* opened for `viewer-build` / created by `concat` / `split`).
|
|
30
|
+
* @param options - See {@link ClassifyArchivePageTemplatesOptions}.
|
|
31
|
+
* @returns See {@link ClassifyArchivePageTemplatesResult}.
|
|
32
|
+
* @throws {Error} Whatever page loading, clustering or the write throws — callers
|
|
33
|
+
* that treat classification as best-effort (all CLI paths) catch it.
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* const { classifiedPageCount, templateCount } = await classifyArchivePageTemplates(
|
|
37
|
+
* archive,
|
|
38
|
+
* { onProgress: (event) => console.error(event.phase) },
|
|
39
|
+
* );
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare function classifyArchivePageTemplates(archive: Archive, options?: ClassifyArchivePageTemplatesOptions): Promise<ClassifyArchivePageTemplatesResult>;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { classifyPageTemplates } from './classify-page-templates.js';
|
|
2
|
+
import { collectPageIdsWithHtml } from './collect-page-ids-with-html.js';
|
|
3
|
+
import { loadPageClusterCandidates } from './load-page-cluster-candidates.js';
|
|
4
|
+
/**
|
|
5
|
+
* Classifies every internal HTML page of the archive into a template group
|
|
6
|
+
* by DOM-structure similarity and persists the result to `page_templates`,
|
|
7
|
+
* `page_template_clusters` and `page_template_labels`.
|
|
8
|
+
*
|
|
9
|
+
* This is the crawl-end derived-data step (alongside the JS-resource scan
|
|
10
|
+
* and the viewer read-model build): the crawl command runs it before the
|
|
11
|
+
* archive is written, and `viewer-build` / `concat` / `split` re-run it on
|
|
12
|
+
* their archive. It is a corpus-wide batch computation (template keys are
|
|
13
|
+
* only comparable within one run), not a per-page one.
|
|
14
|
+
*
|
|
15
|
+
* The signals of every internal HTML page with a stored snapshot are loaded
|
|
16
|
+
* before clustering starts (`loadPageClusterCandidates`: ids and the few
|
|
17
|
+
* columns the classifier reads, no `Page` objects) and clustered **once**,
|
|
18
|
+
* never per loading batch: per-batch keys would only be comparable within
|
|
19
|
+
* their own batch.
|
|
20
|
+
*
|
|
21
|
+
* A run that classifies no page at all (no internal page has a stored HTML
|
|
22
|
+
* snapshot to cluster) leaves the stored classification untouched instead of
|
|
23
|
+
* replacing it with an empty one: nothing could be re-derived, and erasing a
|
|
24
|
+
* previous classification (e.g. rows `concat` copied from its sources) would
|
|
25
|
+
* lose data for no gain. Whenever at least one page is classified the stored
|
|
26
|
+
* classification is replaced wholesale; labels survive either way —
|
|
27
|
+
* `replacePageTemplates` carries them forward across runs and keeps retired
|
|
28
|
+
* ones.
|
|
29
|
+
* @param archive - A writable archive (crawl-end orchestrator archive, or one
|
|
30
|
+
* opened for `viewer-build` / created by `concat` / `split`).
|
|
31
|
+
* @param options - See {@link ClassifyArchivePageTemplatesOptions}.
|
|
32
|
+
* @returns See {@link ClassifyArchivePageTemplatesResult}.
|
|
33
|
+
* @throws {Error} Whatever page loading, clustering or the write throws — callers
|
|
34
|
+
* that treat classification as best-effort (all CLI paths) catch it.
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* const { classifiedPageCount, templateCount } = await classifyArchivePageTemplates(
|
|
38
|
+
* archive,
|
|
39
|
+
* { onProgress: (event) => console.error(event.phase) },
|
|
40
|
+
* );
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export async function classifyArchivePageTemplates(archive, options = {}) {
|
|
44
|
+
const { memoryBudget, onProgress } = options;
|
|
45
|
+
onProgress?.({ phase: 'listing-html-snapshots' });
|
|
46
|
+
const pageIdsWithHtml = await collectPageIdsWithHtml(archive);
|
|
47
|
+
onProgress?.({ phase: 'loading-pages-start' });
|
|
48
|
+
const candidates = await loadPageClusterCandidates(archive, {
|
|
49
|
+
pageIdsWithHtml,
|
|
50
|
+
...(onProgress ? { onProgress } : {}),
|
|
51
|
+
});
|
|
52
|
+
const classification = await classifyPageTemplates({
|
|
53
|
+
archive,
|
|
54
|
+
candidates,
|
|
55
|
+
...(memoryBudget === undefined ? {} : { memoryBudget }),
|
|
56
|
+
onProgress,
|
|
57
|
+
});
|
|
58
|
+
if (classification.templateKeysByUrl.size > 0) {
|
|
59
|
+
onProgress?.({
|
|
60
|
+
phase: 'writing-results',
|
|
61
|
+
templateCount: new Set(classification.templateKeysByUrl.values()).size,
|
|
62
|
+
});
|
|
63
|
+
await archive.replacePageTemplates(classification.templateKeysByUrl, classification.clusterReasonsByTemplateKey);
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
classifiedPageCount: classification.templateKeysByUrl.size,
|
|
67
|
+
templateCount: new Set(classification.templateKeysByUrl.values()).size,
|
|
68
|
+
sampledBlocks: classification.sampledBlocks,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ClassifyPageTemplatesOptions, PageTemplateClassification } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Classifies every internal HTML page in the archive into a template group
|
|
4
|
+
* by DOM-structure similarity, using the classifier `./page-cluster/` drives
|
|
5
|
+
* in `@nitpicker/core`.
|
|
6
|
+
*
|
|
7
|
+
* The result is deliberately **not cached**. A cache keyed on the archive
|
|
8
|
+
* file's identity (path + size + mtime + page count) cannot be correct at the
|
|
9
|
+
* only point this runs — the end of a crawl, before the archive is written
|
|
10
|
+
* back: `archive.filePath` then still names the previous tar (or nothing), so
|
|
11
|
+
* a `--retry-failed` run that replaces a failed page's HTML without changing
|
|
12
|
+
* the page count would be served the previous classification. A crash during
|
|
13
|
+
* classification leaves the crawl's stub directory in place, and resuming it
|
|
14
|
+
* re-runs this step from scratch; the classifier has no mid-computation
|
|
15
|
+
* checkpoint to resume from either.
|
|
16
|
+
*
|
|
17
|
+
* Internally: the driver's `resolvePageClusterKeys` returns a `clusterKey`
|
|
18
|
+
* per page; this function's public naming is `templateKey`, to avoid
|
|
19
|
+
* colliding with nitpicker's unrelated pre-existing "isolated cluster"
|
|
20
|
+
* concept (`@nitpicker/query`'s `compute-isolated-clusters.ts`,
|
|
21
|
+
* link-reachability graph components — a completely different kind of
|
|
22
|
+
* grouping from DOM-structure similarity).
|
|
23
|
+
* @param options - See {@link ClassifyPageTemplatesOptions}.
|
|
24
|
+
* @returns See {@link PageTemplateClassification}.
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* const pageIdsWithHtml = await collectPageIdsWithHtml(archive);
|
|
28
|
+
* const candidates = await loadPageClusterCandidates(archive, { pageIdsWithHtml });
|
|
29
|
+
* const { templateKeysByUrl } = await classifyPageTemplates({ archive, candidates });
|
|
30
|
+
* await archive.replacePageTemplates(templateKeysByUrl);
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare function classifyPageTemplates(options: ClassifyPageTemplatesOptions): Promise<PageTemplateClassification>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { collectPageStylesheetUrls } from './collect-page-stylesheet-urls.js';
|
|
2
|
+
import { createPageClusterFactory } from './create-page-cluster-factory.js';
|
|
3
|
+
import { resolvePageClusterKeys } from './page-cluster/resolve-page-cluster-keys.js';
|
|
4
|
+
/**
|
|
5
|
+
* Classifies every internal HTML page in the archive into a template group
|
|
6
|
+
* by DOM-structure similarity, using the classifier `./page-cluster/` drives
|
|
7
|
+
* in `@nitpicker/core`.
|
|
8
|
+
*
|
|
9
|
+
* The result is deliberately **not cached**. A cache keyed on the archive
|
|
10
|
+
* file's identity (path + size + mtime + page count) cannot be correct at the
|
|
11
|
+
* only point this runs — the end of a crawl, before the archive is written
|
|
12
|
+
* back: `archive.filePath` then still names the previous tar (or nothing), so
|
|
13
|
+
* a `--retry-failed` run that replaces a failed page's HTML without changing
|
|
14
|
+
* the page count would be served the previous classification. A crash during
|
|
15
|
+
* classification leaves the crawl's stub directory in place, and resuming it
|
|
16
|
+
* re-runs this step from scratch; the classifier has no mid-computation
|
|
17
|
+
* checkpoint to resume from either.
|
|
18
|
+
*
|
|
19
|
+
* Internally: the driver's `resolvePageClusterKeys` returns a `clusterKey`
|
|
20
|
+
* per page; this function's public naming is `templateKey`, to avoid
|
|
21
|
+
* colliding with nitpicker's unrelated pre-existing "isolated cluster"
|
|
22
|
+
* concept (`@nitpicker/query`'s `compute-isolated-clusters.ts`,
|
|
23
|
+
* link-reachability graph components — a completely different kind of
|
|
24
|
+
* grouping from DOM-structure similarity).
|
|
25
|
+
* @param options - See {@link ClassifyPageTemplatesOptions}.
|
|
26
|
+
* @returns See {@link PageTemplateClassification}.
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* const pageIdsWithHtml = await collectPageIdsWithHtml(archive);
|
|
30
|
+
* const candidates = await loadPageClusterCandidates(archive, { pageIdsWithHtml });
|
|
31
|
+
* const { templateKeysByUrl } = await classifyPageTemplates({ archive, candidates });
|
|
32
|
+
* await archive.replacePageTemplates(templateKeysByUrl);
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export async function classifyPageTemplates(options) {
|
|
36
|
+
const { archive, candidates, memoryBudget, onProgress } = options;
|
|
37
|
+
onProgress?.({ phase: 'collecting-stylesheets' });
|
|
38
|
+
const stylesheetsByUrl = await collectPageStylesheetUrls(archive);
|
|
39
|
+
const { factory, urls } = createPageClusterFactory({
|
|
40
|
+
archive,
|
|
41
|
+
candidates,
|
|
42
|
+
stylesheetsByUrl,
|
|
43
|
+
});
|
|
44
|
+
const { keys, reasons, sampledBlocks } = await resolvePageClusterKeys(factory, {
|
|
45
|
+
...(memoryBudget === undefined ? {} : { memoryBudget }),
|
|
46
|
+
...(onProgress ? { onProgress } : {}),
|
|
47
|
+
});
|
|
48
|
+
if (keys.length !== urls.length) {
|
|
49
|
+
// Would silently mis-map template keys to the wrong URLs if allowed
|
|
50
|
+
// through; the driver returns one key per page read, so this guards a
|
|
51
|
+
// broken invariant loudly rather than assigning quietly.
|
|
52
|
+
throw new Error(`classifyPageTemplates: resolvePageClusterKeys returned ${keys.length} keys for ${urls.length} pages.`);
|
|
53
|
+
}
|
|
54
|
+
const templateKeysByUrl = new Map();
|
|
55
|
+
for (const [index, url] of urls.entries()) {
|
|
56
|
+
templateKeysByUrl.set(url, keys[index]);
|
|
57
|
+
}
|
|
58
|
+
const clusterReasonsByTemplateKey = reasons;
|
|
59
|
+
return { templateKeysByUrl, clusterReasonsByTemplateKey, sampledBlocks };
|
|
60
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type Archive from '../archive.js';
|
|
2
|
+
/**
|
|
3
|
+
* Collects the ids (`Page.id`) of the pages that have a non-empty HTML
|
|
4
|
+
* snapshot stored, without decompressing any of them.
|
|
5
|
+
*
|
|
6
|
+
* Template classification reads only pages with HTML, and its engine reads
|
|
7
|
+
* the corpus several times, decompressing each page only on the reads that
|
|
8
|
+
* use it. Which pages take part has to be known before the first read, the
|
|
9
|
+
* same on every read: deciding it by calling `Page.getHtml()` would
|
|
10
|
+
* decompress every page on every read. A snapshot is non-empty exactly when
|
|
11
|
+
* its raw UTF-8 size (`page_html_blobs.size_raw`, recorded when it was
|
|
12
|
+
* written) is above zero, and a page whose `page_html_ref` points at no blob
|
|
13
|
+
* reads back as `null` — both match what `Page.getHtml()` returns. Keyed by
|
|
14
|
+
* id, not URL, so the answer is the page's own, whatever its URL normalizes
|
|
15
|
+
* to.
|
|
16
|
+
* @param archive - The archive to read from.
|
|
17
|
+
* @returns The ids, in no particular order.
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* const pageIdsWithHtml = await collectPageIdsWithHtml(archive);
|
|
21
|
+
* const pagesWithHtml = pages.filter((page) => pageIdsWithHtml.has(page.id));
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function collectPageIdsWithHtml(archive: Archive): Promise<Set<number>>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collects the ids (`Page.id`) of the pages that have a non-empty HTML
|
|
3
|
+
* snapshot stored, without decompressing any of them.
|
|
4
|
+
*
|
|
5
|
+
* Template classification reads only pages with HTML, and its engine reads
|
|
6
|
+
* the corpus several times, decompressing each page only on the reads that
|
|
7
|
+
* use it. Which pages take part has to be known before the first read, the
|
|
8
|
+
* same on every read: deciding it by calling `Page.getHtml()` would
|
|
9
|
+
* decompress every page on every read. A snapshot is non-empty exactly when
|
|
10
|
+
* its raw UTF-8 size (`page_html_blobs.size_raw`, recorded when it was
|
|
11
|
+
* written) is above zero, and a page whose `page_html_ref` points at no blob
|
|
12
|
+
* reads back as `null` — both match what `Page.getHtml()` returns. Keyed by
|
|
13
|
+
* id, not URL, so the answer is the page's own, whatever its URL normalizes
|
|
14
|
+
* to.
|
|
15
|
+
* @param archive - The archive to read from.
|
|
16
|
+
* @returns The ids, in no particular order.
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* const pageIdsWithHtml = await collectPageIdsWithHtml(archive);
|
|
20
|
+
* const pagesWithHtml = pages.filter((page) => pageIdsWithHtml.has(page.id));
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export async function collectPageIdsWithHtml(archive) {
|
|
24
|
+
const rows = await archive
|
|
25
|
+
.getKnex()('page_html_ref as ref')
|
|
26
|
+
.join('page_html_blobs as blob', 'blob.hash', 'ref.hash')
|
|
27
|
+
.where('blob.size_raw', '>', 0)
|
|
28
|
+
.select('ref.page_id as pageId');
|
|
29
|
+
return new Set(rows.map((row) => row.pageId));
|
|
30
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type Archive from '../archive.js';
|
|
2
|
+
/**
|
|
3
|
+
* Collects, for every page that references at least one CSS stylesheet, the
|
|
4
|
+
* set of stylesheet URLs it references.
|
|
5
|
+
*
|
|
6
|
+
* Reads in three narrow passes instead of one wide JOIN, to avoid
|
|
7
|
+
* materializing the full page×stylesheet edge set at once — a real
|
|
8
|
+
* 486,000-page archive has ~2.5 million such edges, and a single JOIN
|
|
9
|
+
* projecting both URL strings for all of them is a transient allocation
|
|
10
|
+
* spike well beyond what any single page's data actually needs:
|
|
11
|
+
*
|
|
12
|
+
* 1. Resolve which `resource_items` rows are classified `'css'`
|
|
13
|
+
* (`content_type_refs.category`) and their stylesheet URL.
|
|
14
|
+
* 2. Resolve `resource_ref_edges` for just those CSS resource ids, in
|
|
15
|
+
* chunks, projecting only the two integer ids per row.
|
|
16
|
+
* 3. Resolve the page ids collected in step 2 to their URLs.
|
|
17
|
+
*
|
|
18
|
+
* Identical stylesheet-URL arrays are interned across pages: pages sharing a
|
|
19
|
+
* template share the same CSS set, so the number of distinct arrays
|
|
20
|
+
* converges to a few hundred even across hundreds of thousands of pages.
|
|
21
|
+
* @param archive - The archive to read from.
|
|
22
|
+
* @returns Map from page URL (parseUrl-normalized `href`, matching
|
|
23
|
+
* `Page.url.href`) to the stylesheet URLs it references. Pages that
|
|
24
|
+
* reference no CSS resource have no entry — callers should default to an
|
|
25
|
+
* empty array on a missed lookup.
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* const stylesheetsByUrl = await collectPageStylesheetUrls(archive);
|
|
29
|
+
* const hrefs = stylesheetsByUrl.get(page.url.href) ?? [];
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare function collectPageStylesheetUrls(archive: Archive): Promise<Map<string, readonly string[]>>;
|