@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,226 @@
|
|
|
1
|
+
import { createProgressReporter } from '../create-progress-reporter.js';
|
|
2
|
+
import { decodePageHtmlBlobBytes } from '../decode-page-html-blob-bytes.js';
|
|
3
|
+
import { isBlobRefValue } from './is-blob-ref-value.js';
|
|
4
|
+
import { resolveBlobRefs } from './resolve-blob-refs.js';
|
|
5
|
+
import { resolveTextRefs } from './resolve-text-refs.js';
|
|
6
|
+
import { resolveUrlOrBlobFromMaps } from './resolve-url-or-blob-from-maps.js';
|
|
7
|
+
import { resolveUrlRefs } from './resolve-url-refs.js';
|
|
8
|
+
import { upsertTextRefs } from './upsert-text-refs.js';
|
|
9
|
+
/**
|
|
10
|
+
* Page ids scanned per keyset-paginated `SELECT DISTINCT pageId` chunk.
|
|
11
|
+
* Batches the outer loop so 470 K pages worth of `images` rows are
|
|
12
|
+
* traversed in ~1 K round trips instead of one round-trip per page,
|
|
13
|
+
* without holding the entire distinct-pageId list in memory at once.
|
|
14
|
+
*/
|
|
15
|
+
const PAGE_ID_CHUNK_SIZE = 500;
|
|
16
|
+
/**
|
|
17
|
+
* Rows sent per `INSERT INTO image_items ... VALUES (...)` statement.
|
|
18
|
+
* Each row binds 13 params, so 300 rows = 3 900 params — safely under
|
|
19
|
+
* the SQLite variable limit.
|
|
20
|
+
*/
|
|
21
|
+
const INSERT_CHUNK_SIZE = 300;
|
|
22
|
+
/**
|
|
23
|
+
* Populates `image_items` from `images` (issue #193).
|
|
24
|
+
*
|
|
25
|
+
* The outer loop iterates **pages**, not images. Each page's images are
|
|
26
|
+
* processed as one whole unit — dom-path derivation, HTML BLOB fetch,
|
|
27
|
+
* and ref lookups all happen once per page. This design closes three
|
|
28
|
+
* separate correctness / efficiency traps that a purely image-chunked
|
|
29
|
+
* loop would expose:
|
|
30
|
+
*
|
|
31
|
+
* 1. **Ordinal-cursor bleed across chunks** — `matchImagesToDomPaths`
|
|
32
|
+
* tracks per-outerHTML cursor state, so a page with 1 000 identical
|
|
33
|
+
* `<img>` tags spanning two image-chunks would reset the cursor at
|
|
34
|
+
* the boundary and duplicate dom_paths already assigned in the
|
|
35
|
+
* previous chunk. Iterating by page keeps every page's cursor state
|
|
36
|
+
* self-contained.
|
|
37
|
+
* 2. **Repeated `getPageHtml` + jsdom parse** — a page whose images
|
|
38
|
+
* straddle N image-chunks would fetch and re-parse the same multi-MB
|
|
39
|
+
* HTML snapshot N times. Iterating by page makes this exactly once
|
|
40
|
+
* per page.
|
|
41
|
+
* 3. **Data-URI routing gap** — legacy `images.src` can be either a
|
|
42
|
+
* plain URL (goes to `url_refs`) or a large `data:` URI (goes to
|
|
43
|
+
* `blob_refs`, per the 512-byte threshold). The lookups partition
|
|
44
|
+
* by that rule, so a data URI is never bound into
|
|
45
|
+
* `resolveUrlRefs`' `WHERE url IN (?)` — which could otherwise
|
|
46
|
+
* exceed SQLite's `SQLITE_MAX_SQL_LENGTH` for multi-KB URIs.
|
|
47
|
+
*
|
|
48
|
+
* Per outer iteration:
|
|
49
|
+
*
|
|
50
|
+
* 1. **Keyset-paginate** distinct `pageId` values from `images`. Peak
|
|
51
|
+
* memory ≈ 500 integers.
|
|
52
|
+
* 2. **Fetch all images** for those page ids in one query, ordered by
|
|
53
|
+
* `(pageId, id)` so JS-side grouping is a linear pass.
|
|
54
|
+
* 3. **Resolve dom paths per page** — one `getPageHtml` + one resolver
|
|
55
|
+
* call each. `dom_path` texts are collected across the whole batch
|
|
56
|
+
* so `upsertTextRefs` runs once per batch.
|
|
57
|
+
* 4. **Partition src / currentSrc** by the data-URI routing rule and
|
|
58
|
+
* batch-resolve url refs, blob refs, and alt text refs across the
|
|
59
|
+
* whole batch.
|
|
60
|
+
* 5. **Bulk INSERT** with explicit `id = images.id`.
|
|
61
|
+
*
|
|
62
|
+
* `INSERT OR IGNORE` on the natural PK makes the step idempotent.
|
|
63
|
+
*
|
|
64
|
+
* HTML BLOBs are read inline via the same `trx` handle rather than
|
|
65
|
+
* through a caller-supplied `getPageHtml` callback: a callback that
|
|
66
|
+
* queried `Database.getHtmlOfPageById` (which uses the non-transactional
|
|
67
|
+
* Knex instance) would re-enter the pool from inside this writer
|
|
68
|
+
* transaction and deadlock on libsql's single writer connection. Reading
|
|
69
|
+
* `page_html_ref` + `page_html_blobs` via `trx` keeps every read on the
|
|
70
|
+
* same connection the outer trx already owns.
|
|
71
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
72
|
+
* @param resolvePageDomPaths - Callback that returns dom_path strings
|
|
73
|
+
* for one page's images (see {@link PageDomPathResolver}).
|
|
74
|
+
* @param onProgress - Optional sink for periodic progress lines (one per
|
|
75
|
+
* ~5% of distinct `images.pageId` values scanned); see
|
|
76
|
+
* {@link ../create-progress-reporter.ts}.
|
|
77
|
+
* @example
|
|
78
|
+
* const jsdomResolver = createJsdomResolver();
|
|
79
|
+
* await knex.transaction(async (trx) => {
|
|
80
|
+
* await populateImageItems(trx, jsdomResolver);
|
|
81
|
+
* });
|
|
82
|
+
*/
|
|
83
|
+
export async function populateImageItems(trx, resolvePageDomPaths, onProgress) {
|
|
84
|
+
const countRows = await trx('images').countDistinct({ n: 'pageId' });
|
|
85
|
+
const totalRow = countRows[0];
|
|
86
|
+
const total = Number(totalRow?.n ?? 0);
|
|
87
|
+
const report = createProgressReporter('image_items (distinct pages)', total, onProgress);
|
|
88
|
+
let processedPages = 0;
|
|
89
|
+
let cursorPageId = 0;
|
|
90
|
+
while (true) {
|
|
91
|
+
const pageIdRows = await trx('images')
|
|
92
|
+
.distinct('pageId')
|
|
93
|
+
.where('pageId', '>', cursorPageId)
|
|
94
|
+
.orderBy('pageId', 'asc')
|
|
95
|
+
.limit(PAGE_ID_CHUNK_SIZE);
|
|
96
|
+
if (pageIdRows.length === 0) {
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
const pageIds = pageIdRows.map((r) => r.pageId);
|
|
100
|
+
cursorPageId = pageIds.at(-1);
|
|
101
|
+
processedPages += pageIds.length;
|
|
102
|
+
report(processedPages);
|
|
103
|
+
const rows = await trx('images')
|
|
104
|
+
.select('id', 'pageId', 'src', 'currentSrc', 'alt', 'width', 'height', 'naturalWidth', 'naturalHeight', 'isLazy', 'viewportWidth', 'sourceCode')
|
|
105
|
+
.whereIn('pageId', pageIds)
|
|
106
|
+
.orderBy([
|
|
107
|
+
{ column: 'pageId', order: 'asc' },
|
|
108
|
+
{ column: 'id', order: 'asc' },
|
|
109
|
+
]);
|
|
110
|
+
if (rows.length === 0) {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const byPage = new Map();
|
|
114
|
+
for (const row of rows) {
|
|
115
|
+
const bucket = byPage.get(row.pageId);
|
|
116
|
+
if (bucket === undefined) {
|
|
117
|
+
byPage.set(row.pageId, [row]);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
bucket.push(row);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const domPaths = new Map();
|
|
124
|
+
for (const [pageId, pageImages] of byPage) {
|
|
125
|
+
const html = await readPageHtmlInTrx(trx, pageId);
|
|
126
|
+
const resolved = await resolvePageDomPaths(pageId, html, pageImages);
|
|
127
|
+
for (const [imageId, entry] of resolved) {
|
|
128
|
+
domPaths.set(imageId, entry);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const urls = new Set();
|
|
132
|
+
const dataUris = new Set();
|
|
133
|
+
const alts = new Set();
|
|
134
|
+
const domPathTexts = new Set();
|
|
135
|
+
for (const row of rows) {
|
|
136
|
+
for (const value of [row.src, row.currentSrc]) {
|
|
137
|
+
if (typeof value !== 'string' || value === '') {
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (isBlobRefValue(value)) {
|
|
141
|
+
dataUris.add(value);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
urls.add(value);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (typeof row.alt === 'string' && row.alt !== '') {
|
|
148
|
+
alts.add(row.alt);
|
|
149
|
+
}
|
|
150
|
+
const domPath = domPaths.get(row.id);
|
|
151
|
+
if (domPath !== undefined) {
|
|
152
|
+
domPathTexts.add(domPath.path);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const urlIds = await resolveUrlRefs(trx, urls);
|
|
156
|
+
const blobIds = await resolveBlobRefs(trx, dataUris);
|
|
157
|
+
const altIds = await resolveTextRefs(trx, alts);
|
|
158
|
+
// `dom_path` strings are synthesised right here and were not
|
|
159
|
+
// among the columns the `text_refs` populate scanned
|
|
160
|
+
// (`populate-ref-tables/populate-text-refs.ts`) — insert every distinct
|
|
161
|
+
// derived path (including `unknown/<id>` fallbacks) before
|
|
162
|
+
// resolving its id. The upsert is idempotent so re-runs across
|
|
163
|
+
// partial failures do not duplicate rows.
|
|
164
|
+
const domPathIds = await upsertTextRefs(trx, domPathTexts);
|
|
165
|
+
const inserts = [];
|
|
166
|
+
for (const row of rows) {
|
|
167
|
+
const domPath = domPaths.get(row.id);
|
|
168
|
+
if (domPath === undefined) {
|
|
169
|
+
throw new Error(`populateImageItems: dom_path not resolved for image id=${row.id}`);
|
|
170
|
+
}
|
|
171
|
+
const domPathId = domPathIds.get(domPath.path);
|
|
172
|
+
if (domPathId === undefined) {
|
|
173
|
+
throw new Error(`populateImageItems: text_refs.id not resolved for dom_path=${domPath.path} — the upsertTextRefs above must have inserted it`);
|
|
174
|
+
}
|
|
175
|
+
const srcSlot = resolveUrlOrBlobFromMaps(row.src, urlIds, blobIds);
|
|
176
|
+
const currentSrcSlot = resolveUrlOrBlobFromMaps(row.currentSrc, urlIds, blobIds);
|
|
177
|
+
inserts.push({
|
|
178
|
+
id: row.id,
|
|
179
|
+
page_id: row.pageId,
|
|
180
|
+
src_url_id: srcSlot.url,
|
|
181
|
+
current_src_url_id: currentSrcSlot.url,
|
|
182
|
+
src_blob_id: srcSlot.blob,
|
|
183
|
+
current_src_blob_id: currentSrcSlot.blob,
|
|
184
|
+
alt_text_id: typeof row.alt === 'string' && row.alt !== ''
|
|
185
|
+
? (altIds.get(row.alt) ?? null)
|
|
186
|
+
: null,
|
|
187
|
+
width: row.width,
|
|
188
|
+
height: row.height,
|
|
189
|
+
natural_width: row.naturalWidth,
|
|
190
|
+
natural_height: row.naturalHeight,
|
|
191
|
+
is_lazy: row.isLazy == null ? null : row.isLazy ? 1 : 0,
|
|
192
|
+
viewport_width: row.viewportWidth,
|
|
193
|
+
dom_path_text_id: domPathId,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
for (let index = 0; index < inserts.length; index += INSERT_CHUNK_SIZE) {
|
|
197
|
+
const chunk = inserts.slice(index, index + INSERT_CHUNK_SIZE);
|
|
198
|
+
await trx('image_items').insert(chunk).onConflict('id').ignore();
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Reads the stored HTML snapshot for one legacy page id, via the same
|
|
204
|
+
* `trx` handle that the outer populate transaction owns. Mirrors
|
|
205
|
+
* `Database.getHtmlOfPageById` but keeps every read on the trx
|
|
206
|
+
* connection so the populate does not re-enter the pool from
|
|
207
|
+
* inside its own writer transaction (see {@link populateImageItems}'s
|
|
208
|
+
* doc for the deadlock this avoids).
|
|
209
|
+
* @param trx - The open migration transaction.
|
|
210
|
+
* @param pageId - `pages.id` (== `content_items.id`) to read HTML for.
|
|
211
|
+
* @returns Decoded HTML string, or `null` when no snapshot is stored.
|
|
212
|
+
* @throws {Error} Naming the page and the blob hash when the snapshot is
|
|
213
|
+
* corrupt or decompresses past `MAX_DECODED_SNAPSHOT_BYTES`; the migration
|
|
214
|
+
* fails rather than resolving the page's images without its HTML.
|
|
215
|
+
*/
|
|
216
|
+
async function readPageHtmlInTrx(trx, pageId) {
|
|
217
|
+
const row = (await trx('page_html_ref')
|
|
218
|
+
.join('page_html_blobs', 'page_html_ref.hash', '=', 'page_html_blobs.hash')
|
|
219
|
+
.select('page_html_blobs.hash as hash', 'page_html_blobs.body as body', 'page_html_blobs.codec as codec')
|
|
220
|
+
.where('page_html_ref.page_id', pageId)
|
|
221
|
+
.first());
|
|
222
|
+
if (!row) {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
return decodePageHtmlBlobBytes({ pageId, ...row }).toString('utf8');
|
|
226
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ProgressCallback } from '../create-progress-reporter.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Populates `page_meta` from `pages WHERE scraped = 1` (issue #193).
|
|
5
|
+
*
|
|
6
|
+
* Pages that were never scraped contribute no meta rows — they have no rendered title,
|
|
7
|
+
* description, or JSON-LD to preserve, so filtering at the SELECT keeps
|
|
8
|
+
* the reader working set narrow and matches the migration acceptance check
|
|
9
|
+
* `count(*) FROM page_meta = count(*) FROM pages WHERE scraped = 1`.
|
|
10
|
+
*
|
|
11
|
+
* Per chunk:
|
|
12
|
+
*
|
|
13
|
+
* 1. **Keyset-paginate** `pages.id > cursor AND scraped = 1`.
|
|
14
|
+
* 2. **Batch-resolve** all text / URL / JSON ref ids for every value in
|
|
15
|
+
* the chunk — three resolvers, one round-trip per ref table.
|
|
16
|
+
* 3. **Bulk INSERT** with `page_id = pages.id`. `page_id` is both PK and
|
|
17
|
+
* FK on `content_items(id)`; `populateContentItems` must have already
|
|
18
|
+
* inserted the corresponding `content_items` row for the FK to be
|
|
19
|
+
* valid at COMMIT time.
|
|
20
|
+
*
|
|
21
|
+
* `INSERT OR IGNORE` on the `page_id` PK makes the step idempotent so
|
|
22
|
+
* partial-failure re-runs are safe.
|
|
23
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
24
|
+
* @param onProgress - Optional sink for periodic progress lines (one per
|
|
25
|
+
* ~5% of `pages WHERE scraped = 1` scanned); see
|
|
26
|
+
* {@link ../create-progress-reporter.ts}.
|
|
27
|
+
* @example
|
|
28
|
+
* await knex.transaction(async (trx) => {
|
|
29
|
+
* await populateContentItems(trx);
|
|
30
|
+
* await populatePageMeta(trx);
|
|
31
|
+
* });
|
|
32
|
+
*/
|
|
33
|
+
export declare function populatePageMeta(trx: Knex, onProgress?: ProgressCallback): Promise<void>;
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { createProgressReporter } from '../create-progress-reporter.js';
|
|
2
|
+
import { PAGE_META_COLUMN_MAPS } from '../page-meta-column-maps.js';
|
|
3
|
+
import { DATA_URI_URL_REFS_LIMIT } from '../populate-ref-tables/data-uri-url-refs-limit.js';
|
|
4
|
+
import { resolveJsonRefs } from './resolve-json-refs.js';
|
|
5
|
+
import { resolveTextRefs } from './resolve-text-refs.js';
|
|
6
|
+
import { resolveUrlRefs } from './resolve-url-refs.js';
|
|
7
|
+
/**
|
|
8
|
+
* Rows scanned per keyset-paginated `SELECT` chunk against
|
|
9
|
+
* `pages WHERE scraped = 1`. The row width here is dominated by long
|
|
10
|
+
* text columns (`meta_extras` JSON, `description`, `twitter_description`)
|
|
11
|
+
* so 400 rows caps peak chunk memory at ≈ 40 MB on the reference
|
|
12
|
+
* archive.
|
|
13
|
+
*/
|
|
14
|
+
const READ_CHUNK_SIZE = 400;
|
|
15
|
+
/**
|
|
16
|
+
* Rows sent per `INSERT INTO page_meta ... VALUES (...)` statement. Each
|
|
17
|
+
* row binds 47 params (see the column list below), so 200 rows =
|
|
18
|
+
* 9 400 params — safely under SQLite's default variable limit.
|
|
19
|
+
*/
|
|
20
|
+
const INSERT_CHUNK_SIZE = 200;
|
|
21
|
+
/**
|
|
22
|
+
* Populates `page_meta` from `pages WHERE scraped = 1` (issue #193).
|
|
23
|
+
*
|
|
24
|
+
* Pages that were never scraped contribute no meta rows — they have no rendered title,
|
|
25
|
+
* description, or JSON-LD to preserve, so filtering at the SELECT keeps
|
|
26
|
+
* the reader working set narrow and matches the migration acceptance check
|
|
27
|
+
* `count(*) FROM page_meta = count(*) FROM pages WHERE scraped = 1`.
|
|
28
|
+
*
|
|
29
|
+
* Per chunk:
|
|
30
|
+
*
|
|
31
|
+
* 1. **Keyset-paginate** `pages.id > cursor AND scraped = 1`.
|
|
32
|
+
* 2. **Batch-resolve** all text / URL / JSON ref ids for every value in
|
|
33
|
+
* the chunk — three resolvers, one round-trip per ref table.
|
|
34
|
+
* 3. **Bulk INSERT** with `page_id = pages.id`. `page_id` is both PK and
|
|
35
|
+
* FK on `content_items(id)`; `populateContentItems` must have already
|
|
36
|
+
* inserted the corresponding `content_items` row for the FK to be
|
|
37
|
+
* valid at COMMIT time.
|
|
38
|
+
*
|
|
39
|
+
* `INSERT OR IGNORE` on the `page_id` PK makes the step idempotent so
|
|
40
|
+
* partial-failure re-runs are safe.
|
|
41
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
42
|
+
* @param onProgress - Optional sink for periodic progress lines (one per
|
|
43
|
+
* ~5% of `pages WHERE scraped = 1` scanned); see
|
|
44
|
+
* {@link ../create-progress-reporter.ts}.
|
|
45
|
+
* @example
|
|
46
|
+
* await knex.transaction(async (trx) => {
|
|
47
|
+
* await populateContentItems(trx);
|
|
48
|
+
* await populatePageMeta(trx);
|
|
49
|
+
* });
|
|
50
|
+
*/
|
|
51
|
+
export async function populatePageMeta(trx, onProgress) {
|
|
52
|
+
const textColumns = PAGE_META_COLUMN_MAPS.text.map((entry) => entry.source);
|
|
53
|
+
const urlColumns = PAGE_META_COLUMN_MAPS.url.map((entry) => entry.source);
|
|
54
|
+
const plainColumns = [
|
|
55
|
+
'id',
|
|
56
|
+
'lang',
|
|
57
|
+
'dir',
|
|
58
|
+
'charset',
|
|
59
|
+
'baseHref',
|
|
60
|
+
'viewport_raw',
|
|
61
|
+
'themeColor',
|
|
62
|
+
'applicationName',
|
|
63
|
+
'author',
|
|
64
|
+
'generator',
|
|
65
|
+
'publisher',
|
|
66
|
+
'robots_noindex',
|
|
67
|
+
'robots_nofollow',
|
|
68
|
+
'robots_noarchive',
|
|
69
|
+
'robots_noimageindex',
|
|
70
|
+
'googlebot',
|
|
71
|
+
'og_type',
|
|
72
|
+
'og_site_name',
|
|
73
|
+
'og_image_alt',
|
|
74
|
+
'og_image_width',
|
|
75
|
+
'og_image_height',
|
|
76
|
+
'og_locale',
|
|
77
|
+
'og_article_published_time',
|
|
78
|
+
'og_article_modified_time',
|
|
79
|
+
'twitter_card',
|
|
80
|
+
'twitter_site',
|
|
81
|
+
'twitter_creator',
|
|
82
|
+
'fb_app_id',
|
|
83
|
+
'verification_google',
|
|
84
|
+
'formatDetection_telephone',
|
|
85
|
+
'tag_count',
|
|
86
|
+
'jsonld_count',
|
|
87
|
+
'tags_providers_csv',
|
|
88
|
+
'meta_extras',
|
|
89
|
+
];
|
|
90
|
+
const countRows = await trx('pages').where('scraped', true).count({ n: '*' });
|
|
91
|
+
const total = Number(countRows[0]?.n ?? 0);
|
|
92
|
+
const report = createProgressReporter('page_meta (pages)', total, onProgress);
|
|
93
|
+
let processed = 0;
|
|
94
|
+
let cursor = 0;
|
|
95
|
+
while (true) {
|
|
96
|
+
const rows = await trx('pages')
|
|
97
|
+
.select(...plainColumns, ...textColumns, ...urlColumns)
|
|
98
|
+
.where('id', '>', cursor)
|
|
99
|
+
.andWhere('scraped', true)
|
|
100
|
+
.orderBy('id', 'asc')
|
|
101
|
+
.limit(READ_CHUNK_SIZE);
|
|
102
|
+
if (rows.length === 0) {
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
cursor = rows.at(-1).id;
|
|
106
|
+
processed += rows.length;
|
|
107
|
+
report(processed);
|
|
108
|
+
const texts = new Set();
|
|
109
|
+
const urls = new Set();
|
|
110
|
+
const jsonStrings = new Set();
|
|
111
|
+
for (const row of rows) {
|
|
112
|
+
for (const column of textColumns) {
|
|
113
|
+
const value = row[column];
|
|
114
|
+
if (typeof value === 'string' && value !== '') {
|
|
115
|
+
texts.add(value);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
for (const column of urlColumns) {
|
|
119
|
+
const value = row[column];
|
|
120
|
+
if (typeof value === 'string' && value !== '' && !isLargeDataUri(value)) {
|
|
121
|
+
urls.add(value);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const metaExtras = row.meta_extras;
|
|
125
|
+
if (typeof metaExtras === 'string' && metaExtras !== '') {
|
|
126
|
+
jsonStrings.add(metaExtras);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
const textIds = await resolveTextRefs(trx, texts);
|
|
130
|
+
const urlIds = await resolveUrlRefs(trx, urls);
|
|
131
|
+
const jsonIds = await resolveJsonRefs(trx, jsonStrings);
|
|
132
|
+
const inserts = rows.map((row) => {
|
|
133
|
+
const rowId = row.id;
|
|
134
|
+
const insert = {
|
|
135
|
+
page_id: rowId,
|
|
136
|
+
lang: row.lang ?? null,
|
|
137
|
+
dir: row.dir ?? null,
|
|
138
|
+
charset: row.charset ?? null,
|
|
139
|
+
base_href: row.baseHref ?? null,
|
|
140
|
+
viewport_raw: row.viewport_raw ?? null,
|
|
141
|
+
theme_color: row.themeColor ?? null,
|
|
142
|
+
application_name: row.applicationName ?? null,
|
|
143
|
+
author: row.author ?? null,
|
|
144
|
+
generator: row.generator ?? null,
|
|
145
|
+
publisher: row.publisher ?? null,
|
|
146
|
+
robots_noindex: row.robots_noindex ?? null,
|
|
147
|
+
robots_nofollow: row.robots_nofollow ?? null,
|
|
148
|
+
robots_noarchive: row.robots_noarchive ?? null,
|
|
149
|
+
robots_noimageindex: row.robots_noimageindex ?? null,
|
|
150
|
+
googlebot: row.googlebot ?? null,
|
|
151
|
+
og_type: row.og_type ?? null,
|
|
152
|
+
og_site_name: row.og_site_name ?? null,
|
|
153
|
+
og_image_alt: row.og_image_alt ?? null,
|
|
154
|
+
og_image_width: row.og_image_width ?? null,
|
|
155
|
+
og_image_height: row.og_image_height ?? null,
|
|
156
|
+
og_locale: row.og_locale ?? null,
|
|
157
|
+
og_article_published_time: row.og_article_published_time ?? null,
|
|
158
|
+
og_article_modified_time: row.og_article_modified_time ?? null,
|
|
159
|
+
twitter_card: row.twitter_card ?? null,
|
|
160
|
+
twitter_site: row.twitter_site ?? null,
|
|
161
|
+
twitter_creator: row.twitter_creator ?? null,
|
|
162
|
+
fb_app_id: row.fb_app_id ?? null,
|
|
163
|
+
verification_google: row.verification_google ?? null,
|
|
164
|
+
format_detection_telephone: row.formatDetection_telephone ?? null,
|
|
165
|
+
tag_count: row.tag_count ?? null,
|
|
166
|
+
jsonld_count: row.jsonld_count ?? null,
|
|
167
|
+
tags_providers_csv: row.tags_providers_csv ?? null,
|
|
168
|
+
meta_extras_json_id: resolveOptionalJsonId(row.meta_extras, jsonIds, rowId),
|
|
169
|
+
};
|
|
170
|
+
for (const { source, target } of PAGE_META_COLUMN_MAPS.text) {
|
|
171
|
+
insert[target] = resolveOptionalTextId(row[source], textIds, rowId, source);
|
|
172
|
+
}
|
|
173
|
+
for (const { source, target } of PAGE_META_COLUMN_MAPS.url) {
|
|
174
|
+
insert[target] = resolveOptionalUrlId(row[source], urlIds, rowId, source);
|
|
175
|
+
}
|
|
176
|
+
return insert;
|
|
177
|
+
});
|
|
178
|
+
for (let index = 0; index < inserts.length; index += INSERT_CHUNK_SIZE) {
|
|
179
|
+
const chunk = inserts.slice(index, index + INSERT_CHUNK_SIZE);
|
|
180
|
+
await trx('page_meta').insert(chunk).onConflict('page_id').ignore();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Returns `true` when `value` is a `data:` URI larger than the routing
|
|
186
|
+
* threshold — i.e. one that the `url_refs` populate
|
|
187
|
+
* (`populate-ref-tables/populate-url-refs.ts`) sent to `blob_refs` instead
|
|
188
|
+
* of `url_refs`. `page_meta` deliberately has no `*_blob_id` companion
|
|
189
|
+
* columns for its URL slots, so we skip these values from
|
|
190
|
+
* the `url_refs` lookup rather than issue a doomed `WHERE url IN (?)`
|
|
191
|
+
* that would burn a chunk slot per multi-KB URI. The resulting
|
|
192
|
+
* `*_url_id` is null with a `console.warn` breadcrumb; the operator
|
|
193
|
+
* can then decide whether the archive needs a schema extension or the
|
|
194
|
+
* raw data warrants normalisation.
|
|
195
|
+
* @param value - Raw URL column value.
|
|
196
|
+
*/
|
|
197
|
+
function isLargeDataUri(value) {
|
|
198
|
+
return value.startsWith('data:') && value.length > DATA_URI_URL_REFS_LIMIT;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Resolves `text_refs.id` for a `page_meta.<name>_text_id` slot or
|
|
202
|
+
* throws when a non-empty source value has no matching `text_refs` row
|
|
203
|
+
* (parity with `populateContentItems`' `url_id` throw — silent NULL
|
|
204
|
+
* corruption would still let the count-based acceptance invariant pass
|
|
205
|
+
* while individual `page_meta` rows lose their meta text).
|
|
206
|
+
* @param value - Raw column value from the source `pages` row.
|
|
207
|
+
* @param textIds - `text → text_refs.id` map batch-resolved for the
|
|
208
|
+
* current chunk (see {@link ./resolve-text-refs.ts}).
|
|
209
|
+
* @param pageId - Owning page id (for the error message).
|
|
210
|
+
* @param column - Source column name (for the error message).
|
|
211
|
+
*/
|
|
212
|
+
function resolveOptionalTextId(value, textIds, pageId, column) {
|
|
213
|
+
if (typeof value !== 'string' || value === '') {
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
const id = textIds.get(value);
|
|
217
|
+
if (id === undefined) {
|
|
218
|
+
throw new Error(`populatePageMeta: text_refs.id not resolved for page id=${pageId} column=${column} — populateTextRefs must run first`);
|
|
219
|
+
}
|
|
220
|
+
return id;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Resolves `url_refs.id` for a `page_meta.<name>_url_id` slot, throws
|
|
224
|
+
* on a missing lookup for a regular URL, and returns `null` (with a
|
|
225
|
+
* warning) for large data URIs that the `url_refs` populate routed to
|
|
226
|
+
* `blob_refs` — those cannot land in `page_meta` because the schema has
|
|
227
|
+
* no `*_blob_id` companion columns.
|
|
228
|
+
* @param value - Raw column value from the source `pages` row.
|
|
229
|
+
* @param urlIds - `url → url_refs.id` map batch-resolved for the
|
|
230
|
+
* current chunk (see {@link ./resolve-url-refs.ts}).
|
|
231
|
+
* @param pageId - Owning page id (for the error message).
|
|
232
|
+
* @param column - Source column name (for the error message).
|
|
233
|
+
*/
|
|
234
|
+
function resolveOptionalUrlId(value, urlIds, pageId, column) {
|
|
235
|
+
if (typeof value !== 'string' || value === '') {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
if (isLargeDataUri(value)) {
|
|
239
|
+
// eslint-disable-next-line no-console
|
|
240
|
+
console.warn(`populatePageMeta: dropping large data URI in page id=${pageId} column=${column} (page_meta has no *_blob_id companion for URL columns)`);
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
const id = urlIds.get(value);
|
|
244
|
+
if (id === undefined) {
|
|
245
|
+
throw new Error(`populatePageMeta: url_refs.id not resolved for page id=${pageId} column=${column} — populateUrlRefs must run first`);
|
|
246
|
+
}
|
|
247
|
+
return id;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Resolves `json_refs.id` for `page_meta.meta_extras_json_id` or throws
|
|
251
|
+
* when the source `meta_extras` string has no matching `json_refs` row
|
|
252
|
+
* (parity with the text/url branches above).
|
|
253
|
+
* @param value - Raw `meta_extras` value from the source `pages` row.
|
|
254
|
+
* @param jsonIds - `JSON string → json_refs.id` map batch-resolved for
|
|
255
|
+
* the current chunk (see {@link ./resolve-json-refs.ts}).
|
|
256
|
+
* @param pageId - Owning page id (for the error message).
|
|
257
|
+
*/
|
|
258
|
+
function resolveOptionalJsonId(value, jsonIds, pageId) {
|
|
259
|
+
if (typeof value !== 'string' || value === '') {
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
const id = jsonIds.get(value);
|
|
263
|
+
if (id === undefined) {
|
|
264
|
+
throw new Error(`populatePageMeta: json_refs.id not resolved for page id=${pageId} column=meta_extras — populateJsonRefs must run first`);
|
|
265
|
+
}
|
|
266
|
+
return id;
|
|
267
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ProgressCallback } from '../create-progress-reporter.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Populates `resource_items` from `resources` (issue #193).
|
|
5
|
+
*
|
|
6
|
+
* Structurally analogous to {@link ./populate-content-items.ts}: for each
|
|
7
|
+
* `resources` chunk, batch-resolve `url_refs.id`, `content_type_refs.id`,
|
|
8
|
+
* and `header_sets.id`, then bulk-INSERT with explicit `id = resources.id`.
|
|
9
|
+
* Reusing the legacy PK preserves the `resources-referrers.resourceId`
|
|
10
|
+
* FK reference (which `populateResourceRefEdges` later carries over as
|
|
11
|
+
* `resource_ref_edges.resource_id`) without any per-row UPDATE.
|
|
12
|
+
*
|
|
13
|
+
* `INSERT OR IGNORE` on `id` makes the step idempotent.
|
|
14
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
15
|
+
* @param onProgress - Optional sink for periodic progress lines (one per
|
|
16
|
+
* ~5% of `resources` scanned); see {@link ../create-progress-reporter.ts}.
|
|
17
|
+
* @example
|
|
18
|
+
* await knex.transaction(async (trx) => {
|
|
19
|
+
* await populateResourceItems(trx);
|
|
20
|
+
* });
|
|
21
|
+
*/
|
|
22
|
+
export declare function populateResourceItems(trx: Knex, onProgress?: ProgressCallback): Promise<void>;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { createProgressReporter } from '../create-progress-reporter.js';
|
|
2
|
+
import { isBlobRefValue } from './is-blob-ref-value.js';
|
|
3
|
+
import { resolveBlobRefs } from './resolve-blob-refs.js';
|
|
4
|
+
import { loadContentTypeRefs } from './resolve-content-type-refs.js';
|
|
5
|
+
import { resolveHeaderSets } from './resolve-header-sets.js';
|
|
6
|
+
import { resolveUrlOrBlobFromMaps } from './resolve-url-or-blob-from-maps.js';
|
|
7
|
+
import { resolveUrlRefs } from './resolve-url-refs.js';
|
|
8
|
+
/**
|
|
9
|
+
* Rows scanned per keyset-paginated `SELECT` chunk against `resources`.
|
|
10
|
+
* `resources` rows are narrow (no meta columns) so 800 rows fits
|
|
11
|
+
* comfortably in a chunk without stressing memory. Bumping this higher
|
|
12
|
+
* would help throughput but risks pushing large `responseHeaders` JSON
|
|
13
|
+
* blobs past a healthy per-result-set size on archives with per-row
|
|
14
|
+
* multi-KB header payloads.
|
|
15
|
+
*/
|
|
16
|
+
const READ_CHUNK_SIZE = 800;
|
|
17
|
+
/**
|
|
18
|
+
* Rows sent per `INSERT INTO resource_items ... VALUES (...)` statement.
|
|
19
|
+
* Each row binds 11 params (id + 10 columns), so 500 rows = 5 500 params
|
|
20
|
+
* — well under SQLite's default variable limit.
|
|
21
|
+
*/
|
|
22
|
+
const INSERT_CHUNK_SIZE = 500;
|
|
23
|
+
/**
|
|
24
|
+
* Populates `resource_items` from `resources` (issue #193).
|
|
25
|
+
*
|
|
26
|
+
* Structurally analogous to {@link ./populate-content-items.ts}: for each
|
|
27
|
+
* `resources` chunk, batch-resolve `url_refs.id`, `content_type_refs.id`,
|
|
28
|
+
* and `header_sets.id`, then bulk-INSERT with explicit `id = resources.id`.
|
|
29
|
+
* Reusing the legacy PK preserves the `resources-referrers.resourceId`
|
|
30
|
+
* FK reference (which `populateResourceRefEdges` later carries over as
|
|
31
|
+
* `resource_ref_edges.resource_id`) without any per-row UPDATE.
|
|
32
|
+
*
|
|
33
|
+
* `INSERT OR IGNORE` on `id` makes the step idempotent.
|
|
34
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
35
|
+
* @param onProgress - Optional sink for periodic progress lines (one per
|
|
36
|
+
* ~5% of `resources` scanned); see {@link ../create-progress-reporter.ts}.
|
|
37
|
+
* @example
|
|
38
|
+
* await knex.transaction(async (trx) => {
|
|
39
|
+
* await populateResourceItems(trx);
|
|
40
|
+
* });
|
|
41
|
+
*/
|
|
42
|
+
export async function populateResourceItems(trx, onProgress) {
|
|
43
|
+
const contentTypeIds = await loadContentTypeRefs(trx);
|
|
44
|
+
const countRows = await trx('resources').count({ n: '*' });
|
|
45
|
+
const total = Number(countRows[0]?.n ?? 0);
|
|
46
|
+
const report = createProgressReporter('resource_items (resources)', total, onProgress);
|
|
47
|
+
let processed = 0;
|
|
48
|
+
let cursor = 0;
|
|
49
|
+
while (true) {
|
|
50
|
+
const rows = await trx('resources')
|
|
51
|
+
.select('id', 'url', 'isExternal', 'status', 'statusText', 'contentType', 'contentLength', 'responseHeaders', 'compress', 'cdn', 'source')
|
|
52
|
+
.where('id', '>', cursor)
|
|
53
|
+
.orderBy('id', 'asc')
|
|
54
|
+
.limit(READ_CHUNK_SIZE);
|
|
55
|
+
if (rows.length === 0) {
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
cursor = rows.at(-1).id;
|
|
59
|
+
processed += rows.length;
|
|
60
|
+
report(processed);
|
|
61
|
+
const urls = new Set();
|
|
62
|
+
const dataUris = new Set();
|
|
63
|
+
const headerJsonStrings = new Set();
|
|
64
|
+
for (const row of rows) {
|
|
65
|
+
if (isBlobRefValue(row.url)) {
|
|
66
|
+
dataUris.add(row.url);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
urls.add(row.url);
|
|
70
|
+
}
|
|
71
|
+
if (typeof row.responseHeaders === 'string' && row.responseHeaders !== '') {
|
|
72
|
+
headerJsonStrings.add(row.responseHeaders);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const urlIds = await resolveUrlRefs(trx, urls);
|
|
76
|
+
const blobIds = await resolveBlobRefs(trx, dataUris);
|
|
77
|
+
const headerSetIds = await resolveHeaderSets(trx, headerJsonStrings);
|
|
78
|
+
const inserts = rows.map((row) => {
|
|
79
|
+
const slot = resolveUrlOrBlobFromMaps(row.url, urlIds, blobIds);
|
|
80
|
+
if (slot.url === null && slot.blob === null) {
|
|
81
|
+
throw new Error(`populateResourceItems: neither url_refs.id nor blob_refs.id resolved for resource id=${row.id} url=${row.url.slice(0, 80)} — populateUrlRefs/populateBlobRefs must run first`);
|
|
82
|
+
}
|
|
83
|
+
let contentTypeId = null;
|
|
84
|
+
if (row.contentType != null && row.contentType !== '') {
|
|
85
|
+
const resolved = contentTypeIds.get(row.contentType);
|
|
86
|
+
if (resolved === undefined) {
|
|
87
|
+
throw new Error(`populateResourceItems: content_type_refs.id not resolved for resource id=${row.id} contentType=${row.contentType} — populateContentTypeRefs must run first`);
|
|
88
|
+
}
|
|
89
|
+
contentTypeId = resolved;
|
|
90
|
+
}
|
|
91
|
+
const headerSetId = typeof row.responseHeaders === 'string' && row.responseHeaders !== ''
|
|
92
|
+
? (headerSetIds.get(row.responseHeaders) ?? null)
|
|
93
|
+
: null;
|
|
94
|
+
return {
|
|
95
|
+
id: row.id,
|
|
96
|
+
url_id: slot.url,
|
|
97
|
+
url_blob_id: slot.blob,
|
|
98
|
+
is_external: row.isExternal == null ? 0 : row.isExternal ? 1 : 0,
|
|
99
|
+
status: row.status ?? null,
|
|
100
|
+
status_text: row.statusText ?? null,
|
|
101
|
+
content_type_id: contentTypeId,
|
|
102
|
+
content_length: row.contentLength ?? null,
|
|
103
|
+
header_set_id: headerSetId,
|
|
104
|
+
compress: row.compress ?? null,
|
|
105
|
+
cdn: row.cdn ?? null,
|
|
106
|
+
source: row.source,
|
|
107
|
+
};
|
|
108
|
+
});
|
|
109
|
+
for (let index = 0; index < inserts.length; index += INSERT_CHUNK_SIZE) {
|
|
110
|
+
const chunk = inserts.slice(index, index + INSERT_CHUNK_SIZE);
|
|
111
|
+
await trx('resource_items').insert(chunk).onConflict('id').ignore();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|