@nitpicker/archive 0.0.0 → 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 +106 -0
- package/lib/apply-connection-pragmas.d.ts +18 -0
- package/lib/apply-connection-pragmas.js +40 -0
- package/lib/archive-accessor.d.ts +265 -0
- package/lib/archive-accessor.js +477 -0
- package/lib/archive-lock.d.ts +45 -0
- package/lib/archive-lock.js +154 -0
- package/lib/archive.d.ts +736 -0
- package/lib/archive.js +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 +350 -3
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assigns every cluster of a fresh template classification its
|
|
3
|
+
* {@link TemplateLabel}, carrying labels forward from the previous
|
|
4
|
+
* classification wherever the same template survived the re-run.
|
|
5
|
+
*
|
|
6
|
+
* ## Inheritance
|
|
7
|
+
*
|
|
8
|
+
* A new cluster inherits an old cluster's label when the two share a
|
|
9
|
+
* **mutual majority** of pages: the overlap is more than half of the new
|
|
10
|
+
* cluster *and* more than half of the old one. Mutual majority means at
|
|
11
|
+
* most one new cluster can claim a given old label, and a cluster that
|
|
12
|
+
* merely absorbed a few pages of a much larger old template does not steal
|
|
13
|
+
* its name. A split keeps the old label on the half that holds most of the
|
|
14
|
+
* old pages; the other half is named afresh.
|
|
15
|
+
*
|
|
16
|
+
* The old cluster's size counts only pages that are classified in the new
|
|
17
|
+
* run too. Pages the crawl has since dropped (`--recrawl` turned them into
|
|
18
|
+
* redirects, errors, …) are not evidence that the template changed, so
|
|
19
|
+
* they must not dilute the old half of the majority — otherwise an old
|
|
20
|
+
* 7-page cluster whose 4 missing pages left 3 unchanged ones would fail
|
|
21
|
+
* `3 > 7/2` and be renamed for no reason.
|
|
22
|
+
*
|
|
23
|
+
* Page ids are the identity used for overlap (not URLs) because they are
|
|
24
|
+
* what `page_templates` stores and they survive `--append` / `--recrawl`
|
|
25
|
+
* without renumbering.
|
|
26
|
+
*
|
|
27
|
+
* ## Fresh labels
|
|
28
|
+
*
|
|
29
|
+
* Clusters left without an inherited label are numbered in page-count
|
|
30
|
+
* order (largest first, template key as a tie-break) so a first run reads
|
|
31
|
+
* naturally: `A` is the section's biggest template. Each takes the next
|
|
32
|
+
* ordinal **after every ordinal in `previousLabels` for its section**, so a
|
|
33
|
+
* letter is never re-issued to a different template — which would silently
|
|
34
|
+
* change what "events template B" means between two people's archives.
|
|
35
|
+
* That guarantee is only as good as `previousLabels`: `replacePageTemplates`
|
|
36
|
+
* keeps the rows of clusters that disappeared (retired labels) precisely so
|
|
37
|
+
* they stay in this set across any number of later runs.
|
|
38
|
+
*
|
|
39
|
+
* ## Section
|
|
40
|
+
*
|
|
41
|
+
* A cluster's section is the first path segment every member URL shares
|
|
42
|
+
* (`events` for `/events/...`). Members spread over several segments, or
|
|
43
|
+
* all at the site root, yield `null`: such a cluster is numbered in the
|
|
44
|
+
* site-wide sequence. An inherited label keeps its old section even if the
|
|
45
|
+
* cluster's members have since drifted — stability of the name wins over
|
|
46
|
+
* keeping the section literally accurate.
|
|
47
|
+
* @param params - See {@link AssignTemplateLabelsParams}.
|
|
48
|
+
* @returns Template key → label, one entry per cluster in `params.clusters`.
|
|
49
|
+
* @example
|
|
50
|
+
* ```ts
|
|
51
|
+
* const labels = assignTemplateLabels({
|
|
52
|
+
* clusters: new Map([['["path:events","cluster:0"]', { pageIds: [1, 2], urls: ['https://example.com/events/a', 'https://example.com/events/b'] }]]),
|
|
53
|
+
* previousMembership: new Map(),
|
|
54
|
+
* previousLabels: new Map(),
|
|
55
|
+
* });
|
|
56
|
+
* labels.get('["path:events","cluster:0"]'); // { section: 'events', ordinal: 1 }
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export function assignTemplateLabels(params) {
|
|
60
|
+
const { clusters, previousMembership, previousLabels } = params;
|
|
61
|
+
const currentPageIds = new Set();
|
|
62
|
+
for (const cluster of clusters.values()) {
|
|
63
|
+
for (const pageId of cluster.pageIds) {
|
|
64
|
+
currentPageIds.add(pageId);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const previousKeyByPageId = new Map();
|
|
68
|
+
const previousSizeByKey = new Map();
|
|
69
|
+
for (const [key, pageIds] of previousMembership) {
|
|
70
|
+
let size = 0;
|
|
71
|
+
for (const pageId of pageIds) {
|
|
72
|
+
previousKeyByPageId.set(pageId, key);
|
|
73
|
+
if (currentPageIds.has(pageId)) {
|
|
74
|
+
size += 1;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
previousSizeByKey.set(key, size);
|
|
78
|
+
}
|
|
79
|
+
// Every ordinal ever issued per section, seeded from the previous run so
|
|
80
|
+
// a vanished cluster's letter is retired rather than re-issued.
|
|
81
|
+
const usedOrdinals = new Map();
|
|
82
|
+
const markUsed = (label) => {
|
|
83
|
+
let set = usedOrdinals.get(label.section);
|
|
84
|
+
if (!set) {
|
|
85
|
+
set = new Set();
|
|
86
|
+
usedOrdinals.set(label.section, set);
|
|
87
|
+
}
|
|
88
|
+
set.add(label.ordinal);
|
|
89
|
+
};
|
|
90
|
+
for (const label of previousLabels.values()) {
|
|
91
|
+
markUsed(label);
|
|
92
|
+
}
|
|
93
|
+
const ordered = [...clusters].toSorted(([keyA, a], [keyB, b]) => b.pageIds.length - a.pageIds.length || keyA.localeCompare(keyB));
|
|
94
|
+
const labels = new Map();
|
|
95
|
+
const claimedPreviousKeys = new Set();
|
|
96
|
+
const unlabeled = [];
|
|
97
|
+
for (const entry of ordered) {
|
|
98
|
+
const [key, cluster] = entry;
|
|
99
|
+
const inherited = findInheritedLabel(cluster.pageIds, {
|
|
100
|
+
previousKeyByPageId,
|
|
101
|
+
previousSizeByKey,
|
|
102
|
+
previousLabels,
|
|
103
|
+
claimedPreviousKeys,
|
|
104
|
+
});
|
|
105
|
+
if (inherited) {
|
|
106
|
+
claimedPreviousKeys.add(inherited.previousKey);
|
|
107
|
+
labels.set(key, inherited.label);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
unlabeled.push(entry);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
for (const [key, cluster] of unlabeled) {
|
|
114
|
+
const section = deriveSection(cluster.urls);
|
|
115
|
+
const used = usedOrdinals.get(section);
|
|
116
|
+
const ordinal = used ? Math.max(...used) + 1 : 1;
|
|
117
|
+
const label = { section, ordinal };
|
|
118
|
+
markUsed(label);
|
|
119
|
+
labels.set(key, label);
|
|
120
|
+
}
|
|
121
|
+
return labels;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Finds the previous cluster whose label the given members inherit, if any
|
|
125
|
+
* — the unclaimed, labeled previous cluster sharing a mutual majority of
|
|
126
|
+
* pages with them.
|
|
127
|
+
* @param pageIds - The new cluster's member page ids.
|
|
128
|
+
* @param context - Lookups built once by `assignTemplateLabels`.
|
|
129
|
+
* @param context.previousKeyByPageId - Page id → previous template key.
|
|
130
|
+
* @param context.previousSizeByKey - Previous template key → member count.
|
|
131
|
+
* @param context.previousLabels - Previous template key → label.
|
|
132
|
+
* @param context.claimedPreviousKeys - Previous keys already inherited by a larger new cluster.
|
|
133
|
+
* @returns The matched previous key and its label, or `null`.
|
|
134
|
+
*/
|
|
135
|
+
function findInheritedLabel(pageIds, context) {
|
|
136
|
+
const overlapByKey = new Map();
|
|
137
|
+
for (const pageId of pageIds) {
|
|
138
|
+
const previousKey = context.previousKeyByPageId.get(pageId);
|
|
139
|
+
if (previousKey != null) {
|
|
140
|
+
overlapByKey.set(previousKey, (overlapByKey.get(previousKey) ?? 0) + 1);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
let best = null;
|
|
144
|
+
for (const [previousKey, overlap] of overlapByKey) {
|
|
145
|
+
if (!best || overlap > best.overlap) {
|
|
146
|
+
best = { previousKey, overlap };
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (!best || context.claimedPreviousKeys.has(best.previousKey)) {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
const label = context.previousLabels.get(best.previousKey);
|
|
153
|
+
if (!label) {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
const previousSize = context.previousSizeByKey.get(best.previousKey) ?? 0;
|
|
157
|
+
if (best.overlap * 2 <= pageIds.length || best.overlap * 2 <= previousSize) {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
return { previousKey: best.previousKey, label };
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* The first path segment shared by every URL, or `null` when they disagree
|
|
164
|
+
* or all sit at the site root. A URL that fails to parse counts as
|
|
165
|
+
* disagreeing — a cluster is not pinned to a section by guesswork.
|
|
166
|
+
* @param urls - The cluster's member page URLs.
|
|
167
|
+
* @returns The shared section name, or `null`.
|
|
168
|
+
*/
|
|
169
|
+
function deriveSection(urls) {
|
|
170
|
+
let section;
|
|
171
|
+
for (const url of urls) {
|
|
172
|
+
let segment;
|
|
173
|
+
try {
|
|
174
|
+
segment = new URL(url).pathname.split('/')[1] ?? '';
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
if (section === undefined) {
|
|
180
|
+
section = segment;
|
|
181
|
+
}
|
|
182
|
+
else if (section !== segment) {
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return section || null;
|
|
187
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ReplacePageTemplatesParams } from './types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Replaces the stored DOM-structure template classification with a freshly
|
|
5
|
+
* generated set.
|
|
6
|
+
*
|
|
7
|
+
* Every classified page is a full-archive, all-or-nothing recomputation
|
|
8
|
+
* (see `classifyPageTemplates`), so this always deletes
|
|
9
|
+
* every existing row before inserting the new set — there is no per-page
|
|
10
|
+
* incremental update path. A page whose URL can't be
|
|
11
|
+
* resolved back to a `content_items` row is silently skipped rather than
|
|
12
|
+
* treated as a hard failure: losing one page's template classification
|
|
13
|
+
* (e.g. a URL-normalization mismatch between the in-memory `Page.url.href`
|
|
14
|
+
* and the stored `url_refs.url`) should not discard the rest of a
|
|
15
|
+
* potentially multi-thousand-page classification run.
|
|
16
|
+
*
|
|
17
|
+
* `page_template_clusters` is always cleared alongside `page_templates`
|
|
18
|
+
* regardless of whether `clusterReasonsByTemplateKey` is passed — "no
|
|
19
|
+
* reason" must mean "not captured for this run", never "carry over the
|
|
20
|
+
* previous run's reason". Reason rows are inserted for every key in
|
|
21
|
+
* `clusterReasonsByTemplateKey` even if some have no surviving member page
|
|
22
|
+
* in `templateKeysByUrl` after URL-resolution skips above — harmless
|
|
23
|
+
* (nothing joins `page_template_clusters` back to `page_templates` by FK;
|
|
24
|
+
* see the table's own JSDoc), and simpler than cross-filtering the two maps.
|
|
25
|
+
*
|
|
26
|
+
* `page_template_labels` is the one table that is **not** wholesale
|
|
27
|
+
* replaced: the human-facing label of each new cluster is carried forward
|
|
28
|
+
* from whichever previous cluster it shares most pages with
|
|
29
|
+
* (`assignTemplateLabels`), which is what lets "events template B" keep
|
|
30
|
+
* meaning the same template across re-runs, and the rows of clusters that
|
|
31
|
+
* disappeared are kept as *retired* labels so their letters are never
|
|
32
|
+
* re-issued to a different template on a later run (only the rows for the
|
|
33
|
+
* keys being written, and the old row of a label that moved to a new key,
|
|
34
|
+
* are removed). Readers look labels up by the keys
|
|
35
|
+
* currently in `page_templates`, so retired rows are invisible to them.
|
|
36
|
+
* The previous `page_templates` and `page_template_labels` rows are read
|
|
37
|
+
* inside the same transaction that writes — there is no window in which
|
|
38
|
+
* another writer could change what the labels were derived from. An empty
|
|
39
|
+
* `templateKeysByUrl` therefore clears the classification but leaves every
|
|
40
|
+
* label row in place.
|
|
41
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
42
|
+
* @param params - See {@link ReplacePageTemplatesParams}.
|
|
43
|
+
*/
|
|
44
|
+
export declare function replacePageTemplates(knex: Knex, params: ReplacePageTemplatesParams): Promise<void>;
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { eachSplitted } from '../../utils/array/each-splitted.js';
|
|
2
|
+
import { compressPayload } from '../_shared/compress-payload.js';
|
|
3
|
+
import { assignTemplateLabels } from './assign-template-labels.js';
|
|
4
|
+
import { serializeTemplateClusterReason } from './serialize-template-cluster-reason.js';
|
|
5
|
+
/**
|
|
6
|
+
* Replaces the stored DOM-structure template classification with a freshly
|
|
7
|
+
* generated set.
|
|
8
|
+
*
|
|
9
|
+
* Every classified page is a full-archive, all-or-nothing recomputation
|
|
10
|
+
* (see `classifyPageTemplates`), so this always deletes
|
|
11
|
+
* every existing row before inserting the new set — there is no per-page
|
|
12
|
+
* incremental update path. A page whose URL can't be
|
|
13
|
+
* resolved back to a `content_items` row is silently skipped rather than
|
|
14
|
+
* treated as a hard failure: losing one page's template classification
|
|
15
|
+
* (e.g. a URL-normalization mismatch between the in-memory `Page.url.href`
|
|
16
|
+
* and the stored `url_refs.url`) should not discard the rest of a
|
|
17
|
+
* potentially multi-thousand-page classification run.
|
|
18
|
+
*
|
|
19
|
+
* `page_template_clusters` is always cleared alongside `page_templates`
|
|
20
|
+
* regardless of whether `clusterReasonsByTemplateKey` is passed — "no
|
|
21
|
+
* reason" must mean "not captured for this run", never "carry over the
|
|
22
|
+
* previous run's reason". Reason rows are inserted for every key in
|
|
23
|
+
* `clusterReasonsByTemplateKey` even if some have no surviving member page
|
|
24
|
+
* in `templateKeysByUrl` after URL-resolution skips above — harmless
|
|
25
|
+
* (nothing joins `page_template_clusters` back to `page_templates` by FK;
|
|
26
|
+
* see the table's own JSDoc), and simpler than cross-filtering the two maps.
|
|
27
|
+
*
|
|
28
|
+
* `page_template_labels` is the one table that is **not** wholesale
|
|
29
|
+
* replaced: the human-facing label of each new cluster is carried forward
|
|
30
|
+
* from whichever previous cluster it shares most pages with
|
|
31
|
+
* (`assignTemplateLabels`), which is what lets "events template B" keep
|
|
32
|
+
* meaning the same template across re-runs, and the rows of clusters that
|
|
33
|
+
* disappeared are kept as *retired* labels so their letters are never
|
|
34
|
+
* re-issued to a different template on a later run (only the rows for the
|
|
35
|
+
* keys being written, and the old row of a label that moved to a new key,
|
|
36
|
+
* are removed). Readers look labels up by the keys
|
|
37
|
+
* currently in `page_templates`, so retired rows are invisible to them.
|
|
38
|
+
* The previous `page_templates` and `page_template_labels` rows are read
|
|
39
|
+
* inside the same transaction that writes — there is no window in which
|
|
40
|
+
* another writer could change what the labels were derived from. An empty
|
|
41
|
+
* `templateKeysByUrl` therefore clears the classification but leaves every
|
|
42
|
+
* label row in place.
|
|
43
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
44
|
+
* @param params - See {@link ReplacePageTemplatesParams}.
|
|
45
|
+
*/
|
|
46
|
+
export async function replacePageTemplates(knex, params) {
|
|
47
|
+
const { templateKeysByUrl, clusterReasonsByTemplateKey } = params;
|
|
48
|
+
// Compressing every reason is pure CPU work independent of the DB — done
|
|
49
|
+
// before opening the transaction below so it doesn't extend how long the
|
|
50
|
+
// SQLite write-lock is held for.
|
|
51
|
+
const reasonRows = clusterReasonsByTemplateKey && clusterReasonsByTemplateKey.size > 0
|
|
52
|
+
? [...clusterReasonsByTemplateKey].map(([templateKey, reason]) => {
|
|
53
|
+
const { body, codec, sizeRaw, sizeStored } = compressPayload(Buffer.from(serializeTemplateClusterReason(reason), 'utf8'));
|
|
54
|
+
return {
|
|
55
|
+
template_key: templateKey,
|
|
56
|
+
member_count: reason.memberCount,
|
|
57
|
+
reason_json: body,
|
|
58
|
+
codec,
|
|
59
|
+
size_raw: sizeRaw,
|
|
60
|
+
size_stored: sizeStored,
|
|
61
|
+
};
|
|
62
|
+
})
|
|
63
|
+
: [];
|
|
64
|
+
await knex.transaction(async (trx) => {
|
|
65
|
+
// Resolve the new membership and read the previous one *before* the
|
|
66
|
+
// deletes below — label inheritance needs both sides.
|
|
67
|
+
const urls = [...templateKeysByUrl.keys()];
|
|
68
|
+
const pageIdByUrl = new Map();
|
|
69
|
+
await eachSplitted(urls, 500, async (chunk) => {
|
|
70
|
+
const pageRows = await trx('content_items')
|
|
71
|
+
.join('url_refs', 'url_refs.id', 'content_items.url_id')
|
|
72
|
+
.select('content_items.id as id', 'url_refs.url as url')
|
|
73
|
+
.whereIn('url_refs.url', chunk);
|
|
74
|
+
for (const row of pageRows) {
|
|
75
|
+
pageIdByUrl.set(row.url, row.id);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
const rows = [];
|
|
79
|
+
const clusters = new Map();
|
|
80
|
+
for (const [url, templateKey] of templateKeysByUrl) {
|
|
81
|
+
const pageId = pageIdByUrl.get(url);
|
|
82
|
+
if (pageId == null) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
rows.push({ page_id: pageId, template_key: templateKey });
|
|
86
|
+
let cluster = clusters.get(templateKey);
|
|
87
|
+
if (!cluster) {
|
|
88
|
+
cluster = { pageIds: [], urls: [] };
|
|
89
|
+
clusters.set(templateKey, cluster);
|
|
90
|
+
}
|
|
91
|
+
cluster.pageIds.push(pageId);
|
|
92
|
+
cluster.urls.push(url);
|
|
93
|
+
}
|
|
94
|
+
const previousLabels = await loadPreviousLabels(trx);
|
|
95
|
+
const labels = assignTemplateLabels({
|
|
96
|
+
clusters,
|
|
97
|
+
previousMembership: await loadPreviousMembership(trx),
|
|
98
|
+
previousLabels,
|
|
99
|
+
});
|
|
100
|
+
// Rows to drop: the keys being (re)written, plus previous keys whose
|
|
101
|
+
// label was inherited by a new key — the label moved, so its old row
|
|
102
|
+
// would otherwise linger as a duplicate of the same name.
|
|
103
|
+
const writtenPairs = new Set([...labels.values()].map(labelPair));
|
|
104
|
+
const staleKeys = [...labels.keys()];
|
|
105
|
+
for (const [previousKey, label] of previousLabels) {
|
|
106
|
+
if (!labels.has(previousKey) && writtenPairs.has(labelPair(label))) {
|
|
107
|
+
staleKeys.push(previousKey);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
await trx('page_templates').delete();
|
|
111
|
+
await trx('page_template_clusters').delete();
|
|
112
|
+
await eachSplitted(staleKeys, 500, async (chunk) => {
|
|
113
|
+
await trx('page_template_labels').whereIn('template_key', chunk).delete();
|
|
114
|
+
});
|
|
115
|
+
if (reasonRows.length > 0) {
|
|
116
|
+
await eachSplitted(reasonRows, 100, async (chunk) => {
|
|
117
|
+
await trx('page_template_clusters').insert(chunk);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
if (rows.length === 0) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
await eachSplitted(rows, 500, async (chunk) => {
|
|
124
|
+
await trx('page_templates').insert(chunk);
|
|
125
|
+
});
|
|
126
|
+
const labelRows = [...labels].map(([templateKey, label]) => ({
|
|
127
|
+
template_key: templateKey,
|
|
128
|
+
section: label.section,
|
|
129
|
+
ordinal: label.ordinal,
|
|
130
|
+
}));
|
|
131
|
+
await eachSplitted(labelRows, 500, async (chunk) => {
|
|
132
|
+
await trx('page_template_labels').insert(chunk);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* The identity of a label as a name: its `(section, ordinal)` pair.
|
|
138
|
+
* @param label - The label.
|
|
139
|
+
* @returns A string key unique per name.
|
|
140
|
+
*/
|
|
141
|
+
function labelPair(label) {
|
|
142
|
+
return `${label.section ?? '\0'}:${label.ordinal}`;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Reads the previous run's `page_templates` rows as template key → page ids.
|
|
146
|
+
* @param trx - The replacing transaction.
|
|
147
|
+
* @returns The previous membership; empty on a first run.
|
|
148
|
+
*/
|
|
149
|
+
async function loadPreviousMembership(trx) {
|
|
150
|
+
const previousRows = (await trx('page_templates').select('page_id as pageId', 'template_key as templateKey'));
|
|
151
|
+
const membership = new Map();
|
|
152
|
+
for (const row of previousRows) {
|
|
153
|
+
const pageIds = membership.get(row.templateKey);
|
|
154
|
+
if (pageIds) {
|
|
155
|
+
pageIds.push(row.pageId);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
membership.set(row.templateKey, [row.pageId]);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return membership;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Reads the previous run's `page_template_labels` rows.
|
|
165
|
+
* @param trx - The replacing transaction.
|
|
166
|
+
* @returns Template key → label; empty on a first run.
|
|
167
|
+
*/
|
|
168
|
+
async function loadPreviousLabels(trx) {
|
|
169
|
+
const labelRows = (await trx('page_template_labels').select('template_key as templateKey', 'section', 'ordinal'));
|
|
170
|
+
return new Map(labelRows.map((row) => [
|
|
171
|
+
row.templateKey,
|
|
172
|
+
{ section: row.section, ordinal: row.ordinal },
|
|
173
|
+
]));
|
|
174
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { TemplateClusterReason } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Serializes a cluster reason to the JSON text that `page_template_clusters.reason_json`
|
|
4
|
+
* stores (before compression). The single definition of that format:
|
|
5
|
+
* `replacePageTemplates` writes it, and the template-classification golden
|
|
6
|
+
* pins it, so a change here shows up as a golden difference instead of
|
|
7
|
+
* silently diverging from what the golden claims to cover.
|
|
8
|
+
* @param reason - The reason.
|
|
9
|
+
* @returns The JSON text.
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const json = serializeTemplateClusterReason(reason);
|
|
13
|
+
* const { body } = compressPayload(Buffer.from(json, 'utf8'));
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare function serializeTemplateClusterReason(reason: TemplateClusterReason): string;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serializes a cluster reason to the JSON text that `page_template_clusters.reason_json`
|
|
3
|
+
* stores (before compression). The single definition of that format:
|
|
4
|
+
* `replacePageTemplates` writes it, and the template-classification golden
|
|
5
|
+
* pins it, so a change here shows up as a golden difference instead of
|
|
6
|
+
* silently diverging from what the golden claims to cover.
|
|
7
|
+
* @param reason - The reason.
|
|
8
|
+
* @returns The JSON text.
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const json = serializeTemplateClusterReason(reason);
|
|
12
|
+
* const { body } = compressPayload(Buffer.from(json, 'utf8'));
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export function serializeTemplateClusterReason(reason) {
|
|
16
|
+
return JSON.stringify(reason);
|
|
17
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The six landmark types a cluster reason's `landmarks` recognizes.
|
|
3
|
+
*/
|
|
4
|
+
export type TemplateClusterLandmarkType = 'header' | 'footer' | 'nav' | 'aside' | 'form' | 'search';
|
|
5
|
+
/**
|
|
6
|
+
* Why a Pass-0 block (one of possibly several that merged into a final
|
|
7
|
+
* cluster) was formed — mirrors `@nitpicker/core`'s `TemplateBlockingReason`
|
|
8
|
+
* discriminated union.
|
|
9
|
+
*/
|
|
10
|
+
export type TemplateClusterBlockingReason = {
|
|
11
|
+
readonly kind: 'css';
|
|
12
|
+
readonly distinctiveStylesheetHrefs: readonly string[];
|
|
13
|
+
} | {
|
|
14
|
+
readonly kind: 'path';
|
|
15
|
+
readonly pathKey: string;
|
|
16
|
+
} | {
|
|
17
|
+
readonly kind: 'orphanMerge';
|
|
18
|
+
readonly pathKey: string;
|
|
19
|
+
};
|
|
20
|
+
/** One block's blocking key and the reason it was formed. */
|
|
21
|
+
export interface TemplateClusterBlockingEvidence {
|
|
22
|
+
readonly blockKey: string;
|
|
23
|
+
readonly reason: TemplateClusterBlockingReason;
|
|
24
|
+
}
|
|
25
|
+
/** How common one landmark type is across a cluster's member pages. */
|
|
26
|
+
export interface TemplateClusterLandmarkProfile {
|
|
27
|
+
readonly presenceRate: number;
|
|
28
|
+
readonly chromeRate: number;
|
|
29
|
+
readonly shellTokens: readonly string[];
|
|
30
|
+
readonly memberCountWithInstance: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* A copy of the classifier's reason shape (`@nitpicker/core`'s
|
|
34
|
+
* `TemplateClusterReason`, built by `createTemplateClassificationRun`). Kept
|
|
35
|
+
* independent of it (rather than importing its type directly) because this
|
|
36
|
+
* is the persisted contract of `page_template_clusters.reason` that
|
|
37
|
+
* `@nitpicker/query` and the browser-side viewer build type values against,
|
|
38
|
+
* and removing or retyping a field in core's shape surfaces as a compile
|
|
39
|
+
* error at the assignment in `classifyPageTemplates` instead of silently
|
|
40
|
+
* changing what older archives are read as. A field core *adds* is not
|
|
41
|
+
* caught there (structural assignability) and is persisted as-is in the
|
|
42
|
+
* JSON blob; mirror it here and in `@nitpicker/query`'s
|
|
43
|
+
* `isTemplateClusterReason` when it should be read back. Core's reason is
|
|
44
|
+
* structurally assignable to this type.
|
|
45
|
+
*/
|
|
46
|
+
export interface TemplateClusterReason {
|
|
47
|
+
readonly memberCount: number;
|
|
48
|
+
readonly blocking: readonly TemplateClusterBlockingEvidence[];
|
|
49
|
+
readonly structuralCoreTokens: readonly string[];
|
|
50
|
+
readonly landmarks: Partial<Record<TemplateClusterLandmarkType, TemplateClusterLandmarkProfile>>;
|
|
51
|
+
readonly siblingClusterKeys: readonly string[];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The human-facing name of one template cluster, as stored in
|
|
55
|
+
* `page_template_labels`: rendered as `<section> template <letter>` (or
|
|
56
|
+
* `template <letter>` when `section` is `null`), where the letter is
|
|
57
|
+
* `ordinal` in A, B, …, Z, AA, AB, … form. Assigned by
|
|
58
|
+
* {@link import('./assign-template-labels.js').assignTemplateLabels}.
|
|
59
|
+
*/
|
|
60
|
+
export interface TemplateLabel {
|
|
61
|
+
/**
|
|
62
|
+
* The top-level URL directory every member page sits under (`events` for
|
|
63
|
+
* `/events/...`), or `null` when members span several directories or all
|
|
64
|
+
* sit at the site root — the label is then numbered site-wide.
|
|
65
|
+
*/
|
|
66
|
+
readonly section: string | null;
|
|
67
|
+
/** 1-based position within `section`'s label sequence. */
|
|
68
|
+
readonly ordinal: number;
|
|
69
|
+
}
|
|
70
|
+
/** One cluster's membership as {@link import('./assign-template-labels.js').assignTemplateLabels} sees it. */
|
|
71
|
+
export interface TemplateLabelClusterInput {
|
|
72
|
+
/** Resolved `content_items.id` of every member page. */
|
|
73
|
+
readonly pageIds: readonly number[];
|
|
74
|
+
/** URL of every member page, for deriving {@link TemplateLabel.section}. */
|
|
75
|
+
readonly urls: readonly string[];
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Params for {@link import('./assign-template-labels.js').assignTemplateLabels}.
|
|
79
|
+
*/
|
|
80
|
+
export interface AssignTemplateLabelsParams {
|
|
81
|
+
/** The new classification: template key → members. */
|
|
82
|
+
readonly clusters: ReadonlyMap<string, TemplateLabelClusterInput>;
|
|
83
|
+
/**
|
|
84
|
+
* The previous classification's `page_templates` rows: template key →
|
|
85
|
+
* member page ids. Empty on a first run.
|
|
86
|
+
*/
|
|
87
|
+
readonly previousMembership: ReadonlyMap<string, readonly number[]>;
|
|
88
|
+
/** The previous classification's `page_template_labels` rows. Empty on a first run. */
|
|
89
|
+
readonly previousLabels: ReadonlyMap<string, TemplateLabel>;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Params for {@link import('./replace-page-templates.js').replacePageTemplates}.
|
|
93
|
+
*/
|
|
94
|
+
export interface ReplacePageTemplatesParams {
|
|
95
|
+
/** Page URL → template key, as produced by `classifyPageTemplates`. */
|
|
96
|
+
readonly templateKeysByUrl: ReadonlyMap<string, string>;
|
|
97
|
+
/**
|
|
98
|
+
* Template key → page-cluster's cluster-selection evidence for
|
|
99
|
+
* that key, as produced by `classifyPageTemplates`. Omitted entirely (not
|
|
100
|
+
* just empty) when the caller didn't request reasons.
|
|
101
|
+
*/
|
|
102
|
+
readonly clusterReasonsByTemplateKey?: ReadonlyMap<string, TemplateClusterReason>;
|
|
103
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/lib/debug.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Debug logger for the archive package. Namespace: `Nitpicker:Utils:Archive`. */
|
|
2
|
+
export declare const log: import("debug").Debugger;
|
|
3
|
+
/** Debug logger for archive save operations. Namespace: `Nitpicker:Utils:Archive:Save`. */
|
|
4
|
+
export declare const saveLog: import("debug").Debugger;
|
|
5
|
+
/** Debug logger for database operations. Namespace: `Nitpicker:Utils:Archive:DB`. */
|
|
6
|
+
export declare const dbLog: import("debug").Debugger;
|
|
7
|
+
/** Debug logger for archive errors. Namespace: `Nitpicker:Utils:Archive:Error`. */
|
|
8
|
+
export declare const errorLog: import("debug").Debugger;
|
package/lib/debug.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { log as globalLog } from './utils/debug.js';
|
|
2
|
+
/** Debug logger for the archive package. Namespace: `Nitpicker:Utils:Archive`. */
|
|
3
|
+
export const log = globalLog.extend('Archive');
|
|
4
|
+
/** Debug logger for archive save operations. Namespace: `Nitpicker:Utils:Archive:Save`. */
|
|
5
|
+
export const saveLog = log.extend('Save');
|
|
6
|
+
/** Debug logger for database operations. Namespace: `Nitpicker:Utils:Archive:DB`. */
|
|
7
|
+
export const dbLog = log.extend('DB');
|
|
8
|
+
/** Debug logger for archive errors. Namespace: `Nitpicker:Utils:Archive:Error`. */
|
|
9
|
+
export const errorLog = log.extend('Error');
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decodes a stored HTML body BLOB according to its codec marker. The codec
|
|
3
|
+
* column on `page_html_blobs` records which encoding was applied at write
|
|
4
|
+
* time so individual rows can be migrated to a different compression without
|
|
5
|
+
* a table-wide rewrite.
|
|
6
|
+
*
|
|
7
|
+
* Decodes the bytes alone, so an error names no row; a reader that knows the
|
|
8
|
+
* page (`getHtmlOfPageById`, the 0.13 migration's `populate-image-items.ts`)
|
|
9
|
+
* decodes through `decodePageHtmlBlobBytes` instead, which names the page and
|
|
10
|
+
* the blob hash.
|
|
11
|
+
* @param body - Raw bytes as stored in `page_html_blobs.body`.
|
|
12
|
+
* @param codec - The `codec` column value (e.g. `'zstd'`, `'none'`).
|
|
13
|
+
* @returns The decoded HTML string.
|
|
14
|
+
* @throws {Error} If the codec is not recognised, or a zstd blob decompresses past `MAX_DECODED_SNAPSHOT_BYTES`.
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* const html = decodeStoredBlob(row.body, row.codec);
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function decodeStoredBlob(body: Uint8Array, codec: string): string;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { decodeStoredBlobBytes } from './decode-stored-blob-bytes.js';
|
|
2
|
+
/**
|
|
3
|
+
* Decodes a stored HTML body BLOB according to its codec marker. The codec
|
|
4
|
+
* column on `page_html_blobs` records which encoding was applied at write
|
|
5
|
+
* time so individual rows can be migrated to a different compression without
|
|
6
|
+
* a table-wide rewrite.
|
|
7
|
+
*
|
|
8
|
+
* Decodes the bytes alone, so an error names no row; a reader that knows the
|
|
9
|
+
* page (`getHtmlOfPageById`, the 0.13 migration's `populate-image-items.ts`)
|
|
10
|
+
* decodes through `decodePageHtmlBlobBytes` instead, which names the page and
|
|
11
|
+
* the blob hash.
|
|
12
|
+
* @param body - Raw bytes as stored in `page_html_blobs.body`.
|
|
13
|
+
* @param codec - The `codec` column value (e.g. `'zstd'`, `'none'`).
|
|
14
|
+
* @returns The decoded HTML string.
|
|
15
|
+
* @throws {Error} If the codec is not recognised, or a zstd blob decompresses past `MAX_DECODED_SNAPSHOT_BYTES`.
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* const html = decodeStoredBlob(row.body, row.codec);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export function decodeStoredBlob(body, codec) {
|
|
22
|
+
return decodeStoredBlobBytes(body, codec).toString('utf8');
|
|
23
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decodes a page's stored HTML snapshot to its UTF-8 bytes, as
|
|
3
|
+
* {@link decodeStoredBlobBytes} does, naming the page and the blob when it
|
|
4
|
+
* cannot be decoded (corrupt zstd data, a zstd blob that decompresses past
|
|
5
|
+
* `MAX_DECODED_SNAPSHOT_BYTES`, or an unknown codec). The decoder sees only
|
|
6
|
+
* the bytes, so without the page and hash its error points at no row.
|
|
7
|
+
* @param row - The page and the `page_html_blobs` row it references.
|
|
8
|
+
* @param row.pageId - The page's id.
|
|
9
|
+
* @param row.hash - `page_html_blobs.hash`.
|
|
10
|
+
* @param row.body - `page_html_blobs.body`.
|
|
11
|
+
* @param row.codec - `page_html_blobs.codec`.
|
|
12
|
+
* @returns The HTML as UTF-8 bytes.
|
|
13
|
+
* @throws {Error} `HTML snapshot of page <id> (page_html_blobs hash <hex>) could not be decoded: <reason>`,
|
|
14
|
+
* with the decoder's error as its `cause`.
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* const html = decodePageHtmlBlobBytes({ pageId, hash, body, codec }).toString('utf8');
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function decodePageHtmlBlobBytes(row: {
|
|
21
|
+
readonly pageId: number;
|
|
22
|
+
readonly hash: Uint8Array;
|
|
23
|
+
readonly body: Uint8Array;
|
|
24
|
+
readonly codec: string;
|
|
25
|
+
}): Buffer;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { decodeStoredBlobBytes } from './decode-stored-blob-bytes.js';
|
|
2
|
+
/**
|
|
3
|
+
* Decodes a page's stored HTML snapshot to its UTF-8 bytes, as
|
|
4
|
+
* {@link decodeStoredBlobBytes} does, naming the page and the blob when it
|
|
5
|
+
* cannot be decoded (corrupt zstd data, a zstd blob that decompresses past
|
|
6
|
+
* `MAX_DECODED_SNAPSHOT_BYTES`, or an unknown codec). The decoder sees only
|
|
7
|
+
* the bytes, so without the page and hash its error points at no row.
|
|
8
|
+
* @param row - The page and the `page_html_blobs` row it references.
|
|
9
|
+
* @param row.pageId - The page's id.
|
|
10
|
+
* @param row.hash - `page_html_blobs.hash`.
|
|
11
|
+
* @param row.body - `page_html_blobs.body`.
|
|
12
|
+
* @param row.codec - `page_html_blobs.codec`.
|
|
13
|
+
* @returns The HTML as UTF-8 bytes.
|
|
14
|
+
* @throws {Error} `HTML snapshot of page <id> (page_html_blobs hash <hex>) could not be decoded: <reason>`,
|
|
15
|
+
* with the decoder's error as its `cause`.
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* const html = decodePageHtmlBlobBytes({ pageId, hash, body, codec }).toString('utf8');
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export function decodePageHtmlBlobBytes(row) {
|
|
22
|
+
try {
|
|
23
|
+
return decodeStoredBlobBytes(row.body, row.codec);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
27
|
+
throw new Error(`HTML snapshot of page ${row.pageId} (page_html_blobs hash ${Buffer.from(row.hash).toString('hex')}) could not be decoded: ${reason}`, { cause: error });
|
|
28
|
+
}
|
|
29
|
+
}
|