@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,51 @@
|
|
|
1
|
+
import type { Config } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Merges two or more source archives' {@link Config} into the config
|
|
4
|
+
* concat's output archive is created with.
|
|
5
|
+
*
|
|
6
|
+
* - `disableQueries` and `fromList` must be IDENTICAL across every
|
|
7
|
+
* source, or this throws {@link ArchiveConfigConflictError}:
|
|
8
|
+
* - `disableQueries` changes how every URL is normalised
|
|
9
|
+
* (`normalizeArchiveUrl`'s `ExURL.withoutHashAndAuth` vs. a
|
|
10
|
+
* query-stripped form) — sources crawled with different settings
|
|
11
|
+
* have incomparable `url_refs.url` values, so URL-string matching
|
|
12
|
+
* (`plan-content-items-for-concat.ts`'s whole mechanism) would
|
|
13
|
+
* silently misclassify identical URLs as distinct.
|
|
14
|
+
* - `fromList` archives restrict which internal rows the viewer read
|
|
15
|
+
* model admits to exactly `config.roots` (`computeFromListAllowedPageIds`) —
|
|
16
|
+
* mixing a `fromList` source with a recursive one has no single
|
|
17
|
+
* correct restriction rule.
|
|
18
|
+
* - `roots` is the union of every source's roots, in argument order,
|
|
19
|
+
* deduplicated (a root appearing in two sources counts once).
|
|
20
|
+
* `baseUrl` is the merged `roots[0]`.
|
|
21
|
+
* - `excludes` / `excludeKeywords` / `excludeUrls` are unioned the same
|
|
22
|
+
* way, order-preserving.
|
|
23
|
+
* - `requestHeaderNames` is unioned too: it only records which header names
|
|
24
|
+
* ANY source needed (never values), so dropping a later source's names would
|
|
25
|
+
* silence the "re-supply these headers" warning for that source's pages.
|
|
26
|
+
* - Every other scalar field (`recursive`, `interval`, `image`,
|
|
27
|
+
* `fetchExternal`, `parallels`, `maxExcludedDepth`, `retry`,
|
|
28
|
+
* `userAgent`, `ignoreRobots`, `mainContentSelector`) is taken from the
|
|
29
|
+
* FIRST source — these only ever describe how a crawl session was RUN,
|
|
30
|
+
* never the shape of the data, so there is no principled way to merge
|
|
31
|
+
* two different values and "first argument wins" is at least
|
|
32
|
+
* predictable.
|
|
33
|
+
* - `version` is always {@link REQUIRED_FORMAT_VERSION} (the output is a
|
|
34
|
+
* freshly-created archive on the current format) and `createdCwd` is
|
|
35
|
+
* always `null` (never persisted into a shared `.nitpicker`, per
|
|
36
|
+
* `Archive.write()`'s own scrub — see the DB schema doc's `info.createdCwd`
|
|
37
|
+
* entry).
|
|
38
|
+
* @param configs - Every source's `getConfig()` result, in argument order.
|
|
39
|
+
* @param name - The output archive's `name` (typically its basename).
|
|
40
|
+
* @returns The merged {@link Config} to write via `Archive#setConfig`.
|
|
41
|
+
* @throws {ArchiveConfigConflictError} If `disableQueries` or `fromList`
|
|
42
|
+
* differ across `configs`.
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* const merged = mergeArchiveConfigs(
|
|
46
|
+
* [await a.getConfig(), await b.getConfig()],
|
|
47
|
+
* 'merged',
|
|
48
|
+
* );
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare function mergeArchiveConfigs(configs: readonly Config[], name: string): Config;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { REQUIRED_FORMAT_VERSION } from '../meta/assert-compatible-version.js';
|
|
2
|
+
import { ArchiveConfigConflictError } from './types.js';
|
|
3
|
+
/** {@link Config} fields that must be IDENTICAL across every source, or concat refuses. */
|
|
4
|
+
const STRICT_MATCH_FIELDS = ['disableQueries', 'fromList'];
|
|
5
|
+
/**
|
|
6
|
+
* Merges two or more source archives' {@link Config} into the config
|
|
7
|
+
* concat's output archive is created with.
|
|
8
|
+
*
|
|
9
|
+
* - `disableQueries` and `fromList` must be IDENTICAL across every
|
|
10
|
+
* source, or this throws {@link ArchiveConfigConflictError}:
|
|
11
|
+
* - `disableQueries` changes how every URL is normalised
|
|
12
|
+
* (`normalizeArchiveUrl`'s `ExURL.withoutHashAndAuth` vs. a
|
|
13
|
+
* query-stripped form) — sources crawled with different settings
|
|
14
|
+
* have incomparable `url_refs.url` values, so URL-string matching
|
|
15
|
+
* (`plan-content-items-for-concat.ts`'s whole mechanism) would
|
|
16
|
+
* silently misclassify identical URLs as distinct.
|
|
17
|
+
* - `fromList` archives restrict which internal rows the viewer read
|
|
18
|
+
* model admits to exactly `config.roots` (`computeFromListAllowedPageIds`) —
|
|
19
|
+
* mixing a `fromList` source with a recursive one has no single
|
|
20
|
+
* correct restriction rule.
|
|
21
|
+
* - `roots` is the union of every source's roots, in argument order,
|
|
22
|
+
* deduplicated (a root appearing in two sources counts once).
|
|
23
|
+
* `baseUrl` is the merged `roots[0]`.
|
|
24
|
+
* - `excludes` / `excludeKeywords` / `excludeUrls` are unioned the same
|
|
25
|
+
* way, order-preserving.
|
|
26
|
+
* - `requestHeaderNames` is unioned too: it only records which header names
|
|
27
|
+
* ANY source needed (never values), so dropping a later source's names would
|
|
28
|
+
* silence the "re-supply these headers" warning for that source's pages.
|
|
29
|
+
* - Every other scalar field (`recursive`, `interval`, `image`,
|
|
30
|
+
* `fetchExternal`, `parallels`, `maxExcludedDepth`, `retry`,
|
|
31
|
+
* `userAgent`, `ignoreRobots`, `mainContentSelector`) is taken from the
|
|
32
|
+
* FIRST source — these only ever describe how a crawl session was RUN,
|
|
33
|
+
* never the shape of the data, so there is no principled way to merge
|
|
34
|
+
* two different values and "first argument wins" is at least
|
|
35
|
+
* predictable.
|
|
36
|
+
* - `version` is always {@link REQUIRED_FORMAT_VERSION} (the output is a
|
|
37
|
+
* freshly-created archive on the current format) and `createdCwd` is
|
|
38
|
+
* always `null` (never persisted into a shared `.nitpicker`, per
|
|
39
|
+
* `Archive.write()`'s own scrub — see the DB schema doc's `info.createdCwd`
|
|
40
|
+
* entry).
|
|
41
|
+
* @param configs - Every source's `getConfig()` result, in argument order.
|
|
42
|
+
* @param name - The output archive's `name` (typically its basename).
|
|
43
|
+
* @returns The merged {@link Config} to write via `Archive#setConfig`.
|
|
44
|
+
* @throws {ArchiveConfigConflictError} If `disableQueries` or `fromList`
|
|
45
|
+
* differ across `configs`.
|
|
46
|
+
* @example
|
|
47
|
+
* ```ts
|
|
48
|
+
* const merged = mergeArchiveConfigs(
|
|
49
|
+
* [await a.getConfig(), await b.getConfig()],
|
|
50
|
+
* 'merged',
|
|
51
|
+
* );
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export function mergeArchiveConfigs(configs, name) {
|
|
55
|
+
if (configs.length === 0) {
|
|
56
|
+
throw new Error('mergeArchiveConfigs: at least one source config is required');
|
|
57
|
+
}
|
|
58
|
+
for (const field of STRICT_MATCH_FIELDS) {
|
|
59
|
+
const values = configs.map((c) => c[field]);
|
|
60
|
+
const distinct = new Set(values);
|
|
61
|
+
if (distinct.size > 1) {
|
|
62
|
+
throw new ArchiveConfigConflictError(field, values);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const roots = [...new Set(configs.flatMap((c) => c.roots))];
|
|
66
|
+
const excludes = [...new Set(configs.flatMap((c) => c.excludes))];
|
|
67
|
+
const excludeKeywords = [...new Set(configs.flatMap((c) => c.excludeKeywords))];
|
|
68
|
+
const excludeUrls = [...new Set(configs.flatMap((c) => c.excludeUrls))];
|
|
69
|
+
const requestHeaderNames = [
|
|
70
|
+
...new Set(configs.flatMap((c) => c.requestHeaderNames ?? [])),
|
|
71
|
+
];
|
|
72
|
+
const first = configs[0];
|
|
73
|
+
return {
|
|
74
|
+
...first,
|
|
75
|
+
version: REQUIRED_FORMAT_VERSION,
|
|
76
|
+
name,
|
|
77
|
+
roots,
|
|
78
|
+
baseUrl: roots[0],
|
|
79
|
+
excludes,
|
|
80
|
+
excludeKeywords,
|
|
81
|
+
excludeUrls,
|
|
82
|
+
requestHeaderNames,
|
|
83
|
+
createdCwd: null,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Populates `temp.xfer_ci_plan` for one concat source: every source
|
|
4
|
+
* `content_items` row is matched against the destination by URL string
|
|
5
|
+
* (`url_refs.url`, not `url_id` — the two archives assign unrelated ids to
|
|
6
|
+
* the same URL) and classified as:
|
|
7
|
+
*
|
|
8
|
+
* - `full` — no destination row exists yet for this URL.
|
|
9
|
+
* - `replace` — a destination row exists, and this source's rank
|
|
10
|
+
* ({@link contentItemRankSql}) is greater than or equal to the
|
|
11
|
+
* destination's. `>=` (not `>`) is deliberate: sources are merged one at
|
|
12
|
+
* a time in argument order, always compared against the CURRENT
|
|
13
|
+
* destination state, so an equal rank still overwrites — this is what
|
|
14
|
+
* makes "ties go to the later argument" fall out naturally, with no
|
|
15
|
+
* extra tie-breaking logic needed.
|
|
16
|
+
* - `skip` — a destination row exists and outranks this source's row; the
|
|
17
|
+
* destination's existing (better) observation is left untouched.
|
|
18
|
+
*
|
|
19
|
+
* Every source row gets a plan entry (concat never drops a row outright —
|
|
20
|
+
* that only happens in split, where a row can be out of the new scope AND
|
|
21
|
+
* unreferenced). `dest_id` is left `NULL` for `full` rows here; it is
|
|
22
|
+
* filled in once {@link import('./insert-content-items.js').insertContentItems}
|
|
23
|
+
* assigns the new destination id.
|
|
24
|
+
* @param trx - Transaction with the source ATTACHed as
|
|
25
|
+
* {@link TRANSFER_SOURCE_ALIAS}. Must run after
|
|
26
|
+
* {@link import('./create-transfer-temp-tables.js').createTransferTempTables}.
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* await planContentItemsForConcat(trx);
|
|
30
|
+
* const { full, replace, skip } = await countPlanActions(trx); // for progress reporting
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare function planContentItemsForConcat(trx: Knex): Promise<void>;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { contentItemRankSql } from './content-item-rank-sql.js';
|
|
2
|
+
import { TRANSFER_ACTION } from './transfer-action.js';
|
|
3
|
+
import { TRANSFER_SOURCE_ALIAS } from './transfer-source-alias.js';
|
|
4
|
+
/**
|
|
5
|
+
* Populates `temp.xfer_ci_plan` for one concat source: every source
|
|
6
|
+
* `content_items` row is matched against the destination by URL string
|
|
7
|
+
* (`url_refs.url`, not `url_id` — the two archives assign unrelated ids to
|
|
8
|
+
* the same URL) and classified as:
|
|
9
|
+
*
|
|
10
|
+
* - `full` — no destination row exists yet for this URL.
|
|
11
|
+
* - `replace` — a destination row exists, and this source's rank
|
|
12
|
+
* ({@link contentItemRankSql}) is greater than or equal to the
|
|
13
|
+
* destination's. `>=` (not `>`) is deliberate: sources are merged one at
|
|
14
|
+
* a time in argument order, always compared against the CURRENT
|
|
15
|
+
* destination state, so an equal rank still overwrites — this is what
|
|
16
|
+
* makes "ties go to the later argument" fall out naturally, with no
|
|
17
|
+
* extra tie-breaking logic needed.
|
|
18
|
+
* - `skip` — a destination row exists and outranks this source's row; the
|
|
19
|
+
* destination's existing (better) observation is left untouched.
|
|
20
|
+
*
|
|
21
|
+
* Every source row gets a plan entry (concat never drops a row outright —
|
|
22
|
+
* that only happens in split, where a row can be out of the new scope AND
|
|
23
|
+
* unreferenced). `dest_id` is left `NULL` for `full` rows here; it is
|
|
24
|
+
* filled in once {@link import('./insert-content-items.js').insertContentItems}
|
|
25
|
+
* assigns the new destination id.
|
|
26
|
+
* @param trx - Transaction with the source ATTACHed as
|
|
27
|
+
* {@link TRANSFER_SOURCE_ALIAS}. Must run after
|
|
28
|
+
* {@link import('./create-transfer-temp-tables.js').createTransferTempTables}.
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* await planContentItemsForConcat(trx);
|
|
32
|
+
* const { full, replace, skip } = await countPlanActions(trx); // for progress reporting
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export async function planContentItemsForConcat(trx) {
|
|
36
|
+
await trx.raw(`
|
|
37
|
+
INSERT INTO xfer_ci_plan (src_id, action, dest_id)
|
|
38
|
+
SELECT
|
|
39
|
+
s.id,
|
|
40
|
+
CASE
|
|
41
|
+
WHEN d.id IS NULL THEN ${TRANSFER_ACTION.full}
|
|
42
|
+
WHEN ${contentItemRankSql('s')} >= ${contentItemRankSql('d')} THEN ${TRANSFER_ACTION.replace}
|
|
43
|
+
ELSE ${TRANSFER_ACTION.skip}
|
|
44
|
+
END,
|
|
45
|
+
d.id
|
|
46
|
+
FROM ${TRANSFER_SOURCE_ALIAS}.content_items s
|
|
47
|
+
JOIN ${TRANSFER_SOURCE_ALIAS}.url_refs su ON su.id = s.url_id
|
|
48
|
+
LEFT JOIN main.url_refs du ON du.url = su.url
|
|
49
|
+
LEFT JOIN main.content_items d ON d.url_id = du.id
|
|
50
|
+
`);
|
|
51
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Populates `temp.xfer_ci_plan` for split, in three passes over the
|
|
4
|
+
* source's `content_items`:
|
|
5
|
+
*
|
|
6
|
+
* 1. **Core** — every id `temp.xfer_ci_in_scope` marked (in-scope,
|
|
7
|
+
* internal — see
|
|
8
|
+
* {@link import('./mark-in-scope-content-items.js').markInScopeContentItems})
|
|
9
|
+
* is kept in `full`.
|
|
10
|
+
* 2. **Redirect-destination promotion** — a core row's `redirect_dest_id`,
|
|
11
|
+
* when it points at an INTERNAL row, joins core as `full` too, even if
|
|
12
|
+
* that destination's own path falls outside the split scope. This is
|
|
13
|
+
* the same invariant `insertPage` documents: "the redirect destination
|
|
14
|
+
* of an in-scope request is recorded internal even when its path is out
|
|
15
|
+
* of scope" (a soft-404 landing page is the canonical example) — split
|
|
16
|
+
* must not treat that page differently than a live crawl would. Only
|
|
17
|
+
* ONE hop is honoured here, matching `redirect_dest_id`'s own
|
|
18
|
+
* contract: crawler writes always pre-flatten a redirect chain to its
|
|
19
|
+
* final destination at write time, so a single JOIN already reaches the
|
|
20
|
+
* terminal page — there is no multi-hop chain left to walk in a
|
|
21
|
+
* single, not-yet-merged source archive (concat, which CAN reintroduce
|
|
22
|
+
* a multi-hop chain by combining two sources, re-flattens separately —
|
|
23
|
+
* see `flatten-redirect-chains.ts`).
|
|
24
|
+
* 3. **Referenced-row stubbing** — any row NOT in core that a core row's
|
|
25
|
+
* `anchor_edges` targets, or that a core row's `redirect_dest_id`
|
|
26
|
+
* points at (now only the EXTERNAL case survives this filter, since
|
|
27
|
+
* every internal destination was already absorbed into core by pass
|
|
28
|
+
* 2), is kept as a `stub`: the `content_items` row only, forced
|
|
29
|
+
* external — see `insert-content-items.ts`. A row reachable by neither
|
|
30
|
+
* path is left out of the plan entirely, which is split's definition
|
|
31
|
+
* of "dropped".
|
|
32
|
+
* @param trx - Transaction with the source ATTACHed as
|
|
33
|
+
* {@link TRANSFER_SOURCE_ALIAS}. Must run after
|
|
34
|
+
* {@link import('./mark-in-scope-content-items.js').markInScopeContentItems}
|
|
35
|
+
* has populated `temp.xfer_ci_in_scope`.
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* await markInScopeContentItems(trx, scope, sourceConfig);
|
|
39
|
+
* await planContentItemsForSplit(trx);
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare function planContentItemsForSplit(trx: Knex): Promise<void>;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { TRANSFER_ACTION } from './transfer-action.js';
|
|
2
|
+
import { TRANSFER_SOURCE_ALIAS } from './transfer-source-alias.js';
|
|
3
|
+
/**
|
|
4
|
+
* Populates `temp.xfer_ci_plan` for split, in three passes over the
|
|
5
|
+
* source's `content_items`:
|
|
6
|
+
*
|
|
7
|
+
* 1. **Core** — every id `temp.xfer_ci_in_scope` marked (in-scope,
|
|
8
|
+
* internal — see
|
|
9
|
+
* {@link import('./mark-in-scope-content-items.js').markInScopeContentItems})
|
|
10
|
+
* is kept in `full`.
|
|
11
|
+
* 2. **Redirect-destination promotion** — a core row's `redirect_dest_id`,
|
|
12
|
+
* when it points at an INTERNAL row, joins core as `full` too, even if
|
|
13
|
+
* that destination's own path falls outside the split scope. This is
|
|
14
|
+
* the same invariant `insertPage` documents: "the redirect destination
|
|
15
|
+
* of an in-scope request is recorded internal even when its path is out
|
|
16
|
+
* of scope" (a soft-404 landing page is the canonical example) — split
|
|
17
|
+
* must not treat that page differently than a live crawl would. Only
|
|
18
|
+
* ONE hop is honoured here, matching `redirect_dest_id`'s own
|
|
19
|
+
* contract: crawler writes always pre-flatten a redirect chain to its
|
|
20
|
+
* final destination at write time, so a single JOIN already reaches the
|
|
21
|
+
* terminal page — there is no multi-hop chain left to walk in a
|
|
22
|
+
* single, not-yet-merged source archive (concat, which CAN reintroduce
|
|
23
|
+
* a multi-hop chain by combining two sources, re-flattens separately —
|
|
24
|
+
* see `flatten-redirect-chains.ts`).
|
|
25
|
+
* 3. **Referenced-row stubbing** — any row NOT in core that a core row's
|
|
26
|
+
* `anchor_edges` targets, or that a core row's `redirect_dest_id`
|
|
27
|
+
* points at (now only the EXTERNAL case survives this filter, since
|
|
28
|
+
* every internal destination was already absorbed into core by pass
|
|
29
|
+
* 2), is kept as a `stub`: the `content_items` row only, forced
|
|
30
|
+
* external — see `insert-content-items.ts`. A row reachable by neither
|
|
31
|
+
* path is left out of the plan entirely, which is split's definition
|
|
32
|
+
* of "dropped".
|
|
33
|
+
* @param trx - Transaction with the source ATTACHed as
|
|
34
|
+
* {@link TRANSFER_SOURCE_ALIAS}. Must run after
|
|
35
|
+
* {@link import('./mark-in-scope-content-items.js').markInScopeContentItems}
|
|
36
|
+
* has populated `temp.xfer_ci_in_scope`.
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* await markInScopeContentItems(trx, scope, sourceConfig);
|
|
40
|
+
* await planContentItemsForSplit(trx);
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export async function planContentItemsForSplit(trx) {
|
|
44
|
+
await trx.raw(`
|
|
45
|
+
INSERT INTO xfer_ci_plan (src_id, action)
|
|
46
|
+
SELECT src_id, ${TRANSFER_ACTION.full} FROM xfer_ci_in_scope
|
|
47
|
+
`);
|
|
48
|
+
await trx.raw(`
|
|
49
|
+
INSERT INTO xfer_ci_plan (src_id, action)
|
|
50
|
+
SELECT DISTINCT d.id, ${TRANSFER_ACTION.full}
|
|
51
|
+
FROM ${TRANSFER_SOURCE_ALIAS}.content_items s
|
|
52
|
+
JOIN xfer_ci_plan p ON p.src_id = s.id
|
|
53
|
+
JOIN ${TRANSFER_SOURCE_ALIAS}.content_items d ON d.id = s.redirect_dest_id
|
|
54
|
+
WHERE d.is_external = 0
|
|
55
|
+
AND d.id NOT IN (SELECT src_id FROM xfer_ci_plan)
|
|
56
|
+
`);
|
|
57
|
+
await trx.raw(`
|
|
58
|
+
INSERT OR IGNORE INTO xfer_ci_ref (src_id)
|
|
59
|
+
SELECT DISTINCT ae.href_page_id
|
|
60
|
+
FROM ${TRANSFER_SOURCE_ALIAS}.anchor_edges ae
|
|
61
|
+
JOIN xfer_ci_plan p ON p.src_id = ae.page_id
|
|
62
|
+
WHERE ae.href_page_id NOT IN (SELECT src_id FROM xfer_ci_plan)
|
|
63
|
+
`);
|
|
64
|
+
// `OR IGNORE` on BOTH inserts (not just this one) is deliberate, not
|
|
65
|
+
// redundant: this table's PK is `src_id`, and an anchor target can also
|
|
66
|
+
// be a redirect target of some other core row, so the two passes can
|
|
67
|
+
// legitimately overlap. The first pass alone cannot collide with itself
|
|
68
|
+
// (`SELECT DISTINCT` on an empty destination table), but relying on
|
|
69
|
+
// that ordering to justify leaving it unguarded would silently break if
|
|
70
|
+
// a third insert into `xfer_ci_ref` were ever added ahead of it.
|
|
71
|
+
await trx.raw(`
|
|
72
|
+
INSERT OR IGNORE INTO xfer_ci_ref (src_id)
|
|
73
|
+
SELECT DISTINCT s.redirect_dest_id
|
|
74
|
+
FROM ${TRANSFER_SOURCE_ALIAS}.content_items s
|
|
75
|
+
JOIN xfer_ci_plan p ON p.src_id = s.id
|
|
76
|
+
WHERE s.redirect_dest_id IS NOT NULL
|
|
77
|
+
AND s.redirect_dest_id NOT IN (SELECT src_id FROM xfer_ci_plan)
|
|
78
|
+
`);
|
|
79
|
+
await trx.raw(`
|
|
80
|
+
INSERT INTO xfer_ci_plan (src_id, action)
|
|
81
|
+
SELECT src_id, ${TRANSFER_ACTION.stub} FROM xfer_ci_ref
|
|
82
|
+
`);
|
|
83
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Populates `temp.xfer_ri_plan` for `resource_items`, one call per source,
|
|
4
|
+
* for either transfer mode:
|
|
5
|
+
*
|
|
6
|
+
* - **`concat`** — every source resource is matched against the
|
|
7
|
+
* destination by its identity (`url_id` resolved through `url_refs.url`,
|
|
8
|
+
* or `url_blob_id` resolved through `blob_refs.hash` — the two are
|
|
9
|
+
* mutually exclusive per `resource_items`' own CHECK constraint, so at
|
|
10
|
+
* most one of the two LEFT JOINs below ever produces a match for a given
|
|
11
|
+
* row) and classified `full` (no destination row yet), `replace`
|
|
12
|
+
* (destination exists but has never recorded a response — `status IS
|
|
13
|
+
* NULL` — while this source has), or `skip` (destination already has a
|
|
14
|
+
* recorded response). Matching happens directly against raw
|
|
15
|
+
* `url`/`hash` values, not through `temp.xfer_map_url_refs`/
|
|
16
|
+
* `xfer_map_blob_refs` — those dictionary maps are built AFTER this
|
|
17
|
+
* plan (`copy-dictionaries-for-concat.ts` needs to know which resources
|
|
18
|
+
* are kept before it can compute needed dictionary ids for split), so
|
|
19
|
+
* this plan cannot depend on them.
|
|
20
|
+
* - **`split`** — a resource is kept (`full`) only when at least one
|
|
21
|
+
* `full`-action page in `temp.xfer_ci_plan` references it via
|
|
22
|
+
* `resource_ref_edges`. A resource with no surviving referrer is left
|
|
23
|
+
* out of the plan (dropped) — split does not preserve an
|
|
24
|
+
* otherwise-orphan resource just because its URL happens to still be
|
|
25
|
+
* in scope (accepted simplification: a resource with zero referring
|
|
26
|
+
* pages has no page context left to display it against in the output
|
|
27
|
+
* archive anyway).
|
|
28
|
+
* @param trx - Transaction with the source ATTACHed as
|
|
29
|
+
* {@link TRANSFER_SOURCE_ALIAS}. For `'split'`, must run after
|
|
30
|
+
* `temp.xfer_ci_plan` has been fully populated (every `full` page
|
|
31
|
+
* decided) — see
|
|
32
|
+
* {@link import('./plan-content-items-for-split.js').planContentItemsForSplit}.
|
|
33
|
+
* @param mode - Which transfer this plan is for.
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* await planContentItemsForSplit(trx);
|
|
37
|
+
* await planResourceItems(trx, 'split');
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare function planResourceItems(trx: Knex, mode: 'concat' | 'split'): Promise<void>;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { TRANSFER_ACTION } from './transfer-action.js';
|
|
2
|
+
import { TRANSFER_SOURCE_ALIAS } from './transfer-source-alias.js';
|
|
3
|
+
/**
|
|
4
|
+
* Populates `temp.xfer_ri_plan` for `resource_items`, one call per source,
|
|
5
|
+
* for either transfer mode:
|
|
6
|
+
*
|
|
7
|
+
* - **`concat`** — every source resource is matched against the
|
|
8
|
+
* destination by its identity (`url_id` resolved through `url_refs.url`,
|
|
9
|
+
* or `url_blob_id` resolved through `blob_refs.hash` — the two are
|
|
10
|
+
* mutually exclusive per `resource_items`' own CHECK constraint, so at
|
|
11
|
+
* most one of the two LEFT JOINs below ever produces a match for a given
|
|
12
|
+
* row) and classified `full` (no destination row yet), `replace`
|
|
13
|
+
* (destination exists but has never recorded a response — `status IS
|
|
14
|
+
* NULL` — while this source has), or `skip` (destination already has a
|
|
15
|
+
* recorded response). Matching happens directly against raw
|
|
16
|
+
* `url`/`hash` values, not through `temp.xfer_map_url_refs`/
|
|
17
|
+
* `xfer_map_blob_refs` — those dictionary maps are built AFTER this
|
|
18
|
+
* plan (`copy-dictionaries-for-concat.ts` needs to know which resources
|
|
19
|
+
* are kept before it can compute needed dictionary ids for split), so
|
|
20
|
+
* this plan cannot depend on them.
|
|
21
|
+
* - **`split`** — a resource is kept (`full`) only when at least one
|
|
22
|
+
* `full`-action page in `temp.xfer_ci_plan` references it via
|
|
23
|
+
* `resource_ref_edges`. A resource with no surviving referrer is left
|
|
24
|
+
* out of the plan (dropped) — split does not preserve an
|
|
25
|
+
* otherwise-orphan resource just because its URL happens to still be
|
|
26
|
+
* in scope (accepted simplification: a resource with zero referring
|
|
27
|
+
* pages has no page context left to display it against in the output
|
|
28
|
+
* archive anyway).
|
|
29
|
+
* @param trx - Transaction with the source ATTACHed as
|
|
30
|
+
* {@link TRANSFER_SOURCE_ALIAS}. For `'split'`, must run after
|
|
31
|
+
* `temp.xfer_ci_plan` has been fully populated (every `full` page
|
|
32
|
+
* decided) — see
|
|
33
|
+
* {@link import('./plan-content-items-for-split.js').planContentItemsForSplit}.
|
|
34
|
+
* @param mode - Which transfer this plan is for.
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* await planContentItemsForSplit(trx);
|
|
38
|
+
* await planResourceItems(trx, 'split');
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export async function planResourceItems(trx, mode) {
|
|
42
|
+
if (mode === 'split') {
|
|
43
|
+
await trx.raw(`
|
|
44
|
+
INSERT INTO xfer_ri_plan (src_id, action)
|
|
45
|
+
SELECT DISTINCT r.id, ${TRANSFER_ACTION.full}
|
|
46
|
+
FROM ${TRANSFER_SOURCE_ALIAS}.resource_items r
|
|
47
|
+
JOIN ${TRANSFER_SOURCE_ALIAS}.resource_ref_edges e ON e.resource_id = r.id
|
|
48
|
+
JOIN xfer_ci_plan p ON p.src_id = e.page_id AND p.action = ${TRANSFER_ACTION.full}
|
|
49
|
+
`);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
await trx.raw(`
|
|
53
|
+
INSERT INTO xfer_ri_plan (src_id, action, dest_id)
|
|
54
|
+
SELECT
|
|
55
|
+
s.id,
|
|
56
|
+
CASE
|
|
57
|
+
WHEN d.id IS NULL THEN ${TRANSFER_ACTION.full}
|
|
58
|
+
WHEN (s.status IS NOT NULL) >= (d.status IS NOT NULL) THEN ${TRANSFER_ACTION.replace}
|
|
59
|
+
ELSE ${TRANSFER_ACTION.skip}
|
|
60
|
+
END,
|
|
61
|
+
d.id
|
|
62
|
+
FROM ${TRANSFER_SOURCE_ALIAS}.resource_items s
|
|
63
|
+
LEFT JOIN ${TRANSFER_SOURCE_ALIAS}.url_refs su ON su.id = s.url_id
|
|
64
|
+
LEFT JOIN main.url_refs du ON du.url = su.url
|
|
65
|
+
LEFT JOIN ${TRANSFER_SOURCE_ALIAS}.blob_refs sb ON sb.id = s.url_blob_id
|
|
66
|
+
LEFT JOIN main.blob_refs db ON db.hash = sb.hash
|
|
67
|
+
LEFT JOIN main.resource_items d ON d.url_id = du.id OR d.url_blob_id = db.id
|
|
68
|
+
`);
|
|
69
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Double-quotes a bare SQL identifier (`"order"`, not `order`) so a column
|
|
3
|
+
* name that happens to collide with a SQLite keyword (`order`, `key`,
|
|
4
|
+
* `references`, …) never breaks a transfer statement built by
|
|
5
|
+
* interpolating {@link import('./list-transfer-columns.js').listTransferColumns}'
|
|
6
|
+
* output directly into raw SQL — every generic (not hand-written)
|
|
7
|
+
* column-list builder in `archive/transfer/` must quote through this
|
|
8
|
+
* function rather than splicing bare names.
|
|
9
|
+
* @param name - A bare, trusted column or table identifier (never
|
|
10
|
+
* user-supplied — every caller sources `name` from `pragma_table_info`
|
|
11
|
+
* against this codebase's own fixed schema).
|
|
12
|
+
* @returns The identifier wrapped in double quotes.
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* columns.map(quoteTransferIdentifier).join(', ') // '"id", "order", "text"'
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export declare function quoteTransferIdentifier(name: string): string;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Double-quotes a bare SQL identifier (`"order"`, not `order`) so a column
|
|
3
|
+
* name that happens to collide with a SQLite keyword (`order`, `key`,
|
|
4
|
+
* `references`, …) never breaks a transfer statement built by
|
|
5
|
+
* interpolating {@link import('./list-transfer-columns.js').listTransferColumns}'
|
|
6
|
+
* output directly into raw SQL — every generic (not hand-written)
|
|
7
|
+
* column-list builder in `archive/transfer/` must quote through this
|
|
8
|
+
* function rather than splicing bare names.
|
|
9
|
+
* @param name - A bare, trusted column or table identifier (never
|
|
10
|
+
* user-supplied — every caller sources `name` from `pragma_table_info`
|
|
11
|
+
* against this codebase's own fixed schema).
|
|
12
|
+
* @returns The identifier wrapped in double quotes.
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* columns.map(quoteTransferIdentifier).join(', ') // '"id", "order", "text"'
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export function quoteTransferIdentifier(name) {
|
|
19
|
+
return `"${name.replaceAll('"', '""')}"`;
|
|
20
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ExURL, ParseURLOptions } from '@d-zero/shared/parse-url';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Recomputes `resource_items.is_external` for the WHOLE destination
|
|
5
|
+
* archive against its final (merged or narrowed) scope, once every source
|
|
6
|
+
* has been transferred.
|
|
7
|
+
*
|
|
8
|
+
* Unlike `content_items.is_external` ("was this taken on as a crawl
|
|
9
|
+
* target" — a write-time fact this transfer never re-derives, per
|
|
10
|
+
* ARCHITECTURE.md's invariant), `resource_items.is_external` is a pure
|
|
11
|
+
* scope check computed the same way at crawl time
|
|
12
|
+
* (`@nitpicker/crawler`'s `Crawler#handleResources`:
|
|
13
|
+
* `findScopeEntry(url, this.#scope) === null`). Concat's merged scope is a union of every source's roots,
|
|
14
|
+
* so a resource one source recorded as external can legitimately become
|
|
15
|
+
* internal-by-scope in the output even though nothing about the resource
|
|
16
|
+
* itself changed — recomputing this is the resource-table equivalent of
|
|
17
|
+
* what `content_items` deliberately does NOT do, and the two must not be
|
|
18
|
+
* "unified" into the same rule.
|
|
19
|
+
*
|
|
20
|
+
* Mirrors `repromoteExternalPages`'s shape (load every resource's URL,
|
|
21
|
+
* classify in JS, write matches back in bound-safe chunks) rather than a
|
|
22
|
+
* single SQL scope join — `resource_items.url_id` is nullable
|
|
23
|
+
* (`url_blob_id` rows have no URL to classify and are left as recorded),
|
|
24
|
+
* so the candidate set is every resource with a non-null `url_id`.
|
|
25
|
+
* @param trx - The destination transaction (no source ATTACHed).
|
|
26
|
+
* @param scope - The output archive's final scope map
|
|
27
|
+
* (`buildScopeMap(mergedOrNarrowedRoots, config)`).
|
|
28
|
+
* @param options - URL parsing options forwarded to {@link findScopeEntry}
|
|
29
|
+
* (the output archive's own `disableQueries`).
|
|
30
|
+
* @returns The number of resources whose `is_external` flipped.
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* const scope = buildScopeMap(config.roots, config);
|
|
34
|
+
* const flipped = await reclassifyResourceExternality(knex, scope, config);
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function reclassifyResourceExternality(trx: Knex, scope: ReadonlyMap<string, readonly ExURL[]>, options?: ParseURLOptions): Promise<number>;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { tryParseUrl as parseUrl } from '@d-zero/shared/parse-url';
|
|
2
|
+
import { findScopeEntry } from '../scope/find-scope-entry.js';
|
|
3
|
+
/**
|
|
4
|
+
* Recomputes `resource_items.is_external` for the WHOLE destination
|
|
5
|
+
* archive against its final (merged or narrowed) scope, once every source
|
|
6
|
+
* has been transferred.
|
|
7
|
+
*
|
|
8
|
+
* Unlike `content_items.is_external` ("was this taken on as a crawl
|
|
9
|
+
* target" — a write-time fact this transfer never re-derives, per
|
|
10
|
+
* ARCHITECTURE.md's invariant), `resource_items.is_external` is a pure
|
|
11
|
+
* scope check computed the same way at crawl time
|
|
12
|
+
* (`@nitpicker/crawler`'s `Crawler#handleResources`:
|
|
13
|
+
* `findScopeEntry(url, this.#scope) === null`). Concat's merged scope is a union of every source's roots,
|
|
14
|
+
* so a resource one source recorded as external can legitimately become
|
|
15
|
+
* internal-by-scope in the output even though nothing about the resource
|
|
16
|
+
* itself changed — recomputing this is the resource-table equivalent of
|
|
17
|
+
* what `content_items` deliberately does NOT do, and the two must not be
|
|
18
|
+
* "unified" into the same rule.
|
|
19
|
+
*
|
|
20
|
+
* Mirrors `repromoteExternalPages`'s shape (load every resource's URL,
|
|
21
|
+
* classify in JS, write matches back in bound-safe chunks) rather than a
|
|
22
|
+
* single SQL scope join — `resource_items.url_id` is nullable
|
|
23
|
+
* (`url_blob_id` rows have no URL to classify and are left as recorded),
|
|
24
|
+
* so the candidate set is every resource with a non-null `url_id`.
|
|
25
|
+
* @param trx - The destination transaction (no source ATTACHed).
|
|
26
|
+
* @param scope - The output archive's final scope map
|
|
27
|
+
* (`buildScopeMap(mergedOrNarrowedRoots, config)`).
|
|
28
|
+
* @param options - URL parsing options forwarded to {@link findScopeEntry}
|
|
29
|
+
* (the output archive's own `disableQueries`).
|
|
30
|
+
* @returns The number of resources whose `is_external` flipped.
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* const scope = buildScopeMap(config.roots, config);
|
|
34
|
+
* const flipped = await reclassifyResourceExternality(knex, scope, config);
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export async function reclassifyResourceExternality(trx, scope, options) {
|
|
38
|
+
const candidates = await trx
|
|
39
|
+
.select('resource_items.id as id', 'url_refs.url as url', 'resource_items.is_external')
|
|
40
|
+
.from('resource_items')
|
|
41
|
+
.join('url_refs', 'url_refs.id', 'resource_items.url_id');
|
|
42
|
+
const toInternal = [];
|
|
43
|
+
const toExternal = [];
|
|
44
|
+
for (const row of candidates) {
|
|
45
|
+
const parsed = parseUrl(row.url, options);
|
|
46
|
+
const isExternal = parsed ? findScopeEntry(parsed, scope, options) === null : true;
|
|
47
|
+
if (isExternal && row.is_external === 0) {
|
|
48
|
+
toExternal.push(row.id);
|
|
49
|
+
}
|
|
50
|
+
else if (!isExternal && row.is_external === 1) {
|
|
51
|
+
toInternal.push(row.id);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const chunkSize = 500;
|
|
55
|
+
for (const [ids, value] of [
|
|
56
|
+
[toInternal, 0],
|
|
57
|
+
[toExternal, 1],
|
|
58
|
+
]) {
|
|
59
|
+
for (let i = 0; i < ids.length; i += chunkSize) {
|
|
60
|
+
await trx('resource_items')
|
|
61
|
+
.whereIn('id', ids.slice(i, i + chunkSize))
|
|
62
|
+
.update({ is_external: value });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return toInternal.length + toExternal.length;
|
|
66
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Remaps `redirect_dest_id` for every `full`/`stub`/`replace`-action
|
|
4
|
+
* destination row this source just wrote, from the source's own id space
|
|
5
|
+
* into the destination's, via `temp.xfer_ci_plan` (which by this point
|
|
6
|
+
* maps EVERY source id to a destination id, not just the ones this source
|
|
7
|
+
* inserted — `skip`/`replace` rows already had `dest_id` set at plan
|
|
8
|
+
* time).
|
|
9
|
+
*
|
|
10
|
+
* `skip`-action rows are deliberately excluded from the `SET` target
|
|
11
|
+
* (via the `p.action IN (...)` filter) — a `skip` row's `content_items`
|
|
12
|
+
* row belongs to a PRIOR, better-ranked source, and this (losing) source
|
|
13
|
+
* has no business touching its `redirect_dest_id`.
|
|
14
|
+
*
|
|
15
|
+
* Must run AFTER both
|
|
16
|
+
* {@link import('./insert-content-items.js').insertContentItems} and
|
|
17
|
+
* {@link import('./replace-content-items.js').replaceContentItems} —
|
|
18
|
+
* every plan row needs a resolved `dest_id` (its own AND its redirect
|
|
19
|
+
* target's) before this can run. A source row whose `redirect_dest_id`
|
|
20
|
+
* points outside this source's own plan (should not happen — concat's
|
|
21
|
+
* plan covers every source row, and split's plan closure always pulls a
|
|
22
|
+
* kept row's redirect target in too, see `plan-content-items-for-split.ts`)
|
|
23
|
+
* silently leaves that destination row's `redirect_dest_id` at `NULL`
|
|
24
|
+
* rather than erroring — a dangling-but-absent redirect is a safe
|
|
25
|
+
* degrade, never a wrong one.
|
|
26
|
+
* @param trx - Transaction with the source ATTACHed as
|
|
27
|
+
* {@link TRANSFER_SOURCE_ALIAS}.
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* await insertContentItems(trx, { crawlOrderOffset: 0 });
|
|
31
|
+
* await remapRedirectDestIds(trx);
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function remapRedirectDestIds(trx: Knex): Promise<void>;
|