@nitpicker/archive 0.0.0 → 0.25.0
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 +1056 -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 +804 -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 +47 -0
- package/lib/filesystem/parse-tar-size-field.d.ts +13 -0
- package/lib/filesystem/parse-tar-size-field.js +40 -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 +130 -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/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
package/lib/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Computes the Tier A alias key for `url`: two URLs share a Tier A key when
|
|
3
|
+
* they differ only by scheme (`http` vs `https` are folded together),
|
|
4
|
+
* host letter-casing, or a `/index.{ext}` path suffix — differences that
|
|
5
|
+
* are safe to treat as "the same resource" from the URL string alone, with
|
|
6
|
+
* no need to compare rendered content.
|
|
7
|
+
*
|
|
8
|
+
* This is a canonical-key function, not a pairwise comparator: grouping
|
|
9
|
+
* rows by exact string equality of this function's output is definitionally
|
|
10
|
+
* an equivalence relation (reflexive, symmetric, transitive). A pairwise
|
|
11
|
+
* "roughly equal" comparison would not be: non-transitivity is inherent to
|
|
12
|
+
* pairwise comparators (see ARCHITECTURE.md's "URL の自然順は、2 件ずつ比べる
|
|
13
|
+
* 比較関数ではなくバイト列キーの全順序で決める"), and does not apply to a
|
|
14
|
+
* canonical-key partition like this one.
|
|
15
|
+
*
|
|
16
|
+
* The query string is kept in the key as written — not normalized, reordered
|
|
17
|
+
* or dropped — so two URLs that differ only in their query never share a key:
|
|
18
|
+
* a query-string difference is not addressed by this feature (out of scope —
|
|
19
|
+
* see the `body_hash` masking, a separate content-hash-based mechanism, for
|
|
20
|
+
* detecting meaningless-parameter duplicates). The fragment is left out:
|
|
21
|
+
* fragments are client-side only and never affect server-rendered content.
|
|
22
|
+
*
|
|
23
|
+
* Each call crosses into the addon and parses the URL, and the addon builds
|
|
24
|
+
* both tiers' keys from that parse: to group many pages, use
|
|
25
|
+
* `groupAliasCandidates`, which parses each URL once for both keys, rather
|
|
26
|
+
* than calling this and `computeTierBAliasKey` per URL.
|
|
27
|
+
*
|
|
28
|
+
* The key is computed in the native addon (`@nitpicker/core`,
|
|
29
|
+
* `crates/nitpicker_url_key`). The JavaScript implementation
|
|
30
|
+
* (`parse-alias-key-parts.ts`, `format-alias-key.ts`) is not called from here
|
|
31
|
+
* and is excluded from the build: it is the oracle for
|
|
32
|
+
* `compute-alias-keys.parity.spec.ts`, which pins the addon to it, and so to
|
|
33
|
+
* the groupings existing archives already store (`content_items.alias_of_id`).
|
|
34
|
+
* @param url - The URL string to compute a key for.
|
|
35
|
+
* @returns The Tier A key, or `null` if `url` is not a parseable http(s) URL.
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* computeTierAAliasKey('http://Example.com/about/index.html');
|
|
39
|
+
* // 'example.com/about/'
|
|
40
|
+
* computeTierAAliasKey('https://example.com/about/');
|
|
41
|
+
* // 'example.com/about/' -- same key: scheme and /index.html are folded
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function computeTierAAliasKey(url: string): string | null;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { computeAliasKeys } from '@nitpicker/core/compute-alias-keys';
|
|
2
|
+
/**
|
|
3
|
+
* Computes the Tier A alias key for `url`: two URLs share a Tier A key when
|
|
4
|
+
* they differ only by scheme (`http` vs `https` are folded together),
|
|
5
|
+
* host letter-casing, or a `/index.{ext}` path suffix — differences that
|
|
6
|
+
* are safe to treat as "the same resource" from the URL string alone, with
|
|
7
|
+
* no need to compare rendered content.
|
|
8
|
+
*
|
|
9
|
+
* This is a canonical-key function, not a pairwise comparator: grouping
|
|
10
|
+
* rows by exact string equality of this function's output is definitionally
|
|
11
|
+
* an equivalence relation (reflexive, symmetric, transitive). A pairwise
|
|
12
|
+
* "roughly equal" comparison would not be: non-transitivity is inherent to
|
|
13
|
+
* pairwise comparators (see ARCHITECTURE.md's "URL の自然順は、2 件ずつ比べる
|
|
14
|
+
* 比較関数ではなくバイト列キーの全順序で決める"), and does not apply to a
|
|
15
|
+
* canonical-key partition like this one.
|
|
16
|
+
*
|
|
17
|
+
* The query string is kept in the key as written — not normalized, reordered
|
|
18
|
+
* or dropped — so two URLs that differ only in their query never share a key:
|
|
19
|
+
* a query-string difference is not addressed by this feature (out of scope —
|
|
20
|
+
* see the `body_hash` masking, a separate content-hash-based mechanism, for
|
|
21
|
+
* detecting meaningless-parameter duplicates). The fragment is left out:
|
|
22
|
+
* fragments are client-side only and never affect server-rendered content.
|
|
23
|
+
*
|
|
24
|
+
* Each call crosses into the addon and parses the URL, and the addon builds
|
|
25
|
+
* both tiers' keys from that parse: to group many pages, use
|
|
26
|
+
* `groupAliasCandidates`, which parses each URL once for both keys, rather
|
|
27
|
+
* than calling this and `computeTierBAliasKey` per URL.
|
|
28
|
+
*
|
|
29
|
+
* The key is computed in the native addon (`@nitpicker/core`,
|
|
30
|
+
* `crates/nitpicker_url_key`). The JavaScript implementation
|
|
31
|
+
* (`parse-alias-key-parts.ts`, `format-alias-key.ts`) is not called from here
|
|
32
|
+
* and is excluded from the build: it is the oracle for
|
|
33
|
+
* `compute-alias-keys.parity.spec.ts`, which pins the addon to it, and so to
|
|
34
|
+
* the groupings existing archives already store (`content_items.alias_of_id`).
|
|
35
|
+
* @param url - The URL string to compute a key for.
|
|
36
|
+
* @returns The Tier A key, or `null` if `url` is not a parseable http(s) URL.
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* computeTierAAliasKey('http://Example.com/about/index.html');
|
|
40
|
+
* // 'example.com/about/'
|
|
41
|
+
* computeTierAAliasKey('https://example.com/about/');
|
|
42
|
+
* // 'example.com/about/' -- same key: scheme and /index.html are folded
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export function computeTierAAliasKey(url) {
|
|
46
|
+
return computeAliasKeys(url)?.tierA ?? null;
|
|
47
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Computes the Tier B alias key for `url`: like `computeTierAAliasKey`,
|
|
3
|
+
* but additionally strips one trailing `/` from the path (the bare root
|
|
4
|
+
* path `/` is left alone). Two URLs sharing a Tier B key differ only by
|
|
5
|
+
* trailing-slash presence — a resource-identity signal considerably weaker
|
|
6
|
+
* than Tier A's (a web server can legitimately serve different content at
|
|
7
|
+
* `/foo` and `/foo/`), so callers must additionally require a matching
|
|
8
|
+
* `page_meta.body_hash` before treating a Tier B match as the same page.
|
|
9
|
+
*
|
|
10
|
+
* Computed in the native addon like the Tier A key — one call and one parse
|
|
11
|
+
* per URL, so to group many pages use `groupAliasCandidates` — see
|
|
12
|
+
* `computeTierAAliasKey` for what stays as the oracle.
|
|
13
|
+
* @param url - The URL string to compute a key for.
|
|
14
|
+
* @returns The Tier B key, or `null` if `url` is not a parseable http(s) URL.
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* computeTierBAliasKey('https://example.com/foo');
|
|
18
|
+
* computeTierBAliasKey('https://example.com/foo/');
|
|
19
|
+
* // both: 'example.com/foo' -- same key, but the caller must still confirm
|
|
20
|
+
* // a matching body_hash before merging these as the same page.
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare function computeTierBAliasKey(url: string): string | null;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { computeAliasKeys } from '@nitpicker/core/compute-alias-keys';
|
|
2
|
+
/**
|
|
3
|
+
* Computes the Tier B alias key for `url`: like `computeTierAAliasKey`,
|
|
4
|
+
* but additionally strips one trailing `/` from the path (the bare root
|
|
5
|
+
* path `/` is left alone). Two URLs sharing a Tier B key differ only by
|
|
6
|
+
* trailing-slash presence — a resource-identity signal considerably weaker
|
|
7
|
+
* than Tier A's (a web server can legitimately serve different content at
|
|
8
|
+
* `/foo` and `/foo/`), so callers must additionally require a matching
|
|
9
|
+
* `page_meta.body_hash` before treating a Tier B match as the same page.
|
|
10
|
+
*
|
|
11
|
+
* Computed in the native addon like the Tier A key — one call and one parse
|
|
12
|
+
* per URL, so to group many pages use `groupAliasCandidates` — see
|
|
13
|
+
* `computeTierAAliasKey` for what stays as the oracle.
|
|
14
|
+
* @param url - The URL string to compute a key for.
|
|
15
|
+
* @returns The Tier B key, or `null` if `url` is not a parseable http(s) URL.
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* computeTierBAliasKey('https://example.com/foo');
|
|
19
|
+
* computeTierBAliasKey('https://example.com/foo/');
|
|
20
|
+
* // both: 'example.com/foo' -- same key, but the caller must still confirm
|
|
21
|
+
* // a matching body_hash before merging these as the same page.
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export function computeTierBAliasKey(url) {
|
|
25
|
+
return computeAliasKeys(url)?.tierB ?? null;
|
|
26
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AliasCandidate } from '@nitpicker/core/types';
|
|
2
|
+
/**
|
|
3
|
+
* Groups the pages that are the same page under another URL
|
|
4
|
+
* (`content_items.alias_of_id`) and elects each group's representative: the
|
|
5
|
+
* pages whose Tier A key (`computeTierAAliasKey`) and title match, or whose
|
|
6
|
+
* Tier B key (`computeTierBAliasKey`), title and body hash match, and the
|
|
7
|
+
* pages chained to them by either.
|
|
8
|
+
*
|
|
9
|
+
* `@nitpicker/query` reaches the native addon through this archive function
|
|
10
|
+
* (see ARCHITECTURE.md's dependency rule); the full grouping and election rules
|
|
11
|
+
* are the docs of `groupAliasCandidates` in `@nitpicker/core`, which this
|
|
12
|
+
* calls as it is. The persisted result is pinned to the JavaScript reference by
|
|
13
|
+
* `group-alias-candidates.parity.spec.ts` and `scripts/isolated-alias-golden.mjs`.
|
|
14
|
+
* @param candidates - The pages. `urlId` is `url_refs.id`: two candidates
|
|
15
|
+
* have the same URL exactly when they have the same id.
|
|
16
|
+
* @returns For each candidate, the index of its group's representative, or
|
|
17
|
+
* `-1` for a representative and for a candidate in a group of one.
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* const page = { titleTextId: 1, canonicalUrlId: null, bodyHash: null };
|
|
21
|
+
* groupAliasCandidates([
|
|
22
|
+
* { ...page, url: 'https://example.com/about/index.html', urlId: 1 },
|
|
23
|
+
* { ...page, url: 'https://example.com/about/', urlId: 2 },
|
|
24
|
+
* ]); // Int32Array [1, -1]
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare function groupAliasCandidates(candidates: readonly AliasCandidate[]): Int32Array;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { groupAliasCandidates as groupAliasCandidatesNative } from '@nitpicker/core/group-alias-candidates';
|
|
2
|
+
/**
|
|
3
|
+
* Groups the pages that are the same page under another URL
|
|
4
|
+
* (`content_items.alias_of_id`) and elects each group's representative: the
|
|
5
|
+
* pages whose Tier A key (`computeTierAAliasKey`) and title match, or whose
|
|
6
|
+
* Tier B key (`computeTierBAliasKey`), title and body hash match, and the
|
|
7
|
+
* pages chained to them by either.
|
|
8
|
+
*
|
|
9
|
+
* `@nitpicker/query` reaches the native addon through this archive function
|
|
10
|
+
* (see ARCHITECTURE.md's dependency rule); the full grouping and election rules
|
|
11
|
+
* are the docs of `groupAliasCandidates` in `@nitpicker/core`, which this
|
|
12
|
+
* calls as it is. The persisted result is pinned to the JavaScript reference by
|
|
13
|
+
* `group-alias-candidates.parity.spec.ts` and `scripts/isolated-alias-golden.mjs`.
|
|
14
|
+
* @param candidates - The pages. `urlId` is `url_refs.id`: two candidates
|
|
15
|
+
* have the same URL exactly when they have the same id.
|
|
16
|
+
* @returns For each candidate, the index of its group's representative, or
|
|
17
|
+
* `-1` for a representative and for a candidate in a group of one.
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* const page = { titleTextId: 1, canonicalUrlId: null, bodyHash: null };
|
|
21
|
+
* groupAliasCandidates([
|
|
22
|
+
* { ...page, url: 'https://example.com/about/index.html', urlId: 1 },
|
|
23
|
+
* { ...page, url: 'https://example.com/about/', urlId: 2 },
|
|
24
|
+
* ]); // Int32Array [1, -1]
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export function groupAliasCandidates(candidates) {
|
|
28
|
+
return groupAliasCandidatesNative(candidates);
|
|
29
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Components a Tier A / Tier B alias key is built from. Used only by the
|
|
3
|
+
* JavaScript alias-key implementation (`parse-alias-key-parts.ts`,
|
|
4
|
+
* `format-alias-key.ts`), which is the parity oracle for the native keys and
|
|
5
|
+
* is excluded from the build (`tsconfig.json`).
|
|
6
|
+
*/
|
|
7
|
+
export interface AliasKeyParts {
|
|
8
|
+
host: string;
|
|
9
|
+
port: string;
|
|
10
|
+
path: string;
|
|
11
|
+
search: string;
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Computes a URL "shape" key: the host plus path/query with every path
|
|
3
|
+
* segment that contains a digit collapsed to a fixed placeholder, and every
|
|
4
|
+
* query value (regardless of content) collapsed to a fixed placeholder.
|
|
5
|
+
*
|
|
6
|
+
* This absorbs both the "numeric pager" trap shape (`/news/date/2024/` and
|
|
7
|
+
* `/news/date/1.5e+32/` collapse to the same key) and the "query trap" shape
|
|
8
|
+
* (`?page=1` / `?page=2` / `?session=ab12cd` all collapse to the same key),
|
|
9
|
+
* without needing two separate `parentPath` definitions the way issue
|
|
10
|
+
* #208's original proposal did.
|
|
11
|
+
*
|
|
12
|
+
* Uses `./decompose-url.ts` (the pagination-detection one) — NOT
|
|
13
|
+
* `../populate-ref-tables/decompose-url.ts`, an unrelated same-named
|
|
14
|
+
* module with a different `DecomposedUrl` shape used for ref-table population.
|
|
15
|
+
*
|
|
16
|
+
* The masking rule here is the deliberate inverse of the body-hash mask
|
|
17
|
+
* (`@nitpicker/core`'s `crates/nitpicker_html_scan/src/mask_dynamic_ids.rs`,
|
|
18
|
+
* which `../body-hash/compute-body-hash.ts` runs): that mask leaves
|
|
19
|
+
* pure-digit tokens untouched (they are more likely stable content than a
|
|
20
|
+
* dynamic id) and only masks mixed alphanumeric runs. A shape key needs the
|
|
21
|
+
* opposite: ANY digit inside a path segment marks it as "probably a
|
|
22
|
+
* pagination/date/id token", so the whole segment is collapsed. Do not share
|
|
23
|
+
* masking logic between the two — they classify the same kind of text for
|
|
24
|
+
* opposite purposes.
|
|
25
|
+
*
|
|
26
|
+
* Query keys are additionally run through `flattenQueryKeys` before being
|
|
27
|
+
* folded into the key, because `ExURL`'s query normalization (`URLSearchParams`
|
|
28
|
+
* decode-then-re-encode round trip in `@d-zero/shared/parse-url`) means a
|
|
29
|
+
* site that double-encodes `&`/`=` inside a query value produces a URL whose
|
|
30
|
+
* query string still arrives here percent-encoded — `decomposeUrl`'s literal
|
|
31
|
+
* `&`/`=` split then sees ONE key that is itself a percent-encoded
|
|
32
|
+
* `key=value&key=value...` blob, with any variable content buried inside
|
|
33
|
+
* that key name rather than in a value. Without flattening, every such URL
|
|
34
|
+
* gets a distinct key name and therefore a distinct shape key, which
|
|
35
|
+
* silently defeats `--dedupe-cap` (issue #351) no matter the threshold.
|
|
36
|
+
*
|
|
37
|
+
* This changes the shape key computed for URLs that hit the flattening
|
|
38
|
+
* path. `dedupe_cap_events.shape_key` (see `archive/create-adjunct-tables.ts`)
|
|
39
|
+
* is an append-only value frozen at crawl time and never rewritten, so an
|
|
40
|
+
* archive crawled before this fix that happened to already have a
|
|
41
|
+
* `dedupe_cap_events` row for such a URL (rare, since the bug largely
|
|
42
|
+
* prevented capping from firing on it in the first place) will not
|
|
43
|
+
* re-match on the next `backfillDedupeCapEventId` recompute — the same
|
|
44
|
+
* self-healing-backfill trade-off any shape-key algorithm change makes.
|
|
45
|
+
* @param url - A URL string (protocol-agnostic `//host/...` or full
|
|
46
|
+
* `https://host/...`), typically `ExURL.withoutHashAndAuth`.
|
|
47
|
+
* @returns The shape key, or `null` if `url` cannot be decomposed.
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* computeShapeKey('//example.com/news/date/2024/');
|
|
51
|
+
* // => 'example.com/news/date/{n}/'
|
|
52
|
+
* computeShapeKey('//example.com/news/date/1.5e+32/');
|
|
53
|
+
* // => 'example.com/news/date/{n}/' — same shape
|
|
54
|
+
* computeShapeKey('//example.com/list?page=1');
|
|
55
|
+
* // => 'example.com/list?page={v}'
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare function computeShapeKey(url: string): string | null;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { decodeURIComponentSafely } from '@d-zero/shared/decode-uri-safely';
|
|
2
|
+
import { decomposeUrl } from './decompose-url.js';
|
|
3
|
+
const DIGIT_CONTAINING_SEGMENT_PATTERN = /\d/;
|
|
4
|
+
const SEGMENT_PLACEHOLDER = '{n}';
|
|
5
|
+
const VALUE_PLACEHOLDER = '{v}';
|
|
6
|
+
/**
|
|
7
|
+
* Recursively decodes and re-splits a single query key that may itself be a
|
|
8
|
+
* percent-encoded `key=value&key=value...` blob (see the "query trap" case
|
|
9
|
+
* in `computeShapeKey`'s doc comment), peeling one layer of encoding at a
|
|
10
|
+
* time so a multiply-encoded blob (`%2526` → `%26` → `&`) still converges.
|
|
11
|
+
*
|
|
12
|
+
* Each call first decodes via `decodeURIComponentSafely` (falls back to the
|
|
13
|
+
* input unchanged on malformed `%` sequences). If decoding changed
|
|
14
|
+
* anything, there may be another layer underneath, so it recurses on the
|
|
15
|
+
* decoded string to peel further. Once decoding is a no-op (fully decoded,
|
|
16
|
+
* or undecodable), the value is at a fixed point: split on `&`/`=` if
|
|
17
|
+
* either is now present and recurse on the pieces (each piece may need its
|
|
18
|
+
* own decode chain); otherwise it's a leaf.
|
|
19
|
+
*
|
|
20
|
+
* Every recursive call operates on a string strictly shorter than its
|
|
21
|
+
* input — a successful decode always shrinks length (a `%XX` triplet never
|
|
22
|
+
* expands to more than 1 output character), and splitting on a delimiter
|
|
23
|
+
* that is present at a fixed point always yields a strictly shorter piece
|
|
24
|
+
* — so this terminates for any finite input without needing an explicit
|
|
25
|
+
* depth limit.
|
|
26
|
+
* @param key - A single raw query key, as returned by `decomposeUrl`.
|
|
27
|
+
* @returns The one or more sub-key names this key flattens to.
|
|
28
|
+
*/
|
|
29
|
+
function flattenQueryKey(key) {
|
|
30
|
+
const decoded = decodeURIComponentSafely(key);
|
|
31
|
+
if (decoded !== key)
|
|
32
|
+
return flattenQueryKey(decoded);
|
|
33
|
+
if (!decoded.includes('=') && !decoded.includes('&'))
|
|
34
|
+
return [decoded];
|
|
35
|
+
return decoded.split('&').flatMap((pair) => flattenQueryKey(pair.split('=')[0] ?? ''));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Flattens and normalizes a list of query keys so that keys whose variable
|
|
39
|
+
* content leaked into the key name itself (via nested percent-encoding)
|
|
40
|
+
* still converge to the same set of sub-key names regardless of the
|
|
41
|
+
* variable values or the sub-pairs' original order.
|
|
42
|
+
*
|
|
43
|
+
* Deliberately does NOT deduplicate the flattened keys: a legitimate
|
|
44
|
+
* multi-value query (`?tag=a&tag=b`) must stay distinguishable from a
|
|
45
|
+
* single-value one (`?tag=a`) — collapsing repeated key names would fold
|
|
46
|
+
* pages with a different facet count into the same shape, which is a
|
|
47
|
+
* correctness regression unrelated to the encoding bug this function fixes.
|
|
48
|
+
* @param keys - Raw query keys, as returned by `decomposeUrl`.
|
|
49
|
+
* @returns The flattened, sorted key names.
|
|
50
|
+
*/
|
|
51
|
+
function flattenQueryKeys(keys) {
|
|
52
|
+
return keys
|
|
53
|
+
.flatMap((key) => flattenQueryKey(key))
|
|
54
|
+
.toSorted((a, b) => a.localeCompare(b));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Computes a URL "shape" key: the host plus path/query with every path
|
|
58
|
+
* segment that contains a digit collapsed to a fixed placeholder, and every
|
|
59
|
+
* query value (regardless of content) collapsed to a fixed placeholder.
|
|
60
|
+
*
|
|
61
|
+
* This absorbs both the "numeric pager" trap shape (`/news/date/2024/` and
|
|
62
|
+
* `/news/date/1.5e+32/` collapse to the same key) and the "query trap" shape
|
|
63
|
+
* (`?page=1` / `?page=2` / `?session=ab12cd` all collapse to the same key),
|
|
64
|
+
* without needing two separate `parentPath` definitions the way issue
|
|
65
|
+
* #208's original proposal did.
|
|
66
|
+
*
|
|
67
|
+
* Uses `./decompose-url.ts` (the pagination-detection one) — NOT
|
|
68
|
+
* `../populate-ref-tables/decompose-url.ts`, an unrelated same-named
|
|
69
|
+
* module with a different `DecomposedUrl` shape used for ref-table population.
|
|
70
|
+
*
|
|
71
|
+
* The masking rule here is the deliberate inverse of the body-hash mask
|
|
72
|
+
* (`@nitpicker/core`'s `crates/nitpicker_html_scan/src/mask_dynamic_ids.rs`,
|
|
73
|
+
* which `../body-hash/compute-body-hash.ts` runs): that mask leaves
|
|
74
|
+
* pure-digit tokens untouched (they are more likely stable content than a
|
|
75
|
+
* dynamic id) and only masks mixed alphanumeric runs. A shape key needs the
|
|
76
|
+
* opposite: ANY digit inside a path segment marks it as "probably a
|
|
77
|
+
* pagination/date/id token", so the whole segment is collapsed. Do not share
|
|
78
|
+
* masking logic between the two — they classify the same kind of text for
|
|
79
|
+
* opposite purposes.
|
|
80
|
+
*
|
|
81
|
+
* Query keys are additionally run through `flattenQueryKeys` before being
|
|
82
|
+
* folded into the key, because `ExURL`'s query normalization (`URLSearchParams`
|
|
83
|
+
* decode-then-re-encode round trip in `@d-zero/shared/parse-url`) means a
|
|
84
|
+
* site that double-encodes `&`/`=` inside a query value produces a URL whose
|
|
85
|
+
* query string still arrives here percent-encoded — `decomposeUrl`'s literal
|
|
86
|
+
* `&`/`=` split then sees ONE key that is itself a percent-encoded
|
|
87
|
+
* `key=value&key=value...` blob, with any variable content buried inside
|
|
88
|
+
* that key name rather than in a value. Without flattening, every such URL
|
|
89
|
+
* gets a distinct key name and therefore a distinct shape key, which
|
|
90
|
+
* silently defeats `--dedupe-cap` (issue #351) no matter the threshold.
|
|
91
|
+
*
|
|
92
|
+
* This changes the shape key computed for URLs that hit the flattening
|
|
93
|
+
* path. `dedupe_cap_events.shape_key` (see `archive/create-adjunct-tables.ts`)
|
|
94
|
+
* is an append-only value frozen at crawl time and never rewritten, so an
|
|
95
|
+
* archive crawled before this fix that happened to already have a
|
|
96
|
+
* `dedupe_cap_events` row for such a URL (rare, since the bug largely
|
|
97
|
+
* prevented capping from firing on it in the first place) will not
|
|
98
|
+
* re-match on the next `backfillDedupeCapEventId` recompute — the same
|
|
99
|
+
* self-healing-backfill trade-off any shape-key algorithm change makes.
|
|
100
|
+
* @param url - A URL string (protocol-agnostic `//host/...` or full
|
|
101
|
+
* `https://host/...`), typically `ExURL.withoutHashAndAuth`.
|
|
102
|
+
* @returns The shape key, or `null` if `url` cannot be decomposed.
|
|
103
|
+
* @example
|
|
104
|
+
* ```ts
|
|
105
|
+
* computeShapeKey('//example.com/news/date/2024/');
|
|
106
|
+
* // => 'example.com/news/date/{n}/'
|
|
107
|
+
* computeShapeKey('//example.com/news/date/1.5e+32/');
|
|
108
|
+
* // => 'example.com/news/date/{n}/' — same shape
|
|
109
|
+
* computeShapeKey('//example.com/list?page=1');
|
|
110
|
+
* // => 'example.com/list?page={v}'
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
export function computeShapeKey(url) {
|
|
114
|
+
const decomposed = decomposeUrl(url);
|
|
115
|
+
if (!decomposed)
|
|
116
|
+
return null;
|
|
117
|
+
const { host, pathSegments, queryKeys } = decomposed;
|
|
118
|
+
const shapedSegments = pathSegments.map((segment) => DIGIT_CONTAINING_SEGMENT_PATTERN.test(segment) ? SEGMENT_PLACEHOLDER : segment);
|
|
119
|
+
let key = host;
|
|
120
|
+
if (shapedSegments.length > 0) {
|
|
121
|
+
key += `/${shapedSegments.join('/')}`;
|
|
122
|
+
}
|
|
123
|
+
if (queryKeys.length > 0) {
|
|
124
|
+
const flattenedKeys = flattenQueryKeys(queryKeys);
|
|
125
|
+
const pairs = flattenedKeys.map((k) => `${k}=${VALUE_PLACEHOLDER}`);
|
|
126
|
+
key += `?${pairs.join('&')}`;
|
|
127
|
+
}
|
|
128
|
+
return key;
|
|
129
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intermediate representation of a URL split into comparable tokens.
|
|
3
|
+
* Used by pagination detection to identify which token changed between two URLs.
|
|
4
|
+
*/
|
|
5
|
+
export interface DecomposedUrl {
|
|
6
|
+
/** Hostname including port (e.g. `"example.com:8080"`). */
|
|
7
|
+
host: string;
|
|
8
|
+
/** Path segments split by `/` (e.g. `["page", "2"]` for `/page/2`). */
|
|
9
|
+
pathSegments: string[];
|
|
10
|
+
/** Sorted query parameter keys. */
|
|
11
|
+
queryKeys: string[];
|
|
12
|
+
/** Query parameter values sorted by their corresponding key. */
|
|
13
|
+
queryValues: string[];
|
|
14
|
+
/** Protocol prefix (e.g. `"https:"`) or empty string if protocol-agnostic. */
|
|
15
|
+
protocol: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Decomposes a URL string into its constituent tokens for comparison.
|
|
19
|
+
* Handles both full URLs (`https://host/path?q=v`) and protocol-agnostic
|
|
20
|
+
* URLs (`//host/path?q=v`). Query parameters are sorted by key for
|
|
21
|
+
* consistent comparison. {@link import('./reconstruct-url.js').reconstructUrl}
|
|
22
|
+
* is the inverse (with one token replaced); the two are kept side by side so
|
|
23
|
+
* the `DecomposedUrl` shape cannot drift between them.
|
|
24
|
+
* @param url - The URL string to decompose
|
|
25
|
+
* @returns The decomposed URL, or `null` if the format is invalid
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* decomposeUrl('//example.com/page/2?b=1&a=x');
|
|
29
|
+
* // { host: 'example.com', pathSegments: ['page', '2'],
|
|
30
|
+
* // queryKeys: ['a', 'b'], queryValues: ['x', '1'], protocol: '' }
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare function decomposeUrl(url: string): DecomposedUrl | null;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decomposes a URL string into its constituent tokens for comparison.
|
|
3
|
+
* Handles both full URLs (`https://host/path?q=v`) and protocol-agnostic
|
|
4
|
+
* URLs (`//host/path?q=v`). Query parameters are sorted by key for
|
|
5
|
+
* consistent comparison. {@link import('./reconstruct-url.js').reconstructUrl}
|
|
6
|
+
* is the inverse (with one token replaced); the two are kept side by side so
|
|
7
|
+
* the `DecomposedUrl` shape cannot drift between them.
|
|
8
|
+
* @param url - The URL string to decompose
|
|
9
|
+
* @returns The decomposed URL, or `null` if the format is invalid
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* decomposeUrl('//example.com/page/2?b=1&a=x');
|
|
13
|
+
* // { host: 'example.com', pathSegments: ['page', '2'],
|
|
14
|
+
* // queryKeys: ['a', 'b'], queryValues: ['x', '1'], protocol: '' }
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export function decomposeUrl(url) {
|
|
18
|
+
// URL format: //host/path?query or //host?query (protocol-agnostic)
|
|
19
|
+
// Also handle protocol://host/path?query
|
|
20
|
+
let work = url;
|
|
21
|
+
let protocol = '';
|
|
22
|
+
// Strip protocol
|
|
23
|
+
const protoMatch = /^(https?:)?\/\//.exec(work);
|
|
24
|
+
if (!protoMatch)
|
|
25
|
+
return null;
|
|
26
|
+
protocol = protoMatch[1] ?? '';
|
|
27
|
+
work = work.slice(protoMatch[0].length);
|
|
28
|
+
// Split host from rest
|
|
29
|
+
const slashIdx = work.indexOf('/');
|
|
30
|
+
const qmarkIdx = work.indexOf('?');
|
|
31
|
+
let host;
|
|
32
|
+
let pathPart;
|
|
33
|
+
let queryPart;
|
|
34
|
+
if (slashIdx === -1 && qmarkIdx === -1) {
|
|
35
|
+
host = work;
|
|
36
|
+
pathPart = '';
|
|
37
|
+
queryPart = '';
|
|
38
|
+
}
|
|
39
|
+
else if (slashIdx === -1) {
|
|
40
|
+
host = work.slice(0, qmarkIdx);
|
|
41
|
+
pathPart = '';
|
|
42
|
+
queryPart = work.slice(qmarkIdx + 1);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
host = work.slice(0, slashIdx);
|
|
46
|
+
const pathAndQuery = work.slice(slashIdx + 1);
|
|
47
|
+
const pq = pathAndQuery.indexOf('?');
|
|
48
|
+
if (pq === -1) {
|
|
49
|
+
pathPart = pathAndQuery;
|
|
50
|
+
queryPart = '';
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
pathPart = pathAndQuery.slice(0, pq);
|
|
54
|
+
queryPart = pathAndQuery.slice(pq + 1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const pathSegments = pathPart ? pathPart.split('/') : [];
|
|
58
|
+
// Parse query into sorted key-value pairs
|
|
59
|
+
const queryPairs = [];
|
|
60
|
+
if (queryPart) {
|
|
61
|
+
for (const pair of queryPart.split('&')) {
|
|
62
|
+
const eqIdx = pair.indexOf('=');
|
|
63
|
+
if (eqIdx === -1) {
|
|
64
|
+
queryPairs.push([pair, '']);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
queryPairs.push([pair.slice(0, eqIdx), pair.slice(eqIdx + 1)]);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
queryPairs.sort((a, b) => a[0].localeCompare(b[0]));
|
|
72
|
+
return {
|
|
73
|
+
host,
|
|
74
|
+
pathSegments,
|
|
75
|
+
queryKeys: queryPairs.map(([k]) => k),
|
|
76
|
+
queryValues: queryPairs.map(([, v]) => v),
|
|
77
|
+
protocol,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DecomposedUrl } from './decompose-url.js';
|
|
2
|
+
/**
|
|
3
|
+
* Reconstructs a URL string from a decomposed representation with one
|
|
4
|
+
* token replaced at the specified index.
|
|
5
|
+
* @param decomposed - The decomposed URL to reconstruct
|
|
6
|
+
* @param tokenIndex - Index in the combined token array (path segments + query values)
|
|
7
|
+
* @param newValue - The replacement value for the token at `tokenIndex`
|
|
8
|
+
* @returns The reconstructed URL string
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const decomposed = decomposeUrl('//example.com/page/3')!;
|
|
12
|
+
* reconstructUrl(decomposed, 1, '4'); // '//example.com/page/4'
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export declare function reconstructUrl(decomposed: DecomposedUrl, tokenIndex: number, newValue: string): string;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reconstructs a URL string from a decomposed representation with one
|
|
3
|
+
* token replaced at the specified index.
|
|
4
|
+
* @param decomposed - The decomposed URL to reconstruct
|
|
5
|
+
* @param tokenIndex - Index in the combined token array (path segments + query values)
|
|
6
|
+
* @param newValue - The replacement value for the token at `tokenIndex`
|
|
7
|
+
* @returns The reconstructed URL string
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* const decomposed = decomposeUrl('//example.com/page/3')!;
|
|
11
|
+
* reconstructUrl(decomposed, 1, '4'); // '//example.com/page/4'
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export function reconstructUrl(decomposed, tokenIndex, newValue) {
|
|
15
|
+
const { host, pathSegments, queryKeys, queryValues, protocol } = decomposed;
|
|
16
|
+
const newPathSegments = [...pathSegments];
|
|
17
|
+
const newQueryValues = [...queryValues];
|
|
18
|
+
if (tokenIndex < pathSegments.length) {
|
|
19
|
+
newPathSegments[tokenIndex] = newValue;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
newQueryValues[tokenIndex - pathSegments.length] = newValue;
|
|
23
|
+
}
|
|
24
|
+
let url = `${protocol}//${host}`;
|
|
25
|
+
if (newPathSegments.length > 0) {
|
|
26
|
+
url += `/${newPathSegments.join('/')}`;
|
|
27
|
+
}
|
|
28
|
+
if (queryKeys.length > 0) {
|
|
29
|
+
const pairs = queryKeys.map((k, i) => `${encodeURIComponent(k)}=${encodeURIComponent(newQueryValues[i] ?? '')}`);
|
|
30
|
+
url += `?${pairs.join('&')}`;
|
|
31
|
+
}
|
|
32
|
+
return url;
|
|
33
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ranks URLs in the natural order the viewer lists pages and resources in:
|
|
3
|
+
* numbers inside a path compare by value (`page2` before `page10`), letter
|
|
4
|
+
* case and percent-escapes do not split the order, a directory's own page
|
|
5
|
+
* comes before its index pages and its children, and the host decides before
|
|
6
|
+
* the path.
|
|
7
|
+
*
|
|
8
|
+
* The order is a total order — the same URLs in any input order get the same
|
|
9
|
+
* ranking — and it is persisted (`viewer_pages.natural_url_rank`,
|
|
10
|
+
* `viewer_url_sort_keys`), so a change to its definition needs a read model
|
|
11
|
+
* schema version bump. The definition lives in the native crate
|
|
12
|
+
* (`@nitpicker/core`, `crates/nitpicker_url_key`).
|
|
13
|
+
*
|
|
14
|
+
* Each URL is parsed once, natively. Memory is proportional to the URLs'
|
|
15
|
+
* total length — the UTF-8 bytes handed over plus native keys of roughly the
|
|
16
|
+
* same size again, on top of the caller's own copy of the strings — so a
|
|
17
|
+
* caller with a very large URL set ranks the distinct URLs only.
|
|
18
|
+
* @param urls - The URLs to rank; identical URLs rank in input order.
|
|
19
|
+
* @returns For each input position, the zero-based position that URL takes in
|
|
20
|
+
* the sorted list — a permutation of `0..urls.length`.
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* computeUrlSortRanks([
|
|
24
|
+
* 'https://example.com/page10',
|
|
25
|
+
* 'https://example.com/page2',
|
|
26
|
+
* 'https://example.com/',
|
|
27
|
+
* ]); // Uint32Array [2, 1, 0]
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function computeUrlSortRanks(urls: readonly string[]): Uint32Array;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { computeUrlSortRanks as computeUrlSortRanksNative } from '@nitpicker/core/compute-url-sort-ranks';
|
|
2
|
+
/**
|
|
3
|
+
* Ranks URLs in the natural order the viewer lists pages and resources in:
|
|
4
|
+
* numbers inside a path compare by value (`page2` before `page10`), letter
|
|
5
|
+
* case and percent-escapes do not split the order, a directory's own page
|
|
6
|
+
* comes before its index pages and its children, and the host decides before
|
|
7
|
+
* the path.
|
|
8
|
+
*
|
|
9
|
+
* The order is a total order — the same URLs in any input order get the same
|
|
10
|
+
* ranking — and it is persisted (`viewer_pages.natural_url_rank`,
|
|
11
|
+
* `viewer_url_sort_keys`), so a change to its definition needs a read model
|
|
12
|
+
* schema version bump. The definition lives in the native crate
|
|
13
|
+
* (`@nitpicker/core`, `crates/nitpicker_url_key`).
|
|
14
|
+
*
|
|
15
|
+
* Each URL is parsed once, natively. Memory is proportional to the URLs'
|
|
16
|
+
* total length — the UTF-8 bytes handed over plus native keys of roughly the
|
|
17
|
+
* same size again, on top of the caller's own copy of the strings — so a
|
|
18
|
+
* caller with a very large URL set ranks the distinct URLs only.
|
|
19
|
+
* @param urls - The URLs to rank; identical URLs rank in input order.
|
|
20
|
+
* @returns For each input position, the zero-based position that URL takes in
|
|
21
|
+
* the sorted list — a permutation of `0..urls.length`.
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* computeUrlSortRanks([
|
|
25
|
+
* 'https://example.com/page10',
|
|
26
|
+
* 'https://example.com/page2',
|
|
27
|
+
* 'https://example.com/',
|
|
28
|
+
* ]); // Uint32Array [2, 1, 0]
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export function computeUrlSortRanks(urls) {
|
|
32
|
+
return computeUrlSortRanksNative(urls);
|
|
33
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Splits an array into chunks of the specified size and executes a callback
|
|
3
|
+
* on each chunk in parallel using `Promise.all`.
|
|
4
|
+
* @template T - The element type of the array.
|
|
5
|
+
* @param a - The array to split into chunks.
|
|
6
|
+
* @param count - The maximum number of elements per chunk.
|
|
7
|
+
* @param callback - A function to invoke on each chunk. May be synchronous or asynchronous.
|
|
8
|
+
* @returns A promise that resolves when all chunk callbacks have completed.
|
|
9
|
+
*/
|
|
10
|
+
export declare function eachSplitted<T>(a: readonly T[], count: number, callback: (items: T[]) => void | Promise<void>): Promise<void>;
|