@nitpicker/archive 0.0.0 → 0.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +106 -0
- package/lib/apply-connection-pragmas.d.ts +18 -0
- package/lib/apply-connection-pragmas.js +40 -0
- package/lib/archive-accessor.d.ts +265 -0
- package/lib/archive-accessor.js +477 -0
- package/lib/archive-lock.d.ts +45 -0
- package/lib/archive-lock.js +154 -0
- package/lib/archive.d.ts +736 -0
- package/lib/archive.js +1055 -0
- package/lib/body-hash/compute-body-hash.d.ts +32 -0
- package/lib/body-hash/compute-body-hash.js +35 -0
- package/lib/cache/clear-archive-cache-entry.d.ts +18 -0
- package/lib/cache/clear-archive-cache-entry.js +24 -0
- package/lib/cache/clear-archive-cache-root.d.ts +26 -0
- package/lib/cache/clear-archive-cache-root.js +32 -0
- package/lib/cache/compute-archive-cache-key.d.ts +39 -0
- package/lib/cache/compute-archive-cache-key.js +95 -0
- package/lib/cache/extract-archive-to-cache.d.ts +57 -0
- package/lib/cache/extract-archive-to-cache.js +326 -0
- package/lib/cache/get-archive-cache-root.d.ts +20 -0
- package/lib/cache/get-archive-cache-root.js +53 -0
- package/lib/cache/is-archive-cache-disabled.d.ts +24 -0
- package/lib/cache/is-archive-cache-disabled.js +34 -0
- package/lib/cache/list-archive-cache-entries.d.ts +23 -0
- package/lib/cache/list-archive-cache-entries.js +130 -0
- package/lib/cache/path-exists.d.ts +9 -0
- package/lib/cache/path-exists.js +18 -0
- package/lib/cache/resolve-archive-cache-dir.d.ts +26 -0
- package/lib/cache/resolve-archive-cache-dir.js +32 -0
- package/lib/cache/types.d.ts +33 -0
- package/lib/cache/types.js +1 -0
- package/lib/content-type/is-html-content-type.d.ts +17 -0
- package/lib/content-type/is-html-content-type.js +19 -0
- package/lib/content-type/normalize-content-type.d.ts +14 -0
- package/lib/content-type/normalize-content-type.js +20 -0
- package/lib/create-adjunct-tables.d.ts +66 -0
- package/lib/create-adjunct-tables.js +510 -0
- package/lib/create-entity-tables.d.ts +191 -0
- package/lib/create-entity-tables.js +387 -0
- package/lib/create-progress-reporter.d.ts +30 -0
- package/lib/create-progress-reporter.js +38 -0
- package/lib/create-ref-tables.d.ts +35 -0
- package/lib/create-ref-tables.js +185 -0
- package/lib/create-template-tables.d.ts +28 -0
- package/lib/create-template-tables.js +92 -0
- package/lib/database.d.ts +549 -0
- package/lib/database.js +803 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.d.ts +27 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.js +35 -0
- package/lib/db-ops/_shared/compress-payload.d.ts +26 -0
- package/lib/db-ops/_shared/compress-payload.js +30 -0
- package/lib/db-ops/_shared/create-write-ref-caches.d.ts +17 -0
- package/lib/db-ops/_shared/create-write-ref-caches.js +27 -0
- package/lib/db-ops/_shared/decode-json-ref.d.ts +17 -0
- package/lib/db-ops/_shared/decode-json-ref.js +31 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.d.ts +49 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.js +69 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.d.ts +20 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.js +53 -0
- package/lib/db-ops/_shared/resolve-content-item-id.d.ts +62 -0
- package/lib/db-ops/_shared/resolve-content-item-id.js +143 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.d.ts +23 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.js +29 -0
- package/lib/db-ops/_shared/retry-setting.d.ts +16 -0
- package/lib/db-ops/_shared/retry-setting.js +18 -0
- package/lib/db-ops/_shared/safe-parse-json.d.ts +11 -0
- package/lib/db-ops/_shared/safe-parse-json.js +18 -0
- package/lib/db-ops/_shared/types.d.ts +94 -0
- package/lib/db-ops/_shared/types.js +1 -0
- package/lib/db-ops/_shared/upsert-blob-ref.d.ts +25 -0
- package/lib/db-ops/_shared/upsert-blob-ref.js +48 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.d.ts +30 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.js +45 -0
- package/lib/db-ops/_shared/upsert-json-ref.d.ts +22 -0
- package/lib/db-ops/_shared/upsert-json-ref.js +41 -0
- package/lib/db-ops/_shared/upsert-response-headers.d.ts +35 -0
- package/lib/db-ops/_shared/upsert-response-headers.js +49 -0
- package/lib/db-ops/_shared/upsert-url-ref.d.ts +39 -0
- package/lib/db-ops/_shared/upsert-url-ref.js +62 -0
- package/lib/db-ops/anchors/get-anchors-on-page.d.ts +10 -0
- package/lib/db-ops/anchors/get-anchors-on-page.js +21 -0
- package/lib/db-ops/config/get-base-url.d.ts +8 -0
- package/lib/db-ops/config/get-base-url.js +14 -0
- package/lib/db-ops/config/get-config.d.ts +10 -0
- package/lib/db-ops/config/get-config.js +29 -0
- package/lib/db-ops/config/get-created-cwd.d.ts +11 -0
- package/lib/db-ops/config/get-created-cwd.js +13 -0
- package/lib/db-ops/config/get-name.d.ts +8 -0
- package/lib/db-ops/config/get-name.js +14 -0
- package/lib/db-ops/config/info-column-allowlist.d.ts +7 -0
- package/lib/db-ops/config/info-column-allowlist.js +29 -0
- package/lib/db-ops/config/info-json-columns.d.ts +5 -0
- package/lib/db-ops/config/info-json-columns.js +11 -0
- package/lib/db-ops/config/set-config.d.ts +12 -0
- package/lib/db-ops/config/set-config.js +21 -0
- package/lib/db-ops/config/update-config.d.ts +17 -0
- package/lib/db-ops/config/update-config.js +36 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.d.ts +19 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.js +30 -0
- package/lib/db-ops/console-logs/replace-console-logs.d.ts +34 -0
- package/lib/db-ops/console-logs/replace-console-logs.js +123 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.d.ts +16 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.js +26 -0
- package/lib/db-ops/console-logs/types.d.ts +38 -0
- package/lib/db-ops/console-logs/types.js +1 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.d.ts +29 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.js +52 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.d.ts +18 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.js +23 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.d.ts +12 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.js +15 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.d.ts +14 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.js +30 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.d.ts +57 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.js +87 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.d.ts +21 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.js +27 -0
- package/lib/db-ops/errors/insert-crawl-error.d.ts +15 -0
- package/lib/db-ops/errors/insert-crawl-error.js +21 -0
- package/lib/db-ops/errors/insert-page-error.d.ts +21 -0
- package/lib/db-ops/errors/insert-page-error.js +30 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.d.ts +33 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.js +158 -0
- package/lib/db-ops/html/read-page-html-blob.d.ts +17 -0
- package/lib/db-ops/html/read-page-html-blob.js +20 -0
- package/lib/db-ops/lifecycle/checkpoint.d.ts +8 -0
- package/lib/db-ops/lifecycle/checkpoint.js +9 -0
- package/lib/db-ops/lifecycle/destroy.d.ts +6 -0
- package/lib/db-ops/lifecycle/destroy.js +7 -0
- package/lib/db-ops/lifecycle/init.d.ts +58 -0
- package/lib/db-ops/lifecycle/init.js +122 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.d.ts +22 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.js +41 -0
- package/lib/db-ops/meta/get-audios-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-audios-of-page.js +15 -0
- package/lib/db-ops/meta/get-buttons-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-buttons-of-page.js +15 -0
- package/lib/db-ops/meta/get-canvases-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-canvases-of-page.js +15 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.js +15 -0
- package/lib/db-ops/meta/get-headings-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-headings-of-page.js +15 -0
- package/lib/db-ops/meta/get-iframes-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-iframes-of-page.js +15 -0
- package/lib/db-ops/meta/get-jsonld-of-page.d.ts +13 -0
- package/lib/db-ops/meta/get-jsonld-of-page.js +27 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.js +15 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.js +15 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.js +15 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.js +15 -0
- package/lib/db-ops/meta/get-videos-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-videos-of-page.js +15 -0
- package/lib/db-ops/outages/close-network-outage.d.ts +12 -0
- package/lib/db-ops/outages/close-network-outage.js +15 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.d.ts +26 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.js +42 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.d.ts +26 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.js +31 -0
- package/lib/db-ops/outages/insert-network-outage.d.ts +14 -0
- package/lib/db-ops/outages/insert-network-outage.js +29 -0
- package/lib/db-ops/outages/list-network-outages.d.ts +28 -0
- package/lib/db-ops/outages/list-network-outages.js +42 -0
- package/lib/db-ops/pages/order/set-url-order.d.ts +13 -0
- package/lib/db-ops/pages/order/set-url-order.js +38 -0
- package/lib/db-ops/pages/read/build-page-query.d.ts +18 -0
- package/lib/db-ops/pages/read/build-page-query.js +40 -0
- package/lib/db-ops/pages/read/get-crawling-state.d.ts +117 -0
- package/lib/db-ops/pages/read/get-crawling-state.js +161 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.d.ts +15 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.js +30 -0
- package/lib/db-ops/pages/read/get-page-count.d.ts +12 -0
- package/lib/db-ops/pages/read/get-page-count.js +21 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.d.ts +24 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.js +28 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.d.ts +38 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.js +107 -0
- package/lib/db-ops/pages/read/get-pages.d.ts +11 -0
- package/lib/db-ops/pages/read/get-pages.js +51 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.d.ts +18 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.js +25 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.d.ts +31 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.js +32 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.d.ts +20 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.js +37 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.d.ts +30 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.js +91 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.d.ts +88 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.js +216 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.d.ts +80 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.js +151 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.d.ts +24 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.js +24 -0
- package/lib/db-ops/pages/write/insert-audios.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-audios.js +25 -0
- package/lib/db-ops/pages/write/insert-buttons.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-buttons.js +29 -0
- package/lib/db-ops/pages/write/insert-canvases.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-canvases.js +26 -0
- package/lib/db-ops/pages/write/insert-custom-elements.d.ts +27 -0
- package/lib/db-ops/pages/write/insert-custom-elements.js +40 -0
- package/lib/db-ops/pages/write/insert-headings.d.ts +15 -0
- package/lib/db-ops/pages/write/insert-headings.js +27 -0
- package/lib/db-ops/pages/write/insert-iframes.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-iframes.js +28 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.d.ts +38 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.js +60 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.d.ts +36 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.js +48 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.d.ts +42 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.js +56 -0
- package/lib/db-ops/pages/write/insert-jsonld.d.ts +17 -0
- package/lib/db-ops/pages/write/insert-jsonld.js +49 -0
- package/lib/db-ops/pages/write/insert-main-content-images.d.ts +20 -0
- package/lib/db-ops/pages/write/insert-main-content-images.js +32 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.js +29 -0
- package/lib/db-ops/pages/write/insert-page.d.ts +56 -0
- package/lib/db-ops/pages/write/insert-page.js +259 -0
- package/lib/db-ops/pages/write/insert-technologies.d.ts +25 -0
- package/lib/db-ops/pages/write/insert-technologies.js +45 -0
- package/lib/db-ops/pages/write/insert-videos.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-videos.js +28 -0
- package/lib/db-ops/pages/write/link-redirect-sources.d.ts +42 -0
- package/lib/db-ops/pages/write/link-redirect-sources.js +101 -0
- package/lib/db-ops/pages/write/record-redirect.d.ts +35 -0
- package/lib/db-ops/pages/write/record-redirect.js +100 -0
- package/lib/db-ops/pages/write/set-skipped-page.d.ts +13 -0
- package/lib/db-ops/pages/write/set-skipped-page.js +24 -0
- package/lib/db-ops/pages/write/update-page.d.ts +40 -0
- package/lib/db-ops/pages/write/update-page.js +419 -0
- package/lib/db-ops/pages/write/write-page-html-blob.d.ts +19 -0
- package/lib/db-ops/pages/write/write-page-html-blob.js +41 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.d.ts +9 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.js +15 -0
- package/lib/db-ops/referrers/get-referrers-of-page.d.ts +17 -0
- package/lib/db-ops/referrers/get-referrers-of-page.js +32 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.d.ts +8 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.js +15 -0
- package/lib/db-ops/resources/build-resource-query.d.ts +25 -0
- package/lib/db-ops/resources/build-resource-query.js +29 -0
- package/lib/db-ops/resources/get-existing-resource-urls.d.ts +9 -0
- package/lib/db-ops/resources/get-existing-resource-urls.js +24 -0
- package/lib/db-ops/resources/get-resource-by-url.d.ts +13 -0
- package/lib/db-ops/resources/get-resource-by-url.js +22 -0
- package/lib/db-ops/resources/get-resource-url-list.d.ts +17 -0
- package/lib/db-ops/resources/get-resource-url-list.js +26 -0
- package/lib/db-ops/resources/get-resources.d.ts +8 -0
- package/lib/db-ops/resources/get-resources.js +11 -0
- package/lib/db-ops/resources/insert-inventory-resources.d.ts +24 -0
- package/lib/db-ops/resources/insert-inventory-resources.js +64 -0
- package/lib/db-ops/resources/insert-resource-referrers.d.ts +15 -0
- package/lib/db-ops/resources/insert-resource-referrers.js +54 -0
- package/lib/db-ops/resources/insert-resource.d.ts +34 -0
- package/lib/db-ops/resources/insert-resource.js +73 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.d.ts +26 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.js +30 -0
- package/lib/db-ops/templates/assign-template-labels.d.ts +60 -0
- package/lib/db-ops/templates/assign-template-labels.js +187 -0
- package/lib/db-ops/templates/replace-page-templates.d.ts +44 -0
- package/lib/db-ops/templates/replace-page-templates.js +174 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.d.ts +16 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.js +17 -0
- package/lib/db-ops/templates/types.d.ts +103 -0
- package/lib/db-ops/templates/types.js +1 -0
- package/lib/debug.d.ts +8 -0
- package/lib/debug.js +9 -0
- package/lib/decode-html-blob.d.ts +20 -0
- package/lib/decode-html-blob.js +23 -0
- package/lib/decode-page-html-blob-bytes.d.ts +25 -0
- package/lib/decode-page-html-blob-bytes.js +29 -0
- package/lib/decode-stored-blob-bytes.d.ts +25 -0
- package/lib/decode-stored-blob-bytes.js +47 -0
- package/lib/derive-lineage-from-parent.d.ts +37 -0
- package/lib/derive-lineage-from-parent.js +42 -0
- package/lib/drop-legacy-tables.d.ts +45 -0
- package/lib/drop-legacy-tables.js +56 -0
- package/lib/error-kind/classify-error-kind.d.ts +20 -0
- package/lib/error-kind/classify-error-kind.js +136 -0
- package/lib/error-kind/network-related-error-kinds.d.ts +23 -0
- package/lib/error-kind/network-related-error-kinds.js +28 -0
- package/lib/error-kind/permanent-error-kinds.d.ts +48 -0
- package/lib/error-kind/permanent-error-kinds.js +54 -0
- package/lib/error-kind/types.d.ts +54 -0
- package/lib/error-kind/types.js +1 -0
- package/lib/filesystem/append-text.d.ts +9 -0
- package/lib/filesystem/append-text.js +14 -0
- package/lib/filesystem/copy-dir-sync.d.ts +6 -0
- package/lib/filesystem/copy-dir-sync.js +9 -0
- package/lib/filesystem/copy-dir.d.ts +7 -0
- package/lib/filesystem/copy-dir.js +13 -0
- package/lib/filesystem/copy-file-with-progress.d.ts +20 -0
- package/lib/filesystem/copy-file-with-progress.js +34 -0
- package/lib/filesystem/exists.d.ts +6 -0
- package/lib/filesystem/exists.js +9 -0
- package/lib/filesystem/get-file-list.d.ts +8 -0
- package/lib/filesystem/get-file-list.js +12 -0
- package/lib/filesystem/is-dir.d.ts +6 -0
- package/lib/filesystem/is-dir.js +10 -0
- package/lib/filesystem/mkdir.d.ts +8 -0
- package/lib/filesystem/mkdir.js +15 -0
- package/lib/filesystem/output-binary.d.ts +12 -0
- package/lib/filesystem/output-binary.js +17 -0
- package/lib/filesystem/output-json.d.ts +9 -0
- package/lib/filesystem/output-json.js +14 -0
- package/lib/filesystem/output-text.d.ts +11 -0
- package/lib/filesystem/output-text.js +32 -0
- package/lib/filesystem/parse-pax-path.d.ts +18 -0
- package/lib/filesystem/parse-pax-path.js +45 -0
- package/lib/filesystem/parse-tar-size-field.d.ts +13 -0
- package/lib/filesystem/parse-tar-size-field.js +37 -0
- package/lib/filesystem/peek-tar-top-dir.d.ts +35 -0
- package/lib/filesystem/peek-tar-top-dir.js +215 -0
- package/lib/filesystem/read-json.d.ts +7 -0
- package/lib/filesystem/read-json.js +11 -0
- package/lib/filesystem/read-text.d.ts +6 -0
- package/lib/filesystem/read-text.js +10 -0
- package/lib/filesystem/readline.d.ts +11 -0
- package/lib/filesystem/readline.js +26 -0
- package/lib/filesystem/remove.d.ts +5 -0
- package/lib/filesystem/remove.js +10 -0
- package/lib/filesystem/rename.d.ts +16 -0
- package/lib/filesystem/rename.js +48 -0
- package/lib/filesystem/tar.d.ts +23 -0
- package/lib/filesystem/tar.js +78 -0
- package/lib/filesystem/untar.d.ts +33 -0
- package/lib/filesystem/untar.js +84 -0
- package/lib/get-failed-page-messages.d.ts +56 -0
- package/lib/get-failed-page-messages.js +146 -0
- package/lib/get-json.d.ts +10 -0
- package/lib/get-json.js +25 -0
- package/lib/html-snapshot/match-selector-html.d.ts +25 -0
- package/lib/html-snapshot/match-selector-html.js +28 -0
- package/lib/html-snapshot/match-selector-snapshots.d.ts +33 -0
- package/lib/html-snapshot/match-selector-snapshots.js +33 -0
- package/lib/html-snapshot/search-html-document.d.ts +29 -0
- package/lib/html-snapshot/search-html-document.js +27 -0
- package/lib/html-snapshot/search-html-snapshots.d.ts +36 -0
- package/lib/html-snapshot/search-html-snapshots.js +35 -0
- package/lib/html-snapshot/types.d.ts +111 -0
- package/lib/html-snapshot/types.js +7 -0
- package/lib/html-snapshot/validate-search-pattern.d.ts +15 -0
- package/lib/html-snapshot/validate-search-pattern.js +17 -0
- package/lib/init-schema.d.ts +48 -0
- package/lib/init-schema.js +124 -0
- package/lib/is-inventory-source.d.ts +21 -0
- package/lib/is-inventory-source.js +22 -0
- package/lib/is-within-outage-window.d.ts +49 -0
- package/lib/is-within-outage-window.js +33 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.d.ts +24 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.js +26 -0
- package/lib/libsql-dialect.d.ts +115 -0
- package/lib/libsql-dialect.js +116 -0
- package/lib/limited-page-ids.d.ts +9 -0
- package/lib/limited-page-ids.js +18 -0
- package/lib/meta/assert-compatible-version.d.ts +60 -0
- package/lib/meta/assert-compatible-version.js +93 -0
- package/lib/meta/classify-jsonld-type.d.ts +23 -0
- package/lib/meta/classify-jsonld-type.js +43 -0
- package/lib/meta/compare-semver.d.ts +23 -0
- package/lib/meta/compare-semver.js +51 -0
- package/lib/meta/compute-main-contents-denormalized.d.ts +41 -0
- package/lib/meta/compute-main-contents-denormalized.js +88 -0
- package/lib/meta/compute-page-denormalized.d.ts +20 -0
- package/lib/meta/compute-page-denormalized.js +35 -0
- package/lib/meta/derive-flat-from-meta.d.ts +34 -0
- package/lib/meta/derive-flat-from-meta.js +158 -0
- package/lib/meta/derive-meta-extras.d.ts +20 -0
- package/lib/meta/derive-meta-extras.js +23 -0
- package/lib/meta/extract-tags-for-archive.d.ts +17 -0
- package/lib/meta/extract-tags-for-archive.js +36 -0
- package/lib/meta/parse-main-content-class-list.d.ts +19 -0
- package/lib/meta/parse-main-content-class-list.js +34 -0
- package/lib/meta/summarize-jsonld.d.ts +17 -0
- package/lib/meta/summarize-jsonld.js +29 -0
- package/lib/meta/technologies/combine-technology-confidence.d.ts +46 -0
- package/lib/meta/technologies/combine-technology-confidence.js +93 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.d.ts +45 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.js +53 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.d.ts +33 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.js +46 -0
- package/lib/meta/technologies/extract-technologies-for-archive.d.ts +33 -0
- package/lib/meta/technologies/extract-technologies-for-archive.js +30 -0
- package/lib/meta/technologies/match-js-license-comment-signal.d.ts +21 -0
- package/lib/meta/technologies/match-js-license-comment-signal.js +23 -0
- package/lib/meta/technologies/match-structural-technology-signals.d.ts +26 -0
- package/lib/meta/technologies/match-structural-technology-signals.js +48 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.d.ts +25 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.js +35 -0
- package/lib/meta/technologies/technology-signal-definitions.d.ts +44 -0
- package/lib/meta/technologies/technology-signal-definitions.js +60 -0
- package/lib/meta/technologies/types.d.ts +70 -0
- package/lib/meta/technologies/types.js +13 -0
- package/lib/meta/types.d.ts +1490 -0
- package/lib/meta/types.js +65 -0
- package/lib/migrate-content-items-alias-of-id.d.ts +52 -0
- package/lib/migrate-content-items-alias-of-id.js +69 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.d.ts +46 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.js +62 -0
- package/lib/migrate-content-items-is-metadata-only.d.ts +44 -0
- package/lib/migrate-content-items-is-metadata-only.js +60 -0
- package/lib/migrate-entity-tables.d.ts +55 -0
- package/lib/migrate-entity-tables.js +66 -0
- package/lib/migrate-info-created-cwd.d.ts +17 -0
- package/lib/migrate-info-created-cwd.js +36 -0
- package/lib/migrate-info-main-content-selector.d.ts +16 -0
- package/lib/migrate-info-main-content-selector.js +35 -0
- package/lib/migrate-info-request-header-names.d.ts +16 -0
- package/lib/migrate-info-request-header-names.js +35 -0
- package/lib/migrate-info-roots.d.ts +20 -0
- package/lib/migrate-info-roots.js +52 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.d.ts +34 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.js +51 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.d.ts +25 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.js +44 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.d.ts +16 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.js +35 -0
- package/lib/migrate-main-contents-columns.d.ts +26 -0
- package/lib/migrate-main-contents-columns.js +61 -0
- package/lib/migrate-page-meta-body-hash.d.ts +44 -0
- package/lib/migrate-page-meta-body-hash.js +63 -0
- package/lib/migrate-page-meta-console-error-count.d.ts +27 -0
- package/lib/migrate-page-meta-console-error-count.js +45 -0
- package/lib/migrate-page-meta-custom-element-count.d.ts +33 -0
- package/lib/migrate-page-meta-custom-element-count.js +51 -0
- package/lib/migrate-page-meta-image-scan.d.ts +27 -0
- package/lib/migrate-page-meta-image-scan.js +52 -0
- package/lib/migrate-page-tags-to-page-technologies.d.ts +39 -0
- package/lib/migrate-page-tags-to-page-technologies.js +79 -0
- package/lib/migrate-ref-tables.d.ts +25 -0
- package/lib/migrate-ref-tables.js +38 -0
- package/lib/native-executor/check-native-executor-config.d.ts +17 -0
- package/lib/native-executor/check-native-executor-config.js +20 -0
- package/lib/page-meta-column-maps.d.ts +32 -0
- package/lib/page-meta-column-maps.js +43 -0
- package/lib/page.d.ts +546 -0
- package/lib/page.js +764 -0
- package/lib/peek-archive-lock.d.ts +40 -0
- package/lib/peek-archive-lock.js +62 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.d.ts +41 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.js +87 -0
- package/lib/populate-entity-tables/derive-dom-path.d.ts +35 -0
- package/lib/populate-entity-tables/derive-dom-path.js +72 -0
- package/lib/populate-entity-tables/is-blob-ref-value.d.ts +16 -0
- package/lib/populate-entity-tables/is-blob-ref-value.js +19 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.d.ts +66 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.js +96 -0
- package/lib/populate-entity-tables/populate-anchor-edges.d.ts +33 -0
- package/lib/populate-entity-tables/populate-anchor-edges.js +153 -0
- package/lib/populate-entity-tables/populate-content-items.d.ts +40 -0
- package/lib/populate-entity-tables/populate-content-items.js +141 -0
- package/lib/populate-entity-tables/populate-entities.d.ts +81 -0
- package/lib/populate-entity-tables/populate-entities.js +110 -0
- package/lib/populate-entity-tables/populate-image-items.d.ts +91 -0
- package/lib/populate-entity-tables/populate-image-items.js +226 -0
- package/lib/populate-entity-tables/populate-page-meta.d.ts +33 -0
- package/lib/populate-entity-tables/populate-page-meta.js +267 -0
- package/lib/populate-entity-tables/populate-resource-items.d.ts +22 -0
- package/lib/populate-entity-tables/populate-resource-items.js +114 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.d.ts +31 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.js +33 -0
- package/lib/populate-entity-tables/resolve-blob-refs.d.ts +31 -0
- package/lib/populate-entity-tables/resolve-blob-refs.js +100 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.d.ts +22 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.js +27 -0
- package/lib/populate-entity-tables/resolve-header-sets.d.ts +49 -0
- package/lib/populate-entity-tables/resolve-header-sets.js +122 -0
- package/lib/populate-entity-tables/resolve-json-refs.d.ts +25 -0
- package/lib/populate-entity-tables/resolve-json-refs.js +67 -0
- package/lib/populate-entity-tables/resolve-text-refs.d.ts +30 -0
- package/lib/populate-entity-tables/resolve-text-refs.js +61 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.d.ts +21 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.js +27 -0
- package/lib/populate-entity-tables/resolve-url-refs.d.ts +33 -0
- package/lib/populate-entity-tables/resolve-url-refs.js +60 -0
- package/lib/populate-entity-tables/test-utils/count-rows.d.ts +17 -0
- package/lib/populate-entity-tables/test-utils/count-rows.js +20 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.d.ts +25 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.js +42 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.d.ts +30 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.js +175 -0
- package/lib/populate-entity-tables/types.d.ts +157 -0
- package/lib/populate-entity-tables/types.js +12 -0
- package/lib/populate-entity-tables/upsert-text-refs.d.ts +38 -0
- package/lib/populate-entity-tables/upsert-text-refs.js +78 -0
- package/lib/populate-ref-tables/classify-content-type.d.ts +16 -0
- package/lib/populate-ref-tables/classify-content-type.js +52 -0
- package/lib/populate-ref-tables/compute-content-hash.d.ts +22 -0
- package/lib/populate-ref-tables/compute-content-hash.js +26 -0
- package/lib/populate-ref-tables/compute-header-flags.d.ts +16 -0
- package/lib/populate-ref-tables/compute-header-flags.js +70 -0
- package/lib/populate-ref-tables/content-type-rules.d.ts +38 -0
- package/lib/populate-ref-tables/content-type-rules.js +133 -0
- package/lib/populate-ref-tables/create-header-table-caches.d.ts +25 -0
- package/lib/populate-ref-tables/create-header-table-caches.js +49 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.d.ts +15 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.js +15 -0
- package/lib/populate-ref-tables/decode-data-uri.d.ts +21 -0
- package/lib/populate-ref-tables/decode-data-uri.js +126 -0
- package/lib/populate-ref-tables/decompose-header-set.d.ts +29 -0
- package/lib/populate-ref-tables/decompose-header-set.js +157 -0
- package/lib/populate-ref-tables/decompose-url.d.ts +25 -0
- package/lib/populate-ref-tables/decompose-url.js +70 -0
- package/lib/populate-ref-tables/header-stability.d.ts +19 -0
- package/lib/populate-ref-tables/header-stability.js +22 -0
- package/lib/populate-ref-tables/header-value-cache-key.d.ts +17 -0
- package/lib/populate-ref-tables/header-value-cache-key.js +19 -0
- package/lib/populate-ref-tables/normalize-mime.d.ts +24 -0
- package/lib/populate-ref-tables/normalize-mime.js +36 -0
- package/lib/populate-ref-tables/populate-blob-refs.d.ts +38 -0
- package/lib/populate-ref-tables/populate-blob-refs.js +134 -0
- package/lib/populate-ref-tables/populate-content-type-refs.d.ts +27 -0
- package/lib/populate-ref-tables/populate-content-type-refs.js +70 -0
- package/lib/populate-ref-tables/populate-header-tables.d.ts +35 -0
- package/lib/populate-ref-tables/populate-header-tables.js +80 -0
- package/lib/populate-ref-tables/populate-json-refs.d.ts +29 -0
- package/lib/populate-ref-tables/populate-json-refs.js +101 -0
- package/lib/populate-ref-tables/populate-refs.d.ts +51 -0
- package/lib/populate-ref-tables/populate-refs.js +62 -0
- package/lib/populate-ref-tables/populate-text-refs.d.ts +32 -0
- package/lib/populate-ref-tables/populate-text-refs.js +133 -0
- package/lib/populate-ref-tables/populate-url-refs.d.ts +28 -0
- package/lib/populate-ref-tables/populate-url-refs.js +148 -0
- package/lib/populate-ref-tables/test-utils/count-rows.d.ts +15 -0
- package/lib/populate-ref-tables/test-utils/count-rows.js +17 -0
- package/lib/populate-ref-tables/types.d.ts +197 -0
- package/lib/populate-ref-tables/types.js +7 -0
- package/lib/populate-ref-tables/upsert-one-header-set.d.ts +34 -0
- package/lib/populate-ref-tables/upsert-one-header-set.js +208 -0
- package/lib/populate-ref-tables/volatile-header-names.d.ts +20 -0
- package/lib/populate-ref-tables/volatile-header-names.js +33 -0
- package/lib/redirect-table.d.ts +9 -0
- package/lib/redirect-table.js +28 -0
- package/lib/release-finished-statements.d.ts +42 -0
- package/lib/release-finished-statements.js +45 -0
- package/lib/resolve-redirect-chain.d.ts +33 -0
- package/lib/resolve-redirect-chain.js +27 -0
- package/lib/resource.d.ts +46 -0
- package/lib/resource.js +62 -0
- package/lib/retarget-legacy-fk-tables.d.ts +61 -0
- package/lib/retarget-legacy-fk-tables.js +137 -0
- package/lib/safe-path.d.ts +9 -0
- package/lib/safe-path.js +17 -0
- package/lib/scope/build-scope-map.d.ts +21 -0
- package/lib/scope/build-scope-map.js +32 -0
- package/lib/scope/find-scope-entry.d.ts +25 -0
- package/lib/scope/find-scope-entry.js +45 -0
- package/lib/template-classification/classify-archive-page-templates.d.ts +42 -0
- package/lib/template-classification/classify-archive-page-templates.js +70 -0
- package/lib/template-classification/classify-page-templates.d.ts +33 -0
- package/lib/template-classification/classify-page-templates.js +60 -0
- package/lib/template-classification/collect-page-ids-with-html.d.ts +24 -0
- package/lib/template-classification/collect-page-ids-with-html.js +30 -0
- package/lib/template-classification/collect-page-stylesheet-urls.d.ts +32 -0
- package/lib/template-classification/collect-page-stylesheet-urls.js +132 -0
- package/lib/template-classification/create-content-root-hint.d.ts +41 -0
- package/lib/template-classification/create-content-root-hint.js +51 -0
- package/lib/template-classification/create-page-cluster-factory.d.ts +36 -0
- package/lib/template-classification/create-page-cluster-factory.js +52 -0
- package/lib/template-classification/load-page-cluster-candidates.d.ts +32 -0
- package/lib/template-classification/load-page-cluster-candidates.js +93 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.d.ts +34 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.js +236 -0
- package/lib/template-classification/page-cluster/types.d.ts +123 -0
- package/lib/template-classification/page-cluster/types.js +1 -0
- package/lib/template-classification/types.d.ts +234 -0
- package/lib/template-classification/types.js +1 -0
- package/lib/test-utils/build-full-schema-test-db.d.ts +34 -0
- package/lib/test-utils/build-full-schema-test-db.js +74 -0
- package/lib/test-utils/compare-strings.d.ts +12 -0
- package/lib/test-utils/compare-strings.js +14 -0
- package/lib/test-utils/create-legacy-analysis-tables.d.ts +13 -0
- package/lib/test-utils/create-legacy-analysis-tables.js +37 -0
- package/lib/test-utils/fk-parent-tables.d.ts +15 -0
- package/lib/test-utils/fk-parent-tables.js +19 -0
- package/lib/test-utils/seed-content-item.d.ts +35 -0
- package/lib/test-utils/seed-content-item.js +42 -0
- package/lib/test-utils/setup-legacy-fk-db.d.ts +34 -0
- package/lib/test-utils/setup-legacy-fk-db.js +271 -0
- package/lib/transfer/attach-source-database.d.ts +31 -0
- package/lib/transfer/attach-source-database.js +40 -0
- package/lib/transfer/build-split-config.d.ts +30 -0
- package/lib/transfer/build-split-config.js +42 -0
- package/lib/transfer/clear-replaced-page-rows.d.ts +23 -0
- package/lib/transfer/clear-replaced-page-rows.js +61 -0
- package/lib/transfer/concat-archives.d.ts +55 -0
- package/lib/transfer/concat-archives.js +95 -0
- package/lib/transfer/concat-source-transfer-phases.d.ts +10 -0
- package/lib/transfer/concat-source-transfer-phases.js +17 -0
- package/lib/transfer/content-item-rank-sql.d.ts +21 -0
- package/lib/transfer/content-item-rank-sql.js +23 -0
- package/lib/transfer/copy-anchor-edges.d.ts +28 -0
- package/lib/transfer/copy-anchor-edges.js +42 -0
- package/lib/transfer/copy-dictionaries-for-concat.d.ts +39 -0
- package/lib/transfer/copy-dictionaries-for-concat.js +81 -0
- package/lib/transfer/copy-dictionaries-for-split.d.ts +29 -0
- package/lib/transfer/copy-dictionaries-for-split.js +224 -0
- package/lib/transfer/copy-header-set-children.d.ts +27 -0
- package/lib/transfer/copy-header-set-children.js +51 -0
- package/lib/transfer/copy-image-items.d.ts +21 -0
- package/lib/transfer/copy-image-items.js +62 -0
- package/lib/transfer/copy-inventory-source-lists.d.ts +30 -0
- package/lib/transfer/copy-inventory-source-lists.js +61 -0
- package/lib/transfer/copy-journal-tables.d.ts +30 -0
- package/lib/transfer/copy-journal-tables.js +56 -0
- package/lib/transfer/copy-page-console-logs.d.ts +16 -0
- package/lib/transfer/copy-page-console-logs.js +27 -0
- package/lib/transfer/copy-page-html-blobs.d.ts +31 -0
- package/lib/transfer/copy-page-html-blobs.js +43 -0
- package/lib/transfer/copy-page-meta.d.ts +27 -0
- package/lib/transfer/copy-page-meta.js +68 -0
- package/lib/transfer/copy-page-template-clusters.d.ts +31 -0
- package/lib/transfer/copy-page-template-clusters.js +56 -0
- package/lib/transfer/copy-page-template-labels.d.ts +34 -0
- package/lib/transfer/copy-page-template-labels.js +88 -0
- package/lib/transfer/copy-resource-items.d.ts +29 -0
- package/lib/transfer/copy-resource-items.js +89 -0
- package/lib/transfer/copy-resource-ref-edges.d.ts +20 -0
- package/lib/transfer/copy-resource-ref-edges.js +33 -0
- package/lib/transfer/copy-simple-page-scoped-tables.d.ts +15 -0
- package/lib/transfer/copy-simple-page-scoped-tables.js +34 -0
- package/lib/transfer/count-external-pages-in-scope.d.ts +26 -0
- package/lib/transfer/count-external-pages-in-scope.js +40 -0
- package/lib/transfer/create-transfer-temp-tables.d.ts +30 -0
- package/lib/transfer/create-transfer-temp-tables.js +59 -0
- package/lib/transfer/dictionary-copy-specs.d.ts +32 -0
- package/lib/transfer/dictionary-copy-specs.js +28 -0
- package/lib/transfer/drop-transfer-temp-tables.d.ts +9 -0
- package/lib/transfer/drop-transfer-temp-tables.js +18 -0
- package/lib/transfer/flatten-redirect-chains.d.ts +44 -0
- package/lib/transfer/flatten-redirect-chains.js +74 -0
- package/lib/transfer/insert-content-items.d.ts +35 -0
- package/lib/transfer/insert-content-items.js +116 -0
- package/lib/transfer/list-transfer-columns.d.ts +35 -0
- package/lib/transfer/list-transfer-columns.js +45 -0
- package/lib/transfer/mark-in-scope-content-items.d.ts +31 -0
- package/lib/transfer/mark-in-scope-content-items.js +54 -0
- package/lib/transfer/merge-archive-configs.d.ts +51 -0
- package/lib/transfer/merge-archive-configs.js +85 -0
- package/lib/transfer/plan-content-items-for-concat.d.ts +33 -0
- package/lib/transfer/plan-content-items-for-concat.js +51 -0
- package/lib/transfer/plan-content-items-for-split.d.ts +42 -0
- package/lib/transfer/plan-content-items-for-split.js +83 -0
- package/lib/transfer/plan-resource-items.d.ts +40 -0
- package/lib/transfer/plan-resource-items.js +69 -0
- package/lib/transfer/quote-transfer-identifier.d.ts +18 -0
- package/lib/transfer/quote-transfer-identifier.js +20 -0
- package/lib/transfer/reclassify-resource-externality.d.ts +37 -0
- package/lib/transfer/reclassify-resource-externality.js +66 -0
- package/lib/transfer/remap-redirect-dest-ids.d.ts +34 -0
- package/lib/transfer/remap-redirect-dest-ids.js +51 -0
- package/lib/transfer/replace-content-items.d.ts +39 -0
- package/lib/transfer/replace-content-items.js +83 -0
- package/lib/transfer/simple-page-scoped-tables.d.ts +25 -0
- package/lib/transfer/simple-page-scoped-tables.js +38 -0
- package/lib/transfer/split-archive.d.ts +55 -0
- package/lib/transfer/split-archive.js +98 -0
- package/lib/transfer/split-source-transfer-phases.d.ts +11 -0
- package/lib/transfer/split-source-transfer-phases.js +18 -0
- package/lib/transfer/transfer-action.d.ts +34 -0
- package/lib/transfer/transfer-action.js +32 -0
- package/lib/transfer/transfer-archive-rows.d.ts +65 -0
- package/lib/transfer/transfer-archive-rows.js +156 -0
- package/lib/transfer/transfer-dictionary-tables.d.ts +12 -0
- package/lib/transfer/transfer-dictionary-tables.js +22 -0
- package/lib/transfer/transfer-post-phases.d.ts +10 -0
- package/lib/transfer/transfer-post-phases.js +13 -0
- package/lib/transfer/transfer-source-alias.d.ts +9 -0
- package/lib/transfer/transfer-source-alias.js +9 -0
- package/lib/transfer/types.d.ts +111 -0
- package/lib/transfer/types.js +35 -0
- package/lib/types.d.ts +772 -0
- package/lib/types.js +1 -0
- package/lib/url-alias/compute-tier-a-alias-key.d.ts +44 -0
- package/lib/url-alias/compute-tier-a-alias-key.js +47 -0
- package/lib/url-alias/compute-tier-b-alias-key.d.ts +23 -0
- package/lib/url-alias/compute-tier-b-alias-key.js +26 -0
- package/lib/url-alias/group-alias-candidates.d.ts +27 -0
- package/lib/url-alias/group-alias-candidates.js +29 -0
- package/lib/url-alias/types.d.ts +12 -0
- package/lib/url-alias/types.js +1 -0
- package/lib/url-pattern/compute-shape-key.d.ts +58 -0
- package/lib/url-pattern/compute-shape-key.js +129 -0
- package/lib/url-pattern/decompose-url.d.ts +33 -0
- package/lib/url-pattern/decompose-url.js +79 -0
- package/lib/url-pattern/reconstruct-url.d.ts +15 -0
- package/lib/url-pattern/reconstruct-url.js +33 -0
- package/lib/url-sort/compute-url-sort-ranks.d.ts +30 -0
- package/lib/url-sort/compute-url-sort-ranks.js +33 -0
- package/lib/utils/array/each-splitted.d.ts +10 -0
- package/lib/utils/array/each-splitted.js +14 -0
- package/lib/utils/debug.d.ts +8 -0
- package/lib/utils/debug.js +8 -0
- package/lib/utils/error/emit-error-with-retry.d.ts +40 -0
- package/lib/utils/error/emit-error-with-retry.js +44 -0
- package/lib/utils/error/emit-error.d.ts +39 -0
- package/lib/utils/error/emit-error.js +41 -0
- package/lib/utils/object/parse-response-headers.d.ts +12 -0
- package/lib/utils/object/parse-response-headers.js +26 -0
- package/lib/utils/object/redact-request-headers.d.ts +15 -0
- package/lib/utils/object/redact-request-headers.js +27 -0
- package/lib/utils/types/types.d.ts +383 -0
- package/lib/utils/types/types.js +1 -0
- package/lib/verify-migration/capture-rejection.d.ts +24 -0
- package/lib/verify-migration/capture-rejection.js +31 -0
- package/lib/verify-migration/check-anchor-edges-count.d.ts +34 -0
- package/lib/verify-migration/check-anchor-edges-count.js +72 -0
- package/lib/verify-migration/check-anchor-edges-sum.d.ts +13 -0
- package/lib/verify-migration/check-anchor-edges-sum.js +27 -0
- package/lib/verify-migration/check-content-items-count.d.ts +16 -0
- package/lib/verify-migration/check-content-items-count.js +30 -0
- package/lib/verify-migration/check-content-type-preservation.d.ts +22 -0
- package/lib/verify-migration/check-content-type-preservation.js +40 -0
- package/lib/verify-migration/check-foreign-key-integrity.d.ts +31 -0
- package/lib/verify-migration/check-foreign-key-integrity.js +47 -0
- package/lib/verify-migration/check-image-items-count.d.ts +12 -0
- package/lib/verify-migration/check-image-items-count.js +26 -0
- package/lib/verify-migration/check-page-meta-count.d.ts +15 -0
- package/lib/verify-migration/check-page-meta-count.js +31 -0
- package/lib/verify-migration/check-reader-parity.d.ts +23 -0
- package/lib/verify-migration/check-reader-parity.js +182 -0
- package/lib/verify-migration/check-resource-items-count.d.ts +17 -0
- package/lib/verify-migration/check-resource-items-count.js +33 -0
- package/lib/verify-migration/check-url-round-trip.d.ts +43 -0
- package/lib/verify-migration/check-url-round-trip.js +112 -0
- package/lib/verify-migration/types.d.ts +70 -0
- package/lib/verify-migration/types.js +63 -0
- package/lib/verify-migration/verify-migration.d.ts +41 -0
- package/lib/verify-migration/verify-migration.js +120 -0
- package/lib/with-bulk-write-pragmas.d.ts +51 -0
- package/lib/with-bulk-write-pragmas.js +132 -0
- package/lib/write-queue.d.ts +32 -0
- package/lib/write-queue.js +55 -0
- package/package.json +350 -3
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Populates `resource_ref_edges` from `resources-referrers`
|
|
4
|
+
* (issue #193).
|
|
5
|
+
*
|
|
6
|
+
* The transformation is a **direct SQL `INSERT ... SELECT`** — no ref
|
|
7
|
+
* lookups, no per-row JS work. Legacy `resources-referrers` already
|
|
8
|
+
* enforces `UNIQUE(resourceId, pageId)` (see `init-schema.ts`), so every
|
|
9
|
+
* source row maps 1:1 to a distinct `resource_ref_edges` PK; every
|
|
10
|
+
* `count` starts at `1` because the legacy shape observed each
|
|
11
|
+
* (resource, page) pair exactly once.
|
|
12
|
+
*
|
|
13
|
+
* `INSERT OR IGNORE` on the `(resource_id, page_id)` PK is redundant
|
|
14
|
+
* with the legacy unique constraint on the source but present anyway to
|
|
15
|
+
* make partial-failure re-runs safe.
|
|
16
|
+
*
|
|
17
|
+
* The PKs on both `resource_items.id` and `content_items.id` were
|
|
18
|
+
* preserved from `resources.id` / `pages.id`, so no per-row translation
|
|
19
|
+
* is required — the FKs `resource_items(id)` and `content_items(id)`
|
|
20
|
+
* declared in `resource_ref_edges` are already satisfied for every
|
|
21
|
+
* source row by `populateContentItems` / `populateResourceItems`, which
|
|
22
|
+
* run before this function in `populateEntityTables`.
|
|
23
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
24
|
+
* @example
|
|
25
|
+
* await knex.transaction(async (trx) => {
|
|
26
|
+
* await populateResourceItems(trx);
|
|
27
|
+
* await populateContentItems(trx);
|
|
28
|
+
* await populateResourceRefEdges(trx);
|
|
29
|
+
* });
|
|
30
|
+
*/
|
|
31
|
+
export declare function populateResourceRefEdges(trx: Knex): Promise<void>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Populates `resource_ref_edges` from `resources-referrers`
|
|
3
|
+
* (issue #193).
|
|
4
|
+
*
|
|
5
|
+
* The transformation is a **direct SQL `INSERT ... SELECT`** — no ref
|
|
6
|
+
* lookups, no per-row JS work. Legacy `resources-referrers` already
|
|
7
|
+
* enforces `UNIQUE(resourceId, pageId)` (see `init-schema.ts`), so every
|
|
8
|
+
* source row maps 1:1 to a distinct `resource_ref_edges` PK; every
|
|
9
|
+
* `count` starts at `1` because the legacy shape observed each
|
|
10
|
+
* (resource, page) pair exactly once.
|
|
11
|
+
*
|
|
12
|
+
* `INSERT OR IGNORE` on the `(resource_id, page_id)` PK is redundant
|
|
13
|
+
* with the legacy unique constraint on the source but present anyway to
|
|
14
|
+
* make partial-failure re-runs safe.
|
|
15
|
+
*
|
|
16
|
+
* The PKs on both `resource_items.id` and `content_items.id` were
|
|
17
|
+
* preserved from `resources.id` / `pages.id`, so no per-row translation
|
|
18
|
+
* is required — the FKs `resource_items(id)` and `content_items(id)`
|
|
19
|
+
* declared in `resource_ref_edges` are already satisfied for every
|
|
20
|
+
* source row by `populateContentItems` / `populateResourceItems`, which
|
|
21
|
+
* run before this function in `populateEntityTables`.
|
|
22
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
23
|
+
* @example
|
|
24
|
+
* await knex.transaction(async (trx) => {
|
|
25
|
+
* await populateResourceItems(trx);
|
|
26
|
+
* await populateContentItems(trx);
|
|
27
|
+
* await populateResourceRefEdges(trx);
|
|
28
|
+
* });
|
|
29
|
+
*/
|
|
30
|
+
export async function populateResourceRefEdges(trx) {
|
|
31
|
+
await trx.raw(`INSERT OR IGNORE INTO resource_ref_edges (resource_id, page_id, count)
|
|
32
|
+
SELECT resourceId, pageId, 1 FROM "resources-referrers"`);
|
|
33
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { BlobRefIdMap } from './types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Batch-resolves `blob_refs.id` for a set of large data-URI values
|
|
5
|
+
* (issue #193).
|
|
6
|
+
*
|
|
7
|
+
* The routing rule matches {@link ../populate-ref-tables/populate-blob-refs.ts}:
|
|
8
|
+
* only `data:` URIs longer than {@link DATA_URI_URL_REFS_LIMIT} bytes
|
|
9
|
+
* land in `blob_refs`; smaller data URIs (and every regular URL) live
|
|
10
|
+
* in `url_refs` instead. Callers pass URL-column values verbatim; this
|
|
11
|
+
* function filters out anything that does not match the routing rule
|
|
12
|
+
* before hashing.
|
|
13
|
+
*
|
|
14
|
+
* Malformed data URIs that fail {@link ../populate-ref-tables/decode-data-uri.ts}
|
|
15
|
+
* are skipped silently — `populateBlobRefs` also skipped them (with a
|
|
16
|
+
* warning), so no matching row exists to resolve.
|
|
17
|
+
*
|
|
18
|
+
* Duplicate values in `values` are deduped internally so an image whose
|
|
19
|
+
* `src` and `currentSrc` share the same data URI only counts once.
|
|
20
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
21
|
+
* @param values - Iterable of raw URL-column values that may or may not
|
|
22
|
+
* be large data URIs.
|
|
23
|
+
* @returns Map keyed by the raw URI string; missing entries indicate
|
|
24
|
+
* the value is not stored in `blob_refs` (either not a data URI at
|
|
25
|
+
* all, below the size threshold, malformed, or absent from the
|
|
26
|
+
* dictionary).
|
|
27
|
+
* @example
|
|
28
|
+
* const idMap = await resolveBlobRefs(trx, [longDataUri, 'https://…']);
|
|
29
|
+
* const blobId = idMap.get(longDataUri); // number | undefined
|
|
30
|
+
*/
|
|
31
|
+
export declare function resolveBlobRefs(trx: Knex, values: Iterable<string>): Promise<BlobRefIdMap>;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { computeContentHash } from '../populate-ref-tables/compute-content-hash.js';
|
|
2
|
+
import { DATA_URI_URL_REFS_LIMIT } from '../populate-ref-tables/data-uri-url-refs-limit.js';
|
|
3
|
+
import { decodeDataUri } from '../populate-ref-tables/decode-data-uri.js';
|
|
4
|
+
/**
|
|
5
|
+
* Rows sent per `SELECT ... WHERE hash IN (?, ...)` chunk. `blob_refs`
|
|
6
|
+
* cardinality is tiny in the reference archive (≈ 429 rows) so 200 per
|
|
7
|
+
* chunk covers most realistic uses in a single query.
|
|
8
|
+
*/
|
|
9
|
+
const LOOKUP_CHUNK_SIZE = 200;
|
|
10
|
+
/**
|
|
11
|
+
* Batch-resolves `blob_refs.id` for a set of large data-URI values
|
|
12
|
+
* (issue #193).
|
|
13
|
+
*
|
|
14
|
+
* The routing rule matches {@link ../populate-ref-tables/populate-blob-refs.ts}:
|
|
15
|
+
* only `data:` URIs longer than {@link DATA_URI_URL_REFS_LIMIT} bytes
|
|
16
|
+
* land in `blob_refs`; smaller data URIs (and every regular URL) live
|
|
17
|
+
* in `url_refs` instead. Callers pass URL-column values verbatim; this
|
|
18
|
+
* function filters out anything that does not match the routing rule
|
|
19
|
+
* before hashing.
|
|
20
|
+
*
|
|
21
|
+
* Malformed data URIs that fail {@link ../populate-ref-tables/decode-data-uri.ts}
|
|
22
|
+
* are skipped silently — `populateBlobRefs` also skipped them (with a
|
|
23
|
+
* warning), so no matching row exists to resolve.
|
|
24
|
+
*
|
|
25
|
+
* Duplicate values in `values` are deduped internally so an image whose
|
|
26
|
+
* `src` and `currentSrc` share the same data URI only counts once.
|
|
27
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
28
|
+
* @param values - Iterable of raw URL-column values that may or may not
|
|
29
|
+
* be large data URIs.
|
|
30
|
+
* @returns Map keyed by the raw URI string; missing entries indicate
|
|
31
|
+
* the value is not stored in `blob_refs` (either not a data URI at
|
|
32
|
+
* all, below the size threshold, malformed, or absent from the
|
|
33
|
+
* dictionary).
|
|
34
|
+
* @example
|
|
35
|
+
* const idMap = await resolveBlobRefs(trx, [longDataUri, 'https://…']);
|
|
36
|
+
* const blobId = idMap.get(longDataUri); // number | undefined
|
|
37
|
+
*/
|
|
38
|
+
export async function resolveBlobRefs(trx, values) {
|
|
39
|
+
const distinct = new Set();
|
|
40
|
+
for (const value of values) {
|
|
41
|
+
if (typeof value !== 'string' || value === '') {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (value.length <= DATA_URI_URL_REFS_LIMIT || !value.startsWith('data:')) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
distinct.add(value);
|
|
48
|
+
}
|
|
49
|
+
if (distinct.size === 0) {
|
|
50
|
+
return new Map();
|
|
51
|
+
}
|
|
52
|
+
const rawValues = [...distinct];
|
|
53
|
+
const hashByValue = new Map();
|
|
54
|
+
// `hashHexToValues` maps `hex(hash) → [raw URI strings that decoded to
|
|
55
|
+
// those bytes]`. Two distinct raw data-URI strings can decode to the
|
|
56
|
+
// same payload bytes (e.g. `data:image/png;base64,XXXX…` and
|
|
57
|
+
// `data:image/svg+xml;base64,XXXX…` when the underlying base64 is
|
|
58
|
+
// identical). `populateBlobRefs` dedups them into one row keyed by the
|
|
59
|
+
// payload hash, so both raw URIs must resolve to that shared id — a
|
|
60
|
+
// last-wins Map keyed by hash would drop the earlier variant, and
|
|
61
|
+
// downstream `image_items` writes would lose the blob reference.
|
|
62
|
+
const hashHexToValues = new Map();
|
|
63
|
+
for (const value of rawValues) {
|
|
64
|
+
const decoded = decodeDataUri(value);
|
|
65
|
+
if (decoded === null) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const hash = computeContentHash(decoded.bytes);
|
|
69
|
+
hashByValue.set(value, hash);
|
|
70
|
+
const hex = hash.toString('hex');
|
|
71
|
+
const bucket = hashHexToValues.get(hex);
|
|
72
|
+
if (bucket === undefined) {
|
|
73
|
+
hashHexToValues.set(hex, [value]);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
bucket.push(value);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (hashByValue.size === 0) {
|
|
80
|
+
return new Map();
|
|
81
|
+
}
|
|
82
|
+
const hashes = [...hashByValue.values()];
|
|
83
|
+
const result = new Map();
|
|
84
|
+
for (let index = 0; index < hashes.length; index += LOOKUP_CHUNK_SIZE) {
|
|
85
|
+
const chunkHashes = hashes.slice(index, index + LOOKUP_CHUNK_SIZE);
|
|
86
|
+
const rows = await trx('blob_refs')
|
|
87
|
+
.select('id', 'hash')
|
|
88
|
+
.whereIn('hash', chunkHashes);
|
|
89
|
+
for (const row of rows) {
|
|
90
|
+
const hex = Buffer.from(row.hash).toString('hex');
|
|
91
|
+
const values = hashHexToValues.get(hex);
|
|
92
|
+
if (values !== undefined) {
|
|
93
|
+
for (const value of values) {
|
|
94
|
+
result.set(value, row.id);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ContentTypeRefIdMap } from './types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Loads the entire `content_type_refs` dictionary into an in-process map
|
|
5
|
+
* keyed by the raw wire value (issue #193).
|
|
6
|
+
*
|
|
7
|
+
* Content-type cardinality is small in practice — the reference archive
|
|
8
|
+
* carries ≈ 400 distinct raw values across `pages` + `resources`, so
|
|
9
|
+
* loading everything into a `Map` costs ≈ 40 KB and eliminates every
|
|
10
|
+
* per-chunk round-trip. This is the same trade-off {@link
|
|
11
|
+
* ../populate-ref-tables/populate-header-tables.ts} makes for `header_name_refs`.
|
|
12
|
+
*
|
|
13
|
+
* Callers should invoke this once at the start of a 0.13 populate
|
|
14
|
+
* step (e.g. `populateContentItems`, `populateResourceItems`) and reuse
|
|
15
|
+
* the map for every chunk.
|
|
16
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
17
|
+
* @returns Map keyed by `content_type_refs.raw`.
|
|
18
|
+
* @example
|
|
19
|
+
* const contentTypeIds = await loadContentTypeRefs(trx);
|
|
20
|
+
* const id = contentTypeIds.get('text/html; charset=utf-8'); // number | undefined
|
|
21
|
+
*/
|
|
22
|
+
export declare function loadContentTypeRefs(trx: Knex): Promise<ContentTypeRefIdMap>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loads the entire `content_type_refs` dictionary into an in-process map
|
|
3
|
+
* keyed by the raw wire value (issue #193).
|
|
4
|
+
*
|
|
5
|
+
* Content-type cardinality is small in practice — the reference archive
|
|
6
|
+
* carries ≈ 400 distinct raw values across `pages` + `resources`, so
|
|
7
|
+
* loading everything into a `Map` costs ≈ 40 KB and eliminates every
|
|
8
|
+
* per-chunk round-trip. This is the same trade-off {@link
|
|
9
|
+
* ../populate-ref-tables/populate-header-tables.ts} makes for `header_name_refs`.
|
|
10
|
+
*
|
|
11
|
+
* Callers should invoke this once at the start of a 0.13 populate
|
|
12
|
+
* step (e.g. `populateContentItems`, `populateResourceItems`) and reuse
|
|
13
|
+
* the map for every chunk.
|
|
14
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
15
|
+
* @returns Map keyed by `content_type_refs.raw`.
|
|
16
|
+
* @example
|
|
17
|
+
* const contentTypeIds = await loadContentTypeRefs(trx);
|
|
18
|
+
* const id = contentTypeIds.get('text/html; charset=utf-8'); // number | undefined
|
|
19
|
+
*/
|
|
20
|
+
export async function loadContentTypeRefs(trx) {
|
|
21
|
+
const rows = await trx('content_type_refs').select('id', 'raw');
|
|
22
|
+
const map = new Map();
|
|
23
|
+
for (const row of rows) {
|
|
24
|
+
map.set(row.raw, row.id);
|
|
25
|
+
}
|
|
26
|
+
return map;
|
|
27
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { HeaderSetIdMap } from './types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Batch-resolves `header_sets.id` for a set of raw `responseHeaders`
|
|
5
|
+
* JSON strings (issue #193).
|
|
6
|
+
*
|
|
7
|
+
* The lookup is a two-stage cascade:
|
|
8
|
+
*
|
|
9
|
+
* 1. **Primary lookup** by `header_sets.raw_json_hash` — SHA-256 of the
|
|
10
|
+
* raw JSON string exactly as stored on the source row. This hits when
|
|
11
|
+
* the row's JSON key ordering matches whichever ordering populated
|
|
12
|
+
* `header_sets` first for that stable-set equivalence class (see
|
|
13
|
+
* {@link ../populate-ref-tables/populate-header-tables.ts}).
|
|
14
|
+
* 2. **Fallback lookup** by `header_sets.raw_hash` for the misses — SHA-
|
|
15
|
+
* 256 of the sorted `name=value` pairs. `populate-header-tables.ts`
|
|
16
|
+
* stores exactly one `raw_json_hash` per `raw_hash` equivalence class
|
|
17
|
+
* (the first JSON variant encountered), so a second variant with
|
|
18
|
+
* identical decoded content but different key ordering never had its
|
|
19
|
+
* `raw_json_hash` persisted — but its `raw_hash` still points at the
|
|
20
|
+
* shared `header_sets` row. Without the fallback these rows would
|
|
21
|
+
* silently get `header_set_id = NULL` on `content_items` /
|
|
22
|
+
* `resource_items` and the count-based acceptance check would still
|
|
23
|
+
* pass; the fallback closes that gap.
|
|
24
|
+
*
|
|
25
|
+
* Hashes are computed in JS because SQLite has no built-in BLAKE3 /
|
|
26
|
+
* SHA-256 (see {@link ../populate-ref-tables/compute-content-hash.ts} for the
|
|
27
|
+
* algorithm choice). The `raw_hash` fallback re-decomposes each miss via
|
|
28
|
+
* {@link ../populate-ref-tables/decompose-header-set.ts} so the canonicalisation
|
|
29
|
+
* matches the one `populateHeaderTables` used at insert time.
|
|
30
|
+
*
|
|
31
|
+
* Empty / null values and the sentinel `'{}'` / `'null'` strings are
|
|
32
|
+
* skipped — those responses were decomposed to `null` by
|
|
33
|
+
* `decomposeHeaderSet` and never produced a `header_sets` row, so the
|
|
34
|
+
* caller writes `header_set_id = null` for them.
|
|
35
|
+
*
|
|
36
|
+
* Duplicate JSON strings are deduped internally so a page and a
|
|
37
|
+
* resource sharing the same raw responseHeaders JSON only contribute
|
|
38
|
+
* one lookup slot.
|
|
39
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
40
|
+
* @param rawJsonStrings - Iterable of raw responseHeaders JSON strings.
|
|
41
|
+
* @returns Map keyed by the raw JSON string; missing entries indicate
|
|
42
|
+
* no matching `header_sets` row exists (parse failure or empty set).
|
|
43
|
+
* @example
|
|
44
|
+
* const idMap = await resolveHeaderSets(trx, [
|
|
45
|
+
* '{"content-type":"text/html"}',
|
|
46
|
+
* ]);
|
|
47
|
+
* const setId = idMap.get('{"content-type":"text/html"}'); // number | undefined
|
|
48
|
+
*/
|
|
49
|
+
export declare function resolveHeaderSets(trx: Knex, rawJsonStrings: Iterable<string>): Promise<HeaderSetIdMap>;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { computeContentHash } from '../populate-ref-tables/compute-content-hash.js';
|
|
2
|
+
import { decomposeHeaderSet } from '../populate-ref-tables/decompose-header-set.js';
|
|
3
|
+
/**
|
|
4
|
+
* Rows sent per `SELECT ... WHERE raw_json_hash IN (?, ...)` chunk. Same
|
|
5
|
+
* rationale as {@link ./resolve-url-refs.ts}: 500 rows × 1 param each is
|
|
6
|
+
* well under the SQLite variable limit and gives good round-trip
|
|
7
|
+
* amortisation.
|
|
8
|
+
*/
|
|
9
|
+
const LOOKUP_CHUNK_SIZE = 500;
|
|
10
|
+
/**
|
|
11
|
+
* Batch-resolves `header_sets.id` for a set of raw `responseHeaders`
|
|
12
|
+
* JSON strings (issue #193).
|
|
13
|
+
*
|
|
14
|
+
* The lookup is a two-stage cascade:
|
|
15
|
+
*
|
|
16
|
+
* 1. **Primary lookup** by `header_sets.raw_json_hash` — SHA-256 of the
|
|
17
|
+
* raw JSON string exactly as stored on the source row. This hits when
|
|
18
|
+
* the row's JSON key ordering matches whichever ordering populated
|
|
19
|
+
* `header_sets` first for that stable-set equivalence class (see
|
|
20
|
+
* {@link ../populate-ref-tables/populate-header-tables.ts}).
|
|
21
|
+
* 2. **Fallback lookup** by `header_sets.raw_hash` for the misses — SHA-
|
|
22
|
+
* 256 of the sorted `name=value` pairs. `populate-header-tables.ts`
|
|
23
|
+
* stores exactly one `raw_json_hash` per `raw_hash` equivalence class
|
|
24
|
+
* (the first JSON variant encountered), so a second variant with
|
|
25
|
+
* identical decoded content but different key ordering never had its
|
|
26
|
+
* `raw_json_hash` persisted — but its `raw_hash` still points at the
|
|
27
|
+
* shared `header_sets` row. Without the fallback these rows would
|
|
28
|
+
* silently get `header_set_id = NULL` on `content_items` /
|
|
29
|
+
* `resource_items` and the count-based acceptance check would still
|
|
30
|
+
* pass; the fallback closes that gap.
|
|
31
|
+
*
|
|
32
|
+
* Hashes are computed in JS because SQLite has no built-in BLAKE3 /
|
|
33
|
+
* SHA-256 (see {@link ../populate-ref-tables/compute-content-hash.ts} for the
|
|
34
|
+
* algorithm choice). The `raw_hash` fallback re-decomposes each miss via
|
|
35
|
+
* {@link ../populate-ref-tables/decompose-header-set.ts} so the canonicalisation
|
|
36
|
+
* matches the one `populateHeaderTables` used at insert time.
|
|
37
|
+
*
|
|
38
|
+
* Empty / null values and the sentinel `'{}'` / `'null'` strings are
|
|
39
|
+
* skipped — those responses were decomposed to `null` by
|
|
40
|
+
* `decomposeHeaderSet` and never produced a `header_sets` row, so the
|
|
41
|
+
* caller writes `header_set_id = null` for them.
|
|
42
|
+
*
|
|
43
|
+
* Duplicate JSON strings are deduped internally so a page and a
|
|
44
|
+
* resource sharing the same raw responseHeaders JSON only contribute
|
|
45
|
+
* one lookup slot.
|
|
46
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
47
|
+
* @param rawJsonStrings - Iterable of raw responseHeaders JSON strings.
|
|
48
|
+
* @returns Map keyed by the raw JSON string; missing entries indicate
|
|
49
|
+
* no matching `header_sets` row exists (parse failure or empty set).
|
|
50
|
+
* @example
|
|
51
|
+
* const idMap = await resolveHeaderSets(trx, [
|
|
52
|
+
* '{"content-type":"text/html"}',
|
|
53
|
+
* ]);
|
|
54
|
+
* const setId = idMap.get('{"content-type":"text/html"}'); // number | undefined
|
|
55
|
+
*/
|
|
56
|
+
export async function resolveHeaderSets(trx, rawJsonStrings) {
|
|
57
|
+
const distinct = new Set();
|
|
58
|
+
for (const raw of rawJsonStrings) {
|
|
59
|
+
if (typeof raw !== 'string' || raw === '' || raw === 'null' || raw === '{}') {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
distinct.add(raw);
|
|
63
|
+
}
|
|
64
|
+
if (distinct.size === 0) {
|
|
65
|
+
return new Map();
|
|
66
|
+
}
|
|
67
|
+
const values = [...distinct];
|
|
68
|
+
const hashByValue = new Map();
|
|
69
|
+
const hashHexToValue = new Map();
|
|
70
|
+
for (const value of values) {
|
|
71
|
+
const hash = computeContentHash(value);
|
|
72
|
+
hashByValue.set(value, hash);
|
|
73
|
+
hashHexToValue.set(hash.toString('hex'), value);
|
|
74
|
+
}
|
|
75
|
+
const hashes = [...hashByValue.values()];
|
|
76
|
+
const result = new Map();
|
|
77
|
+
for (let index = 0; index < hashes.length; index += LOOKUP_CHUNK_SIZE) {
|
|
78
|
+
const chunkHashes = hashes.slice(index, index + LOOKUP_CHUNK_SIZE);
|
|
79
|
+
const rows = await trx('header_sets')
|
|
80
|
+
.select('id', 'raw_json_hash')
|
|
81
|
+
.whereIn('raw_json_hash', chunkHashes);
|
|
82
|
+
for (const row of rows) {
|
|
83
|
+
const hex = Buffer.from(row.raw_json_hash).toString('hex');
|
|
84
|
+
const value = hashHexToValue.get(hex);
|
|
85
|
+
if (value !== undefined) {
|
|
86
|
+
result.set(value, row.id);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Fallback pass: any value we could not resolve by `raw_json_hash`
|
|
91
|
+
// might still map to an existing `header_sets` row via `raw_hash`
|
|
92
|
+
// (identical decoded content, different JSON key ordering).
|
|
93
|
+
const misses = values.filter((value) => !result.has(value));
|
|
94
|
+
if (misses.length === 0) {
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
const rawHashByValue = new Map();
|
|
98
|
+
const rawHashHexToValue = new Map();
|
|
99
|
+
for (const value of misses) {
|
|
100
|
+
const decomposed = decomposeHeaderSet(value);
|
|
101
|
+
if (decomposed === null) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
rawHashByValue.set(value, decomposed.rawHash);
|
|
105
|
+
rawHashHexToValue.set(decomposed.rawHash.toString('hex'), value);
|
|
106
|
+
}
|
|
107
|
+
const rawHashes = [...rawHashByValue.values()];
|
|
108
|
+
for (let index = 0; index < rawHashes.length; index += LOOKUP_CHUNK_SIZE) {
|
|
109
|
+
const chunkHashes = rawHashes.slice(index, index + LOOKUP_CHUNK_SIZE);
|
|
110
|
+
const rows = await trx('header_sets')
|
|
111
|
+
.select('id', 'raw_hash')
|
|
112
|
+
.whereIn('raw_hash', chunkHashes);
|
|
113
|
+
for (const row of rows) {
|
|
114
|
+
const hex = Buffer.from(row.raw_hash).toString('hex');
|
|
115
|
+
const value = rawHashHexToValue.get(hex);
|
|
116
|
+
if (value !== undefined) {
|
|
117
|
+
result.set(value, row.id);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Batch-resolves `json_refs.id` for a set of raw `meta_extras` JSON
|
|
4
|
+
* strings (issue #193).
|
|
5
|
+
*
|
|
6
|
+
* The lookup goes through `json_refs.hash`, the SHA-256 hash of the raw
|
|
7
|
+
* JSON string stored by `populateJsonRefs` (see
|
|
8
|
+
* {@link ../populate-ref-tables/populate-json-refs.ts}). Hashes are computed in JS
|
|
9
|
+
* for the same reason as {@link ./resolve-header-sets.ts}: SQLite has no
|
|
10
|
+
* built-in hash function.
|
|
11
|
+
*
|
|
12
|
+
* Empty / null strings are skipped — those pages had no `meta_extras`
|
|
13
|
+
* and never produced a `json_refs` row, so the caller writes
|
|
14
|
+
* `meta_extras_json_id = null` for them.
|
|
15
|
+
*
|
|
16
|
+
* Duplicate strings in `rawJsonStrings` are deduped internally.
|
|
17
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
18
|
+
* @param rawJsonStrings - Iterable of raw `meta_extras` JSON strings.
|
|
19
|
+
* @returns Map keyed by the raw JSON string; missing entries indicate
|
|
20
|
+
* no matching `json_refs` row exists.
|
|
21
|
+
* @example
|
|
22
|
+
* const idMap = await resolveJsonRefs(trx, ['{"customField":"x"}']);
|
|
23
|
+
* const jsonId = idMap.get('{"customField":"x"}'); // number | undefined
|
|
24
|
+
*/
|
|
25
|
+
export declare function resolveJsonRefs(trx: Knex, rawJsonStrings: Iterable<string>): Promise<ReadonlyMap<string, number>>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { computeContentHash } from '../populate-ref-tables/compute-content-hash.js';
|
|
2
|
+
/**
|
|
3
|
+
* Rows sent per `SELECT ... WHERE hash IN (?, ...)` chunk. `json_refs`
|
|
4
|
+
* cardinality is bounded by the count of distinct `pages.meta_extras`
|
|
5
|
+
* JSON strings — typically low thousands on a reference archive — so
|
|
6
|
+
* 500 per chunk keeps round-trips low without straining the SQLite
|
|
7
|
+
* variable limit.
|
|
8
|
+
*/
|
|
9
|
+
const LOOKUP_CHUNK_SIZE = 500;
|
|
10
|
+
/**
|
|
11
|
+
* Batch-resolves `json_refs.id` for a set of raw `meta_extras` JSON
|
|
12
|
+
* strings (issue #193).
|
|
13
|
+
*
|
|
14
|
+
* The lookup goes through `json_refs.hash`, the SHA-256 hash of the raw
|
|
15
|
+
* JSON string stored by `populateJsonRefs` (see
|
|
16
|
+
* {@link ../populate-ref-tables/populate-json-refs.ts}). Hashes are computed in JS
|
|
17
|
+
* for the same reason as {@link ./resolve-header-sets.ts}: SQLite has no
|
|
18
|
+
* built-in hash function.
|
|
19
|
+
*
|
|
20
|
+
* Empty / null strings are skipped — those pages had no `meta_extras`
|
|
21
|
+
* and never produced a `json_refs` row, so the caller writes
|
|
22
|
+
* `meta_extras_json_id = null` for them.
|
|
23
|
+
*
|
|
24
|
+
* Duplicate strings in `rawJsonStrings` are deduped internally.
|
|
25
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
26
|
+
* @param rawJsonStrings - Iterable of raw `meta_extras` JSON strings.
|
|
27
|
+
* @returns Map keyed by the raw JSON string; missing entries indicate
|
|
28
|
+
* no matching `json_refs` row exists.
|
|
29
|
+
* @example
|
|
30
|
+
* const idMap = await resolveJsonRefs(trx, ['{"customField":"x"}']);
|
|
31
|
+
* const jsonId = idMap.get('{"customField":"x"}'); // number | undefined
|
|
32
|
+
*/
|
|
33
|
+
export async function resolveJsonRefs(trx, rawJsonStrings) {
|
|
34
|
+
const distinct = new Set();
|
|
35
|
+
for (const raw of rawJsonStrings) {
|
|
36
|
+
if (typeof raw === 'string' && raw !== '') {
|
|
37
|
+
distinct.add(raw);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (distinct.size === 0) {
|
|
41
|
+
return new Map();
|
|
42
|
+
}
|
|
43
|
+
const values = [...distinct];
|
|
44
|
+
const hashByValue = new Map();
|
|
45
|
+
const hashHexToValue = new Map();
|
|
46
|
+
for (const value of values) {
|
|
47
|
+
const hash = computeContentHash(value);
|
|
48
|
+
hashByValue.set(value, hash);
|
|
49
|
+
hashHexToValue.set(hash.toString('hex'), value);
|
|
50
|
+
}
|
|
51
|
+
const hashes = [...hashByValue.values()];
|
|
52
|
+
const result = new Map();
|
|
53
|
+
for (let index = 0; index < hashes.length; index += LOOKUP_CHUNK_SIZE) {
|
|
54
|
+
const chunkHashes = hashes.slice(index, index + LOOKUP_CHUNK_SIZE);
|
|
55
|
+
const rows = await trx('json_refs')
|
|
56
|
+
.select('id', 'hash')
|
|
57
|
+
.whereIn('hash', chunkHashes);
|
|
58
|
+
for (const row of rows) {
|
|
59
|
+
const hex = Buffer.from(row.hash).toString('hex');
|
|
60
|
+
const value = hashHexToValue.get(hex);
|
|
61
|
+
if (value !== undefined) {
|
|
62
|
+
result.set(value, row.id);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { TextRefIdMap } from './types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Batch-resolves `text_refs.id` for a set of raw text strings (issue #193).
|
|
5
|
+
*
|
|
6
|
+
* The `text_refs` UNIQUE constraint is on `(hash, text)` so lookups
|
|
7
|
+
* prefix-seek on `hash`. Each caller-supplied text is hashed in JS via
|
|
8
|
+
* {@link ../populate-ref-tables/compute-content-hash.ts} (32-byte SHA-256, matching
|
|
9
|
+
* how `populateTextRefs` inserted the rows) before the
|
|
10
|
+
* SQL query; providing the hash lets SQLite's index seek in O(log n)
|
|
11
|
+
* without a full table scan.
|
|
12
|
+
*
|
|
13
|
+
* The `(hash, text)` UNIQUE composite makes the trailing text column
|
|
14
|
+
* theoretically necessary to disambiguate the astronomically improbable
|
|
15
|
+
* hash collision — we narrow on both by including `text` in the WHERE
|
|
16
|
+
* clause, then filter the map keys by the exact text on read-back.
|
|
17
|
+
*
|
|
18
|
+
* Empty / null texts are ignored. Duplicate strings in `texts` are
|
|
19
|
+
* deduped internally.
|
|
20
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
21
|
+
* @param texts - Iterable of raw text strings to resolve.
|
|
22
|
+
* @returns Map keyed by the raw text; missing entries indicate the text
|
|
23
|
+
* is not present in `text_refs` (which should not happen after
|
|
24
|
+
* `populateTextRefs` completes but does happen mid-migration when a caller
|
|
25
|
+
* passes texts that were never inserted).
|
|
26
|
+
* @example
|
|
27
|
+
* const idMap = await resolveTextRefs(trx, ['My Page Title', 'Alt text']);
|
|
28
|
+
* const titleId = idMap.get('My Page Title'); // number | undefined
|
|
29
|
+
*/
|
|
30
|
+
export declare function resolveTextRefs(trx: Knex, texts: Iterable<string>): Promise<TextRefIdMap>;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { computeContentHash } from '../populate-ref-tables/compute-content-hash.js';
|
|
2
|
+
/**
|
|
3
|
+
* Rows sent per `SELECT ... WHERE hash IN (?, ...)` chunk. Same rationale
|
|
4
|
+
* as {@link ./resolve-url-refs.ts}: 800 rows keeps the parameter count
|
|
5
|
+
* well under the SQLite variable limit even in the worst case where every
|
|
6
|
+
* hash is bound as its own parameter.
|
|
7
|
+
*/
|
|
8
|
+
const LOOKUP_CHUNK_SIZE = 800;
|
|
9
|
+
/**
|
|
10
|
+
* Batch-resolves `text_refs.id` for a set of raw text strings (issue #193).
|
|
11
|
+
*
|
|
12
|
+
* The `text_refs` UNIQUE constraint is on `(hash, text)` so lookups
|
|
13
|
+
* prefix-seek on `hash`. Each caller-supplied text is hashed in JS via
|
|
14
|
+
* {@link ../populate-ref-tables/compute-content-hash.ts} (32-byte SHA-256, matching
|
|
15
|
+
* how `populateTextRefs` inserted the rows) before the
|
|
16
|
+
* SQL query; providing the hash lets SQLite's index seek in O(log n)
|
|
17
|
+
* without a full table scan.
|
|
18
|
+
*
|
|
19
|
+
* The `(hash, text)` UNIQUE composite makes the trailing text column
|
|
20
|
+
* theoretically necessary to disambiguate the astronomically improbable
|
|
21
|
+
* hash collision — we narrow on both by including `text` in the WHERE
|
|
22
|
+
* clause, then filter the map keys by the exact text on read-back.
|
|
23
|
+
*
|
|
24
|
+
* Empty / null texts are ignored. Duplicate strings in `texts` are
|
|
25
|
+
* deduped internally.
|
|
26
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
27
|
+
* @param texts - Iterable of raw text strings to resolve.
|
|
28
|
+
* @returns Map keyed by the raw text; missing entries indicate the text
|
|
29
|
+
* is not present in `text_refs` (which should not happen after
|
|
30
|
+
* `populateTextRefs` completes but does happen mid-migration when a caller
|
|
31
|
+
* passes texts that were never inserted).
|
|
32
|
+
* @example
|
|
33
|
+
* const idMap = await resolveTextRefs(trx, ['My Page Title', 'Alt text']);
|
|
34
|
+
* const titleId = idMap.get('My Page Title'); // number | undefined
|
|
35
|
+
*/
|
|
36
|
+
export async function resolveTextRefs(trx, texts) {
|
|
37
|
+
const distinct = new Set();
|
|
38
|
+
for (const text of texts) {
|
|
39
|
+
if (typeof text === 'string' && text !== '') {
|
|
40
|
+
distinct.add(text);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (distinct.size === 0) {
|
|
44
|
+
return new Map();
|
|
45
|
+
}
|
|
46
|
+
const values = [...distinct];
|
|
47
|
+
const hashes = values.map((text) => computeContentHash(text));
|
|
48
|
+
const result = new Map();
|
|
49
|
+
for (let index = 0; index < values.length; index += LOOKUP_CHUNK_SIZE) {
|
|
50
|
+
const chunkValues = values.slice(index, index + LOOKUP_CHUNK_SIZE);
|
|
51
|
+
const chunkHashes = hashes.slice(index, index + LOOKUP_CHUNK_SIZE);
|
|
52
|
+
const rows = await trx('text_refs')
|
|
53
|
+
.select('id', 'hash', 'text')
|
|
54
|
+
.whereIn('hash', chunkHashes)
|
|
55
|
+
.whereIn('text', chunkValues);
|
|
56
|
+
for (const row of rows) {
|
|
57
|
+
result.set(row.text, row.id);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Routes one legacy URL-shaped value to either `url_refs` or `blob_refs`
|
|
3
|
+
* per the {@link isBlobRefValue} threshold rule, looking the id up in
|
|
4
|
+
* pre-resolved maps rather than upserting (the populate steps batch-resolve
|
|
5
|
+
* every distinct value across a whole chunk before this per-row lookup —
|
|
6
|
+
* see `resolveUrlRefs` / `resolveBlobRefs`). At most one of `url` / `blob`
|
|
7
|
+
* is non-null; both may be `null` when the value is null or fails to
|
|
8
|
+
* resolve (e.g. the `blob_refs` row is missing because the data URI was
|
|
9
|
+
* malformed and skipped by `populateBlobRefs`).
|
|
10
|
+
* @param value - Raw URL-shaped column value.
|
|
11
|
+
* @param urlIds - Map of URL string → `url_refs.id`.
|
|
12
|
+
* @param blobIds - Map of data-URI string → `blob_refs.id`.
|
|
13
|
+
* @returns `{ url, blob }` pair with at most one non-null field.
|
|
14
|
+
* @example
|
|
15
|
+
* const slot = resolveUrlOrBlobFromMaps(row.src, urlIds, blobIds);
|
|
16
|
+
* // slot.url set for a regular URL, slot.blob set for a large data: URI.
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveUrlOrBlobFromMaps(value: string | null, urlIds: ReadonlyMap<string, number>, blobIds: ReadonlyMap<string, number>): {
|
|
19
|
+
url: number | null;
|
|
20
|
+
blob: number | null;
|
|
21
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { isBlobRefValue } from './is-blob-ref-value.js';
|
|
2
|
+
/**
|
|
3
|
+
* Routes one legacy URL-shaped value to either `url_refs` or `blob_refs`
|
|
4
|
+
* per the {@link isBlobRefValue} threshold rule, looking the id up in
|
|
5
|
+
* pre-resolved maps rather than upserting (the populate steps batch-resolve
|
|
6
|
+
* every distinct value across a whole chunk before this per-row lookup —
|
|
7
|
+
* see `resolveUrlRefs` / `resolveBlobRefs`). At most one of `url` / `blob`
|
|
8
|
+
* is non-null; both may be `null` when the value is null or fails to
|
|
9
|
+
* resolve (e.g. the `blob_refs` row is missing because the data URI was
|
|
10
|
+
* malformed and skipped by `populateBlobRefs`).
|
|
11
|
+
* @param value - Raw URL-shaped column value.
|
|
12
|
+
* @param urlIds - Map of URL string → `url_refs.id`.
|
|
13
|
+
* @param blobIds - Map of data-URI string → `blob_refs.id`.
|
|
14
|
+
* @returns `{ url, blob }` pair with at most one non-null field.
|
|
15
|
+
* @example
|
|
16
|
+
* const slot = resolveUrlOrBlobFromMaps(row.src, urlIds, blobIds);
|
|
17
|
+
* // slot.url set for a regular URL, slot.blob set for a large data: URI.
|
|
18
|
+
*/
|
|
19
|
+
export function resolveUrlOrBlobFromMaps(value, urlIds, blobIds) {
|
|
20
|
+
if (typeof value !== 'string' || value === '') {
|
|
21
|
+
return { url: null, blob: null };
|
|
22
|
+
}
|
|
23
|
+
if (isBlobRefValue(value)) {
|
|
24
|
+
return { url: null, blob: blobIds.get(value) ?? null };
|
|
25
|
+
}
|
|
26
|
+
return { url: urlIds.get(value) ?? null, blob: null };
|
|
27
|
+
}
|