@nitpicker/archive 0.0.0-stage → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +105 -2
- package/lib/apply-connection-pragmas.d.ts +18 -0
- package/lib/apply-connection-pragmas.js +40 -0
- package/lib/archive-accessor.d.ts +265 -0
- package/lib/archive-accessor.js +477 -0
- package/lib/archive-lock.d.ts +45 -0
- package/lib/archive-lock.js +154 -0
- package/lib/archive.d.ts +736 -0
- package/lib/archive.js +1056 -0
- package/lib/body-hash/compute-body-hash.d.ts +32 -0
- package/lib/body-hash/compute-body-hash.js +35 -0
- package/lib/cache/clear-archive-cache-entry.d.ts +18 -0
- package/lib/cache/clear-archive-cache-entry.js +24 -0
- package/lib/cache/clear-archive-cache-root.d.ts +26 -0
- package/lib/cache/clear-archive-cache-root.js +32 -0
- package/lib/cache/compute-archive-cache-key.d.ts +39 -0
- package/lib/cache/compute-archive-cache-key.js +95 -0
- package/lib/cache/extract-archive-to-cache.d.ts +57 -0
- package/lib/cache/extract-archive-to-cache.js +326 -0
- package/lib/cache/get-archive-cache-root.d.ts +20 -0
- package/lib/cache/get-archive-cache-root.js +53 -0
- package/lib/cache/is-archive-cache-disabled.d.ts +24 -0
- package/lib/cache/is-archive-cache-disabled.js +34 -0
- package/lib/cache/list-archive-cache-entries.d.ts +23 -0
- package/lib/cache/list-archive-cache-entries.js +130 -0
- package/lib/cache/path-exists.d.ts +9 -0
- package/lib/cache/path-exists.js +18 -0
- package/lib/cache/resolve-archive-cache-dir.d.ts +26 -0
- package/lib/cache/resolve-archive-cache-dir.js +32 -0
- package/lib/cache/types.d.ts +33 -0
- package/lib/cache/types.js +1 -0
- package/lib/content-type/is-html-content-type.d.ts +17 -0
- package/lib/content-type/is-html-content-type.js +19 -0
- package/lib/content-type/normalize-content-type.d.ts +14 -0
- package/lib/content-type/normalize-content-type.js +20 -0
- package/lib/create-adjunct-tables.d.ts +66 -0
- package/lib/create-adjunct-tables.js +510 -0
- package/lib/create-entity-tables.d.ts +191 -0
- package/lib/create-entity-tables.js +387 -0
- package/lib/create-progress-reporter.d.ts +30 -0
- package/lib/create-progress-reporter.js +38 -0
- package/lib/create-ref-tables.d.ts +35 -0
- package/lib/create-ref-tables.js +185 -0
- package/lib/create-template-tables.d.ts +28 -0
- package/lib/create-template-tables.js +92 -0
- package/lib/database.d.ts +549 -0
- package/lib/database.js +804 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.d.ts +27 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.js +35 -0
- package/lib/db-ops/_shared/compress-payload.d.ts +26 -0
- package/lib/db-ops/_shared/compress-payload.js +30 -0
- package/lib/db-ops/_shared/create-write-ref-caches.d.ts +17 -0
- package/lib/db-ops/_shared/create-write-ref-caches.js +27 -0
- package/lib/db-ops/_shared/decode-json-ref.d.ts +17 -0
- package/lib/db-ops/_shared/decode-json-ref.js +31 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.d.ts +49 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.js +69 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.d.ts +20 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.js +53 -0
- package/lib/db-ops/_shared/resolve-content-item-id.d.ts +62 -0
- package/lib/db-ops/_shared/resolve-content-item-id.js +143 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.d.ts +23 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.js +29 -0
- package/lib/db-ops/_shared/retry-setting.d.ts +16 -0
- package/lib/db-ops/_shared/retry-setting.js +18 -0
- package/lib/db-ops/_shared/safe-parse-json.d.ts +11 -0
- package/lib/db-ops/_shared/safe-parse-json.js +18 -0
- package/lib/db-ops/_shared/types.d.ts +94 -0
- package/lib/db-ops/_shared/types.js +1 -0
- package/lib/db-ops/_shared/upsert-blob-ref.d.ts +25 -0
- package/lib/db-ops/_shared/upsert-blob-ref.js +48 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.d.ts +30 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.js +45 -0
- package/lib/db-ops/_shared/upsert-json-ref.d.ts +22 -0
- package/lib/db-ops/_shared/upsert-json-ref.js +41 -0
- package/lib/db-ops/_shared/upsert-response-headers.d.ts +35 -0
- package/lib/db-ops/_shared/upsert-response-headers.js +49 -0
- package/lib/db-ops/_shared/upsert-url-ref.d.ts +39 -0
- package/lib/db-ops/_shared/upsert-url-ref.js +62 -0
- package/lib/db-ops/anchors/get-anchors-on-page.d.ts +10 -0
- package/lib/db-ops/anchors/get-anchors-on-page.js +21 -0
- package/lib/db-ops/config/get-base-url.d.ts +8 -0
- package/lib/db-ops/config/get-base-url.js +14 -0
- package/lib/db-ops/config/get-config.d.ts +10 -0
- package/lib/db-ops/config/get-config.js +29 -0
- package/lib/db-ops/config/get-created-cwd.d.ts +11 -0
- package/lib/db-ops/config/get-created-cwd.js +13 -0
- package/lib/db-ops/config/get-name.d.ts +8 -0
- package/lib/db-ops/config/get-name.js +14 -0
- package/lib/db-ops/config/info-column-allowlist.d.ts +7 -0
- package/lib/db-ops/config/info-column-allowlist.js +29 -0
- package/lib/db-ops/config/info-json-columns.d.ts +5 -0
- package/lib/db-ops/config/info-json-columns.js +11 -0
- package/lib/db-ops/config/set-config.d.ts +12 -0
- package/lib/db-ops/config/set-config.js +21 -0
- package/lib/db-ops/config/update-config.d.ts +17 -0
- package/lib/db-ops/config/update-config.js +36 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.d.ts +19 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.js +30 -0
- package/lib/db-ops/console-logs/replace-console-logs.d.ts +34 -0
- package/lib/db-ops/console-logs/replace-console-logs.js +123 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.d.ts +16 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.js +26 -0
- package/lib/db-ops/console-logs/types.d.ts +38 -0
- package/lib/db-ops/console-logs/types.js +1 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.d.ts +29 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.js +52 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.d.ts +18 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.js +23 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.d.ts +12 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.js +15 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.d.ts +14 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.js +30 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.d.ts +57 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.js +87 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.d.ts +21 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.js +27 -0
- package/lib/db-ops/errors/insert-crawl-error.d.ts +15 -0
- package/lib/db-ops/errors/insert-crawl-error.js +21 -0
- package/lib/db-ops/errors/insert-page-error.d.ts +21 -0
- package/lib/db-ops/errors/insert-page-error.js +30 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.d.ts +33 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.js +158 -0
- package/lib/db-ops/html/read-page-html-blob.d.ts +17 -0
- package/lib/db-ops/html/read-page-html-blob.js +20 -0
- package/lib/db-ops/lifecycle/checkpoint.d.ts +8 -0
- package/lib/db-ops/lifecycle/checkpoint.js +9 -0
- package/lib/db-ops/lifecycle/destroy.d.ts +6 -0
- package/lib/db-ops/lifecycle/destroy.js +7 -0
- package/lib/db-ops/lifecycle/init.d.ts +58 -0
- package/lib/db-ops/lifecycle/init.js +122 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.d.ts +22 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.js +41 -0
- package/lib/db-ops/meta/get-audios-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-audios-of-page.js +15 -0
- package/lib/db-ops/meta/get-buttons-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-buttons-of-page.js +15 -0
- package/lib/db-ops/meta/get-canvases-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-canvases-of-page.js +15 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.js +15 -0
- package/lib/db-ops/meta/get-headings-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-headings-of-page.js +15 -0
- package/lib/db-ops/meta/get-iframes-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-iframes-of-page.js +15 -0
- package/lib/db-ops/meta/get-jsonld-of-page.d.ts +13 -0
- package/lib/db-ops/meta/get-jsonld-of-page.js +27 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.js +15 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.js +15 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.js +15 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.js +15 -0
- package/lib/db-ops/meta/get-videos-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-videos-of-page.js +15 -0
- package/lib/db-ops/outages/close-network-outage.d.ts +12 -0
- package/lib/db-ops/outages/close-network-outage.js +15 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.d.ts +26 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.js +42 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.d.ts +26 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.js +31 -0
- package/lib/db-ops/outages/insert-network-outage.d.ts +14 -0
- package/lib/db-ops/outages/insert-network-outage.js +29 -0
- package/lib/db-ops/outages/list-network-outages.d.ts +28 -0
- package/lib/db-ops/outages/list-network-outages.js +42 -0
- package/lib/db-ops/pages/order/set-url-order.d.ts +13 -0
- package/lib/db-ops/pages/order/set-url-order.js +38 -0
- package/lib/db-ops/pages/read/build-page-query.d.ts +18 -0
- package/lib/db-ops/pages/read/build-page-query.js +40 -0
- package/lib/db-ops/pages/read/get-crawling-state.d.ts +117 -0
- package/lib/db-ops/pages/read/get-crawling-state.js +161 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.d.ts +15 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.js +30 -0
- package/lib/db-ops/pages/read/get-page-count.d.ts +12 -0
- package/lib/db-ops/pages/read/get-page-count.js +21 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.d.ts +24 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.js +28 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.d.ts +38 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.js +107 -0
- package/lib/db-ops/pages/read/get-pages.d.ts +11 -0
- package/lib/db-ops/pages/read/get-pages.js +51 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.d.ts +18 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.js +25 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.d.ts +31 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.js +32 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.d.ts +20 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.js +37 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.d.ts +30 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.js +91 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.d.ts +88 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.js +216 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.d.ts +80 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.js +151 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.d.ts +24 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.js +24 -0
- package/lib/db-ops/pages/write/insert-audios.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-audios.js +25 -0
- package/lib/db-ops/pages/write/insert-buttons.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-buttons.js +29 -0
- package/lib/db-ops/pages/write/insert-canvases.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-canvases.js +26 -0
- package/lib/db-ops/pages/write/insert-custom-elements.d.ts +27 -0
- package/lib/db-ops/pages/write/insert-custom-elements.js +40 -0
- package/lib/db-ops/pages/write/insert-headings.d.ts +15 -0
- package/lib/db-ops/pages/write/insert-headings.js +27 -0
- package/lib/db-ops/pages/write/insert-iframes.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-iframes.js +28 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.d.ts +38 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.js +60 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.d.ts +36 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.js +48 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.d.ts +42 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.js +56 -0
- package/lib/db-ops/pages/write/insert-jsonld.d.ts +17 -0
- package/lib/db-ops/pages/write/insert-jsonld.js +49 -0
- package/lib/db-ops/pages/write/insert-main-content-images.d.ts +20 -0
- package/lib/db-ops/pages/write/insert-main-content-images.js +32 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.js +29 -0
- package/lib/db-ops/pages/write/insert-page.d.ts +56 -0
- package/lib/db-ops/pages/write/insert-page.js +259 -0
- package/lib/db-ops/pages/write/insert-technologies.d.ts +25 -0
- package/lib/db-ops/pages/write/insert-technologies.js +45 -0
- package/lib/db-ops/pages/write/insert-videos.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-videos.js +28 -0
- package/lib/db-ops/pages/write/link-redirect-sources.d.ts +42 -0
- package/lib/db-ops/pages/write/link-redirect-sources.js +101 -0
- package/lib/db-ops/pages/write/record-redirect.d.ts +35 -0
- package/lib/db-ops/pages/write/record-redirect.js +100 -0
- package/lib/db-ops/pages/write/set-skipped-page.d.ts +13 -0
- package/lib/db-ops/pages/write/set-skipped-page.js +24 -0
- package/lib/db-ops/pages/write/update-page.d.ts +40 -0
- package/lib/db-ops/pages/write/update-page.js +419 -0
- package/lib/db-ops/pages/write/write-page-html-blob.d.ts +19 -0
- package/lib/db-ops/pages/write/write-page-html-blob.js +41 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.d.ts +9 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.js +15 -0
- package/lib/db-ops/referrers/get-referrers-of-page.d.ts +17 -0
- package/lib/db-ops/referrers/get-referrers-of-page.js +32 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.d.ts +8 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.js +15 -0
- package/lib/db-ops/resources/build-resource-query.d.ts +25 -0
- package/lib/db-ops/resources/build-resource-query.js +29 -0
- package/lib/db-ops/resources/get-existing-resource-urls.d.ts +9 -0
- package/lib/db-ops/resources/get-existing-resource-urls.js +24 -0
- package/lib/db-ops/resources/get-resource-by-url.d.ts +13 -0
- package/lib/db-ops/resources/get-resource-by-url.js +22 -0
- package/lib/db-ops/resources/get-resource-url-list.d.ts +17 -0
- package/lib/db-ops/resources/get-resource-url-list.js +26 -0
- package/lib/db-ops/resources/get-resources.d.ts +8 -0
- package/lib/db-ops/resources/get-resources.js +11 -0
- package/lib/db-ops/resources/insert-inventory-resources.d.ts +24 -0
- package/lib/db-ops/resources/insert-inventory-resources.js +64 -0
- package/lib/db-ops/resources/insert-resource-referrers.d.ts +15 -0
- package/lib/db-ops/resources/insert-resource-referrers.js +54 -0
- package/lib/db-ops/resources/insert-resource.d.ts +34 -0
- package/lib/db-ops/resources/insert-resource.js +73 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.d.ts +26 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.js +30 -0
- package/lib/db-ops/templates/assign-template-labels.d.ts +60 -0
- package/lib/db-ops/templates/assign-template-labels.js +187 -0
- package/lib/db-ops/templates/replace-page-templates.d.ts +44 -0
- package/lib/db-ops/templates/replace-page-templates.js +174 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.d.ts +16 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.js +17 -0
- package/lib/db-ops/templates/types.d.ts +103 -0
- package/lib/db-ops/templates/types.js +1 -0
- package/lib/debug.d.ts +8 -0
- package/lib/debug.js +9 -0
- package/lib/decode-html-blob.d.ts +20 -0
- package/lib/decode-html-blob.js +23 -0
- package/lib/decode-page-html-blob-bytes.d.ts +25 -0
- package/lib/decode-page-html-blob-bytes.js +29 -0
- package/lib/decode-stored-blob-bytes.d.ts +25 -0
- package/lib/decode-stored-blob-bytes.js +47 -0
- package/lib/derive-lineage-from-parent.d.ts +37 -0
- package/lib/derive-lineage-from-parent.js +42 -0
- package/lib/drop-legacy-tables.d.ts +45 -0
- package/lib/drop-legacy-tables.js +56 -0
- package/lib/error-kind/classify-error-kind.d.ts +20 -0
- package/lib/error-kind/classify-error-kind.js +136 -0
- package/lib/error-kind/network-related-error-kinds.d.ts +23 -0
- package/lib/error-kind/network-related-error-kinds.js +28 -0
- package/lib/error-kind/permanent-error-kinds.d.ts +48 -0
- package/lib/error-kind/permanent-error-kinds.js +54 -0
- package/lib/error-kind/types.d.ts +54 -0
- package/lib/error-kind/types.js +1 -0
- package/lib/filesystem/append-text.d.ts +9 -0
- package/lib/filesystem/append-text.js +14 -0
- package/lib/filesystem/copy-dir-sync.d.ts +6 -0
- package/lib/filesystem/copy-dir-sync.js +9 -0
- package/lib/filesystem/copy-dir.d.ts +7 -0
- package/lib/filesystem/copy-dir.js +13 -0
- package/lib/filesystem/copy-file-with-progress.d.ts +20 -0
- package/lib/filesystem/copy-file-with-progress.js +34 -0
- package/lib/filesystem/exists.d.ts +6 -0
- package/lib/filesystem/exists.js +9 -0
- package/lib/filesystem/get-file-list.d.ts +8 -0
- package/lib/filesystem/get-file-list.js +12 -0
- package/lib/filesystem/is-dir.d.ts +6 -0
- package/lib/filesystem/is-dir.js +10 -0
- package/lib/filesystem/mkdir.d.ts +8 -0
- package/lib/filesystem/mkdir.js +15 -0
- package/lib/filesystem/output-binary.d.ts +12 -0
- package/lib/filesystem/output-binary.js +17 -0
- package/lib/filesystem/output-json.d.ts +9 -0
- package/lib/filesystem/output-json.js +14 -0
- package/lib/filesystem/output-text.d.ts +11 -0
- package/lib/filesystem/output-text.js +32 -0
- package/lib/filesystem/parse-pax-path.d.ts +18 -0
- package/lib/filesystem/parse-pax-path.js +47 -0
- package/lib/filesystem/parse-tar-size-field.d.ts +13 -0
- package/lib/filesystem/parse-tar-size-field.js +40 -0
- package/lib/filesystem/peek-tar-top-dir.d.ts +35 -0
- package/lib/filesystem/peek-tar-top-dir.js +215 -0
- package/lib/filesystem/read-json.d.ts +7 -0
- package/lib/filesystem/read-json.js +11 -0
- package/lib/filesystem/read-text.d.ts +6 -0
- package/lib/filesystem/read-text.js +10 -0
- package/lib/filesystem/readline.d.ts +11 -0
- package/lib/filesystem/readline.js +26 -0
- package/lib/filesystem/remove.d.ts +5 -0
- package/lib/filesystem/remove.js +10 -0
- package/lib/filesystem/rename.d.ts +16 -0
- package/lib/filesystem/rename.js +48 -0
- package/lib/filesystem/tar.d.ts +23 -0
- package/lib/filesystem/tar.js +78 -0
- package/lib/filesystem/untar.d.ts +33 -0
- package/lib/filesystem/untar.js +84 -0
- package/lib/get-failed-page-messages.d.ts +56 -0
- package/lib/get-failed-page-messages.js +146 -0
- package/lib/get-json.d.ts +10 -0
- package/lib/get-json.js +25 -0
- package/lib/html-snapshot/match-selector-html.d.ts +25 -0
- package/lib/html-snapshot/match-selector-html.js +28 -0
- package/lib/html-snapshot/match-selector-snapshots.d.ts +33 -0
- package/lib/html-snapshot/match-selector-snapshots.js +33 -0
- package/lib/html-snapshot/search-html-document.d.ts +29 -0
- package/lib/html-snapshot/search-html-document.js +27 -0
- package/lib/html-snapshot/search-html-snapshots.d.ts +36 -0
- package/lib/html-snapshot/search-html-snapshots.js +35 -0
- package/lib/html-snapshot/types.d.ts +111 -0
- package/lib/html-snapshot/types.js +7 -0
- package/lib/html-snapshot/validate-search-pattern.d.ts +15 -0
- package/lib/html-snapshot/validate-search-pattern.js +17 -0
- package/lib/init-schema.d.ts +48 -0
- package/lib/init-schema.js +124 -0
- package/lib/is-inventory-source.d.ts +21 -0
- package/lib/is-inventory-source.js +22 -0
- package/lib/is-within-outage-window.d.ts +49 -0
- package/lib/is-within-outage-window.js +33 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.d.ts +24 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.js +26 -0
- package/lib/libsql-dialect.d.ts +115 -0
- package/lib/libsql-dialect.js +116 -0
- package/lib/limited-page-ids.d.ts +9 -0
- package/lib/limited-page-ids.js +18 -0
- package/lib/meta/assert-compatible-version.d.ts +60 -0
- package/lib/meta/assert-compatible-version.js +93 -0
- package/lib/meta/classify-jsonld-type.d.ts +23 -0
- package/lib/meta/classify-jsonld-type.js +43 -0
- package/lib/meta/compare-semver.d.ts +23 -0
- package/lib/meta/compare-semver.js +51 -0
- package/lib/meta/compute-main-contents-denormalized.d.ts +41 -0
- package/lib/meta/compute-main-contents-denormalized.js +88 -0
- package/lib/meta/compute-page-denormalized.d.ts +20 -0
- package/lib/meta/compute-page-denormalized.js +35 -0
- package/lib/meta/derive-flat-from-meta.d.ts +34 -0
- package/lib/meta/derive-flat-from-meta.js +158 -0
- package/lib/meta/derive-meta-extras.d.ts +20 -0
- package/lib/meta/derive-meta-extras.js +23 -0
- package/lib/meta/extract-tags-for-archive.d.ts +17 -0
- package/lib/meta/extract-tags-for-archive.js +36 -0
- package/lib/meta/parse-main-content-class-list.d.ts +19 -0
- package/lib/meta/parse-main-content-class-list.js +34 -0
- package/lib/meta/summarize-jsonld.d.ts +17 -0
- package/lib/meta/summarize-jsonld.js +29 -0
- package/lib/meta/technologies/combine-technology-confidence.d.ts +46 -0
- package/lib/meta/technologies/combine-technology-confidence.js +93 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.d.ts +45 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.js +53 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.d.ts +33 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.js +46 -0
- package/lib/meta/technologies/extract-technologies-for-archive.d.ts +33 -0
- package/lib/meta/technologies/extract-technologies-for-archive.js +30 -0
- package/lib/meta/technologies/match-js-license-comment-signal.d.ts +21 -0
- package/lib/meta/technologies/match-js-license-comment-signal.js +23 -0
- package/lib/meta/technologies/match-structural-technology-signals.d.ts +26 -0
- package/lib/meta/technologies/match-structural-technology-signals.js +48 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.d.ts +25 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.js +35 -0
- package/lib/meta/technologies/technology-signal-definitions.d.ts +44 -0
- package/lib/meta/technologies/technology-signal-definitions.js +60 -0
- package/lib/meta/technologies/types.d.ts +70 -0
- package/lib/meta/technologies/types.js +13 -0
- package/lib/meta/types.d.ts +1490 -0
- package/lib/meta/types.js +65 -0
- package/lib/migrate-content-items-alias-of-id.d.ts +52 -0
- package/lib/migrate-content-items-alias-of-id.js +69 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.d.ts +46 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.js +62 -0
- package/lib/migrate-content-items-is-metadata-only.d.ts +44 -0
- package/lib/migrate-content-items-is-metadata-only.js +60 -0
- package/lib/migrate-entity-tables.d.ts +55 -0
- package/lib/migrate-entity-tables.js +66 -0
- package/lib/migrate-info-created-cwd.d.ts +17 -0
- package/lib/migrate-info-created-cwd.js +36 -0
- package/lib/migrate-info-main-content-selector.d.ts +16 -0
- package/lib/migrate-info-main-content-selector.js +35 -0
- package/lib/migrate-info-request-header-names.d.ts +16 -0
- package/lib/migrate-info-request-header-names.js +35 -0
- package/lib/migrate-info-roots.d.ts +20 -0
- package/lib/migrate-info-roots.js +52 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.d.ts +34 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.js +51 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.d.ts +25 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.js +44 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.d.ts +16 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.js +35 -0
- package/lib/migrate-main-contents-columns.d.ts +26 -0
- package/lib/migrate-main-contents-columns.js +61 -0
- package/lib/migrate-page-meta-body-hash.d.ts +44 -0
- package/lib/migrate-page-meta-body-hash.js +63 -0
- package/lib/migrate-page-meta-console-error-count.d.ts +27 -0
- package/lib/migrate-page-meta-console-error-count.js +45 -0
- package/lib/migrate-page-meta-custom-element-count.d.ts +33 -0
- package/lib/migrate-page-meta-custom-element-count.js +51 -0
- package/lib/migrate-page-meta-image-scan.d.ts +27 -0
- package/lib/migrate-page-meta-image-scan.js +52 -0
- package/lib/migrate-page-tags-to-page-technologies.d.ts +39 -0
- package/lib/migrate-page-tags-to-page-technologies.js +79 -0
- package/lib/migrate-ref-tables.d.ts +25 -0
- package/lib/migrate-ref-tables.js +38 -0
- package/lib/native-executor/check-native-executor-config.d.ts +17 -0
- package/lib/native-executor/check-native-executor-config.js +20 -0
- package/lib/page-meta-column-maps.d.ts +32 -0
- package/lib/page-meta-column-maps.js +43 -0
- package/lib/page.d.ts +546 -0
- package/lib/page.js +764 -0
- package/lib/peek-archive-lock.d.ts +40 -0
- package/lib/peek-archive-lock.js +62 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.d.ts +41 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.js +87 -0
- package/lib/populate-entity-tables/derive-dom-path.d.ts +35 -0
- package/lib/populate-entity-tables/derive-dom-path.js +72 -0
- package/lib/populate-entity-tables/is-blob-ref-value.d.ts +16 -0
- package/lib/populate-entity-tables/is-blob-ref-value.js +19 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.d.ts +66 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.js +96 -0
- package/lib/populate-entity-tables/populate-anchor-edges.d.ts +33 -0
- package/lib/populate-entity-tables/populate-anchor-edges.js +153 -0
- package/lib/populate-entity-tables/populate-content-items.d.ts +40 -0
- package/lib/populate-entity-tables/populate-content-items.js +141 -0
- package/lib/populate-entity-tables/populate-entities.d.ts +81 -0
- package/lib/populate-entity-tables/populate-entities.js +110 -0
- package/lib/populate-entity-tables/populate-image-items.d.ts +91 -0
- package/lib/populate-entity-tables/populate-image-items.js +226 -0
- package/lib/populate-entity-tables/populate-page-meta.d.ts +33 -0
- package/lib/populate-entity-tables/populate-page-meta.js +267 -0
- package/lib/populate-entity-tables/populate-resource-items.d.ts +22 -0
- package/lib/populate-entity-tables/populate-resource-items.js +114 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.d.ts +31 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.js +33 -0
- package/lib/populate-entity-tables/resolve-blob-refs.d.ts +31 -0
- package/lib/populate-entity-tables/resolve-blob-refs.js +100 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.d.ts +22 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.js +27 -0
- package/lib/populate-entity-tables/resolve-header-sets.d.ts +49 -0
- package/lib/populate-entity-tables/resolve-header-sets.js +122 -0
- package/lib/populate-entity-tables/resolve-json-refs.d.ts +25 -0
- package/lib/populate-entity-tables/resolve-json-refs.js +67 -0
- package/lib/populate-entity-tables/resolve-text-refs.d.ts +30 -0
- package/lib/populate-entity-tables/resolve-text-refs.js +61 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.d.ts +21 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.js +27 -0
- package/lib/populate-entity-tables/resolve-url-refs.d.ts +33 -0
- package/lib/populate-entity-tables/resolve-url-refs.js +60 -0
- package/lib/populate-entity-tables/test-utils/count-rows.d.ts +17 -0
- package/lib/populate-entity-tables/test-utils/count-rows.js +20 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.d.ts +25 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.js +42 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.d.ts +30 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.js +175 -0
- package/lib/populate-entity-tables/types.d.ts +157 -0
- package/lib/populate-entity-tables/types.js +12 -0
- package/lib/populate-entity-tables/upsert-text-refs.d.ts +38 -0
- package/lib/populate-entity-tables/upsert-text-refs.js +78 -0
- package/lib/populate-ref-tables/classify-content-type.d.ts +16 -0
- package/lib/populate-ref-tables/classify-content-type.js +52 -0
- package/lib/populate-ref-tables/compute-content-hash.d.ts +22 -0
- package/lib/populate-ref-tables/compute-content-hash.js +26 -0
- package/lib/populate-ref-tables/compute-header-flags.d.ts +16 -0
- package/lib/populate-ref-tables/compute-header-flags.js +70 -0
- package/lib/populate-ref-tables/content-type-rules.d.ts +38 -0
- package/lib/populate-ref-tables/content-type-rules.js +133 -0
- package/lib/populate-ref-tables/create-header-table-caches.d.ts +25 -0
- package/lib/populate-ref-tables/create-header-table-caches.js +49 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.d.ts +15 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.js +15 -0
- package/lib/populate-ref-tables/decode-data-uri.d.ts +21 -0
- package/lib/populate-ref-tables/decode-data-uri.js +126 -0
- package/lib/populate-ref-tables/decompose-header-set.d.ts +29 -0
- package/lib/populate-ref-tables/decompose-header-set.js +157 -0
- package/lib/populate-ref-tables/decompose-url.d.ts +25 -0
- package/lib/populate-ref-tables/decompose-url.js +70 -0
- package/lib/populate-ref-tables/header-stability.d.ts +19 -0
- package/lib/populate-ref-tables/header-stability.js +22 -0
- package/lib/populate-ref-tables/header-value-cache-key.d.ts +17 -0
- package/lib/populate-ref-tables/header-value-cache-key.js +19 -0
- package/lib/populate-ref-tables/normalize-mime.d.ts +24 -0
- package/lib/populate-ref-tables/normalize-mime.js +36 -0
- package/lib/populate-ref-tables/populate-blob-refs.d.ts +38 -0
- package/lib/populate-ref-tables/populate-blob-refs.js +134 -0
- package/lib/populate-ref-tables/populate-content-type-refs.d.ts +27 -0
- package/lib/populate-ref-tables/populate-content-type-refs.js +70 -0
- package/lib/populate-ref-tables/populate-header-tables.d.ts +35 -0
- package/lib/populate-ref-tables/populate-header-tables.js +80 -0
- package/lib/populate-ref-tables/populate-json-refs.d.ts +29 -0
- package/lib/populate-ref-tables/populate-json-refs.js +101 -0
- package/lib/populate-ref-tables/populate-refs.d.ts +51 -0
- package/lib/populate-ref-tables/populate-refs.js +62 -0
- package/lib/populate-ref-tables/populate-text-refs.d.ts +32 -0
- package/lib/populate-ref-tables/populate-text-refs.js +133 -0
- package/lib/populate-ref-tables/populate-url-refs.d.ts +28 -0
- package/lib/populate-ref-tables/populate-url-refs.js +148 -0
- package/lib/populate-ref-tables/test-utils/count-rows.d.ts +15 -0
- package/lib/populate-ref-tables/test-utils/count-rows.js +17 -0
- package/lib/populate-ref-tables/types.d.ts +197 -0
- package/lib/populate-ref-tables/types.js +7 -0
- package/lib/populate-ref-tables/upsert-one-header-set.d.ts +34 -0
- package/lib/populate-ref-tables/upsert-one-header-set.js +208 -0
- package/lib/populate-ref-tables/volatile-header-names.d.ts +20 -0
- package/lib/populate-ref-tables/volatile-header-names.js +33 -0
- package/lib/redirect-table.d.ts +9 -0
- package/lib/redirect-table.js +28 -0
- package/lib/release-finished-statements.d.ts +42 -0
- package/lib/release-finished-statements.js +45 -0
- package/lib/resolve-redirect-chain.d.ts +33 -0
- package/lib/resolve-redirect-chain.js +27 -0
- package/lib/resource.d.ts +46 -0
- package/lib/resource.js +62 -0
- package/lib/retarget-legacy-fk-tables.d.ts +61 -0
- package/lib/retarget-legacy-fk-tables.js +137 -0
- package/lib/safe-path.d.ts +9 -0
- package/lib/safe-path.js +17 -0
- package/lib/scope/build-scope-map.d.ts +21 -0
- package/lib/scope/build-scope-map.js +32 -0
- package/lib/scope/find-scope-entry.d.ts +25 -0
- package/lib/scope/find-scope-entry.js +45 -0
- package/lib/template-classification/classify-archive-page-templates.d.ts +42 -0
- package/lib/template-classification/classify-archive-page-templates.js +70 -0
- package/lib/template-classification/classify-page-templates.d.ts +33 -0
- package/lib/template-classification/classify-page-templates.js +60 -0
- package/lib/template-classification/collect-page-ids-with-html.d.ts +24 -0
- package/lib/template-classification/collect-page-ids-with-html.js +30 -0
- package/lib/template-classification/collect-page-stylesheet-urls.d.ts +32 -0
- package/lib/template-classification/collect-page-stylesheet-urls.js +130 -0
- package/lib/template-classification/create-content-root-hint.d.ts +41 -0
- package/lib/template-classification/create-content-root-hint.js +51 -0
- package/lib/template-classification/create-page-cluster-factory.d.ts +36 -0
- package/lib/template-classification/create-page-cluster-factory.js +52 -0
- package/lib/template-classification/load-page-cluster-candidates.d.ts +32 -0
- package/lib/template-classification/load-page-cluster-candidates.js +93 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.d.ts +34 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.js +236 -0
- package/lib/template-classification/page-cluster/types.d.ts +123 -0
- package/lib/template-classification/page-cluster/types.js +1 -0
- package/lib/template-classification/types.d.ts +234 -0
- package/lib/template-classification/types.js +1 -0
- package/lib/test-utils/build-full-schema-test-db.d.ts +34 -0
- package/lib/test-utils/build-full-schema-test-db.js +74 -0
- package/lib/test-utils/create-legacy-analysis-tables.d.ts +13 -0
- package/lib/test-utils/create-legacy-analysis-tables.js +37 -0
- package/lib/test-utils/fk-parent-tables.d.ts +15 -0
- package/lib/test-utils/fk-parent-tables.js +19 -0
- package/lib/test-utils/seed-content-item.d.ts +35 -0
- package/lib/test-utils/seed-content-item.js +42 -0
- package/lib/test-utils/setup-legacy-fk-db.d.ts +34 -0
- package/lib/test-utils/setup-legacy-fk-db.js +271 -0
- package/lib/transfer/attach-source-database.d.ts +31 -0
- package/lib/transfer/attach-source-database.js +40 -0
- package/lib/transfer/build-split-config.d.ts +30 -0
- package/lib/transfer/build-split-config.js +42 -0
- package/lib/transfer/clear-replaced-page-rows.d.ts +23 -0
- package/lib/transfer/clear-replaced-page-rows.js +61 -0
- package/lib/transfer/concat-archives.d.ts +55 -0
- package/lib/transfer/concat-archives.js +95 -0
- package/lib/transfer/concat-source-transfer-phases.d.ts +10 -0
- package/lib/transfer/concat-source-transfer-phases.js +17 -0
- package/lib/transfer/content-item-rank-sql.d.ts +21 -0
- package/lib/transfer/content-item-rank-sql.js +23 -0
- package/lib/transfer/copy-anchor-edges.d.ts +28 -0
- package/lib/transfer/copy-anchor-edges.js +42 -0
- package/lib/transfer/copy-dictionaries-for-concat.d.ts +39 -0
- package/lib/transfer/copy-dictionaries-for-concat.js +81 -0
- package/lib/transfer/copy-dictionaries-for-split.d.ts +29 -0
- package/lib/transfer/copy-dictionaries-for-split.js +224 -0
- package/lib/transfer/copy-header-set-children.d.ts +27 -0
- package/lib/transfer/copy-header-set-children.js +51 -0
- package/lib/transfer/copy-image-items.d.ts +21 -0
- package/lib/transfer/copy-image-items.js +62 -0
- package/lib/transfer/copy-inventory-source-lists.d.ts +30 -0
- package/lib/transfer/copy-inventory-source-lists.js +61 -0
- package/lib/transfer/copy-journal-tables.d.ts +30 -0
- package/lib/transfer/copy-journal-tables.js +56 -0
- package/lib/transfer/copy-page-console-logs.d.ts +16 -0
- package/lib/transfer/copy-page-console-logs.js +27 -0
- package/lib/transfer/copy-page-html-blobs.d.ts +31 -0
- package/lib/transfer/copy-page-html-blobs.js +43 -0
- package/lib/transfer/copy-page-meta.d.ts +27 -0
- package/lib/transfer/copy-page-meta.js +68 -0
- package/lib/transfer/copy-page-template-clusters.d.ts +31 -0
- package/lib/transfer/copy-page-template-clusters.js +56 -0
- package/lib/transfer/copy-page-template-labels.d.ts +34 -0
- package/lib/transfer/copy-page-template-labels.js +88 -0
- package/lib/transfer/copy-resource-items.d.ts +29 -0
- package/lib/transfer/copy-resource-items.js +89 -0
- package/lib/transfer/copy-resource-ref-edges.d.ts +20 -0
- package/lib/transfer/copy-resource-ref-edges.js +33 -0
- package/lib/transfer/copy-simple-page-scoped-tables.d.ts +15 -0
- package/lib/transfer/copy-simple-page-scoped-tables.js +34 -0
- package/lib/transfer/count-external-pages-in-scope.d.ts +26 -0
- package/lib/transfer/count-external-pages-in-scope.js +40 -0
- package/lib/transfer/create-transfer-temp-tables.d.ts +30 -0
- package/lib/transfer/create-transfer-temp-tables.js +59 -0
- package/lib/transfer/dictionary-copy-specs.d.ts +32 -0
- package/lib/transfer/dictionary-copy-specs.js +28 -0
- package/lib/transfer/drop-transfer-temp-tables.d.ts +9 -0
- package/lib/transfer/drop-transfer-temp-tables.js +18 -0
- package/lib/transfer/flatten-redirect-chains.d.ts +44 -0
- package/lib/transfer/flatten-redirect-chains.js +74 -0
- package/lib/transfer/insert-content-items.d.ts +35 -0
- package/lib/transfer/insert-content-items.js +116 -0
- package/lib/transfer/list-transfer-columns.d.ts +35 -0
- package/lib/transfer/list-transfer-columns.js +45 -0
- package/lib/transfer/mark-in-scope-content-items.d.ts +31 -0
- package/lib/transfer/mark-in-scope-content-items.js +54 -0
- package/lib/transfer/merge-archive-configs.d.ts +51 -0
- package/lib/transfer/merge-archive-configs.js +85 -0
- package/lib/transfer/plan-content-items-for-concat.d.ts +33 -0
- package/lib/transfer/plan-content-items-for-concat.js +51 -0
- package/lib/transfer/plan-content-items-for-split.d.ts +42 -0
- package/lib/transfer/plan-content-items-for-split.js +83 -0
- package/lib/transfer/plan-resource-items.d.ts +40 -0
- package/lib/transfer/plan-resource-items.js +69 -0
- package/lib/transfer/quote-transfer-identifier.d.ts +18 -0
- package/lib/transfer/quote-transfer-identifier.js +20 -0
- package/lib/transfer/reclassify-resource-externality.d.ts +37 -0
- package/lib/transfer/reclassify-resource-externality.js +66 -0
- package/lib/transfer/remap-redirect-dest-ids.d.ts +34 -0
- package/lib/transfer/remap-redirect-dest-ids.js +51 -0
- package/lib/transfer/replace-content-items.d.ts +39 -0
- package/lib/transfer/replace-content-items.js +83 -0
- package/lib/transfer/simple-page-scoped-tables.d.ts +25 -0
- package/lib/transfer/simple-page-scoped-tables.js +38 -0
- package/lib/transfer/split-archive.d.ts +55 -0
- package/lib/transfer/split-archive.js +98 -0
- package/lib/transfer/split-source-transfer-phases.d.ts +11 -0
- package/lib/transfer/split-source-transfer-phases.js +18 -0
- package/lib/transfer/transfer-action.d.ts +34 -0
- package/lib/transfer/transfer-action.js +32 -0
- package/lib/transfer/transfer-archive-rows.d.ts +65 -0
- package/lib/transfer/transfer-archive-rows.js +156 -0
- package/lib/transfer/transfer-dictionary-tables.d.ts +12 -0
- package/lib/transfer/transfer-dictionary-tables.js +22 -0
- package/lib/transfer/transfer-post-phases.d.ts +10 -0
- package/lib/transfer/transfer-post-phases.js +13 -0
- package/lib/transfer/transfer-source-alias.d.ts +9 -0
- package/lib/transfer/transfer-source-alias.js +9 -0
- package/lib/transfer/types.d.ts +111 -0
- package/lib/transfer/types.js +35 -0
- package/lib/types.d.ts +772 -0
- package/lib/types.js +1 -0
- package/lib/url-alias/compute-tier-a-alias-key.d.ts +44 -0
- package/lib/url-alias/compute-tier-a-alias-key.js +47 -0
- package/lib/url-alias/compute-tier-b-alias-key.d.ts +23 -0
- package/lib/url-alias/compute-tier-b-alias-key.js +26 -0
- package/lib/url-alias/group-alias-candidates.d.ts +27 -0
- package/lib/url-alias/group-alias-candidates.js +29 -0
- package/lib/url-alias/types.d.ts +12 -0
- package/lib/url-alias/types.js +1 -0
- package/lib/url-pattern/compute-shape-key.d.ts +58 -0
- package/lib/url-pattern/compute-shape-key.js +129 -0
- package/lib/url-pattern/decompose-url.d.ts +33 -0
- package/lib/url-pattern/decompose-url.js +79 -0
- package/lib/url-pattern/reconstruct-url.d.ts +15 -0
- package/lib/url-pattern/reconstruct-url.js +33 -0
- package/lib/url-sort/compute-url-sort-ranks.d.ts +30 -0
- package/lib/url-sort/compute-url-sort-ranks.js +33 -0
- package/lib/utils/array/each-splitted.d.ts +10 -0
- package/lib/utils/array/each-splitted.js +14 -0
- package/lib/utils/debug.d.ts +8 -0
- package/lib/utils/debug.js +8 -0
- package/lib/utils/error/emit-error-with-retry.d.ts +40 -0
- package/lib/utils/error/emit-error-with-retry.js +44 -0
- package/lib/utils/error/emit-error.d.ts +39 -0
- package/lib/utils/error/emit-error.js +41 -0
- package/lib/utils/object/parse-response-headers.d.ts +12 -0
- package/lib/utils/object/parse-response-headers.js +26 -0
- package/lib/utils/object/redact-request-headers.d.ts +15 -0
- package/lib/utils/object/redact-request-headers.js +27 -0
- package/lib/utils/types/types.d.ts +383 -0
- package/lib/utils/types/types.js +1 -0
- package/lib/verify-migration/capture-rejection.d.ts +24 -0
- package/lib/verify-migration/capture-rejection.js +31 -0
- package/lib/verify-migration/check-anchor-edges-count.d.ts +34 -0
- package/lib/verify-migration/check-anchor-edges-count.js +72 -0
- package/lib/verify-migration/check-anchor-edges-sum.d.ts +13 -0
- package/lib/verify-migration/check-anchor-edges-sum.js +27 -0
- package/lib/verify-migration/check-content-items-count.d.ts +16 -0
- package/lib/verify-migration/check-content-items-count.js +30 -0
- package/lib/verify-migration/check-content-type-preservation.d.ts +22 -0
- package/lib/verify-migration/check-content-type-preservation.js +40 -0
- package/lib/verify-migration/check-foreign-key-integrity.d.ts +31 -0
- package/lib/verify-migration/check-foreign-key-integrity.js +47 -0
- package/lib/verify-migration/check-image-items-count.d.ts +12 -0
- package/lib/verify-migration/check-image-items-count.js +26 -0
- package/lib/verify-migration/check-page-meta-count.d.ts +15 -0
- package/lib/verify-migration/check-page-meta-count.js +31 -0
- package/lib/verify-migration/check-reader-parity.d.ts +23 -0
- package/lib/verify-migration/check-reader-parity.js +182 -0
- package/lib/verify-migration/check-resource-items-count.d.ts +17 -0
- package/lib/verify-migration/check-resource-items-count.js +33 -0
- package/lib/verify-migration/check-url-round-trip.d.ts +43 -0
- package/lib/verify-migration/check-url-round-trip.js +112 -0
- package/lib/verify-migration/types.d.ts +70 -0
- package/lib/verify-migration/types.js +63 -0
- package/lib/verify-migration/verify-migration.d.ts +41 -0
- package/lib/verify-migration/verify-migration.js +120 -0
- package/lib/with-bulk-write-pragmas.d.ts +51 -0
- package/lib/with-bulk-write-pragmas.js +132 -0
- package/lib/write-queue.d.ts +32 -0
- package/lib/write-queue.js +55 -0
- package/package.json +360 -5
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { createProgressReporter } from '../create-progress-reporter.js';
|
|
2
|
+
import { collapseAnchorRows } from './collapse-anchor-rows.js';
|
|
3
|
+
import { resolveTextRefs } from './resolve-text-refs.js';
|
|
4
|
+
/**
|
|
5
|
+
* Rows scanned per keyset-paginated `SELECT` chunk against `anchors`.
|
|
6
|
+
* `anchors` is the largest table in the archive (≈ 13 M rows on the
|
|
7
|
+
* reference archive) so the chunk size trades off memory against
|
|
8
|
+
* round-trip overhead. 5 000 rows per SELECT keeps peak chunk memory
|
|
9
|
+
* ≈ 5 MB (per-row ≈ 1 KB with URL / textContent stored elsewhere) and
|
|
10
|
+
* amortises the per-query round-trip cost across many collapses.
|
|
11
|
+
*/
|
|
12
|
+
const READ_CHUNK_SIZE = 5000;
|
|
13
|
+
/**
|
|
14
|
+
* Edges buffered before a bulk `.insert(rows).onConflict(...).ignore()`.
|
|
15
|
+
* The real constraint here is NOT the SQLite bound-parameter limit —
|
|
16
|
+
* knex's sqlite3-family dialect compiles any multi-row `.insert()` (with
|
|
17
|
+
* or without `onConflict`) into `INSERT INTO ... SELECT ... UNION ALL
|
|
18
|
+
* SELECT ...`, which is capped by SQLite's `SQLITE_LIMIT_COMPOUND_SELECT`
|
|
19
|
+
* (default 500). A chunk size above 500 fails with "too many terms in
|
|
20
|
+
* compound SELECT" — confirmed against a real archive whose anchor count
|
|
21
|
+
* routinely produces 500+ distinct `(page_id, href_page_id)` pairs per
|
|
22
|
+
* page. Kept at exactly 500 (not lower) to match the established
|
|
23
|
+
* convention already used by `upsert-one-header-set.ts` and the
|
|
24
|
+
* ref-tables populate steps.
|
|
25
|
+
*/
|
|
26
|
+
const INSERT_CHUNK_SIZE = 500;
|
|
27
|
+
/**
|
|
28
|
+
* Populates `anchor_edges` from `anchors` (issue #193).
|
|
29
|
+
*
|
|
30
|
+
* The algorithm is a **single keyset-paginated scan** over `anchors`
|
|
31
|
+
* ordered by `(pageId, hrefId, id)`. Each chunk feeds
|
|
32
|
+
* {@link ./collapse-anchor-rows.ts}, which yields one edge per distinct
|
|
33
|
+
* `(pageId, hrefId)` pair as soon as the pair boundary is observed.
|
|
34
|
+
*
|
|
35
|
+
* A boundary can straddle two chunks (the last row of chunk N shares a
|
|
36
|
+
* pair with the first row of chunk N+1), so the outer loop keeps an
|
|
37
|
+
* "open edge" state that flushes only when the *next* pair actually
|
|
38
|
+
* starts. On end-of-stream the last open edge is emitted.
|
|
39
|
+
*
|
|
40
|
+
* `first_text_id` is left unresolved during the streaming pass — the
|
|
41
|
+
* text is buffered on each pending edge and resolved in bulk by
|
|
42
|
+
* {@link ./resolve-text-refs.ts} at INSERT time. Every INSERT batch
|
|
43
|
+
* therefore issues one text-refs lookup + one INSERT, keeping DB
|
|
44
|
+
* round-trips per edge low.
|
|
45
|
+
*
|
|
46
|
+
* `INSERT OR IGNORE` on the `(page_id, href_page_id)` UNIQUE composite
|
|
47
|
+
* makes the step idempotent: a re-run after partial failure re-emits the
|
|
48
|
+
* same edges but the writes no-op.
|
|
49
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
50
|
+
* @param onProgress - Optional sink for periodic progress lines (one per
|
|
51
|
+
* ~5% of `anchors` scanned); see {@link ../create-progress-reporter.ts}.
|
|
52
|
+
* @example
|
|
53
|
+
* await knex.transaction(async (trx) => {
|
|
54
|
+
* await populateAnchorEdges(trx);
|
|
55
|
+
* });
|
|
56
|
+
*/
|
|
57
|
+
export async function populateAnchorEdges(trx, onProgress) {
|
|
58
|
+
let cursorPageId = 0;
|
|
59
|
+
let cursorHrefId = 0;
|
|
60
|
+
let cursorId = 0;
|
|
61
|
+
let carryOver = null;
|
|
62
|
+
const pending = [];
|
|
63
|
+
const countRows = await trx('anchors').count({ n: '*' });
|
|
64
|
+
const total = Number(countRows[0]?.n ?? 0);
|
|
65
|
+
const report = createProgressReporter('anchor_edges (anchors)', total, onProgress);
|
|
66
|
+
let processed = 0;
|
|
67
|
+
while (true) {
|
|
68
|
+
const rows = await trx('anchors')
|
|
69
|
+
.select('id', 'pageId', 'hrefId', 'hash', 'textContent')
|
|
70
|
+
.where(function () {
|
|
71
|
+
this.where('pageId', '>', cursorPageId)
|
|
72
|
+
.orWhere(function () {
|
|
73
|
+
this.where('pageId', cursorPageId).andWhere('hrefId', '>', cursorHrefId);
|
|
74
|
+
})
|
|
75
|
+
.orWhere(function () {
|
|
76
|
+
this.where('pageId', cursorPageId)
|
|
77
|
+
.andWhere('hrefId', cursorHrefId)
|
|
78
|
+
.andWhere('id', '>', cursorId);
|
|
79
|
+
});
|
|
80
|
+
})
|
|
81
|
+
.orderBy([
|
|
82
|
+
{ column: 'pageId', order: 'asc' },
|
|
83
|
+
{ column: 'hrefId', order: 'asc' },
|
|
84
|
+
{ column: 'id', order: 'asc' },
|
|
85
|
+
])
|
|
86
|
+
.limit(READ_CHUNK_SIZE);
|
|
87
|
+
if (rows.length === 0) {
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
const lastRow = rows.at(-1);
|
|
91
|
+
cursorPageId = lastRow.pageId;
|
|
92
|
+
cursorHrefId = lastRow.hrefId;
|
|
93
|
+
cursorId = lastRow.id;
|
|
94
|
+
processed += rows.length;
|
|
95
|
+
report(processed);
|
|
96
|
+
const chunkEdges = [...collapseAnchorRows(rows)];
|
|
97
|
+
for (const edge of chunkEdges) {
|
|
98
|
+
if (carryOver !== null &&
|
|
99
|
+
carryOver.page_id === edge.page_id &&
|
|
100
|
+
carryOver.href_page_id === edge.href_page_id) {
|
|
101
|
+
carryOver.count += edge.count;
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (carryOver !== null) {
|
|
105
|
+
pending.push(carryOver);
|
|
106
|
+
}
|
|
107
|
+
carryOver = edge;
|
|
108
|
+
if (pending.length >= INSERT_CHUNK_SIZE) {
|
|
109
|
+
await flush(trx, pending);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (carryOver !== null) {
|
|
114
|
+
pending.push(carryOver);
|
|
115
|
+
}
|
|
116
|
+
if (pending.length > 0) {
|
|
117
|
+
await flush(trx, pending);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Resolves `first_text_id` for every buffered edge in `pending`, then
|
|
122
|
+
* bulk-inserts the batch into `anchor_edges` and clears the buffer.
|
|
123
|
+
*
|
|
124
|
+
* Extracted from the main loop so the "resolve + insert" pair happens in
|
|
125
|
+
* exactly one place — the streaming loop, the carry-over flush at
|
|
126
|
+
* end-of-stream, and any future re-order boundary all land here.
|
|
127
|
+
* @param trx - Knex instance or transaction.
|
|
128
|
+
* @param pending - Buffered edges awaiting `first_text_id` resolution
|
|
129
|
+
* and INSERT; mutated in place (cleared on return).
|
|
130
|
+
*/
|
|
131
|
+
async function flush(trx, pending) {
|
|
132
|
+
const texts = new Set();
|
|
133
|
+
for (const edge of pending) {
|
|
134
|
+
if (edge.first_textContent != null && edge.first_textContent !== '') {
|
|
135
|
+
texts.add(edge.first_textContent);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const textIds = await resolveTextRefs(trx, texts);
|
|
139
|
+
const inserts = pending.map((edge) => ({
|
|
140
|
+
page_id: edge.page_id,
|
|
141
|
+
href_page_id: edge.href_page_id,
|
|
142
|
+
count: edge.count,
|
|
143
|
+
first_hash: edge.first_hash,
|
|
144
|
+
first_text_id: edge.first_textContent != null && edge.first_textContent !== ''
|
|
145
|
+
? (textIds.get(edge.first_textContent) ?? null)
|
|
146
|
+
: null,
|
|
147
|
+
}));
|
|
148
|
+
await trx('anchor_edges')
|
|
149
|
+
.insert(inserts)
|
|
150
|
+
.onConflict(['page_id', 'href_page_id'])
|
|
151
|
+
.ignore();
|
|
152
|
+
pending.length = 0;
|
|
153
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ProgressCallback } from '../create-progress-reporter.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Populates `content_items` from `pages` (issue #193).
|
|
5
|
+
*
|
|
6
|
+
* Strategy per chunk:
|
|
7
|
+
*
|
|
8
|
+
* 1. **Keyset-paginate** `pages` in id order so partial-failure re-runs
|
|
9
|
+
* resume from the last committed row without reading the full table.
|
|
10
|
+
* Same pattern as {@link ../populate-ref-tables/populate-url-refs.ts}.
|
|
11
|
+
* 2. **Batch-resolve** `url_refs.id`, `content_type_refs.id`, and
|
|
12
|
+
* `header_sets.id` for every distinct value in the chunk — one round
|
|
13
|
+
* trip per ref table instead of N round trips per row.
|
|
14
|
+
* 3. **Bulk INSERT** with explicit `id = pages.id`. Reusing the legacy
|
|
15
|
+
* PK preserves every FK reference in `page_errors` / `page_tags` /
|
|
16
|
+
* `page_jsonld` / `page_html_ref` without a per-row UPDATE.
|
|
17
|
+
*
|
|
18
|
+
* `redirect_dest_id` is copied verbatim from `redirectDestId` — the FK
|
|
19
|
+
* self-reference is `DEFERRABLE INITIALLY DEFERRED` (see
|
|
20
|
+
* {@link ../create-entity-tables.ts}) so a redirect source
|
|
21
|
+
* inserted before its destination is validated only at COMMIT time.
|
|
22
|
+
*
|
|
23
|
+
* `INSERT OR IGNORE` on the natural PK makes the step idempotent — a
|
|
24
|
+
* re-run after a partial failure only inserts the rows that are still
|
|
25
|
+
* missing.
|
|
26
|
+
*
|
|
27
|
+
* `content_type_refs` is preloaded once at the start because its
|
|
28
|
+
* cardinality is small (see {@link ./resolve-content-type-refs.ts}); the
|
|
29
|
+
* URL and header-set resolvers are called per chunk because their
|
|
30
|
+
* per-archive cardinality can be very large (one row per distinct URL /
|
|
31
|
+
* response JSON).
|
|
32
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
33
|
+
* @param onProgress - Optional sink for periodic progress lines (one per
|
|
34
|
+
* ~5% of `pages` scanned); see {@link ../create-progress-reporter.ts}.
|
|
35
|
+
* @example
|
|
36
|
+
* await knex.transaction(async (trx) => {
|
|
37
|
+
* await populateContentItems(trx);
|
|
38
|
+
* });
|
|
39
|
+
*/
|
|
40
|
+
export declare function populateContentItems(trx: Knex, onProgress?: ProgressCallback): Promise<void>;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { createProgressReporter } from '../create-progress-reporter.js';
|
|
2
|
+
import { loadContentTypeRefs } from './resolve-content-type-refs.js';
|
|
3
|
+
import { resolveHeaderSets } from './resolve-header-sets.js';
|
|
4
|
+
import { resolveUrlRefs } from './resolve-url-refs.js';
|
|
5
|
+
/**
|
|
6
|
+
* Rows scanned per keyset-paginated `SELECT` chunk against `pages`. The
|
|
7
|
+
* migration reads every page column that maps to `content_items` in one
|
|
8
|
+
* SELECT per chunk, so scaling this too high would blow up the result-set
|
|
9
|
+
* size for long meta text columns. 500 keeps peak memory bounded at
|
|
10
|
+
* ≈ 30 MB for a chunk of `pages` with populated meta and header sets.
|
|
11
|
+
*/
|
|
12
|
+
const READ_CHUNK_SIZE = 500;
|
|
13
|
+
/**
|
|
14
|
+
* Rows sent per `INSERT INTO content_items ... VALUES (...)` statement.
|
|
15
|
+
* Each row binds 16 params (id + 15 core columns), so 300 rows =
|
|
16
|
+
* 4 800 params — safely under SQLite's default variable limit of 32 766.
|
|
17
|
+
*/
|
|
18
|
+
const INSERT_CHUNK_SIZE = 300;
|
|
19
|
+
/**
|
|
20
|
+
* Populates `content_items` from `pages` (issue #193).
|
|
21
|
+
*
|
|
22
|
+
* Strategy per chunk:
|
|
23
|
+
*
|
|
24
|
+
* 1. **Keyset-paginate** `pages` in id order so partial-failure re-runs
|
|
25
|
+
* resume from the last committed row without reading the full table.
|
|
26
|
+
* Same pattern as {@link ../populate-ref-tables/populate-url-refs.ts}.
|
|
27
|
+
* 2. **Batch-resolve** `url_refs.id`, `content_type_refs.id`, and
|
|
28
|
+
* `header_sets.id` for every distinct value in the chunk — one round
|
|
29
|
+
* trip per ref table instead of N round trips per row.
|
|
30
|
+
* 3. **Bulk INSERT** with explicit `id = pages.id`. Reusing the legacy
|
|
31
|
+
* PK preserves every FK reference in `page_errors` / `page_tags` /
|
|
32
|
+
* `page_jsonld` / `page_html_ref` without a per-row UPDATE.
|
|
33
|
+
*
|
|
34
|
+
* `redirect_dest_id` is copied verbatim from `redirectDestId` — the FK
|
|
35
|
+
* self-reference is `DEFERRABLE INITIALLY DEFERRED` (see
|
|
36
|
+
* {@link ../create-entity-tables.ts}) so a redirect source
|
|
37
|
+
* inserted before its destination is validated only at COMMIT time.
|
|
38
|
+
*
|
|
39
|
+
* `INSERT OR IGNORE` on the natural PK makes the step idempotent — a
|
|
40
|
+
* re-run after a partial failure only inserts the rows that are still
|
|
41
|
+
* missing.
|
|
42
|
+
*
|
|
43
|
+
* `content_type_refs` is preloaded once at the start because its
|
|
44
|
+
* cardinality is small (see {@link ./resolve-content-type-refs.ts}); the
|
|
45
|
+
* URL and header-set resolvers are called per chunk because their
|
|
46
|
+
* per-archive cardinality can be very large (one row per distinct URL /
|
|
47
|
+
* response JSON).
|
|
48
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
49
|
+
* @param onProgress - Optional sink for periodic progress lines (one per
|
|
50
|
+
* ~5% of `pages` scanned); see {@link ../create-progress-reporter.ts}.
|
|
51
|
+
* @example
|
|
52
|
+
* await knex.transaction(async (trx) => {
|
|
53
|
+
* await populateContentItems(trx);
|
|
54
|
+
* });
|
|
55
|
+
*/
|
|
56
|
+
export async function populateContentItems(trx, onProgress) {
|
|
57
|
+
const contentTypeIds = await loadContentTypeRefs(trx);
|
|
58
|
+
const countRows = await trx('pages').count({ n: '*' });
|
|
59
|
+
const total = Number(countRows[0]?.n ?? 0);
|
|
60
|
+
const report = createProgressReporter('content_items (pages)', total, onProgress);
|
|
61
|
+
let processed = 0;
|
|
62
|
+
let cursor = 0;
|
|
63
|
+
while (true) {
|
|
64
|
+
const rows = await trx('pages')
|
|
65
|
+
.select('id', 'url', 'redirectDestId', 'scraped', 'isTarget', 'isExternal', 'status', 'statusText', 'contentType', 'contentLength', 'responseHeaders', 'firstCrawledAt', 'lastCrawledAt', 'order', 'isSkipped', 'skipReason', 'source')
|
|
66
|
+
.where('id', '>', cursor)
|
|
67
|
+
.orderBy('id', 'asc')
|
|
68
|
+
.limit(READ_CHUNK_SIZE);
|
|
69
|
+
if (rows.length === 0) {
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
cursor = rows.at(-1).id;
|
|
73
|
+
processed += rows.length;
|
|
74
|
+
report(processed);
|
|
75
|
+
const urls = new Set();
|
|
76
|
+
const headerJsonStrings = new Set();
|
|
77
|
+
for (const row of rows) {
|
|
78
|
+
urls.add(row.url);
|
|
79
|
+
if (typeof row.responseHeaders === 'string' && row.responseHeaders !== '') {
|
|
80
|
+
headerJsonStrings.add(row.responseHeaders);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const urlIds = await resolveUrlRefs(trx, urls);
|
|
84
|
+
const headerSetIds = await resolveHeaderSets(trx, headerJsonStrings);
|
|
85
|
+
const inserts = rows.map((row) => {
|
|
86
|
+
const urlId = urlIds.get(row.url) ?? null;
|
|
87
|
+
if (urlId === null) {
|
|
88
|
+
throw new Error(`populateContentItems: url_refs.id not resolved for page id=${row.id} url=${row.url} — populateUrlRefs must run first`);
|
|
89
|
+
}
|
|
90
|
+
let contentTypeId = null;
|
|
91
|
+
if (row.contentType != null && row.contentType !== '') {
|
|
92
|
+
const resolved = contentTypeIds.get(row.contentType);
|
|
93
|
+
if (resolved === undefined) {
|
|
94
|
+
throw new Error(`populateContentItems: content_type_refs.id not resolved for page id=${row.id} contentType=${row.contentType} — populateContentTypeRefs must run first`);
|
|
95
|
+
}
|
|
96
|
+
contentTypeId = resolved;
|
|
97
|
+
}
|
|
98
|
+
let headerSetId = null;
|
|
99
|
+
if (typeof row.responseHeaders === 'string' && row.responseHeaders !== '') {
|
|
100
|
+
const resolved = headerSetIds.get(row.responseHeaders);
|
|
101
|
+
if (resolved === undefined) {
|
|
102
|
+
// `resolveHeaderSets` skips sentinel values ('{}' / 'null')
|
|
103
|
+
// AND payloads that `decomposeHeaderSet` cannot parse into
|
|
104
|
+
// any entries — in both cases the source row genuinely had
|
|
105
|
+
// no header set to point at, so `header_set_id = null` is
|
|
106
|
+
// the correct final state. `resolveHeaderSets` already ran
|
|
107
|
+
// the raw_hash fallback, so this branch only fires when the
|
|
108
|
+
// row has no persistable header set (parse error, or every
|
|
109
|
+
// entry stripped for non-string values).
|
|
110
|
+
headerSetId = null;
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
headerSetId = resolved;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
id: row.id,
|
|
118
|
+
url_id: urlId,
|
|
119
|
+
is_external: row.isExternal == null ? 0 : row.isExternal ? 1 : 0,
|
|
120
|
+
scraped: row.scraped ? 1 : 0,
|
|
121
|
+
is_target: row.isTarget ? 1 : 0,
|
|
122
|
+
status: row.status ?? null,
|
|
123
|
+
status_text: row.statusText ?? null,
|
|
124
|
+
content_type_id: contentTypeId,
|
|
125
|
+
content_length: row.contentLength ?? null,
|
|
126
|
+
header_set_id: headerSetId,
|
|
127
|
+
redirect_dest_id: row.redirectDestId ?? null,
|
|
128
|
+
source: row.source,
|
|
129
|
+
first_crawled_at: row.firstCrawledAt ?? null,
|
|
130
|
+
last_crawled_at: row.lastCrawledAt ?? null,
|
|
131
|
+
crawl_order: row.order ?? null,
|
|
132
|
+
is_skipped: row.isSkipped == null ? null : row.isSkipped ? 1 : 0,
|
|
133
|
+
skip_reason: row.skipReason ?? null,
|
|
134
|
+
};
|
|
135
|
+
});
|
|
136
|
+
for (let index = 0; index < inserts.length; index += INSERT_CHUNK_SIZE) {
|
|
137
|
+
const chunk = inserts.slice(index, index + INSERT_CHUNK_SIZE);
|
|
138
|
+
await trx('content_items').insert(chunk).onConflict('id').ignore();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { ProgressCallback } from '../create-progress-reporter.js';
|
|
2
|
+
import type { PageDomPathResolver } from './populate-image-items.js';
|
|
3
|
+
import type { Knex } from 'knex';
|
|
4
|
+
/**
|
|
5
|
+
* Runs the six 0.13 entity/edge populates (issue #193) in dependency
|
|
6
|
+
* order against an already-connected archive.
|
|
7
|
+
*
|
|
8
|
+
* Order rationale:
|
|
9
|
+
*
|
|
10
|
+
* 1. **`content_items`** — every downstream populate's FKs reference
|
|
11
|
+
* `content_items(id)`. Must land first so the FKs are valid at
|
|
12
|
+
* COMMIT time. `redirect_dest_id` is `DEFERRABLE INITIALLY DEFERRED`
|
|
13
|
+
* (see {@link ../create-entity-tables.ts}) so a redirect
|
|
14
|
+
* source inserted before its destination is validated only at
|
|
15
|
+
* COMMIT — the insert order within this populate is not
|
|
16
|
+
* load-bearing.
|
|
17
|
+
* 2. **`page_meta`** — FK to `content_items(id)`.
|
|
18
|
+
* 3. **`resource_items`** — required before `resource_ref_edges`.
|
|
19
|
+
* 4. **`anchor_edges`** — FKs to `content_items(id)` on both
|
|
20
|
+
* sides.
|
|
21
|
+
* 5. **`resource_ref_edges`** — FKs to `resource_items(id)` and
|
|
22
|
+
* `content_items(id)`.
|
|
23
|
+
* 6. **`image_items`** — FK to `content_items(id)`; the
|
|
24
|
+
* dom-path text_refs upsert is scoped to this populate so re-runs are
|
|
25
|
+
* self-contained.
|
|
26
|
+
*
|
|
27
|
+
* Every sub-populate is independently idempotent via `INSERT OR IGNORE` on
|
|
28
|
+
* its natural key or PK. On a **re-crawl** (`crawl --append` /
|
|
29
|
+
* `--retry-failed` / `--inventory` all UPDATE existing `pages` /
|
|
30
|
+
* `resources` rows in place, and `#insertPage` deletes + re-inserts
|
|
31
|
+
* `anchors` / `images` per page), running populate again against the
|
|
32
|
+
* previously-populated archive would leave `content_items` / `page_meta`
|
|
33
|
+
* / `resource_items` at their FIRST-crawl values (source-priority
|
|
34
|
+
* upgrades, refreshed status, changed metadata never propagate) and
|
|
35
|
+
* `anchor_edges` / `image_items` / `resource_ref_edges` would keep stale
|
|
36
|
+
* rows keyed by the now-deleted legacy ids. To keep the reader-side
|
|
37
|
+
* view of the archive faithful to `pages` / `resources` on re-crawl,
|
|
38
|
+
* every entity + edge table is TRUNCATEd (in child-first order so no FK
|
|
39
|
+
* check trips) at the top of this function before the six sub-populates
|
|
40
|
+
* re-insert from the current legacy state. Ref tables (`url_refs`,
|
|
41
|
+
* `text_refs`, `content_type_refs`, `header_*`) are NOT truncated —
|
|
42
|
+
* they are content-addressable and additive; re-inserting the same
|
|
43
|
+
* value hits `INSERT OR IGNORE` and is a no-op.
|
|
44
|
+
*
|
|
45
|
+
* The whole invocation is expected to run inside one writer transaction
|
|
46
|
+
* with `.bak` protection at the caller level (a single WAL transaction
|
|
47
|
+
* with `.bak` rollback on failure);
|
|
48
|
+
* this function does not open its own transaction so the
|
|
49
|
+
* caller controls the boundary — see {@link
|
|
50
|
+
* ../populate-ref-tables/populate-refs.ts} for the same convention.
|
|
51
|
+
*
|
|
52
|
+
* **`PRAGMA foreign_keys = ON` is REQUIRED** on the underlying
|
|
53
|
+
* connection before this function is called. `content_items.redirect_dest_id`
|
|
54
|
+
* is `DEFERRABLE INITIALLY DEFERRED` (see
|
|
55
|
+
* {@link ../create-entity-tables.ts}); without foreign-key
|
|
56
|
+
* enforcement libsql commits `content_items` rows whose `redirect_dest_id`
|
|
57
|
+
* points at a non-existent page and the deferrable-FK-enforcement-at-COMMIT
|
|
58
|
+
* invariant is silently broken. The
|
|
59
|
+
* migration script sets the pragma explicitly; any other caller must do
|
|
60
|
+
* the same.
|
|
61
|
+
* HTML BLOB reads happen inline inside {@link populateImageItems} against
|
|
62
|
+
* the same `trx` — no `getPageHtml` callback here — because a callback
|
|
63
|
+
* that routed through `Database.getHtmlOfPageById` would re-enter the
|
|
64
|
+
* connection pool from inside this writer transaction and deadlock on
|
|
65
|
+
* libsql's single writer connection. See `./populate-image-items.ts` for
|
|
66
|
+
* the detailed rationale.
|
|
67
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
68
|
+
* @param resolvePageDomPaths - Callback that returns dom_path strings
|
|
69
|
+
* for one page's images. Injected rather than hard-coded so
|
|
70
|
+
* `@nitpicker/archive` does not become a jsdom consumer at runtime.
|
|
71
|
+
* @param onProgress - Optional sink threaded to every sub-populate for
|
|
72
|
+
* periodic progress lines; see {@link ../create-progress-reporter.ts}.
|
|
73
|
+
* @example
|
|
74
|
+
* const archive = await Archive.open(archivePath);
|
|
75
|
+
* const knex = archive.getKnex();
|
|
76
|
+
* await knex.transaction(async (trx) => {
|
|
77
|
+
* await populateEntityTables(trx, jsdomResolver);
|
|
78
|
+
* });
|
|
79
|
+
* await archive.write();
|
|
80
|
+
*/
|
|
81
|
+
export declare function populateEntityTables(trx: Knex, resolvePageDomPaths: PageDomPathResolver, onProgress?: ProgressCallback): Promise<void>;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { populateAnchorEdges } from './populate-anchor-edges.js';
|
|
2
|
+
import { populateContentItems } from './populate-content-items.js';
|
|
3
|
+
import { populateImageItems } from './populate-image-items.js';
|
|
4
|
+
import { populatePageMeta } from './populate-page-meta.js';
|
|
5
|
+
import { populateResourceItems } from './populate-resource-items.js';
|
|
6
|
+
import { populateResourceRefEdges } from './populate-resource-ref-edges.js';
|
|
7
|
+
/**
|
|
8
|
+
* Runs the six 0.13 entity/edge populates (issue #193) in dependency
|
|
9
|
+
* order against an already-connected archive.
|
|
10
|
+
*
|
|
11
|
+
* Order rationale:
|
|
12
|
+
*
|
|
13
|
+
* 1. **`content_items`** — every downstream populate's FKs reference
|
|
14
|
+
* `content_items(id)`. Must land first so the FKs are valid at
|
|
15
|
+
* COMMIT time. `redirect_dest_id` is `DEFERRABLE INITIALLY DEFERRED`
|
|
16
|
+
* (see {@link ../create-entity-tables.ts}) so a redirect
|
|
17
|
+
* source inserted before its destination is validated only at
|
|
18
|
+
* COMMIT — the insert order within this populate is not
|
|
19
|
+
* load-bearing.
|
|
20
|
+
* 2. **`page_meta`** — FK to `content_items(id)`.
|
|
21
|
+
* 3. **`resource_items`** — required before `resource_ref_edges`.
|
|
22
|
+
* 4. **`anchor_edges`** — FKs to `content_items(id)` on both
|
|
23
|
+
* sides.
|
|
24
|
+
* 5. **`resource_ref_edges`** — FKs to `resource_items(id)` and
|
|
25
|
+
* `content_items(id)`.
|
|
26
|
+
* 6. **`image_items`** — FK to `content_items(id)`; the
|
|
27
|
+
* dom-path text_refs upsert is scoped to this populate so re-runs are
|
|
28
|
+
* self-contained.
|
|
29
|
+
*
|
|
30
|
+
* Every sub-populate is independently idempotent via `INSERT OR IGNORE` on
|
|
31
|
+
* its natural key or PK. On a **re-crawl** (`crawl --append` /
|
|
32
|
+
* `--retry-failed` / `--inventory` all UPDATE existing `pages` /
|
|
33
|
+
* `resources` rows in place, and `#insertPage` deletes + re-inserts
|
|
34
|
+
* `anchors` / `images` per page), running populate again against the
|
|
35
|
+
* previously-populated archive would leave `content_items` / `page_meta`
|
|
36
|
+
* / `resource_items` at their FIRST-crawl values (source-priority
|
|
37
|
+
* upgrades, refreshed status, changed metadata never propagate) and
|
|
38
|
+
* `anchor_edges` / `image_items` / `resource_ref_edges` would keep stale
|
|
39
|
+
* rows keyed by the now-deleted legacy ids. To keep the reader-side
|
|
40
|
+
* view of the archive faithful to `pages` / `resources` on re-crawl,
|
|
41
|
+
* every entity + edge table is TRUNCATEd (in child-first order so no FK
|
|
42
|
+
* check trips) at the top of this function before the six sub-populates
|
|
43
|
+
* re-insert from the current legacy state. Ref tables (`url_refs`,
|
|
44
|
+
* `text_refs`, `content_type_refs`, `header_*`) are NOT truncated —
|
|
45
|
+
* they are content-addressable and additive; re-inserting the same
|
|
46
|
+
* value hits `INSERT OR IGNORE` and is a no-op.
|
|
47
|
+
*
|
|
48
|
+
* The whole invocation is expected to run inside one writer transaction
|
|
49
|
+
* with `.bak` protection at the caller level (a single WAL transaction
|
|
50
|
+
* with `.bak` rollback on failure);
|
|
51
|
+
* this function does not open its own transaction so the
|
|
52
|
+
* caller controls the boundary — see {@link
|
|
53
|
+
* ../populate-ref-tables/populate-refs.ts} for the same convention.
|
|
54
|
+
*
|
|
55
|
+
* **`PRAGMA foreign_keys = ON` is REQUIRED** on the underlying
|
|
56
|
+
* connection before this function is called. `content_items.redirect_dest_id`
|
|
57
|
+
* is `DEFERRABLE INITIALLY DEFERRED` (see
|
|
58
|
+
* {@link ../create-entity-tables.ts}); without foreign-key
|
|
59
|
+
* enforcement libsql commits `content_items` rows whose `redirect_dest_id`
|
|
60
|
+
* points at a non-existent page and the deferrable-FK-enforcement-at-COMMIT
|
|
61
|
+
* invariant is silently broken. The
|
|
62
|
+
* migration script sets the pragma explicitly; any other caller must do
|
|
63
|
+
* the same.
|
|
64
|
+
* HTML BLOB reads happen inline inside {@link populateImageItems} against
|
|
65
|
+
* the same `trx` — no `getPageHtml` callback here — because a callback
|
|
66
|
+
* that routed through `Database.getHtmlOfPageById` would re-enter the
|
|
67
|
+
* connection pool from inside this writer transaction and deadlock on
|
|
68
|
+
* libsql's single writer connection. See `./populate-image-items.ts` for
|
|
69
|
+
* the detailed rationale.
|
|
70
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
71
|
+
* @param resolvePageDomPaths - Callback that returns dom_path strings
|
|
72
|
+
* for one page's images. Injected rather than hard-coded so
|
|
73
|
+
* `@nitpicker/archive` does not become a jsdom consumer at runtime.
|
|
74
|
+
* @param onProgress - Optional sink threaded to every sub-populate for
|
|
75
|
+
* periodic progress lines; see {@link ../create-progress-reporter.ts}.
|
|
76
|
+
* @example
|
|
77
|
+
* const archive = await Archive.open(archivePath);
|
|
78
|
+
* const knex = archive.getKnex();
|
|
79
|
+
* await knex.transaction(async (trx) => {
|
|
80
|
+
* await populateEntityTables(trx, jsdomResolver);
|
|
81
|
+
* });
|
|
82
|
+
* await archive.write();
|
|
83
|
+
*/
|
|
84
|
+
export async function populateEntityTables(trx, resolvePageDomPaths, onProgress) {
|
|
85
|
+
// Truncate child-first so no outgoing FK check ever sees a broken
|
|
86
|
+
// reference mid-delete. Order is: leaf edge/entity tables that have
|
|
87
|
+
// no incoming FKs (`image_items`, `anchor_edges`, `resource_ref_edges`),
|
|
88
|
+
// then the parent entities they referenced (`page_meta` and
|
|
89
|
+
// `resource_items`; `page_meta` references `content_items` so it
|
|
90
|
+
// must be dropped before `content_items`; `resource_items` was
|
|
91
|
+
// pointed at by `resource_ref_edges` which is now empty), and
|
|
92
|
+
// finally `content_items` itself — the only remaining incoming
|
|
93
|
+
// reference is its own DEFERRABLE INITIALLY DEFERRED
|
|
94
|
+
// `redirect_dest_id`, which is validated at COMMIT so a mid-trx
|
|
95
|
+
// wipe-and-refill is legal. No external table has an enforced FK
|
|
96
|
+
// into `content_items` (viewer read-model tables
|
|
97
|
+
// hold logical-only pointers), so the truncation stops here.
|
|
98
|
+
await trx('image_items').delete();
|
|
99
|
+
await trx('anchor_edges').delete();
|
|
100
|
+
await trx('resource_ref_edges').delete();
|
|
101
|
+
await trx('page_meta').delete();
|
|
102
|
+
await trx('resource_items').delete();
|
|
103
|
+
await trx('content_items').delete();
|
|
104
|
+
await populateContentItems(trx, onProgress);
|
|
105
|
+
await populatePageMeta(trx, onProgress);
|
|
106
|
+
await populateResourceItems(trx, onProgress);
|
|
107
|
+
await populateAnchorEdges(trx, onProgress);
|
|
108
|
+
await populateResourceRefEdges(trx);
|
|
109
|
+
await populateImageItems(trx, resolvePageDomPaths, onProgress);
|
|
110
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { ProgressCallback } from '../create-progress-reporter.js';
|
|
2
|
+
import type { DomPathResult } from './types.js';
|
|
3
|
+
import type { Knex } from 'knex';
|
|
4
|
+
/**
|
|
5
|
+
* Callback that resolves DOM-path strings for one page's images. The
|
|
6
|
+
* callback receives the page's HTML string (or `null` when no snapshot
|
|
7
|
+
* is stored) plus the page's `images` rows, and must return one
|
|
8
|
+
* {@link DomPathResult} per row.
|
|
9
|
+
*
|
|
10
|
+
* Injected rather than hard-coded so `@nitpicker/archive` does not
|
|
11
|
+
* become a jsdom consumer at runtime — the migration script
|
|
12
|
+
* (`scripts/migrate-to-0.13.mjs`) wires a jsdom-backed
|
|
13
|
+
* implementation, while unit tests inject stubs. A future crawler-time
|
|
14
|
+
* DOM-path capture can use the same signature with
|
|
15
|
+
* puppeteer-backed elements.
|
|
16
|
+
*/
|
|
17
|
+
export type PageDomPathResolver = (pageId: number, htmlString: string | null, images: readonly ImageRowForResolver[]) => Promise<ReadonlyMap<number, DomPathResult>>;
|
|
18
|
+
/**
|
|
19
|
+
* The projection of `images` rows passed to a
|
|
20
|
+
* {@link PageDomPathResolver}. Kept as a narrow shape (only the fields
|
|
21
|
+
* the resolver needs) so callers of the resolver do not depend on the
|
|
22
|
+
* full row width.
|
|
23
|
+
*/
|
|
24
|
+
export interface ImageRowForResolver {
|
|
25
|
+
/** Legacy `images.id`. */
|
|
26
|
+
id: number;
|
|
27
|
+
/** Legacy `images.sourceCode`. */
|
|
28
|
+
sourceCode: string | null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Populates `image_items` from `images` (issue #193).
|
|
32
|
+
*
|
|
33
|
+
* The outer loop iterates **pages**, not images. Each page's images are
|
|
34
|
+
* processed as one whole unit — dom-path derivation, HTML BLOB fetch,
|
|
35
|
+
* and ref lookups all happen once per page. This design closes three
|
|
36
|
+
* separate correctness / efficiency traps that a purely image-chunked
|
|
37
|
+
* loop would expose:
|
|
38
|
+
*
|
|
39
|
+
* 1. **Ordinal-cursor bleed across chunks** — `matchImagesToDomPaths`
|
|
40
|
+
* tracks per-outerHTML cursor state, so a page with 1 000 identical
|
|
41
|
+
* `<img>` tags spanning two image-chunks would reset the cursor at
|
|
42
|
+
* the boundary and duplicate dom_paths already assigned in the
|
|
43
|
+
* previous chunk. Iterating by page keeps every page's cursor state
|
|
44
|
+
* self-contained.
|
|
45
|
+
* 2. **Repeated `getPageHtml` + jsdom parse** — a page whose images
|
|
46
|
+
* straddle N image-chunks would fetch and re-parse the same multi-MB
|
|
47
|
+
* HTML snapshot N times. Iterating by page makes this exactly once
|
|
48
|
+
* per page.
|
|
49
|
+
* 3. **Data-URI routing gap** — legacy `images.src` can be either a
|
|
50
|
+
* plain URL (goes to `url_refs`) or a large `data:` URI (goes to
|
|
51
|
+
* `blob_refs`, per the 512-byte threshold). The lookups partition
|
|
52
|
+
* by that rule, so a data URI is never bound into
|
|
53
|
+
* `resolveUrlRefs`' `WHERE url IN (?)` — which could otherwise
|
|
54
|
+
* exceed SQLite's `SQLITE_MAX_SQL_LENGTH` for multi-KB URIs.
|
|
55
|
+
*
|
|
56
|
+
* Per outer iteration:
|
|
57
|
+
*
|
|
58
|
+
* 1. **Keyset-paginate** distinct `pageId` values from `images`. Peak
|
|
59
|
+
* memory ≈ 500 integers.
|
|
60
|
+
* 2. **Fetch all images** for those page ids in one query, ordered by
|
|
61
|
+
* `(pageId, id)` so JS-side grouping is a linear pass.
|
|
62
|
+
* 3. **Resolve dom paths per page** — one `getPageHtml` + one resolver
|
|
63
|
+
* call each. `dom_path` texts are collected across the whole batch
|
|
64
|
+
* so `upsertTextRefs` runs once per batch.
|
|
65
|
+
* 4. **Partition src / currentSrc** by the data-URI routing rule and
|
|
66
|
+
* batch-resolve url refs, blob refs, and alt text refs across the
|
|
67
|
+
* whole batch.
|
|
68
|
+
* 5. **Bulk INSERT** with explicit `id = images.id`.
|
|
69
|
+
*
|
|
70
|
+
* `INSERT OR IGNORE` on the natural PK makes the step idempotent.
|
|
71
|
+
*
|
|
72
|
+
* HTML BLOBs are read inline via the same `trx` handle rather than
|
|
73
|
+
* through a caller-supplied `getPageHtml` callback: a callback that
|
|
74
|
+
* queried `Database.getHtmlOfPageById` (which uses the non-transactional
|
|
75
|
+
* Knex instance) would re-enter the pool from inside this writer
|
|
76
|
+
* transaction and deadlock on libsql's single writer connection. Reading
|
|
77
|
+
* `page_html_ref` + `page_html_blobs` via `trx` keeps every read on the
|
|
78
|
+
* same connection the outer trx already owns.
|
|
79
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
80
|
+
* @param resolvePageDomPaths - Callback that returns dom_path strings
|
|
81
|
+
* for one page's images (see {@link PageDomPathResolver}).
|
|
82
|
+
* @param onProgress - Optional sink for periodic progress lines (one per
|
|
83
|
+
* ~5% of distinct `images.pageId` values scanned); see
|
|
84
|
+
* {@link ../create-progress-reporter.ts}.
|
|
85
|
+
* @example
|
|
86
|
+
* const jsdomResolver = createJsdomResolver();
|
|
87
|
+
* await knex.transaction(async (trx) => {
|
|
88
|
+
* await populateImageItems(trx, jsdomResolver);
|
|
89
|
+
* });
|
|
90
|
+
*/
|
|
91
|
+
export declare function populateImageItems(trx: Knex, resolvePageDomPaths: PageDomPathResolver, onProgress?: ProgressCallback): Promise<void>;
|