@nitpicker/archive 0.0.0-stage → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +105 -2
- package/lib/apply-connection-pragmas.d.ts +18 -0
- package/lib/apply-connection-pragmas.js +40 -0
- package/lib/archive-accessor.d.ts +265 -0
- package/lib/archive-accessor.js +477 -0
- package/lib/archive-lock.d.ts +45 -0
- package/lib/archive-lock.js +154 -0
- package/lib/archive.d.ts +736 -0
- package/lib/archive.js +1056 -0
- package/lib/body-hash/compute-body-hash.d.ts +32 -0
- package/lib/body-hash/compute-body-hash.js +35 -0
- package/lib/cache/clear-archive-cache-entry.d.ts +18 -0
- package/lib/cache/clear-archive-cache-entry.js +24 -0
- package/lib/cache/clear-archive-cache-root.d.ts +26 -0
- package/lib/cache/clear-archive-cache-root.js +32 -0
- package/lib/cache/compute-archive-cache-key.d.ts +39 -0
- package/lib/cache/compute-archive-cache-key.js +95 -0
- package/lib/cache/extract-archive-to-cache.d.ts +57 -0
- package/lib/cache/extract-archive-to-cache.js +326 -0
- package/lib/cache/get-archive-cache-root.d.ts +20 -0
- package/lib/cache/get-archive-cache-root.js +53 -0
- package/lib/cache/is-archive-cache-disabled.d.ts +24 -0
- package/lib/cache/is-archive-cache-disabled.js +34 -0
- package/lib/cache/list-archive-cache-entries.d.ts +23 -0
- package/lib/cache/list-archive-cache-entries.js +130 -0
- package/lib/cache/path-exists.d.ts +9 -0
- package/lib/cache/path-exists.js +18 -0
- package/lib/cache/resolve-archive-cache-dir.d.ts +26 -0
- package/lib/cache/resolve-archive-cache-dir.js +32 -0
- package/lib/cache/types.d.ts +33 -0
- package/lib/cache/types.js +1 -0
- package/lib/content-type/is-html-content-type.d.ts +17 -0
- package/lib/content-type/is-html-content-type.js +19 -0
- package/lib/content-type/normalize-content-type.d.ts +14 -0
- package/lib/content-type/normalize-content-type.js +20 -0
- package/lib/create-adjunct-tables.d.ts +66 -0
- package/lib/create-adjunct-tables.js +510 -0
- package/lib/create-entity-tables.d.ts +191 -0
- package/lib/create-entity-tables.js +387 -0
- package/lib/create-progress-reporter.d.ts +30 -0
- package/lib/create-progress-reporter.js +38 -0
- package/lib/create-ref-tables.d.ts +35 -0
- package/lib/create-ref-tables.js +185 -0
- package/lib/create-template-tables.d.ts +28 -0
- package/lib/create-template-tables.js +92 -0
- package/lib/database.d.ts +549 -0
- package/lib/database.js +804 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.d.ts +27 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.js +35 -0
- package/lib/db-ops/_shared/compress-payload.d.ts +26 -0
- package/lib/db-ops/_shared/compress-payload.js +30 -0
- package/lib/db-ops/_shared/create-write-ref-caches.d.ts +17 -0
- package/lib/db-ops/_shared/create-write-ref-caches.js +27 -0
- package/lib/db-ops/_shared/decode-json-ref.d.ts +17 -0
- package/lib/db-ops/_shared/decode-json-ref.js +31 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.d.ts +49 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.js +69 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.d.ts +20 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.js +53 -0
- package/lib/db-ops/_shared/resolve-content-item-id.d.ts +62 -0
- package/lib/db-ops/_shared/resolve-content-item-id.js +143 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.d.ts +23 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.js +29 -0
- package/lib/db-ops/_shared/retry-setting.d.ts +16 -0
- package/lib/db-ops/_shared/retry-setting.js +18 -0
- package/lib/db-ops/_shared/safe-parse-json.d.ts +11 -0
- package/lib/db-ops/_shared/safe-parse-json.js +18 -0
- package/lib/db-ops/_shared/types.d.ts +94 -0
- package/lib/db-ops/_shared/types.js +1 -0
- package/lib/db-ops/_shared/upsert-blob-ref.d.ts +25 -0
- package/lib/db-ops/_shared/upsert-blob-ref.js +48 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.d.ts +30 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.js +45 -0
- package/lib/db-ops/_shared/upsert-json-ref.d.ts +22 -0
- package/lib/db-ops/_shared/upsert-json-ref.js +41 -0
- package/lib/db-ops/_shared/upsert-response-headers.d.ts +35 -0
- package/lib/db-ops/_shared/upsert-response-headers.js +49 -0
- package/lib/db-ops/_shared/upsert-url-ref.d.ts +39 -0
- package/lib/db-ops/_shared/upsert-url-ref.js +62 -0
- package/lib/db-ops/anchors/get-anchors-on-page.d.ts +10 -0
- package/lib/db-ops/anchors/get-anchors-on-page.js +21 -0
- package/lib/db-ops/config/get-base-url.d.ts +8 -0
- package/lib/db-ops/config/get-base-url.js +14 -0
- package/lib/db-ops/config/get-config.d.ts +10 -0
- package/lib/db-ops/config/get-config.js +29 -0
- package/lib/db-ops/config/get-created-cwd.d.ts +11 -0
- package/lib/db-ops/config/get-created-cwd.js +13 -0
- package/lib/db-ops/config/get-name.d.ts +8 -0
- package/lib/db-ops/config/get-name.js +14 -0
- package/lib/db-ops/config/info-column-allowlist.d.ts +7 -0
- package/lib/db-ops/config/info-column-allowlist.js +29 -0
- package/lib/db-ops/config/info-json-columns.d.ts +5 -0
- package/lib/db-ops/config/info-json-columns.js +11 -0
- package/lib/db-ops/config/set-config.d.ts +12 -0
- package/lib/db-ops/config/set-config.js +21 -0
- package/lib/db-ops/config/update-config.d.ts +17 -0
- package/lib/db-ops/config/update-config.js +36 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.d.ts +19 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.js +30 -0
- package/lib/db-ops/console-logs/replace-console-logs.d.ts +34 -0
- package/lib/db-ops/console-logs/replace-console-logs.js +123 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.d.ts +16 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.js +26 -0
- package/lib/db-ops/console-logs/types.d.ts +38 -0
- package/lib/db-ops/console-logs/types.js +1 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.d.ts +29 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.js +52 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.d.ts +18 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.js +23 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.d.ts +12 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.js +15 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.d.ts +14 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.js +30 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.d.ts +57 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.js +87 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.d.ts +21 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.js +27 -0
- package/lib/db-ops/errors/insert-crawl-error.d.ts +15 -0
- package/lib/db-ops/errors/insert-crawl-error.js +21 -0
- package/lib/db-ops/errors/insert-page-error.d.ts +21 -0
- package/lib/db-ops/errors/insert-page-error.js +30 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.d.ts +33 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.js +158 -0
- package/lib/db-ops/html/read-page-html-blob.d.ts +17 -0
- package/lib/db-ops/html/read-page-html-blob.js +20 -0
- package/lib/db-ops/lifecycle/checkpoint.d.ts +8 -0
- package/lib/db-ops/lifecycle/checkpoint.js +9 -0
- package/lib/db-ops/lifecycle/destroy.d.ts +6 -0
- package/lib/db-ops/lifecycle/destroy.js +7 -0
- package/lib/db-ops/lifecycle/init.d.ts +58 -0
- package/lib/db-ops/lifecycle/init.js +122 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.d.ts +22 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.js +41 -0
- package/lib/db-ops/meta/get-audios-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-audios-of-page.js +15 -0
- package/lib/db-ops/meta/get-buttons-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-buttons-of-page.js +15 -0
- package/lib/db-ops/meta/get-canvases-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-canvases-of-page.js +15 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.js +15 -0
- package/lib/db-ops/meta/get-headings-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-headings-of-page.js +15 -0
- package/lib/db-ops/meta/get-iframes-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-iframes-of-page.js +15 -0
- package/lib/db-ops/meta/get-jsonld-of-page.d.ts +13 -0
- package/lib/db-ops/meta/get-jsonld-of-page.js +27 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.js +15 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.js +15 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.js +15 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.js +15 -0
- package/lib/db-ops/meta/get-videos-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-videos-of-page.js +15 -0
- package/lib/db-ops/outages/close-network-outage.d.ts +12 -0
- package/lib/db-ops/outages/close-network-outage.js +15 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.d.ts +26 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.js +42 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.d.ts +26 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.js +31 -0
- package/lib/db-ops/outages/insert-network-outage.d.ts +14 -0
- package/lib/db-ops/outages/insert-network-outage.js +29 -0
- package/lib/db-ops/outages/list-network-outages.d.ts +28 -0
- package/lib/db-ops/outages/list-network-outages.js +42 -0
- package/lib/db-ops/pages/order/set-url-order.d.ts +13 -0
- package/lib/db-ops/pages/order/set-url-order.js +38 -0
- package/lib/db-ops/pages/read/build-page-query.d.ts +18 -0
- package/lib/db-ops/pages/read/build-page-query.js +40 -0
- package/lib/db-ops/pages/read/get-crawling-state.d.ts +117 -0
- package/lib/db-ops/pages/read/get-crawling-state.js +161 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.d.ts +15 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.js +30 -0
- package/lib/db-ops/pages/read/get-page-count.d.ts +12 -0
- package/lib/db-ops/pages/read/get-page-count.js +21 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.d.ts +24 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.js +28 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.d.ts +38 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.js +107 -0
- package/lib/db-ops/pages/read/get-pages.d.ts +11 -0
- package/lib/db-ops/pages/read/get-pages.js +51 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.d.ts +18 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.js +25 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.d.ts +31 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.js +32 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.d.ts +20 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.js +37 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.d.ts +30 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.js +91 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.d.ts +88 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.js +216 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.d.ts +80 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.js +151 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.d.ts +24 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.js +24 -0
- package/lib/db-ops/pages/write/insert-audios.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-audios.js +25 -0
- package/lib/db-ops/pages/write/insert-buttons.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-buttons.js +29 -0
- package/lib/db-ops/pages/write/insert-canvases.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-canvases.js +26 -0
- package/lib/db-ops/pages/write/insert-custom-elements.d.ts +27 -0
- package/lib/db-ops/pages/write/insert-custom-elements.js +40 -0
- package/lib/db-ops/pages/write/insert-headings.d.ts +15 -0
- package/lib/db-ops/pages/write/insert-headings.js +27 -0
- package/lib/db-ops/pages/write/insert-iframes.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-iframes.js +28 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.d.ts +38 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.js +60 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.d.ts +36 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.js +48 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.d.ts +42 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.js +56 -0
- package/lib/db-ops/pages/write/insert-jsonld.d.ts +17 -0
- package/lib/db-ops/pages/write/insert-jsonld.js +49 -0
- package/lib/db-ops/pages/write/insert-main-content-images.d.ts +20 -0
- package/lib/db-ops/pages/write/insert-main-content-images.js +32 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.js +29 -0
- package/lib/db-ops/pages/write/insert-page.d.ts +56 -0
- package/lib/db-ops/pages/write/insert-page.js +259 -0
- package/lib/db-ops/pages/write/insert-technologies.d.ts +25 -0
- package/lib/db-ops/pages/write/insert-technologies.js +45 -0
- package/lib/db-ops/pages/write/insert-videos.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-videos.js +28 -0
- package/lib/db-ops/pages/write/link-redirect-sources.d.ts +42 -0
- package/lib/db-ops/pages/write/link-redirect-sources.js +101 -0
- package/lib/db-ops/pages/write/record-redirect.d.ts +35 -0
- package/lib/db-ops/pages/write/record-redirect.js +100 -0
- package/lib/db-ops/pages/write/set-skipped-page.d.ts +13 -0
- package/lib/db-ops/pages/write/set-skipped-page.js +24 -0
- package/lib/db-ops/pages/write/update-page.d.ts +40 -0
- package/lib/db-ops/pages/write/update-page.js +419 -0
- package/lib/db-ops/pages/write/write-page-html-blob.d.ts +19 -0
- package/lib/db-ops/pages/write/write-page-html-blob.js +41 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.d.ts +9 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.js +15 -0
- package/lib/db-ops/referrers/get-referrers-of-page.d.ts +17 -0
- package/lib/db-ops/referrers/get-referrers-of-page.js +32 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.d.ts +8 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.js +15 -0
- package/lib/db-ops/resources/build-resource-query.d.ts +25 -0
- package/lib/db-ops/resources/build-resource-query.js +29 -0
- package/lib/db-ops/resources/get-existing-resource-urls.d.ts +9 -0
- package/lib/db-ops/resources/get-existing-resource-urls.js +24 -0
- package/lib/db-ops/resources/get-resource-by-url.d.ts +13 -0
- package/lib/db-ops/resources/get-resource-by-url.js +22 -0
- package/lib/db-ops/resources/get-resource-url-list.d.ts +17 -0
- package/lib/db-ops/resources/get-resource-url-list.js +26 -0
- package/lib/db-ops/resources/get-resources.d.ts +8 -0
- package/lib/db-ops/resources/get-resources.js +11 -0
- package/lib/db-ops/resources/insert-inventory-resources.d.ts +24 -0
- package/lib/db-ops/resources/insert-inventory-resources.js +64 -0
- package/lib/db-ops/resources/insert-resource-referrers.d.ts +15 -0
- package/lib/db-ops/resources/insert-resource-referrers.js +54 -0
- package/lib/db-ops/resources/insert-resource.d.ts +34 -0
- package/lib/db-ops/resources/insert-resource.js +73 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.d.ts +26 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.js +30 -0
- package/lib/db-ops/templates/assign-template-labels.d.ts +60 -0
- package/lib/db-ops/templates/assign-template-labels.js +187 -0
- package/lib/db-ops/templates/replace-page-templates.d.ts +44 -0
- package/lib/db-ops/templates/replace-page-templates.js +174 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.d.ts +16 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.js +17 -0
- package/lib/db-ops/templates/types.d.ts +103 -0
- package/lib/db-ops/templates/types.js +1 -0
- package/lib/debug.d.ts +8 -0
- package/lib/debug.js +9 -0
- package/lib/decode-html-blob.d.ts +20 -0
- package/lib/decode-html-blob.js +23 -0
- package/lib/decode-page-html-blob-bytes.d.ts +25 -0
- package/lib/decode-page-html-blob-bytes.js +29 -0
- package/lib/decode-stored-blob-bytes.d.ts +25 -0
- package/lib/decode-stored-blob-bytes.js +47 -0
- package/lib/derive-lineage-from-parent.d.ts +37 -0
- package/lib/derive-lineage-from-parent.js +42 -0
- package/lib/drop-legacy-tables.d.ts +45 -0
- package/lib/drop-legacy-tables.js +56 -0
- package/lib/error-kind/classify-error-kind.d.ts +20 -0
- package/lib/error-kind/classify-error-kind.js +136 -0
- package/lib/error-kind/network-related-error-kinds.d.ts +23 -0
- package/lib/error-kind/network-related-error-kinds.js +28 -0
- package/lib/error-kind/permanent-error-kinds.d.ts +48 -0
- package/lib/error-kind/permanent-error-kinds.js +54 -0
- package/lib/error-kind/types.d.ts +54 -0
- package/lib/error-kind/types.js +1 -0
- package/lib/filesystem/append-text.d.ts +9 -0
- package/lib/filesystem/append-text.js +14 -0
- package/lib/filesystem/copy-dir-sync.d.ts +6 -0
- package/lib/filesystem/copy-dir-sync.js +9 -0
- package/lib/filesystem/copy-dir.d.ts +7 -0
- package/lib/filesystem/copy-dir.js +13 -0
- package/lib/filesystem/copy-file-with-progress.d.ts +20 -0
- package/lib/filesystem/copy-file-with-progress.js +34 -0
- package/lib/filesystem/exists.d.ts +6 -0
- package/lib/filesystem/exists.js +9 -0
- package/lib/filesystem/get-file-list.d.ts +8 -0
- package/lib/filesystem/get-file-list.js +12 -0
- package/lib/filesystem/is-dir.d.ts +6 -0
- package/lib/filesystem/is-dir.js +10 -0
- package/lib/filesystem/mkdir.d.ts +8 -0
- package/lib/filesystem/mkdir.js +15 -0
- package/lib/filesystem/output-binary.d.ts +12 -0
- package/lib/filesystem/output-binary.js +17 -0
- package/lib/filesystem/output-json.d.ts +9 -0
- package/lib/filesystem/output-json.js +14 -0
- package/lib/filesystem/output-text.d.ts +11 -0
- package/lib/filesystem/output-text.js +32 -0
- package/lib/filesystem/parse-pax-path.d.ts +18 -0
- package/lib/filesystem/parse-pax-path.js +47 -0
- package/lib/filesystem/parse-tar-size-field.d.ts +13 -0
- package/lib/filesystem/parse-tar-size-field.js +40 -0
- package/lib/filesystem/peek-tar-top-dir.d.ts +35 -0
- package/lib/filesystem/peek-tar-top-dir.js +215 -0
- package/lib/filesystem/read-json.d.ts +7 -0
- package/lib/filesystem/read-json.js +11 -0
- package/lib/filesystem/read-text.d.ts +6 -0
- package/lib/filesystem/read-text.js +10 -0
- package/lib/filesystem/readline.d.ts +11 -0
- package/lib/filesystem/readline.js +26 -0
- package/lib/filesystem/remove.d.ts +5 -0
- package/lib/filesystem/remove.js +10 -0
- package/lib/filesystem/rename.d.ts +16 -0
- package/lib/filesystem/rename.js +48 -0
- package/lib/filesystem/tar.d.ts +23 -0
- package/lib/filesystem/tar.js +78 -0
- package/lib/filesystem/untar.d.ts +33 -0
- package/lib/filesystem/untar.js +84 -0
- package/lib/get-failed-page-messages.d.ts +56 -0
- package/lib/get-failed-page-messages.js +146 -0
- package/lib/get-json.d.ts +10 -0
- package/lib/get-json.js +25 -0
- package/lib/html-snapshot/match-selector-html.d.ts +25 -0
- package/lib/html-snapshot/match-selector-html.js +28 -0
- package/lib/html-snapshot/match-selector-snapshots.d.ts +33 -0
- package/lib/html-snapshot/match-selector-snapshots.js +33 -0
- package/lib/html-snapshot/search-html-document.d.ts +29 -0
- package/lib/html-snapshot/search-html-document.js +27 -0
- package/lib/html-snapshot/search-html-snapshots.d.ts +36 -0
- package/lib/html-snapshot/search-html-snapshots.js +35 -0
- package/lib/html-snapshot/types.d.ts +111 -0
- package/lib/html-snapshot/types.js +7 -0
- package/lib/html-snapshot/validate-search-pattern.d.ts +15 -0
- package/lib/html-snapshot/validate-search-pattern.js +17 -0
- package/lib/init-schema.d.ts +48 -0
- package/lib/init-schema.js +124 -0
- package/lib/is-inventory-source.d.ts +21 -0
- package/lib/is-inventory-source.js +22 -0
- package/lib/is-within-outage-window.d.ts +49 -0
- package/lib/is-within-outage-window.js +33 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.d.ts +24 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.js +26 -0
- package/lib/libsql-dialect.d.ts +115 -0
- package/lib/libsql-dialect.js +116 -0
- package/lib/limited-page-ids.d.ts +9 -0
- package/lib/limited-page-ids.js +18 -0
- package/lib/meta/assert-compatible-version.d.ts +60 -0
- package/lib/meta/assert-compatible-version.js +93 -0
- package/lib/meta/classify-jsonld-type.d.ts +23 -0
- package/lib/meta/classify-jsonld-type.js +43 -0
- package/lib/meta/compare-semver.d.ts +23 -0
- package/lib/meta/compare-semver.js +51 -0
- package/lib/meta/compute-main-contents-denormalized.d.ts +41 -0
- package/lib/meta/compute-main-contents-denormalized.js +88 -0
- package/lib/meta/compute-page-denormalized.d.ts +20 -0
- package/lib/meta/compute-page-denormalized.js +35 -0
- package/lib/meta/derive-flat-from-meta.d.ts +34 -0
- package/lib/meta/derive-flat-from-meta.js +158 -0
- package/lib/meta/derive-meta-extras.d.ts +20 -0
- package/lib/meta/derive-meta-extras.js +23 -0
- package/lib/meta/extract-tags-for-archive.d.ts +17 -0
- package/lib/meta/extract-tags-for-archive.js +36 -0
- package/lib/meta/parse-main-content-class-list.d.ts +19 -0
- package/lib/meta/parse-main-content-class-list.js +34 -0
- package/lib/meta/summarize-jsonld.d.ts +17 -0
- package/lib/meta/summarize-jsonld.js +29 -0
- package/lib/meta/technologies/combine-technology-confidence.d.ts +46 -0
- package/lib/meta/technologies/combine-technology-confidence.js +93 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.d.ts +45 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.js +53 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.d.ts +33 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.js +46 -0
- package/lib/meta/technologies/extract-technologies-for-archive.d.ts +33 -0
- package/lib/meta/technologies/extract-technologies-for-archive.js +30 -0
- package/lib/meta/technologies/match-js-license-comment-signal.d.ts +21 -0
- package/lib/meta/technologies/match-js-license-comment-signal.js +23 -0
- package/lib/meta/technologies/match-structural-technology-signals.d.ts +26 -0
- package/lib/meta/technologies/match-structural-technology-signals.js +48 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.d.ts +25 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.js +35 -0
- package/lib/meta/technologies/technology-signal-definitions.d.ts +44 -0
- package/lib/meta/technologies/technology-signal-definitions.js +60 -0
- package/lib/meta/technologies/types.d.ts +70 -0
- package/lib/meta/technologies/types.js +13 -0
- package/lib/meta/types.d.ts +1490 -0
- package/lib/meta/types.js +65 -0
- package/lib/migrate-content-items-alias-of-id.d.ts +52 -0
- package/lib/migrate-content-items-alias-of-id.js +69 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.d.ts +46 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.js +62 -0
- package/lib/migrate-content-items-is-metadata-only.d.ts +44 -0
- package/lib/migrate-content-items-is-metadata-only.js +60 -0
- package/lib/migrate-entity-tables.d.ts +55 -0
- package/lib/migrate-entity-tables.js +66 -0
- package/lib/migrate-info-created-cwd.d.ts +17 -0
- package/lib/migrate-info-created-cwd.js +36 -0
- package/lib/migrate-info-main-content-selector.d.ts +16 -0
- package/lib/migrate-info-main-content-selector.js +35 -0
- package/lib/migrate-info-request-header-names.d.ts +16 -0
- package/lib/migrate-info-request-header-names.js +35 -0
- package/lib/migrate-info-roots.d.ts +20 -0
- package/lib/migrate-info-roots.js +52 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.d.ts +34 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.js +51 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.d.ts +25 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.js +44 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.d.ts +16 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.js +35 -0
- package/lib/migrate-main-contents-columns.d.ts +26 -0
- package/lib/migrate-main-contents-columns.js +61 -0
- package/lib/migrate-page-meta-body-hash.d.ts +44 -0
- package/lib/migrate-page-meta-body-hash.js +63 -0
- package/lib/migrate-page-meta-console-error-count.d.ts +27 -0
- package/lib/migrate-page-meta-console-error-count.js +45 -0
- package/lib/migrate-page-meta-custom-element-count.d.ts +33 -0
- package/lib/migrate-page-meta-custom-element-count.js +51 -0
- package/lib/migrate-page-meta-image-scan.d.ts +27 -0
- package/lib/migrate-page-meta-image-scan.js +52 -0
- package/lib/migrate-page-tags-to-page-technologies.d.ts +39 -0
- package/lib/migrate-page-tags-to-page-technologies.js +79 -0
- package/lib/migrate-ref-tables.d.ts +25 -0
- package/lib/migrate-ref-tables.js +38 -0
- package/lib/native-executor/check-native-executor-config.d.ts +17 -0
- package/lib/native-executor/check-native-executor-config.js +20 -0
- package/lib/page-meta-column-maps.d.ts +32 -0
- package/lib/page-meta-column-maps.js +43 -0
- package/lib/page.d.ts +546 -0
- package/lib/page.js +764 -0
- package/lib/peek-archive-lock.d.ts +40 -0
- package/lib/peek-archive-lock.js +62 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.d.ts +41 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.js +87 -0
- package/lib/populate-entity-tables/derive-dom-path.d.ts +35 -0
- package/lib/populate-entity-tables/derive-dom-path.js +72 -0
- package/lib/populate-entity-tables/is-blob-ref-value.d.ts +16 -0
- package/lib/populate-entity-tables/is-blob-ref-value.js +19 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.d.ts +66 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.js +96 -0
- package/lib/populate-entity-tables/populate-anchor-edges.d.ts +33 -0
- package/lib/populate-entity-tables/populate-anchor-edges.js +153 -0
- package/lib/populate-entity-tables/populate-content-items.d.ts +40 -0
- package/lib/populate-entity-tables/populate-content-items.js +141 -0
- package/lib/populate-entity-tables/populate-entities.d.ts +81 -0
- package/lib/populate-entity-tables/populate-entities.js +110 -0
- package/lib/populate-entity-tables/populate-image-items.d.ts +91 -0
- package/lib/populate-entity-tables/populate-image-items.js +226 -0
- package/lib/populate-entity-tables/populate-page-meta.d.ts +33 -0
- package/lib/populate-entity-tables/populate-page-meta.js +267 -0
- package/lib/populate-entity-tables/populate-resource-items.d.ts +22 -0
- package/lib/populate-entity-tables/populate-resource-items.js +114 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.d.ts +31 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.js +33 -0
- package/lib/populate-entity-tables/resolve-blob-refs.d.ts +31 -0
- package/lib/populate-entity-tables/resolve-blob-refs.js +100 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.d.ts +22 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.js +27 -0
- package/lib/populate-entity-tables/resolve-header-sets.d.ts +49 -0
- package/lib/populate-entity-tables/resolve-header-sets.js +122 -0
- package/lib/populate-entity-tables/resolve-json-refs.d.ts +25 -0
- package/lib/populate-entity-tables/resolve-json-refs.js +67 -0
- package/lib/populate-entity-tables/resolve-text-refs.d.ts +30 -0
- package/lib/populate-entity-tables/resolve-text-refs.js +61 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.d.ts +21 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.js +27 -0
- package/lib/populate-entity-tables/resolve-url-refs.d.ts +33 -0
- package/lib/populate-entity-tables/resolve-url-refs.js +60 -0
- package/lib/populate-entity-tables/test-utils/count-rows.d.ts +17 -0
- package/lib/populate-entity-tables/test-utils/count-rows.js +20 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.d.ts +25 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.js +42 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.d.ts +30 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.js +175 -0
- package/lib/populate-entity-tables/types.d.ts +157 -0
- package/lib/populate-entity-tables/types.js +12 -0
- package/lib/populate-entity-tables/upsert-text-refs.d.ts +38 -0
- package/lib/populate-entity-tables/upsert-text-refs.js +78 -0
- package/lib/populate-ref-tables/classify-content-type.d.ts +16 -0
- package/lib/populate-ref-tables/classify-content-type.js +52 -0
- package/lib/populate-ref-tables/compute-content-hash.d.ts +22 -0
- package/lib/populate-ref-tables/compute-content-hash.js +26 -0
- package/lib/populate-ref-tables/compute-header-flags.d.ts +16 -0
- package/lib/populate-ref-tables/compute-header-flags.js +70 -0
- package/lib/populate-ref-tables/content-type-rules.d.ts +38 -0
- package/lib/populate-ref-tables/content-type-rules.js +133 -0
- package/lib/populate-ref-tables/create-header-table-caches.d.ts +25 -0
- package/lib/populate-ref-tables/create-header-table-caches.js +49 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.d.ts +15 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.js +15 -0
- package/lib/populate-ref-tables/decode-data-uri.d.ts +21 -0
- package/lib/populate-ref-tables/decode-data-uri.js +126 -0
- package/lib/populate-ref-tables/decompose-header-set.d.ts +29 -0
- package/lib/populate-ref-tables/decompose-header-set.js +157 -0
- package/lib/populate-ref-tables/decompose-url.d.ts +25 -0
- package/lib/populate-ref-tables/decompose-url.js +70 -0
- package/lib/populate-ref-tables/header-stability.d.ts +19 -0
- package/lib/populate-ref-tables/header-stability.js +22 -0
- package/lib/populate-ref-tables/header-value-cache-key.d.ts +17 -0
- package/lib/populate-ref-tables/header-value-cache-key.js +19 -0
- package/lib/populate-ref-tables/normalize-mime.d.ts +24 -0
- package/lib/populate-ref-tables/normalize-mime.js +36 -0
- package/lib/populate-ref-tables/populate-blob-refs.d.ts +38 -0
- package/lib/populate-ref-tables/populate-blob-refs.js +134 -0
- package/lib/populate-ref-tables/populate-content-type-refs.d.ts +27 -0
- package/lib/populate-ref-tables/populate-content-type-refs.js +70 -0
- package/lib/populate-ref-tables/populate-header-tables.d.ts +35 -0
- package/lib/populate-ref-tables/populate-header-tables.js +80 -0
- package/lib/populate-ref-tables/populate-json-refs.d.ts +29 -0
- package/lib/populate-ref-tables/populate-json-refs.js +101 -0
- package/lib/populate-ref-tables/populate-refs.d.ts +51 -0
- package/lib/populate-ref-tables/populate-refs.js +62 -0
- package/lib/populate-ref-tables/populate-text-refs.d.ts +32 -0
- package/lib/populate-ref-tables/populate-text-refs.js +133 -0
- package/lib/populate-ref-tables/populate-url-refs.d.ts +28 -0
- package/lib/populate-ref-tables/populate-url-refs.js +148 -0
- package/lib/populate-ref-tables/test-utils/count-rows.d.ts +15 -0
- package/lib/populate-ref-tables/test-utils/count-rows.js +17 -0
- package/lib/populate-ref-tables/types.d.ts +197 -0
- package/lib/populate-ref-tables/types.js +7 -0
- package/lib/populate-ref-tables/upsert-one-header-set.d.ts +34 -0
- package/lib/populate-ref-tables/upsert-one-header-set.js +208 -0
- package/lib/populate-ref-tables/volatile-header-names.d.ts +20 -0
- package/lib/populate-ref-tables/volatile-header-names.js +33 -0
- package/lib/redirect-table.d.ts +9 -0
- package/lib/redirect-table.js +28 -0
- package/lib/release-finished-statements.d.ts +42 -0
- package/lib/release-finished-statements.js +45 -0
- package/lib/resolve-redirect-chain.d.ts +33 -0
- package/lib/resolve-redirect-chain.js +27 -0
- package/lib/resource.d.ts +46 -0
- package/lib/resource.js +62 -0
- package/lib/retarget-legacy-fk-tables.d.ts +61 -0
- package/lib/retarget-legacy-fk-tables.js +137 -0
- package/lib/safe-path.d.ts +9 -0
- package/lib/safe-path.js +17 -0
- package/lib/scope/build-scope-map.d.ts +21 -0
- package/lib/scope/build-scope-map.js +32 -0
- package/lib/scope/find-scope-entry.d.ts +25 -0
- package/lib/scope/find-scope-entry.js +45 -0
- package/lib/template-classification/classify-archive-page-templates.d.ts +42 -0
- package/lib/template-classification/classify-archive-page-templates.js +70 -0
- package/lib/template-classification/classify-page-templates.d.ts +33 -0
- package/lib/template-classification/classify-page-templates.js +60 -0
- package/lib/template-classification/collect-page-ids-with-html.d.ts +24 -0
- package/lib/template-classification/collect-page-ids-with-html.js +30 -0
- package/lib/template-classification/collect-page-stylesheet-urls.d.ts +32 -0
- package/lib/template-classification/collect-page-stylesheet-urls.js +130 -0
- package/lib/template-classification/create-content-root-hint.d.ts +41 -0
- package/lib/template-classification/create-content-root-hint.js +51 -0
- package/lib/template-classification/create-page-cluster-factory.d.ts +36 -0
- package/lib/template-classification/create-page-cluster-factory.js +52 -0
- package/lib/template-classification/load-page-cluster-candidates.d.ts +32 -0
- package/lib/template-classification/load-page-cluster-candidates.js +93 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.d.ts +34 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.js +236 -0
- package/lib/template-classification/page-cluster/types.d.ts +123 -0
- package/lib/template-classification/page-cluster/types.js +1 -0
- package/lib/template-classification/types.d.ts +234 -0
- package/lib/template-classification/types.js +1 -0
- package/lib/test-utils/build-full-schema-test-db.d.ts +34 -0
- package/lib/test-utils/build-full-schema-test-db.js +74 -0
- package/lib/test-utils/create-legacy-analysis-tables.d.ts +13 -0
- package/lib/test-utils/create-legacy-analysis-tables.js +37 -0
- package/lib/test-utils/fk-parent-tables.d.ts +15 -0
- package/lib/test-utils/fk-parent-tables.js +19 -0
- package/lib/test-utils/seed-content-item.d.ts +35 -0
- package/lib/test-utils/seed-content-item.js +42 -0
- package/lib/test-utils/setup-legacy-fk-db.d.ts +34 -0
- package/lib/test-utils/setup-legacy-fk-db.js +271 -0
- package/lib/transfer/attach-source-database.d.ts +31 -0
- package/lib/transfer/attach-source-database.js +40 -0
- package/lib/transfer/build-split-config.d.ts +30 -0
- package/lib/transfer/build-split-config.js +42 -0
- package/lib/transfer/clear-replaced-page-rows.d.ts +23 -0
- package/lib/transfer/clear-replaced-page-rows.js +61 -0
- package/lib/transfer/concat-archives.d.ts +55 -0
- package/lib/transfer/concat-archives.js +95 -0
- package/lib/transfer/concat-source-transfer-phases.d.ts +10 -0
- package/lib/transfer/concat-source-transfer-phases.js +17 -0
- package/lib/transfer/content-item-rank-sql.d.ts +21 -0
- package/lib/transfer/content-item-rank-sql.js +23 -0
- package/lib/transfer/copy-anchor-edges.d.ts +28 -0
- package/lib/transfer/copy-anchor-edges.js +42 -0
- package/lib/transfer/copy-dictionaries-for-concat.d.ts +39 -0
- package/lib/transfer/copy-dictionaries-for-concat.js +81 -0
- package/lib/transfer/copy-dictionaries-for-split.d.ts +29 -0
- package/lib/transfer/copy-dictionaries-for-split.js +224 -0
- package/lib/transfer/copy-header-set-children.d.ts +27 -0
- package/lib/transfer/copy-header-set-children.js +51 -0
- package/lib/transfer/copy-image-items.d.ts +21 -0
- package/lib/transfer/copy-image-items.js +62 -0
- package/lib/transfer/copy-inventory-source-lists.d.ts +30 -0
- package/lib/transfer/copy-inventory-source-lists.js +61 -0
- package/lib/transfer/copy-journal-tables.d.ts +30 -0
- package/lib/transfer/copy-journal-tables.js +56 -0
- package/lib/transfer/copy-page-console-logs.d.ts +16 -0
- package/lib/transfer/copy-page-console-logs.js +27 -0
- package/lib/transfer/copy-page-html-blobs.d.ts +31 -0
- package/lib/transfer/copy-page-html-blobs.js +43 -0
- package/lib/transfer/copy-page-meta.d.ts +27 -0
- package/lib/transfer/copy-page-meta.js +68 -0
- package/lib/transfer/copy-page-template-clusters.d.ts +31 -0
- package/lib/transfer/copy-page-template-clusters.js +56 -0
- package/lib/transfer/copy-page-template-labels.d.ts +34 -0
- package/lib/transfer/copy-page-template-labels.js +88 -0
- package/lib/transfer/copy-resource-items.d.ts +29 -0
- package/lib/transfer/copy-resource-items.js +89 -0
- package/lib/transfer/copy-resource-ref-edges.d.ts +20 -0
- package/lib/transfer/copy-resource-ref-edges.js +33 -0
- package/lib/transfer/copy-simple-page-scoped-tables.d.ts +15 -0
- package/lib/transfer/copy-simple-page-scoped-tables.js +34 -0
- package/lib/transfer/count-external-pages-in-scope.d.ts +26 -0
- package/lib/transfer/count-external-pages-in-scope.js +40 -0
- package/lib/transfer/create-transfer-temp-tables.d.ts +30 -0
- package/lib/transfer/create-transfer-temp-tables.js +59 -0
- package/lib/transfer/dictionary-copy-specs.d.ts +32 -0
- package/lib/transfer/dictionary-copy-specs.js +28 -0
- package/lib/transfer/drop-transfer-temp-tables.d.ts +9 -0
- package/lib/transfer/drop-transfer-temp-tables.js +18 -0
- package/lib/transfer/flatten-redirect-chains.d.ts +44 -0
- package/lib/transfer/flatten-redirect-chains.js +74 -0
- package/lib/transfer/insert-content-items.d.ts +35 -0
- package/lib/transfer/insert-content-items.js +116 -0
- package/lib/transfer/list-transfer-columns.d.ts +35 -0
- package/lib/transfer/list-transfer-columns.js +45 -0
- package/lib/transfer/mark-in-scope-content-items.d.ts +31 -0
- package/lib/transfer/mark-in-scope-content-items.js +54 -0
- package/lib/transfer/merge-archive-configs.d.ts +51 -0
- package/lib/transfer/merge-archive-configs.js +85 -0
- package/lib/transfer/plan-content-items-for-concat.d.ts +33 -0
- package/lib/transfer/plan-content-items-for-concat.js +51 -0
- package/lib/transfer/plan-content-items-for-split.d.ts +42 -0
- package/lib/transfer/plan-content-items-for-split.js +83 -0
- package/lib/transfer/plan-resource-items.d.ts +40 -0
- package/lib/transfer/plan-resource-items.js +69 -0
- package/lib/transfer/quote-transfer-identifier.d.ts +18 -0
- package/lib/transfer/quote-transfer-identifier.js +20 -0
- package/lib/transfer/reclassify-resource-externality.d.ts +37 -0
- package/lib/transfer/reclassify-resource-externality.js +66 -0
- package/lib/transfer/remap-redirect-dest-ids.d.ts +34 -0
- package/lib/transfer/remap-redirect-dest-ids.js +51 -0
- package/lib/transfer/replace-content-items.d.ts +39 -0
- package/lib/transfer/replace-content-items.js +83 -0
- package/lib/transfer/simple-page-scoped-tables.d.ts +25 -0
- package/lib/transfer/simple-page-scoped-tables.js +38 -0
- package/lib/transfer/split-archive.d.ts +55 -0
- package/lib/transfer/split-archive.js +98 -0
- package/lib/transfer/split-source-transfer-phases.d.ts +11 -0
- package/lib/transfer/split-source-transfer-phases.js +18 -0
- package/lib/transfer/transfer-action.d.ts +34 -0
- package/lib/transfer/transfer-action.js +32 -0
- package/lib/transfer/transfer-archive-rows.d.ts +65 -0
- package/lib/transfer/transfer-archive-rows.js +156 -0
- package/lib/transfer/transfer-dictionary-tables.d.ts +12 -0
- package/lib/transfer/transfer-dictionary-tables.js +22 -0
- package/lib/transfer/transfer-post-phases.d.ts +10 -0
- package/lib/transfer/transfer-post-phases.js +13 -0
- package/lib/transfer/transfer-source-alias.d.ts +9 -0
- package/lib/transfer/transfer-source-alias.js +9 -0
- package/lib/transfer/types.d.ts +111 -0
- package/lib/transfer/types.js +35 -0
- package/lib/types.d.ts +772 -0
- package/lib/types.js +1 -0
- package/lib/url-alias/compute-tier-a-alias-key.d.ts +44 -0
- package/lib/url-alias/compute-tier-a-alias-key.js +47 -0
- package/lib/url-alias/compute-tier-b-alias-key.d.ts +23 -0
- package/lib/url-alias/compute-tier-b-alias-key.js +26 -0
- package/lib/url-alias/group-alias-candidates.d.ts +27 -0
- package/lib/url-alias/group-alias-candidates.js +29 -0
- package/lib/url-alias/types.d.ts +12 -0
- package/lib/url-alias/types.js +1 -0
- package/lib/url-pattern/compute-shape-key.d.ts +58 -0
- package/lib/url-pattern/compute-shape-key.js +129 -0
- package/lib/url-pattern/decompose-url.d.ts +33 -0
- package/lib/url-pattern/decompose-url.js +79 -0
- package/lib/url-pattern/reconstruct-url.d.ts +15 -0
- package/lib/url-pattern/reconstruct-url.js +33 -0
- package/lib/url-sort/compute-url-sort-ranks.d.ts +30 -0
- package/lib/url-sort/compute-url-sort-ranks.js +33 -0
- package/lib/utils/array/each-splitted.d.ts +10 -0
- package/lib/utils/array/each-splitted.js +14 -0
- package/lib/utils/debug.d.ts +8 -0
- package/lib/utils/debug.js +8 -0
- package/lib/utils/error/emit-error-with-retry.d.ts +40 -0
- package/lib/utils/error/emit-error-with-retry.js +44 -0
- package/lib/utils/error/emit-error.d.ts +39 -0
- package/lib/utils/error/emit-error.js +41 -0
- package/lib/utils/object/parse-response-headers.d.ts +12 -0
- package/lib/utils/object/parse-response-headers.js +26 -0
- package/lib/utils/object/redact-request-headers.d.ts +15 -0
- package/lib/utils/object/redact-request-headers.js +27 -0
- package/lib/utils/types/types.d.ts +383 -0
- package/lib/utils/types/types.js +1 -0
- package/lib/verify-migration/capture-rejection.d.ts +24 -0
- package/lib/verify-migration/capture-rejection.js +31 -0
- package/lib/verify-migration/check-anchor-edges-count.d.ts +34 -0
- package/lib/verify-migration/check-anchor-edges-count.js +72 -0
- package/lib/verify-migration/check-anchor-edges-sum.d.ts +13 -0
- package/lib/verify-migration/check-anchor-edges-sum.js +27 -0
- package/lib/verify-migration/check-content-items-count.d.ts +16 -0
- package/lib/verify-migration/check-content-items-count.js +30 -0
- package/lib/verify-migration/check-content-type-preservation.d.ts +22 -0
- package/lib/verify-migration/check-content-type-preservation.js +40 -0
- package/lib/verify-migration/check-foreign-key-integrity.d.ts +31 -0
- package/lib/verify-migration/check-foreign-key-integrity.js +47 -0
- package/lib/verify-migration/check-image-items-count.d.ts +12 -0
- package/lib/verify-migration/check-image-items-count.js +26 -0
- package/lib/verify-migration/check-page-meta-count.d.ts +15 -0
- package/lib/verify-migration/check-page-meta-count.js +31 -0
- package/lib/verify-migration/check-reader-parity.d.ts +23 -0
- package/lib/verify-migration/check-reader-parity.js +182 -0
- package/lib/verify-migration/check-resource-items-count.d.ts +17 -0
- package/lib/verify-migration/check-resource-items-count.js +33 -0
- package/lib/verify-migration/check-url-round-trip.d.ts +43 -0
- package/lib/verify-migration/check-url-round-trip.js +112 -0
- package/lib/verify-migration/types.d.ts +70 -0
- package/lib/verify-migration/types.js +63 -0
- package/lib/verify-migration/verify-migration.d.ts +41 -0
- package/lib/verify-migration/verify-migration.js +120 -0
- package/lib/with-bulk-write-pragmas.d.ts +51 -0
- package/lib/with-bulk-write-pragmas.js +132 -0
- package/lib/write-queue.d.ts +32 -0
- package/lib/write-queue.js +55 -0
- package/package.json +360 -5
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { DATA_URI_URL_REFS_LIMIT } from '../../populate-ref-tables/data-uri-url-refs-limit.js';
|
|
2
|
+
import { upsertBlobRef } from './upsert-blob-ref.js';
|
|
3
|
+
import { upsertUrlRef } from './upsert-url-ref.js';
|
|
4
|
+
/**
|
|
5
|
+
* Routes one URL-shaped value to either `url_refs` or `blob_refs` per the
|
|
6
|
+
* data-URI threshold rule (large data URIs live in `blob_refs`, everything
|
|
7
|
+
* else in `url_refs`), upserting into whichever dictionary applies.
|
|
8
|
+
*
|
|
9
|
+
* Shared by every writer that can receive a `data:` URI in a URL-shaped
|
|
10
|
+
* column: `image_items.src` / `current_src` and `resource_items`' own
|
|
11
|
+
* identity URL. At most one of `url` / `blob` is non-null; both are `null`
|
|
12
|
+
* when the value is empty or a malformed data URI that fails to decode.
|
|
13
|
+
* @param qb - Knex instance or transaction connected to the archive DB.
|
|
14
|
+
* @param caches - The connection's write-side id caches.
|
|
15
|
+
* @param value - Raw URL-shaped value.
|
|
16
|
+
* @returns `{ url, blob }` pair with at most one non-null field.
|
|
17
|
+
* @example
|
|
18
|
+
* const slot = await resolveUrlOrBlob(trx, caches, image.src);
|
|
19
|
+
* // slot.url set for a regular URL, slot.blob set for a large data: URI.
|
|
20
|
+
*/
|
|
21
|
+
export async function resolveUrlOrBlob(qb, caches, value) {
|
|
22
|
+
if (typeof value !== 'string' || value === '') {
|
|
23
|
+
return { url: null, blob: null };
|
|
24
|
+
}
|
|
25
|
+
if (value.startsWith('data:') && value.length > DATA_URI_URL_REFS_LIMIT) {
|
|
26
|
+
return { url: null, blob: await upsertBlobRef(qb, caches, value) };
|
|
27
|
+
}
|
|
28
|
+
return { url: await upsertUrlRef(qb, caches, value), blob: null };
|
|
29
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { RetryCallOptions } from '@d-zero/shared/retry';
|
|
2
|
+
/**
|
|
3
|
+
* Default retry options shared by every `Database.*` op that wraps its
|
|
4
|
+
* knex work in {@link ../../utils/error/emit-error-with-retry.ts}
|
|
5
|
+
* (`emitErrorAndRetry`) or {@link ../../utils/error/emit-error.ts}
|
|
6
|
+
* (`emitError`, no retry). Three retries at 300 ms intervals covers the
|
|
7
|
+
* transient libsql failure modes (WAL contention, brief lock waits)
|
|
8
|
+
* without letting a genuinely broken query hang the crawler for long.
|
|
9
|
+
*
|
|
10
|
+
* Two ops deliberately do NOT use these settings and instead wrap
|
|
11
|
+
* `retryCall` themselves so they can override `label` (`getResourceByUrl`)
|
|
12
|
+
* or opt out entirely (`checkpoint`, `destroy`, `getKnex`,
|
|
13
|
+
* `setUrlOrder`, the `constructor`, and `Database.connect`). See the
|
|
14
|
+
* corresponding op files for the reasoning at each site.
|
|
15
|
+
*/
|
|
16
|
+
export declare const retrySetting: RetryCallOptions;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default retry options shared by every `Database.*` op that wraps its
|
|
3
|
+
* knex work in {@link ../../utils/error/emit-error-with-retry.ts}
|
|
4
|
+
* (`emitErrorAndRetry`) or {@link ../../utils/error/emit-error.ts}
|
|
5
|
+
* (`emitError`, no retry). Three retries at 300 ms intervals covers the
|
|
6
|
+
* transient libsql failure modes (WAL contention, brief lock waits)
|
|
7
|
+
* without letting a genuinely broken query hang the crawler for long.
|
|
8
|
+
*
|
|
9
|
+
* Two ops deliberately do NOT use these settings and instead wrap
|
|
10
|
+
* `retryCall` themselves so they can override `label` (`getResourceByUrl`)
|
|
11
|
+
* or opt out entirely (`checkpoint`, `destroy`, `getKnex`,
|
|
12
|
+
* `setUrlOrder`, the `constructor`, and `Database.connect`). See the
|
|
13
|
+
* corresponding op files for the reasoning at each site.
|
|
14
|
+
*/
|
|
15
|
+
export const retrySetting = {
|
|
16
|
+
interval: 300,
|
|
17
|
+
retries: 3,
|
|
18
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses a JSON column value, returning `null` on parse failure rather
|
|
3
|
+
* than throwing. JSON columns in `page_jsonld` (`parsed`) and `page_tags`
|
|
4
|
+
* (`categories`, `sources`) are written by `JSON.stringify` and round-trip
|
|
5
|
+
* cleanly under normal conditions; a hand-edited archive that has
|
|
6
|
+
* malformed JSON in those columns should degrade gracefully rather than
|
|
7
|
+
* propagate a parse error up to the consumer.
|
|
8
|
+
* @param value - JSON-encoded text.
|
|
9
|
+
* @returns Parsed value, or `null` if the input could not be parsed.
|
|
10
|
+
*/
|
|
11
|
+
export declare function safeParseJson(value: string): unknown;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses a JSON column value, returning `null` on parse failure rather
|
|
3
|
+
* than throwing. JSON columns in `page_jsonld` (`parsed`) and `page_tags`
|
|
4
|
+
* (`categories`, `sources`) are written by `JSON.stringify` and round-trip
|
|
5
|
+
* cleanly under normal conditions; a hand-edited archive that has
|
|
6
|
+
* malformed JSON in those columns should degrade gracefully rather than
|
|
7
|
+
* propagate a parse error up to the consumer.
|
|
8
|
+
* @param value - JSON-encoded text.
|
|
9
|
+
* @returns Parsed value, or `null` if the input could not be parsed.
|
|
10
|
+
*/
|
|
11
|
+
export function safeParseJson(value) {
|
|
12
|
+
try {
|
|
13
|
+
return JSON.parse(value);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { HeaderTableCaches } from '../../populate-ref-tables/types.js';
|
|
2
|
+
import type { PageSource } from '../../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* One cached `content_items` identity: the row id plus the provenance
|
|
5
|
+
* label at the time it was last read or written through the cache. The
|
|
6
|
+
* `source` copy lets {@link ../_shared/resolve-content-item-id.ts} apply
|
|
7
|
+
* the crawled-wins downgrade without re-reading the row on every anchor
|
|
8
|
+
* hit.
|
|
9
|
+
*/
|
|
10
|
+
export interface ContentItemCacheEntry {
|
|
11
|
+
/** `content_items.id`. */
|
|
12
|
+
id: number;
|
|
13
|
+
/** `content_items.source` as last observed / written by this process. */
|
|
14
|
+
source: PageSource;
|
|
15
|
+
/**
|
|
16
|
+
* `content_items.is_metadata_only` as last observed / written by this
|
|
17
|
+
* process. Lets {@link ../_shared/resolve-content-item-id.ts} skip a
|
|
18
|
+
* redundant `UPDATE` when a later resolution recomputes the same value.
|
|
19
|
+
*/
|
|
20
|
+
isMetadataOnly: 0 | 1;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* In-process id caches shared across one archive connection's write path.
|
|
24
|
+
*
|
|
25
|
+
* Every ref-table upsert primitive under `db-ops/_shared/` consults these
|
|
26
|
+
* maps before touching SQL. The caches are correct for the lifetime of a
|
|
27
|
+
* single writer connection because ref rows are append-only (`url_refs`,
|
|
28
|
+
* `text_refs`, `json_refs`, `blob_refs`, `content_type_refs`, header
|
|
29
|
+
* dictionaries never delete rows) and `content_items` identities
|
|
30
|
+
* (`id`, `url_id`) are never reassigned — only the cached `source` can
|
|
31
|
+
* change, and the sole writer of that column is the cache-aware downgrade
|
|
32
|
+
* in `resolve-content-item-id.ts` itself.
|
|
33
|
+
*
|
|
34
|
+
* NOT safe to share across processes or across two concurrent writer
|
|
35
|
+
* connections — the crawler holds a single writer connection per archive
|
|
36
|
+
* (enforced by the archive lock), so no such sharing exists.
|
|
37
|
+
*/
|
|
38
|
+
export interface WriteRefCaches {
|
|
39
|
+
/** `url string → url_refs.id`. */
|
|
40
|
+
readonly urlIds: Map<string, number>;
|
|
41
|
+
/** `url string → content_items` identity (id + last-known source). */
|
|
42
|
+
readonly contentItems: Map<string, ContentItemCacheEntry>;
|
|
43
|
+
/** `url string → resource_items.id`. */
|
|
44
|
+
readonly resourceIds: Map<string, number>;
|
|
45
|
+
/** `normalized content-type raw value → content_type_refs.id`. */
|
|
46
|
+
readonly contentTypeIds: Map<string, number>;
|
|
47
|
+
/** `hex(content hash) → json_refs.id`. */
|
|
48
|
+
readonly jsonIds: Map<string, number>;
|
|
49
|
+
/** `hex(content hash) → blob_refs.id`. */
|
|
50
|
+
readonly blobIds: Map<string, number>;
|
|
51
|
+
/** `hex(content hash) → console_log_items.id`. */
|
|
52
|
+
readonly consoleLogIds: Map<string, number>;
|
|
53
|
+
/**
|
|
54
|
+
* Header dictionary caches (`header_name_refs` / `header_value_refs` /
|
|
55
|
+
* `header_sets` id maps). `null` until the first header-set upsert
|
|
56
|
+
* warms them from the DB — warming issues three SELECTs, which a
|
|
57
|
+
* crawl that never stores headers (e.g. list-mode with no responses)
|
|
58
|
+
* should not pay for.
|
|
59
|
+
*/
|
|
60
|
+
headers: HeaderTableCaches | null;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Optional per-call flags for {@link ../_shared/resolve-content-item-id.ts}.
|
|
64
|
+
*/
|
|
65
|
+
export interface ResolveContentItemIdOptions {
|
|
66
|
+
/**
|
|
67
|
+
* `1` marks the row as an external URL that will never be scraped as a
|
|
68
|
+
* target. Recorded on new inserts only. Defaults to `0` (in-scope) on
|
|
69
|
+
* insert, mirroring the legacy column default.
|
|
70
|
+
*/
|
|
71
|
+
isExternal?: 0 | 1;
|
|
72
|
+
/**
|
|
73
|
+
* Provenance label put on a newly-inserted row. Omit to let the
|
|
74
|
+
* `content_items.source` DEFAULT (`'crawled'`) apply. Pass `'crawled'`
|
|
75
|
+
* to arm the crawled-wins downgrade on existing inventory-labelled rows.
|
|
76
|
+
*/
|
|
77
|
+
source?: PageSource;
|
|
78
|
+
/**
|
|
79
|
+
* `1` marks the row as fated for a metadata-only (title-only) scrape
|
|
80
|
+
* rather than a full one, `0` explicitly marks it as a full-scrape
|
|
81
|
+
* target. Omit (the default for every caller except
|
|
82
|
+
* `replaceAnchorEdges`) to leave the column untouched — those callers
|
|
83
|
+
* (redirects, resources, errors, skipped pages, console logs) have no
|
|
84
|
+
* opinion on scrape depth and must not clobber a value an
|
|
85
|
+
* anchor-discovery call already established.
|
|
86
|
+
* `!options.recursive || anchor.isExternal` is a pure function of the
|
|
87
|
+
* URL within one crawl session (`recursive` is session-constant,
|
|
88
|
+
* `isExternal` depends only on scope matching), so every anchor-path
|
|
89
|
+
* call for the same URL always recomputes the same value — there is no
|
|
90
|
+
* real conflict to arbitrate between two *opinionated* calls, only
|
|
91
|
+
* between an opinionated call and the unopinionated majority.
|
|
92
|
+
*/
|
|
93
|
+
isMetadataOnly?: 0 | 1;
|
|
94
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { WriteRefCaches } from './types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Resolves the `blob_refs.id` for one large `data:` URI, decoding and
|
|
5
|
+
* inserting the deduplicated (hash-keyed) payload row when it is new.
|
|
6
|
+
*
|
|
7
|
+
* Callers route values here per the data-URI threshold rule (`data:` URIs
|
|
8
|
+
* longer than `DATA_URI_URL_REFS_LIMIT` — everything else belongs in
|
|
9
|
+
* `url_refs`). The payload bytes are decoded from the base64 /
|
|
10
|
+
* percent-encoded tail, hashed, and stored zstd-compressed — the same
|
|
11
|
+
* storage contract as the rows produced when migrating an existing
|
|
12
|
+
* archive (`populate-ref-tables/populate-blob-refs.ts`).
|
|
13
|
+
*
|
|
14
|
+
* Returns `null` when the data URI fails to decode (malformed base64 /
|
|
15
|
+
* truncated percent escape). A single malformed image `src` must not
|
|
16
|
+
* abort the page write; the caller stores `*_blob_id = null` and the
|
|
17
|
+
* information loss is limited to that one slot.
|
|
18
|
+
* @param qb - Knex instance or transaction connected to the archive DB.
|
|
19
|
+
* @param caches - The connection's write-side id caches; mutated in place.
|
|
20
|
+
* @param dataUri - The raw `data:` URI value.
|
|
21
|
+
* @returns The `blob_refs.id`, or `null` when the URI cannot be decoded.
|
|
22
|
+
* @example
|
|
23
|
+
* const id = await upsertBlobRef(knex, caches, 'data:image/png;base64,<payload>');
|
|
24
|
+
*/
|
|
25
|
+
export declare function upsertBlobRef(qb: Knex | Knex.Transaction, caches: WriteRefCaches, dataUri: string): Promise<number | null>;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { zstdCompressSync } from 'node:zlib';
|
|
2
|
+
import { computeContentHash } from '../../populate-ref-tables/compute-content-hash.js';
|
|
3
|
+
import { decodeDataUri } from '../../populate-ref-tables/decode-data-uri.js';
|
|
4
|
+
/**
|
|
5
|
+
* Resolves the `blob_refs.id` for one large `data:` URI, decoding and
|
|
6
|
+
* inserting the deduplicated (hash-keyed) payload row when it is new.
|
|
7
|
+
*
|
|
8
|
+
* Callers route values here per the data-URI threshold rule (`data:` URIs
|
|
9
|
+
* longer than `DATA_URI_URL_REFS_LIMIT` — everything else belongs in
|
|
10
|
+
* `url_refs`). The payload bytes are decoded from the base64 /
|
|
11
|
+
* percent-encoded tail, hashed, and stored zstd-compressed — the same
|
|
12
|
+
* storage contract as the rows produced when migrating an existing
|
|
13
|
+
* archive (`populate-ref-tables/populate-blob-refs.ts`).
|
|
14
|
+
*
|
|
15
|
+
* Returns `null` when the data URI fails to decode (malformed base64 /
|
|
16
|
+
* truncated percent escape). A single malformed image `src` must not
|
|
17
|
+
* abort the page write; the caller stores `*_blob_id = null` and the
|
|
18
|
+
* information loss is limited to that one slot.
|
|
19
|
+
* @param qb - Knex instance or transaction connected to the archive DB.
|
|
20
|
+
* @param caches - The connection's write-side id caches; mutated in place.
|
|
21
|
+
* @param dataUri - The raw `data:` URI value.
|
|
22
|
+
* @returns The `blob_refs.id`, or `null` when the URI cannot be decoded.
|
|
23
|
+
* @example
|
|
24
|
+
* const id = await upsertBlobRef(knex, caches, 'data:image/png;base64,<payload>');
|
|
25
|
+
*/
|
|
26
|
+
export async function upsertBlobRef(qb, caches, dataUri) {
|
|
27
|
+
const decoded = decodeDataUri(dataUri);
|
|
28
|
+
if (decoded === null) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const hash = computeContentHash(decoded.bytes);
|
|
32
|
+
const hex = hash.toString('hex');
|
|
33
|
+
const cached = caches.blobIds.get(hex);
|
|
34
|
+
if (cached !== undefined) {
|
|
35
|
+
return cached;
|
|
36
|
+
}
|
|
37
|
+
const compressed = zstdCompressSync(decoded.bytes);
|
|
38
|
+
const rows = await qb.raw(`INSERT INTO blob_refs (hash, body, codec, size_raw, size_stored)
|
|
39
|
+
VALUES (?, ?, 'zstd', ?, ?)
|
|
40
|
+
ON CONFLICT(hash) DO UPDATE SET hash = hash
|
|
41
|
+
RETURNING id`, [hash, compressed, decoded.bytes.byteLength, compressed.byteLength]);
|
|
42
|
+
const first = rows[0];
|
|
43
|
+
if (first === undefined) {
|
|
44
|
+
throw new Error('upsertBlobRef: RETURNING yielded no row');
|
|
45
|
+
}
|
|
46
|
+
caches.blobIds.set(hex, first.id);
|
|
47
|
+
return first.id;
|
|
48
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { WriteRefCaches } from './types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Resolves the `content_type_refs.id` for one content-type value,
|
|
5
|
+
* inserting the dictionary row when the value is new.
|
|
6
|
+
*
|
|
7
|
+
* `raw` is expected to be the already-canonicalised form produced by
|
|
8
|
+
* `normalizeContentType` (lower-cased, trimmed) — the write path
|
|
9
|
+
* canonicalises before storing, exactly as the legacy `pages.contentType`
|
|
10
|
+
* column did, so the dictionary's natural key never forks on case or
|
|
11
|
+
* whitespace variants of the same MIME. `normalized` is derived via the
|
|
12
|
+
* shared {@link ../../populate-ref-tables/normalize-mime.ts} (the same
|
|
13
|
+
* derivation the archive-migration populate uses, so live-crawl rows and
|
|
14
|
+
* migrated rows never fork on the same raw value); `category` via
|
|
15
|
+
* {@link ../../populate-ref-tables/classify-content-type.ts}.
|
|
16
|
+
*
|
|
17
|
+
* The content-type space is tiny (well under 1 000 distinct values on
|
|
18
|
+
* even the largest archives) so the cache converges after the first few
|
|
19
|
+
* pages and steady-state calls issue no SQL.
|
|
20
|
+
* @param qb - Knex instance or transaction connected to the archive DB.
|
|
21
|
+
* @param caches - The connection's write-side id caches; mutated in place.
|
|
22
|
+
* @param raw - Canonicalised content-type value. Pass the output of
|
|
23
|
+
* `normalizeContentType`; `null` / empty input must be short-circuited
|
|
24
|
+
* by the caller (a row without a content type stores `content_type_id
|
|
25
|
+
* = null`, not a dictionary entry).
|
|
26
|
+
* @returns The `content_type_refs.id` of the existing or new row.
|
|
27
|
+
* @example
|
|
28
|
+
* const id = await upsertContentTypeRef(knex, caches, 'text/html');
|
|
29
|
+
*/
|
|
30
|
+
export declare function upsertContentTypeRef(qb: Knex | Knex.Transaction, caches: WriteRefCaches, raw: string): Promise<number>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { classifyContentType } from '../../populate-ref-tables/classify-content-type.js';
|
|
2
|
+
import { normalizeMime } from '../../populate-ref-tables/normalize-mime.js';
|
|
3
|
+
/**
|
|
4
|
+
* Resolves the `content_type_refs.id` for one content-type value,
|
|
5
|
+
* inserting the dictionary row when the value is new.
|
|
6
|
+
*
|
|
7
|
+
* `raw` is expected to be the already-canonicalised form produced by
|
|
8
|
+
* `normalizeContentType` (lower-cased, trimmed) — the write path
|
|
9
|
+
* canonicalises before storing, exactly as the legacy `pages.contentType`
|
|
10
|
+
* column did, so the dictionary's natural key never forks on case or
|
|
11
|
+
* whitespace variants of the same MIME. `normalized` is derived via the
|
|
12
|
+
* shared {@link ../../populate-ref-tables/normalize-mime.ts} (the same
|
|
13
|
+
* derivation the archive-migration populate uses, so live-crawl rows and
|
|
14
|
+
* migrated rows never fork on the same raw value); `category` via
|
|
15
|
+
* {@link ../../populate-ref-tables/classify-content-type.ts}.
|
|
16
|
+
*
|
|
17
|
+
* The content-type space is tiny (well under 1 000 distinct values on
|
|
18
|
+
* even the largest archives) so the cache converges after the first few
|
|
19
|
+
* pages and steady-state calls issue no SQL.
|
|
20
|
+
* @param qb - Knex instance or transaction connected to the archive DB.
|
|
21
|
+
* @param caches - The connection's write-side id caches; mutated in place.
|
|
22
|
+
* @param raw - Canonicalised content-type value. Pass the output of
|
|
23
|
+
* `normalizeContentType`; `null` / empty input must be short-circuited
|
|
24
|
+
* by the caller (a row without a content type stores `content_type_id
|
|
25
|
+
* = null`, not a dictionary entry).
|
|
26
|
+
* @returns The `content_type_refs.id` of the existing or new row.
|
|
27
|
+
* @example
|
|
28
|
+
* const id = await upsertContentTypeRef(knex, caches, 'text/html');
|
|
29
|
+
*/
|
|
30
|
+
export async function upsertContentTypeRef(qb, caches, raw) {
|
|
31
|
+
const cached = caches.contentTypeIds.get(raw);
|
|
32
|
+
if (cached !== undefined) {
|
|
33
|
+
return cached;
|
|
34
|
+
}
|
|
35
|
+
const rows = await qb.raw(`INSERT INTO content_type_refs (raw, normalized, category)
|
|
36
|
+
VALUES (?, ?, ?)
|
|
37
|
+
ON CONFLICT(raw) DO UPDATE SET raw = raw
|
|
38
|
+
RETURNING id`, [raw, normalizeMime(raw), classifyContentType(raw)]);
|
|
39
|
+
const first = rows[0];
|
|
40
|
+
if (first === undefined) {
|
|
41
|
+
throw new Error(`upsertContentTypeRef: RETURNING yielded no row for ${raw}`);
|
|
42
|
+
}
|
|
43
|
+
caches.contentTypeIds.set(raw, first.id);
|
|
44
|
+
return first.id;
|
|
45
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { WriteRefCaches } from './types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Resolves the `json_refs.id` for one JSON payload string, inserting the
|
|
5
|
+
* deduplicated (hash-keyed) row when the payload is new.
|
|
6
|
+
*
|
|
7
|
+
* The payload is hashed over its raw UTF-8 bytes and stored
|
|
8
|
+
* zstd-compressed (`codec = 'zstd'`) with `size_raw` / `size_stored`
|
|
9
|
+
* bookkeeping — the same storage contract as `page_html_blobs` and the
|
|
10
|
+
* dictionary rows produced when migrating an existing archive
|
|
11
|
+
* (`populate-ref-tables/populate-json-refs.ts`). Identical payloads
|
|
12
|
+
* (e.g. the same `meta_extras` JSON across templated pages) produce one
|
|
13
|
+
* row; the compression cost is paid only on a cache-and-DB miss.
|
|
14
|
+
* @param qb - Knex instance or transaction connected to the archive DB.
|
|
15
|
+
* @param caches - The connection's write-side id caches; mutated in place.
|
|
16
|
+
* @param jsonText - Raw JSON string. Empty / null input must be
|
|
17
|
+
* short-circuited by the caller (`*_json_id = null`).
|
|
18
|
+
* @returns The `json_refs.id` of the existing or new row.
|
|
19
|
+
* @example
|
|
20
|
+
* const id = await upsertJsonRef(knex, caches, JSON.stringify(extras));
|
|
21
|
+
*/
|
|
22
|
+
export declare function upsertJsonRef(qb: Knex | Knex.Transaction, caches: WriteRefCaches, jsonText: string): Promise<number>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { computeContentHash } from '../../populate-ref-tables/compute-content-hash.js';
|
|
2
|
+
import { compressPayload } from './compress-payload.js';
|
|
3
|
+
/**
|
|
4
|
+
* Resolves the `json_refs.id` for one JSON payload string, inserting the
|
|
5
|
+
* deduplicated (hash-keyed) row when the payload is new.
|
|
6
|
+
*
|
|
7
|
+
* The payload is hashed over its raw UTF-8 bytes and stored
|
|
8
|
+
* zstd-compressed (`codec = 'zstd'`) with `size_raw` / `size_stored`
|
|
9
|
+
* bookkeeping — the same storage contract as `page_html_blobs` and the
|
|
10
|
+
* dictionary rows produced when migrating an existing archive
|
|
11
|
+
* (`populate-ref-tables/populate-json-refs.ts`). Identical payloads
|
|
12
|
+
* (e.g. the same `meta_extras` JSON across templated pages) produce one
|
|
13
|
+
* row; the compression cost is paid only on a cache-and-DB miss.
|
|
14
|
+
* @param qb - Knex instance or transaction connected to the archive DB.
|
|
15
|
+
* @param caches - The connection's write-side id caches; mutated in place.
|
|
16
|
+
* @param jsonText - Raw JSON string. Empty / null input must be
|
|
17
|
+
* short-circuited by the caller (`*_json_id = null`).
|
|
18
|
+
* @returns The `json_refs.id` of the existing or new row.
|
|
19
|
+
* @example
|
|
20
|
+
* const id = await upsertJsonRef(knex, caches, JSON.stringify(extras));
|
|
21
|
+
*/
|
|
22
|
+
export async function upsertJsonRef(qb, caches, jsonText) {
|
|
23
|
+
const rawBytes = Buffer.from(jsonText, 'utf8');
|
|
24
|
+
const hash = computeContentHash(rawBytes);
|
|
25
|
+
const hex = hash.toString('hex');
|
|
26
|
+
const cached = caches.jsonIds.get(hex);
|
|
27
|
+
if (cached !== undefined) {
|
|
28
|
+
return cached;
|
|
29
|
+
}
|
|
30
|
+
const { body, sizeRaw, sizeStored } = compressPayload(rawBytes);
|
|
31
|
+
const rows = await qb.raw(`INSERT INTO json_refs (hash, json_text, codec, size_raw, size_stored)
|
|
32
|
+
VALUES (?, ?, 'zstd', ?, ?)
|
|
33
|
+
ON CONFLICT(hash) DO UPDATE SET hash = hash
|
|
34
|
+
RETURNING id`, [hash, body, sizeRaw, sizeStored]);
|
|
35
|
+
const first = rows[0];
|
|
36
|
+
if (first === undefined) {
|
|
37
|
+
throw new Error('upsertJsonRef: RETURNING yielded no row');
|
|
38
|
+
}
|
|
39
|
+
caches.jsonIds.set(hex, first.id);
|
|
40
|
+
return first.id;
|
|
41
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { WriteRefCaches } from './types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Decomposes one response's headers and upserts them into the header
|
|
5
|
+
* dictionary tables (`header_name_refs` / `header_value_refs` /
|
|
6
|
+
* `header_sets` / `header_set_entries` / `header_flags`), returning the
|
|
7
|
+
* `header_sets.id` to store on the referring `content_items` /
|
|
8
|
+
* `resource_items` row.
|
|
9
|
+
*
|
|
10
|
+
* Runs per response (incrementally during the crawl), not deferred to
|
|
11
|
+
* crawl-end — the header dictionaries grow as pages arrive and the
|
|
12
|
+
* entity row can reference its `header_set_id` in the same write.
|
|
13
|
+
* Dedup makes the steady-state cost small: CDN-served sites reuse a
|
|
14
|
+
* handful of header shapes, so after the first few pages most calls
|
|
15
|
+
* resolve entirely from the in-process caches (warmed lazily from the DB
|
|
16
|
+
* on the first call, so a crawl that never sees headers pays nothing).
|
|
17
|
+
*
|
|
18
|
+
* Returns `null` for responses with no headers (`null` / `{}` /
|
|
19
|
+
* unparsable) — the referring row stores `header_set_id = null`, which
|
|
20
|
+
* is exactly how such rows read back through `header_flags` joins
|
|
21
|
+
* (absent flags row = no headers recorded).
|
|
22
|
+
* @param qb - Knex instance or transaction connected to the archive DB.
|
|
23
|
+
* @param caches - The connection's write-side id caches; the header
|
|
24
|
+
* sub-caches are created and attached on first use.
|
|
25
|
+
* @param responseHeaders - The response's header record as delivered by
|
|
26
|
+
* the scraper (`Record<name, string | string[]>`), or `null` /
|
|
27
|
+
* `undefined` when the response carried none.
|
|
28
|
+
* @returns The `header_sets.id`, or `null` when there is no set to store.
|
|
29
|
+
* @example
|
|
30
|
+
* const headerSetId = await upsertResponseHeaders(knex, caches, {
|
|
31
|
+
* 'content-type': 'text/html',
|
|
32
|
+
* 'cache-control': 'no-store',
|
|
33
|
+
* });
|
|
34
|
+
*/
|
|
35
|
+
export declare function upsertResponseHeaders(qb: Knex | Knex.Transaction, caches: WriteRefCaches, responseHeaders: Record<string, string | string[] | undefined> | null | undefined): Promise<number | null>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { createHeaderTableCaches } from '../../populate-ref-tables/create-header-table-caches.js';
|
|
2
|
+
import { decomposeHeaderSet } from '../../populate-ref-tables/decompose-header-set.js';
|
|
3
|
+
import { upsertOneHeaderSet } from '../../populate-ref-tables/upsert-one-header-set.js';
|
|
4
|
+
/**
|
|
5
|
+
* Decomposes one response's headers and upserts them into the header
|
|
6
|
+
* dictionary tables (`header_name_refs` / `header_value_refs` /
|
|
7
|
+
* `header_sets` / `header_set_entries` / `header_flags`), returning the
|
|
8
|
+
* `header_sets.id` to store on the referring `content_items` /
|
|
9
|
+
* `resource_items` row.
|
|
10
|
+
*
|
|
11
|
+
* Runs per response (incrementally during the crawl), not deferred to
|
|
12
|
+
* crawl-end — the header dictionaries grow as pages arrive and the
|
|
13
|
+
* entity row can reference its `header_set_id` in the same write.
|
|
14
|
+
* Dedup makes the steady-state cost small: CDN-served sites reuse a
|
|
15
|
+
* handful of header shapes, so after the first few pages most calls
|
|
16
|
+
* resolve entirely from the in-process caches (warmed lazily from the DB
|
|
17
|
+
* on the first call, so a crawl that never sees headers pays nothing).
|
|
18
|
+
*
|
|
19
|
+
* Returns `null` for responses with no headers (`null` / `{}` /
|
|
20
|
+
* unparsable) — the referring row stores `header_set_id = null`, which
|
|
21
|
+
* is exactly how such rows read back through `header_flags` joins
|
|
22
|
+
* (absent flags row = no headers recorded).
|
|
23
|
+
* @param qb - Knex instance or transaction connected to the archive DB.
|
|
24
|
+
* @param caches - The connection's write-side id caches; the header
|
|
25
|
+
* sub-caches are created and attached on first use.
|
|
26
|
+
* @param responseHeaders - The response's header record as delivered by
|
|
27
|
+
* the scraper (`Record<name, string | string[]>`), or `null` /
|
|
28
|
+
* `undefined` when the response carried none.
|
|
29
|
+
* @returns The `header_sets.id`, or `null` when there is no set to store.
|
|
30
|
+
* @example
|
|
31
|
+
* const headerSetId = await upsertResponseHeaders(knex, caches, {
|
|
32
|
+
* 'content-type': 'text/html',
|
|
33
|
+
* 'cache-control': 'no-store',
|
|
34
|
+
* });
|
|
35
|
+
*/
|
|
36
|
+
export async function upsertResponseHeaders(qb, caches, responseHeaders) {
|
|
37
|
+
// Serialise exactly like the scraper's own JSON storage form so the
|
|
38
|
+
// decomposition (and its raw_json_hash dedup key) matches what a bulk
|
|
39
|
+
// archive populate would compute for the same response.
|
|
40
|
+
const rawJson = responseHeaders == null ? null : JSON.stringify(responseHeaders);
|
|
41
|
+
const decomposed = decomposeHeaderSet(rawJson);
|
|
42
|
+
if (decomposed === null) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
if (caches.headers === null) {
|
|
46
|
+
caches.headers = await createHeaderTableCaches(qb);
|
|
47
|
+
}
|
|
48
|
+
return await upsertOneHeaderSet(qb, decomposed, caches.headers);
|
|
49
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { WriteRefCaches } from './types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Resolves the `url_refs.id` for one URL string, inserting the row (with
|
|
5
|
+
* its decomposed `scheme` / `host` / `port` / `path` / `query_hash` /
|
|
6
|
+
* `fragment` columns) when the URL is not yet in the dictionary.
|
|
7
|
+
*
|
|
8
|
+
* The write path calls this for every URL it touches — page identities,
|
|
9
|
+
* anchor hrefs, image `src` / `currentSrc`, resource URLs, and URL-shaped
|
|
10
|
+
* meta columns — so the result is cached in `caches.urlIds` and a cache
|
|
11
|
+
* hit issues no SQL at all. Anchor hrefs and CDN-hosted image URLs repeat
|
|
12
|
+
* across thousands of pages, so the hit rate dominates after the first
|
|
13
|
+
* few pages.
|
|
14
|
+
*
|
|
15
|
+
* The cache-miss upsert is a single statement:
|
|
16
|
+
*
|
|
17
|
+
* ```sql
|
|
18
|
+
* INSERT INTO url_refs (...) VALUES (...)
|
|
19
|
+
* ON CONFLICT(url) DO UPDATE SET url = url
|
|
20
|
+
* RETURNING id
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* `DO UPDATE SET url = url` is a deliberate no-op update whose only
|
|
24
|
+
* purpose is to make `RETURNING id` yield the existing row's id on
|
|
25
|
+
* conflict. `INSERT OR IGNORE ... RETURNING id` must NOT be used here:
|
|
26
|
+
* `RETURNING` returns zero rows when the insert is ignored, which would
|
|
27
|
+
* leave the caller with no id and a `null` FK on the next entity INSERT.
|
|
28
|
+
* @param qb - Knex instance or transaction connected to the archive DB.
|
|
29
|
+
* Callers inside a transaction MUST pass the `trx` so the read sees
|
|
30
|
+
* uncommitted rows from the same transaction.
|
|
31
|
+
* @param caches - The connection's write-side id caches; mutated in place.
|
|
32
|
+
* @param url - The URL string to resolve. Stored verbatim as the natural key.
|
|
33
|
+
* @returns The `url_refs.id` of the existing or newly inserted row.
|
|
34
|
+
* @example
|
|
35
|
+
* const id = await upsertUrlRef(knex, caches, 'https://example.com/a');
|
|
36
|
+
* const again = await upsertUrlRef(knex, caches, 'https://example.com/a');
|
|
37
|
+
* // id === again, second call hits the cache and issues no SQL
|
|
38
|
+
*/
|
|
39
|
+
export declare function upsertUrlRef(qb: Knex | Knex.Transaction, caches: WriteRefCaches, url: string): Promise<number>;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { decomposeUrl } from '../../populate-ref-tables/decompose-url.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolves the `url_refs.id` for one URL string, inserting the row (with
|
|
4
|
+
* its decomposed `scheme` / `host` / `port` / `path` / `query_hash` /
|
|
5
|
+
* `fragment` columns) when the URL is not yet in the dictionary.
|
|
6
|
+
*
|
|
7
|
+
* The write path calls this for every URL it touches — page identities,
|
|
8
|
+
* anchor hrefs, image `src` / `currentSrc`, resource URLs, and URL-shaped
|
|
9
|
+
* meta columns — so the result is cached in `caches.urlIds` and a cache
|
|
10
|
+
* hit issues no SQL at all. Anchor hrefs and CDN-hosted image URLs repeat
|
|
11
|
+
* across thousands of pages, so the hit rate dominates after the first
|
|
12
|
+
* few pages.
|
|
13
|
+
*
|
|
14
|
+
* The cache-miss upsert is a single statement:
|
|
15
|
+
*
|
|
16
|
+
* ```sql
|
|
17
|
+
* INSERT INTO url_refs (...) VALUES (...)
|
|
18
|
+
* ON CONFLICT(url) DO UPDATE SET url = url
|
|
19
|
+
* RETURNING id
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* `DO UPDATE SET url = url` is a deliberate no-op update whose only
|
|
23
|
+
* purpose is to make `RETURNING id` yield the existing row's id on
|
|
24
|
+
* conflict. `INSERT OR IGNORE ... RETURNING id` must NOT be used here:
|
|
25
|
+
* `RETURNING` returns zero rows when the insert is ignored, which would
|
|
26
|
+
* leave the caller with no id and a `null` FK on the next entity INSERT.
|
|
27
|
+
* @param qb - Knex instance or transaction connected to the archive DB.
|
|
28
|
+
* Callers inside a transaction MUST pass the `trx` so the read sees
|
|
29
|
+
* uncommitted rows from the same transaction.
|
|
30
|
+
* @param caches - The connection's write-side id caches; mutated in place.
|
|
31
|
+
* @param url - The URL string to resolve. Stored verbatim as the natural key.
|
|
32
|
+
* @returns The `url_refs.id` of the existing or newly inserted row.
|
|
33
|
+
* @example
|
|
34
|
+
* const id = await upsertUrlRef(knex, caches, 'https://example.com/a');
|
|
35
|
+
* const again = await upsertUrlRef(knex, caches, 'https://example.com/a');
|
|
36
|
+
* // id === again, second call hits the cache and issues no SQL
|
|
37
|
+
*/
|
|
38
|
+
export async function upsertUrlRef(qb, caches, url) {
|
|
39
|
+
const cached = caches.urlIds.get(url);
|
|
40
|
+
if (cached !== undefined) {
|
|
41
|
+
return cached;
|
|
42
|
+
}
|
|
43
|
+
const decomposed = decomposeUrl(url);
|
|
44
|
+
const rows = await qb.raw(`INSERT INTO url_refs (url, scheme, host, port, path, query_hash, fragment)
|
|
45
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
46
|
+
ON CONFLICT(url) DO UPDATE SET url = url
|
|
47
|
+
RETURNING id`, [
|
|
48
|
+
url,
|
|
49
|
+
decomposed.scheme,
|
|
50
|
+
decomposed.host,
|
|
51
|
+
decomposed.port,
|
|
52
|
+
decomposed.path,
|
|
53
|
+
decomposed.query_hash,
|
|
54
|
+
decomposed.fragment,
|
|
55
|
+
]);
|
|
56
|
+
const first = rows[0];
|
|
57
|
+
if (first === undefined) {
|
|
58
|
+
throw new Error(`upsertUrlRef: RETURNING yielded no row for ${url}`);
|
|
59
|
+
}
|
|
60
|
+
caches.urlIds.set(url, first.id);
|
|
61
|
+
return first.id;
|
|
62
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Retrieves all anchors (outgoing links) on a specific page.
|
|
4
|
+
* Joins `anchor_edges` with `content_items` (+ `page_meta` for title) to
|
|
5
|
+
* resolve link destinations.
|
|
6
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
7
|
+
* @param pageId - The database ID of the page whose anchors to retrieve.
|
|
8
|
+
* @returns An array of anchor records with resolved URL, title, status, and content type.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getAnchorsOnPage(knex: Knex, pageId: number): Promise<any[]>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retrieves all anchors (outgoing links) on a specific page.
|
|
3
|
+
* Joins `anchor_edges` with `content_items` (+ `page_meta` for title) to
|
|
4
|
+
* resolve link destinations.
|
|
5
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
6
|
+
* @param pageId - The database ID of the page whose anchors to retrieve.
|
|
7
|
+
* @returns An array of anchor records with resolved URL, title, status, and content type.
|
|
8
|
+
*/
|
|
9
|
+
export async function getAnchorsOnPage(knex, pageId) {
|
|
10
|
+
const res = await knex
|
|
11
|
+
.select('dest_url.url as url', 'title_ref.text as title', 'dest.status as status', 'dest.status_text as statusText', 'ctr.raw as contentType', 'anchor_edges.first_hash as hash', 'first_text.text as textContent')
|
|
12
|
+
.from('anchor_edges')
|
|
13
|
+
.join('content_items as dest', 'anchor_edges.href_page_id', '=', 'dest.id')
|
|
14
|
+
.join('url_refs as dest_url', 'dest.url_id', '=', 'dest_url.id')
|
|
15
|
+
.leftJoin('content_type_refs as ctr', 'dest.content_type_id', '=', 'ctr.id')
|
|
16
|
+
.leftJoin('page_meta as pm', 'dest.id', '=', 'pm.page_id')
|
|
17
|
+
.leftJoin('text_refs as title_ref', 'pm.title_text_id', '=', 'title_ref.id')
|
|
18
|
+
.leftJoin('text_refs as first_text', 'anchor_edges.first_text_id', '=', 'first_text.id')
|
|
19
|
+
.where('anchor_edges.page_id', pageId);
|
|
20
|
+
return res;
|
|
21
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Retrieves the base URL of the crawl session from the `info` table.
|
|
4
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
5
|
+
* @returns The base URL string.
|
|
6
|
+
* @throws {Error} If no base URL is found in the database.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getBaseUrl(knex: Knex): Promise<string>;
|