@nitpicker/archive 0.0.0 → 0.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +106 -0
- package/lib/apply-connection-pragmas.d.ts +18 -0
- package/lib/apply-connection-pragmas.js +40 -0
- package/lib/archive-accessor.d.ts +265 -0
- package/lib/archive-accessor.js +477 -0
- package/lib/archive-lock.d.ts +45 -0
- package/lib/archive-lock.js +154 -0
- package/lib/archive.d.ts +736 -0
- package/lib/archive.js +1055 -0
- package/lib/body-hash/compute-body-hash.d.ts +32 -0
- package/lib/body-hash/compute-body-hash.js +35 -0
- package/lib/cache/clear-archive-cache-entry.d.ts +18 -0
- package/lib/cache/clear-archive-cache-entry.js +24 -0
- package/lib/cache/clear-archive-cache-root.d.ts +26 -0
- package/lib/cache/clear-archive-cache-root.js +32 -0
- package/lib/cache/compute-archive-cache-key.d.ts +39 -0
- package/lib/cache/compute-archive-cache-key.js +95 -0
- package/lib/cache/extract-archive-to-cache.d.ts +57 -0
- package/lib/cache/extract-archive-to-cache.js +326 -0
- package/lib/cache/get-archive-cache-root.d.ts +20 -0
- package/lib/cache/get-archive-cache-root.js +53 -0
- package/lib/cache/is-archive-cache-disabled.d.ts +24 -0
- package/lib/cache/is-archive-cache-disabled.js +34 -0
- package/lib/cache/list-archive-cache-entries.d.ts +23 -0
- package/lib/cache/list-archive-cache-entries.js +130 -0
- package/lib/cache/path-exists.d.ts +9 -0
- package/lib/cache/path-exists.js +18 -0
- package/lib/cache/resolve-archive-cache-dir.d.ts +26 -0
- package/lib/cache/resolve-archive-cache-dir.js +32 -0
- package/lib/cache/types.d.ts +33 -0
- package/lib/cache/types.js +1 -0
- package/lib/content-type/is-html-content-type.d.ts +17 -0
- package/lib/content-type/is-html-content-type.js +19 -0
- package/lib/content-type/normalize-content-type.d.ts +14 -0
- package/lib/content-type/normalize-content-type.js +20 -0
- package/lib/create-adjunct-tables.d.ts +66 -0
- package/lib/create-adjunct-tables.js +510 -0
- package/lib/create-entity-tables.d.ts +191 -0
- package/lib/create-entity-tables.js +387 -0
- package/lib/create-progress-reporter.d.ts +30 -0
- package/lib/create-progress-reporter.js +38 -0
- package/lib/create-ref-tables.d.ts +35 -0
- package/lib/create-ref-tables.js +185 -0
- package/lib/create-template-tables.d.ts +28 -0
- package/lib/create-template-tables.js +92 -0
- package/lib/database.d.ts +549 -0
- package/lib/database.js +803 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.d.ts +27 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.js +35 -0
- package/lib/db-ops/_shared/compress-payload.d.ts +26 -0
- package/lib/db-ops/_shared/compress-payload.js +30 -0
- package/lib/db-ops/_shared/create-write-ref-caches.d.ts +17 -0
- package/lib/db-ops/_shared/create-write-ref-caches.js +27 -0
- package/lib/db-ops/_shared/decode-json-ref.d.ts +17 -0
- package/lib/db-ops/_shared/decode-json-ref.js +31 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.d.ts +49 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.js +69 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.d.ts +20 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.js +53 -0
- package/lib/db-ops/_shared/resolve-content-item-id.d.ts +62 -0
- package/lib/db-ops/_shared/resolve-content-item-id.js +143 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.d.ts +23 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.js +29 -0
- package/lib/db-ops/_shared/retry-setting.d.ts +16 -0
- package/lib/db-ops/_shared/retry-setting.js +18 -0
- package/lib/db-ops/_shared/safe-parse-json.d.ts +11 -0
- package/lib/db-ops/_shared/safe-parse-json.js +18 -0
- package/lib/db-ops/_shared/types.d.ts +94 -0
- package/lib/db-ops/_shared/types.js +1 -0
- package/lib/db-ops/_shared/upsert-blob-ref.d.ts +25 -0
- package/lib/db-ops/_shared/upsert-blob-ref.js +48 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.d.ts +30 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.js +45 -0
- package/lib/db-ops/_shared/upsert-json-ref.d.ts +22 -0
- package/lib/db-ops/_shared/upsert-json-ref.js +41 -0
- package/lib/db-ops/_shared/upsert-response-headers.d.ts +35 -0
- package/lib/db-ops/_shared/upsert-response-headers.js +49 -0
- package/lib/db-ops/_shared/upsert-url-ref.d.ts +39 -0
- package/lib/db-ops/_shared/upsert-url-ref.js +62 -0
- package/lib/db-ops/anchors/get-anchors-on-page.d.ts +10 -0
- package/lib/db-ops/anchors/get-anchors-on-page.js +21 -0
- package/lib/db-ops/config/get-base-url.d.ts +8 -0
- package/lib/db-ops/config/get-base-url.js +14 -0
- package/lib/db-ops/config/get-config.d.ts +10 -0
- package/lib/db-ops/config/get-config.js +29 -0
- package/lib/db-ops/config/get-created-cwd.d.ts +11 -0
- package/lib/db-ops/config/get-created-cwd.js +13 -0
- package/lib/db-ops/config/get-name.d.ts +8 -0
- package/lib/db-ops/config/get-name.js +14 -0
- package/lib/db-ops/config/info-column-allowlist.d.ts +7 -0
- package/lib/db-ops/config/info-column-allowlist.js +29 -0
- package/lib/db-ops/config/info-json-columns.d.ts +5 -0
- package/lib/db-ops/config/info-json-columns.js +11 -0
- package/lib/db-ops/config/set-config.d.ts +12 -0
- package/lib/db-ops/config/set-config.js +21 -0
- package/lib/db-ops/config/update-config.d.ts +17 -0
- package/lib/db-ops/config/update-config.js +36 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.d.ts +19 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.js +30 -0
- package/lib/db-ops/console-logs/replace-console-logs.d.ts +34 -0
- package/lib/db-ops/console-logs/replace-console-logs.js +123 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.d.ts +16 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.js +26 -0
- package/lib/db-ops/console-logs/types.d.ts +38 -0
- package/lib/db-ops/console-logs/types.js +1 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.d.ts +29 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.js +52 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.d.ts +18 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.js +23 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.d.ts +12 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.js +15 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.d.ts +14 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.js +30 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.d.ts +57 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.js +87 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.d.ts +21 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.js +27 -0
- package/lib/db-ops/errors/insert-crawl-error.d.ts +15 -0
- package/lib/db-ops/errors/insert-crawl-error.js +21 -0
- package/lib/db-ops/errors/insert-page-error.d.ts +21 -0
- package/lib/db-ops/errors/insert-page-error.js +30 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.d.ts +33 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.js +158 -0
- package/lib/db-ops/html/read-page-html-blob.d.ts +17 -0
- package/lib/db-ops/html/read-page-html-blob.js +20 -0
- package/lib/db-ops/lifecycle/checkpoint.d.ts +8 -0
- package/lib/db-ops/lifecycle/checkpoint.js +9 -0
- package/lib/db-ops/lifecycle/destroy.d.ts +6 -0
- package/lib/db-ops/lifecycle/destroy.js +7 -0
- package/lib/db-ops/lifecycle/init.d.ts +58 -0
- package/lib/db-ops/lifecycle/init.js +122 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.d.ts +22 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.js +41 -0
- package/lib/db-ops/meta/get-audios-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-audios-of-page.js +15 -0
- package/lib/db-ops/meta/get-buttons-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-buttons-of-page.js +15 -0
- package/lib/db-ops/meta/get-canvases-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-canvases-of-page.js +15 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.js +15 -0
- package/lib/db-ops/meta/get-headings-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-headings-of-page.js +15 -0
- package/lib/db-ops/meta/get-iframes-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-iframes-of-page.js +15 -0
- package/lib/db-ops/meta/get-jsonld-of-page.d.ts +13 -0
- package/lib/db-ops/meta/get-jsonld-of-page.js +27 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.js +15 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.js +15 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.js +15 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.js +15 -0
- package/lib/db-ops/meta/get-videos-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-videos-of-page.js +15 -0
- package/lib/db-ops/outages/close-network-outage.d.ts +12 -0
- package/lib/db-ops/outages/close-network-outage.js +15 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.d.ts +26 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.js +42 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.d.ts +26 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.js +31 -0
- package/lib/db-ops/outages/insert-network-outage.d.ts +14 -0
- package/lib/db-ops/outages/insert-network-outage.js +29 -0
- package/lib/db-ops/outages/list-network-outages.d.ts +28 -0
- package/lib/db-ops/outages/list-network-outages.js +42 -0
- package/lib/db-ops/pages/order/set-url-order.d.ts +13 -0
- package/lib/db-ops/pages/order/set-url-order.js +38 -0
- package/lib/db-ops/pages/read/build-page-query.d.ts +18 -0
- package/lib/db-ops/pages/read/build-page-query.js +40 -0
- package/lib/db-ops/pages/read/get-crawling-state.d.ts +117 -0
- package/lib/db-ops/pages/read/get-crawling-state.js +161 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.d.ts +15 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.js +30 -0
- package/lib/db-ops/pages/read/get-page-count.d.ts +12 -0
- package/lib/db-ops/pages/read/get-page-count.js +21 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.d.ts +24 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.js +28 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.d.ts +38 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.js +107 -0
- package/lib/db-ops/pages/read/get-pages.d.ts +11 -0
- package/lib/db-ops/pages/read/get-pages.js +51 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.d.ts +18 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.js +25 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.d.ts +31 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.js +32 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.d.ts +20 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.js +37 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.d.ts +30 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.js +91 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.d.ts +88 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.js +216 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.d.ts +80 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.js +151 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.d.ts +24 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.js +24 -0
- package/lib/db-ops/pages/write/insert-audios.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-audios.js +25 -0
- package/lib/db-ops/pages/write/insert-buttons.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-buttons.js +29 -0
- package/lib/db-ops/pages/write/insert-canvases.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-canvases.js +26 -0
- package/lib/db-ops/pages/write/insert-custom-elements.d.ts +27 -0
- package/lib/db-ops/pages/write/insert-custom-elements.js +40 -0
- package/lib/db-ops/pages/write/insert-headings.d.ts +15 -0
- package/lib/db-ops/pages/write/insert-headings.js +27 -0
- package/lib/db-ops/pages/write/insert-iframes.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-iframes.js +28 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.d.ts +38 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.js +60 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.d.ts +36 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.js +48 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.d.ts +42 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.js +56 -0
- package/lib/db-ops/pages/write/insert-jsonld.d.ts +17 -0
- package/lib/db-ops/pages/write/insert-jsonld.js +49 -0
- package/lib/db-ops/pages/write/insert-main-content-images.d.ts +20 -0
- package/lib/db-ops/pages/write/insert-main-content-images.js +32 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.js +29 -0
- package/lib/db-ops/pages/write/insert-page.d.ts +56 -0
- package/lib/db-ops/pages/write/insert-page.js +259 -0
- package/lib/db-ops/pages/write/insert-technologies.d.ts +25 -0
- package/lib/db-ops/pages/write/insert-technologies.js +45 -0
- package/lib/db-ops/pages/write/insert-videos.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-videos.js +28 -0
- package/lib/db-ops/pages/write/link-redirect-sources.d.ts +42 -0
- package/lib/db-ops/pages/write/link-redirect-sources.js +101 -0
- package/lib/db-ops/pages/write/record-redirect.d.ts +35 -0
- package/lib/db-ops/pages/write/record-redirect.js +100 -0
- package/lib/db-ops/pages/write/set-skipped-page.d.ts +13 -0
- package/lib/db-ops/pages/write/set-skipped-page.js +24 -0
- package/lib/db-ops/pages/write/update-page.d.ts +40 -0
- package/lib/db-ops/pages/write/update-page.js +419 -0
- package/lib/db-ops/pages/write/write-page-html-blob.d.ts +19 -0
- package/lib/db-ops/pages/write/write-page-html-blob.js +41 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.d.ts +9 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.js +15 -0
- package/lib/db-ops/referrers/get-referrers-of-page.d.ts +17 -0
- package/lib/db-ops/referrers/get-referrers-of-page.js +32 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.d.ts +8 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.js +15 -0
- package/lib/db-ops/resources/build-resource-query.d.ts +25 -0
- package/lib/db-ops/resources/build-resource-query.js +29 -0
- package/lib/db-ops/resources/get-existing-resource-urls.d.ts +9 -0
- package/lib/db-ops/resources/get-existing-resource-urls.js +24 -0
- package/lib/db-ops/resources/get-resource-by-url.d.ts +13 -0
- package/lib/db-ops/resources/get-resource-by-url.js +22 -0
- package/lib/db-ops/resources/get-resource-url-list.d.ts +17 -0
- package/lib/db-ops/resources/get-resource-url-list.js +26 -0
- package/lib/db-ops/resources/get-resources.d.ts +8 -0
- package/lib/db-ops/resources/get-resources.js +11 -0
- package/lib/db-ops/resources/insert-inventory-resources.d.ts +24 -0
- package/lib/db-ops/resources/insert-inventory-resources.js +64 -0
- package/lib/db-ops/resources/insert-resource-referrers.d.ts +15 -0
- package/lib/db-ops/resources/insert-resource-referrers.js +54 -0
- package/lib/db-ops/resources/insert-resource.d.ts +34 -0
- package/lib/db-ops/resources/insert-resource.js +73 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.d.ts +26 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.js +30 -0
- package/lib/db-ops/templates/assign-template-labels.d.ts +60 -0
- package/lib/db-ops/templates/assign-template-labels.js +187 -0
- package/lib/db-ops/templates/replace-page-templates.d.ts +44 -0
- package/lib/db-ops/templates/replace-page-templates.js +174 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.d.ts +16 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.js +17 -0
- package/lib/db-ops/templates/types.d.ts +103 -0
- package/lib/db-ops/templates/types.js +1 -0
- package/lib/debug.d.ts +8 -0
- package/lib/debug.js +9 -0
- package/lib/decode-html-blob.d.ts +20 -0
- package/lib/decode-html-blob.js +23 -0
- package/lib/decode-page-html-blob-bytes.d.ts +25 -0
- package/lib/decode-page-html-blob-bytes.js +29 -0
- package/lib/decode-stored-blob-bytes.d.ts +25 -0
- package/lib/decode-stored-blob-bytes.js +47 -0
- package/lib/derive-lineage-from-parent.d.ts +37 -0
- package/lib/derive-lineage-from-parent.js +42 -0
- package/lib/drop-legacy-tables.d.ts +45 -0
- package/lib/drop-legacy-tables.js +56 -0
- package/lib/error-kind/classify-error-kind.d.ts +20 -0
- package/lib/error-kind/classify-error-kind.js +136 -0
- package/lib/error-kind/network-related-error-kinds.d.ts +23 -0
- package/lib/error-kind/network-related-error-kinds.js +28 -0
- package/lib/error-kind/permanent-error-kinds.d.ts +48 -0
- package/lib/error-kind/permanent-error-kinds.js +54 -0
- package/lib/error-kind/types.d.ts +54 -0
- package/lib/error-kind/types.js +1 -0
- package/lib/filesystem/append-text.d.ts +9 -0
- package/lib/filesystem/append-text.js +14 -0
- package/lib/filesystem/copy-dir-sync.d.ts +6 -0
- package/lib/filesystem/copy-dir-sync.js +9 -0
- package/lib/filesystem/copy-dir.d.ts +7 -0
- package/lib/filesystem/copy-dir.js +13 -0
- package/lib/filesystem/copy-file-with-progress.d.ts +20 -0
- package/lib/filesystem/copy-file-with-progress.js +34 -0
- package/lib/filesystem/exists.d.ts +6 -0
- package/lib/filesystem/exists.js +9 -0
- package/lib/filesystem/get-file-list.d.ts +8 -0
- package/lib/filesystem/get-file-list.js +12 -0
- package/lib/filesystem/is-dir.d.ts +6 -0
- package/lib/filesystem/is-dir.js +10 -0
- package/lib/filesystem/mkdir.d.ts +8 -0
- package/lib/filesystem/mkdir.js +15 -0
- package/lib/filesystem/output-binary.d.ts +12 -0
- package/lib/filesystem/output-binary.js +17 -0
- package/lib/filesystem/output-json.d.ts +9 -0
- package/lib/filesystem/output-json.js +14 -0
- package/lib/filesystem/output-text.d.ts +11 -0
- package/lib/filesystem/output-text.js +32 -0
- package/lib/filesystem/parse-pax-path.d.ts +18 -0
- package/lib/filesystem/parse-pax-path.js +45 -0
- package/lib/filesystem/parse-tar-size-field.d.ts +13 -0
- package/lib/filesystem/parse-tar-size-field.js +37 -0
- package/lib/filesystem/peek-tar-top-dir.d.ts +35 -0
- package/lib/filesystem/peek-tar-top-dir.js +215 -0
- package/lib/filesystem/read-json.d.ts +7 -0
- package/lib/filesystem/read-json.js +11 -0
- package/lib/filesystem/read-text.d.ts +6 -0
- package/lib/filesystem/read-text.js +10 -0
- package/lib/filesystem/readline.d.ts +11 -0
- package/lib/filesystem/readline.js +26 -0
- package/lib/filesystem/remove.d.ts +5 -0
- package/lib/filesystem/remove.js +10 -0
- package/lib/filesystem/rename.d.ts +16 -0
- package/lib/filesystem/rename.js +48 -0
- package/lib/filesystem/tar.d.ts +23 -0
- package/lib/filesystem/tar.js +78 -0
- package/lib/filesystem/untar.d.ts +33 -0
- package/lib/filesystem/untar.js +84 -0
- package/lib/get-failed-page-messages.d.ts +56 -0
- package/lib/get-failed-page-messages.js +146 -0
- package/lib/get-json.d.ts +10 -0
- package/lib/get-json.js +25 -0
- package/lib/html-snapshot/match-selector-html.d.ts +25 -0
- package/lib/html-snapshot/match-selector-html.js +28 -0
- package/lib/html-snapshot/match-selector-snapshots.d.ts +33 -0
- package/lib/html-snapshot/match-selector-snapshots.js +33 -0
- package/lib/html-snapshot/search-html-document.d.ts +29 -0
- package/lib/html-snapshot/search-html-document.js +27 -0
- package/lib/html-snapshot/search-html-snapshots.d.ts +36 -0
- package/lib/html-snapshot/search-html-snapshots.js +35 -0
- package/lib/html-snapshot/types.d.ts +111 -0
- package/lib/html-snapshot/types.js +7 -0
- package/lib/html-snapshot/validate-search-pattern.d.ts +15 -0
- package/lib/html-snapshot/validate-search-pattern.js +17 -0
- package/lib/init-schema.d.ts +48 -0
- package/lib/init-schema.js +124 -0
- package/lib/is-inventory-source.d.ts +21 -0
- package/lib/is-inventory-source.js +22 -0
- package/lib/is-within-outage-window.d.ts +49 -0
- package/lib/is-within-outage-window.js +33 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.d.ts +24 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.js +26 -0
- package/lib/libsql-dialect.d.ts +115 -0
- package/lib/libsql-dialect.js +116 -0
- package/lib/limited-page-ids.d.ts +9 -0
- package/lib/limited-page-ids.js +18 -0
- package/lib/meta/assert-compatible-version.d.ts +60 -0
- package/lib/meta/assert-compatible-version.js +93 -0
- package/lib/meta/classify-jsonld-type.d.ts +23 -0
- package/lib/meta/classify-jsonld-type.js +43 -0
- package/lib/meta/compare-semver.d.ts +23 -0
- package/lib/meta/compare-semver.js +51 -0
- package/lib/meta/compute-main-contents-denormalized.d.ts +41 -0
- package/lib/meta/compute-main-contents-denormalized.js +88 -0
- package/lib/meta/compute-page-denormalized.d.ts +20 -0
- package/lib/meta/compute-page-denormalized.js +35 -0
- package/lib/meta/derive-flat-from-meta.d.ts +34 -0
- package/lib/meta/derive-flat-from-meta.js +158 -0
- package/lib/meta/derive-meta-extras.d.ts +20 -0
- package/lib/meta/derive-meta-extras.js +23 -0
- package/lib/meta/extract-tags-for-archive.d.ts +17 -0
- package/lib/meta/extract-tags-for-archive.js +36 -0
- package/lib/meta/parse-main-content-class-list.d.ts +19 -0
- package/lib/meta/parse-main-content-class-list.js +34 -0
- package/lib/meta/summarize-jsonld.d.ts +17 -0
- package/lib/meta/summarize-jsonld.js +29 -0
- package/lib/meta/technologies/combine-technology-confidence.d.ts +46 -0
- package/lib/meta/technologies/combine-technology-confidence.js +93 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.d.ts +45 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.js +53 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.d.ts +33 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.js +46 -0
- package/lib/meta/technologies/extract-technologies-for-archive.d.ts +33 -0
- package/lib/meta/technologies/extract-technologies-for-archive.js +30 -0
- package/lib/meta/technologies/match-js-license-comment-signal.d.ts +21 -0
- package/lib/meta/technologies/match-js-license-comment-signal.js +23 -0
- package/lib/meta/technologies/match-structural-technology-signals.d.ts +26 -0
- package/lib/meta/technologies/match-structural-technology-signals.js +48 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.d.ts +25 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.js +35 -0
- package/lib/meta/technologies/technology-signal-definitions.d.ts +44 -0
- package/lib/meta/technologies/technology-signal-definitions.js +60 -0
- package/lib/meta/technologies/types.d.ts +70 -0
- package/lib/meta/technologies/types.js +13 -0
- package/lib/meta/types.d.ts +1490 -0
- package/lib/meta/types.js +65 -0
- package/lib/migrate-content-items-alias-of-id.d.ts +52 -0
- package/lib/migrate-content-items-alias-of-id.js +69 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.d.ts +46 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.js +62 -0
- package/lib/migrate-content-items-is-metadata-only.d.ts +44 -0
- package/lib/migrate-content-items-is-metadata-only.js +60 -0
- package/lib/migrate-entity-tables.d.ts +55 -0
- package/lib/migrate-entity-tables.js +66 -0
- package/lib/migrate-info-created-cwd.d.ts +17 -0
- package/lib/migrate-info-created-cwd.js +36 -0
- package/lib/migrate-info-main-content-selector.d.ts +16 -0
- package/lib/migrate-info-main-content-selector.js +35 -0
- package/lib/migrate-info-request-header-names.d.ts +16 -0
- package/lib/migrate-info-request-header-names.js +35 -0
- package/lib/migrate-info-roots.d.ts +20 -0
- package/lib/migrate-info-roots.js +52 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.d.ts +34 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.js +51 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.d.ts +25 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.js +44 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.d.ts +16 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.js +35 -0
- package/lib/migrate-main-contents-columns.d.ts +26 -0
- package/lib/migrate-main-contents-columns.js +61 -0
- package/lib/migrate-page-meta-body-hash.d.ts +44 -0
- package/lib/migrate-page-meta-body-hash.js +63 -0
- package/lib/migrate-page-meta-console-error-count.d.ts +27 -0
- package/lib/migrate-page-meta-console-error-count.js +45 -0
- package/lib/migrate-page-meta-custom-element-count.d.ts +33 -0
- package/lib/migrate-page-meta-custom-element-count.js +51 -0
- package/lib/migrate-page-meta-image-scan.d.ts +27 -0
- package/lib/migrate-page-meta-image-scan.js +52 -0
- package/lib/migrate-page-tags-to-page-technologies.d.ts +39 -0
- package/lib/migrate-page-tags-to-page-technologies.js +79 -0
- package/lib/migrate-ref-tables.d.ts +25 -0
- package/lib/migrate-ref-tables.js +38 -0
- package/lib/native-executor/check-native-executor-config.d.ts +17 -0
- package/lib/native-executor/check-native-executor-config.js +20 -0
- package/lib/page-meta-column-maps.d.ts +32 -0
- package/lib/page-meta-column-maps.js +43 -0
- package/lib/page.d.ts +546 -0
- package/lib/page.js +764 -0
- package/lib/peek-archive-lock.d.ts +40 -0
- package/lib/peek-archive-lock.js +62 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.d.ts +41 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.js +87 -0
- package/lib/populate-entity-tables/derive-dom-path.d.ts +35 -0
- package/lib/populate-entity-tables/derive-dom-path.js +72 -0
- package/lib/populate-entity-tables/is-blob-ref-value.d.ts +16 -0
- package/lib/populate-entity-tables/is-blob-ref-value.js +19 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.d.ts +66 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.js +96 -0
- package/lib/populate-entity-tables/populate-anchor-edges.d.ts +33 -0
- package/lib/populate-entity-tables/populate-anchor-edges.js +153 -0
- package/lib/populate-entity-tables/populate-content-items.d.ts +40 -0
- package/lib/populate-entity-tables/populate-content-items.js +141 -0
- package/lib/populate-entity-tables/populate-entities.d.ts +81 -0
- package/lib/populate-entity-tables/populate-entities.js +110 -0
- package/lib/populate-entity-tables/populate-image-items.d.ts +91 -0
- package/lib/populate-entity-tables/populate-image-items.js +226 -0
- package/lib/populate-entity-tables/populate-page-meta.d.ts +33 -0
- package/lib/populate-entity-tables/populate-page-meta.js +267 -0
- package/lib/populate-entity-tables/populate-resource-items.d.ts +22 -0
- package/lib/populate-entity-tables/populate-resource-items.js +114 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.d.ts +31 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.js +33 -0
- package/lib/populate-entity-tables/resolve-blob-refs.d.ts +31 -0
- package/lib/populate-entity-tables/resolve-blob-refs.js +100 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.d.ts +22 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.js +27 -0
- package/lib/populate-entity-tables/resolve-header-sets.d.ts +49 -0
- package/lib/populate-entity-tables/resolve-header-sets.js +122 -0
- package/lib/populate-entity-tables/resolve-json-refs.d.ts +25 -0
- package/lib/populate-entity-tables/resolve-json-refs.js +67 -0
- package/lib/populate-entity-tables/resolve-text-refs.d.ts +30 -0
- package/lib/populate-entity-tables/resolve-text-refs.js +61 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.d.ts +21 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.js +27 -0
- package/lib/populate-entity-tables/resolve-url-refs.d.ts +33 -0
- package/lib/populate-entity-tables/resolve-url-refs.js +60 -0
- package/lib/populate-entity-tables/test-utils/count-rows.d.ts +17 -0
- package/lib/populate-entity-tables/test-utils/count-rows.js +20 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.d.ts +25 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.js +42 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.d.ts +30 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.js +175 -0
- package/lib/populate-entity-tables/types.d.ts +157 -0
- package/lib/populate-entity-tables/types.js +12 -0
- package/lib/populate-entity-tables/upsert-text-refs.d.ts +38 -0
- package/lib/populate-entity-tables/upsert-text-refs.js +78 -0
- package/lib/populate-ref-tables/classify-content-type.d.ts +16 -0
- package/lib/populate-ref-tables/classify-content-type.js +52 -0
- package/lib/populate-ref-tables/compute-content-hash.d.ts +22 -0
- package/lib/populate-ref-tables/compute-content-hash.js +26 -0
- package/lib/populate-ref-tables/compute-header-flags.d.ts +16 -0
- package/lib/populate-ref-tables/compute-header-flags.js +70 -0
- package/lib/populate-ref-tables/content-type-rules.d.ts +38 -0
- package/lib/populate-ref-tables/content-type-rules.js +133 -0
- package/lib/populate-ref-tables/create-header-table-caches.d.ts +25 -0
- package/lib/populate-ref-tables/create-header-table-caches.js +49 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.d.ts +15 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.js +15 -0
- package/lib/populate-ref-tables/decode-data-uri.d.ts +21 -0
- package/lib/populate-ref-tables/decode-data-uri.js +126 -0
- package/lib/populate-ref-tables/decompose-header-set.d.ts +29 -0
- package/lib/populate-ref-tables/decompose-header-set.js +157 -0
- package/lib/populate-ref-tables/decompose-url.d.ts +25 -0
- package/lib/populate-ref-tables/decompose-url.js +70 -0
- package/lib/populate-ref-tables/header-stability.d.ts +19 -0
- package/lib/populate-ref-tables/header-stability.js +22 -0
- package/lib/populate-ref-tables/header-value-cache-key.d.ts +17 -0
- package/lib/populate-ref-tables/header-value-cache-key.js +19 -0
- package/lib/populate-ref-tables/normalize-mime.d.ts +24 -0
- package/lib/populate-ref-tables/normalize-mime.js +36 -0
- package/lib/populate-ref-tables/populate-blob-refs.d.ts +38 -0
- package/lib/populate-ref-tables/populate-blob-refs.js +134 -0
- package/lib/populate-ref-tables/populate-content-type-refs.d.ts +27 -0
- package/lib/populate-ref-tables/populate-content-type-refs.js +70 -0
- package/lib/populate-ref-tables/populate-header-tables.d.ts +35 -0
- package/lib/populate-ref-tables/populate-header-tables.js +80 -0
- package/lib/populate-ref-tables/populate-json-refs.d.ts +29 -0
- package/lib/populate-ref-tables/populate-json-refs.js +101 -0
- package/lib/populate-ref-tables/populate-refs.d.ts +51 -0
- package/lib/populate-ref-tables/populate-refs.js +62 -0
- package/lib/populate-ref-tables/populate-text-refs.d.ts +32 -0
- package/lib/populate-ref-tables/populate-text-refs.js +133 -0
- package/lib/populate-ref-tables/populate-url-refs.d.ts +28 -0
- package/lib/populate-ref-tables/populate-url-refs.js +148 -0
- package/lib/populate-ref-tables/test-utils/count-rows.d.ts +15 -0
- package/lib/populate-ref-tables/test-utils/count-rows.js +17 -0
- package/lib/populate-ref-tables/types.d.ts +197 -0
- package/lib/populate-ref-tables/types.js +7 -0
- package/lib/populate-ref-tables/upsert-one-header-set.d.ts +34 -0
- package/lib/populate-ref-tables/upsert-one-header-set.js +208 -0
- package/lib/populate-ref-tables/volatile-header-names.d.ts +20 -0
- package/lib/populate-ref-tables/volatile-header-names.js +33 -0
- package/lib/redirect-table.d.ts +9 -0
- package/lib/redirect-table.js +28 -0
- package/lib/release-finished-statements.d.ts +42 -0
- package/lib/release-finished-statements.js +45 -0
- package/lib/resolve-redirect-chain.d.ts +33 -0
- package/lib/resolve-redirect-chain.js +27 -0
- package/lib/resource.d.ts +46 -0
- package/lib/resource.js +62 -0
- package/lib/retarget-legacy-fk-tables.d.ts +61 -0
- package/lib/retarget-legacy-fk-tables.js +137 -0
- package/lib/safe-path.d.ts +9 -0
- package/lib/safe-path.js +17 -0
- package/lib/scope/build-scope-map.d.ts +21 -0
- package/lib/scope/build-scope-map.js +32 -0
- package/lib/scope/find-scope-entry.d.ts +25 -0
- package/lib/scope/find-scope-entry.js +45 -0
- package/lib/template-classification/classify-archive-page-templates.d.ts +42 -0
- package/lib/template-classification/classify-archive-page-templates.js +70 -0
- package/lib/template-classification/classify-page-templates.d.ts +33 -0
- package/lib/template-classification/classify-page-templates.js +60 -0
- package/lib/template-classification/collect-page-ids-with-html.d.ts +24 -0
- package/lib/template-classification/collect-page-ids-with-html.js +30 -0
- package/lib/template-classification/collect-page-stylesheet-urls.d.ts +32 -0
- package/lib/template-classification/collect-page-stylesheet-urls.js +132 -0
- package/lib/template-classification/create-content-root-hint.d.ts +41 -0
- package/lib/template-classification/create-content-root-hint.js +51 -0
- package/lib/template-classification/create-page-cluster-factory.d.ts +36 -0
- package/lib/template-classification/create-page-cluster-factory.js +52 -0
- package/lib/template-classification/load-page-cluster-candidates.d.ts +32 -0
- package/lib/template-classification/load-page-cluster-candidates.js +93 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.d.ts +34 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.js +236 -0
- package/lib/template-classification/page-cluster/types.d.ts +123 -0
- package/lib/template-classification/page-cluster/types.js +1 -0
- package/lib/template-classification/types.d.ts +234 -0
- package/lib/template-classification/types.js +1 -0
- package/lib/test-utils/build-full-schema-test-db.d.ts +34 -0
- package/lib/test-utils/build-full-schema-test-db.js +74 -0
- package/lib/test-utils/compare-strings.d.ts +12 -0
- package/lib/test-utils/compare-strings.js +14 -0
- package/lib/test-utils/create-legacy-analysis-tables.d.ts +13 -0
- package/lib/test-utils/create-legacy-analysis-tables.js +37 -0
- package/lib/test-utils/fk-parent-tables.d.ts +15 -0
- package/lib/test-utils/fk-parent-tables.js +19 -0
- package/lib/test-utils/seed-content-item.d.ts +35 -0
- package/lib/test-utils/seed-content-item.js +42 -0
- package/lib/test-utils/setup-legacy-fk-db.d.ts +34 -0
- package/lib/test-utils/setup-legacy-fk-db.js +271 -0
- package/lib/transfer/attach-source-database.d.ts +31 -0
- package/lib/transfer/attach-source-database.js +40 -0
- package/lib/transfer/build-split-config.d.ts +30 -0
- package/lib/transfer/build-split-config.js +42 -0
- package/lib/transfer/clear-replaced-page-rows.d.ts +23 -0
- package/lib/transfer/clear-replaced-page-rows.js +61 -0
- package/lib/transfer/concat-archives.d.ts +55 -0
- package/lib/transfer/concat-archives.js +95 -0
- package/lib/transfer/concat-source-transfer-phases.d.ts +10 -0
- package/lib/transfer/concat-source-transfer-phases.js +17 -0
- package/lib/transfer/content-item-rank-sql.d.ts +21 -0
- package/lib/transfer/content-item-rank-sql.js +23 -0
- package/lib/transfer/copy-anchor-edges.d.ts +28 -0
- package/lib/transfer/copy-anchor-edges.js +42 -0
- package/lib/transfer/copy-dictionaries-for-concat.d.ts +39 -0
- package/lib/transfer/copy-dictionaries-for-concat.js +81 -0
- package/lib/transfer/copy-dictionaries-for-split.d.ts +29 -0
- package/lib/transfer/copy-dictionaries-for-split.js +224 -0
- package/lib/transfer/copy-header-set-children.d.ts +27 -0
- package/lib/transfer/copy-header-set-children.js +51 -0
- package/lib/transfer/copy-image-items.d.ts +21 -0
- package/lib/transfer/copy-image-items.js +62 -0
- package/lib/transfer/copy-inventory-source-lists.d.ts +30 -0
- package/lib/transfer/copy-inventory-source-lists.js +61 -0
- package/lib/transfer/copy-journal-tables.d.ts +30 -0
- package/lib/transfer/copy-journal-tables.js +56 -0
- package/lib/transfer/copy-page-console-logs.d.ts +16 -0
- package/lib/transfer/copy-page-console-logs.js +27 -0
- package/lib/transfer/copy-page-html-blobs.d.ts +31 -0
- package/lib/transfer/copy-page-html-blobs.js +43 -0
- package/lib/transfer/copy-page-meta.d.ts +27 -0
- package/lib/transfer/copy-page-meta.js +68 -0
- package/lib/transfer/copy-page-template-clusters.d.ts +31 -0
- package/lib/transfer/copy-page-template-clusters.js +56 -0
- package/lib/transfer/copy-page-template-labels.d.ts +34 -0
- package/lib/transfer/copy-page-template-labels.js +88 -0
- package/lib/transfer/copy-resource-items.d.ts +29 -0
- package/lib/transfer/copy-resource-items.js +89 -0
- package/lib/transfer/copy-resource-ref-edges.d.ts +20 -0
- package/lib/transfer/copy-resource-ref-edges.js +33 -0
- package/lib/transfer/copy-simple-page-scoped-tables.d.ts +15 -0
- package/lib/transfer/copy-simple-page-scoped-tables.js +34 -0
- package/lib/transfer/count-external-pages-in-scope.d.ts +26 -0
- package/lib/transfer/count-external-pages-in-scope.js +40 -0
- package/lib/transfer/create-transfer-temp-tables.d.ts +30 -0
- package/lib/transfer/create-transfer-temp-tables.js +59 -0
- package/lib/transfer/dictionary-copy-specs.d.ts +32 -0
- package/lib/transfer/dictionary-copy-specs.js +28 -0
- package/lib/transfer/drop-transfer-temp-tables.d.ts +9 -0
- package/lib/transfer/drop-transfer-temp-tables.js +18 -0
- package/lib/transfer/flatten-redirect-chains.d.ts +44 -0
- package/lib/transfer/flatten-redirect-chains.js +74 -0
- package/lib/transfer/insert-content-items.d.ts +35 -0
- package/lib/transfer/insert-content-items.js +116 -0
- package/lib/transfer/list-transfer-columns.d.ts +35 -0
- package/lib/transfer/list-transfer-columns.js +45 -0
- package/lib/transfer/mark-in-scope-content-items.d.ts +31 -0
- package/lib/transfer/mark-in-scope-content-items.js +54 -0
- package/lib/transfer/merge-archive-configs.d.ts +51 -0
- package/lib/transfer/merge-archive-configs.js +85 -0
- package/lib/transfer/plan-content-items-for-concat.d.ts +33 -0
- package/lib/transfer/plan-content-items-for-concat.js +51 -0
- package/lib/transfer/plan-content-items-for-split.d.ts +42 -0
- package/lib/transfer/plan-content-items-for-split.js +83 -0
- package/lib/transfer/plan-resource-items.d.ts +40 -0
- package/lib/transfer/plan-resource-items.js +69 -0
- package/lib/transfer/quote-transfer-identifier.d.ts +18 -0
- package/lib/transfer/quote-transfer-identifier.js +20 -0
- package/lib/transfer/reclassify-resource-externality.d.ts +37 -0
- package/lib/transfer/reclassify-resource-externality.js +66 -0
- package/lib/transfer/remap-redirect-dest-ids.d.ts +34 -0
- package/lib/transfer/remap-redirect-dest-ids.js +51 -0
- package/lib/transfer/replace-content-items.d.ts +39 -0
- package/lib/transfer/replace-content-items.js +83 -0
- package/lib/transfer/simple-page-scoped-tables.d.ts +25 -0
- package/lib/transfer/simple-page-scoped-tables.js +38 -0
- package/lib/transfer/split-archive.d.ts +55 -0
- package/lib/transfer/split-archive.js +98 -0
- package/lib/transfer/split-source-transfer-phases.d.ts +11 -0
- package/lib/transfer/split-source-transfer-phases.js +18 -0
- package/lib/transfer/transfer-action.d.ts +34 -0
- package/lib/transfer/transfer-action.js +32 -0
- package/lib/transfer/transfer-archive-rows.d.ts +65 -0
- package/lib/transfer/transfer-archive-rows.js +156 -0
- package/lib/transfer/transfer-dictionary-tables.d.ts +12 -0
- package/lib/transfer/transfer-dictionary-tables.js +22 -0
- package/lib/transfer/transfer-post-phases.d.ts +10 -0
- package/lib/transfer/transfer-post-phases.js +13 -0
- package/lib/transfer/transfer-source-alias.d.ts +9 -0
- package/lib/transfer/transfer-source-alias.js +9 -0
- package/lib/transfer/types.d.ts +111 -0
- package/lib/transfer/types.js +35 -0
- package/lib/types.d.ts +772 -0
- package/lib/types.js +1 -0
- package/lib/url-alias/compute-tier-a-alias-key.d.ts +44 -0
- package/lib/url-alias/compute-tier-a-alias-key.js +47 -0
- package/lib/url-alias/compute-tier-b-alias-key.d.ts +23 -0
- package/lib/url-alias/compute-tier-b-alias-key.js +26 -0
- package/lib/url-alias/group-alias-candidates.d.ts +27 -0
- package/lib/url-alias/group-alias-candidates.js +29 -0
- package/lib/url-alias/types.d.ts +12 -0
- package/lib/url-alias/types.js +1 -0
- package/lib/url-pattern/compute-shape-key.d.ts +58 -0
- package/lib/url-pattern/compute-shape-key.js +129 -0
- package/lib/url-pattern/decompose-url.d.ts +33 -0
- package/lib/url-pattern/decompose-url.js +79 -0
- package/lib/url-pattern/reconstruct-url.d.ts +15 -0
- package/lib/url-pattern/reconstruct-url.js +33 -0
- package/lib/url-sort/compute-url-sort-ranks.d.ts +30 -0
- package/lib/url-sort/compute-url-sort-ranks.js +33 -0
- package/lib/utils/array/each-splitted.d.ts +10 -0
- package/lib/utils/array/each-splitted.js +14 -0
- package/lib/utils/debug.d.ts +8 -0
- package/lib/utils/debug.js +8 -0
- package/lib/utils/error/emit-error-with-retry.d.ts +40 -0
- package/lib/utils/error/emit-error-with-retry.js +44 -0
- package/lib/utils/error/emit-error.d.ts +39 -0
- package/lib/utils/error/emit-error.js +41 -0
- package/lib/utils/object/parse-response-headers.d.ts +12 -0
- package/lib/utils/object/parse-response-headers.js +26 -0
- package/lib/utils/object/redact-request-headers.d.ts +15 -0
- package/lib/utils/object/redact-request-headers.js +27 -0
- package/lib/utils/types/types.d.ts +383 -0
- package/lib/utils/types/types.js +1 -0
- package/lib/verify-migration/capture-rejection.d.ts +24 -0
- package/lib/verify-migration/capture-rejection.js +31 -0
- package/lib/verify-migration/check-anchor-edges-count.d.ts +34 -0
- package/lib/verify-migration/check-anchor-edges-count.js +72 -0
- package/lib/verify-migration/check-anchor-edges-sum.d.ts +13 -0
- package/lib/verify-migration/check-anchor-edges-sum.js +27 -0
- package/lib/verify-migration/check-content-items-count.d.ts +16 -0
- package/lib/verify-migration/check-content-items-count.js +30 -0
- package/lib/verify-migration/check-content-type-preservation.d.ts +22 -0
- package/lib/verify-migration/check-content-type-preservation.js +40 -0
- package/lib/verify-migration/check-foreign-key-integrity.d.ts +31 -0
- package/lib/verify-migration/check-foreign-key-integrity.js +47 -0
- package/lib/verify-migration/check-image-items-count.d.ts +12 -0
- package/lib/verify-migration/check-image-items-count.js +26 -0
- package/lib/verify-migration/check-page-meta-count.d.ts +15 -0
- package/lib/verify-migration/check-page-meta-count.js +31 -0
- package/lib/verify-migration/check-reader-parity.d.ts +23 -0
- package/lib/verify-migration/check-reader-parity.js +182 -0
- package/lib/verify-migration/check-resource-items-count.d.ts +17 -0
- package/lib/verify-migration/check-resource-items-count.js +33 -0
- package/lib/verify-migration/check-url-round-trip.d.ts +43 -0
- package/lib/verify-migration/check-url-round-trip.js +112 -0
- package/lib/verify-migration/types.d.ts +70 -0
- package/lib/verify-migration/types.js +63 -0
- package/lib/verify-migration/verify-migration.d.ts +41 -0
- package/lib/verify-migration/verify-migration.js +120 -0
- package/lib/with-bulk-write-pragmas.d.ts +51 -0
- package/lib/with-bulk-write-pragmas.js +132 -0
- package/lib/write-queue.d.ts +32 -0
- package/lib/write-queue.js +55 -0
- package/package.json +350 -3
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result of probing an archive's `.lock` sibling without acquiring it.
|
|
3
|
+
*
|
|
4
|
+
* Used by read-only consumers (the viewer, MCP `open_archive`) that want
|
|
5
|
+
* to surface "a crawler is currently writing this archive" to the user
|
|
6
|
+
* without blocking or competing for the lock.
|
|
7
|
+
*/
|
|
8
|
+
export interface ArchiveLockHolder {
|
|
9
|
+
/** Path of the lock directory (`<tmpDir>.lock`) that was probed. */
|
|
10
|
+
readonly lockPath: string;
|
|
11
|
+
/** PID of the process whose lock is recorded in `pid.txt`. */
|
|
12
|
+
readonly pid: number;
|
|
13
|
+
/**
|
|
14
|
+
* Whether that PID is currently alive on the OS (signal-0 probe).
|
|
15
|
+
*
|
|
16
|
+
* **PID-recycling caveat**: this only proves *some* process owns that PID,
|
|
17
|
+
* not necessarily the original crawler. Callers should treat
|
|
18
|
+
* `{ alive: true }` as "likely a live crawler" rather than a hard
|
|
19
|
+
* guarantee.
|
|
20
|
+
*/
|
|
21
|
+
readonly alive: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Probe `<tmpDir>.lock/pid.txt` without acquiring the lock.
|
|
25
|
+
*
|
|
26
|
+
* Mirror of the alive-check inside `acquireArchiveLock`, exposed for
|
|
27
|
+
* read-only consumers so they can detect (and surface) a concurrent crawler
|
|
28
|
+
* without competing for the lock. Returns `null` when no lock directory is
|
|
29
|
+
* present or the pid file is missing/malformed — callers should treat that
|
|
30
|
+
* as "no detectable crawler" rather than as an error.
|
|
31
|
+
*
|
|
32
|
+
* Co-located with `acquireArchiveLock` so the writer side and the
|
|
33
|
+
* read-only probe stay in lockstep when the lock format evolves (e.g.
|
|
34
|
+
* adding a hostname/timestamp field).
|
|
35
|
+
* @param tmpDir - The archive's temporary working directory whose
|
|
36
|
+
* `${tmpDir}.lock` sibling will be probed.
|
|
37
|
+
* @returns Lock-holder metadata when a parseable lock exists, otherwise
|
|
38
|
+
* `null`.
|
|
39
|
+
*/
|
|
40
|
+
export declare function peekArchiveLockHolder(tmpDir: string): ArchiveLockHolder | null;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Probe `<tmpDir>.lock/pid.txt` without acquiring the lock.
|
|
5
|
+
*
|
|
6
|
+
* Mirror of the alive-check inside `acquireArchiveLock`, exposed for
|
|
7
|
+
* read-only consumers so they can detect (and surface) a concurrent crawler
|
|
8
|
+
* without competing for the lock. Returns `null` when no lock directory is
|
|
9
|
+
* present or the pid file is missing/malformed — callers should treat that
|
|
10
|
+
* as "no detectable crawler" rather than as an error.
|
|
11
|
+
*
|
|
12
|
+
* Co-located with `acquireArchiveLock` so the writer side and the
|
|
13
|
+
* read-only probe stay in lockstep when the lock format evolves (e.g.
|
|
14
|
+
* adding a hostname/timestamp field).
|
|
15
|
+
* @param tmpDir - The archive's temporary working directory whose
|
|
16
|
+
* `${tmpDir}.lock` sibling will be probed.
|
|
17
|
+
* @returns Lock-holder metadata when a parseable lock exists, otherwise
|
|
18
|
+
* `null`.
|
|
19
|
+
*/
|
|
20
|
+
export function peekArchiveLockHolder(tmpDir) {
|
|
21
|
+
const lockPath = `${tmpDir}.lock`;
|
|
22
|
+
if (!existsSync(lockPath)) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
const pid = readPidFile(lockPath);
|
|
26
|
+
if (pid === null) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return { lockPath, pid, alive: isProcessAlive(pid) };
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Read the PID stored in the lock's `pid.txt`. Returns `null` for any
|
|
33
|
+
* missing/unparsable/non-positive content so the probe degrades gracefully
|
|
34
|
+
* on partially-written or corrupted lock dirs.
|
|
35
|
+
* @param lockPath - The lock directory path.
|
|
36
|
+
*/
|
|
37
|
+
function readPidFile(lockPath) {
|
|
38
|
+
try {
|
|
39
|
+
const raw = readFileSync(path.join(lockPath, 'pid.txt'), 'utf8');
|
|
40
|
+
const pid = Number.parseInt(raw.trim(), 10);
|
|
41
|
+
return Number.isFinite(pid) && pid > 0 ? pid : null;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Check whether a PID is currently alive using a signal-0 probe.
|
|
49
|
+
*
|
|
50
|
+
* Treats `EPERM` as alive (the process exists but is owned by another
|
|
51
|
+
* user). Any other errno (notably `ESRCH`) means dead.
|
|
52
|
+
* @param pid - The process id to probe.
|
|
53
|
+
*/
|
|
54
|
+
function isProcessAlive(pid) {
|
|
55
|
+
try {
|
|
56
|
+
process.kill(pid, 0);
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
return error.code === 'EPERM';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { AnchorEdgeRowInProgress, AnchorInputRow } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Collapses consecutive `anchors`-shaped rows into `anchor_edges` rows by
|
|
4
|
+
* `(pageId, hrefId)` (issue #193).
|
|
5
|
+
*
|
|
6
|
+
* **Input contract**: `rows` MUST be sorted by `(pageId, hrefId, id)`
|
|
7
|
+
* ascending. The caller (`populate-anchor-edges.ts`) achieves this via a
|
|
8
|
+
* single keyset scan `ORDER BY pageId, hrefId, id` over `anchors`.
|
|
9
|
+
*
|
|
10
|
+
* The `id`-then-key sort matters because the dedup rule is
|
|
11
|
+
* "first instance wins": the smallest `anchors.id` for a given
|
|
12
|
+
* `(pageId, hrefId)` pair contributes its `hash` and `textContent` to
|
|
13
|
+
* the edge; every subsequent duplicate is counted but its body is
|
|
14
|
+
* discarded. A naive `min(hash) GROUP BY pageId, hrefId` would pick the
|
|
15
|
+
* lexicographically smallest hex string (uniformly distributed) rather
|
|
16
|
+
* than the earliest occurrence, so the pass has to happen in JS.
|
|
17
|
+
*
|
|
18
|
+
* The generator yields one {@link AnchorEdgeRowInProgress} per distinct
|
|
19
|
+
* pair as soon as the next pair boundary is observed. Emitting eagerly
|
|
20
|
+
* keeps peak memory bounded to O(1) — the collapser holds at most one
|
|
21
|
+
* open pair state at a time.
|
|
22
|
+
*
|
|
23
|
+
* `first_text_id` is intentionally left `null` here; the caller resolves
|
|
24
|
+
* it in a second pass after all edges are known (see
|
|
25
|
+
* `populate-anchor-edges.ts`). The `first_hash` field is set to the
|
|
26
|
+
* first row's `hash` verbatim; a first row with `hash === null` results
|
|
27
|
+
* in `first_hash = null` on the edge (rare but possible on legacy
|
|
28
|
+
* archives that failed to compute a hash).
|
|
29
|
+
* @param rows - Anchor input rows sorted by `(pageId, hrefId, id)`.
|
|
30
|
+
* @yields {AnchorEdgeRowInProgress} One entry per distinct
|
|
31
|
+
* `(pageId, hrefId)` pair in the input.
|
|
32
|
+
* @example
|
|
33
|
+
* const edges = [...collapseAnchorRows([
|
|
34
|
+
* { id: 1, pageId: 10, hrefId: 20, hash: 'a', textContent: 'first' },
|
|
35
|
+
* { id: 2, pageId: 10, hrefId: 20, hash: 'b', textContent: 'second' },
|
|
36
|
+
* { id: 3, pageId: 10, hrefId: 30, hash: 'c', textContent: 'x' },
|
|
37
|
+
* ])];
|
|
38
|
+
* // edges[0] = { page_id: 10, href_page_id: 20, count: 2, first_hash: 'a', ... }
|
|
39
|
+
* // edges[1] = { page_id: 10, href_page_id: 30, count: 1, first_hash: 'c', ... }
|
|
40
|
+
*/
|
|
41
|
+
export declare function collapseAnchorRows(rows: Iterable<AnchorInputRow>): Generator<AnchorEdgeRowInProgress>;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collapses consecutive `anchors`-shaped rows into `anchor_edges` rows by
|
|
3
|
+
* `(pageId, hrefId)` (issue #193).
|
|
4
|
+
*
|
|
5
|
+
* **Input contract**: `rows` MUST be sorted by `(pageId, hrefId, id)`
|
|
6
|
+
* ascending. The caller (`populate-anchor-edges.ts`) achieves this via a
|
|
7
|
+
* single keyset scan `ORDER BY pageId, hrefId, id` over `anchors`.
|
|
8
|
+
*
|
|
9
|
+
* The `id`-then-key sort matters because the dedup rule is
|
|
10
|
+
* "first instance wins": the smallest `anchors.id` for a given
|
|
11
|
+
* `(pageId, hrefId)` pair contributes its `hash` and `textContent` to
|
|
12
|
+
* the edge; every subsequent duplicate is counted but its body is
|
|
13
|
+
* discarded. A naive `min(hash) GROUP BY pageId, hrefId` would pick the
|
|
14
|
+
* lexicographically smallest hex string (uniformly distributed) rather
|
|
15
|
+
* than the earliest occurrence, so the pass has to happen in JS.
|
|
16
|
+
*
|
|
17
|
+
* The generator yields one {@link AnchorEdgeRowInProgress} per distinct
|
|
18
|
+
* pair as soon as the next pair boundary is observed. Emitting eagerly
|
|
19
|
+
* keeps peak memory bounded to O(1) — the collapser holds at most one
|
|
20
|
+
* open pair state at a time.
|
|
21
|
+
*
|
|
22
|
+
* `first_text_id` is intentionally left `null` here; the caller resolves
|
|
23
|
+
* it in a second pass after all edges are known (see
|
|
24
|
+
* `populate-anchor-edges.ts`). The `first_hash` field is set to the
|
|
25
|
+
* first row's `hash` verbatim; a first row with `hash === null` results
|
|
26
|
+
* in `first_hash = null` on the edge (rare but possible on legacy
|
|
27
|
+
* archives that failed to compute a hash).
|
|
28
|
+
* @param rows - Anchor input rows sorted by `(pageId, hrefId, id)`.
|
|
29
|
+
* @yields {AnchorEdgeRowInProgress} One entry per distinct
|
|
30
|
+
* `(pageId, hrefId)` pair in the input.
|
|
31
|
+
* @example
|
|
32
|
+
* const edges = [...collapseAnchorRows([
|
|
33
|
+
* { id: 1, pageId: 10, hrefId: 20, hash: 'a', textContent: 'first' },
|
|
34
|
+
* { id: 2, pageId: 10, hrefId: 20, hash: 'b', textContent: 'second' },
|
|
35
|
+
* { id: 3, pageId: 10, hrefId: 30, hash: 'c', textContent: 'x' },
|
|
36
|
+
* ])];
|
|
37
|
+
* // edges[0] = { page_id: 10, href_page_id: 20, count: 2, first_hash: 'a', ... }
|
|
38
|
+
* // edges[1] = { page_id: 10, href_page_id: 30, count: 1, first_hash: 'c', ... }
|
|
39
|
+
*/
|
|
40
|
+
export function* collapseAnchorRows(rows) {
|
|
41
|
+
let openPageId = null;
|
|
42
|
+
let openHrefId = null;
|
|
43
|
+
let openCount = 0;
|
|
44
|
+
let openFirstHash = null;
|
|
45
|
+
let openFirstTextContent = null;
|
|
46
|
+
let openLastId = null;
|
|
47
|
+
for (const row of rows) {
|
|
48
|
+
if (openPageId === row.pageId && openHrefId === row.hrefId) {
|
|
49
|
+
// Same pair — assert monotonically-increasing `id` so callers
|
|
50
|
+
// that regress the `ORDER BY id` fail loudly instead of
|
|
51
|
+
// silently producing the wrong "first instance". The count-
|
|
52
|
+
// based acceptance check does not catch this (it only sums
|
|
53
|
+
// counts, not first_hash values), so the collapser defends
|
|
54
|
+
// its own precondition.
|
|
55
|
+
if (openLastId !== null && row.id <= openLastId) {
|
|
56
|
+
throw new Error(`collapseAnchorRows: input not sorted by id within (pageId=${row.pageId}, hrefId=${row.hrefId}) — saw id=${row.id} after id=${openLastId}. Caller must ORDER BY pageId, hrefId, id ASC.`);
|
|
57
|
+
}
|
|
58
|
+
openLastId = row.id;
|
|
59
|
+
openCount += 1;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (openPageId !== null && openHrefId !== null) {
|
|
63
|
+
yield {
|
|
64
|
+
page_id: openPageId,
|
|
65
|
+
href_page_id: openHrefId,
|
|
66
|
+
count: openCount,
|
|
67
|
+
first_hash: openFirstHash,
|
|
68
|
+
first_textContent: openFirstTextContent,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
openPageId = row.pageId;
|
|
72
|
+
openHrefId = row.hrefId;
|
|
73
|
+
openCount = 1;
|
|
74
|
+
openFirstHash = row.hash;
|
|
75
|
+
openFirstTextContent = row.textContent;
|
|
76
|
+
openLastId = row.id;
|
|
77
|
+
}
|
|
78
|
+
if (openPageId !== null && openHrefId !== null) {
|
|
79
|
+
yield {
|
|
80
|
+
page_id: openPageId,
|
|
81
|
+
href_page_id: openHrefId,
|
|
82
|
+
count: openCount,
|
|
83
|
+
first_hash: openFirstHash,
|
|
84
|
+
first_textContent: openFirstTextContent,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Computes the `dom_path` string for one DOM element as required by
|
|
3
|
+
* `image_items.dom_path_text_id` (issue #193).
|
|
4
|
+
*
|
|
5
|
+
* Format: slash-joined ancestor tags starting at `<html>`, each tag
|
|
6
|
+
* followed by a 1-based sibling ordinal counting **same-tag** siblings
|
|
7
|
+
* only (e.g.
|
|
8
|
+
* `html/body[1]/main[1]/section[2]/picture[1]/img[1]`). The `<html>`
|
|
9
|
+
* root has no bracketed ordinal because there is only one document
|
|
10
|
+
* root per page.
|
|
11
|
+
*
|
|
12
|
+
* The walk uses `parentElement` + `previousElementSibling` — no
|
|
13
|
+
* document mutation, no reliance on `id` / `class` — so a re-render
|
|
14
|
+
* that only reshuffles class names or ids still produces the same path.
|
|
15
|
+
* The chain of tag names alone is stable for a given DOM shape.
|
|
16
|
+
*
|
|
17
|
+
* The function operates on the generic `Element` interface from DOM lib
|
|
18
|
+
* (available in the crawler's TS lib config) so it does not force
|
|
19
|
+
* jsdom into the crawler runtime — the migration script and unit tests
|
|
20
|
+
* inject jsdom-backed elements, while a future crawler-side wrapper
|
|
21
|
+
* can pass puppeteer's DOM handles through the same code.
|
|
22
|
+
*
|
|
23
|
+
* Detached elements (`element.parentElement === null` before reaching
|
|
24
|
+
* `<html>`) return the tag chain from wherever the walk terminates —
|
|
25
|
+
* a legally detached image (rare, but
|
|
26
|
+
* technically possible during scripted mutations) yields e.g.
|
|
27
|
+
* `img[1]` alone instead of throwing.
|
|
28
|
+
* @param element - The DOM element to derive the path for. Typically an
|
|
29
|
+
* `<img>` in the archived HTML, but the function is not tag-specific.
|
|
30
|
+
* @returns The dom_path string.
|
|
31
|
+
* @example
|
|
32
|
+
* // In an HTML snapshot `<html><body><main><img></main></body></html>`
|
|
33
|
+
* deriveDomPath(imgElement); // 'html/body[1]/main[1]/img[1]'
|
|
34
|
+
*/
|
|
35
|
+
export declare function deriveDomPath(element: Element): string;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Computes the `dom_path` string for one DOM element as required by
|
|
3
|
+
* `image_items.dom_path_text_id` (issue #193).
|
|
4
|
+
*
|
|
5
|
+
* Format: slash-joined ancestor tags starting at `<html>`, each tag
|
|
6
|
+
* followed by a 1-based sibling ordinal counting **same-tag** siblings
|
|
7
|
+
* only (e.g.
|
|
8
|
+
* `html/body[1]/main[1]/section[2]/picture[1]/img[1]`). The `<html>`
|
|
9
|
+
* root has no bracketed ordinal because there is only one document
|
|
10
|
+
* root per page.
|
|
11
|
+
*
|
|
12
|
+
* The walk uses `parentElement` + `previousElementSibling` — no
|
|
13
|
+
* document mutation, no reliance on `id` / `class` — so a re-render
|
|
14
|
+
* that only reshuffles class names or ids still produces the same path.
|
|
15
|
+
* The chain of tag names alone is stable for a given DOM shape.
|
|
16
|
+
*
|
|
17
|
+
* The function operates on the generic `Element` interface from DOM lib
|
|
18
|
+
* (available in the crawler's TS lib config) so it does not force
|
|
19
|
+
* jsdom into the crawler runtime — the migration script and unit tests
|
|
20
|
+
* inject jsdom-backed elements, while a future crawler-side wrapper
|
|
21
|
+
* can pass puppeteer's DOM handles through the same code.
|
|
22
|
+
*
|
|
23
|
+
* Detached elements (`element.parentElement === null` before reaching
|
|
24
|
+
* `<html>`) return the tag chain from wherever the walk terminates —
|
|
25
|
+
* a legally detached image (rare, but
|
|
26
|
+
* technically possible during scripted mutations) yields e.g.
|
|
27
|
+
* `img[1]` alone instead of throwing.
|
|
28
|
+
* @param element - The DOM element to derive the path for. Typically an
|
|
29
|
+
* `<img>` in the archived HTML, but the function is not tag-specific.
|
|
30
|
+
* @returns The dom_path string.
|
|
31
|
+
* @example
|
|
32
|
+
* // In an HTML snapshot `<html><body><main><img></main></body></html>`
|
|
33
|
+
* deriveDomPath(imgElement); // 'html/body[1]/main[1]/img[1]'
|
|
34
|
+
*/
|
|
35
|
+
export function deriveDomPath(element) {
|
|
36
|
+
const segments = [];
|
|
37
|
+
let current = element;
|
|
38
|
+
while (current !== null) {
|
|
39
|
+
const tag = current.tagName.toLowerCase();
|
|
40
|
+
if (tag === 'html') {
|
|
41
|
+
segments.unshift('html');
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
segments.unshift(`${tag}[${computeSiblingOrdinal(current, tag)}]`);
|
|
45
|
+
current = current.parentElement;
|
|
46
|
+
}
|
|
47
|
+
return segments.join('/');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Counts how many earlier siblings share the same tag name as `element`,
|
|
51
|
+
* returning `count + 1` as the 1-based ordinal.
|
|
52
|
+
*
|
|
53
|
+
* Iterating `previousElementSibling` is O(k) where k is the sibling
|
|
54
|
+
* position; for typical DOM depth and sibling counts this is negligible
|
|
55
|
+
* next to the jsdom parse cost of the enclosing page.
|
|
56
|
+
* @param element - The element whose ordinal is being computed.
|
|
57
|
+
* @param tag - The lower-cased tag name to match on. Passed in by the
|
|
58
|
+
* caller so `element.tagName.toLowerCase()` is not recomputed inside
|
|
59
|
+
* the loop for every sibling comparison.
|
|
60
|
+
* @returns 1-based ordinal among same-tag siblings.
|
|
61
|
+
*/
|
|
62
|
+
function computeSiblingOrdinal(element, tag) {
|
|
63
|
+
let count = 1;
|
|
64
|
+
let sibling = element.previousElementSibling;
|
|
65
|
+
while (sibling !== null) {
|
|
66
|
+
if (sibling.tagName.toLowerCase() === tag) {
|
|
67
|
+
count += 1;
|
|
68
|
+
}
|
|
69
|
+
sibling = sibling.previousElementSibling;
|
|
70
|
+
}
|
|
71
|
+
return count;
|
|
72
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Predicate matching the ref-tables populate's routing rule
|
|
3
|
+
* (`populate-ref-tables/populate-url-refs.ts` /
|
|
4
|
+
* `populate-ref-tables/populate-blob-refs.ts`): a `data:` URI whose
|
|
5
|
+
* length exceeds {@link DATA_URI_URL_REFS_LIMIT} lands in `blob_refs`;
|
|
6
|
+
* anything else (regular URL or short data URI) lands in `url_refs`.
|
|
7
|
+
* Shared by every entity populate that partitions a URL-shaped column
|
|
8
|
+
* into the two dictionaries (`populate-image-items.ts`,
|
|
9
|
+
* `populate-resource-items.ts`).
|
|
10
|
+
* @param value - Raw URL-shaped column value.
|
|
11
|
+
* @returns `true` when the value belongs in `blob_refs`.
|
|
12
|
+
* @example
|
|
13
|
+
* isBlobRefValue('data:image/png;base64,' + 'x'.repeat(600)); // true
|
|
14
|
+
* isBlobRefValue('https://example.com/a.png'); // false
|
|
15
|
+
*/
|
|
16
|
+
export declare function isBlobRefValue(value: string): boolean;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { DATA_URI_URL_REFS_LIMIT } from '../populate-ref-tables/data-uri-url-refs-limit.js';
|
|
2
|
+
/**
|
|
3
|
+
* Predicate matching the ref-tables populate's routing rule
|
|
4
|
+
* (`populate-ref-tables/populate-url-refs.ts` /
|
|
5
|
+
* `populate-ref-tables/populate-blob-refs.ts`): a `data:` URI whose
|
|
6
|
+
* length exceeds {@link DATA_URI_URL_REFS_LIMIT} lands in `blob_refs`;
|
|
7
|
+
* anything else (regular URL or short data URI) lands in `url_refs`.
|
|
8
|
+
* Shared by every entity populate that partitions a URL-shaped column
|
|
9
|
+
* into the two dictionaries (`populate-image-items.ts`,
|
|
10
|
+
* `populate-resource-items.ts`).
|
|
11
|
+
* @param value - Raw URL-shaped column value.
|
|
12
|
+
* @returns `true` when the value belongs in `blob_refs`.
|
|
13
|
+
* @example
|
|
14
|
+
* isBlobRefValue('data:image/png;base64,' + 'x'.repeat(600)); // true
|
|
15
|
+
* isBlobRefValue('https://example.com/a.png'); // false
|
|
16
|
+
*/
|
|
17
|
+
export function isBlobRefValue(value) {
|
|
18
|
+
return value.startsWith('data:') && value.length > DATA_URI_URL_REFS_LIMIT;
|
|
19
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { DomPathCandidate, DomPathResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* One image record projected onto the fields the matcher needs:
|
|
4
|
+
* `id` (used to build the returned Map) and `sourceCode` (the outerHTML
|
|
5
|
+
* string to match against document candidates). `id` may be a real
|
|
6
|
+
* `images.id` (migration) or a synthetic per-page index (crawler write
|
|
7
|
+
* path) — the matcher only requires ids to be unique within one call and
|
|
8
|
+
* ordered in crawler insertion order.
|
|
9
|
+
*/
|
|
10
|
+
interface ImageRowForMatching {
|
|
11
|
+
/** Unique-within-call id, in crawler insertion order. */
|
|
12
|
+
id: number;
|
|
13
|
+
/**
|
|
14
|
+
* The `<img>` element's `outerHTML` as captured by the crawler.
|
|
15
|
+
* `null` when the crawler failed to capture the source (a null blob
|
|
16
|
+
* or a puppeteer serialisation edge case).
|
|
17
|
+
*/
|
|
18
|
+
sourceCode: string | null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Matches image records to their DOM-path strings using a 3-case
|
|
22
|
+
* algorithm (issue #193).
|
|
23
|
+
*
|
|
24
|
+
* The three cases:
|
|
25
|
+
*
|
|
26
|
+
* 1. **Single match** — `image.sourceCode` matches exactly one `<img>`
|
|
27
|
+
* outerHTML in the document. Assign that candidate's `dom_path`.
|
|
28
|
+
* 2. **Ordinal match** — multiple `<img>` elements share the same
|
|
29
|
+
* outerHTML (identical `src` / `alt` / attributes on the same page).
|
|
30
|
+
* Assign paths in `id` order, matching the crawler's insertion order
|
|
31
|
+
* which is expected to correspond to DOM order.
|
|
32
|
+
* 3. **Unknown** — `sourceCode` is null OR no matching `<img>` exists
|
|
33
|
+
* in the document (crawler-side rewriting drift). Fall back to the
|
|
34
|
+
* synthetic `unknown/<id>` marker so the `dom_path_text_id NOT NULL`
|
|
35
|
+
* constraint is still satisfied.
|
|
36
|
+
*
|
|
37
|
+
* The function is pure — no DB, no DOM. Callers produce the candidate
|
|
38
|
+
* list from whatever DOM they have: jsdom over an archived HTML snapshot
|
|
39
|
+
* (migration script) or an in-browser walk over the live page (crawler
|
|
40
|
+
* write path). See {@link ./types.ts}'s `DomPathCandidate`.
|
|
41
|
+
*
|
|
42
|
+
* `candidatesInDocumentOrder` MUST already be in document order — the
|
|
43
|
+
* matcher does not sort. `document.querySelectorAll('img')` satisfies
|
|
44
|
+
* this contract; ordering is the caller's responsibility.
|
|
45
|
+
*
|
|
46
|
+
* `images` MUST already be sorted by `id` ascending for the ordinal-
|
|
47
|
+
* match case to reproduce the crawler's insertion order deterministically.
|
|
48
|
+
* A minor deviation from this ordering only affects the ordinal-match
|
|
49
|
+
* branch — single-match and unknown branches are order-independent.
|
|
50
|
+
* @param images - The page's image records in `id` order.
|
|
51
|
+
* @param candidatesInDocumentOrder - `<img>` outerHTML + dom_path pairs
|
|
52
|
+
* from the document, in document order.
|
|
53
|
+
* @returns Map keyed by `images[].id`; every input row gets one entry.
|
|
54
|
+
* @example
|
|
55
|
+
* const jsdom = new JSDOM(html);
|
|
56
|
+
* const candidates = [...jsdom.window.document.querySelectorAll('img')].map(
|
|
57
|
+
* (img) => ({ outerHTML: img.outerHTML, path: deriveDomPath(img) }),
|
|
58
|
+
* );
|
|
59
|
+
* const result = matchImagesToDomPaths(
|
|
60
|
+
* [{ id: 1, sourceCode: '<img src="a.png">' }],
|
|
61
|
+
* candidates,
|
|
62
|
+
* );
|
|
63
|
+
* result.get(1); // { path: 'html/body[1]/img[1]', case: 'single-match' }
|
|
64
|
+
*/
|
|
65
|
+
export declare function matchImagesToDomPaths(images: readonly ImageRowForMatching[], candidatesInDocumentOrder: readonly DomPathCandidate[]): ReadonlyMap<number, DomPathResult>;
|
|
66
|
+
export {};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Matches image records to their DOM-path strings using a 3-case
|
|
3
|
+
* algorithm (issue #193).
|
|
4
|
+
*
|
|
5
|
+
* The three cases:
|
|
6
|
+
*
|
|
7
|
+
* 1. **Single match** — `image.sourceCode` matches exactly one `<img>`
|
|
8
|
+
* outerHTML in the document. Assign that candidate's `dom_path`.
|
|
9
|
+
* 2. **Ordinal match** — multiple `<img>` elements share the same
|
|
10
|
+
* outerHTML (identical `src` / `alt` / attributes on the same page).
|
|
11
|
+
* Assign paths in `id` order, matching the crawler's insertion order
|
|
12
|
+
* which is expected to correspond to DOM order.
|
|
13
|
+
* 3. **Unknown** — `sourceCode` is null OR no matching `<img>` exists
|
|
14
|
+
* in the document (crawler-side rewriting drift). Fall back to the
|
|
15
|
+
* synthetic `unknown/<id>` marker so the `dom_path_text_id NOT NULL`
|
|
16
|
+
* constraint is still satisfied.
|
|
17
|
+
*
|
|
18
|
+
* The function is pure — no DB, no DOM. Callers produce the candidate
|
|
19
|
+
* list from whatever DOM they have: jsdom over an archived HTML snapshot
|
|
20
|
+
* (migration script) or an in-browser walk over the live page (crawler
|
|
21
|
+
* write path). See {@link ./types.ts}'s `DomPathCandidate`.
|
|
22
|
+
*
|
|
23
|
+
* `candidatesInDocumentOrder` MUST already be in document order — the
|
|
24
|
+
* matcher does not sort. `document.querySelectorAll('img')` satisfies
|
|
25
|
+
* this contract; ordering is the caller's responsibility.
|
|
26
|
+
*
|
|
27
|
+
* `images` MUST already be sorted by `id` ascending for the ordinal-
|
|
28
|
+
* match case to reproduce the crawler's insertion order deterministically.
|
|
29
|
+
* A minor deviation from this ordering only affects the ordinal-match
|
|
30
|
+
* branch — single-match and unknown branches are order-independent.
|
|
31
|
+
* @param images - The page's image records in `id` order.
|
|
32
|
+
* @param candidatesInDocumentOrder - `<img>` outerHTML + dom_path pairs
|
|
33
|
+
* from the document, in document order.
|
|
34
|
+
* @returns Map keyed by `images[].id`; every input row gets one entry.
|
|
35
|
+
* @example
|
|
36
|
+
* const jsdom = new JSDOM(html);
|
|
37
|
+
* const candidates = [...jsdom.window.document.querySelectorAll('img')].map(
|
|
38
|
+
* (img) => ({ outerHTML: img.outerHTML, path: deriveDomPath(img) }),
|
|
39
|
+
* );
|
|
40
|
+
* const result = matchImagesToDomPaths(
|
|
41
|
+
* [{ id: 1, sourceCode: '<img src="a.png">' }],
|
|
42
|
+
* candidates,
|
|
43
|
+
* );
|
|
44
|
+
* result.get(1); // { path: 'html/body[1]/img[1]', case: 'single-match' }
|
|
45
|
+
*/
|
|
46
|
+
export function matchImagesToDomPaths(images, candidatesInDocumentOrder) {
|
|
47
|
+
const byOuterHtml = new Map();
|
|
48
|
+
for (const candidate of candidatesInDocumentOrder) {
|
|
49
|
+
const bucket = byOuterHtml.get(candidate.outerHTML);
|
|
50
|
+
if (bucket === undefined) {
|
|
51
|
+
byOuterHtml.set(candidate.outerHTML, [candidate]);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
bucket.push(candidate);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const cursorByOuterHtml = new Map();
|
|
58
|
+
const result = new Map();
|
|
59
|
+
for (const image of images) {
|
|
60
|
+
if (image.sourceCode === null || image.sourceCode === '') {
|
|
61
|
+
result.set(image.id, { path: `unknown/${image.id}`, case: 'unknown' });
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const candidates = byOuterHtml.get(image.sourceCode);
|
|
65
|
+
if (candidates === undefined || candidates.length === 0) {
|
|
66
|
+
result.set(image.id, { path: `unknown/${image.id}`, case: 'unknown' });
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (candidates.length === 1) {
|
|
70
|
+
result.set(image.id, {
|
|
71
|
+
path: candidates[0].path,
|
|
72
|
+
case: 'single-match',
|
|
73
|
+
});
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
const cursor = cursorByOuterHtml.get(image.sourceCode) ?? 0;
|
|
77
|
+
cursorByOuterHtml.set(image.sourceCode, cursor + 1);
|
|
78
|
+
const chosen = candidates[cursor];
|
|
79
|
+
if (chosen === undefined) {
|
|
80
|
+
// More image records share this outerHTML than the document
|
|
81
|
+
// has matching `<img>` elements. Reusing the last candidate
|
|
82
|
+
// (`candidates.at(-1)`) would silently map every overflow row
|
|
83
|
+
// to the same element, producing multiple `image_items` rows
|
|
84
|
+
// with the same `dom_path_text_id`. Falling back to
|
|
85
|
+
// `unknown/<id>` keeps overflow rows individually
|
|
86
|
+
// distinguishable in the archive.
|
|
87
|
+
result.set(image.id, { path: `unknown/${image.id}`, case: 'unknown' });
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
result.set(image.id, {
|
|
91
|
+
path: chosen.path,
|
|
92
|
+
case: 'ordinal-match',
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ProgressCallback } from '../create-progress-reporter.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Populates `anchor_edges` from `anchors` (issue #193).
|
|
5
|
+
*
|
|
6
|
+
* The algorithm is a **single keyset-paginated scan** over `anchors`
|
|
7
|
+
* ordered by `(pageId, hrefId, id)`. Each chunk feeds
|
|
8
|
+
* {@link ./collapse-anchor-rows.ts}, which yields one edge per distinct
|
|
9
|
+
* `(pageId, hrefId)` pair as soon as the pair boundary is observed.
|
|
10
|
+
*
|
|
11
|
+
* A boundary can straddle two chunks (the last row of chunk N shares a
|
|
12
|
+
* pair with the first row of chunk N+1), so the outer loop keeps an
|
|
13
|
+
* "open edge" state that flushes only when the *next* pair actually
|
|
14
|
+
* starts. On end-of-stream the last open edge is emitted.
|
|
15
|
+
*
|
|
16
|
+
* `first_text_id` is left unresolved during the streaming pass — the
|
|
17
|
+
* text is buffered on each pending edge and resolved in bulk by
|
|
18
|
+
* {@link ./resolve-text-refs.ts} at INSERT time. Every INSERT batch
|
|
19
|
+
* therefore issues one text-refs lookup + one INSERT, keeping DB
|
|
20
|
+
* round-trips per edge low.
|
|
21
|
+
*
|
|
22
|
+
* `INSERT OR IGNORE` on the `(page_id, href_page_id)` UNIQUE composite
|
|
23
|
+
* makes the step idempotent: a re-run after partial failure re-emits the
|
|
24
|
+
* same edges but the writes no-op.
|
|
25
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
26
|
+
* @param onProgress - Optional sink for periodic progress lines (one per
|
|
27
|
+
* ~5% of `anchors` scanned); see {@link ../create-progress-reporter.ts}.
|
|
28
|
+
* @example
|
|
29
|
+
* await knex.transaction(async (trx) => {
|
|
30
|
+
* await populateAnchorEdges(trx);
|
|
31
|
+
* });
|
|
32
|
+
*/
|
|
33
|
+
export declare function populateAnchorEdges(trx: Knex, onProgress?: ProgressCallback): Promise<void>;
|