@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,30 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Creates every `temp.xfer_*` table one source's transfer needs: the
|
|
4
|
+
* `content_items` / `resource_items` plans (per-row action + resolved
|
|
5
|
+
* destination id), the in-scope/referenced staging tables split's plan
|
|
6
|
+
* computation uses, and one `(src_id PRIMARY KEY)` need-table plus one
|
|
7
|
+
* `(src_id PRIMARY KEY, dest_id)` map-table per dictionary in
|
|
8
|
+
* {@link TRANSFER_DICTIONARY_TABLES}.
|
|
9
|
+
*
|
|
10
|
+
* Must run on the SAME connection {@link import('./attach-source-database.js').attachSourceDatabase}
|
|
11
|
+
* attached the source to (SQLite `TEMP` tables are connection-scoped, not
|
|
12
|
+
* transaction-scoped) — and, unlike `ATTACH`, is safe to run either inside
|
|
13
|
+
* or outside a transaction. Called once per source, paired with
|
|
14
|
+
* {@link import('./drop-transfer-temp-tables.js').dropTransferTempTables}
|
|
15
|
+
* after that source's transaction commits, so a second source's plan
|
|
16
|
+
* starts from empty tables rather than accumulating the previous source's
|
|
17
|
+
* rows.
|
|
18
|
+
* @param knex - Knex query builder connected to the destination archive DB
|
|
19
|
+
* (the connection the temp tables attach to).
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* await createTransferTempTables(knex);
|
|
23
|
+
* try {
|
|
24
|
+
* await knex.transaction(async (trx) => { ... });
|
|
25
|
+
* } finally {
|
|
26
|
+
* await dropTransferTempTables(knex);
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function createTransferTempTables(knex: Knex): Promise<void>;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { TRANSFER_DICTIONARY_TABLES } from './transfer-dictionary-tables.js';
|
|
2
|
+
/**
|
|
3
|
+
* Creates every `temp.xfer_*` table one source's transfer needs: the
|
|
4
|
+
* `content_items` / `resource_items` plans (per-row action + resolved
|
|
5
|
+
* destination id), the in-scope/referenced staging tables split's plan
|
|
6
|
+
* computation uses, and one `(src_id PRIMARY KEY)` need-table plus one
|
|
7
|
+
* `(src_id PRIMARY KEY, dest_id)` map-table per dictionary in
|
|
8
|
+
* {@link TRANSFER_DICTIONARY_TABLES}.
|
|
9
|
+
*
|
|
10
|
+
* Must run on the SAME connection {@link import('./attach-source-database.js').attachSourceDatabase}
|
|
11
|
+
* attached the source to (SQLite `TEMP` tables are connection-scoped, not
|
|
12
|
+
* transaction-scoped) — and, unlike `ATTACH`, is safe to run either inside
|
|
13
|
+
* or outside a transaction. Called once per source, paired with
|
|
14
|
+
* {@link import('./drop-transfer-temp-tables.js').dropTransferTempTables}
|
|
15
|
+
* after that source's transaction commits, so a second source's plan
|
|
16
|
+
* starts from empty tables rather than accumulating the previous source's
|
|
17
|
+
* rows.
|
|
18
|
+
* @param knex - Knex query builder connected to the destination archive DB
|
|
19
|
+
* (the connection the temp tables attach to).
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* await createTransferTempTables(knex);
|
|
23
|
+
* try {
|
|
24
|
+
* await knex.transaction(async (trx) => { ... });
|
|
25
|
+
* } finally {
|
|
26
|
+
* await dropTransferTempTables(knex);
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export async function createTransferTempTables(knex) {
|
|
31
|
+
await knex.raw(`
|
|
32
|
+
CREATE TEMP TABLE xfer_ci_plan (
|
|
33
|
+
src_id INTEGER PRIMARY KEY,
|
|
34
|
+
action INTEGER NOT NULL,
|
|
35
|
+
dest_id INTEGER
|
|
36
|
+
)
|
|
37
|
+
`);
|
|
38
|
+
await knex.raw(`
|
|
39
|
+
CREATE TEMP TABLE xfer_ci_in_scope (
|
|
40
|
+
src_id INTEGER PRIMARY KEY
|
|
41
|
+
)
|
|
42
|
+
`);
|
|
43
|
+
await knex.raw(`
|
|
44
|
+
CREATE TEMP TABLE xfer_ci_ref (
|
|
45
|
+
src_id INTEGER PRIMARY KEY
|
|
46
|
+
)
|
|
47
|
+
`);
|
|
48
|
+
await knex.raw(`
|
|
49
|
+
CREATE TEMP TABLE xfer_ri_plan (
|
|
50
|
+
src_id INTEGER PRIMARY KEY,
|
|
51
|
+
action INTEGER NOT NULL,
|
|
52
|
+
dest_id INTEGER
|
|
53
|
+
)
|
|
54
|
+
`);
|
|
55
|
+
for (const table of TRANSFER_DICTIONARY_TABLES) {
|
|
56
|
+
await knex.raw(`CREATE TEMP TABLE xfer_need_${table} (src_id INTEGER PRIMARY KEY)`);
|
|
57
|
+
await knex.raw(`CREATE TEMP TABLE xfer_map_${table} (src_id INTEGER PRIMARY KEY, dest_id INTEGER NOT NULL)`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** One content-addressable dictionary table's copy contract. */
|
|
2
|
+
export interface DictionaryCopySpec {
|
|
3
|
+
/** Table name (same in both `main` and the attached source). */
|
|
4
|
+
readonly table: string;
|
|
5
|
+
/**
|
|
6
|
+
* Column(s) forming the natural (content-addressed) key used both as
|
|
7
|
+
* the `ON CONFLICT` target on insert and to re-resolve the
|
|
8
|
+
* destination id for every source row afterwards. This is
|
|
9
|
+
* DELIBERATELY not always the table's `UNIQUE` constraint used at
|
|
10
|
+
* write time — see `header_sets`' entry below.
|
|
11
|
+
*/
|
|
12
|
+
readonly naturalKey: readonly string[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Every dictionary table a transfer copies (concat and split alike), in
|
|
16
|
+
* dependency order (independent dictionaries first; `header_sets` before
|
|
17
|
+
* its `header_set_entries`/`header_flags` children — handled separately in
|
|
18
|
+
* `copy-header-set-children.ts` since they have no own id to map;
|
|
19
|
+
* `console_log_items` has no cross-dictionary FKs of
|
|
20
|
+
* its own, so ordering relative to the others does not matter).
|
|
21
|
+
*
|
|
22
|
+
* `header_sets`' natural key is `raw_hash` alone, not
|
|
23
|
+
* `(raw_json_hash, raw_hash)` — `raw_json_hash` is BLAKE3 of the raw
|
|
24
|
+
* `responseHeaders` JSON STRING (kept only for the pre-0.13 migration
|
|
25
|
+
* lookup, per `create-ref-tables.ts`'s docs) and can differ between two
|
|
26
|
+
* byte-for-byte-different JSON serialisations of the exact same header
|
|
27
|
+
* set (key order, whitespace), whereas `raw_hash` is BLAKE3 of the
|
|
28
|
+
* decomposed, sorted `name=value` pairs — the actual dedup identity every
|
|
29
|
+
* live write computes against. Two archives crawling the same site
|
|
30
|
+
* therefore share a `raw_hash` far more reliably than a `raw_json_hash`.
|
|
31
|
+
*/
|
|
32
|
+
export declare const DICTIONARY_COPY_SPECS: readonly DictionaryCopySpec[];
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every dictionary table a transfer copies (concat and split alike), in
|
|
3
|
+
* dependency order (independent dictionaries first; `header_sets` before
|
|
4
|
+
* its `header_set_entries`/`header_flags` children — handled separately in
|
|
5
|
+
* `copy-header-set-children.ts` since they have no own id to map;
|
|
6
|
+
* `console_log_items` has no cross-dictionary FKs of
|
|
7
|
+
* its own, so ordering relative to the others does not matter).
|
|
8
|
+
*
|
|
9
|
+
* `header_sets`' natural key is `raw_hash` alone, not
|
|
10
|
+
* `(raw_json_hash, raw_hash)` — `raw_json_hash` is BLAKE3 of the raw
|
|
11
|
+
* `responseHeaders` JSON STRING (kept only for the pre-0.13 migration
|
|
12
|
+
* lookup, per `create-ref-tables.ts`'s docs) and can differ between two
|
|
13
|
+
* byte-for-byte-different JSON serialisations of the exact same header
|
|
14
|
+
* set (key order, whitespace), whereas `raw_hash` is BLAKE3 of the
|
|
15
|
+
* decomposed, sorted `name=value` pairs — the actual dedup identity every
|
|
16
|
+
* live write computes against. Two archives crawling the same site
|
|
17
|
+
* therefore share a `raw_hash` far more reliably than a `raw_json_hash`.
|
|
18
|
+
*/
|
|
19
|
+
export const DICTIONARY_COPY_SPECS = [
|
|
20
|
+
{ table: 'url_refs', naturalKey: ['url'] },
|
|
21
|
+
{ table: 'content_type_refs', naturalKey: ['raw'] },
|
|
22
|
+
{ table: 'text_refs', naturalKey: ['hash', 'text'] },
|
|
23
|
+
{ table: 'json_refs', naturalKey: ['hash'] },
|
|
24
|
+
{ table: 'blob_refs', naturalKey: ['hash'] },
|
|
25
|
+
{ table: 'header_name_refs', naturalKey: ['name'] },
|
|
26
|
+
{ table: 'header_value_refs', naturalKey: ['hash', 'value'] },
|
|
27
|
+
{ table: 'header_sets', naturalKey: ['raw_hash'] },
|
|
28
|
+
];
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Drops every temp table
|
|
4
|
+
* {@link import('./create-transfer-temp-tables.js').createTransferTempTables}
|
|
5
|
+
* created, so the next source starts from a clean slate. Safe to call even
|
|
6
|
+
* if creation only partially succeeded (`IF EXISTS`).
|
|
7
|
+
* @param knex - Knex query builder connected to the destination archive DB.
|
|
8
|
+
*/
|
|
9
|
+
export declare function dropTransferTempTables(knex: Knex): Promise<void>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { TRANSFER_DICTIONARY_TABLES } from './transfer-dictionary-tables.js';
|
|
2
|
+
/**
|
|
3
|
+
* Drops every temp table
|
|
4
|
+
* {@link import('./create-transfer-temp-tables.js').createTransferTempTables}
|
|
5
|
+
* created, so the next source starts from a clean slate. Safe to call even
|
|
6
|
+
* if creation only partially succeeded (`IF EXISTS`).
|
|
7
|
+
* @param knex - Knex query builder connected to the destination archive DB.
|
|
8
|
+
*/
|
|
9
|
+
export async function dropTransferTempTables(knex) {
|
|
10
|
+
await knex.raw('DROP TABLE IF EXISTS xfer_ci_plan');
|
|
11
|
+
await knex.raw('DROP TABLE IF EXISTS xfer_ci_in_scope');
|
|
12
|
+
await knex.raw('DROP TABLE IF EXISTS xfer_ci_ref');
|
|
13
|
+
await knex.raw('DROP TABLE IF EXISTS xfer_ri_plan');
|
|
14
|
+
for (const table of TRANSFER_DICTIONARY_TABLES) {
|
|
15
|
+
await knex.raw(`DROP TABLE IF EXISTS xfer_need_${table}`);
|
|
16
|
+
await knex.raw(`DROP TABLE IF EXISTS xfer_map_${table}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Re-flattens `content_items.redirect_dest_id` to a single hop after
|
|
4
|
+
* concat, breaking any cycle it finds.
|
|
5
|
+
*
|
|
6
|
+
* Every source archive individually satisfies the "redirect destination
|
|
7
|
+
* is always the final hop" invariant (`linkRedirectSources` pre-flattens
|
|
8
|
+
* at write time), but merging two sources can reintroduce a chain: if
|
|
9
|
+
* source A has `P → X` (X external/unresolved in A) and source B's
|
|
10
|
+
* winning row for X is itself `X → Y`, the merged destination now has a
|
|
11
|
+
* two-hop `P → X → Y` — a shape no single crawl ever produces, and every
|
|
12
|
+
* reader in this codebase (`resolveAliasAndRedirectChain`,
|
|
13
|
+
* `list-links.ts`, …) assumes at most one hop.
|
|
14
|
+
*
|
|
15
|
+
* Runs a bounded loop: each pass sets every row's `redirect_dest_id` to
|
|
16
|
+
* its CURRENT target's `redirect_dest_id` when that target itself
|
|
17
|
+
* redirects further, stopping either when a pass changes zero rows or
|
|
18
|
+
* after `maxHops` passes (a cross-source cycle — A→B, B→A — would
|
|
19
|
+
* otherwise loop forever alternating between the two, since neither
|
|
20
|
+
* satisfies "my target has no further redirect"). Any row still part of
|
|
21
|
+
* a chain after the cap, or found to point at itself, is a cycle: its
|
|
22
|
+
* `redirect_dest_id` is set to `NULL` rather than left pointing at a
|
|
23
|
+
* still-chained row.
|
|
24
|
+
*
|
|
25
|
+
* This is whole-archive (not source-scoped) and split-safe: a single,
|
|
26
|
+
* not-yet-merged source is already flat (this function is still called
|
|
27
|
+
* for split too, for uniformity — every pass finds zero rows to change on
|
|
28
|
+
* the first iteration, a cheap no-op).
|
|
29
|
+
* @param trx - The destination transaction (no source ATTACHed — this
|
|
30
|
+
* runs once, after every source has been transferred, not per-source).
|
|
31
|
+
* @param maxHops - Maximum flatten passes before treating any remaining
|
|
32
|
+
* chain as a cycle. Defaults to {@link DEFAULT_MAX_HOPS}.
|
|
33
|
+
* @returns The number of rows flattened across every pass, and the number
|
|
34
|
+
* of cycle rows NULLed out.
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* for (const source of sources) { await transferArchiveRows(...); }
|
|
38
|
+
* const { flattened, cyclesBroken } = await flattenRedirectChains(knex);
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare function flattenRedirectChains(trx: Knex, maxHops?: number): Promise<{
|
|
42
|
+
flattened: number;
|
|
43
|
+
cyclesBroken: number;
|
|
44
|
+
}>;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/** Default cap on flatten iterations — see {@link flattenRedirectChains}'s docs. */
|
|
2
|
+
const DEFAULT_MAX_HOPS = 32;
|
|
3
|
+
/**
|
|
4
|
+
* Re-flattens `content_items.redirect_dest_id` to a single hop after
|
|
5
|
+
* concat, breaking any cycle it finds.
|
|
6
|
+
*
|
|
7
|
+
* Every source archive individually satisfies the "redirect destination
|
|
8
|
+
* is always the final hop" invariant (`linkRedirectSources` pre-flattens
|
|
9
|
+
* at write time), but merging two sources can reintroduce a chain: if
|
|
10
|
+
* source A has `P → X` (X external/unresolved in A) and source B's
|
|
11
|
+
* winning row for X is itself `X → Y`, the merged destination now has a
|
|
12
|
+
* two-hop `P → X → Y` — a shape no single crawl ever produces, and every
|
|
13
|
+
* reader in this codebase (`resolveAliasAndRedirectChain`,
|
|
14
|
+
* `list-links.ts`, …) assumes at most one hop.
|
|
15
|
+
*
|
|
16
|
+
* Runs a bounded loop: each pass sets every row's `redirect_dest_id` to
|
|
17
|
+
* its CURRENT target's `redirect_dest_id` when that target itself
|
|
18
|
+
* redirects further, stopping either when a pass changes zero rows or
|
|
19
|
+
* after `maxHops` passes (a cross-source cycle — A→B, B→A — would
|
|
20
|
+
* otherwise loop forever alternating between the two, since neither
|
|
21
|
+
* satisfies "my target has no further redirect"). Any row still part of
|
|
22
|
+
* a chain after the cap, or found to point at itself, is a cycle: its
|
|
23
|
+
* `redirect_dest_id` is set to `NULL` rather than left pointing at a
|
|
24
|
+
* still-chained row.
|
|
25
|
+
*
|
|
26
|
+
* This is whole-archive (not source-scoped) and split-safe: a single,
|
|
27
|
+
* not-yet-merged source is already flat (this function is still called
|
|
28
|
+
* for split too, for uniformity — every pass finds zero rows to change on
|
|
29
|
+
* the first iteration, a cheap no-op).
|
|
30
|
+
* @param trx - The destination transaction (no source ATTACHed — this
|
|
31
|
+
* runs once, after every source has been transferred, not per-source).
|
|
32
|
+
* @param maxHops - Maximum flatten passes before treating any remaining
|
|
33
|
+
* chain as a cycle. Defaults to {@link DEFAULT_MAX_HOPS}.
|
|
34
|
+
* @returns The number of rows flattened across every pass, and the number
|
|
35
|
+
* of cycle rows NULLed out.
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* for (const source of sources) { await transferArchiveRows(...); }
|
|
39
|
+
* const { flattened, cyclesBroken } = await flattenRedirectChains(knex);
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export async function flattenRedirectChains(trx, maxHops = DEFAULT_MAX_HOPS) {
|
|
43
|
+
let flattened = 0;
|
|
44
|
+
for (let hop = 0; hop < maxHops; hop++) {
|
|
45
|
+
const result = await trx.raw(`
|
|
46
|
+
UPDATE content_items
|
|
47
|
+
SET redirect_dest_id = t.redirect_dest_id
|
|
48
|
+
FROM content_items t
|
|
49
|
+
WHERE t.id = content_items.redirect_dest_id
|
|
50
|
+
AND t.redirect_dest_id IS NOT NULL
|
|
51
|
+
AND t.redirect_dest_id != content_items.id
|
|
52
|
+
`);
|
|
53
|
+
const changes = result?.changes ?? 0;
|
|
54
|
+
flattened += changes;
|
|
55
|
+
if (changes === 0) {
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const selfLoops = await trx
|
|
60
|
+
.select('id')
|
|
61
|
+
.from('content_items')
|
|
62
|
+
.whereRaw('redirect_dest_id = id');
|
|
63
|
+
const stillChained = await trx
|
|
64
|
+
.select('t1.id as id')
|
|
65
|
+
.from({ t1: 'content_items' })
|
|
66
|
+
.join({ t2: 'content_items' }, 't2.id', 't1.redirect_dest_id')
|
|
67
|
+
.whereNotNull('t1.redirect_dest_id')
|
|
68
|
+
.whereNotNull('t2.redirect_dest_id');
|
|
69
|
+
const cycleIds = [...new Set([...selfLoops, ...stillChained].map((r) => r.id))];
|
|
70
|
+
if (cycleIds.length > 0) {
|
|
71
|
+
await trx('content_items').whereIn('id', cycleIds).update({ redirect_dest_id: null });
|
|
72
|
+
}
|
|
73
|
+
return { flattened, cyclesBroken: cycleIds.length };
|
|
74
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Inserts every `full`/`stub`-action `content_items` row from
|
|
4
|
+
* `temp.xfer_ci_plan` into the destination, then backfills each plan row's
|
|
5
|
+
* `dest_id` with the id the insert assigned.
|
|
6
|
+
*
|
|
7
|
+
* Every column is looked up via {@link listTransferColumns} (never a
|
|
8
|
+
* hand-written list — see that function's docs for why) and given an
|
|
9
|
+
* explicit SELECT expression by {@link columnExpression}: dictionary FK
|
|
10
|
+
* columns resolve through their `temp.xfer_map_*` table, `is_external`/
|
|
11
|
+
* `is_target` are forced for `stub` rows, and `redirect_dest_id`/
|
|
12
|
+
* `alias_of_id`/`dedupe_cap_event_id` are always written `NULL` (see
|
|
13
|
+
* {@link columnExpression}'s docs). Every other column passes through
|
|
14
|
+
* unchanged.
|
|
15
|
+
*
|
|
16
|
+
* Must run AFTER every dictionary copy this source needs
|
|
17
|
+
* (`copy-dictionaries-for-concat.ts` / `copy-dictionaries-for-split.ts`,
|
|
18
|
+
* `copy-header-set-children.ts`) — a `full`/`stub` row's `url_id` is NOT
|
|
19
|
+
* NULL, so a missing `temp.xfer_map_url_refs` entry surfaces immediately
|
|
20
|
+
* as a constraint violation rather than silently inserting garbage.
|
|
21
|
+
* @param trx - Transaction with the source ATTACHed as
|
|
22
|
+
* {@link TRANSFER_SOURCE_ALIAS}.
|
|
23
|
+
* @param options - Options.
|
|
24
|
+
* @param options.crawlOrderOffset - Added to every copied row's
|
|
25
|
+
* `crawl_order` (concat: the destination's current `MAX(crawl_order)`,
|
|
26
|
+
* so a second source's pages sort after the first's; split: `0`, since
|
|
27
|
+
* a single source's relative order is preserved as-is).
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* await insertContentItems(trx, { crawlOrderOffset: 0 });
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare function insertContentItems(trx: Knex, options: {
|
|
34
|
+
crawlOrderOffset: number;
|
|
35
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { listTransferColumns } from './list-transfer-columns.js';
|
|
2
|
+
import { quoteTransferIdentifier } from './quote-transfer-identifier.js';
|
|
3
|
+
import { TRANSFER_ACTION } from './transfer-action.js';
|
|
4
|
+
import { TRANSFER_SOURCE_ALIAS } from './transfer-source-alias.js';
|
|
5
|
+
const SRC = TRANSFER_SOURCE_ALIAS;
|
|
6
|
+
/**
|
|
7
|
+
* Builds the per-column SELECT expression for one `content_items` column,
|
|
8
|
+
* given its plan-driven remap rule.
|
|
9
|
+
* @param column - The destination column name.
|
|
10
|
+
* @param crawlOrderOffset - See {@link insertContentItems}.
|
|
11
|
+
*/
|
|
12
|
+
function columnExpression(column, crawlOrderOffset) {
|
|
13
|
+
switch (column) {
|
|
14
|
+
case 'url_id': {
|
|
15
|
+
return 'mu.dest_id';
|
|
16
|
+
}
|
|
17
|
+
case 'content_type_id': {
|
|
18
|
+
return 'mct.dest_id';
|
|
19
|
+
}
|
|
20
|
+
case 'header_set_id': {
|
|
21
|
+
return 'mhs.dest_id';
|
|
22
|
+
}
|
|
23
|
+
case 'redirect_dest_id':
|
|
24
|
+
case 'alias_of_id':
|
|
25
|
+
case 'dedupe_cap_event_id': {
|
|
26
|
+
// Never carried over verbatim: `redirect_dest_id` is remapped in a
|
|
27
|
+
// later pass once every source id has a destination id
|
|
28
|
+
// (`remap-redirect-dest-ids.ts`); `alias_of_id`/`dedupe_cap_event_id`
|
|
29
|
+
// are always recomputed from scratch by the mandatory viewer
|
|
30
|
+
// read-model rebuild's backfills, so writing a stale source value
|
|
31
|
+
// here would only be overwritten moments later.
|
|
32
|
+
return 'NULL';
|
|
33
|
+
}
|
|
34
|
+
case 'is_external': {
|
|
35
|
+
// A `stub` row is forced external regardless of what it was in the
|
|
36
|
+
// source archive (it may well have been a fully-scraped internal
|
|
37
|
+
// page there) — that IS the definition of "kept as a stub".
|
|
38
|
+
return `CASE WHEN p.action = ${TRANSFER_ACTION.stub} THEN 1 ELSE s.is_external END`;
|
|
39
|
+
}
|
|
40
|
+
case 'is_target': {
|
|
41
|
+
return `CASE WHEN p.action = ${TRANSFER_ACTION.stub} THEN 0 ELSE s.is_target END`;
|
|
42
|
+
}
|
|
43
|
+
case 'crawl_order': {
|
|
44
|
+
// `s.crawl_order + offset` is NULL-safe for free: SQLite's `+`
|
|
45
|
+
// against a NULL operand yields NULL, matching a source row whose
|
|
46
|
+
// `crawl_order` was never set (pre-#... archives, or rows written
|
|
47
|
+
// outside the normal crawl-order-assigning path).
|
|
48
|
+
return `s.crawl_order + ${crawlOrderOffset}`;
|
|
49
|
+
}
|
|
50
|
+
default: {
|
|
51
|
+
return `s.${quoteTransferIdentifier(column)}`;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Inserts every `full`/`stub`-action `content_items` row from
|
|
57
|
+
* `temp.xfer_ci_plan` into the destination, then backfills each plan row's
|
|
58
|
+
* `dest_id` with the id the insert assigned.
|
|
59
|
+
*
|
|
60
|
+
* Every column is looked up via {@link listTransferColumns} (never a
|
|
61
|
+
* hand-written list — see that function's docs for why) and given an
|
|
62
|
+
* explicit SELECT expression by {@link columnExpression}: dictionary FK
|
|
63
|
+
* columns resolve through their `temp.xfer_map_*` table, `is_external`/
|
|
64
|
+
* `is_target` are forced for `stub` rows, and `redirect_dest_id`/
|
|
65
|
+
* `alias_of_id`/`dedupe_cap_event_id` are always written `NULL` (see
|
|
66
|
+
* {@link columnExpression}'s docs). Every other column passes through
|
|
67
|
+
* unchanged.
|
|
68
|
+
*
|
|
69
|
+
* Must run AFTER every dictionary copy this source needs
|
|
70
|
+
* (`copy-dictionaries-for-concat.ts` / `copy-dictionaries-for-split.ts`,
|
|
71
|
+
* `copy-header-set-children.ts`) — a `full`/`stub` row's `url_id` is NOT
|
|
72
|
+
* NULL, so a missing `temp.xfer_map_url_refs` entry surfaces immediately
|
|
73
|
+
* as a constraint violation rather than silently inserting garbage.
|
|
74
|
+
* @param trx - Transaction with the source ATTACHed as
|
|
75
|
+
* {@link TRANSFER_SOURCE_ALIAS}.
|
|
76
|
+
* @param options - Options.
|
|
77
|
+
* @param options.crawlOrderOffset - Added to every copied row's
|
|
78
|
+
* `crawl_order` (concat: the destination's current `MAX(crawl_order)`,
|
|
79
|
+
* so a second source's pages sort after the first's; split: `0`, since
|
|
80
|
+
* a single source's relative order is preserved as-is).
|
|
81
|
+
* @example
|
|
82
|
+
* ```ts
|
|
83
|
+
* await insertContentItems(trx, { crawlOrderOffset: 0 });
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
export async function insertContentItems(trx, options) {
|
|
87
|
+
const columns = await listTransferColumns(trx, SRC, 'content_items', ['id']);
|
|
88
|
+
const columnList = columns.map(quoteTransferIdentifier).join(', ');
|
|
89
|
+
const selectList = columns
|
|
90
|
+
.map((col) => columnExpression(col, options.crawlOrderOffset))
|
|
91
|
+
.join(', ');
|
|
92
|
+
await trx.raw(`
|
|
93
|
+
INSERT INTO main.content_items (${columnList})
|
|
94
|
+
SELECT ${selectList}
|
|
95
|
+
FROM ${SRC}.content_items s
|
|
96
|
+
JOIN xfer_ci_plan p ON p.src_id = s.id
|
|
97
|
+
LEFT JOIN xfer_map_url_refs mu ON mu.src_id = s.url_id
|
|
98
|
+
LEFT JOIN xfer_map_content_type_refs mct ON mct.src_id = s.content_type_id
|
|
99
|
+
LEFT JOIN xfer_map_header_sets mhs ON mhs.src_id = s.header_set_id
|
|
100
|
+
WHERE p.action IN (${TRANSFER_ACTION.full}, ${TRANSFER_ACTION.stub})
|
|
101
|
+
ORDER BY s.id
|
|
102
|
+
`);
|
|
103
|
+
await trx.raw(`
|
|
104
|
+
UPDATE xfer_ci_plan
|
|
105
|
+
SET dest_id = x.dest_id
|
|
106
|
+
FROM (
|
|
107
|
+
SELECT p.src_id AS src_id, d.id AS dest_id
|
|
108
|
+
FROM xfer_ci_plan p
|
|
109
|
+
JOIN ${SRC}.content_items s ON s.id = p.src_id
|
|
110
|
+
JOIN xfer_map_url_refs mu ON mu.src_id = s.url_id
|
|
111
|
+
JOIN main.content_items d ON d.url_id = mu.dest_id
|
|
112
|
+
WHERE p.action IN (${TRANSFER_ACTION.full}, ${TRANSFER_ACTION.stub})
|
|
113
|
+
) x
|
|
114
|
+
WHERE xfer_ci_plan.src_id = x.src_id
|
|
115
|
+
`);
|
|
116
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Lists a table's column names via SQLite's `pragma_table_info` table-valued
|
|
4
|
+
* function, in declaration order, minus any names in `exclude`.
|
|
5
|
+
*
|
|
6
|
+
* A transfer copy must NEVER build its column list from a hand-written
|
|
7
|
+
* literal or from `SELECT *` — migrated archives add columns via
|
|
8
|
+
* `ALTER TABLE ADD COLUMN`, which always appends at the end, so a fresh archive's
|
|
9
|
+
* `content_items` (say) can have `alias_of_id` earlier in declaration order
|
|
10
|
+
* than a migrated archive's copy of the same table. A positional
|
|
11
|
+
* `INSERT ... SELECT * FROM other_table` across two archives with different column
|
|
12
|
+
* orders would silently shift values into the wrong columns. Reading each
|
|
13
|
+
* side's own column list and building an explicit, named
|
|
14
|
+
* `SELECT <col1>, <col2>, ...` (this function's contract) sidesteps the problem
|
|
15
|
+
* entirely — column order never matters when every column is named.
|
|
16
|
+
*
|
|
17
|
+
* The pragma table-valued function must be schema-qualified as
|
|
18
|
+
* `<schema>.pragma_table_info(<table>)` — `pragma_table_info('schema.table')`
|
|
19
|
+
* silently returns zero rows instead of erroring, so `schema` and `table`
|
|
20
|
+
* are deliberately separate parameters rather than one dotted string a
|
|
21
|
+
* caller could get wrong.
|
|
22
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
23
|
+
* @param schema - The schema the table lives in: `'main'` for the
|
|
24
|
+
* destination, or the attached source's alias (`TRANSFER_SOURCE_ALIAS`).
|
|
25
|
+
* @param table - Bare table name (no schema prefix).
|
|
26
|
+
* @param exclude - Column names to omit (typically the PK, which a copy
|
|
27
|
+
* assigns fresh via `AUTOINCREMENT` rather than carrying over).
|
|
28
|
+
* @returns Column names in declaration order, minus `exclude`.
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* const columns = await listTransferColumns(trx, 'xfer_src', 'content_items', ['id']);
|
|
32
|
+
* // ['url_id', 'is_external', 'scraped', ...] — in THIS archive's own order
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function listTransferColumns(knex: Knex, schema: string, table: string, exclude?: readonly string[]): Promise<string[]>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lists a table's column names via SQLite's `pragma_table_info` table-valued
|
|
3
|
+
* function, in declaration order, minus any names in `exclude`.
|
|
4
|
+
*
|
|
5
|
+
* A transfer copy must NEVER build its column list from a hand-written
|
|
6
|
+
* literal or from `SELECT *` — migrated archives add columns via
|
|
7
|
+
* `ALTER TABLE ADD COLUMN`, which always appends at the end, so a fresh archive's
|
|
8
|
+
* `content_items` (say) can have `alias_of_id` earlier in declaration order
|
|
9
|
+
* than a migrated archive's copy of the same table. A positional
|
|
10
|
+
* `INSERT ... SELECT * FROM other_table` across two archives with different column
|
|
11
|
+
* orders would silently shift values into the wrong columns. Reading each
|
|
12
|
+
* side's own column list and building an explicit, named
|
|
13
|
+
* `SELECT <col1>, <col2>, ...` (this function's contract) sidesteps the problem
|
|
14
|
+
* entirely — column order never matters when every column is named.
|
|
15
|
+
*
|
|
16
|
+
* The pragma table-valued function must be schema-qualified as
|
|
17
|
+
* `<schema>.pragma_table_info(<table>)` — `pragma_table_info('schema.table')`
|
|
18
|
+
* silently returns zero rows instead of erroring, so `schema` and `table`
|
|
19
|
+
* are deliberately separate parameters rather than one dotted string a
|
|
20
|
+
* caller could get wrong.
|
|
21
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
22
|
+
* @param schema - The schema the table lives in: `'main'` for the
|
|
23
|
+
* destination, or the attached source's alias (`TRANSFER_SOURCE_ALIAS`).
|
|
24
|
+
* @param table - Bare table name (no schema prefix).
|
|
25
|
+
* @param exclude - Column names to omit (typically the PK, which a copy
|
|
26
|
+
* assigns fresh via `AUTOINCREMENT` rather than carrying over).
|
|
27
|
+
* @returns Column names in declaration order, minus `exclude`.
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* const columns = await listTransferColumns(trx, 'xfer_src', 'content_items', ['id']);
|
|
31
|
+
* // ['url_id', 'is_external', 'scraped', ...] — in THIS archive's own order
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export async function listTransferColumns(knex, schema, table, exclude = []) {
|
|
35
|
+
const excludeSet = new Set(exclude);
|
|
36
|
+
const rows = await knex
|
|
37
|
+
.select('name')
|
|
38
|
+
.from(knex.raw(`${schema}.pragma_table_info(?)`, [table]))
|
|
39
|
+
.orderBy('cid');
|
|
40
|
+
const columns = rows.map((row) => row.name).filter((name) => !excludeSet.has(name));
|
|
41
|
+
if (columns.length === 0) {
|
|
42
|
+
throw new Error(`No columns found for table "${schema}.${table}" — does it exist?`);
|
|
43
|
+
}
|
|
44
|
+
return columns;
|
|
45
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ExURL, ParseURLOptions } from '@d-zero/shared/parse-url';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Determines which of the source's internal (`is_external = 0`)
|
|
5
|
+
* `content_items` rows fall inside `scope` (split's new, narrower root
|
|
6
|
+
* set), writing matching ids into `temp.xfer_ci_in_scope`.
|
|
7
|
+
*
|
|
8
|
+
* Mirrors `repromoteExternalPages`'s shape (load every candidate URL into
|
|
9
|
+
* memory, classify with {@link findScopeEntry} in JS, write matches back
|
|
10
|
+
* in bound-count-safe chunks) — the same accepted pattern for a one-off,
|
|
11
|
+
* whole-archive scope reclassification. External rows are never
|
|
12
|
+
* candidates here: split's scope check only ever needs to know "was this
|
|
13
|
+
* an internal page that is now out of scope", since the "external
|
|
14
|
+
* everywhere but in scope" case is a concat-only concept (split has a
|
|
15
|
+
* single source, so there is nothing to promote).
|
|
16
|
+
* @param trx - Transaction with the source ATTACHed as
|
|
17
|
+
* {@link TRANSFER_SOURCE_ALIAS}. Must run after
|
|
18
|
+
* {@link import('./create-transfer-temp-tables.js').createTransferTempTables}.
|
|
19
|
+
* @param scope - The new (narrower) scope map, from
|
|
20
|
+
* {@link import('../scope/build-scope-map.js').buildScopeMap} over
|
|
21
|
+
* the split's scope URLs.
|
|
22
|
+
* @param options - URL parsing options forwarded to {@link findScopeEntry}
|
|
23
|
+
* (the source archive's own `disableQueries`, typically).
|
|
24
|
+
* @returns The number of ids written to `temp.xfer_ci_in_scope`.
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* const scope = buildScopeMap(['https://example.com/blog/']);
|
|
28
|
+
* const inScopeCount = await markInScopeContentItems(trx, scope, sourceConfig);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare function markInScopeContentItems(trx: Knex, scope: ReadonlyMap<string, readonly ExURL[]>, options?: ParseURLOptions): Promise<number>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { tryParseUrl as parseUrl } from '@d-zero/shared/parse-url';
|
|
2
|
+
import { findScopeEntry } from '../scope/find-scope-entry.js';
|
|
3
|
+
import { TRANSFER_SOURCE_ALIAS } from './transfer-source-alias.js';
|
|
4
|
+
/**
|
|
5
|
+
* Determines which of the source's internal (`is_external = 0`)
|
|
6
|
+
* `content_items` rows fall inside `scope` (split's new, narrower root
|
|
7
|
+
* set), writing matching ids into `temp.xfer_ci_in_scope`.
|
|
8
|
+
*
|
|
9
|
+
* Mirrors `repromoteExternalPages`'s shape (load every candidate URL into
|
|
10
|
+
* memory, classify with {@link findScopeEntry} in JS, write matches back
|
|
11
|
+
* in bound-count-safe chunks) — the same accepted pattern for a one-off,
|
|
12
|
+
* whole-archive scope reclassification. External rows are never
|
|
13
|
+
* candidates here: split's scope check only ever needs to know "was this
|
|
14
|
+
* an internal page that is now out of scope", since the "external
|
|
15
|
+
* everywhere but in scope" case is a concat-only concept (split has a
|
|
16
|
+
* single source, so there is nothing to promote).
|
|
17
|
+
* @param trx - Transaction with the source ATTACHed as
|
|
18
|
+
* {@link TRANSFER_SOURCE_ALIAS}. Must run after
|
|
19
|
+
* {@link import('./create-transfer-temp-tables.js').createTransferTempTables}.
|
|
20
|
+
* @param scope - The new (narrower) scope map, from
|
|
21
|
+
* {@link import('../scope/build-scope-map.js').buildScopeMap} over
|
|
22
|
+
* the split's scope URLs.
|
|
23
|
+
* @param options - URL parsing options forwarded to {@link findScopeEntry}
|
|
24
|
+
* (the source archive's own `disableQueries`, typically).
|
|
25
|
+
* @returns The number of ids written to `temp.xfer_ci_in_scope`.
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* const scope = buildScopeMap(['https://example.com/blog/']);
|
|
29
|
+
* const inScopeCount = await markInScopeContentItems(trx, scope, sourceConfig);
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export async function markInScopeContentItems(trx, scope, options) {
|
|
33
|
+
const candidates = await trx
|
|
34
|
+
.select(`${TRANSFER_SOURCE_ALIAS}.content_items.id as id`, 'url_refs.url as url')
|
|
35
|
+
.from(`${TRANSFER_SOURCE_ALIAS}.content_items`)
|
|
36
|
+
.join({ url_refs: `${TRANSFER_SOURCE_ALIAS}.url_refs` }, 'url_refs.id', `${TRANSFER_SOURCE_ALIAS}.content_items.url_id`)
|
|
37
|
+
.where(`${TRANSFER_SOURCE_ALIAS}.content_items.is_external`, 0);
|
|
38
|
+
const inScopeIds = [];
|
|
39
|
+
for (const row of candidates) {
|
|
40
|
+
const parsed = parseUrl(row.url, options);
|
|
41
|
+
if (!parsed) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (findScopeEntry(parsed, scope, options) !== null) {
|
|
45
|
+
inScopeIds.push(row.id);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const chunkSize = 500;
|
|
49
|
+
for (let i = 0; i < inScopeIds.length; i += chunkSize) {
|
|
50
|
+
const chunk = inScopeIds.slice(i, i + chunkSize);
|
|
51
|
+
await trx.insert(chunk.map((id) => ({ src_id: id }))).into('xfer_ci_in_scope');
|
|
52
|
+
}
|
|
53
|
+
return inScopeIds.length;
|
|
54
|
+
}
|