@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,134 @@
|
|
|
1
|
+
import { zstdCompressSync } from 'node:zlib';
|
|
2
|
+
import { createProgressReporter } from '../create-progress-reporter.js';
|
|
3
|
+
import { computeContentHash } from './compute-content-hash.js';
|
|
4
|
+
import { DATA_URI_URL_REFS_LIMIT } from './data-uri-url-refs-limit.js';
|
|
5
|
+
import { decodeDataUri } from './decode-data-uri.js';
|
|
6
|
+
/** Rows scanned per `SELECT`. See `populateTextRefs` for chunking rationale. */
|
|
7
|
+
const READ_CHUNK_SIZE = 2000;
|
|
8
|
+
/**
|
|
9
|
+
* Rows written per `INSERT`. blob_refs rows carry a compressed body BLOB
|
|
10
|
+
* so 100 rows keeps the total payload of a single INSERT statement well
|
|
11
|
+
* under WAL frame limits even for large SVGs.
|
|
12
|
+
*/
|
|
13
|
+
const INSERT_CHUNK_SIZE = 100;
|
|
14
|
+
/**
|
|
15
|
+
* Source table + its URL-shaped column(s) that may hold a data URI large
|
|
16
|
+
* enough to route to `blob_refs`. `resources.url` is the resource's own
|
|
17
|
+
* identity (unlike `pages`/`content_items`, whose own URL is always a
|
|
18
|
+
* real http(s) address in practice) — a `<link>`/CSS sub-resource can
|
|
19
|
+
* legally be captured as an inline `data:` URI.
|
|
20
|
+
*/
|
|
21
|
+
const URL_SOURCES = [
|
|
22
|
+
{ table: 'images', columns: ['src', 'currentSrc'] },
|
|
23
|
+
{ table: 'resources', columns: ['url'] },
|
|
24
|
+
];
|
|
25
|
+
/**
|
|
26
|
+
* Populates `blob_refs` from every `images.src` / `images.currentSrc` /
|
|
27
|
+
* `resources.url` value that is a data URI longer than
|
|
28
|
+
* {@link DATA_URI_URL_REFS_LIMIT} bytes (issue #191).
|
|
29
|
+
*
|
|
30
|
+
* For each such value:
|
|
31
|
+
*
|
|
32
|
+
* 1. `decodeDataUri` strips the `data:...;base64,` (or `data:...,`) prefix
|
|
33
|
+
* and returns the raw payload bytes.
|
|
34
|
+
* 2. `computeContentHash` hashes the payload bytes (32-byte SHA-256).
|
|
35
|
+
* 3. The payload is zstd-compressed (`codec='zstd'`) — matching
|
|
36
|
+
* `page_html_blobs` / `json_refs`.
|
|
37
|
+
* 4. `INSERT OR IGNORE` on `hash` deduplicates: an `<img>` element and a
|
|
38
|
+
* resource that share the same underlying base64 payload share one
|
|
39
|
+
* `blob_refs` row.
|
|
40
|
+
*
|
|
41
|
+
* Malformed data URIs that `decodeDataUri` cannot decode are logged and
|
|
42
|
+
* skipped — the raw URI string still exists in the source row, and the
|
|
43
|
+
* migration script's operator can hunt it down from the warning log. The
|
|
44
|
+
* alternative — routing malformed large URIs back to `url_refs` — would
|
|
45
|
+
* break the "data URIs > threshold live in blob_refs" contract that 0.13
|
|
46
|
+
* lookups depend on.
|
|
47
|
+
*
|
|
48
|
+
* On the reference archive only ~429 images use data URIs, so the total
|
|
49
|
+
* dictionary is tiny — this step is I/O-cheap even without full
|
|
50
|
+
* chunking, but the same batching shape is used as elsewhere for
|
|
51
|
+
* consistency.
|
|
52
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
53
|
+
* @param onProgress - Optional sink for periodic progress lines (one per
|
|
54
|
+
* ~5% of each source table scanned); see {@link ../create-progress-reporter.ts}.
|
|
55
|
+
* @example
|
|
56
|
+
* await knex.transaction(async (trx) => {
|
|
57
|
+
* await populateBlobRefs(trx);
|
|
58
|
+
* });
|
|
59
|
+
*/
|
|
60
|
+
export async function populateBlobRefs(trx, onProgress) {
|
|
61
|
+
const seen = new Set();
|
|
62
|
+
const pending = [];
|
|
63
|
+
for (const source of URL_SOURCES) {
|
|
64
|
+
const hasTable = await trx.schema.hasTable(source.table);
|
|
65
|
+
if (!hasTable) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const presentColumns = [];
|
|
69
|
+
for (const column of source.columns) {
|
|
70
|
+
if (await trx.schema.hasColumn(source.table, column)) {
|
|
71
|
+
presentColumns.push(column);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (presentColumns.length === 0) {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const countRows = await trx(source.table).count({ n: '*' });
|
|
78
|
+
const total = Number(countRows[0]?.n ?? 0);
|
|
79
|
+
const report = createProgressReporter(`blob_refs (${source.table})`, total, onProgress);
|
|
80
|
+
let processed = 0;
|
|
81
|
+
let cursor = 0;
|
|
82
|
+
while (true) {
|
|
83
|
+
const rows = await trx(source.table)
|
|
84
|
+
.select('id', ...presentColumns)
|
|
85
|
+
.where('id', '>', cursor)
|
|
86
|
+
.orderBy('id', 'asc')
|
|
87
|
+
.limit(READ_CHUNK_SIZE);
|
|
88
|
+
if (rows.length === 0) {
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
cursor = rows.at(-1).id;
|
|
92
|
+
processed += rows.length;
|
|
93
|
+
report(processed);
|
|
94
|
+
for (const row of rows) {
|
|
95
|
+
for (const column of presentColumns) {
|
|
96
|
+
const value = row[column];
|
|
97
|
+
if (value == null || value.length <= DATA_URI_URL_REFS_LIMIT) {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (!value.startsWith('data:')) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const decoded = decodeDataUri(value);
|
|
104
|
+
if (decoded === null) {
|
|
105
|
+
// eslint-disable-next-line no-console
|
|
106
|
+
console.warn(`populateBlobRefs: skipping malformed data URI (length=${value.length}) — raw string still exists in ${source.table} row`);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const hash = computeContentHash(decoded.bytes);
|
|
110
|
+
const hex = hash.toString('hex');
|
|
111
|
+
if (seen.has(hex)) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
seen.add(hex);
|
|
115
|
+
const compressed = zstdCompressSync(decoded.bytes);
|
|
116
|
+
pending.push({
|
|
117
|
+
hash,
|
|
118
|
+
body: compressed,
|
|
119
|
+
codec: 'zstd',
|
|
120
|
+
size_raw: decoded.bytes.byteLength,
|
|
121
|
+
size_stored: compressed.byteLength,
|
|
122
|
+
});
|
|
123
|
+
if (pending.length >= INSERT_CHUNK_SIZE) {
|
|
124
|
+
await trx('blob_refs').insert(pending).onConflict('hash').ignore();
|
|
125
|
+
pending.length = 0;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (pending.length > 0) {
|
|
132
|
+
await trx('blob_refs').insert(pending).onConflict('hash').ignore();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Populates `content_type_refs` from every distinct `contentType` value
|
|
4
|
+
* currently stored in `pages` and `resources` (issue #191).
|
|
5
|
+
*
|
|
6
|
+
* Two independent DISTINCT SELECTs (one per table) are merged in JS
|
|
7
|
+
* rather than via SQL `UNION` — the cardinality is small in practice and
|
|
8
|
+
* doing it in JS avoids the knex-`union().select()` column-aliasing
|
|
9
|
+
* quirk (bare `.select()` on a union wraps in `SELECT *` and can lose
|
|
10
|
+
* the column name depending on driver version). Two per-table SELECTs
|
|
11
|
+
* are also fast because `contentType` is indexed on both tables via
|
|
12
|
+
* `idx_pages_listfilter` / natural column index (see `init-schema.ts`).
|
|
13
|
+
*
|
|
14
|
+
* `normalized` and `category` are derived in JS via {@link classifyContentType}
|
|
15
|
+
* so the rule table stays in one place; SQLite has no equivalent
|
|
16
|
+
* expression.
|
|
17
|
+
*
|
|
18
|
+
* `INSERT OR IGNORE` on the natural key `raw` makes this idempotent —
|
|
19
|
+
* re-running this populate after a partial failure never duplicates
|
|
20
|
+
* rows, only appends the new ones.
|
|
21
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
22
|
+
* @example
|
|
23
|
+
* await knex.transaction(async (trx) => {
|
|
24
|
+
* await populateContentTypeRefs(trx);
|
|
25
|
+
* });
|
|
26
|
+
*/
|
|
27
|
+
export declare function populateContentTypeRefs(trx: Knex): Promise<void>;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { classifyContentType } from './classify-content-type.js';
|
|
2
|
+
import { normalizeMime } from './normalize-mime.js';
|
|
3
|
+
/**
|
|
4
|
+
* Distinct-`contentType` rows are collected from `pages` + `resources` in
|
|
5
|
+
* chunks of this size before being written into `content_type_refs`. The
|
|
6
|
+
* DISTINCT list is expected to be tiny (< 1000 rows even on the largest
|
|
7
|
+
* archives — the wire content-type space is small) so the chunk size only
|
|
8
|
+
* bounds worst-case parameter counts on `INSERT ... VALUES ...`.
|
|
9
|
+
*/
|
|
10
|
+
const INSERT_CHUNK_SIZE = 500;
|
|
11
|
+
/**
|
|
12
|
+
* Populates `content_type_refs` from every distinct `contentType` value
|
|
13
|
+
* currently stored in `pages` and `resources` (issue #191).
|
|
14
|
+
*
|
|
15
|
+
* Two independent DISTINCT SELECTs (one per table) are merged in JS
|
|
16
|
+
* rather than via SQL `UNION` — the cardinality is small in practice and
|
|
17
|
+
* doing it in JS avoids the knex-`union().select()` column-aliasing
|
|
18
|
+
* quirk (bare `.select()` on a union wraps in `SELECT *` and can lose
|
|
19
|
+
* the column name depending on driver version). Two per-table SELECTs
|
|
20
|
+
* are also fast because `contentType` is indexed on both tables via
|
|
21
|
+
* `idx_pages_listfilter` / natural column index (see `init-schema.ts`).
|
|
22
|
+
*
|
|
23
|
+
* `normalized` and `category` are derived in JS via {@link classifyContentType}
|
|
24
|
+
* so the rule table stays in one place; SQLite has no equivalent
|
|
25
|
+
* expression.
|
|
26
|
+
*
|
|
27
|
+
* `INSERT OR IGNORE` on the natural key `raw` makes this idempotent —
|
|
28
|
+
* re-running this populate after a partial failure never duplicates
|
|
29
|
+
* rows, only appends the new ones.
|
|
30
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
31
|
+
* @example
|
|
32
|
+
* await knex.transaction(async (trx) => {
|
|
33
|
+
* await populateContentTypeRefs(trx);
|
|
34
|
+
* });
|
|
35
|
+
*/
|
|
36
|
+
export async function populateContentTypeRefs(trx) {
|
|
37
|
+
const distinctRaw = new Set();
|
|
38
|
+
if (await trx.schema.hasTable('pages')) {
|
|
39
|
+
const pagesRows = await trx('pages')
|
|
40
|
+
.distinct('contentType')
|
|
41
|
+
.whereNotNull('contentType');
|
|
42
|
+
for (const { contentType } of pagesRows) {
|
|
43
|
+
if (contentType != null && contentType !== '') {
|
|
44
|
+
distinctRaw.add(contentType);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (await trx.schema.hasTable('resources')) {
|
|
49
|
+
const resourcesRows = await trx('resources')
|
|
50
|
+
.distinct('contentType')
|
|
51
|
+
.whereNotNull('contentType');
|
|
52
|
+
for (const { contentType } of resourcesRows) {
|
|
53
|
+
if (contentType != null && contentType !== '') {
|
|
54
|
+
distinctRaw.add(contentType);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (distinctRaw.size === 0) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const inserts = [...distinctRaw].map((raw) => ({
|
|
62
|
+
raw,
|
|
63
|
+
normalized: normalizeMime(raw),
|
|
64
|
+
category: classifyContentType(raw),
|
|
65
|
+
}));
|
|
66
|
+
for (let index = 0; index < inserts.length; index += INSERT_CHUNK_SIZE) {
|
|
67
|
+
const chunk = inserts.slice(index, index + INSERT_CHUNK_SIZE);
|
|
68
|
+
await trx('content_type_refs').insert(chunk).onConflict('raw').ignore();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ProgressCallback } from '../create-progress-reporter.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Populates the five header decomposition tables (`header_name_refs`,
|
|
5
|
+
* `header_value_refs`, `header_sets`, `header_set_entries`,
|
|
6
|
+
* `header_flags`) from every `pages.responseHeaders` and
|
|
7
|
+
* `resources.responseHeaders` JSON blob (issue #191).
|
|
8
|
+
*
|
|
9
|
+
* Strategy:
|
|
10
|
+
*
|
|
11
|
+
* 1. **Warm caches** via {@link ./create-header-table-caches.ts} — load
|
|
12
|
+
* existing `header_name_refs`, `header_value_refs`, and `header_sets`
|
|
13
|
+
* rows into id maps. Idempotent re-runs then reuse ids instead of
|
|
14
|
+
* re-issuing an upsert per entry, and new ids are appended as they
|
|
15
|
+
* are inserted.
|
|
16
|
+
* 2. **Stream `pages.responseHeaders` + `resources.responseHeaders`** in
|
|
17
|
+
* id-keyset chunks. Each non-null value is decomposed via
|
|
18
|
+
* {@link decomposeHeaderSet} and written via
|
|
19
|
+
* {@link ./upsert-one-header-set.ts} — the same per-set primitive the
|
|
20
|
+
* crawler's live write path uses, so migrated and live-crawled
|
|
21
|
+
* archives produce identical header rows.
|
|
22
|
+
*
|
|
23
|
+
* Every write is bulk-batched so the migration stays O(chunks × per-
|
|
24
|
+
* chunk-distinct-decomposed-sets) round-trips against the DB. Idempotency
|
|
25
|
+
* across full re-runs is guaranteed by the `INSERT OR IGNORE`s and the
|
|
26
|
+
* `setIdsProcessedThisRun` guard inside the per-set upsert.
|
|
27
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
28
|
+
* @param onProgress - Optional sink for periodic progress lines (one per
|
|
29
|
+
* ~5% of each source table scanned); see {@link ../create-progress-reporter.ts}.
|
|
30
|
+
* @example
|
|
31
|
+
* await knex.transaction(async (trx) => {
|
|
32
|
+
* await populateHeaderTables(trx);
|
|
33
|
+
* });
|
|
34
|
+
*/
|
|
35
|
+
export declare function populateHeaderTables(trx: Knex, onProgress?: ProgressCallback): Promise<void>;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { createProgressReporter } from '../create-progress-reporter.js';
|
|
2
|
+
import { createHeaderTableCaches } from './create-header-table-caches.js';
|
|
3
|
+
import { decomposeHeaderSet } from './decompose-header-set.js';
|
|
4
|
+
import { upsertOneHeaderSet } from './upsert-one-header-set.js';
|
|
5
|
+
/**
|
|
6
|
+
* Rows scanned per SELECT chunk against `pages.responseHeaders` /
|
|
7
|
+
* `resources.responseHeaders`. Keyset-paginated on `id` to avoid loading
|
|
8
|
+
* a 470k-row `responseHeaders` column into a single query result.
|
|
9
|
+
*/
|
|
10
|
+
const READ_CHUNK_SIZE = 500;
|
|
11
|
+
/**
|
|
12
|
+
* Populates the five header decomposition tables (`header_name_refs`,
|
|
13
|
+
* `header_value_refs`, `header_sets`, `header_set_entries`,
|
|
14
|
+
* `header_flags`) from every `pages.responseHeaders` and
|
|
15
|
+
* `resources.responseHeaders` JSON blob (issue #191).
|
|
16
|
+
*
|
|
17
|
+
* Strategy:
|
|
18
|
+
*
|
|
19
|
+
* 1. **Warm caches** via {@link ./create-header-table-caches.ts} — load
|
|
20
|
+
* existing `header_name_refs`, `header_value_refs`, and `header_sets`
|
|
21
|
+
* rows into id maps. Idempotent re-runs then reuse ids instead of
|
|
22
|
+
* re-issuing an upsert per entry, and new ids are appended as they
|
|
23
|
+
* are inserted.
|
|
24
|
+
* 2. **Stream `pages.responseHeaders` + `resources.responseHeaders`** in
|
|
25
|
+
* id-keyset chunks. Each non-null value is decomposed via
|
|
26
|
+
* {@link decomposeHeaderSet} and written via
|
|
27
|
+
* {@link ./upsert-one-header-set.ts} — the same per-set primitive the
|
|
28
|
+
* crawler's live write path uses, so migrated and live-crawled
|
|
29
|
+
* archives produce identical header rows.
|
|
30
|
+
*
|
|
31
|
+
* Every write is bulk-batched so the migration stays O(chunks × per-
|
|
32
|
+
* chunk-distinct-decomposed-sets) round-trips against the DB. Idempotency
|
|
33
|
+
* across full re-runs is guaranteed by the `INSERT OR IGNORE`s and the
|
|
34
|
+
* `setIdsProcessedThisRun` guard inside the per-set upsert.
|
|
35
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
36
|
+
* @param onProgress - Optional sink for periodic progress lines (one per
|
|
37
|
+
* ~5% of each source table scanned); see {@link ../create-progress-reporter.ts}.
|
|
38
|
+
* @example
|
|
39
|
+
* await knex.transaction(async (trx) => {
|
|
40
|
+
* await populateHeaderTables(trx);
|
|
41
|
+
* });
|
|
42
|
+
*/
|
|
43
|
+
export async function populateHeaderTables(trx, onProgress) {
|
|
44
|
+
const caches = await createHeaderTableCaches(trx);
|
|
45
|
+
for (const table of ['pages', 'resources']) {
|
|
46
|
+
const hasTable = await trx.schema.hasTable(table);
|
|
47
|
+
if (!hasTable) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const hasColumn = await trx.schema.hasColumn(table, 'responseHeaders');
|
|
51
|
+
if (!hasColumn) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const countRows = await trx(table).count({ n: '*' });
|
|
55
|
+
const total = Number(countRows[0]?.n ?? 0);
|
|
56
|
+
const report = createProgressReporter(`header_tables (${table})`, total, onProgress);
|
|
57
|
+
let processed = 0;
|
|
58
|
+
let cursor = 0;
|
|
59
|
+
while (true) {
|
|
60
|
+
const rows = await trx(table)
|
|
61
|
+
.select('id', 'responseHeaders')
|
|
62
|
+
.where('id', '>', cursor)
|
|
63
|
+
.orderBy('id', 'asc')
|
|
64
|
+
.limit(READ_CHUNK_SIZE);
|
|
65
|
+
if (rows.length === 0) {
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
cursor = rows.at(-1).id;
|
|
69
|
+
processed += rows.length;
|
|
70
|
+
report(processed);
|
|
71
|
+
for (const row of rows) {
|
|
72
|
+
const decomposed = decomposeHeaderSet(row.responseHeaders);
|
|
73
|
+
if (decomposed === null) {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
await upsertOneHeaderSet(trx, decomposed, caches);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ProgressCallback } from '../create-progress-reporter.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Populates `json_refs` from every non-null `pages.meta_extras` value
|
|
5
|
+
* (issue #191).
|
|
6
|
+
*
|
|
7
|
+
* Each value is:
|
|
8
|
+
*
|
|
9
|
+
* 1. Hashed with {@link computeContentHash} (32-byte SHA-256; see that
|
|
10
|
+
* function's docs for the algorithm-choice rationale).
|
|
11
|
+
* 2. Compressed with `zstdCompressSync` (`codec='zstd'`) — same encoder
|
|
12
|
+
* used by `page_html_blobs`.
|
|
13
|
+
* 3. Deduplicated by hash — identical raw JSON strings produce one row.
|
|
14
|
+
*
|
|
15
|
+
* `size_raw` records the uncompressed byte length (UTF-8) and
|
|
16
|
+
* `size_stored` records the compressed byte length; consumers can
|
|
17
|
+
* estimate compression savings without decompressing.
|
|
18
|
+
*
|
|
19
|
+
* `INSERT OR IGNORE` on `hash` makes the step idempotent across partial-
|
|
20
|
+
* failure restarts.
|
|
21
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
22
|
+
* @param onProgress - Optional sink for periodic progress lines (one per
|
|
23
|
+
* ~5% of `pages` scanned); see {@link ../create-progress-reporter.ts}.
|
|
24
|
+
* @example
|
|
25
|
+
* await knex.transaction(async (trx) => {
|
|
26
|
+
* await populateJsonRefs(trx);
|
|
27
|
+
* });
|
|
28
|
+
*/
|
|
29
|
+
export declare function populateJsonRefs(trx: Knex, onProgress?: ProgressCallback): Promise<void>;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { zstdCompressSync } from 'node:zlib';
|
|
2
|
+
import { createProgressReporter } from '../create-progress-reporter.js';
|
|
3
|
+
import { computeContentHash } from './compute-content-hash.js';
|
|
4
|
+
/**
|
|
5
|
+
* Number of `json_refs` rows sent per INSERT. Each row binds 5 params
|
|
6
|
+
* (hash + json_text + codec + size_raw + size_stored). 200 rows = 1000
|
|
7
|
+
* params — comfortable margin under SQLite's default variable limit and
|
|
8
|
+
* bounds any one INSERT's compressed-blob payload total to a size that
|
|
9
|
+
* fits in one WAL frame.
|
|
10
|
+
*/
|
|
11
|
+
const INSERT_CHUNK_SIZE = 200;
|
|
12
|
+
/**
|
|
13
|
+
* Rows scanned per source query. Same rationale as the other populators:
|
|
14
|
+
* streaming with keyset pagination on `id` avoids loading a 470k-row
|
|
15
|
+
* `meta_extras` column into a single result set.
|
|
16
|
+
*/
|
|
17
|
+
const READ_CHUNK_SIZE = 1000;
|
|
18
|
+
/**
|
|
19
|
+
* Populates `json_refs` from every non-null `pages.meta_extras` value
|
|
20
|
+
* (issue #191).
|
|
21
|
+
*
|
|
22
|
+
* Each value is:
|
|
23
|
+
*
|
|
24
|
+
* 1. Hashed with {@link computeContentHash} (32-byte SHA-256; see that
|
|
25
|
+
* function's docs for the algorithm-choice rationale).
|
|
26
|
+
* 2. Compressed with `zstdCompressSync` (`codec='zstd'`) — same encoder
|
|
27
|
+
* used by `page_html_blobs`.
|
|
28
|
+
* 3. Deduplicated by hash — identical raw JSON strings produce one row.
|
|
29
|
+
*
|
|
30
|
+
* `size_raw` records the uncompressed byte length (UTF-8) and
|
|
31
|
+
* `size_stored` records the compressed byte length; consumers can
|
|
32
|
+
* estimate compression savings without decompressing.
|
|
33
|
+
*
|
|
34
|
+
* `INSERT OR IGNORE` on `hash` makes the step idempotent across partial-
|
|
35
|
+
* failure restarts.
|
|
36
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
37
|
+
* @param onProgress - Optional sink for periodic progress lines (one per
|
|
38
|
+
* ~5% of `pages` scanned); see {@link ../create-progress-reporter.ts}.
|
|
39
|
+
* @example
|
|
40
|
+
* await knex.transaction(async (trx) => {
|
|
41
|
+
* await populateJsonRefs(trx);
|
|
42
|
+
* });
|
|
43
|
+
*/
|
|
44
|
+
export async function populateJsonRefs(trx, onProgress) {
|
|
45
|
+
const hasPages = await trx.schema.hasTable('pages');
|
|
46
|
+
if (!hasPages) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const hasMetaExtras = await trx.schema.hasColumn('pages', 'meta_extras');
|
|
50
|
+
if (!hasMetaExtras) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const seen = new Set();
|
|
54
|
+
const pending = [];
|
|
55
|
+
const countRows = await trx('pages').count({ n: '*' });
|
|
56
|
+
const total = Number(countRows[0]?.n ?? 0);
|
|
57
|
+
const report = createProgressReporter('json_refs (pages)', total, onProgress);
|
|
58
|
+
let processed = 0;
|
|
59
|
+
let cursor = 0;
|
|
60
|
+
while (true) {
|
|
61
|
+
const rows = await trx('pages')
|
|
62
|
+
.select('id', 'meta_extras as value')
|
|
63
|
+
.where('id', '>', cursor)
|
|
64
|
+
.orderBy('id', 'asc')
|
|
65
|
+
.limit(READ_CHUNK_SIZE);
|
|
66
|
+
if (rows.length === 0) {
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
cursor = rows.at(-1).id;
|
|
70
|
+
processed += rows.length;
|
|
71
|
+
report(processed);
|
|
72
|
+
for (const row of rows) {
|
|
73
|
+
const raw = row.value;
|
|
74
|
+
if (raw == null || raw === '') {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const rawBytes = Buffer.from(raw, 'utf8');
|
|
78
|
+
const hash = computeContentHash(rawBytes);
|
|
79
|
+
const hex = hash.toString('hex');
|
|
80
|
+
if (seen.has(hex)) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
seen.add(hex);
|
|
84
|
+
const compressed = zstdCompressSync(rawBytes);
|
|
85
|
+
pending.push({
|
|
86
|
+
hash,
|
|
87
|
+
json_text: compressed,
|
|
88
|
+
codec: 'zstd',
|
|
89
|
+
size_raw: rawBytes.byteLength,
|
|
90
|
+
size_stored: compressed.byteLength,
|
|
91
|
+
});
|
|
92
|
+
if (pending.length >= INSERT_CHUNK_SIZE) {
|
|
93
|
+
await trx('json_refs').insert(pending).onConflict('hash').ignore();
|
|
94
|
+
pending.length = 0;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (pending.length > 0) {
|
|
99
|
+
await trx('json_refs').insert(pending).onConflict('hash').ignore();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { ProgressCallback } from '../create-progress-reporter.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Runs the six 0.13 ref-table populates (issue #191) in this fixed
|
|
5
|
+
* order against an already-connected archive:
|
|
6
|
+
*
|
|
7
|
+
* 1. `content_type_refs`
|
|
8
|
+
* 2. `url_refs`
|
|
9
|
+
* 3. `text_refs`
|
|
10
|
+
* 4. `json_refs`
|
|
11
|
+
* 5. `blob_refs`
|
|
12
|
+
* 6. Header tables (name / value / set / entries / flags).
|
|
13
|
+
*
|
|
14
|
+
* The order is an execution-order invariant, not arbitrary: the entity
|
|
15
|
+
* populates that run afterwards (`populateEntityTables`) JOIN against
|
|
16
|
+
* `content_type_refs` when filling `content_items` / `resource_items`,
|
|
17
|
+
* and look up `url_refs.id` for every URL column, so both dictionaries
|
|
18
|
+
* must be complete first. Within this function the ordering is:
|
|
19
|
+
* dictionary tables (1–5) first, header tables (6) last — the header
|
|
20
|
+
* tables' entries reference name / value refs, but those are inserted
|
|
21
|
+
* by `populateHeaderTables` itself, so no barrier between sub-populates
|
|
22
|
+
* is required.
|
|
23
|
+
*
|
|
24
|
+
* Every sub-populate is independently idempotent via `INSERT OR IGNORE`
|
|
25
|
+
* on its natural key. Running this orchestrator twice on the same archive
|
|
26
|
+
* produces the same rows — no phase marker table is used. This function
|
|
27
|
+
* does not open its own transaction so the caller controls the boundary;
|
|
28
|
+
* the whole invocation is expected to run inside one writer transaction
|
|
29
|
+
* with `.bak` protection at the caller level.
|
|
30
|
+
*
|
|
31
|
+
* `scripts/migrate-to-0.13.mjs` does NOT call this orchestrator directly
|
|
32
|
+
* — it calls the same six sub-populates itself, each in its own
|
|
33
|
+
* transaction, so a killed multi-hour migration only re-does the one
|
|
34
|
+
* table in flight on resume rather than the whole six-table batch. Use
|
|
35
|
+
* this function directly when that per-table checkpointing is not
|
|
36
|
+
* needed and a single all-or-nothing transaction is preferred.
|
|
37
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
38
|
+
* @param onProgress - Optional sink threaded to every sub-populate for
|
|
39
|
+
* periodic progress lines; see {@link ../create-progress-reporter.ts}.
|
|
40
|
+
* @example
|
|
41
|
+
* // Single-transaction use: connect via Archive, wrap in a
|
|
42
|
+
* // transaction, run every sub-step, then rely on the caller's `.bak`
|
|
43
|
+
* // safety net if any step throws.
|
|
44
|
+
* const archive = await Archive.open(archivePath);
|
|
45
|
+
* const knex = archive.getKnex();
|
|
46
|
+
* await knex.transaction(async (trx) => {
|
|
47
|
+
* await populateRefTables(trx);
|
|
48
|
+
* });
|
|
49
|
+
* await archive.write();
|
|
50
|
+
*/
|
|
51
|
+
export declare function populateRefTables(trx: Knex, onProgress?: ProgressCallback): Promise<void>;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { populateBlobRefs } from './populate-blob-refs.js';
|
|
2
|
+
import { populateContentTypeRefs } from './populate-content-type-refs.js';
|
|
3
|
+
import { populateHeaderTables } from './populate-header-tables.js';
|
|
4
|
+
import { populateJsonRefs } from './populate-json-refs.js';
|
|
5
|
+
import { populateTextRefs } from './populate-text-refs.js';
|
|
6
|
+
import { populateUrlRefs } from './populate-url-refs.js';
|
|
7
|
+
/**
|
|
8
|
+
* Runs the six 0.13 ref-table populates (issue #191) in this fixed
|
|
9
|
+
* order against an already-connected archive:
|
|
10
|
+
*
|
|
11
|
+
* 1. `content_type_refs`
|
|
12
|
+
* 2. `url_refs`
|
|
13
|
+
* 3. `text_refs`
|
|
14
|
+
* 4. `json_refs`
|
|
15
|
+
* 5. `blob_refs`
|
|
16
|
+
* 6. Header tables (name / value / set / entries / flags).
|
|
17
|
+
*
|
|
18
|
+
* The order is an execution-order invariant, not arbitrary: the entity
|
|
19
|
+
* populates that run afterwards (`populateEntityTables`) JOIN against
|
|
20
|
+
* `content_type_refs` when filling `content_items` / `resource_items`,
|
|
21
|
+
* and look up `url_refs.id` for every URL column, so both dictionaries
|
|
22
|
+
* must be complete first. Within this function the ordering is:
|
|
23
|
+
* dictionary tables (1–5) first, header tables (6) last — the header
|
|
24
|
+
* tables' entries reference name / value refs, but those are inserted
|
|
25
|
+
* by `populateHeaderTables` itself, so no barrier between sub-populates
|
|
26
|
+
* is required.
|
|
27
|
+
*
|
|
28
|
+
* Every sub-populate is independently idempotent via `INSERT OR IGNORE`
|
|
29
|
+
* on its natural key. Running this orchestrator twice on the same archive
|
|
30
|
+
* produces the same rows — no phase marker table is used. This function
|
|
31
|
+
* does not open its own transaction so the caller controls the boundary;
|
|
32
|
+
* the whole invocation is expected to run inside one writer transaction
|
|
33
|
+
* with `.bak` protection at the caller level.
|
|
34
|
+
*
|
|
35
|
+
* `scripts/migrate-to-0.13.mjs` does NOT call this orchestrator directly
|
|
36
|
+
* — it calls the same six sub-populates itself, each in its own
|
|
37
|
+
* transaction, so a killed multi-hour migration only re-does the one
|
|
38
|
+
* table in flight on resume rather than the whole six-table batch. Use
|
|
39
|
+
* this function directly when that per-table checkpointing is not
|
|
40
|
+
* needed and a single all-or-nothing transaction is preferred.
|
|
41
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
42
|
+
* @param onProgress - Optional sink threaded to every sub-populate for
|
|
43
|
+
* periodic progress lines; see {@link ../create-progress-reporter.ts}.
|
|
44
|
+
* @example
|
|
45
|
+
* // Single-transaction use: connect via Archive, wrap in a
|
|
46
|
+
* // transaction, run every sub-step, then rely on the caller's `.bak`
|
|
47
|
+
* // safety net if any step throws.
|
|
48
|
+
* const archive = await Archive.open(archivePath);
|
|
49
|
+
* const knex = archive.getKnex();
|
|
50
|
+
* await knex.transaction(async (trx) => {
|
|
51
|
+
* await populateRefTables(trx);
|
|
52
|
+
* });
|
|
53
|
+
* await archive.write();
|
|
54
|
+
*/
|
|
55
|
+
export async function populateRefTables(trx, onProgress) {
|
|
56
|
+
await populateContentTypeRefs(trx);
|
|
57
|
+
await populateUrlRefs(trx, onProgress);
|
|
58
|
+
await populateTextRefs(trx, onProgress);
|
|
59
|
+
await populateJsonRefs(trx, onProgress);
|
|
60
|
+
await populateBlobRefs(trx, onProgress);
|
|
61
|
+
await populateHeaderTables(trx, onProgress);
|
|
62
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ProgressCallback } from '../create-progress-reporter.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Populates `text_refs` from every text-shaped column across `anchors`,
|
|
5
|
+
* `images`, and `pages` (issue #191).
|
|
6
|
+
*
|
|
7
|
+
* Rules:
|
|
8
|
+
*
|
|
9
|
+
* - **Content-hash dedup contract**: identical text produces one row. The
|
|
10
|
+
* hash is derived by {@link computeContentHash} (currently SHA-256,
|
|
11
|
+
* matching `page_html_blobs.hash`; see that function's docs for the
|
|
12
|
+
* algorithm-choice rationale).
|
|
13
|
+
* - **Empty and null are skipped** — an empty `<a>` tag adds no text to
|
|
14
|
+
* the dictionary. Anchors with no text still get an `anchor_edges` row
|
|
15
|
+
* in 0.13, just with `first_text_id = NULL`.
|
|
16
|
+
* - **INSERT OR IGNORE on (hash, text)** — the composite UNIQUE from the
|
|
17
|
+
* 0.13 DDL — makes the step idempotent across partial-failure
|
|
18
|
+
* restarts.
|
|
19
|
+
*
|
|
20
|
+
* Peak memory is bounded by the count of distinct texts (all texts are
|
|
21
|
+
* held in a Map before insert). On the reference archive this Map is
|
|
22
|
+
* about 5 MB of anchor textContent + a few MB of page meta text — well
|
|
23
|
+
* within the migration process budget.
|
|
24
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
25
|
+
* @param onProgress - Optional sink for periodic progress lines (one per
|
|
26
|
+
* ~5% of each source table scanned); see {@link ../create-progress-reporter.ts}.
|
|
27
|
+
* @example
|
|
28
|
+
* await knex.transaction(async (trx) => {
|
|
29
|
+
* await populateTextRefs(trx);
|
|
30
|
+
* });
|
|
31
|
+
*/
|
|
32
|
+
export declare function populateTextRefs(trx: Knex, onProgress?: ProgressCallback): Promise<void>;
|