@nitpicker/archive 0.0.0 → 0.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +106 -0
- package/lib/apply-connection-pragmas.d.ts +18 -0
- package/lib/apply-connection-pragmas.js +40 -0
- package/lib/archive-accessor.d.ts +265 -0
- package/lib/archive-accessor.js +477 -0
- package/lib/archive-lock.d.ts +45 -0
- package/lib/archive-lock.js +154 -0
- package/lib/archive.d.ts +736 -0
- package/lib/archive.js +1055 -0
- package/lib/body-hash/compute-body-hash.d.ts +32 -0
- package/lib/body-hash/compute-body-hash.js +35 -0
- package/lib/cache/clear-archive-cache-entry.d.ts +18 -0
- package/lib/cache/clear-archive-cache-entry.js +24 -0
- package/lib/cache/clear-archive-cache-root.d.ts +26 -0
- package/lib/cache/clear-archive-cache-root.js +32 -0
- package/lib/cache/compute-archive-cache-key.d.ts +39 -0
- package/lib/cache/compute-archive-cache-key.js +95 -0
- package/lib/cache/extract-archive-to-cache.d.ts +57 -0
- package/lib/cache/extract-archive-to-cache.js +326 -0
- package/lib/cache/get-archive-cache-root.d.ts +20 -0
- package/lib/cache/get-archive-cache-root.js +53 -0
- package/lib/cache/is-archive-cache-disabled.d.ts +24 -0
- package/lib/cache/is-archive-cache-disabled.js +34 -0
- package/lib/cache/list-archive-cache-entries.d.ts +23 -0
- package/lib/cache/list-archive-cache-entries.js +130 -0
- package/lib/cache/path-exists.d.ts +9 -0
- package/lib/cache/path-exists.js +18 -0
- package/lib/cache/resolve-archive-cache-dir.d.ts +26 -0
- package/lib/cache/resolve-archive-cache-dir.js +32 -0
- package/lib/cache/types.d.ts +33 -0
- package/lib/cache/types.js +1 -0
- package/lib/content-type/is-html-content-type.d.ts +17 -0
- package/lib/content-type/is-html-content-type.js +19 -0
- package/lib/content-type/normalize-content-type.d.ts +14 -0
- package/lib/content-type/normalize-content-type.js +20 -0
- package/lib/create-adjunct-tables.d.ts +66 -0
- package/lib/create-adjunct-tables.js +510 -0
- package/lib/create-entity-tables.d.ts +191 -0
- package/lib/create-entity-tables.js +387 -0
- package/lib/create-progress-reporter.d.ts +30 -0
- package/lib/create-progress-reporter.js +38 -0
- package/lib/create-ref-tables.d.ts +35 -0
- package/lib/create-ref-tables.js +185 -0
- package/lib/create-template-tables.d.ts +28 -0
- package/lib/create-template-tables.js +92 -0
- package/lib/database.d.ts +549 -0
- package/lib/database.js +803 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.d.ts +27 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.js +35 -0
- package/lib/db-ops/_shared/compress-payload.d.ts +26 -0
- package/lib/db-ops/_shared/compress-payload.js +30 -0
- package/lib/db-ops/_shared/create-write-ref-caches.d.ts +17 -0
- package/lib/db-ops/_shared/create-write-ref-caches.js +27 -0
- package/lib/db-ops/_shared/decode-json-ref.d.ts +17 -0
- package/lib/db-ops/_shared/decode-json-ref.js +31 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.d.ts +49 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.js +69 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.d.ts +20 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.js +53 -0
- package/lib/db-ops/_shared/resolve-content-item-id.d.ts +62 -0
- package/lib/db-ops/_shared/resolve-content-item-id.js +143 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.d.ts +23 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.js +29 -0
- package/lib/db-ops/_shared/retry-setting.d.ts +16 -0
- package/lib/db-ops/_shared/retry-setting.js +18 -0
- package/lib/db-ops/_shared/safe-parse-json.d.ts +11 -0
- package/lib/db-ops/_shared/safe-parse-json.js +18 -0
- package/lib/db-ops/_shared/types.d.ts +94 -0
- package/lib/db-ops/_shared/types.js +1 -0
- package/lib/db-ops/_shared/upsert-blob-ref.d.ts +25 -0
- package/lib/db-ops/_shared/upsert-blob-ref.js +48 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.d.ts +30 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.js +45 -0
- package/lib/db-ops/_shared/upsert-json-ref.d.ts +22 -0
- package/lib/db-ops/_shared/upsert-json-ref.js +41 -0
- package/lib/db-ops/_shared/upsert-response-headers.d.ts +35 -0
- package/lib/db-ops/_shared/upsert-response-headers.js +49 -0
- package/lib/db-ops/_shared/upsert-url-ref.d.ts +39 -0
- package/lib/db-ops/_shared/upsert-url-ref.js +62 -0
- package/lib/db-ops/anchors/get-anchors-on-page.d.ts +10 -0
- package/lib/db-ops/anchors/get-anchors-on-page.js +21 -0
- package/lib/db-ops/config/get-base-url.d.ts +8 -0
- package/lib/db-ops/config/get-base-url.js +14 -0
- package/lib/db-ops/config/get-config.d.ts +10 -0
- package/lib/db-ops/config/get-config.js +29 -0
- package/lib/db-ops/config/get-created-cwd.d.ts +11 -0
- package/lib/db-ops/config/get-created-cwd.js +13 -0
- package/lib/db-ops/config/get-name.d.ts +8 -0
- package/lib/db-ops/config/get-name.js +14 -0
- package/lib/db-ops/config/info-column-allowlist.d.ts +7 -0
- package/lib/db-ops/config/info-column-allowlist.js +29 -0
- package/lib/db-ops/config/info-json-columns.d.ts +5 -0
- package/lib/db-ops/config/info-json-columns.js +11 -0
- package/lib/db-ops/config/set-config.d.ts +12 -0
- package/lib/db-ops/config/set-config.js +21 -0
- package/lib/db-ops/config/update-config.d.ts +17 -0
- package/lib/db-ops/config/update-config.js +36 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.d.ts +19 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.js +30 -0
- package/lib/db-ops/console-logs/replace-console-logs.d.ts +34 -0
- package/lib/db-ops/console-logs/replace-console-logs.js +123 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.d.ts +16 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.js +26 -0
- package/lib/db-ops/console-logs/types.d.ts +38 -0
- package/lib/db-ops/console-logs/types.js +1 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.d.ts +29 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.js +52 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.d.ts +18 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.js +23 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.d.ts +12 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.js +15 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.d.ts +14 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.js +30 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.d.ts +57 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.js +87 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.d.ts +21 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.js +27 -0
- package/lib/db-ops/errors/insert-crawl-error.d.ts +15 -0
- package/lib/db-ops/errors/insert-crawl-error.js +21 -0
- package/lib/db-ops/errors/insert-page-error.d.ts +21 -0
- package/lib/db-ops/errors/insert-page-error.js +30 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.d.ts +33 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.js +158 -0
- package/lib/db-ops/html/read-page-html-blob.d.ts +17 -0
- package/lib/db-ops/html/read-page-html-blob.js +20 -0
- package/lib/db-ops/lifecycle/checkpoint.d.ts +8 -0
- package/lib/db-ops/lifecycle/checkpoint.js +9 -0
- package/lib/db-ops/lifecycle/destroy.d.ts +6 -0
- package/lib/db-ops/lifecycle/destroy.js +7 -0
- package/lib/db-ops/lifecycle/init.d.ts +58 -0
- package/lib/db-ops/lifecycle/init.js +122 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.d.ts +22 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.js +41 -0
- package/lib/db-ops/meta/get-audios-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-audios-of-page.js +15 -0
- package/lib/db-ops/meta/get-buttons-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-buttons-of-page.js +15 -0
- package/lib/db-ops/meta/get-canvases-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-canvases-of-page.js +15 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.js +15 -0
- package/lib/db-ops/meta/get-headings-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-headings-of-page.js +15 -0
- package/lib/db-ops/meta/get-iframes-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-iframes-of-page.js +15 -0
- package/lib/db-ops/meta/get-jsonld-of-page.d.ts +13 -0
- package/lib/db-ops/meta/get-jsonld-of-page.js +27 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.js +15 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.js +15 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.js +15 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.js +15 -0
- package/lib/db-ops/meta/get-videos-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-videos-of-page.js +15 -0
- package/lib/db-ops/outages/close-network-outage.d.ts +12 -0
- package/lib/db-ops/outages/close-network-outage.js +15 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.d.ts +26 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.js +42 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.d.ts +26 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.js +31 -0
- package/lib/db-ops/outages/insert-network-outage.d.ts +14 -0
- package/lib/db-ops/outages/insert-network-outage.js +29 -0
- package/lib/db-ops/outages/list-network-outages.d.ts +28 -0
- package/lib/db-ops/outages/list-network-outages.js +42 -0
- package/lib/db-ops/pages/order/set-url-order.d.ts +13 -0
- package/lib/db-ops/pages/order/set-url-order.js +38 -0
- package/lib/db-ops/pages/read/build-page-query.d.ts +18 -0
- package/lib/db-ops/pages/read/build-page-query.js +40 -0
- package/lib/db-ops/pages/read/get-crawling-state.d.ts +117 -0
- package/lib/db-ops/pages/read/get-crawling-state.js +161 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.d.ts +15 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.js +30 -0
- package/lib/db-ops/pages/read/get-page-count.d.ts +12 -0
- package/lib/db-ops/pages/read/get-page-count.js +21 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.d.ts +24 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.js +28 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.d.ts +38 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.js +107 -0
- package/lib/db-ops/pages/read/get-pages.d.ts +11 -0
- package/lib/db-ops/pages/read/get-pages.js +51 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.d.ts +18 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.js +25 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.d.ts +31 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.js +32 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.d.ts +20 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.js +37 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.d.ts +30 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.js +91 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.d.ts +88 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.js +216 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.d.ts +80 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.js +151 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.d.ts +24 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.js +24 -0
- package/lib/db-ops/pages/write/insert-audios.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-audios.js +25 -0
- package/lib/db-ops/pages/write/insert-buttons.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-buttons.js +29 -0
- package/lib/db-ops/pages/write/insert-canvases.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-canvases.js +26 -0
- package/lib/db-ops/pages/write/insert-custom-elements.d.ts +27 -0
- package/lib/db-ops/pages/write/insert-custom-elements.js +40 -0
- package/lib/db-ops/pages/write/insert-headings.d.ts +15 -0
- package/lib/db-ops/pages/write/insert-headings.js +27 -0
- package/lib/db-ops/pages/write/insert-iframes.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-iframes.js +28 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.d.ts +38 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.js +60 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.d.ts +36 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.js +48 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.d.ts +42 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.js +56 -0
- package/lib/db-ops/pages/write/insert-jsonld.d.ts +17 -0
- package/lib/db-ops/pages/write/insert-jsonld.js +49 -0
- package/lib/db-ops/pages/write/insert-main-content-images.d.ts +20 -0
- package/lib/db-ops/pages/write/insert-main-content-images.js +32 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.js +29 -0
- package/lib/db-ops/pages/write/insert-page.d.ts +56 -0
- package/lib/db-ops/pages/write/insert-page.js +259 -0
- package/lib/db-ops/pages/write/insert-technologies.d.ts +25 -0
- package/lib/db-ops/pages/write/insert-technologies.js +45 -0
- package/lib/db-ops/pages/write/insert-videos.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-videos.js +28 -0
- package/lib/db-ops/pages/write/link-redirect-sources.d.ts +42 -0
- package/lib/db-ops/pages/write/link-redirect-sources.js +101 -0
- package/lib/db-ops/pages/write/record-redirect.d.ts +35 -0
- package/lib/db-ops/pages/write/record-redirect.js +100 -0
- package/lib/db-ops/pages/write/set-skipped-page.d.ts +13 -0
- package/lib/db-ops/pages/write/set-skipped-page.js +24 -0
- package/lib/db-ops/pages/write/update-page.d.ts +40 -0
- package/lib/db-ops/pages/write/update-page.js +419 -0
- package/lib/db-ops/pages/write/write-page-html-blob.d.ts +19 -0
- package/lib/db-ops/pages/write/write-page-html-blob.js +41 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.d.ts +9 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.js +15 -0
- package/lib/db-ops/referrers/get-referrers-of-page.d.ts +17 -0
- package/lib/db-ops/referrers/get-referrers-of-page.js +32 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.d.ts +8 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.js +15 -0
- package/lib/db-ops/resources/build-resource-query.d.ts +25 -0
- package/lib/db-ops/resources/build-resource-query.js +29 -0
- package/lib/db-ops/resources/get-existing-resource-urls.d.ts +9 -0
- package/lib/db-ops/resources/get-existing-resource-urls.js +24 -0
- package/lib/db-ops/resources/get-resource-by-url.d.ts +13 -0
- package/lib/db-ops/resources/get-resource-by-url.js +22 -0
- package/lib/db-ops/resources/get-resource-url-list.d.ts +17 -0
- package/lib/db-ops/resources/get-resource-url-list.js +26 -0
- package/lib/db-ops/resources/get-resources.d.ts +8 -0
- package/lib/db-ops/resources/get-resources.js +11 -0
- package/lib/db-ops/resources/insert-inventory-resources.d.ts +24 -0
- package/lib/db-ops/resources/insert-inventory-resources.js +64 -0
- package/lib/db-ops/resources/insert-resource-referrers.d.ts +15 -0
- package/lib/db-ops/resources/insert-resource-referrers.js +54 -0
- package/lib/db-ops/resources/insert-resource.d.ts +34 -0
- package/lib/db-ops/resources/insert-resource.js +73 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.d.ts +26 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.js +30 -0
- package/lib/db-ops/templates/assign-template-labels.d.ts +60 -0
- package/lib/db-ops/templates/assign-template-labels.js +187 -0
- package/lib/db-ops/templates/replace-page-templates.d.ts +44 -0
- package/lib/db-ops/templates/replace-page-templates.js +174 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.d.ts +16 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.js +17 -0
- package/lib/db-ops/templates/types.d.ts +103 -0
- package/lib/db-ops/templates/types.js +1 -0
- package/lib/debug.d.ts +8 -0
- package/lib/debug.js +9 -0
- package/lib/decode-html-blob.d.ts +20 -0
- package/lib/decode-html-blob.js +23 -0
- package/lib/decode-page-html-blob-bytes.d.ts +25 -0
- package/lib/decode-page-html-blob-bytes.js +29 -0
- package/lib/decode-stored-blob-bytes.d.ts +25 -0
- package/lib/decode-stored-blob-bytes.js +47 -0
- package/lib/derive-lineage-from-parent.d.ts +37 -0
- package/lib/derive-lineage-from-parent.js +42 -0
- package/lib/drop-legacy-tables.d.ts +45 -0
- package/lib/drop-legacy-tables.js +56 -0
- package/lib/error-kind/classify-error-kind.d.ts +20 -0
- package/lib/error-kind/classify-error-kind.js +136 -0
- package/lib/error-kind/network-related-error-kinds.d.ts +23 -0
- package/lib/error-kind/network-related-error-kinds.js +28 -0
- package/lib/error-kind/permanent-error-kinds.d.ts +48 -0
- package/lib/error-kind/permanent-error-kinds.js +54 -0
- package/lib/error-kind/types.d.ts +54 -0
- package/lib/error-kind/types.js +1 -0
- package/lib/filesystem/append-text.d.ts +9 -0
- package/lib/filesystem/append-text.js +14 -0
- package/lib/filesystem/copy-dir-sync.d.ts +6 -0
- package/lib/filesystem/copy-dir-sync.js +9 -0
- package/lib/filesystem/copy-dir.d.ts +7 -0
- package/lib/filesystem/copy-dir.js +13 -0
- package/lib/filesystem/copy-file-with-progress.d.ts +20 -0
- package/lib/filesystem/copy-file-with-progress.js +34 -0
- package/lib/filesystem/exists.d.ts +6 -0
- package/lib/filesystem/exists.js +9 -0
- package/lib/filesystem/get-file-list.d.ts +8 -0
- package/lib/filesystem/get-file-list.js +12 -0
- package/lib/filesystem/is-dir.d.ts +6 -0
- package/lib/filesystem/is-dir.js +10 -0
- package/lib/filesystem/mkdir.d.ts +8 -0
- package/lib/filesystem/mkdir.js +15 -0
- package/lib/filesystem/output-binary.d.ts +12 -0
- package/lib/filesystem/output-binary.js +17 -0
- package/lib/filesystem/output-json.d.ts +9 -0
- package/lib/filesystem/output-json.js +14 -0
- package/lib/filesystem/output-text.d.ts +11 -0
- package/lib/filesystem/output-text.js +32 -0
- package/lib/filesystem/parse-pax-path.d.ts +18 -0
- package/lib/filesystem/parse-pax-path.js +45 -0
- package/lib/filesystem/parse-tar-size-field.d.ts +13 -0
- package/lib/filesystem/parse-tar-size-field.js +37 -0
- package/lib/filesystem/peek-tar-top-dir.d.ts +35 -0
- package/lib/filesystem/peek-tar-top-dir.js +215 -0
- package/lib/filesystem/read-json.d.ts +7 -0
- package/lib/filesystem/read-json.js +11 -0
- package/lib/filesystem/read-text.d.ts +6 -0
- package/lib/filesystem/read-text.js +10 -0
- package/lib/filesystem/readline.d.ts +11 -0
- package/lib/filesystem/readline.js +26 -0
- package/lib/filesystem/remove.d.ts +5 -0
- package/lib/filesystem/remove.js +10 -0
- package/lib/filesystem/rename.d.ts +16 -0
- package/lib/filesystem/rename.js +48 -0
- package/lib/filesystem/tar.d.ts +23 -0
- package/lib/filesystem/tar.js +78 -0
- package/lib/filesystem/untar.d.ts +33 -0
- package/lib/filesystem/untar.js +84 -0
- package/lib/get-failed-page-messages.d.ts +56 -0
- package/lib/get-failed-page-messages.js +146 -0
- package/lib/get-json.d.ts +10 -0
- package/lib/get-json.js +25 -0
- package/lib/html-snapshot/match-selector-html.d.ts +25 -0
- package/lib/html-snapshot/match-selector-html.js +28 -0
- package/lib/html-snapshot/match-selector-snapshots.d.ts +33 -0
- package/lib/html-snapshot/match-selector-snapshots.js +33 -0
- package/lib/html-snapshot/search-html-document.d.ts +29 -0
- package/lib/html-snapshot/search-html-document.js +27 -0
- package/lib/html-snapshot/search-html-snapshots.d.ts +36 -0
- package/lib/html-snapshot/search-html-snapshots.js +35 -0
- package/lib/html-snapshot/types.d.ts +111 -0
- package/lib/html-snapshot/types.js +7 -0
- package/lib/html-snapshot/validate-search-pattern.d.ts +15 -0
- package/lib/html-snapshot/validate-search-pattern.js +17 -0
- package/lib/init-schema.d.ts +48 -0
- package/lib/init-schema.js +124 -0
- package/lib/is-inventory-source.d.ts +21 -0
- package/lib/is-inventory-source.js +22 -0
- package/lib/is-within-outage-window.d.ts +49 -0
- package/lib/is-within-outage-window.js +33 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.d.ts +24 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.js +26 -0
- package/lib/libsql-dialect.d.ts +115 -0
- package/lib/libsql-dialect.js +116 -0
- package/lib/limited-page-ids.d.ts +9 -0
- package/lib/limited-page-ids.js +18 -0
- package/lib/meta/assert-compatible-version.d.ts +60 -0
- package/lib/meta/assert-compatible-version.js +93 -0
- package/lib/meta/classify-jsonld-type.d.ts +23 -0
- package/lib/meta/classify-jsonld-type.js +43 -0
- package/lib/meta/compare-semver.d.ts +23 -0
- package/lib/meta/compare-semver.js +51 -0
- package/lib/meta/compute-main-contents-denormalized.d.ts +41 -0
- package/lib/meta/compute-main-contents-denormalized.js +88 -0
- package/lib/meta/compute-page-denormalized.d.ts +20 -0
- package/lib/meta/compute-page-denormalized.js +35 -0
- package/lib/meta/derive-flat-from-meta.d.ts +34 -0
- package/lib/meta/derive-flat-from-meta.js +158 -0
- package/lib/meta/derive-meta-extras.d.ts +20 -0
- package/lib/meta/derive-meta-extras.js +23 -0
- package/lib/meta/extract-tags-for-archive.d.ts +17 -0
- package/lib/meta/extract-tags-for-archive.js +36 -0
- package/lib/meta/parse-main-content-class-list.d.ts +19 -0
- package/lib/meta/parse-main-content-class-list.js +34 -0
- package/lib/meta/summarize-jsonld.d.ts +17 -0
- package/lib/meta/summarize-jsonld.js +29 -0
- package/lib/meta/technologies/combine-technology-confidence.d.ts +46 -0
- package/lib/meta/technologies/combine-technology-confidence.js +93 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.d.ts +45 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.js +53 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.d.ts +33 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.js +46 -0
- package/lib/meta/technologies/extract-technologies-for-archive.d.ts +33 -0
- package/lib/meta/technologies/extract-technologies-for-archive.js +30 -0
- package/lib/meta/technologies/match-js-license-comment-signal.d.ts +21 -0
- package/lib/meta/technologies/match-js-license-comment-signal.js +23 -0
- package/lib/meta/technologies/match-structural-technology-signals.d.ts +26 -0
- package/lib/meta/technologies/match-structural-technology-signals.js +48 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.d.ts +25 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.js +35 -0
- package/lib/meta/technologies/technology-signal-definitions.d.ts +44 -0
- package/lib/meta/technologies/technology-signal-definitions.js +60 -0
- package/lib/meta/technologies/types.d.ts +70 -0
- package/lib/meta/technologies/types.js +13 -0
- package/lib/meta/types.d.ts +1490 -0
- package/lib/meta/types.js +65 -0
- package/lib/migrate-content-items-alias-of-id.d.ts +52 -0
- package/lib/migrate-content-items-alias-of-id.js +69 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.d.ts +46 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.js +62 -0
- package/lib/migrate-content-items-is-metadata-only.d.ts +44 -0
- package/lib/migrate-content-items-is-metadata-only.js +60 -0
- package/lib/migrate-entity-tables.d.ts +55 -0
- package/lib/migrate-entity-tables.js +66 -0
- package/lib/migrate-info-created-cwd.d.ts +17 -0
- package/lib/migrate-info-created-cwd.js +36 -0
- package/lib/migrate-info-main-content-selector.d.ts +16 -0
- package/lib/migrate-info-main-content-selector.js +35 -0
- package/lib/migrate-info-request-header-names.d.ts +16 -0
- package/lib/migrate-info-request-header-names.js +35 -0
- package/lib/migrate-info-roots.d.ts +20 -0
- package/lib/migrate-info-roots.js +52 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.d.ts +34 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.js +51 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.d.ts +25 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.js +44 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.d.ts +16 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.js +35 -0
- package/lib/migrate-main-contents-columns.d.ts +26 -0
- package/lib/migrate-main-contents-columns.js +61 -0
- package/lib/migrate-page-meta-body-hash.d.ts +44 -0
- package/lib/migrate-page-meta-body-hash.js +63 -0
- package/lib/migrate-page-meta-console-error-count.d.ts +27 -0
- package/lib/migrate-page-meta-console-error-count.js +45 -0
- package/lib/migrate-page-meta-custom-element-count.d.ts +33 -0
- package/lib/migrate-page-meta-custom-element-count.js +51 -0
- package/lib/migrate-page-meta-image-scan.d.ts +27 -0
- package/lib/migrate-page-meta-image-scan.js +52 -0
- package/lib/migrate-page-tags-to-page-technologies.d.ts +39 -0
- package/lib/migrate-page-tags-to-page-technologies.js +79 -0
- package/lib/migrate-ref-tables.d.ts +25 -0
- package/lib/migrate-ref-tables.js +38 -0
- package/lib/native-executor/check-native-executor-config.d.ts +17 -0
- package/lib/native-executor/check-native-executor-config.js +20 -0
- package/lib/page-meta-column-maps.d.ts +32 -0
- package/lib/page-meta-column-maps.js +43 -0
- package/lib/page.d.ts +546 -0
- package/lib/page.js +764 -0
- package/lib/peek-archive-lock.d.ts +40 -0
- package/lib/peek-archive-lock.js +62 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.d.ts +41 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.js +87 -0
- package/lib/populate-entity-tables/derive-dom-path.d.ts +35 -0
- package/lib/populate-entity-tables/derive-dom-path.js +72 -0
- package/lib/populate-entity-tables/is-blob-ref-value.d.ts +16 -0
- package/lib/populate-entity-tables/is-blob-ref-value.js +19 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.d.ts +66 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.js +96 -0
- package/lib/populate-entity-tables/populate-anchor-edges.d.ts +33 -0
- package/lib/populate-entity-tables/populate-anchor-edges.js +153 -0
- package/lib/populate-entity-tables/populate-content-items.d.ts +40 -0
- package/lib/populate-entity-tables/populate-content-items.js +141 -0
- package/lib/populate-entity-tables/populate-entities.d.ts +81 -0
- package/lib/populate-entity-tables/populate-entities.js +110 -0
- package/lib/populate-entity-tables/populate-image-items.d.ts +91 -0
- package/lib/populate-entity-tables/populate-image-items.js +226 -0
- package/lib/populate-entity-tables/populate-page-meta.d.ts +33 -0
- package/lib/populate-entity-tables/populate-page-meta.js +267 -0
- package/lib/populate-entity-tables/populate-resource-items.d.ts +22 -0
- package/lib/populate-entity-tables/populate-resource-items.js +114 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.d.ts +31 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.js +33 -0
- package/lib/populate-entity-tables/resolve-blob-refs.d.ts +31 -0
- package/lib/populate-entity-tables/resolve-blob-refs.js +100 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.d.ts +22 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.js +27 -0
- package/lib/populate-entity-tables/resolve-header-sets.d.ts +49 -0
- package/lib/populate-entity-tables/resolve-header-sets.js +122 -0
- package/lib/populate-entity-tables/resolve-json-refs.d.ts +25 -0
- package/lib/populate-entity-tables/resolve-json-refs.js +67 -0
- package/lib/populate-entity-tables/resolve-text-refs.d.ts +30 -0
- package/lib/populate-entity-tables/resolve-text-refs.js +61 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.d.ts +21 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.js +27 -0
- package/lib/populate-entity-tables/resolve-url-refs.d.ts +33 -0
- package/lib/populate-entity-tables/resolve-url-refs.js +60 -0
- package/lib/populate-entity-tables/test-utils/count-rows.d.ts +17 -0
- package/lib/populate-entity-tables/test-utils/count-rows.js +20 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.d.ts +25 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.js +42 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.d.ts +30 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.js +175 -0
- package/lib/populate-entity-tables/types.d.ts +157 -0
- package/lib/populate-entity-tables/types.js +12 -0
- package/lib/populate-entity-tables/upsert-text-refs.d.ts +38 -0
- package/lib/populate-entity-tables/upsert-text-refs.js +78 -0
- package/lib/populate-ref-tables/classify-content-type.d.ts +16 -0
- package/lib/populate-ref-tables/classify-content-type.js +52 -0
- package/lib/populate-ref-tables/compute-content-hash.d.ts +22 -0
- package/lib/populate-ref-tables/compute-content-hash.js +26 -0
- package/lib/populate-ref-tables/compute-header-flags.d.ts +16 -0
- package/lib/populate-ref-tables/compute-header-flags.js +70 -0
- package/lib/populate-ref-tables/content-type-rules.d.ts +38 -0
- package/lib/populate-ref-tables/content-type-rules.js +133 -0
- package/lib/populate-ref-tables/create-header-table-caches.d.ts +25 -0
- package/lib/populate-ref-tables/create-header-table-caches.js +49 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.d.ts +15 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.js +15 -0
- package/lib/populate-ref-tables/decode-data-uri.d.ts +21 -0
- package/lib/populate-ref-tables/decode-data-uri.js +126 -0
- package/lib/populate-ref-tables/decompose-header-set.d.ts +29 -0
- package/lib/populate-ref-tables/decompose-header-set.js +157 -0
- package/lib/populate-ref-tables/decompose-url.d.ts +25 -0
- package/lib/populate-ref-tables/decompose-url.js +70 -0
- package/lib/populate-ref-tables/header-stability.d.ts +19 -0
- package/lib/populate-ref-tables/header-stability.js +22 -0
- package/lib/populate-ref-tables/header-value-cache-key.d.ts +17 -0
- package/lib/populate-ref-tables/header-value-cache-key.js +19 -0
- package/lib/populate-ref-tables/normalize-mime.d.ts +24 -0
- package/lib/populate-ref-tables/normalize-mime.js +36 -0
- package/lib/populate-ref-tables/populate-blob-refs.d.ts +38 -0
- package/lib/populate-ref-tables/populate-blob-refs.js +134 -0
- package/lib/populate-ref-tables/populate-content-type-refs.d.ts +27 -0
- package/lib/populate-ref-tables/populate-content-type-refs.js +70 -0
- package/lib/populate-ref-tables/populate-header-tables.d.ts +35 -0
- package/lib/populate-ref-tables/populate-header-tables.js +80 -0
- package/lib/populate-ref-tables/populate-json-refs.d.ts +29 -0
- package/lib/populate-ref-tables/populate-json-refs.js +101 -0
- package/lib/populate-ref-tables/populate-refs.d.ts +51 -0
- package/lib/populate-ref-tables/populate-refs.js +62 -0
- package/lib/populate-ref-tables/populate-text-refs.d.ts +32 -0
- package/lib/populate-ref-tables/populate-text-refs.js +133 -0
- package/lib/populate-ref-tables/populate-url-refs.d.ts +28 -0
- package/lib/populate-ref-tables/populate-url-refs.js +148 -0
- package/lib/populate-ref-tables/test-utils/count-rows.d.ts +15 -0
- package/lib/populate-ref-tables/test-utils/count-rows.js +17 -0
- package/lib/populate-ref-tables/types.d.ts +197 -0
- package/lib/populate-ref-tables/types.js +7 -0
- package/lib/populate-ref-tables/upsert-one-header-set.d.ts +34 -0
- package/lib/populate-ref-tables/upsert-one-header-set.js +208 -0
- package/lib/populate-ref-tables/volatile-header-names.d.ts +20 -0
- package/lib/populate-ref-tables/volatile-header-names.js +33 -0
- package/lib/redirect-table.d.ts +9 -0
- package/lib/redirect-table.js +28 -0
- package/lib/release-finished-statements.d.ts +42 -0
- package/lib/release-finished-statements.js +45 -0
- package/lib/resolve-redirect-chain.d.ts +33 -0
- package/lib/resolve-redirect-chain.js +27 -0
- package/lib/resource.d.ts +46 -0
- package/lib/resource.js +62 -0
- package/lib/retarget-legacy-fk-tables.d.ts +61 -0
- package/lib/retarget-legacy-fk-tables.js +137 -0
- package/lib/safe-path.d.ts +9 -0
- package/lib/safe-path.js +17 -0
- package/lib/scope/build-scope-map.d.ts +21 -0
- package/lib/scope/build-scope-map.js +32 -0
- package/lib/scope/find-scope-entry.d.ts +25 -0
- package/lib/scope/find-scope-entry.js +45 -0
- package/lib/template-classification/classify-archive-page-templates.d.ts +42 -0
- package/lib/template-classification/classify-archive-page-templates.js +70 -0
- package/lib/template-classification/classify-page-templates.d.ts +33 -0
- package/lib/template-classification/classify-page-templates.js +60 -0
- package/lib/template-classification/collect-page-ids-with-html.d.ts +24 -0
- package/lib/template-classification/collect-page-ids-with-html.js +30 -0
- package/lib/template-classification/collect-page-stylesheet-urls.d.ts +32 -0
- package/lib/template-classification/collect-page-stylesheet-urls.js +132 -0
- package/lib/template-classification/create-content-root-hint.d.ts +41 -0
- package/lib/template-classification/create-content-root-hint.js +51 -0
- package/lib/template-classification/create-page-cluster-factory.d.ts +36 -0
- package/lib/template-classification/create-page-cluster-factory.js +52 -0
- package/lib/template-classification/load-page-cluster-candidates.d.ts +32 -0
- package/lib/template-classification/load-page-cluster-candidates.js +93 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.d.ts +34 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.js +236 -0
- package/lib/template-classification/page-cluster/types.d.ts +123 -0
- package/lib/template-classification/page-cluster/types.js +1 -0
- package/lib/template-classification/types.d.ts +234 -0
- package/lib/template-classification/types.js +1 -0
- package/lib/test-utils/build-full-schema-test-db.d.ts +34 -0
- package/lib/test-utils/build-full-schema-test-db.js +74 -0
- package/lib/test-utils/compare-strings.d.ts +12 -0
- package/lib/test-utils/compare-strings.js +14 -0
- package/lib/test-utils/create-legacy-analysis-tables.d.ts +13 -0
- package/lib/test-utils/create-legacy-analysis-tables.js +37 -0
- package/lib/test-utils/fk-parent-tables.d.ts +15 -0
- package/lib/test-utils/fk-parent-tables.js +19 -0
- package/lib/test-utils/seed-content-item.d.ts +35 -0
- package/lib/test-utils/seed-content-item.js +42 -0
- package/lib/test-utils/setup-legacy-fk-db.d.ts +34 -0
- package/lib/test-utils/setup-legacy-fk-db.js +271 -0
- package/lib/transfer/attach-source-database.d.ts +31 -0
- package/lib/transfer/attach-source-database.js +40 -0
- package/lib/transfer/build-split-config.d.ts +30 -0
- package/lib/transfer/build-split-config.js +42 -0
- package/lib/transfer/clear-replaced-page-rows.d.ts +23 -0
- package/lib/transfer/clear-replaced-page-rows.js +61 -0
- package/lib/transfer/concat-archives.d.ts +55 -0
- package/lib/transfer/concat-archives.js +95 -0
- package/lib/transfer/concat-source-transfer-phases.d.ts +10 -0
- package/lib/transfer/concat-source-transfer-phases.js +17 -0
- package/lib/transfer/content-item-rank-sql.d.ts +21 -0
- package/lib/transfer/content-item-rank-sql.js +23 -0
- package/lib/transfer/copy-anchor-edges.d.ts +28 -0
- package/lib/transfer/copy-anchor-edges.js +42 -0
- package/lib/transfer/copy-dictionaries-for-concat.d.ts +39 -0
- package/lib/transfer/copy-dictionaries-for-concat.js +81 -0
- package/lib/transfer/copy-dictionaries-for-split.d.ts +29 -0
- package/lib/transfer/copy-dictionaries-for-split.js +224 -0
- package/lib/transfer/copy-header-set-children.d.ts +27 -0
- package/lib/transfer/copy-header-set-children.js +51 -0
- package/lib/transfer/copy-image-items.d.ts +21 -0
- package/lib/transfer/copy-image-items.js +62 -0
- package/lib/transfer/copy-inventory-source-lists.d.ts +30 -0
- package/lib/transfer/copy-inventory-source-lists.js +61 -0
- package/lib/transfer/copy-journal-tables.d.ts +30 -0
- package/lib/transfer/copy-journal-tables.js +56 -0
- package/lib/transfer/copy-page-console-logs.d.ts +16 -0
- package/lib/transfer/copy-page-console-logs.js +27 -0
- package/lib/transfer/copy-page-html-blobs.d.ts +31 -0
- package/lib/transfer/copy-page-html-blobs.js +43 -0
- package/lib/transfer/copy-page-meta.d.ts +27 -0
- package/lib/transfer/copy-page-meta.js +68 -0
- package/lib/transfer/copy-page-template-clusters.d.ts +31 -0
- package/lib/transfer/copy-page-template-clusters.js +56 -0
- package/lib/transfer/copy-page-template-labels.d.ts +34 -0
- package/lib/transfer/copy-page-template-labels.js +88 -0
- package/lib/transfer/copy-resource-items.d.ts +29 -0
- package/lib/transfer/copy-resource-items.js +89 -0
- package/lib/transfer/copy-resource-ref-edges.d.ts +20 -0
- package/lib/transfer/copy-resource-ref-edges.js +33 -0
- package/lib/transfer/copy-simple-page-scoped-tables.d.ts +15 -0
- package/lib/transfer/copy-simple-page-scoped-tables.js +34 -0
- package/lib/transfer/count-external-pages-in-scope.d.ts +26 -0
- package/lib/transfer/count-external-pages-in-scope.js +40 -0
- package/lib/transfer/create-transfer-temp-tables.d.ts +30 -0
- package/lib/transfer/create-transfer-temp-tables.js +59 -0
- package/lib/transfer/dictionary-copy-specs.d.ts +32 -0
- package/lib/transfer/dictionary-copy-specs.js +28 -0
- package/lib/transfer/drop-transfer-temp-tables.d.ts +9 -0
- package/lib/transfer/drop-transfer-temp-tables.js +18 -0
- package/lib/transfer/flatten-redirect-chains.d.ts +44 -0
- package/lib/transfer/flatten-redirect-chains.js +74 -0
- package/lib/transfer/insert-content-items.d.ts +35 -0
- package/lib/transfer/insert-content-items.js +116 -0
- package/lib/transfer/list-transfer-columns.d.ts +35 -0
- package/lib/transfer/list-transfer-columns.js +45 -0
- package/lib/transfer/mark-in-scope-content-items.d.ts +31 -0
- package/lib/transfer/mark-in-scope-content-items.js +54 -0
- package/lib/transfer/merge-archive-configs.d.ts +51 -0
- package/lib/transfer/merge-archive-configs.js +85 -0
- package/lib/transfer/plan-content-items-for-concat.d.ts +33 -0
- package/lib/transfer/plan-content-items-for-concat.js +51 -0
- package/lib/transfer/plan-content-items-for-split.d.ts +42 -0
- package/lib/transfer/plan-content-items-for-split.js +83 -0
- package/lib/transfer/plan-resource-items.d.ts +40 -0
- package/lib/transfer/plan-resource-items.js +69 -0
- package/lib/transfer/quote-transfer-identifier.d.ts +18 -0
- package/lib/transfer/quote-transfer-identifier.js +20 -0
- package/lib/transfer/reclassify-resource-externality.d.ts +37 -0
- package/lib/transfer/reclassify-resource-externality.js +66 -0
- package/lib/transfer/remap-redirect-dest-ids.d.ts +34 -0
- package/lib/transfer/remap-redirect-dest-ids.js +51 -0
- package/lib/transfer/replace-content-items.d.ts +39 -0
- package/lib/transfer/replace-content-items.js +83 -0
- package/lib/transfer/simple-page-scoped-tables.d.ts +25 -0
- package/lib/transfer/simple-page-scoped-tables.js +38 -0
- package/lib/transfer/split-archive.d.ts +55 -0
- package/lib/transfer/split-archive.js +98 -0
- package/lib/transfer/split-source-transfer-phases.d.ts +11 -0
- package/lib/transfer/split-source-transfer-phases.js +18 -0
- package/lib/transfer/transfer-action.d.ts +34 -0
- package/lib/transfer/transfer-action.js +32 -0
- package/lib/transfer/transfer-archive-rows.d.ts +65 -0
- package/lib/transfer/transfer-archive-rows.js +156 -0
- package/lib/transfer/transfer-dictionary-tables.d.ts +12 -0
- package/lib/transfer/transfer-dictionary-tables.js +22 -0
- package/lib/transfer/transfer-post-phases.d.ts +10 -0
- package/lib/transfer/transfer-post-phases.js +13 -0
- package/lib/transfer/transfer-source-alias.d.ts +9 -0
- package/lib/transfer/transfer-source-alias.js +9 -0
- package/lib/transfer/types.d.ts +111 -0
- package/lib/transfer/types.js +35 -0
- package/lib/types.d.ts +772 -0
- package/lib/types.js +1 -0
- package/lib/url-alias/compute-tier-a-alias-key.d.ts +44 -0
- package/lib/url-alias/compute-tier-a-alias-key.js +47 -0
- package/lib/url-alias/compute-tier-b-alias-key.d.ts +23 -0
- package/lib/url-alias/compute-tier-b-alias-key.js +26 -0
- package/lib/url-alias/group-alias-candidates.d.ts +27 -0
- package/lib/url-alias/group-alias-candidates.js +29 -0
- package/lib/url-alias/types.d.ts +12 -0
- package/lib/url-alias/types.js +1 -0
- package/lib/url-pattern/compute-shape-key.d.ts +58 -0
- package/lib/url-pattern/compute-shape-key.js +129 -0
- package/lib/url-pattern/decompose-url.d.ts +33 -0
- package/lib/url-pattern/decompose-url.js +79 -0
- package/lib/url-pattern/reconstruct-url.d.ts +15 -0
- package/lib/url-pattern/reconstruct-url.js +33 -0
- package/lib/url-sort/compute-url-sort-ranks.d.ts +30 -0
- package/lib/url-sort/compute-url-sort-ranks.js +33 -0
- package/lib/utils/array/each-splitted.d.ts +10 -0
- package/lib/utils/array/each-splitted.js +14 -0
- package/lib/utils/debug.d.ts +8 -0
- package/lib/utils/debug.js +8 -0
- package/lib/utils/error/emit-error-with-retry.d.ts +40 -0
- package/lib/utils/error/emit-error-with-retry.js +44 -0
- package/lib/utils/error/emit-error.d.ts +39 -0
- package/lib/utils/error/emit-error.js +41 -0
- package/lib/utils/object/parse-response-headers.d.ts +12 -0
- package/lib/utils/object/parse-response-headers.js +26 -0
- package/lib/utils/object/redact-request-headers.d.ts +15 -0
- package/lib/utils/object/redact-request-headers.js +27 -0
- package/lib/utils/types/types.d.ts +383 -0
- package/lib/utils/types/types.js +1 -0
- package/lib/verify-migration/capture-rejection.d.ts +24 -0
- package/lib/verify-migration/capture-rejection.js +31 -0
- package/lib/verify-migration/check-anchor-edges-count.d.ts +34 -0
- package/lib/verify-migration/check-anchor-edges-count.js +72 -0
- package/lib/verify-migration/check-anchor-edges-sum.d.ts +13 -0
- package/lib/verify-migration/check-anchor-edges-sum.js +27 -0
- package/lib/verify-migration/check-content-items-count.d.ts +16 -0
- package/lib/verify-migration/check-content-items-count.js +30 -0
- package/lib/verify-migration/check-content-type-preservation.d.ts +22 -0
- package/lib/verify-migration/check-content-type-preservation.js +40 -0
- package/lib/verify-migration/check-foreign-key-integrity.d.ts +31 -0
- package/lib/verify-migration/check-foreign-key-integrity.js +47 -0
- package/lib/verify-migration/check-image-items-count.d.ts +12 -0
- package/lib/verify-migration/check-image-items-count.js +26 -0
- package/lib/verify-migration/check-page-meta-count.d.ts +15 -0
- package/lib/verify-migration/check-page-meta-count.js +31 -0
- package/lib/verify-migration/check-reader-parity.d.ts +23 -0
- package/lib/verify-migration/check-reader-parity.js +182 -0
- package/lib/verify-migration/check-resource-items-count.d.ts +17 -0
- package/lib/verify-migration/check-resource-items-count.js +33 -0
- package/lib/verify-migration/check-url-round-trip.d.ts +43 -0
- package/lib/verify-migration/check-url-round-trip.js +112 -0
- package/lib/verify-migration/types.d.ts +70 -0
- package/lib/verify-migration/types.js +63 -0
- package/lib/verify-migration/verify-migration.d.ts +41 -0
- package/lib/verify-migration/verify-migration.js +120 -0
- package/lib/with-bulk-write-pragmas.d.ts +51 -0
- package/lib/with-bulk-write-pragmas.js +132 -0
- package/lib/write-queue.d.ts +32 -0
- package/lib/write-queue.js +55 -0
- package/package.json +350 -3
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { computeContentHash } from './compute-content-hash.js';
|
|
2
|
+
import { computeHeaderFlags } from './compute-header-flags.js';
|
|
3
|
+
import { headerValueCacheKey } from './header-value-cache-key.js';
|
|
4
|
+
/**
|
|
5
|
+
* Rows inserted per INSERT statement into `header_set_entries`. Each row
|
|
6
|
+
* binds 5 params so 500 rows = 2500 params — safely under SQLite's
|
|
7
|
+
* default variable limit.
|
|
8
|
+
*/
|
|
9
|
+
const ENTRY_INSERT_CHUNK_SIZE = 500;
|
|
10
|
+
/**
|
|
11
|
+
* Upserts one decomposed header set and its entries + flags, returning
|
|
12
|
+
* the `header_sets.id`. Shared by the bulk archive populate
|
|
13
|
+
* ({@link ./populate-header-tables.ts}) and the crawler's per-response
|
|
14
|
+
* write path, so both produce byte-identical header rows for the same
|
|
15
|
+
* raw `responseHeaders` value.
|
|
16
|
+
*
|
|
17
|
+
* Set-id resolution order:
|
|
18
|
+
*
|
|
19
|
+
* 1. `raw_json_hash` cache — same JSON key ordering as a previous row.
|
|
20
|
+
* 2. `raw_hash` cache — same sorted-entries identity, different JSON key
|
|
21
|
+
* ordering. This branch links the new `raw_json_hash` to the existing
|
|
22
|
+
* setId in the in-process map so subsequent same-JSON hits fast-path.
|
|
23
|
+
* 3. Otherwise INSERT a new `header_sets` row.
|
|
24
|
+
*
|
|
25
|
+
* Entries + flags are inserted once per `setId` per process (guarded by
|
|
26
|
+
* `setIdsProcessedThisRun`); already-inserted rows short-circuit
|
|
27
|
+
* cheaply, and preloaded-but-unprocessed setIds (partial prior run) get
|
|
28
|
+
* their entries / flags repaired via `INSERT OR IGNORE`.
|
|
29
|
+
* @param trx - Knex instance or transaction connected to the archive DB.
|
|
30
|
+
* @param decomposed - Result of `decomposeHeaderSet` (never `null` — the
|
|
31
|
+
* caller short-circuits null decompositions to `header_set_id = null`).
|
|
32
|
+
* @param caches - The in-process caches, mutated in place. Create via
|
|
33
|
+
* {@link ./create-header-table-caches.ts}.
|
|
34
|
+
* @returns The `header_sets.id` for this set.
|
|
35
|
+
* @example
|
|
36
|
+
* const decomposed = decomposeHeaderSet(rawJson);
|
|
37
|
+
* if (decomposed !== null) {
|
|
38
|
+
* const setId = await upsertOneHeaderSet(knex, decomposed, caches);
|
|
39
|
+
* }
|
|
40
|
+
*/
|
|
41
|
+
export async function upsertOneHeaderSet(trx, decomposed, caches) {
|
|
42
|
+
const rawJsonHashHex = decomposed.rawJsonHash.toString('hex');
|
|
43
|
+
const rawHashHex = decomposed.rawHash.toString('hex');
|
|
44
|
+
let setId = caches.setIdByRawJsonHash.get(rawJsonHashHex);
|
|
45
|
+
if (setId === undefined) {
|
|
46
|
+
setId = caches.setIdByRawHash.get(rawHashHex);
|
|
47
|
+
if (setId === undefined) {
|
|
48
|
+
setId = await insertHeaderSet(trx, decomposed);
|
|
49
|
+
caches.setIdByRawJsonHash.set(rawJsonHashHex, setId);
|
|
50
|
+
caches.setIdByRawHash.set(rawHashHex, setId);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// Same sorted-entries identity as an existing row, different JSON
|
|
54
|
+
// key ordering. Reuse the existing setId; the raw_json_hash of
|
|
55
|
+
// this variant has no persistent home in the 0.13 schema
|
|
56
|
+
// (raw_json_hash is UNIQUE per row) — linking it in the
|
|
57
|
+
// in-process map is enough for id resolution.
|
|
58
|
+
caches.setIdByRawJsonHash.set(rawJsonHashHex, setId);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (caches.setIdsProcessedThisRun.has(setId)) {
|
|
62
|
+
return setId;
|
|
63
|
+
}
|
|
64
|
+
const nameIds = await resolveNameIds(trx, decomposed.entries, caches.nameIdCache);
|
|
65
|
+
const valueIds = await resolveValueIds(trx, decomposed.entries, caches.valueIdCache);
|
|
66
|
+
const entryRows = decomposed.entries.map((entry, index) => ({
|
|
67
|
+
header_set_id: setId,
|
|
68
|
+
name_id: nameIds[index],
|
|
69
|
+
occurrence: entry.occurrence,
|
|
70
|
+
value_id: valueIds[index],
|
|
71
|
+
is_volatile: entry.isVolatile ? 1 : 0,
|
|
72
|
+
}));
|
|
73
|
+
for (let index = 0; index < entryRows.length; index += ENTRY_INSERT_CHUNK_SIZE) {
|
|
74
|
+
const chunk = entryRows.slice(index, index + ENTRY_INSERT_CHUNK_SIZE);
|
|
75
|
+
await trx('header_set_entries')
|
|
76
|
+
.insert(chunk)
|
|
77
|
+
.onConflict(['header_set_id', 'name_id', 'occurrence'])
|
|
78
|
+
.ignore();
|
|
79
|
+
}
|
|
80
|
+
const flags = computeHeaderFlags(decomposed.entries);
|
|
81
|
+
await trx('header_flags')
|
|
82
|
+
.insert({ header_set_id: setId, ...flags })
|
|
83
|
+
.onConflict('header_set_id')
|
|
84
|
+
.ignore();
|
|
85
|
+
caches.setIdsProcessedThisRun.add(setId);
|
|
86
|
+
return setId;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Inserts a new `header_sets` row and returns its id. Neither
|
|
90
|
+
* `raw_json_hash` nor `raw_hash` collided with an existing row when
|
|
91
|
+
* this is called — the caller has already checked both caches.
|
|
92
|
+
* @param trx - Knex instance.
|
|
93
|
+
* @param decomposed - Result of `decomposeHeaderSet`.
|
|
94
|
+
* @returns The newly-inserted `header_sets.id`.
|
|
95
|
+
*/
|
|
96
|
+
async function insertHeaderSet(trx, decomposed) {
|
|
97
|
+
const rows = await trx('header_sets')
|
|
98
|
+
.insert({
|
|
99
|
+
raw_json_hash: decomposed.rawJsonHash,
|
|
100
|
+
raw_hash: decomposed.rawHash,
|
|
101
|
+
stable_hash: decomposed.stableHash,
|
|
102
|
+
volatile_hash: decomposed.volatileHash,
|
|
103
|
+
entry_count: decomposed.entryCount,
|
|
104
|
+
stable_entry_count: decomposed.stableEntryCount,
|
|
105
|
+
})
|
|
106
|
+
.returning('id');
|
|
107
|
+
const first = rows[0];
|
|
108
|
+
if (first === undefined) {
|
|
109
|
+
throw new Error('upsertOneHeaderSet: header_sets INSERT returned no rows despite absent conflict');
|
|
110
|
+
}
|
|
111
|
+
return first.id;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Resolves the `name_id` for every entry in `entries`, inserting new
|
|
115
|
+
* names into `header_name_refs` as needed. Mutates `cache` with any new
|
|
116
|
+
* ids.
|
|
117
|
+
* @param trx - Knex instance.
|
|
118
|
+
* @param entries - Decomposed entries.
|
|
119
|
+
* @param cache - Name → id cache; mutated in place.
|
|
120
|
+
* @returns Parallel array of name ids (same order as `entries`).
|
|
121
|
+
*/
|
|
122
|
+
async function resolveNameIds(trx, entries, cache) {
|
|
123
|
+
const missing = new Set();
|
|
124
|
+
for (const entry of entries) {
|
|
125
|
+
if (!cache.has(entry.name)) {
|
|
126
|
+
missing.add(entry.name);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (missing.size > 0) {
|
|
130
|
+
const missingNames = [...missing];
|
|
131
|
+
// Chunked like the entries insert below: knex compiles a multi-row
|
|
132
|
+
// insert-with-onConflict into a compound SELECT, and SQLite rejects
|
|
133
|
+
// more than 500 compound terms per statement.
|
|
134
|
+
for (let index = 0; index < missingNames.length; index += ENTRY_INSERT_CHUNK_SIZE) {
|
|
135
|
+
const chunk = missingNames.slice(index, index + ENTRY_INSERT_CHUNK_SIZE);
|
|
136
|
+
await trx('header_name_refs')
|
|
137
|
+
.insert(chunk.map((name) => ({ name })))
|
|
138
|
+
.onConflict('name')
|
|
139
|
+
.ignore();
|
|
140
|
+
const inserted = await trx('header_name_refs')
|
|
141
|
+
.select('id', 'name')
|
|
142
|
+
.whereIn('name', chunk);
|
|
143
|
+
for (const row of inserted) {
|
|
144
|
+
cache.set(row.name, row.id);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return entries.map((entry) => {
|
|
149
|
+
const id = cache.get(entry.name);
|
|
150
|
+
if (id === undefined) {
|
|
151
|
+
throw new Error(`upsertOneHeaderSet: name_id not resolved for ${entry.name}`);
|
|
152
|
+
}
|
|
153
|
+
return id;
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Resolves the `value_id` for every entry in `entries`, inserting new
|
|
158
|
+
* values into `header_value_refs` as needed. Values are hashed once and
|
|
159
|
+
* deduped by `(hash, value)` per the 0.13 UNIQUE constraint.
|
|
160
|
+
*
|
|
161
|
+
* The read-back after INSERT narrows on `.whereIn('value', ...)` — the
|
|
162
|
+
* string values just written — instead of binding the Buffer hashes into
|
|
163
|
+
* a `WHERE hash IN (...)`: a Buffer[] IN would return the correct rows
|
|
164
|
+
* in theory but leans on libsql's BLOB-parameter round-trip behaviour,
|
|
165
|
+
* while string values compare reliably. The cache key still includes the
|
|
166
|
+
* hash, so hash-distinct entries stay disambiguated.
|
|
167
|
+
* @param trx - Knex instance.
|
|
168
|
+
* @param entries - Decomposed entries.
|
|
169
|
+
* @param cache - `hexHash|value → id` cache; mutated in place.
|
|
170
|
+
* @returns Parallel array of value ids (same order as `entries`).
|
|
171
|
+
*/
|
|
172
|
+
async function resolveValueIds(trx, entries, cache) {
|
|
173
|
+
const hashByEntryIndex = entries.map((entry) => computeContentHash(entry.value));
|
|
174
|
+
const missing = [];
|
|
175
|
+
const missingKeys = new Set();
|
|
176
|
+
for (const [i, entry] of entries.entries()) {
|
|
177
|
+
const hash = hashByEntryIndex[i];
|
|
178
|
+
const key = headerValueCacheKey(hash, entry.value);
|
|
179
|
+
if (!cache.has(key) && !missingKeys.has(key)) {
|
|
180
|
+
missing.push({ key, hash, value: entry.value });
|
|
181
|
+
missingKeys.add(key);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Chunked like the entries insert: knex compiles a multi-row
|
|
185
|
+
// insert-with-onConflict into a compound SELECT, and SQLite rejects
|
|
186
|
+
// more than 500 compound terms per statement.
|
|
187
|
+
for (let index = 0; index < missing.length; index += ENTRY_INSERT_CHUNK_SIZE) {
|
|
188
|
+
const chunk = missing.slice(index, index + ENTRY_INSERT_CHUNK_SIZE);
|
|
189
|
+
await trx('header_value_refs')
|
|
190
|
+
.insert(chunk.map(({ hash, value }) => ({ hash, value })))
|
|
191
|
+
.onConflict(['hash', 'value'])
|
|
192
|
+
.ignore();
|
|
193
|
+
const inserted = await trx('header_value_refs')
|
|
194
|
+
.select('id', 'hash', 'value')
|
|
195
|
+
.whereIn('value', chunk.map((m) => m.value));
|
|
196
|
+
for (const row of inserted) {
|
|
197
|
+
cache.set(headerValueCacheKey(Buffer.from(row.hash), row.value), row.id);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return entries.map((entry, i) => {
|
|
201
|
+
const key = headerValueCacheKey(hashByEntryIndex[i], entry.value);
|
|
202
|
+
const id = cache.get(key);
|
|
203
|
+
if (id === undefined) {
|
|
204
|
+
throw new Error(`upsertOneHeaderSet: value_id not resolved for ${entry.value.slice(0, 40)}…`);
|
|
205
|
+
}
|
|
206
|
+
return id;
|
|
207
|
+
});
|
|
208
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Header names — always lower-cased — that are EXCLUDED from `stable_hash`.
|
|
3
|
+
* These change on every response (timestamps / request IDs / cache
|
|
4
|
+
* telemetry) and would defeat the dedup goal if hashed alongside the
|
|
5
|
+
* stable set.
|
|
6
|
+
*
|
|
7
|
+
* `set-cookie` sits here because per-session cookies rotate constantly on
|
|
8
|
+
* authenticated sites — it is deliberately classified as volatile even
|
|
9
|
+
* though it is technically a stable security signal.
|
|
10
|
+
*
|
|
11
|
+
* Any header not in this set is
|
|
12
|
+
* treated as **stable** by {@link ./header-stability.ts:isVolatileHeader}
|
|
13
|
+
* — the safer default because a genuinely volatile header misclassified
|
|
14
|
+
* as stable only weakens dedup (its per-response values fork
|
|
15
|
+
* otherwise-identical stable profiles into separate `stable_hash`
|
|
16
|
+
* clusters), while a stable header misclassified as volatile would drop
|
|
17
|
+
* a meaningful signal from `stable_hash` and falsely cluster distinct
|
|
18
|
+
* header configurations together.
|
|
19
|
+
*/
|
|
20
|
+
export declare const VOLATILE_HEADER_NAMES: ReadonlySet<string>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Header names — always lower-cased — that are EXCLUDED from `stable_hash`.
|
|
3
|
+
* These change on every response (timestamps / request IDs / cache
|
|
4
|
+
* telemetry) and would defeat the dedup goal if hashed alongside the
|
|
5
|
+
* stable set.
|
|
6
|
+
*
|
|
7
|
+
* `set-cookie` sits here because per-session cookies rotate constantly on
|
|
8
|
+
* authenticated sites — it is deliberately classified as volatile even
|
|
9
|
+
* though it is technically a stable security signal.
|
|
10
|
+
*
|
|
11
|
+
* Any header not in this set is
|
|
12
|
+
* treated as **stable** by {@link ./header-stability.ts:isVolatileHeader}
|
|
13
|
+
* — the safer default because a genuinely volatile header misclassified
|
|
14
|
+
* as stable only weakens dedup (its per-response values fork
|
|
15
|
+
* otherwise-identical stable profiles into separate `stable_hash`
|
|
16
|
+
* clusters), while a stable header misclassified as volatile would drop
|
|
17
|
+
* a meaningful signal from `stable_hash` and falsely cluster distinct
|
|
18
|
+
* header configurations together.
|
|
19
|
+
*/
|
|
20
|
+
export const VOLATILE_HEADER_NAMES = new Set([
|
|
21
|
+
'date',
|
|
22
|
+
'expires',
|
|
23
|
+
'last-modified',
|
|
24
|
+
'etag',
|
|
25
|
+
'age',
|
|
26
|
+
'via',
|
|
27
|
+
'x-cache',
|
|
28
|
+
'cf-ray',
|
|
29
|
+
'x-request-id',
|
|
30
|
+
'set-cookie',
|
|
31
|
+
'server-timing',
|
|
32
|
+
'x-amz-request-id',
|
|
33
|
+
]);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Returns a Knex subquery builder that joins `content_items` with their
|
|
4
|
+
* redirect destinations (resolved via `url_refs` for both sides). When
|
|
5
|
+
* `includeNull` is true, also includes pages without redirects
|
|
6
|
+
* (self-referencing).
|
|
7
|
+
* @param includeNull - Whether to include non-redirected pages in the result. Defaults to `true`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function redirectTable(includeNull?: boolean): (qb: Knex.QueryBuilder<Record<string, unknown>, unknown>) => Promise<void>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns a Knex subquery builder that joins `content_items` with their
|
|
3
|
+
* redirect destinations (resolved via `url_refs` for both sides). When
|
|
4
|
+
* `includeNull` is true, also includes pages without redirects
|
|
5
|
+
* (self-referencing).
|
|
6
|
+
* @param includeNull - Whether to include non-redirected pages in the result. Defaults to `true`.
|
|
7
|
+
*/
|
|
8
|
+
export function redirectTable(includeNull = true) {
|
|
9
|
+
return async (qb) => {
|
|
10
|
+
const list = qb
|
|
11
|
+
.select('A.id as fromId', 'A_url.url as from', 'B_url.url as to', 'B.id as toId')
|
|
12
|
+
.from('content_items as A')
|
|
13
|
+
.join('url_refs as A_url', 'A.url_id', 'A_url.id')
|
|
14
|
+
.join('content_items as B', (j) => {
|
|
15
|
+
j.on('A.redirect_dest_id', '=', 'B.id').andOnNotNull('A.redirect_dest_id');
|
|
16
|
+
})
|
|
17
|
+
.join('url_refs as B_url', 'B.url_id', 'B_url.id');
|
|
18
|
+
if (includeNull) {
|
|
19
|
+
await list.union(async (qb) => {
|
|
20
|
+
await qb
|
|
21
|
+
.select('A.id as fromId', 'A_url.url as from', 'A_url.url as to', 'A.id as toId')
|
|
22
|
+
.from('content_items as A')
|
|
23
|
+
.join('url_refs as A_url', 'A.url_id', 'A_url.id')
|
|
24
|
+
.whereNull('A.redirect_dest_id');
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gives the event loop one turn so that the native memory of SQL statements
|
|
3
|
+
* that already finished is freed before the next statement runs.
|
|
4
|
+
*
|
|
5
|
+
* The libsql binding (`libsql-dialect.ts` runs Knex on it) keeps each
|
|
6
|
+
* statement's compiled program and bound values, and a `SELECT`'s row cursor
|
|
7
|
+
* with its in-memory sort / `GROUP BY` tree, until the JavaScript wrapper
|
|
8
|
+
* object is finalized. Node runs those N-API finalizers from a `setImmediate`,
|
|
9
|
+
* not inside garbage collection itself, so a loop that only ever awaits
|
|
10
|
+
* synchronous libsql calls (every Knex call on this driver resolves through
|
|
11
|
+
* promise microtasks, never through the macrotask queue) can collect the
|
|
12
|
+
* wrappers and still release nothing: the finalizers wait for a turn of the
|
|
13
|
+
* loop that the loop never gets. Measured on the viewer read model build
|
|
14
|
+
* (one transaction, one statement per 500-row chunk): the native side grew by
|
|
15
|
+
* hundreds of MiB per bulk-insert phase and only shrank at `COMMIT`; forcing
|
|
16
|
+
* garbage collection after every chunk did not change that, one turn of the
|
|
17
|
+
* event loop after every chunk did. `scripts/bench-read-model-build.mjs`
|
|
18
|
+
* reproduces both sides of that with `--gc` and `--regions` (see
|
|
19
|
+
* `scripts/README.md`).
|
|
20
|
+
*
|
|
21
|
+
* The rule for callers: a loop that runs statements awaits this once per
|
|
22
|
+
* iteration, after the iteration's statements. An iteration may run more
|
|
23
|
+
* than one statement (a chunk's `INSERT` and the upsert derived from it); the
|
|
24
|
+
* turn at its end releases all of them, and a statement that runs once
|
|
25
|
+
* outside any loop is released by the next loop's turn.
|
|
26
|
+
*
|
|
27
|
+
* Why not reuse one prepared statement per table instead: the row cursors of
|
|
28
|
+
* chunked `SELECT`s hold their sort trees the same way, and every bulk path
|
|
29
|
+
* goes through Knex, which prepares a new statement per call. One turn per
|
|
30
|
+
* iteration covers both, costs microseconds, and changes no SQL.
|
|
31
|
+
*
|
|
32
|
+
* Why not in `libsql-dialect.ts` for every query: a transaction that yields
|
|
33
|
+
* between statements is fine for the archive (one connection, no
|
|
34
|
+
* interleaving), but every caller would pay the turn, including per-request
|
|
35
|
+
* viewer queries that run one statement and hold nothing worth a turn.
|
|
36
|
+
* @example
|
|
37
|
+
* for (const chunk of chunks) {
|
|
38
|
+
* await trx('viewer_pages').insert(chunk);
|
|
39
|
+
* await releaseFinishedStatements();
|
|
40
|
+
* }
|
|
41
|
+
*/
|
|
42
|
+
export declare function releaseFinishedStatements(): Promise<void>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { setImmediate as nextTurn } from 'node:timers/promises';
|
|
2
|
+
/**
|
|
3
|
+
* Gives the event loop one turn so that the native memory of SQL statements
|
|
4
|
+
* that already finished is freed before the next statement runs.
|
|
5
|
+
*
|
|
6
|
+
* The libsql binding (`libsql-dialect.ts` runs Knex on it) keeps each
|
|
7
|
+
* statement's compiled program and bound values, and a `SELECT`'s row cursor
|
|
8
|
+
* with its in-memory sort / `GROUP BY` tree, until the JavaScript wrapper
|
|
9
|
+
* object is finalized. Node runs those N-API finalizers from a `setImmediate`,
|
|
10
|
+
* not inside garbage collection itself, so a loop that only ever awaits
|
|
11
|
+
* synchronous libsql calls (every Knex call on this driver resolves through
|
|
12
|
+
* promise microtasks, never through the macrotask queue) can collect the
|
|
13
|
+
* wrappers and still release nothing: the finalizers wait for a turn of the
|
|
14
|
+
* loop that the loop never gets. Measured on the viewer read model build
|
|
15
|
+
* (one transaction, one statement per 500-row chunk): the native side grew by
|
|
16
|
+
* hundreds of MiB per bulk-insert phase and only shrank at `COMMIT`; forcing
|
|
17
|
+
* garbage collection after every chunk did not change that, one turn of the
|
|
18
|
+
* event loop after every chunk did. `scripts/bench-read-model-build.mjs`
|
|
19
|
+
* reproduces both sides of that with `--gc` and `--regions` (see
|
|
20
|
+
* `scripts/README.md`).
|
|
21
|
+
*
|
|
22
|
+
* The rule for callers: a loop that runs statements awaits this once per
|
|
23
|
+
* iteration, after the iteration's statements. An iteration may run more
|
|
24
|
+
* than one statement (a chunk's `INSERT` and the upsert derived from it); the
|
|
25
|
+
* turn at its end releases all of them, and a statement that runs once
|
|
26
|
+
* outside any loop is released by the next loop's turn.
|
|
27
|
+
*
|
|
28
|
+
* Why not reuse one prepared statement per table instead: the row cursors of
|
|
29
|
+
* chunked `SELECT`s hold their sort trees the same way, and every bulk path
|
|
30
|
+
* goes through Knex, which prepares a new statement per call. One turn per
|
|
31
|
+
* iteration covers both, costs microseconds, and changes no SQL.
|
|
32
|
+
*
|
|
33
|
+
* Why not in `libsql-dialect.ts` for every query: a transaction that yields
|
|
34
|
+
* between statements is fine for the archive (one connection, no
|
|
35
|
+
* interleaving), but every caller would pay the turn, including per-request
|
|
36
|
+
* viewer queries that run one statement and hold nothing worth a turn.
|
|
37
|
+
* @example
|
|
38
|
+
* for (const chunk of chunks) {
|
|
39
|
+
* await trx('viewer_pages').insert(chunk);
|
|
40
|
+
* await releaseFinishedStatements();
|
|
41
|
+
* }
|
|
42
|
+
*/
|
|
43
|
+
export async function releaseFinishedStatements() {
|
|
44
|
+
await nextTurn();
|
|
45
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The destination of a redirect chain and the source URLs that point at it.
|
|
3
|
+
*/
|
|
4
|
+
export interface RedirectChain {
|
|
5
|
+
/** The final destination URL the chain lands on (normalised). */
|
|
6
|
+
destUrl: string;
|
|
7
|
+
/**
|
|
8
|
+
* The source URLs that redirect to {@link RedirectChain.destUrl}: the originally requested
|
|
9
|
+
* URL followed by every intermediate hop. Empty when the page was not
|
|
10
|
+
* redirected at all.
|
|
11
|
+
*/
|
|
12
|
+
sources: string[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Splits a page's redirect chain into its final destination and the list of
|
|
16
|
+
* source URLs that point at it.
|
|
17
|
+
*
|
|
18
|
+
* The archive stores redirects as edges: every source URL carries a
|
|
19
|
+
* `redirectDestId` pointing at the destination page, and only the destination
|
|
20
|
+
* holds content. This helper applies the shared convention — the last entry of
|
|
21
|
+
* `redirectPaths` is the destination, while the originally requested URL plus
|
|
22
|
+
* every intermediate hop are the sources. When the page was not redirected,
|
|
23
|
+
* the destination is the page URL itself and there are no sources.
|
|
24
|
+
*
|
|
25
|
+
* Used by both `Database.updatePage` (which renders and stores the
|
|
26
|
+
* destination) and `Database.recordRedirect` (the #73 convergence
|
|
27
|
+
* optimisation, which records the edge for a destination already rendered
|
|
28
|
+
* elsewhere without touching its content).
|
|
29
|
+
* @param pageUrl - The originally requested URL (normalised, without hash/auth).
|
|
30
|
+
* @param redirectPaths - The redirect hop URLs captured during fetch, in order.
|
|
31
|
+
* @returns The destination URL and the source URLs pointing to it.
|
|
32
|
+
*/
|
|
33
|
+
export declare function resolveRedirectChain(pageUrl: string, redirectPaths: readonly string[]): RedirectChain;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Splits a page's redirect chain into its final destination and the list of
|
|
3
|
+
* source URLs that point at it.
|
|
4
|
+
*
|
|
5
|
+
* The archive stores redirects as edges: every source URL carries a
|
|
6
|
+
* `redirectDestId` pointing at the destination page, and only the destination
|
|
7
|
+
* holds content. This helper applies the shared convention — the last entry of
|
|
8
|
+
* `redirectPaths` is the destination, while the originally requested URL plus
|
|
9
|
+
* every intermediate hop are the sources. When the page was not redirected,
|
|
10
|
+
* the destination is the page URL itself and there are no sources.
|
|
11
|
+
*
|
|
12
|
+
* Used by both `Database.updatePage` (which renders and stores the
|
|
13
|
+
* destination) and `Database.recordRedirect` (the #73 convergence
|
|
14
|
+
* optimisation, which records the edge for a destination already rendered
|
|
15
|
+
* elsewhere without touching its content).
|
|
16
|
+
* @param pageUrl - The originally requested URL (normalised, without hash/auth).
|
|
17
|
+
* @param redirectPaths - The redirect hop URLs captured during fetch, in order.
|
|
18
|
+
* @returns The destination URL and the source URLs pointing to it.
|
|
19
|
+
*/
|
|
20
|
+
export function resolveRedirectChain(pageUrl, redirectPaths) {
|
|
21
|
+
if (redirectPaths.length === 0) {
|
|
22
|
+
return { destUrl: pageUrl, sources: [] };
|
|
23
|
+
}
|
|
24
|
+
const paths = [...redirectPaths];
|
|
25
|
+
const destUrl = paths.pop();
|
|
26
|
+
return { destUrl, sources: [pageUrl, ...paths] };
|
|
27
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { ArchiveAccessor } from './archive-accessor.js';
|
|
2
|
+
import type { DB_Resource } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Represents a sub-resource (CSS, JS, image, font, etc.) stored in the archive.
|
|
5
|
+
*
|
|
6
|
+
* Provides access to the resource's HTTP metadata and referrer information.
|
|
7
|
+
* Instances are created by {@link ArchiveAccessor.getResources}.
|
|
8
|
+
*/
|
|
9
|
+
export default class Resource {
|
|
10
|
+
#private;
|
|
11
|
+
/**
|
|
12
|
+
* The content length of the resource in bytes, or null if unknown.
|
|
13
|
+
*/
|
|
14
|
+
get contentLength(): number | null;
|
|
15
|
+
/**
|
|
16
|
+
* The MIME content type of the resource (e.g., `"text/css"`, `"application/javascript"`), or null if unknown.
|
|
17
|
+
*/
|
|
18
|
+
get contentType(): string | null;
|
|
19
|
+
/**
|
|
20
|
+
* Whether this resource is hosted on an external domain.
|
|
21
|
+
*/
|
|
22
|
+
get isExternal(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* The HTTP response status code, or null if not yet fetched.
|
|
25
|
+
*/
|
|
26
|
+
get status(): number | null;
|
|
27
|
+
/**
|
|
28
|
+
* The HTTP response status text (e.g., `"OK"`, `"Not Found"`), or null if not yet fetched.
|
|
29
|
+
*/
|
|
30
|
+
get statusText(): string | null;
|
|
31
|
+
/**
|
|
32
|
+
* The URL of the resource.
|
|
33
|
+
*/
|
|
34
|
+
get url(): string | null;
|
|
35
|
+
/**
|
|
36
|
+
* Creates a new Resource instance.
|
|
37
|
+
* @param archive - The ArchiveAccessor used for querying referrer data.
|
|
38
|
+
* @param raw - The raw database row for this resource.
|
|
39
|
+
*/
|
|
40
|
+
constructor(archive: ArchiveAccessor, raw: DB_Resource);
|
|
41
|
+
/**
|
|
42
|
+
* Retrieves the page URLs that reference this resource.
|
|
43
|
+
* @returns An array of page URL strings that include or reference this resource.
|
|
44
|
+
*/
|
|
45
|
+
getReferrers(): Promise<string[]>;
|
|
46
|
+
}
|
package/lib/resource.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents a sub-resource (CSS, JS, image, font, etc.) stored in the archive.
|
|
3
|
+
*
|
|
4
|
+
* Provides access to the resource's HTTP metadata and referrer information.
|
|
5
|
+
* Instances are created by {@link ArchiveAccessor.getResources}.
|
|
6
|
+
*/
|
|
7
|
+
export default class Resource {
|
|
8
|
+
#archive;
|
|
9
|
+
#raw;
|
|
10
|
+
/**
|
|
11
|
+
* The content length of the resource in bytes, or null if unknown.
|
|
12
|
+
*/
|
|
13
|
+
get contentLength() {
|
|
14
|
+
return this.#raw.contentLength;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The MIME content type of the resource (e.g., `"text/css"`, `"application/javascript"`), or null if unknown.
|
|
18
|
+
*/
|
|
19
|
+
get contentType() {
|
|
20
|
+
return this.#raw.contentType;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Whether this resource is hosted on an external domain.
|
|
24
|
+
*/
|
|
25
|
+
get isExternal() {
|
|
26
|
+
return !!this.#raw.isExternal;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The HTTP response status code, or null if not yet fetched.
|
|
30
|
+
*/
|
|
31
|
+
get status() {
|
|
32
|
+
return this.#raw.status;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The HTTP response status text (e.g., `"OK"`, `"Not Found"`), or null if not yet fetched.
|
|
36
|
+
*/
|
|
37
|
+
get statusText() {
|
|
38
|
+
return this.#raw.statusText;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The URL of the resource.
|
|
42
|
+
*/
|
|
43
|
+
get url() {
|
|
44
|
+
return this.#raw.url;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Creates a new Resource instance.
|
|
48
|
+
* @param archive - The ArchiveAccessor used for querying referrer data.
|
|
49
|
+
* @param raw - The raw database row for this resource.
|
|
50
|
+
*/
|
|
51
|
+
constructor(archive, raw) {
|
|
52
|
+
this.#archive = archive;
|
|
53
|
+
this.#raw = raw;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Retrieves the page URLs that reference this resource.
|
|
57
|
+
* @returns An array of page URL strings that include or reference this resource.
|
|
58
|
+
*/
|
|
59
|
+
async getReferrers() {
|
|
60
|
+
return this.#archive.getReferrersOfResource(this.#raw.id);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Rewrites the FK declarations of the adjunct tables from the legacy
|
|
4
|
+
* `pages(id)` to `content_items(id)` by rebuilding each table, converts
|
|
5
|
+
* `page_tags` (if present) into `technology_signals` / `page_technologies`,
|
|
6
|
+
* AND drops the legacy `analysis_violations` / `analysis_text_refs` tables
|
|
7
|
+
* (analyze output that that no reader or writer uses).
|
|
8
|
+
* SQLite has no `ALTER TABLE … DROP CONSTRAINT`, so the only way to change
|
|
9
|
+
* an FK target is to recreate the table:
|
|
10
|
+
*
|
|
11
|
+
* 1. Stage each {@link RETARGET_TABLES} table's rows into a constraint-free
|
|
12
|
+
* `<table>__retarget` copy (`CREATE TABLE … AS SELECT *`) and drop the
|
|
13
|
+
* original, freeing its index names. `page_tags`, if present, is read
|
|
14
|
+
* into memory here too (converted via `convertLegacyPageTagsToInserts` —
|
|
15
|
+
* the same helper `migrate-page-tags-to-page-technologies.ts` uses for
|
|
16
|
+
* already-0.13+ archives) but NOT staged the same way: it has no
|
|
17
|
+
* current-schema table to retarget onto, so there is nothing to copy
|
|
18
|
+
* back — only something to drop, once its data lives in the tables
|
|
19
|
+
* from step 2.
|
|
20
|
+
* 2. Recreate every {@link RETARGET_TABLES} table through
|
|
21
|
+
* {@link createAdjunctTables} — the same DDL fresh archives get, so
|
|
22
|
+
* migrated archives end up identical in shape and index naming.
|
|
23
|
+
* Rebuilding the DDL inline here instead would recreate the exact
|
|
24
|
+
* drift this function repairs. This same call also creates
|
|
25
|
+
* `technology_signals` / `page_technologies` (idempotent
|
|
26
|
+
* `hasTable`-guarded DDL — a no-op if a prior partial run already
|
|
27
|
+
* created them).
|
|
28
|
+
* 3. Copy the staged {@link RETARGET_TABLES} rows back using the recreated
|
|
29
|
+
* table's own column list (read via `pragma_table_info`). A column the
|
|
30
|
+
* canonical DDL has but the input archive lacks aborts the INSERT with
|
|
31
|
+
* a clear error — never a silent data drop. The converted `page_tags`
|
|
32
|
+
* signals/technologies are inserted here too, then `page_tags` itself
|
|
33
|
+
* is dropped (not recreated).
|
|
34
|
+
*
|
|
35
|
+
* A rename-based recipe (`ALTER TABLE x RENAME TO x__retarget`, skip
|
|
36
|
+
* copy #1) is deliberately NOT used: SQLite keeps the renamed table's
|
|
37
|
+
* indexes attached under their original names, which collide with the
|
|
38
|
+
* index names {@link createAdjunctTables} declares — and the old index
|
|
39
|
+
* names vary by the era of the archive's original provisioning, so
|
|
40
|
+
* dropping them first would require enumerating unknown names. The
|
|
41
|
+
* copy-out is cheap at these tables' scale (a handful of rows per page).
|
|
42
|
+
*
|
|
43
|
+
* Adjunct tables that do not exist on the input archive are simply created
|
|
44
|
+
* empty by step 2.
|
|
45
|
+
*
|
|
46
|
+
* The migrated-archive PK-preservation contract makes the copy safe:
|
|
47
|
+
* `content_items.id` reuses the legacy `pages.id` values verbatim, so
|
|
48
|
+
* every staged `pageId` / `page_id` resolves to the same row under the
|
|
49
|
+
* new FK target. Run inside a transaction with `PRAGMA foreign_keys = ON`
|
|
50
|
+
* so the copy-back doubles as a row-level FK validation — a stale id
|
|
51
|
+
* aborts the transaction here rather than surfacing later as a
|
|
52
|
+
* `foreign_key_check` finding.
|
|
53
|
+
* @param trx - Knex transaction on the archive being migrated
|
|
54
|
+
* (`scripts/migrate-to-0.13.mjs` is the caller).
|
|
55
|
+
* @example
|
|
56
|
+
* await db.transaction(async (trx) => {
|
|
57
|
+
* await retargetLegacyFkTables(trx);
|
|
58
|
+
* });
|
|
59
|
+
* // pragma_foreign_key_list('page_errors') now reports content_items.
|
|
60
|
+
*/
|
|
61
|
+
export declare function retargetLegacyFkTables(trx: Knex): Promise<void>;
|