@nitpicker/archive 0.0.0-stage → 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 +105 -2
- 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 +360 -5
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attempts to decode a `data:...` URI into its raw payload bytes.
|
|
3
|
+
*
|
|
4
|
+
* Supports the two encoding forms in RFC 2397:
|
|
5
|
+
*
|
|
6
|
+
* - `data:<mime>;base64,<base64-bytes>` — the base64 tail is decoded via
|
|
7
|
+
* `Buffer.from(..., 'base64')`.
|
|
8
|
+
* - `data:<mime>,<percent-encoded-bytes>` — the tail is percent-decoded
|
|
9
|
+
* via `decodeURIComponent(...)`, then re-encoded as UTF-8. This form is
|
|
10
|
+
* commonly used for SVG data URIs.
|
|
11
|
+
*
|
|
12
|
+
* Returns `null` on any parse / decode failure so the caller can skip the
|
|
13
|
+
* value without aborting the whole `blob_refs` population step. A single
|
|
14
|
+
* malformed data URI in a 470 K-row archive should not halt the migration
|
|
15
|
+
* — the raw `url` string is still preserved in the source `images` row.
|
|
16
|
+
* @param value - Raw column value; may or may not start with `data:`.
|
|
17
|
+
* @returns Decoded bytes, or `null` when the value isn't a data URI or
|
|
18
|
+
* can't be decoded.
|
|
19
|
+
*/
|
|
20
|
+
export function decodeDataUri(value) {
|
|
21
|
+
if (!value.startsWith('data:')) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const commaIndex = value.indexOf(',');
|
|
25
|
+
if (commaIndex === -1) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
const header = value.slice(5, commaIndex);
|
|
29
|
+
const payload = value.slice(commaIndex + 1);
|
|
30
|
+
try {
|
|
31
|
+
if (/;\s*base64$/i.test(header)) {
|
|
32
|
+
// `Buffer.from(..., 'base64')` silently strips characters outside
|
|
33
|
+
// the base64 alphabet — a malformed payload decodes to garbage
|
|
34
|
+
// instead of throwing. Validate the alphabet + padding shape
|
|
35
|
+
// first so callers can distinguish "successfully decoded" from
|
|
36
|
+
// "silently corrupted" and get the promised `null` on malformed
|
|
37
|
+
// input.
|
|
38
|
+
if (!isValidBase64(payload)) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const bytes = Buffer.from(payload, 'base64');
|
|
42
|
+
return { bytes };
|
|
43
|
+
}
|
|
44
|
+
return { bytes: percentDecodeToBytes(payload) };
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Standard base64 alphabet + padding, plus one common URL-safe variant
|
|
52
|
+
* that occasionally appears in `data:` URIs even though RFC 2397 says
|
|
53
|
+
* only the standard alphabet. `-` / `_` are the URL-safe substitutes
|
|
54
|
+
* for `+` / `/`.
|
|
55
|
+
*/
|
|
56
|
+
const BASE64_ALPHABET_RE = /^[\w+/-]*={0,2}$/;
|
|
57
|
+
/**
|
|
58
|
+
* Validates whether a base64 payload is well-formed enough that
|
|
59
|
+
* `Buffer.from(payload, 'base64')` won't need to silently strip
|
|
60
|
+
* characters. Whitespace-tolerant (RFC 2045 permits internal
|
|
61
|
+
* whitespace in base64 line-wrapped output).
|
|
62
|
+
* @param payload - Base64 payload (everything after `,` in the data URI).
|
|
63
|
+
* @returns `true` when the payload contains only valid base64 characters
|
|
64
|
+
* + optional trailing padding.
|
|
65
|
+
*/
|
|
66
|
+
function isValidBase64(payload) {
|
|
67
|
+
const stripped = payload.replaceAll(/\s+/g, '');
|
|
68
|
+
if (stripped === '') {
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
if (!BASE64_ALPHABET_RE.test(stripped)) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
// base64 chunks group by 4 characters — a well-formed payload has
|
|
75
|
+
// length ≡ 0 (mod 4) once padding is applied. Padding-less trailing
|
|
76
|
+
// chunks of length 2 or 3 are also accepted (Node's decoder tolerates
|
|
77
|
+
// missing `=`), but length 1 or a padding-only chunk is malformed.
|
|
78
|
+
const remainder = stripped.length % 4;
|
|
79
|
+
if (remainder === 1) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Percent-decodes a data-URI payload byte-by-byte, avoiding the round
|
|
86
|
+
* through `decodeURIComponent` → UTF-8 re-encode that mangles arbitrary
|
|
87
|
+
* binary payloads (e.g. a `%FF` byte becomes a JS string of code
|
|
88
|
+
* point U+00FF, then re-encodes to `[0xC3, 0xBF]` — the byte value
|
|
89
|
+
* changes). RFC 2397's non-base64 form treats the payload as octets,
|
|
90
|
+
* not as a UTF-8 string, so an octet-preserving decode is the correct
|
|
91
|
+
* inverse.
|
|
92
|
+
* @param payload - Raw payload text (everything after the `,`).
|
|
93
|
+
* @returns Payload bytes.
|
|
94
|
+
* @throws {URIError} If a `%` escape is truncated or not two hex
|
|
95
|
+
* digits; the caller's try/catch maps this to a `null` return.
|
|
96
|
+
*/
|
|
97
|
+
function percentDecodeToBytes(payload) {
|
|
98
|
+
const chunks = [];
|
|
99
|
+
let i = 0;
|
|
100
|
+
while (i < payload.length) {
|
|
101
|
+
const ch = payload.codePointAt(i);
|
|
102
|
+
if (ch === 0x25 /* % */) {
|
|
103
|
+
if (i + 2 >= payload.length) {
|
|
104
|
+
throw new URIError('truncated % escape');
|
|
105
|
+
}
|
|
106
|
+
const hex = payload.slice(i + 1, i + 3);
|
|
107
|
+
if (!/^[\da-f]{2}$/i.test(hex)) {
|
|
108
|
+
throw new URIError('invalid % escape');
|
|
109
|
+
}
|
|
110
|
+
chunks.push(Buffer.from(hex, 'hex'));
|
|
111
|
+
i += 3;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (ch > 127 /* 0x7F, ASCII high-bit boundary */) {
|
|
115
|
+
// A non-ASCII code point in a percent-encoded payload is
|
|
116
|
+
// unusual (browsers percent-encode outbound), but WHATWG
|
|
117
|
+
// tolerates it — encode as UTF-8 to preserve the character.
|
|
118
|
+
chunks.push(Buffer.from(payload[i], 'utf8'));
|
|
119
|
+
i += 1;
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
chunks.push(Buffer.from([ch]));
|
|
123
|
+
i += 1;
|
|
124
|
+
}
|
|
125
|
+
return Buffer.concat(chunks);
|
|
126
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { DecomposedHeaderSet } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Parses one raw `responseHeaders` JSON string and produces the derived
|
|
4
|
+
* data shape required to insert into `header_sets`, `header_set_entries`,
|
|
5
|
+
* and `header_flags`.
|
|
6
|
+
*
|
|
7
|
+
* Behaviour:
|
|
8
|
+
*
|
|
9
|
+
* - `null` / `""` / `"null"` / `"{}"` / non-object JSON → returns `null`.
|
|
10
|
+
* The caller sets `header_set_id = null` on the referring row.
|
|
11
|
+
* - Multiple values per header name (JSON arrays, e.g.
|
|
12
|
+
* `{ "set-cookie": ["a=1", "b=2"] }`) become multiple
|
|
13
|
+
* {@link HeaderEntry} rows with `occurrence` ordinals 1, 2, ... The
|
|
14
|
+
* composite PK on `header_set_entries` `(header_set_id, name_id,
|
|
15
|
+
* occurrence)` guarantees no truncation.
|
|
16
|
+
* - Names are lower-cased. Values are trimmed of whitespace only in the
|
|
17
|
+
* sorted-hash construction; the raw value is preserved verbatim in
|
|
18
|
+
* the emitted `HeaderEntry.value` (and hence in `header_value_refs`).
|
|
19
|
+
* Trimming inside hash construction lets `content-type: text/html`
|
|
20
|
+
* and `content-type: text/html ` dedup to one stable set.
|
|
21
|
+
* - Sort order for hashing is `(name, occurrence)` in binary form —
|
|
22
|
+
* deterministic regardless of the input JSON's insertion order or
|
|
23
|
+
* how the JSON serializer arranged keys.
|
|
24
|
+
* @param rawJson - The raw JSON string exactly as stored in
|
|
25
|
+
* `pages.responseHeaders` / `resources.responseHeaders`.
|
|
26
|
+
* @returns Decomposed shape, or `null` when the row has no meaningful
|
|
27
|
+
* header set.
|
|
28
|
+
*/
|
|
29
|
+
export declare function decomposeHeaderSet(rawJson: string | null): DecomposedHeaderSet | null;
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { computeContentHash } from './compute-content-hash.js';
|
|
2
|
+
import { isVolatileHeader } from './header-stability.js';
|
|
3
|
+
/**
|
|
4
|
+
* Parses one raw `responseHeaders` JSON string and produces the derived
|
|
5
|
+
* data shape required to insert into `header_sets`, `header_set_entries`,
|
|
6
|
+
* and `header_flags`.
|
|
7
|
+
*
|
|
8
|
+
* Behaviour:
|
|
9
|
+
*
|
|
10
|
+
* - `null` / `""` / `"null"` / `"{}"` / non-object JSON → returns `null`.
|
|
11
|
+
* The caller sets `header_set_id = null` on the referring row.
|
|
12
|
+
* - Multiple values per header name (JSON arrays, e.g.
|
|
13
|
+
* `{ "set-cookie": ["a=1", "b=2"] }`) become multiple
|
|
14
|
+
* {@link HeaderEntry} rows with `occurrence` ordinals 1, 2, ... The
|
|
15
|
+
* composite PK on `header_set_entries` `(header_set_id, name_id,
|
|
16
|
+
* occurrence)` guarantees no truncation.
|
|
17
|
+
* - Names are lower-cased. Values are trimmed of whitespace only in the
|
|
18
|
+
* sorted-hash construction; the raw value is preserved verbatim in
|
|
19
|
+
* the emitted `HeaderEntry.value` (and hence in `header_value_refs`).
|
|
20
|
+
* Trimming inside hash construction lets `content-type: text/html`
|
|
21
|
+
* and `content-type: text/html ` dedup to one stable set.
|
|
22
|
+
* - Sort order for hashing is `(name, occurrence)` in binary form —
|
|
23
|
+
* deterministic regardless of the input JSON's insertion order or
|
|
24
|
+
* how the JSON serializer arranged keys.
|
|
25
|
+
* @param rawJson - The raw JSON string exactly as stored in
|
|
26
|
+
* `pages.responseHeaders` / `resources.responseHeaders`.
|
|
27
|
+
* @returns Decomposed shape, or `null` when the row has no meaningful
|
|
28
|
+
* header set.
|
|
29
|
+
*/
|
|
30
|
+
export function decomposeHeaderSet(rawJson) {
|
|
31
|
+
if (rawJson == null || rawJson === '' || rawJson === 'null' || rawJson === '{}') {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
let parsed;
|
|
35
|
+
try {
|
|
36
|
+
parsed = JSON.parse(rawJson);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
if (parsed == null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
const entries = [];
|
|
45
|
+
// `occurrence` runs per (lower-cased name) across ALL sources for that
|
|
46
|
+
// name, so duplicate JSON keys that differ only in case
|
|
47
|
+
// (`{"Cookie":"a=1", "cookie":"b=2"}` — non-conforming but legal JSON,
|
|
48
|
+
// and the crawler stores whatever puppeteer hands it) don't collide on
|
|
49
|
+
// (name_id, occurrence). Without this counter the second entry would
|
|
50
|
+
// land at occurrence=1 too, violating the `header_set_entries` PK and
|
|
51
|
+
// silently getting dropped by INSERT OR IGNORE while `entry_count`
|
|
52
|
+
// still counted it.
|
|
53
|
+
const occurrenceByName = new Map();
|
|
54
|
+
for (const [rawName, rawValue] of Object.entries(parsed)) {
|
|
55
|
+
const name = rawName.toLowerCase();
|
|
56
|
+
const volatile = isVolatileHeader(name);
|
|
57
|
+
const nextOccurrence = () => {
|
|
58
|
+
const next = (occurrenceByName.get(name) ?? 0) + 1;
|
|
59
|
+
occurrenceByName.set(name, next);
|
|
60
|
+
return next;
|
|
61
|
+
};
|
|
62
|
+
if (Array.isArray(rawValue)) {
|
|
63
|
+
for (const one of rawValue) {
|
|
64
|
+
if (typeof one !== 'string') {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
entries.push({
|
|
68
|
+
name,
|
|
69
|
+
value: one,
|
|
70
|
+
occurrence: nextOccurrence(),
|
|
71
|
+
isVolatile: volatile,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (typeof rawValue !== 'string') {
|
|
77
|
+
// parseResponseHeaders's stored shape is `Record<string, string |
|
|
78
|
+
// string[] | undefined>`, but hand-edited or non-conforming
|
|
79
|
+
// archives could smuggle in a nested object / number / boolean
|
|
80
|
+
// — coercing via `String()` would produce "[object Object]" and
|
|
81
|
+
// pollute `header_value_refs` with a garbage dictionary entry.
|
|
82
|
+
// Skipping is the conservative choice; the source row's raw
|
|
83
|
+
// JSON is still preserved via `raw_json_hash`.
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
entries.push({
|
|
87
|
+
name,
|
|
88
|
+
value: rawValue,
|
|
89
|
+
occurrence: nextOccurrence(),
|
|
90
|
+
isVolatile: volatile,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
if (entries.length === 0) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
entries.sort((a, b) => {
|
|
97
|
+
if (a.name < b.name)
|
|
98
|
+
return -1;
|
|
99
|
+
if (a.name > b.name)
|
|
100
|
+
return 1;
|
|
101
|
+
return a.occurrence - b.occurrence;
|
|
102
|
+
});
|
|
103
|
+
// Canonicalize every entry exactly once, then partition the strings.
|
|
104
|
+
// Canonicalizing per hash pass instead (once in the all-entries pass,
|
|
105
|
+
// again in the stable / volatile passes) would serialize each entry
|
|
106
|
+
// twice, which becomes measurable on large archives where a single
|
|
107
|
+
// response can carry a couple of dozen entries.
|
|
108
|
+
const canonicalStrings = entries.map(canonicalize);
|
|
109
|
+
const stableCanonical = [];
|
|
110
|
+
const volatileCanonical = [];
|
|
111
|
+
let stableEntryCount = 0;
|
|
112
|
+
for (const [i, entry] of entries.entries()) {
|
|
113
|
+
if (entry.isVolatile) {
|
|
114
|
+
volatileCanonical.push(canonicalStrings[i]);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
stableCanonical.push(canonicalStrings[i]);
|
|
118
|
+
stableEntryCount += 1;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const rawJsonHash = computeContentHash(rawJson);
|
|
122
|
+
const rawHash = computeContentHash(canonicalStrings.join('\n'));
|
|
123
|
+
// A response with only volatile headers (tracker endpoints that return
|
|
124
|
+
// just `Date` / `Set-Cookie` / `Age`) hashes to `computeContentHash('')`
|
|
125
|
+
// — the canonical "empty stable profile" hash. All all-volatile
|
|
126
|
+
// responses cluster under this sentinel, which is the intended
|
|
127
|
+
// semantic (same empty stable profile = same cluster), and 0.13's
|
|
128
|
+
// DDL declares `stable_hash BLOB NOT NULL` so a `null` sentinel is not
|
|
129
|
+
// available even if we wanted one. Consumers that need to distinguish
|
|
130
|
+
// "empty stable set" from "populated stable set" should key off
|
|
131
|
+
// `stable_entry_count === 0` on the same row, not off the hash.
|
|
132
|
+
const stableHash = computeContentHash(stableCanonical.join('\n'));
|
|
133
|
+
const volatileHash = volatileCanonical.length === 0
|
|
134
|
+
? null
|
|
135
|
+
: computeContentHash(volatileCanonical.join('\n'));
|
|
136
|
+
return {
|
|
137
|
+
rawJsonHash,
|
|
138
|
+
rawHash,
|
|
139
|
+
stableHash,
|
|
140
|
+
volatileHash,
|
|
141
|
+
entries,
|
|
142
|
+
entryCount: entries.length,
|
|
143
|
+
stableEntryCount,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Serializes one entry into the canonical `name/occurrence=value` form
|
|
148
|
+
* used inside the hash construction. The trailing occurrence keeps
|
|
149
|
+
* multi-value headers distinguishable while still letting single-value
|
|
150
|
+
* ones dedup naturally. Values are trimmed so surrounding whitespace
|
|
151
|
+
* does not fork the dedup key.
|
|
152
|
+
* @param entry - One decomposed header entry.
|
|
153
|
+
* @returns Canonical string joined into the hash pre-image.
|
|
154
|
+
*/
|
|
155
|
+
function canonicalize(entry) {
|
|
156
|
+
return `${entry.name}/${entry.occurrence}=${entry.value.trim()}`;
|
|
157
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { DecomposedUrl } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Extracts `scheme` / `host` / `port` / `path` / `query_hash` / `fragment`
|
|
4
|
+
* columns from a URL string for `url_refs` population.
|
|
5
|
+
*
|
|
6
|
+
* Parsing is done via WHATWG `new URL(...)`. URLs that fail to parse (e.g.
|
|
7
|
+
* a malformed href scraped from the wild) still round-trip through
|
|
8
|
+
* `url_refs` — the natural key is the raw `url` string — but every
|
|
9
|
+
* decomposed column becomes `null` so filters that JOIN on `host` or
|
|
10
|
+
* `scheme` cleanly skip malformed rows instead of falsely matching.
|
|
11
|
+
*
|
|
12
|
+
* `port` is only populated when explicit in the URL. `new URL(...)`
|
|
13
|
+
* normalises the scheme's default port away (`https://example.com:443/` →
|
|
14
|
+
* `url.port === ''`), so we never synthesise a default. Two rows differing
|
|
15
|
+
* only by explicit vs implicit default port must not deduplicate anyway —
|
|
16
|
+
* `url_refs.url` (the raw string) is the natural key, not the decomposed
|
|
17
|
+
* columns.
|
|
18
|
+
*
|
|
19
|
+
* `query_hash` is the 32-byte content hash of the query string with the
|
|
20
|
+
* leading `?` stripped. Storing the raw query would defeat dedup on
|
|
21
|
+
* tracker URLs whose per-request keys explode dictionary size.
|
|
22
|
+
* @param url - Raw URL string (may be any WHATWG-parseable form, or malformed).
|
|
23
|
+
* @returns Every column that goes into `url_refs` alongside the raw URL.
|
|
24
|
+
*/
|
|
25
|
+
export declare function decomposeUrl(url: string): DecomposedUrl;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { computeContentHash } from './compute-content-hash.js';
|
|
2
|
+
/**
|
|
3
|
+
* URL schemes whose "pathname" is really an in-band opaque payload
|
|
4
|
+
* (base64-encoded image bytes, javascript source, blob URL fragment,
|
|
5
|
+
* etc.) rather than a routing key. For these schemes we leave
|
|
6
|
+
* `DecomposedUrl.path` as `null` so the indexed `url_refs.path` column
|
|
7
|
+
* does not balloon with per-URL opaque tails and defeat the dedup goal.
|
|
8
|
+
*/
|
|
9
|
+
const OPAQUE_PATH_SCHEMES = new Set([
|
|
10
|
+
'data',
|
|
11
|
+
'blob',
|
|
12
|
+
'javascript',
|
|
13
|
+
'about',
|
|
14
|
+
]);
|
|
15
|
+
/**
|
|
16
|
+
* Extracts `scheme` / `host` / `port` / `path` / `query_hash` / `fragment`
|
|
17
|
+
* columns from a URL string for `url_refs` population.
|
|
18
|
+
*
|
|
19
|
+
* Parsing is done via WHATWG `new URL(...)`. URLs that fail to parse (e.g.
|
|
20
|
+
* a malformed href scraped from the wild) still round-trip through
|
|
21
|
+
* `url_refs` — the natural key is the raw `url` string — but every
|
|
22
|
+
* decomposed column becomes `null` so filters that JOIN on `host` or
|
|
23
|
+
* `scheme` cleanly skip malformed rows instead of falsely matching.
|
|
24
|
+
*
|
|
25
|
+
* `port` is only populated when explicit in the URL. `new URL(...)`
|
|
26
|
+
* normalises the scheme's default port away (`https://example.com:443/` →
|
|
27
|
+
* `url.port === ''`), so we never synthesise a default. Two rows differing
|
|
28
|
+
* only by explicit vs implicit default port must not deduplicate anyway —
|
|
29
|
+
* `url_refs.url` (the raw string) is the natural key, not the decomposed
|
|
30
|
+
* columns.
|
|
31
|
+
*
|
|
32
|
+
* `query_hash` is the 32-byte content hash of the query string with the
|
|
33
|
+
* leading `?` stripped. Storing the raw query would defeat dedup on
|
|
34
|
+
* tracker URLs whose per-request keys explode dictionary size.
|
|
35
|
+
* @param url - Raw URL string (may be any WHATWG-parseable form, or malformed).
|
|
36
|
+
* @returns Every column that goes into `url_refs` alongside the raw URL.
|
|
37
|
+
*/
|
|
38
|
+
export function decomposeUrl(url) {
|
|
39
|
+
let parsed;
|
|
40
|
+
try {
|
|
41
|
+
parsed = new URL(url);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return {
|
|
45
|
+
scheme: null,
|
|
46
|
+
host: null,
|
|
47
|
+
port: null,
|
|
48
|
+
path: null,
|
|
49
|
+
query_hash: null,
|
|
50
|
+
fragment: null,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const scheme = parsed.protocol.slice(0, -1) || null;
|
|
54
|
+
const host = parsed.hostname === '' ? null : parsed.hostname.toLowerCase();
|
|
55
|
+
const port = parsed.port === '' ? null : Number.parseInt(parsed.port, 10);
|
|
56
|
+
const rawSearch = parsed.search.startsWith('?')
|
|
57
|
+
? parsed.search.slice(1)
|
|
58
|
+
: parsed.search;
|
|
59
|
+
const query_hash = rawSearch === '' ? null : computeContentHash(rawSearch);
|
|
60
|
+
const fragment = parsed.hash === '' ? null : parsed.hash.slice(1);
|
|
61
|
+
const path = scheme !== null && OPAQUE_PATH_SCHEMES.has(scheme) ? null : parsed.pathname;
|
|
62
|
+
return {
|
|
63
|
+
scheme,
|
|
64
|
+
host,
|
|
65
|
+
port: port !== null && Number.isFinite(port) ? port : null,
|
|
66
|
+
path,
|
|
67
|
+
query_hash,
|
|
68
|
+
fragment,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classifies a header name as volatile (excluded from `stable_hash`) or
|
|
3
|
+
* stable (included). Names are compared case-insensitively (lower-cased
|
|
4
|
+
* before lookup). Names not in {@link VOLATILE_HEADER_NAMES} default to
|
|
5
|
+
* **stable** — see the docs on that constant for why this direction is
|
|
6
|
+
* the safer default.
|
|
7
|
+
*
|
|
8
|
+
* An explicit stable list could be named instead (`content-type`,
|
|
9
|
+
* `content-length`, `cache-control`, `content-security-policy`,
|
|
10
|
+
* `x-frame-options`, `x-content-type-options`, `strict-transport-
|
|
11
|
+
* security`, `referrer-policy`, `permissions-policy`, `server`, `vary`,
|
|
12
|
+
* `location`, ...); we deliberately do NOT enumerate that set at runtime —
|
|
13
|
+
* every non-volatile header is stable by construction, and enumerating
|
|
14
|
+
* it would create a maintenance surface that the volatile-only lookup
|
|
15
|
+
* avoids.
|
|
16
|
+
* @param name - Header name (any case).
|
|
17
|
+
* @returns `true` when the header is volatile.
|
|
18
|
+
*/
|
|
19
|
+
export declare function isVolatileHeader(name: string): boolean;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { VOLATILE_HEADER_NAMES } from './volatile-header-names.js';
|
|
2
|
+
/**
|
|
3
|
+
* Classifies a header name as volatile (excluded from `stable_hash`) or
|
|
4
|
+
* stable (included). Names are compared case-insensitively (lower-cased
|
|
5
|
+
* before lookup). Names not in {@link VOLATILE_HEADER_NAMES} default to
|
|
6
|
+
* **stable** — see the docs on that constant for why this direction is
|
|
7
|
+
* the safer default.
|
|
8
|
+
*
|
|
9
|
+
* An explicit stable list could be named instead (`content-type`,
|
|
10
|
+
* `content-length`, `cache-control`, `content-security-policy`,
|
|
11
|
+
* `x-frame-options`, `x-content-type-options`, `strict-transport-
|
|
12
|
+
* security`, `referrer-policy`, `permissions-policy`, `server`, `vary`,
|
|
13
|
+
* `location`, ...); we deliberately do NOT enumerate that set at runtime —
|
|
14
|
+
* every non-volatile header is stable by construction, and enumerating
|
|
15
|
+
* it would create a maintenance surface that the volatile-only lookup
|
|
16
|
+
* avoids.
|
|
17
|
+
* @param name - Header name (any case).
|
|
18
|
+
* @returns `true` when the header is volatile.
|
|
19
|
+
*/
|
|
20
|
+
export function isVolatileHeader(name) {
|
|
21
|
+
return VOLATILE_HEADER_NAMES.has(name.toLowerCase());
|
|
22
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composite cache key for `header_value_refs`: hex-encoded hash + a
|
|
3
|
+
* separator + raw value. Two values with the same hash but different
|
|
4
|
+
* strings (astronomically improbable, but a `BLOB` hash column is not
|
|
5
|
+
* a total function per SQL semantics) still resolve to distinct cache
|
|
6
|
+
* entries. Shared by the cache warmer
|
|
7
|
+
* ({@link ./create-header-table-caches.ts}) and the per-set upsert
|
|
8
|
+
* ({@link ./upsert-one-header-set.ts}) so both sides always agree on the
|
|
9
|
+
* key shape.
|
|
10
|
+
* @param hash - 32-byte content hash of `value`.
|
|
11
|
+
* @param value - Header value verbatim.
|
|
12
|
+
* @returns Cache key string.
|
|
13
|
+
* @example
|
|
14
|
+
* headerValueCacheKey(computeContentHash('no-cache'), 'no-cache');
|
|
15
|
+
* // '724cf9…|no-cache'
|
|
16
|
+
*/
|
|
17
|
+
export declare function headerValueCacheKey(hash: Buffer, value: string): string;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composite cache key for `header_value_refs`: hex-encoded hash + a
|
|
3
|
+
* separator + raw value. Two values with the same hash but different
|
|
4
|
+
* strings (astronomically improbable, but a `BLOB` hash column is not
|
|
5
|
+
* a total function per SQL semantics) still resolve to distinct cache
|
|
6
|
+
* entries. Shared by the cache warmer
|
|
7
|
+
* ({@link ./create-header-table-caches.ts}) and the per-set upsert
|
|
8
|
+
* ({@link ./upsert-one-header-set.ts}) so both sides always agree on the
|
|
9
|
+
* key shape.
|
|
10
|
+
* @param hash - 32-byte content hash of `value`.
|
|
11
|
+
* @param value - Header value verbatim.
|
|
12
|
+
* @returns Cache key string.
|
|
13
|
+
* @example
|
|
14
|
+
* headerValueCacheKey(computeContentHash('no-cache'), 'no-cache');
|
|
15
|
+
* // '724cf9…|no-cache'
|
|
16
|
+
*/
|
|
17
|
+
export function headerValueCacheKey(hash, value) {
|
|
18
|
+
return `${hash.toString('hex')}|${value}`;
|
|
19
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalises a raw Content-Type header value to the canonical MIME form
|
|
3
|
+
* stored in `content_type_refs.normalized`: parameters (`; charset=...`)
|
|
4
|
+
* removed, C0 control characters (`0x00`..`0x1F`) and DEL (`0x7F`)
|
|
5
|
+
* stripped, trimmed, lower-cased.
|
|
6
|
+
*
|
|
7
|
+
* This is a derived column shared by two writers — the live-crawl upsert
|
|
8
|
+
* (`db-ops/_shared/upsert-content-type-ref.ts`) and the archive-migration
|
|
9
|
+
* populate (`populate-content-type-refs.ts`) — which MUST be
|
|
10
|
+
* same-input-same-output; a fork would split the dictionary so the same
|
|
11
|
+
* raw content-type maps to different normalized values depending on
|
|
12
|
+
* whether the row was crawled live or migrated. Keeping the single
|
|
13
|
+
* implementation here is what enforces that.
|
|
14
|
+
*
|
|
15
|
+
* Control chars are dropped character-by-character rather than via a
|
|
16
|
+
* regex literal so the source file carries no non-printing bytes and
|
|
17
|
+
* stays tool-friendly. `jsdom` / lax parsers occasionally emit them
|
|
18
|
+
* inside a raw Content-Type header (e.g. `text/html\r`).
|
|
19
|
+
* @param raw - Raw Content-Type header, guaranteed non-null non-empty.
|
|
20
|
+
* @returns Lower-cased MIME with parameters and control chars stripped.
|
|
21
|
+
* @example
|
|
22
|
+
* normalizeMime('Text/HTML; charset=UTF-8'); // => 'text/html'
|
|
23
|
+
*/
|
|
24
|
+
export declare function normalizeMime(raw: string): string;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalises a raw Content-Type header value to the canonical MIME form
|
|
3
|
+
* stored in `content_type_refs.normalized`: parameters (`; charset=...`)
|
|
4
|
+
* removed, C0 control characters (`0x00`..`0x1F`) and DEL (`0x7F`)
|
|
5
|
+
* stripped, trimmed, lower-cased.
|
|
6
|
+
*
|
|
7
|
+
* This is a derived column shared by two writers — the live-crawl upsert
|
|
8
|
+
* (`db-ops/_shared/upsert-content-type-ref.ts`) and the archive-migration
|
|
9
|
+
* populate (`populate-content-type-refs.ts`) — which MUST be
|
|
10
|
+
* same-input-same-output; a fork would split the dictionary so the same
|
|
11
|
+
* raw content-type maps to different normalized values depending on
|
|
12
|
+
* whether the row was crawled live or migrated. Keeping the single
|
|
13
|
+
* implementation here is what enforces that.
|
|
14
|
+
*
|
|
15
|
+
* Control chars are dropped character-by-character rather than via a
|
|
16
|
+
* regex literal so the source file carries no non-printing bytes and
|
|
17
|
+
* stays tool-friendly. `jsdom` / lax parsers occasionally emit them
|
|
18
|
+
* inside a raw Content-Type header (e.g. `text/html\r`).
|
|
19
|
+
* @param raw - Raw Content-Type header, guaranteed non-null non-empty.
|
|
20
|
+
* @returns Lower-cased MIME with parameters and control chars stripped.
|
|
21
|
+
* @example
|
|
22
|
+
* normalizeMime('Text/HTML; charset=UTF-8'); // => 'text/html'
|
|
23
|
+
*/
|
|
24
|
+
export function normalizeMime(raw) {
|
|
25
|
+
const semi = raw.indexOf(';');
|
|
26
|
+
const head = semi === -1 ? raw : raw.slice(0, semi);
|
|
27
|
+
let output = '';
|
|
28
|
+
for (const ch of head) {
|
|
29
|
+
const code = ch.codePointAt(0);
|
|
30
|
+
if (code < 32 /* 0x20 = SPACE */ || code === 127 /* 0x7F = DEL */) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
output += ch;
|
|
34
|
+
}
|
|
35
|
+
return output.trim().toLowerCase();
|
|
36
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ProgressCallback } from '../create-progress-reporter.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Populates `blob_refs` from every `images.src` / `images.currentSrc` /
|
|
5
|
+
* `resources.url` value that is a data URI longer than
|
|
6
|
+
* {@link DATA_URI_URL_REFS_LIMIT} bytes (issue #191).
|
|
7
|
+
*
|
|
8
|
+
* For each such value:
|
|
9
|
+
*
|
|
10
|
+
* 1. `decodeDataUri` strips the `data:...;base64,` (or `data:...,`) prefix
|
|
11
|
+
* and returns the raw payload bytes.
|
|
12
|
+
* 2. `computeContentHash` hashes the payload bytes (32-byte SHA-256).
|
|
13
|
+
* 3. The payload is zstd-compressed (`codec='zstd'`) — matching
|
|
14
|
+
* `page_html_blobs` / `json_refs`.
|
|
15
|
+
* 4. `INSERT OR IGNORE` on `hash` deduplicates: an `<img>` element and a
|
|
16
|
+
* resource that share the same underlying base64 payload share one
|
|
17
|
+
* `blob_refs` row.
|
|
18
|
+
*
|
|
19
|
+
* Malformed data URIs that `decodeDataUri` cannot decode are logged and
|
|
20
|
+
* skipped — the raw URI string still exists in the source row, and the
|
|
21
|
+
* migration script's operator can hunt it down from the warning log. The
|
|
22
|
+
* alternative — routing malformed large URIs back to `url_refs` — would
|
|
23
|
+
* break the "data URIs > threshold live in blob_refs" contract that 0.13
|
|
24
|
+
* lookups depend on.
|
|
25
|
+
*
|
|
26
|
+
* On the reference archive only ~429 images use data URIs, so the total
|
|
27
|
+
* dictionary is tiny — this step is I/O-cheap even without full
|
|
28
|
+
* chunking, but the same batching shape is used as elsewhere for
|
|
29
|
+
* consistency.
|
|
30
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
31
|
+
* @param onProgress - Optional sink for periodic progress lines (one per
|
|
32
|
+
* ~5% of each source table scanned); see {@link ../create-progress-reporter.ts}.
|
|
33
|
+
* @example
|
|
34
|
+
* await knex.transaction(async (trx) => {
|
|
35
|
+
* await populateBlobRefs(trx);
|
|
36
|
+
* });
|
|
37
|
+
*/
|
|
38
|
+
export declare function populateBlobRefs(trx: Knex, onProgress?: ProgressCallback): Promise<void>;
|