@nitpicker/archive 0.0.0 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +106 -0
- package/lib/apply-connection-pragmas.d.ts +18 -0
- package/lib/apply-connection-pragmas.js +40 -0
- package/lib/archive-accessor.d.ts +265 -0
- package/lib/archive-accessor.js +477 -0
- package/lib/archive-lock.d.ts +45 -0
- package/lib/archive-lock.js +154 -0
- package/lib/archive.d.ts +736 -0
- package/lib/archive.js +1056 -0
- package/lib/body-hash/compute-body-hash.d.ts +32 -0
- package/lib/body-hash/compute-body-hash.js +35 -0
- package/lib/cache/clear-archive-cache-entry.d.ts +18 -0
- package/lib/cache/clear-archive-cache-entry.js +24 -0
- package/lib/cache/clear-archive-cache-root.d.ts +26 -0
- package/lib/cache/clear-archive-cache-root.js +32 -0
- package/lib/cache/compute-archive-cache-key.d.ts +39 -0
- package/lib/cache/compute-archive-cache-key.js +95 -0
- package/lib/cache/extract-archive-to-cache.d.ts +57 -0
- package/lib/cache/extract-archive-to-cache.js +326 -0
- package/lib/cache/get-archive-cache-root.d.ts +20 -0
- package/lib/cache/get-archive-cache-root.js +53 -0
- package/lib/cache/is-archive-cache-disabled.d.ts +24 -0
- package/lib/cache/is-archive-cache-disabled.js +34 -0
- package/lib/cache/list-archive-cache-entries.d.ts +23 -0
- package/lib/cache/list-archive-cache-entries.js +130 -0
- package/lib/cache/path-exists.d.ts +9 -0
- package/lib/cache/path-exists.js +18 -0
- package/lib/cache/resolve-archive-cache-dir.d.ts +26 -0
- package/lib/cache/resolve-archive-cache-dir.js +32 -0
- package/lib/cache/types.d.ts +33 -0
- package/lib/cache/types.js +1 -0
- package/lib/content-type/is-html-content-type.d.ts +17 -0
- package/lib/content-type/is-html-content-type.js +19 -0
- package/lib/content-type/normalize-content-type.d.ts +14 -0
- package/lib/content-type/normalize-content-type.js +20 -0
- package/lib/create-adjunct-tables.d.ts +66 -0
- package/lib/create-adjunct-tables.js +510 -0
- package/lib/create-entity-tables.d.ts +191 -0
- package/lib/create-entity-tables.js +387 -0
- package/lib/create-progress-reporter.d.ts +30 -0
- package/lib/create-progress-reporter.js +38 -0
- package/lib/create-ref-tables.d.ts +35 -0
- package/lib/create-ref-tables.js +185 -0
- package/lib/create-template-tables.d.ts +28 -0
- package/lib/create-template-tables.js +92 -0
- package/lib/database.d.ts +549 -0
- package/lib/database.js +804 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.d.ts +27 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.js +35 -0
- package/lib/db-ops/_shared/compress-payload.d.ts +26 -0
- package/lib/db-ops/_shared/compress-payload.js +30 -0
- package/lib/db-ops/_shared/create-write-ref-caches.d.ts +17 -0
- package/lib/db-ops/_shared/create-write-ref-caches.js +27 -0
- package/lib/db-ops/_shared/decode-json-ref.d.ts +17 -0
- package/lib/db-ops/_shared/decode-json-ref.js +31 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.d.ts +49 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.js +69 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.d.ts +20 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.js +53 -0
- package/lib/db-ops/_shared/resolve-content-item-id.d.ts +62 -0
- package/lib/db-ops/_shared/resolve-content-item-id.js +143 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.d.ts +23 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.js +29 -0
- package/lib/db-ops/_shared/retry-setting.d.ts +16 -0
- package/lib/db-ops/_shared/retry-setting.js +18 -0
- package/lib/db-ops/_shared/safe-parse-json.d.ts +11 -0
- package/lib/db-ops/_shared/safe-parse-json.js +18 -0
- package/lib/db-ops/_shared/types.d.ts +94 -0
- package/lib/db-ops/_shared/types.js +1 -0
- package/lib/db-ops/_shared/upsert-blob-ref.d.ts +25 -0
- package/lib/db-ops/_shared/upsert-blob-ref.js +48 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.d.ts +30 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.js +45 -0
- package/lib/db-ops/_shared/upsert-json-ref.d.ts +22 -0
- package/lib/db-ops/_shared/upsert-json-ref.js +41 -0
- package/lib/db-ops/_shared/upsert-response-headers.d.ts +35 -0
- package/lib/db-ops/_shared/upsert-response-headers.js +49 -0
- package/lib/db-ops/_shared/upsert-url-ref.d.ts +39 -0
- package/lib/db-ops/_shared/upsert-url-ref.js +62 -0
- package/lib/db-ops/anchors/get-anchors-on-page.d.ts +10 -0
- package/lib/db-ops/anchors/get-anchors-on-page.js +21 -0
- package/lib/db-ops/config/get-base-url.d.ts +8 -0
- package/lib/db-ops/config/get-base-url.js +14 -0
- package/lib/db-ops/config/get-config.d.ts +10 -0
- package/lib/db-ops/config/get-config.js +29 -0
- package/lib/db-ops/config/get-created-cwd.d.ts +11 -0
- package/lib/db-ops/config/get-created-cwd.js +13 -0
- package/lib/db-ops/config/get-name.d.ts +8 -0
- package/lib/db-ops/config/get-name.js +14 -0
- package/lib/db-ops/config/info-column-allowlist.d.ts +7 -0
- package/lib/db-ops/config/info-column-allowlist.js +29 -0
- package/lib/db-ops/config/info-json-columns.d.ts +5 -0
- package/lib/db-ops/config/info-json-columns.js +11 -0
- package/lib/db-ops/config/set-config.d.ts +12 -0
- package/lib/db-ops/config/set-config.js +21 -0
- package/lib/db-ops/config/update-config.d.ts +17 -0
- package/lib/db-ops/config/update-config.js +36 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.d.ts +19 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.js +30 -0
- package/lib/db-ops/console-logs/replace-console-logs.d.ts +34 -0
- package/lib/db-ops/console-logs/replace-console-logs.js +123 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.d.ts +16 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.js +26 -0
- package/lib/db-ops/console-logs/types.d.ts +38 -0
- package/lib/db-ops/console-logs/types.js +1 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.d.ts +29 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.js +52 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.d.ts +18 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.js +23 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.d.ts +12 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.js +15 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.d.ts +14 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.js +30 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.d.ts +57 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.js +87 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.d.ts +21 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.js +27 -0
- package/lib/db-ops/errors/insert-crawl-error.d.ts +15 -0
- package/lib/db-ops/errors/insert-crawl-error.js +21 -0
- package/lib/db-ops/errors/insert-page-error.d.ts +21 -0
- package/lib/db-ops/errors/insert-page-error.js +30 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.d.ts +33 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.js +158 -0
- package/lib/db-ops/html/read-page-html-blob.d.ts +17 -0
- package/lib/db-ops/html/read-page-html-blob.js +20 -0
- package/lib/db-ops/lifecycle/checkpoint.d.ts +8 -0
- package/lib/db-ops/lifecycle/checkpoint.js +9 -0
- package/lib/db-ops/lifecycle/destroy.d.ts +6 -0
- package/lib/db-ops/lifecycle/destroy.js +7 -0
- package/lib/db-ops/lifecycle/init.d.ts +58 -0
- package/lib/db-ops/lifecycle/init.js +122 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.d.ts +22 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.js +41 -0
- package/lib/db-ops/meta/get-audios-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-audios-of-page.js +15 -0
- package/lib/db-ops/meta/get-buttons-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-buttons-of-page.js +15 -0
- package/lib/db-ops/meta/get-canvases-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-canvases-of-page.js +15 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.js +15 -0
- package/lib/db-ops/meta/get-headings-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-headings-of-page.js +15 -0
- package/lib/db-ops/meta/get-iframes-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-iframes-of-page.js +15 -0
- package/lib/db-ops/meta/get-jsonld-of-page.d.ts +13 -0
- package/lib/db-ops/meta/get-jsonld-of-page.js +27 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.js +15 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.js +15 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.js +15 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.js +15 -0
- package/lib/db-ops/meta/get-videos-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-videos-of-page.js +15 -0
- package/lib/db-ops/outages/close-network-outage.d.ts +12 -0
- package/lib/db-ops/outages/close-network-outage.js +15 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.d.ts +26 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.js +42 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.d.ts +26 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.js +31 -0
- package/lib/db-ops/outages/insert-network-outage.d.ts +14 -0
- package/lib/db-ops/outages/insert-network-outage.js +29 -0
- package/lib/db-ops/outages/list-network-outages.d.ts +28 -0
- package/lib/db-ops/outages/list-network-outages.js +42 -0
- package/lib/db-ops/pages/order/set-url-order.d.ts +13 -0
- package/lib/db-ops/pages/order/set-url-order.js +38 -0
- package/lib/db-ops/pages/read/build-page-query.d.ts +18 -0
- package/lib/db-ops/pages/read/build-page-query.js +40 -0
- package/lib/db-ops/pages/read/get-crawling-state.d.ts +117 -0
- package/lib/db-ops/pages/read/get-crawling-state.js +161 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.d.ts +15 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.js +30 -0
- package/lib/db-ops/pages/read/get-page-count.d.ts +12 -0
- package/lib/db-ops/pages/read/get-page-count.js +21 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.d.ts +24 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.js +28 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.d.ts +38 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.js +107 -0
- package/lib/db-ops/pages/read/get-pages.d.ts +11 -0
- package/lib/db-ops/pages/read/get-pages.js +51 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.d.ts +18 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.js +25 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.d.ts +31 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.js +32 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.d.ts +20 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.js +37 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.d.ts +30 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.js +91 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.d.ts +88 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.js +216 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.d.ts +80 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.js +151 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.d.ts +24 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.js +24 -0
- package/lib/db-ops/pages/write/insert-audios.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-audios.js +25 -0
- package/lib/db-ops/pages/write/insert-buttons.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-buttons.js +29 -0
- package/lib/db-ops/pages/write/insert-canvases.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-canvases.js +26 -0
- package/lib/db-ops/pages/write/insert-custom-elements.d.ts +27 -0
- package/lib/db-ops/pages/write/insert-custom-elements.js +40 -0
- package/lib/db-ops/pages/write/insert-headings.d.ts +15 -0
- package/lib/db-ops/pages/write/insert-headings.js +27 -0
- package/lib/db-ops/pages/write/insert-iframes.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-iframes.js +28 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.d.ts +38 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.js +60 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.d.ts +36 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.js +48 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.d.ts +42 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.js +56 -0
- package/lib/db-ops/pages/write/insert-jsonld.d.ts +17 -0
- package/lib/db-ops/pages/write/insert-jsonld.js +49 -0
- package/lib/db-ops/pages/write/insert-main-content-images.d.ts +20 -0
- package/lib/db-ops/pages/write/insert-main-content-images.js +32 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.js +29 -0
- package/lib/db-ops/pages/write/insert-page.d.ts +56 -0
- package/lib/db-ops/pages/write/insert-page.js +259 -0
- package/lib/db-ops/pages/write/insert-technologies.d.ts +25 -0
- package/lib/db-ops/pages/write/insert-technologies.js +45 -0
- package/lib/db-ops/pages/write/insert-videos.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-videos.js +28 -0
- package/lib/db-ops/pages/write/link-redirect-sources.d.ts +42 -0
- package/lib/db-ops/pages/write/link-redirect-sources.js +101 -0
- package/lib/db-ops/pages/write/record-redirect.d.ts +35 -0
- package/lib/db-ops/pages/write/record-redirect.js +100 -0
- package/lib/db-ops/pages/write/set-skipped-page.d.ts +13 -0
- package/lib/db-ops/pages/write/set-skipped-page.js +24 -0
- package/lib/db-ops/pages/write/update-page.d.ts +40 -0
- package/lib/db-ops/pages/write/update-page.js +419 -0
- package/lib/db-ops/pages/write/write-page-html-blob.d.ts +19 -0
- package/lib/db-ops/pages/write/write-page-html-blob.js +41 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.d.ts +9 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.js +15 -0
- package/lib/db-ops/referrers/get-referrers-of-page.d.ts +17 -0
- package/lib/db-ops/referrers/get-referrers-of-page.js +32 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.d.ts +8 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.js +15 -0
- package/lib/db-ops/resources/build-resource-query.d.ts +25 -0
- package/lib/db-ops/resources/build-resource-query.js +29 -0
- package/lib/db-ops/resources/get-existing-resource-urls.d.ts +9 -0
- package/lib/db-ops/resources/get-existing-resource-urls.js +24 -0
- package/lib/db-ops/resources/get-resource-by-url.d.ts +13 -0
- package/lib/db-ops/resources/get-resource-by-url.js +22 -0
- package/lib/db-ops/resources/get-resource-url-list.d.ts +17 -0
- package/lib/db-ops/resources/get-resource-url-list.js +26 -0
- package/lib/db-ops/resources/get-resources.d.ts +8 -0
- package/lib/db-ops/resources/get-resources.js +11 -0
- package/lib/db-ops/resources/insert-inventory-resources.d.ts +24 -0
- package/lib/db-ops/resources/insert-inventory-resources.js +64 -0
- package/lib/db-ops/resources/insert-resource-referrers.d.ts +15 -0
- package/lib/db-ops/resources/insert-resource-referrers.js +54 -0
- package/lib/db-ops/resources/insert-resource.d.ts +34 -0
- package/lib/db-ops/resources/insert-resource.js +73 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.d.ts +26 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.js +30 -0
- package/lib/db-ops/templates/assign-template-labels.d.ts +60 -0
- package/lib/db-ops/templates/assign-template-labels.js +187 -0
- package/lib/db-ops/templates/replace-page-templates.d.ts +44 -0
- package/lib/db-ops/templates/replace-page-templates.js +174 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.d.ts +16 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.js +17 -0
- package/lib/db-ops/templates/types.d.ts +103 -0
- package/lib/db-ops/templates/types.js +1 -0
- package/lib/debug.d.ts +8 -0
- package/lib/debug.js +9 -0
- package/lib/decode-html-blob.d.ts +20 -0
- package/lib/decode-html-blob.js +23 -0
- package/lib/decode-page-html-blob-bytes.d.ts +25 -0
- package/lib/decode-page-html-blob-bytes.js +29 -0
- package/lib/decode-stored-blob-bytes.d.ts +25 -0
- package/lib/decode-stored-blob-bytes.js +47 -0
- package/lib/derive-lineage-from-parent.d.ts +37 -0
- package/lib/derive-lineage-from-parent.js +42 -0
- package/lib/drop-legacy-tables.d.ts +45 -0
- package/lib/drop-legacy-tables.js +56 -0
- package/lib/error-kind/classify-error-kind.d.ts +20 -0
- package/lib/error-kind/classify-error-kind.js +136 -0
- package/lib/error-kind/network-related-error-kinds.d.ts +23 -0
- package/lib/error-kind/network-related-error-kinds.js +28 -0
- package/lib/error-kind/permanent-error-kinds.d.ts +48 -0
- package/lib/error-kind/permanent-error-kinds.js +54 -0
- package/lib/error-kind/types.d.ts +54 -0
- package/lib/error-kind/types.js +1 -0
- package/lib/filesystem/append-text.d.ts +9 -0
- package/lib/filesystem/append-text.js +14 -0
- package/lib/filesystem/copy-dir-sync.d.ts +6 -0
- package/lib/filesystem/copy-dir-sync.js +9 -0
- package/lib/filesystem/copy-dir.d.ts +7 -0
- package/lib/filesystem/copy-dir.js +13 -0
- package/lib/filesystem/copy-file-with-progress.d.ts +20 -0
- package/lib/filesystem/copy-file-with-progress.js +34 -0
- package/lib/filesystem/exists.d.ts +6 -0
- package/lib/filesystem/exists.js +9 -0
- package/lib/filesystem/get-file-list.d.ts +8 -0
- package/lib/filesystem/get-file-list.js +12 -0
- package/lib/filesystem/is-dir.d.ts +6 -0
- package/lib/filesystem/is-dir.js +10 -0
- package/lib/filesystem/mkdir.d.ts +8 -0
- package/lib/filesystem/mkdir.js +15 -0
- package/lib/filesystem/output-binary.d.ts +12 -0
- package/lib/filesystem/output-binary.js +17 -0
- package/lib/filesystem/output-json.d.ts +9 -0
- package/lib/filesystem/output-json.js +14 -0
- package/lib/filesystem/output-text.d.ts +11 -0
- package/lib/filesystem/output-text.js +32 -0
- package/lib/filesystem/parse-pax-path.d.ts +18 -0
- package/lib/filesystem/parse-pax-path.js +47 -0
- package/lib/filesystem/parse-tar-size-field.d.ts +13 -0
- package/lib/filesystem/parse-tar-size-field.js +40 -0
- package/lib/filesystem/peek-tar-top-dir.d.ts +35 -0
- package/lib/filesystem/peek-tar-top-dir.js +215 -0
- package/lib/filesystem/read-json.d.ts +7 -0
- package/lib/filesystem/read-json.js +11 -0
- package/lib/filesystem/read-text.d.ts +6 -0
- package/lib/filesystem/read-text.js +10 -0
- package/lib/filesystem/readline.d.ts +11 -0
- package/lib/filesystem/readline.js +26 -0
- package/lib/filesystem/remove.d.ts +5 -0
- package/lib/filesystem/remove.js +10 -0
- package/lib/filesystem/rename.d.ts +16 -0
- package/lib/filesystem/rename.js +48 -0
- package/lib/filesystem/tar.d.ts +23 -0
- package/lib/filesystem/tar.js +78 -0
- package/lib/filesystem/untar.d.ts +33 -0
- package/lib/filesystem/untar.js +84 -0
- package/lib/get-failed-page-messages.d.ts +56 -0
- package/lib/get-failed-page-messages.js +146 -0
- package/lib/get-json.d.ts +10 -0
- package/lib/get-json.js +25 -0
- package/lib/html-snapshot/match-selector-html.d.ts +25 -0
- package/lib/html-snapshot/match-selector-html.js +28 -0
- package/lib/html-snapshot/match-selector-snapshots.d.ts +33 -0
- package/lib/html-snapshot/match-selector-snapshots.js +33 -0
- package/lib/html-snapshot/search-html-document.d.ts +29 -0
- package/lib/html-snapshot/search-html-document.js +27 -0
- package/lib/html-snapshot/search-html-snapshots.d.ts +36 -0
- package/lib/html-snapshot/search-html-snapshots.js +35 -0
- package/lib/html-snapshot/types.d.ts +111 -0
- package/lib/html-snapshot/types.js +7 -0
- package/lib/html-snapshot/validate-search-pattern.d.ts +15 -0
- package/lib/html-snapshot/validate-search-pattern.js +17 -0
- package/lib/init-schema.d.ts +48 -0
- package/lib/init-schema.js +124 -0
- package/lib/is-inventory-source.d.ts +21 -0
- package/lib/is-inventory-source.js +22 -0
- package/lib/is-within-outage-window.d.ts +49 -0
- package/lib/is-within-outage-window.js +33 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.d.ts +24 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.js +26 -0
- package/lib/libsql-dialect.d.ts +115 -0
- package/lib/libsql-dialect.js +116 -0
- package/lib/limited-page-ids.d.ts +9 -0
- package/lib/limited-page-ids.js +18 -0
- package/lib/meta/assert-compatible-version.d.ts +60 -0
- package/lib/meta/assert-compatible-version.js +93 -0
- package/lib/meta/classify-jsonld-type.d.ts +23 -0
- package/lib/meta/classify-jsonld-type.js +43 -0
- package/lib/meta/compare-semver.d.ts +23 -0
- package/lib/meta/compare-semver.js +51 -0
- package/lib/meta/compute-main-contents-denormalized.d.ts +41 -0
- package/lib/meta/compute-main-contents-denormalized.js +88 -0
- package/lib/meta/compute-page-denormalized.d.ts +20 -0
- package/lib/meta/compute-page-denormalized.js +35 -0
- package/lib/meta/derive-flat-from-meta.d.ts +34 -0
- package/lib/meta/derive-flat-from-meta.js +158 -0
- package/lib/meta/derive-meta-extras.d.ts +20 -0
- package/lib/meta/derive-meta-extras.js +23 -0
- package/lib/meta/extract-tags-for-archive.d.ts +17 -0
- package/lib/meta/extract-tags-for-archive.js +36 -0
- package/lib/meta/parse-main-content-class-list.d.ts +19 -0
- package/lib/meta/parse-main-content-class-list.js +34 -0
- package/lib/meta/summarize-jsonld.d.ts +17 -0
- package/lib/meta/summarize-jsonld.js +29 -0
- package/lib/meta/technologies/combine-technology-confidence.d.ts +46 -0
- package/lib/meta/technologies/combine-technology-confidence.js +93 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.d.ts +45 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.js +53 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.d.ts +33 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.js +46 -0
- package/lib/meta/technologies/extract-technologies-for-archive.d.ts +33 -0
- package/lib/meta/technologies/extract-technologies-for-archive.js +30 -0
- package/lib/meta/technologies/match-js-license-comment-signal.d.ts +21 -0
- package/lib/meta/technologies/match-js-license-comment-signal.js +23 -0
- package/lib/meta/technologies/match-structural-technology-signals.d.ts +26 -0
- package/lib/meta/technologies/match-structural-technology-signals.js +48 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.d.ts +25 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.js +35 -0
- package/lib/meta/technologies/technology-signal-definitions.d.ts +44 -0
- package/lib/meta/technologies/technology-signal-definitions.js +60 -0
- package/lib/meta/technologies/types.d.ts +70 -0
- package/lib/meta/technologies/types.js +13 -0
- package/lib/meta/types.d.ts +1490 -0
- package/lib/meta/types.js +65 -0
- package/lib/migrate-content-items-alias-of-id.d.ts +52 -0
- package/lib/migrate-content-items-alias-of-id.js +69 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.d.ts +46 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.js +62 -0
- package/lib/migrate-content-items-is-metadata-only.d.ts +44 -0
- package/lib/migrate-content-items-is-metadata-only.js +60 -0
- package/lib/migrate-entity-tables.d.ts +55 -0
- package/lib/migrate-entity-tables.js +66 -0
- package/lib/migrate-info-created-cwd.d.ts +17 -0
- package/lib/migrate-info-created-cwd.js +36 -0
- package/lib/migrate-info-main-content-selector.d.ts +16 -0
- package/lib/migrate-info-main-content-selector.js +35 -0
- package/lib/migrate-info-request-header-names.d.ts +16 -0
- package/lib/migrate-info-request-header-names.js +35 -0
- package/lib/migrate-info-roots.d.ts +20 -0
- package/lib/migrate-info-roots.js +52 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.d.ts +34 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.js +51 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.d.ts +25 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.js +44 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.d.ts +16 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.js +35 -0
- package/lib/migrate-main-contents-columns.d.ts +26 -0
- package/lib/migrate-main-contents-columns.js +61 -0
- package/lib/migrate-page-meta-body-hash.d.ts +44 -0
- package/lib/migrate-page-meta-body-hash.js +63 -0
- package/lib/migrate-page-meta-console-error-count.d.ts +27 -0
- package/lib/migrate-page-meta-console-error-count.js +45 -0
- package/lib/migrate-page-meta-custom-element-count.d.ts +33 -0
- package/lib/migrate-page-meta-custom-element-count.js +51 -0
- package/lib/migrate-page-meta-image-scan.d.ts +27 -0
- package/lib/migrate-page-meta-image-scan.js +52 -0
- package/lib/migrate-page-tags-to-page-technologies.d.ts +39 -0
- package/lib/migrate-page-tags-to-page-technologies.js +79 -0
- package/lib/migrate-ref-tables.d.ts +25 -0
- package/lib/migrate-ref-tables.js +38 -0
- package/lib/native-executor/check-native-executor-config.d.ts +17 -0
- package/lib/native-executor/check-native-executor-config.js +20 -0
- package/lib/page-meta-column-maps.d.ts +32 -0
- package/lib/page-meta-column-maps.js +43 -0
- package/lib/page.d.ts +546 -0
- package/lib/page.js +764 -0
- package/lib/peek-archive-lock.d.ts +40 -0
- package/lib/peek-archive-lock.js +62 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.d.ts +41 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.js +87 -0
- package/lib/populate-entity-tables/derive-dom-path.d.ts +35 -0
- package/lib/populate-entity-tables/derive-dom-path.js +72 -0
- package/lib/populate-entity-tables/is-blob-ref-value.d.ts +16 -0
- package/lib/populate-entity-tables/is-blob-ref-value.js +19 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.d.ts +66 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.js +96 -0
- package/lib/populate-entity-tables/populate-anchor-edges.d.ts +33 -0
- package/lib/populate-entity-tables/populate-anchor-edges.js +153 -0
- package/lib/populate-entity-tables/populate-content-items.d.ts +40 -0
- package/lib/populate-entity-tables/populate-content-items.js +141 -0
- package/lib/populate-entity-tables/populate-entities.d.ts +81 -0
- package/lib/populate-entity-tables/populate-entities.js +110 -0
- package/lib/populate-entity-tables/populate-image-items.d.ts +91 -0
- package/lib/populate-entity-tables/populate-image-items.js +226 -0
- package/lib/populate-entity-tables/populate-page-meta.d.ts +33 -0
- package/lib/populate-entity-tables/populate-page-meta.js +267 -0
- package/lib/populate-entity-tables/populate-resource-items.d.ts +22 -0
- package/lib/populate-entity-tables/populate-resource-items.js +114 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.d.ts +31 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.js +33 -0
- package/lib/populate-entity-tables/resolve-blob-refs.d.ts +31 -0
- package/lib/populate-entity-tables/resolve-blob-refs.js +100 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.d.ts +22 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.js +27 -0
- package/lib/populate-entity-tables/resolve-header-sets.d.ts +49 -0
- package/lib/populate-entity-tables/resolve-header-sets.js +122 -0
- package/lib/populate-entity-tables/resolve-json-refs.d.ts +25 -0
- package/lib/populate-entity-tables/resolve-json-refs.js +67 -0
- package/lib/populate-entity-tables/resolve-text-refs.d.ts +30 -0
- package/lib/populate-entity-tables/resolve-text-refs.js +61 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.d.ts +21 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.js +27 -0
- package/lib/populate-entity-tables/resolve-url-refs.d.ts +33 -0
- package/lib/populate-entity-tables/resolve-url-refs.js +60 -0
- package/lib/populate-entity-tables/test-utils/count-rows.d.ts +17 -0
- package/lib/populate-entity-tables/test-utils/count-rows.js +20 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.d.ts +25 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.js +42 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.d.ts +30 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.js +175 -0
- package/lib/populate-entity-tables/types.d.ts +157 -0
- package/lib/populate-entity-tables/types.js +12 -0
- package/lib/populate-entity-tables/upsert-text-refs.d.ts +38 -0
- package/lib/populate-entity-tables/upsert-text-refs.js +78 -0
- package/lib/populate-ref-tables/classify-content-type.d.ts +16 -0
- package/lib/populate-ref-tables/classify-content-type.js +52 -0
- package/lib/populate-ref-tables/compute-content-hash.d.ts +22 -0
- package/lib/populate-ref-tables/compute-content-hash.js +26 -0
- package/lib/populate-ref-tables/compute-header-flags.d.ts +16 -0
- package/lib/populate-ref-tables/compute-header-flags.js +70 -0
- package/lib/populate-ref-tables/content-type-rules.d.ts +38 -0
- package/lib/populate-ref-tables/content-type-rules.js +133 -0
- package/lib/populate-ref-tables/create-header-table-caches.d.ts +25 -0
- package/lib/populate-ref-tables/create-header-table-caches.js +49 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.d.ts +15 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.js +15 -0
- package/lib/populate-ref-tables/decode-data-uri.d.ts +21 -0
- package/lib/populate-ref-tables/decode-data-uri.js +126 -0
- package/lib/populate-ref-tables/decompose-header-set.d.ts +29 -0
- package/lib/populate-ref-tables/decompose-header-set.js +157 -0
- package/lib/populate-ref-tables/decompose-url.d.ts +25 -0
- package/lib/populate-ref-tables/decompose-url.js +70 -0
- package/lib/populate-ref-tables/header-stability.d.ts +19 -0
- package/lib/populate-ref-tables/header-stability.js +22 -0
- package/lib/populate-ref-tables/header-value-cache-key.d.ts +17 -0
- package/lib/populate-ref-tables/header-value-cache-key.js +19 -0
- package/lib/populate-ref-tables/normalize-mime.d.ts +24 -0
- package/lib/populate-ref-tables/normalize-mime.js +36 -0
- package/lib/populate-ref-tables/populate-blob-refs.d.ts +38 -0
- package/lib/populate-ref-tables/populate-blob-refs.js +134 -0
- package/lib/populate-ref-tables/populate-content-type-refs.d.ts +27 -0
- package/lib/populate-ref-tables/populate-content-type-refs.js +70 -0
- package/lib/populate-ref-tables/populate-header-tables.d.ts +35 -0
- package/lib/populate-ref-tables/populate-header-tables.js +80 -0
- package/lib/populate-ref-tables/populate-json-refs.d.ts +29 -0
- package/lib/populate-ref-tables/populate-json-refs.js +101 -0
- package/lib/populate-ref-tables/populate-refs.d.ts +51 -0
- package/lib/populate-ref-tables/populate-refs.js +62 -0
- package/lib/populate-ref-tables/populate-text-refs.d.ts +32 -0
- package/lib/populate-ref-tables/populate-text-refs.js +133 -0
- package/lib/populate-ref-tables/populate-url-refs.d.ts +28 -0
- package/lib/populate-ref-tables/populate-url-refs.js +148 -0
- package/lib/populate-ref-tables/test-utils/count-rows.d.ts +15 -0
- package/lib/populate-ref-tables/test-utils/count-rows.js +17 -0
- package/lib/populate-ref-tables/types.d.ts +197 -0
- package/lib/populate-ref-tables/types.js +7 -0
- package/lib/populate-ref-tables/upsert-one-header-set.d.ts +34 -0
- package/lib/populate-ref-tables/upsert-one-header-set.js +208 -0
- package/lib/populate-ref-tables/volatile-header-names.d.ts +20 -0
- package/lib/populate-ref-tables/volatile-header-names.js +33 -0
- package/lib/redirect-table.d.ts +9 -0
- package/lib/redirect-table.js +28 -0
- package/lib/release-finished-statements.d.ts +42 -0
- package/lib/release-finished-statements.js +45 -0
- package/lib/resolve-redirect-chain.d.ts +33 -0
- package/lib/resolve-redirect-chain.js +27 -0
- package/lib/resource.d.ts +46 -0
- package/lib/resource.js +62 -0
- package/lib/retarget-legacy-fk-tables.d.ts +61 -0
- package/lib/retarget-legacy-fk-tables.js +137 -0
- package/lib/safe-path.d.ts +9 -0
- package/lib/safe-path.js +17 -0
- package/lib/scope/build-scope-map.d.ts +21 -0
- package/lib/scope/build-scope-map.js +32 -0
- package/lib/scope/find-scope-entry.d.ts +25 -0
- package/lib/scope/find-scope-entry.js +45 -0
- package/lib/template-classification/classify-archive-page-templates.d.ts +42 -0
- package/lib/template-classification/classify-archive-page-templates.js +70 -0
- package/lib/template-classification/classify-page-templates.d.ts +33 -0
- package/lib/template-classification/classify-page-templates.js +60 -0
- package/lib/template-classification/collect-page-ids-with-html.d.ts +24 -0
- package/lib/template-classification/collect-page-ids-with-html.js +30 -0
- package/lib/template-classification/collect-page-stylesheet-urls.d.ts +32 -0
- package/lib/template-classification/collect-page-stylesheet-urls.js +130 -0
- package/lib/template-classification/create-content-root-hint.d.ts +41 -0
- package/lib/template-classification/create-content-root-hint.js +51 -0
- package/lib/template-classification/create-page-cluster-factory.d.ts +36 -0
- package/lib/template-classification/create-page-cluster-factory.js +52 -0
- package/lib/template-classification/load-page-cluster-candidates.d.ts +32 -0
- package/lib/template-classification/load-page-cluster-candidates.js +93 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.d.ts +34 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.js +236 -0
- package/lib/template-classification/page-cluster/types.d.ts +123 -0
- package/lib/template-classification/page-cluster/types.js +1 -0
- package/lib/template-classification/types.d.ts +234 -0
- package/lib/template-classification/types.js +1 -0
- package/lib/test-utils/build-full-schema-test-db.d.ts +34 -0
- package/lib/test-utils/build-full-schema-test-db.js +74 -0
- package/lib/test-utils/create-legacy-analysis-tables.d.ts +13 -0
- package/lib/test-utils/create-legacy-analysis-tables.js +37 -0
- package/lib/test-utils/fk-parent-tables.d.ts +15 -0
- package/lib/test-utils/fk-parent-tables.js +19 -0
- package/lib/test-utils/seed-content-item.d.ts +35 -0
- package/lib/test-utils/seed-content-item.js +42 -0
- package/lib/test-utils/setup-legacy-fk-db.d.ts +34 -0
- package/lib/test-utils/setup-legacy-fk-db.js +271 -0
- package/lib/transfer/attach-source-database.d.ts +31 -0
- package/lib/transfer/attach-source-database.js +40 -0
- package/lib/transfer/build-split-config.d.ts +30 -0
- package/lib/transfer/build-split-config.js +42 -0
- package/lib/transfer/clear-replaced-page-rows.d.ts +23 -0
- package/lib/transfer/clear-replaced-page-rows.js +61 -0
- package/lib/transfer/concat-archives.d.ts +55 -0
- package/lib/transfer/concat-archives.js +95 -0
- package/lib/transfer/concat-source-transfer-phases.d.ts +10 -0
- package/lib/transfer/concat-source-transfer-phases.js +17 -0
- package/lib/transfer/content-item-rank-sql.d.ts +21 -0
- package/lib/transfer/content-item-rank-sql.js +23 -0
- package/lib/transfer/copy-anchor-edges.d.ts +28 -0
- package/lib/transfer/copy-anchor-edges.js +42 -0
- package/lib/transfer/copy-dictionaries-for-concat.d.ts +39 -0
- package/lib/transfer/copy-dictionaries-for-concat.js +81 -0
- package/lib/transfer/copy-dictionaries-for-split.d.ts +29 -0
- package/lib/transfer/copy-dictionaries-for-split.js +224 -0
- package/lib/transfer/copy-header-set-children.d.ts +27 -0
- package/lib/transfer/copy-header-set-children.js +51 -0
- package/lib/transfer/copy-image-items.d.ts +21 -0
- package/lib/transfer/copy-image-items.js +62 -0
- package/lib/transfer/copy-inventory-source-lists.d.ts +30 -0
- package/lib/transfer/copy-inventory-source-lists.js +61 -0
- package/lib/transfer/copy-journal-tables.d.ts +30 -0
- package/lib/transfer/copy-journal-tables.js +56 -0
- package/lib/transfer/copy-page-console-logs.d.ts +16 -0
- package/lib/transfer/copy-page-console-logs.js +27 -0
- package/lib/transfer/copy-page-html-blobs.d.ts +31 -0
- package/lib/transfer/copy-page-html-blobs.js +43 -0
- package/lib/transfer/copy-page-meta.d.ts +27 -0
- package/lib/transfer/copy-page-meta.js +68 -0
- package/lib/transfer/copy-page-template-clusters.d.ts +31 -0
- package/lib/transfer/copy-page-template-clusters.js +56 -0
- package/lib/transfer/copy-page-template-labels.d.ts +34 -0
- package/lib/transfer/copy-page-template-labels.js +88 -0
- package/lib/transfer/copy-resource-items.d.ts +29 -0
- package/lib/transfer/copy-resource-items.js +89 -0
- package/lib/transfer/copy-resource-ref-edges.d.ts +20 -0
- package/lib/transfer/copy-resource-ref-edges.js +33 -0
- package/lib/transfer/copy-simple-page-scoped-tables.d.ts +15 -0
- package/lib/transfer/copy-simple-page-scoped-tables.js +34 -0
- package/lib/transfer/count-external-pages-in-scope.d.ts +26 -0
- package/lib/transfer/count-external-pages-in-scope.js +40 -0
- package/lib/transfer/create-transfer-temp-tables.d.ts +30 -0
- package/lib/transfer/create-transfer-temp-tables.js +59 -0
- package/lib/transfer/dictionary-copy-specs.d.ts +32 -0
- package/lib/transfer/dictionary-copy-specs.js +28 -0
- package/lib/transfer/drop-transfer-temp-tables.d.ts +9 -0
- package/lib/transfer/drop-transfer-temp-tables.js +18 -0
- package/lib/transfer/flatten-redirect-chains.d.ts +44 -0
- package/lib/transfer/flatten-redirect-chains.js +74 -0
- package/lib/transfer/insert-content-items.d.ts +35 -0
- package/lib/transfer/insert-content-items.js +116 -0
- package/lib/transfer/list-transfer-columns.d.ts +35 -0
- package/lib/transfer/list-transfer-columns.js +45 -0
- package/lib/transfer/mark-in-scope-content-items.d.ts +31 -0
- package/lib/transfer/mark-in-scope-content-items.js +54 -0
- package/lib/transfer/merge-archive-configs.d.ts +51 -0
- package/lib/transfer/merge-archive-configs.js +85 -0
- package/lib/transfer/plan-content-items-for-concat.d.ts +33 -0
- package/lib/transfer/plan-content-items-for-concat.js +51 -0
- package/lib/transfer/plan-content-items-for-split.d.ts +42 -0
- package/lib/transfer/plan-content-items-for-split.js +83 -0
- package/lib/transfer/plan-resource-items.d.ts +40 -0
- package/lib/transfer/plan-resource-items.js +69 -0
- package/lib/transfer/quote-transfer-identifier.d.ts +18 -0
- package/lib/transfer/quote-transfer-identifier.js +20 -0
- package/lib/transfer/reclassify-resource-externality.d.ts +37 -0
- package/lib/transfer/reclassify-resource-externality.js +66 -0
- package/lib/transfer/remap-redirect-dest-ids.d.ts +34 -0
- package/lib/transfer/remap-redirect-dest-ids.js +51 -0
- package/lib/transfer/replace-content-items.d.ts +39 -0
- package/lib/transfer/replace-content-items.js +83 -0
- package/lib/transfer/simple-page-scoped-tables.d.ts +25 -0
- package/lib/transfer/simple-page-scoped-tables.js +38 -0
- package/lib/transfer/split-archive.d.ts +55 -0
- package/lib/transfer/split-archive.js +98 -0
- package/lib/transfer/split-source-transfer-phases.d.ts +11 -0
- package/lib/transfer/split-source-transfer-phases.js +18 -0
- package/lib/transfer/transfer-action.d.ts +34 -0
- package/lib/transfer/transfer-action.js +32 -0
- package/lib/transfer/transfer-archive-rows.d.ts +65 -0
- package/lib/transfer/transfer-archive-rows.js +156 -0
- package/lib/transfer/transfer-dictionary-tables.d.ts +12 -0
- package/lib/transfer/transfer-dictionary-tables.js +22 -0
- package/lib/transfer/transfer-post-phases.d.ts +10 -0
- package/lib/transfer/transfer-post-phases.js +13 -0
- package/lib/transfer/transfer-source-alias.d.ts +9 -0
- package/lib/transfer/transfer-source-alias.js +9 -0
- package/lib/transfer/types.d.ts +111 -0
- package/lib/transfer/types.js +35 -0
- package/lib/types.d.ts +772 -0
- package/lib/types.js +1 -0
- package/lib/url-alias/compute-tier-a-alias-key.d.ts +44 -0
- package/lib/url-alias/compute-tier-a-alias-key.js +47 -0
- package/lib/url-alias/compute-tier-b-alias-key.d.ts +23 -0
- package/lib/url-alias/compute-tier-b-alias-key.js +26 -0
- package/lib/url-alias/group-alias-candidates.d.ts +27 -0
- package/lib/url-alias/group-alias-candidates.js +29 -0
- package/lib/url-alias/types.d.ts +12 -0
- package/lib/url-alias/types.js +1 -0
- package/lib/url-pattern/compute-shape-key.d.ts +58 -0
- package/lib/url-pattern/compute-shape-key.js +129 -0
- package/lib/url-pattern/decompose-url.d.ts +33 -0
- package/lib/url-pattern/decompose-url.js +79 -0
- package/lib/url-pattern/reconstruct-url.d.ts +15 -0
- package/lib/url-pattern/reconstruct-url.js +33 -0
- package/lib/url-sort/compute-url-sort-ranks.d.ts +30 -0
- package/lib/url-sort/compute-url-sort-ranks.js +33 -0
- package/lib/utils/array/each-splitted.d.ts +10 -0
- package/lib/utils/array/each-splitted.js +14 -0
- package/lib/utils/debug.d.ts +8 -0
- package/lib/utils/debug.js +8 -0
- package/lib/utils/error/emit-error-with-retry.d.ts +40 -0
- package/lib/utils/error/emit-error-with-retry.js +44 -0
- package/lib/utils/error/emit-error.d.ts +39 -0
- package/lib/utils/error/emit-error.js +41 -0
- package/lib/utils/object/parse-response-headers.d.ts +12 -0
- package/lib/utils/object/parse-response-headers.js +26 -0
- package/lib/utils/object/redact-request-headers.d.ts +15 -0
- package/lib/utils/object/redact-request-headers.js +27 -0
- package/lib/utils/types/types.d.ts +383 -0
- package/lib/utils/types/types.js +1 -0
- package/lib/verify-migration/capture-rejection.d.ts +24 -0
- package/lib/verify-migration/capture-rejection.js +31 -0
- package/lib/verify-migration/check-anchor-edges-count.d.ts +34 -0
- package/lib/verify-migration/check-anchor-edges-count.js +72 -0
- package/lib/verify-migration/check-anchor-edges-sum.d.ts +13 -0
- package/lib/verify-migration/check-anchor-edges-sum.js +27 -0
- package/lib/verify-migration/check-content-items-count.d.ts +16 -0
- package/lib/verify-migration/check-content-items-count.js +30 -0
- package/lib/verify-migration/check-content-type-preservation.d.ts +22 -0
- package/lib/verify-migration/check-content-type-preservation.js +40 -0
- package/lib/verify-migration/check-foreign-key-integrity.d.ts +31 -0
- package/lib/verify-migration/check-foreign-key-integrity.js +47 -0
- package/lib/verify-migration/check-image-items-count.d.ts +12 -0
- package/lib/verify-migration/check-image-items-count.js +26 -0
- package/lib/verify-migration/check-page-meta-count.d.ts +15 -0
- package/lib/verify-migration/check-page-meta-count.js +31 -0
- package/lib/verify-migration/check-reader-parity.d.ts +23 -0
- package/lib/verify-migration/check-reader-parity.js +182 -0
- package/lib/verify-migration/check-resource-items-count.d.ts +17 -0
- package/lib/verify-migration/check-resource-items-count.js +33 -0
- package/lib/verify-migration/check-url-round-trip.d.ts +43 -0
- package/lib/verify-migration/check-url-round-trip.js +112 -0
- package/lib/verify-migration/types.d.ts +70 -0
- package/lib/verify-migration/types.js +63 -0
- package/lib/verify-migration/verify-migration.d.ts +41 -0
- package/lib/verify-migration/verify-migration.js +120 -0
- package/lib/with-bulk-write-pragmas.d.ts +51 -0
- package/lib/with-bulk-write-pragmas.js +132 -0
- package/lib/write-queue.d.ts +32 -0
- package/lib/write-queue.js +55 -0
- package/package.json +350 -3
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { WriteRefCaches } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Empties every map in a {@link WriteRefCaches} bundle in place.
|
|
4
|
+
*
|
|
5
|
+
* Called when a write transaction that used the caches rolls back. SQLite
|
|
6
|
+
* `ROLLBACK` undoes every row the transaction inserted, but `AUTOINCREMENT`
|
|
7
|
+
* counters never rewind — so an id cached optimistically during the failed
|
|
8
|
+
* attempt would survive the rollback and no longer correspond to any row.
|
|
9
|
+
* A retried attempt reusing that id would issue `UPDATE ... WHERE id = ?`
|
|
10
|
+
* against a nonexistent row and silently affect zero rows instead of
|
|
11
|
+
* failing loudly.
|
|
12
|
+
*
|
|
13
|
+
* A full clear (rather than tracking which entries the failed transaction
|
|
14
|
+
* touched) is the simplest correct fix: transient write failures are rare
|
|
15
|
+
* (retry exists precisely because they are), so paying a one-time
|
|
16
|
+
* DB-again warm-up after a rollback is cheap next to the correctness risk
|
|
17
|
+
* of a partially-poisoned cache.
|
|
18
|
+
* @param caches - The cache bundle to clear.
|
|
19
|
+
* @example
|
|
20
|
+
* try {
|
|
21
|
+
* await knex.transaction(async (trx) => { ... });
|
|
22
|
+
* } catch (error) {
|
|
23
|
+
* clearWriteRefCaches(caches);
|
|
24
|
+
* throw error;
|
|
25
|
+
* }
|
|
26
|
+
*/
|
|
27
|
+
export declare function clearWriteRefCaches(caches: WriteRefCaches): void;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Empties every map in a {@link WriteRefCaches} bundle in place.
|
|
3
|
+
*
|
|
4
|
+
* Called when a write transaction that used the caches rolls back. SQLite
|
|
5
|
+
* `ROLLBACK` undoes every row the transaction inserted, but `AUTOINCREMENT`
|
|
6
|
+
* counters never rewind — so an id cached optimistically during the failed
|
|
7
|
+
* attempt would survive the rollback and no longer correspond to any row.
|
|
8
|
+
* A retried attempt reusing that id would issue `UPDATE ... WHERE id = ?`
|
|
9
|
+
* against a nonexistent row and silently affect zero rows instead of
|
|
10
|
+
* failing loudly.
|
|
11
|
+
*
|
|
12
|
+
* A full clear (rather than tracking which entries the failed transaction
|
|
13
|
+
* touched) is the simplest correct fix: transient write failures are rare
|
|
14
|
+
* (retry exists precisely because they are), so paying a one-time
|
|
15
|
+
* DB-again warm-up after a rollback is cheap next to the correctness risk
|
|
16
|
+
* of a partially-poisoned cache.
|
|
17
|
+
* @param caches - The cache bundle to clear.
|
|
18
|
+
* @example
|
|
19
|
+
* try {
|
|
20
|
+
* await knex.transaction(async (trx) => { ... });
|
|
21
|
+
* } catch (error) {
|
|
22
|
+
* clearWriteRefCaches(caches);
|
|
23
|
+
* throw error;
|
|
24
|
+
* }
|
|
25
|
+
*/
|
|
26
|
+
export function clearWriteRefCaches(caches) {
|
|
27
|
+
caches.urlIds.clear();
|
|
28
|
+
caches.contentItems.clear();
|
|
29
|
+
caches.resourceIds.clear();
|
|
30
|
+
caches.contentTypeIds.clear();
|
|
31
|
+
caches.jsonIds.clear();
|
|
32
|
+
caches.blobIds.clear();
|
|
33
|
+
caches.consoleLogIds.clear();
|
|
34
|
+
caches.headers = null;
|
|
35
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compresses raw bytes for storage in a `codec`/`size_raw`/`size_stored`
|
|
3
|
+
* BLOB column, matching the read side of
|
|
4
|
+
* {@link import('./decode-json-ref.js').decodeJsonRef} and
|
|
5
|
+
* {@link import('../../decode-html-blob.js').decodeStoredBlob}.
|
|
6
|
+
*
|
|
7
|
+
* The one shared primitive behind every `codec: 'zstd'` writer in the
|
|
8
|
+
* archive (`upsert-json-ref.ts`, `write-page-html-blob.ts`,
|
|
9
|
+
* `replace-page-templates.ts`) — a codec change (e.g. a brotli fallback, a
|
|
10
|
+
* different zstd level) only has to happen here. Callers that also need a
|
|
11
|
+
* content hash (`upsert-json-ref.ts`, `write-page-html-blob.ts`) compute it
|
|
12
|
+
* themselves from the same `rawBytes` they pass in here, rather than this
|
|
13
|
+
* function computing one not every caller needs.
|
|
14
|
+
* @param rawBytes - The raw (uncompressed) payload bytes.
|
|
15
|
+
* @returns The compressed body alongside the codec and size bookkeeping the
|
|
16
|
+
* BLOB column's schema expects.
|
|
17
|
+
* @example
|
|
18
|
+
* const rawBytes = Buffer.from(JSON.stringify(reason), 'utf8');
|
|
19
|
+
* const { body, codec, sizeRaw, sizeStored } = compressPayload(rawBytes);
|
|
20
|
+
*/
|
|
21
|
+
export declare function compressPayload(rawBytes: Buffer): {
|
|
22
|
+
readonly body: Buffer;
|
|
23
|
+
readonly codec: 'zstd';
|
|
24
|
+
readonly sizeRaw: number;
|
|
25
|
+
readonly sizeStored: number;
|
|
26
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { zstdCompressSync } from 'node:zlib';
|
|
2
|
+
/**
|
|
3
|
+
* Compresses raw bytes for storage in a `codec`/`size_raw`/`size_stored`
|
|
4
|
+
* BLOB column, matching the read side of
|
|
5
|
+
* {@link import('./decode-json-ref.js').decodeJsonRef} and
|
|
6
|
+
* {@link import('../../decode-html-blob.js').decodeStoredBlob}.
|
|
7
|
+
*
|
|
8
|
+
* The one shared primitive behind every `codec: 'zstd'` writer in the
|
|
9
|
+
* archive (`upsert-json-ref.ts`, `write-page-html-blob.ts`,
|
|
10
|
+
* `replace-page-templates.ts`) — a codec change (e.g. a brotli fallback, a
|
|
11
|
+
* different zstd level) only has to happen here. Callers that also need a
|
|
12
|
+
* content hash (`upsert-json-ref.ts`, `write-page-html-blob.ts`) compute it
|
|
13
|
+
* themselves from the same `rawBytes` they pass in here, rather than this
|
|
14
|
+
* function computing one not every caller needs.
|
|
15
|
+
* @param rawBytes - The raw (uncompressed) payload bytes.
|
|
16
|
+
* @returns The compressed body alongside the codec and size bookkeeping the
|
|
17
|
+
* BLOB column's schema expects.
|
|
18
|
+
* @example
|
|
19
|
+
* const rawBytes = Buffer.from(JSON.stringify(reason), 'utf8');
|
|
20
|
+
* const { body, codec, sizeRaw, sizeStored } = compressPayload(rawBytes);
|
|
21
|
+
*/
|
|
22
|
+
export function compressPayload(rawBytes) {
|
|
23
|
+
const compressed = zstdCompressSync(rawBytes);
|
|
24
|
+
return {
|
|
25
|
+
body: compressed,
|
|
26
|
+
codec: 'zstd',
|
|
27
|
+
sizeRaw: rawBytes.byteLength,
|
|
28
|
+
sizeStored: compressed.byteLength,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { WriteRefCaches } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Creates an empty {@link WriteRefCaches} bundle for one archive writer
|
|
4
|
+
* connection.
|
|
5
|
+
*
|
|
6
|
+
* All maps start empty and fill lazily as the write path touches URLs,
|
|
7
|
+
* content types, JSON payloads, and data-URI blobs. The header caches
|
|
8
|
+
* (`headers`) start as `null` and are warmed from the DB by the first
|
|
9
|
+
* header-set upsert — see {@link ./types.ts} for the cache-correctness
|
|
10
|
+
* argument (append-only ref tables + single writer connection).
|
|
11
|
+
* @returns A fresh cache bundle. One per `Database` instance; never share
|
|
12
|
+
* across connections.
|
|
13
|
+
* @example
|
|
14
|
+
* const caches = createWriteRefCaches();
|
|
15
|
+
* const urlId = await upsertUrlRef(knex, caches, 'https://example.com/');
|
|
16
|
+
*/
|
|
17
|
+
export declare function createWriteRefCaches(): WriteRefCaches;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates an empty {@link WriteRefCaches} bundle for one archive writer
|
|
3
|
+
* connection.
|
|
4
|
+
*
|
|
5
|
+
* All maps start empty and fill lazily as the write path touches URLs,
|
|
6
|
+
* content types, JSON payloads, and data-URI blobs. The header caches
|
|
7
|
+
* (`headers`) start as `null` and are warmed from the DB by the first
|
|
8
|
+
* header-set upsert — see {@link ./types.ts} for the cache-correctness
|
|
9
|
+
* argument (append-only ref tables + single writer connection).
|
|
10
|
+
* @returns A fresh cache bundle. One per `Database` instance; never share
|
|
11
|
+
* across connections.
|
|
12
|
+
* @example
|
|
13
|
+
* const caches = createWriteRefCaches();
|
|
14
|
+
* const urlId = await upsertUrlRef(knex, caches, 'https://example.com/');
|
|
15
|
+
*/
|
|
16
|
+
export function createWriteRefCaches() {
|
|
17
|
+
return {
|
|
18
|
+
urlIds: new Map(),
|
|
19
|
+
contentItems: new Map(),
|
|
20
|
+
resourceIds: new Map(),
|
|
21
|
+
contentTypeIds: new Map(),
|
|
22
|
+
jsonIds: new Map(),
|
|
23
|
+
blobIds: new Map(),
|
|
24
|
+
consoleLogIds: new Map(),
|
|
25
|
+
headers: null,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decodes one `json_refs` payload back into its JSON string.
|
|
3
|
+
*
|
|
4
|
+
* The write path (`upsert-json-ref.ts`) and the archive-migration
|
|
5
|
+
* populate (`populate-json-refs.ts`) both store bodies zstd-compressed;
|
|
6
|
+
* the `'none'` codec is accepted because the `json_refs.codec` column
|
|
7
|
+
* permits it, not because either writer currently produces it. Corrupt
|
|
8
|
+
* bodies fail closed to `null` rather than throwing — readers treat an
|
|
9
|
+
* undecodable payload the same as an absent one.
|
|
10
|
+
* @param body - The raw `json_refs.json_text` body, or null when absent.
|
|
11
|
+
* @param codec - The `json_refs.codec` value, or null when absent.
|
|
12
|
+
* @returns The decoded JSON string, or null when there is no body or the
|
|
13
|
+
* body cannot be decoded.
|
|
14
|
+
* @example
|
|
15
|
+
* const metaExtras = decodeJsonRef(row.extras_body, row.extras_codec);
|
|
16
|
+
*/
|
|
17
|
+
export declare function decodeJsonRef(body: Buffer | string | null, codec: 'zstd' | 'none' | null): string | null;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { zstdDecompressSync } from 'node:zlib';
|
|
2
|
+
/**
|
|
3
|
+
* Decodes one `json_refs` payload back into its JSON string.
|
|
4
|
+
*
|
|
5
|
+
* The write path (`upsert-json-ref.ts`) and the archive-migration
|
|
6
|
+
* populate (`populate-json-refs.ts`) both store bodies zstd-compressed;
|
|
7
|
+
* the `'none'` codec is accepted because the `json_refs.codec` column
|
|
8
|
+
* permits it, not because either writer currently produces it. Corrupt
|
|
9
|
+
* bodies fail closed to `null` rather than throwing — readers treat an
|
|
10
|
+
* undecodable payload the same as an absent one.
|
|
11
|
+
* @param body - The raw `json_refs.json_text` body, or null when absent.
|
|
12
|
+
* @param codec - The `json_refs.codec` value, or null when absent.
|
|
13
|
+
* @returns The decoded JSON string, or null when there is no body or the
|
|
14
|
+
* body cannot be decoded.
|
|
15
|
+
* @example
|
|
16
|
+
* const metaExtras = decodeJsonRef(row.extras_body, row.extras_codec);
|
|
17
|
+
*/
|
|
18
|
+
export function decodeJsonRef(body, codec) {
|
|
19
|
+
if (body == null) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
if (codec === 'zstd') {
|
|
24
|
+
return zstdDecompressSync(body).toString('utf8');
|
|
25
|
+
}
|
|
26
|
+
return typeof body === 'string' ? body : body.toString('utf8');
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Reads every row a caller-supplied query matches, in ascending-`id`
|
|
4
|
+
* keyset-paginated chunks rather than one unbounded SELECT (issue #294): on
|
|
5
|
+
* a large archive, a single multi-second-to-minutes scan gives the caller
|
|
6
|
+
* no way to report progress mid-read. The accumulated result is identical
|
|
7
|
+
* to a single un-chunked SELECT — chunking exists purely to make the scan
|
|
8
|
+
* observable, not to bound memory (the mapped output is already fully
|
|
9
|
+
* materialised for the caller either way).
|
|
10
|
+
*
|
|
11
|
+
* Extracted from `getResourceUrlList` / `listDedupeCapObservations`, which
|
|
12
|
+
* had grown byte-for-byte identical pagination boilerplate (the `MAX(id)`
|
|
13
|
+
* probe, the `for (;;)` chunk loop, the `onProgress` shape) around two
|
|
14
|
+
* otherwise-unrelated queries. Callers own everything query-shaped
|
|
15
|
+
* (joins, `WHERE`, `SELECT`, chunk size via `.limit()` inside
|
|
16
|
+
* `buildQuery`) — this helper only owns the keyset-chunking mechanics
|
|
17
|
+
* common to both.
|
|
18
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
19
|
+
* @param idTable - The table `id` keys off, used for the O(1) `MAX(id)`
|
|
20
|
+
* probe that seeds `onProgress`'s total (only queried when `onProgress`
|
|
21
|
+
* is given).
|
|
22
|
+
* @param buildQuery - Builds one chunk's query given the last-seen `id`
|
|
23
|
+
* (`0` on the first call). Must filter on `id > lastId`, order by `id`
|
|
24
|
+
* ascending, and cap the row count (typically via `.limit()`) — this
|
|
25
|
+
* helper does not add any of those clauses itself. The resolved rows
|
|
26
|
+
* must each carry an `id` field so the next chunk's cursor can advance.
|
|
27
|
+
* @param mapRow - Transforms one raw row into the caller's output shape.
|
|
28
|
+
* @param onProgress - Called after each chunk, with the highest `id`
|
|
29
|
+
* scanned so far and the max `id` in `idTable`. Omit for no reporting.
|
|
30
|
+
* @returns Every matched row, mapped via `mapRow`, in `id` order.
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* const urls = await keysetPaginateById(
|
|
34
|
+
* knex,
|
|
35
|
+
* 'resource_items',
|
|
36
|
+
* (lastId) =>
|
|
37
|
+
* knex('resource_items')
|
|
38
|
+
* .join('url_refs', 'url_refs.id', 'resource_items.url_id')
|
|
39
|
+
* .where('resource_items.id', '>', lastId)
|
|
40
|
+
* .orderBy('resource_items.id', 'asc')
|
|
41
|
+
* .limit(2000)
|
|
42
|
+
* .select('resource_items.id as id', 'url_refs.url as url'),
|
|
43
|
+
* (row) => row.url,
|
|
44
|
+
* );
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare function keysetPaginateById<Row extends {
|
|
48
|
+
id: number;
|
|
49
|
+
}, Out>(knex: Knex, idTable: string, buildQuery: (lastId: number) => Knex.QueryBuilder, mapRow: (row: Row) => Out, onProgress?: (scannedUpToId: number, maxId: number) => void): Promise<Out[]>;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads every row a caller-supplied query matches, in ascending-`id`
|
|
3
|
+
* keyset-paginated chunks rather than one unbounded SELECT (issue #294): on
|
|
4
|
+
* a large archive, a single multi-second-to-minutes scan gives the caller
|
|
5
|
+
* no way to report progress mid-read. The accumulated result is identical
|
|
6
|
+
* to a single un-chunked SELECT — chunking exists purely to make the scan
|
|
7
|
+
* observable, not to bound memory (the mapped output is already fully
|
|
8
|
+
* materialised for the caller either way).
|
|
9
|
+
*
|
|
10
|
+
* Extracted from `getResourceUrlList` / `listDedupeCapObservations`, which
|
|
11
|
+
* had grown byte-for-byte identical pagination boilerplate (the `MAX(id)`
|
|
12
|
+
* probe, the `for (;;)` chunk loop, the `onProgress` shape) around two
|
|
13
|
+
* otherwise-unrelated queries. Callers own everything query-shaped
|
|
14
|
+
* (joins, `WHERE`, `SELECT`, chunk size via `.limit()` inside
|
|
15
|
+
* `buildQuery`) — this helper only owns the keyset-chunking mechanics
|
|
16
|
+
* common to both.
|
|
17
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
18
|
+
* @param idTable - The table `id` keys off, used for the O(1) `MAX(id)`
|
|
19
|
+
* probe that seeds `onProgress`'s total (only queried when `onProgress`
|
|
20
|
+
* is given).
|
|
21
|
+
* @param buildQuery - Builds one chunk's query given the last-seen `id`
|
|
22
|
+
* (`0` on the first call). Must filter on `id > lastId`, order by `id`
|
|
23
|
+
* ascending, and cap the row count (typically via `.limit()`) — this
|
|
24
|
+
* helper does not add any of those clauses itself. The resolved rows
|
|
25
|
+
* must each carry an `id` field so the next chunk's cursor can advance.
|
|
26
|
+
* @param mapRow - Transforms one raw row into the caller's output shape.
|
|
27
|
+
* @param onProgress - Called after each chunk, with the highest `id`
|
|
28
|
+
* scanned so far and the max `id` in `idTable`. Omit for no reporting.
|
|
29
|
+
* @returns Every matched row, mapped via `mapRow`, in `id` order.
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* const urls = await keysetPaginateById(
|
|
33
|
+
* knex,
|
|
34
|
+
* 'resource_items',
|
|
35
|
+
* (lastId) =>
|
|
36
|
+
* knex('resource_items')
|
|
37
|
+
* .join('url_refs', 'url_refs.id', 'resource_items.url_id')
|
|
38
|
+
* .where('resource_items.id', '>', lastId)
|
|
39
|
+
* .orderBy('resource_items.id', 'asc')
|
|
40
|
+
* .limit(2000)
|
|
41
|
+
* .select('resource_items.id as id', 'url_refs.url as url'),
|
|
42
|
+
* (row) => row.url,
|
|
43
|
+
* );
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export async function keysetPaginateById(knex, idTable, buildQuery, mapRow, onProgress) {
|
|
47
|
+
// MAX() over the keyset column is an O(1) index-tail read; only fetched
|
|
48
|
+
// when someone is listening.
|
|
49
|
+
let maxId = 0;
|
|
50
|
+
if (onProgress) {
|
|
51
|
+
const [maxRow] = await knex(idTable).max({ max: 'id' });
|
|
52
|
+
maxId = maxRow?.max ?? 0;
|
|
53
|
+
}
|
|
54
|
+
const results = [];
|
|
55
|
+
let lastId = 0;
|
|
56
|
+
for (;;) {
|
|
57
|
+
const rows = (await buildQuery(lastId));
|
|
58
|
+
if (rows.length === 0) {
|
|
59
|
+
onProgress?.(maxId, maxId);
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
lastId = rows.at(-1).id;
|
|
63
|
+
for (const row of rows) {
|
|
64
|
+
results.push(mapRow(row));
|
|
65
|
+
}
|
|
66
|
+
onProgress?.(Math.min(lastId, maxId), maxId);
|
|
67
|
+
}
|
|
68
|
+
return results;
|
|
69
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Loads and merges the response headers for every given `header_sets.id`
|
|
4
|
+
* back into flat `Record<name, value>` objects, in one chunked batch
|
|
5
|
+
* (never one query per row).
|
|
6
|
+
*
|
|
7
|
+
* Multi-value headers (repeated `Set-Cookie` etc.) are joined with
|
|
8
|
+
* `', '` in `occurrence` order within each name — the flat-record shape
|
|
9
|
+
* the pre-0.13 `responseHeaders` JSON column stored, which every reader
|
|
10
|
+
* of the reconstructed rows still expects.
|
|
11
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
12
|
+
* @param headerSetIds - Distinct `header_sets.id` values to load. Empty
|
|
13
|
+
* input returns an empty map without touching the DB.
|
|
14
|
+
* @returns Map from `header_sets.id` to the merged header record. Ids
|
|
15
|
+
* with no entries are absent from the map.
|
|
16
|
+
* @example
|
|
17
|
+
* const headersBySetId = await loadResponseHeadersBySetIds(knex, [1, 2]);
|
|
18
|
+
* const record = headersBySetId.get(1) ?? {};
|
|
19
|
+
*/
|
|
20
|
+
export declare function loadResponseHeadersBySetIds(knex: Knex, headerSetIds: readonly number[]): Promise<Map<number, Record<string, string>>>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ids per `WHERE header_set_id IN (?, ...)` chunk. Modern SQLite builds
|
|
3
|
+
* (including the vendored libsql) reject statements binding more than
|
|
4
|
+
* 32,766 parameters, and header sets dedupe poorly on real sites (Date /
|
|
5
|
+
* ETag / Set-Cookie make most sets unique), so an IN-list sized by the
|
|
6
|
+
* page batch without chunking would exceed the limit on large archives.
|
|
7
|
+
* 800 matches
|
|
8
|
+
* the `LOOKUP_CHUNK_SIZE` convention the populate/upsert paths already
|
|
9
|
+
* use (`resolve-text-refs.ts` and siblings).
|
|
10
|
+
*/
|
|
11
|
+
const LOOKUP_CHUNK_SIZE = 800;
|
|
12
|
+
/**
|
|
13
|
+
* Loads and merges the response headers for every given `header_sets.id`
|
|
14
|
+
* back into flat `Record<name, value>` objects, in one chunked batch
|
|
15
|
+
* (never one query per row).
|
|
16
|
+
*
|
|
17
|
+
* Multi-value headers (repeated `Set-Cookie` etc.) are joined with
|
|
18
|
+
* `', '` in `occurrence` order within each name — the flat-record shape
|
|
19
|
+
* the pre-0.13 `responseHeaders` JSON column stored, which every reader
|
|
20
|
+
* of the reconstructed rows still expects.
|
|
21
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
22
|
+
* @param headerSetIds - Distinct `header_sets.id` values to load. Empty
|
|
23
|
+
* input returns an empty map without touching the DB.
|
|
24
|
+
* @returns Map from `header_sets.id` to the merged header record. Ids
|
|
25
|
+
* with no entries are absent from the map.
|
|
26
|
+
* @example
|
|
27
|
+
* const headersBySetId = await loadResponseHeadersBySetIds(knex, [1, 2]);
|
|
28
|
+
* const record = headersBySetId.get(1) ?? {};
|
|
29
|
+
*/
|
|
30
|
+
export async function loadResponseHeadersBySetIds(knex, headerSetIds) {
|
|
31
|
+
const merged = new Map();
|
|
32
|
+
for (let index = 0; index < headerSetIds.length; index += LOOKUP_CHUNK_SIZE) {
|
|
33
|
+
const chunk = headerSetIds.slice(index, index + LOOKUP_CHUNK_SIZE);
|
|
34
|
+
const headerRows = (await knex('header_set_entries as hse')
|
|
35
|
+
.join('header_name_refs as hnr', 'hnr.id', 'hse.name_id')
|
|
36
|
+
.join('header_value_refs as hvr', 'hvr.id', 'hse.value_id')
|
|
37
|
+
.whereIn('hse.header_set_id', chunk)
|
|
38
|
+
.orderBy(['hse.header_set_id', 'hnr.name', 'hse.occurrence'])
|
|
39
|
+
.select('hse.header_set_id as headerSetId', 'hnr.name as name', 'hvr.value as value'));
|
|
40
|
+
for (const row of headerRows) {
|
|
41
|
+
const bySet = merged.get(row.headerSetId) ?? new Map();
|
|
42
|
+
const values = bySet.get(row.name) ?? [];
|
|
43
|
+
values.push(row.value);
|
|
44
|
+
bySet.set(row.name, values);
|
|
45
|
+
merged.set(row.headerSetId, bySet);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const result = new Map();
|
|
49
|
+
for (const [setId, bySet] of merged) {
|
|
50
|
+
result.set(setId, Object.fromEntries([...bySet.entries()].map(([k, v]) => [k, v.join(', ')])));
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { ResolveContentItemIdOptions, WriteRefCaches } from './types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Returns the `content_items.id` for `url`, inserting a placeholder row
|
|
5
|
+
* (via `url_refs`) when the URL is not yet known. Foundational identity
|
|
6
|
+
* primitive shared by every op that needs to record an edge or lookup to
|
|
7
|
+
* a URL — the `content_items` successor of the legacy `pages.id`
|
|
8
|
+
* resolver.
|
|
9
|
+
*
|
|
10
|
+
* **Source semantics.** `source` is written ONLY on the INSERT path —
|
|
11
|
+
* when the row already exists, the INSERT is never reached and the
|
|
12
|
+
* existing row's `source` stays untouched. This is what keeps a second
|
|
13
|
+
* `crawl --inventory` from "demoting" a page that was first labelled
|
|
14
|
+
* `'inventory-seed'` back to `'inventory-discovered'` on later passes.
|
|
15
|
+
*
|
|
16
|
+
* **Crawled-wins downgrade.** When a row that was previously labelled
|
|
17
|
+
* `'inventory-seed'` or `'inventory-discovered'` is re-encountered via a
|
|
18
|
+
* `'crawled'`-lineage anchor (the parent page is part of the graph
|
|
19
|
+
* reachable from the original crawl roots), the row is downgraded to
|
|
20
|
+
* `'crawled'`. The inventory goal is finding orphans — anything reachable
|
|
21
|
+
* from the crawled chain is NOT an orphan and should not retain an
|
|
22
|
+
* inventory label. The cached `source` is updated in the same step so a
|
|
23
|
+
* later hit does not re-issue the UPDATE.
|
|
24
|
+
*
|
|
25
|
+
* **`is_metadata_only` promotion** (issue #369) is evaluated in the same
|
|
26
|
+
* pass as the crawled-wins downgrade, and both diffs are folded into a
|
|
27
|
+
* single `UPDATE` statement (not two) when either column actually
|
|
28
|
+
* changes — see {@link applyExistingRowUpdates}.
|
|
29
|
+
*
|
|
30
|
+
* **Cache poisoning on rollback.** Entries cached inside a transaction
|
|
31
|
+
* that later rolls back would point at ids that no longer exist. Every
|
|
32
|
+
* write op that opens a multi-statement transaction around this function
|
|
33
|
+
* must discard the whole cache bundle when that transaction fails,
|
|
34
|
+
* before any retry — see the try/catch + `clearWriteRefCaches` wrappers
|
|
35
|
+
* in `update-page.ts` and `record-redirect.ts`.
|
|
36
|
+
*
|
|
37
|
+
* **Race-condition safety.** The INSERT uses `ON CONFLICT(url_id) DO
|
|
38
|
+
* UPDATE SET url_id = url_id RETURNING id, source` — the same no-op
|
|
39
|
+
* -update idiom as `upsertUrlRef` — so when a concurrent transaction
|
|
40
|
+
* wins the insert race, the statement still returns the existing row's
|
|
41
|
+
* id and source in one round trip. `onConflict().ignore()` without
|
|
42
|
+
* `RETURNING` must NOT be used here: knex's sqlite-family dialects
|
|
43
|
+
* report the connection's stale `lastInsertRowid` for a conflict-ignored
|
|
44
|
+
* insert, which reads as a valid id belonging to an unrelated row.
|
|
45
|
+
* @param qb - Knex instance OR a transaction, used verbatim for every
|
|
46
|
+
* statement this function issues. Pass the `trx` when running inside a
|
|
47
|
+
* transaction so reads see uncommitted writes from that transaction.
|
|
48
|
+
* @param caches - The connection's write-side id caches; mutated in place.
|
|
49
|
+
* @param url - The URL to look up or insert (normalised
|
|
50
|
+
* `withoutHashAndAuth` form, matching the legacy identity contract).
|
|
51
|
+
* @param options - See {@link ResolveContentItemIdOptions}.
|
|
52
|
+
* @returns The `content_items.id` of the existing or newly inserted row.
|
|
53
|
+
* @throws {Error} When the upsert's `RETURNING` yields no row — should
|
|
54
|
+
* not happen, so it surfaces as a hard error.
|
|
55
|
+
* @example
|
|
56
|
+
* const pageId = await resolveContentItemId(trx, caches, anchor.href, {
|
|
57
|
+
* isExternal: 1,
|
|
58
|
+
* source: 'crawled',
|
|
59
|
+
* isMetadataOnly: 1,
|
|
60
|
+
* });
|
|
61
|
+
*/
|
|
62
|
+
export declare function resolveContentItemId(qb: Knex | Knex.Transaction, caches: WriteRefCaches, url: string, options?: ResolveContentItemIdOptions): Promise<number>;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { upsertUrlRef } from './upsert-url-ref.js';
|
|
2
|
+
/**
|
|
3
|
+
* Returns the `content_items.id` for `url`, inserting a placeholder row
|
|
4
|
+
* (via `url_refs`) when the URL is not yet known. Foundational identity
|
|
5
|
+
* primitive shared by every op that needs to record an edge or lookup to
|
|
6
|
+
* a URL — the `content_items` successor of the legacy `pages.id`
|
|
7
|
+
* resolver.
|
|
8
|
+
*
|
|
9
|
+
* **Source semantics.** `source` is written ONLY on the INSERT path —
|
|
10
|
+
* when the row already exists, the INSERT is never reached and the
|
|
11
|
+
* existing row's `source` stays untouched. This is what keeps a second
|
|
12
|
+
* `crawl --inventory` from "demoting" a page that was first labelled
|
|
13
|
+
* `'inventory-seed'` back to `'inventory-discovered'` on later passes.
|
|
14
|
+
*
|
|
15
|
+
* **Crawled-wins downgrade.** When a row that was previously labelled
|
|
16
|
+
* `'inventory-seed'` or `'inventory-discovered'` is re-encountered via a
|
|
17
|
+
* `'crawled'`-lineage anchor (the parent page is part of the graph
|
|
18
|
+
* reachable from the original crawl roots), the row is downgraded to
|
|
19
|
+
* `'crawled'`. The inventory goal is finding orphans — anything reachable
|
|
20
|
+
* from the crawled chain is NOT an orphan and should not retain an
|
|
21
|
+
* inventory label. The cached `source` is updated in the same step so a
|
|
22
|
+
* later hit does not re-issue the UPDATE.
|
|
23
|
+
*
|
|
24
|
+
* **`is_metadata_only` promotion** (issue #369) is evaluated in the same
|
|
25
|
+
* pass as the crawled-wins downgrade, and both diffs are folded into a
|
|
26
|
+
* single `UPDATE` statement (not two) when either column actually
|
|
27
|
+
* changes — see {@link applyExistingRowUpdates}.
|
|
28
|
+
*
|
|
29
|
+
* **Cache poisoning on rollback.** Entries cached inside a transaction
|
|
30
|
+
* that later rolls back would point at ids that no longer exist. Every
|
|
31
|
+
* write op that opens a multi-statement transaction around this function
|
|
32
|
+
* must discard the whole cache bundle when that transaction fails,
|
|
33
|
+
* before any retry — see the try/catch + `clearWriteRefCaches` wrappers
|
|
34
|
+
* in `update-page.ts` and `record-redirect.ts`.
|
|
35
|
+
*
|
|
36
|
+
* **Race-condition safety.** The INSERT uses `ON CONFLICT(url_id) DO
|
|
37
|
+
* UPDATE SET url_id = url_id RETURNING id, source` — the same no-op
|
|
38
|
+
* -update idiom as `upsertUrlRef` — so when a concurrent transaction
|
|
39
|
+
* wins the insert race, the statement still returns the existing row's
|
|
40
|
+
* id and source in one round trip. `onConflict().ignore()` without
|
|
41
|
+
* `RETURNING` must NOT be used here: knex's sqlite-family dialects
|
|
42
|
+
* report the connection's stale `lastInsertRowid` for a conflict-ignored
|
|
43
|
+
* insert, which reads as a valid id belonging to an unrelated row.
|
|
44
|
+
* @param qb - Knex instance OR a transaction, used verbatim for every
|
|
45
|
+
* statement this function issues. Pass the `trx` when running inside a
|
|
46
|
+
* transaction so reads see uncommitted writes from that transaction.
|
|
47
|
+
* @param caches - The connection's write-side id caches; mutated in place.
|
|
48
|
+
* @param url - The URL to look up or insert (normalised
|
|
49
|
+
* `withoutHashAndAuth` form, matching the legacy identity contract).
|
|
50
|
+
* @param options - See {@link ResolveContentItemIdOptions}.
|
|
51
|
+
* @returns The `content_items.id` of the existing or newly inserted row.
|
|
52
|
+
* @throws {Error} When the upsert's `RETURNING` yields no row — should
|
|
53
|
+
* not happen, so it surfaces as a hard error.
|
|
54
|
+
* @example
|
|
55
|
+
* const pageId = await resolveContentItemId(trx, caches, anchor.href, {
|
|
56
|
+
* isExternal: 1,
|
|
57
|
+
* source: 'crawled',
|
|
58
|
+
* isMetadataOnly: 1,
|
|
59
|
+
* });
|
|
60
|
+
*/
|
|
61
|
+
export async function resolveContentItemId(qb, caches, url, options) {
|
|
62
|
+
const { isExternal, source, isMetadataOnly } = options ?? {};
|
|
63
|
+
const cached = caches.contentItems.get(url);
|
|
64
|
+
if (cached !== undefined) {
|
|
65
|
+
await applyExistingRowUpdates(qb, cached, source, isMetadataOnly);
|
|
66
|
+
return cached.id;
|
|
67
|
+
}
|
|
68
|
+
const urlId = await upsertUrlRef(qb, caches, url);
|
|
69
|
+
const [record] = (await qb
|
|
70
|
+
.select('id', 'source', 'is_metadata_only')
|
|
71
|
+
.from('content_items')
|
|
72
|
+
.where('url_id', urlId));
|
|
73
|
+
if (record !== undefined) {
|
|
74
|
+
const entry = {
|
|
75
|
+
id: record.id,
|
|
76
|
+
source: record.source,
|
|
77
|
+
isMetadataOnly: record.is_metadata_only,
|
|
78
|
+
};
|
|
79
|
+
await applyExistingRowUpdates(qb, entry, source, isMetadataOnly);
|
|
80
|
+
caches.contentItems.set(url, entry);
|
|
81
|
+
return entry.id;
|
|
82
|
+
}
|
|
83
|
+
const insertedRows = await qb.raw(`INSERT INTO content_items (url_id, scraped, is_target, is_external, is_metadata_only${source === undefined ? '' : ', source'})
|
|
84
|
+
VALUES (?, 0, 0, ?, ?${source === undefined ? '' : ', ?'})
|
|
85
|
+
ON CONFLICT(url_id) DO UPDATE SET url_id = url_id
|
|
86
|
+
RETURNING id, source, is_metadata_only`, source === undefined
|
|
87
|
+
? [urlId, isExternal ?? 0, isMetadataOnly ?? 0]
|
|
88
|
+
: [urlId, isExternal ?? 0, isMetadataOnly ?? 0, source]);
|
|
89
|
+
const inserted = insertedRows[0];
|
|
90
|
+
if (inserted === undefined) {
|
|
91
|
+
throw new Error(`Failed to insert a new content item: ${url}`);
|
|
92
|
+
}
|
|
93
|
+
const insertedEntry = {
|
|
94
|
+
id: inserted.id,
|
|
95
|
+
source: inserted.source,
|
|
96
|
+
isMetadataOnly: inserted.is_metadata_only,
|
|
97
|
+
};
|
|
98
|
+
// A conflict means a concurrent writer created the row between this
|
|
99
|
+
// function's SELECT miss and the INSERT — the returned `source` /
|
|
100
|
+
// `is_metadata_only` are that row's values, so both follow-ups must be
|
|
101
|
+
// evaluated exactly as on the SELECT-hit path.
|
|
102
|
+
await applyExistingRowUpdates(qb, insertedEntry, source, isMetadataOnly);
|
|
103
|
+
caches.contentItems.set(url, insertedEntry);
|
|
104
|
+
return insertedEntry.id;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Applies both the crawled-wins `source` downgrade and the `is_metadata_only`
|
|
108
|
+
* promotion (issue #369) to an already-resolved row in a single `UPDATE`,
|
|
109
|
+
* and keeps the cache entry in sync so a repeat call with the same values
|
|
110
|
+
* does not re-issue any write.
|
|
111
|
+
*
|
|
112
|
+
* Folded into one function (and one statement) rather than two independent
|
|
113
|
+
* ones: `resolveContentItemId` runs once per anchor on every scraped page
|
|
114
|
+
* across a whole crawl, so a page whose anchors trip both conditions would
|
|
115
|
+
* otherwise pay two round trips instead of one.
|
|
116
|
+
* @param qb - Knex instance or transaction.
|
|
117
|
+
* @param entry - The cached identity to check and mutate.
|
|
118
|
+
* @param source - The resolution's lineage label, if any — see
|
|
119
|
+
* {@link ResolveContentItemIdOptions.source}.
|
|
120
|
+
* @param isMetadataOnly - The resolution's explicit scrape-depth opinion, if
|
|
121
|
+
* any — see {@link ResolveContentItemIdOptions.isMetadataOnly}. Omitted by
|
|
122
|
+
* every caller except `replaceAnchorEdges`, which always has an opinion,
|
|
123
|
+
* so this is a no-op for the rest.
|
|
124
|
+
*/
|
|
125
|
+
async function applyExistingRowUpdates(qb, entry, source, isMetadataOnly) {
|
|
126
|
+
const updates = {};
|
|
127
|
+
if (source === 'crawled' && entry.source !== 'crawled') {
|
|
128
|
+
updates.source = 'crawled';
|
|
129
|
+
}
|
|
130
|
+
if (isMetadataOnly !== undefined && entry.isMetadataOnly !== isMetadataOnly) {
|
|
131
|
+
updates.is_metadata_only = isMetadataOnly;
|
|
132
|
+
}
|
|
133
|
+
if (Object.keys(updates).length === 0) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
await qb('content_items').where('id', entry.id).update(updates);
|
|
137
|
+
if (updates.source !== undefined) {
|
|
138
|
+
entry.source = updates.source;
|
|
139
|
+
}
|
|
140
|
+
if (updates.is_metadata_only !== undefined) {
|
|
141
|
+
entry.isMetadataOnly = updates.is_metadata_only;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { WriteRefCaches } from './types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Routes one URL-shaped value to either `url_refs` or `blob_refs` per the
|
|
5
|
+
* data-URI threshold rule (large data URIs live in `blob_refs`, everything
|
|
6
|
+
* else in `url_refs`), upserting into whichever dictionary applies.
|
|
7
|
+
*
|
|
8
|
+
* Shared by every writer that can receive a `data:` URI in a URL-shaped
|
|
9
|
+
* column: `image_items.src` / `current_src` and `resource_items`' own
|
|
10
|
+
* identity URL. At most one of `url` / `blob` is non-null; both are `null`
|
|
11
|
+
* when the value is empty or a malformed data URI that fails to decode.
|
|
12
|
+
* @param qb - Knex instance or transaction connected to the archive DB.
|
|
13
|
+
* @param caches - The connection's write-side id caches.
|
|
14
|
+
* @param value - Raw URL-shaped value.
|
|
15
|
+
* @returns `{ url, blob }` pair with at most one non-null field.
|
|
16
|
+
* @example
|
|
17
|
+
* const slot = await resolveUrlOrBlob(trx, caches, image.src);
|
|
18
|
+
* // slot.url set for a regular URL, slot.blob set for a large data: URI.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveUrlOrBlob(qb: Knex | Knex.Transaction, caches: WriteRefCaches, value: string | null | undefined): Promise<{
|
|
21
|
+
url: number | null;
|
|
22
|
+
blob: number | null;
|
|
23
|
+
}>;
|