@nitpicker/archive 0.0.0-stage → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +105 -2
- package/lib/apply-connection-pragmas.d.ts +18 -0
- package/lib/apply-connection-pragmas.js +40 -0
- package/lib/archive-accessor.d.ts +265 -0
- package/lib/archive-accessor.js +477 -0
- package/lib/archive-lock.d.ts +45 -0
- package/lib/archive-lock.js +154 -0
- package/lib/archive.d.ts +736 -0
- package/lib/archive.js +1056 -0
- package/lib/body-hash/compute-body-hash.d.ts +32 -0
- package/lib/body-hash/compute-body-hash.js +35 -0
- package/lib/cache/clear-archive-cache-entry.d.ts +18 -0
- package/lib/cache/clear-archive-cache-entry.js +24 -0
- package/lib/cache/clear-archive-cache-root.d.ts +26 -0
- package/lib/cache/clear-archive-cache-root.js +32 -0
- package/lib/cache/compute-archive-cache-key.d.ts +39 -0
- package/lib/cache/compute-archive-cache-key.js +95 -0
- package/lib/cache/extract-archive-to-cache.d.ts +57 -0
- package/lib/cache/extract-archive-to-cache.js +326 -0
- package/lib/cache/get-archive-cache-root.d.ts +20 -0
- package/lib/cache/get-archive-cache-root.js +53 -0
- package/lib/cache/is-archive-cache-disabled.d.ts +24 -0
- package/lib/cache/is-archive-cache-disabled.js +34 -0
- package/lib/cache/list-archive-cache-entries.d.ts +23 -0
- package/lib/cache/list-archive-cache-entries.js +130 -0
- package/lib/cache/path-exists.d.ts +9 -0
- package/lib/cache/path-exists.js +18 -0
- package/lib/cache/resolve-archive-cache-dir.d.ts +26 -0
- package/lib/cache/resolve-archive-cache-dir.js +32 -0
- package/lib/cache/types.d.ts +33 -0
- package/lib/cache/types.js +1 -0
- package/lib/content-type/is-html-content-type.d.ts +17 -0
- package/lib/content-type/is-html-content-type.js +19 -0
- package/lib/content-type/normalize-content-type.d.ts +14 -0
- package/lib/content-type/normalize-content-type.js +20 -0
- package/lib/create-adjunct-tables.d.ts +66 -0
- package/lib/create-adjunct-tables.js +510 -0
- package/lib/create-entity-tables.d.ts +191 -0
- package/lib/create-entity-tables.js +387 -0
- package/lib/create-progress-reporter.d.ts +30 -0
- package/lib/create-progress-reporter.js +38 -0
- package/lib/create-ref-tables.d.ts +35 -0
- package/lib/create-ref-tables.js +185 -0
- package/lib/create-template-tables.d.ts +28 -0
- package/lib/create-template-tables.js +92 -0
- package/lib/database.d.ts +549 -0
- package/lib/database.js +804 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.d.ts +27 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.js +35 -0
- package/lib/db-ops/_shared/compress-payload.d.ts +26 -0
- package/lib/db-ops/_shared/compress-payload.js +30 -0
- package/lib/db-ops/_shared/create-write-ref-caches.d.ts +17 -0
- package/lib/db-ops/_shared/create-write-ref-caches.js +27 -0
- package/lib/db-ops/_shared/decode-json-ref.d.ts +17 -0
- package/lib/db-ops/_shared/decode-json-ref.js +31 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.d.ts +49 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.js +69 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.d.ts +20 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.js +53 -0
- package/lib/db-ops/_shared/resolve-content-item-id.d.ts +62 -0
- package/lib/db-ops/_shared/resolve-content-item-id.js +143 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.d.ts +23 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.js +29 -0
- package/lib/db-ops/_shared/retry-setting.d.ts +16 -0
- package/lib/db-ops/_shared/retry-setting.js +18 -0
- package/lib/db-ops/_shared/safe-parse-json.d.ts +11 -0
- package/lib/db-ops/_shared/safe-parse-json.js +18 -0
- package/lib/db-ops/_shared/types.d.ts +94 -0
- package/lib/db-ops/_shared/types.js +1 -0
- package/lib/db-ops/_shared/upsert-blob-ref.d.ts +25 -0
- package/lib/db-ops/_shared/upsert-blob-ref.js +48 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.d.ts +30 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.js +45 -0
- package/lib/db-ops/_shared/upsert-json-ref.d.ts +22 -0
- package/lib/db-ops/_shared/upsert-json-ref.js +41 -0
- package/lib/db-ops/_shared/upsert-response-headers.d.ts +35 -0
- package/lib/db-ops/_shared/upsert-response-headers.js +49 -0
- package/lib/db-ops/_shared/upsert-url-ref.d.ts +39 -0
- package/lib/db-ops/_shared/upsert-url-ref.js +62 -0
- package/lib/db-ops/anchors/get-anchors-on-page.d.ts +10 -0
- package/lib/db-ops/anchors/get-anchors-on-page.js +21 -0
- package/lib/db-ops/config/get-base-url.d.ts +8 -0
- package/lib/db-ops/config/get-base-url.js +14 -0
- package/lib/db-ops/config/get-config.d.ts +10 -0
- package/lib/db-ops/config/get-config.js +29 -0
- package/lib/db-ops/config/get-created-cwd.d.ts +11 -0
- package/lib/db-ops/config/get-created-cwd.js +13 -0
- package/lib/db-ops/config/get-name.d.ts +8 -0
- package/lib/db-ops/config/get-name.js +14 -0
- package/lib/db-ops/config/info-column-allowlist.d.ts +7 -0
- package/lib/db-ops/config/info-column-allowlist.js +29 -0
- package/lib/db-ops/config/info-json-columns.d.ts +5 -0
- package/lib/db-ops/config/info-json-columns.js +11 -0
- package/lib/db-ops/config/set-config.d.ts +12 -0
- package/lib/db-ops/config/set-config.js +21 -0
- package/lib/db-ops/config/update-config.d.ts +17 -0
- package/lib/db-ops/config/update-config.js +36 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.d.ts +19 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.js +30 -0
- package/lib/db-ops/console-logs/replace-console-logs.d.ts +34 -0
- package/lib/db-ops/console-logs/replace-console-logs.js +123 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.d.ts +16 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.js +26 -0
- package/lib/db-ops/console-logs/types.d.ts +38 -0
- package/lib/db-ops/console-logs/types.js +1 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.d.ts +29 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.js +52 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.d.ts +18 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.js +23 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.d.ts +12 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.js +15 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.d.ts +14 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.js +30 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.d.ts +57 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.js +87 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.d.ts +21 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.js +27 -0
- package/lib/db-ops/errors/insert-crawl-error.d.ts +15 -0
- package/lib/db-ops/errors/insert-crawl-error.js +21 -0
- package/lib/db-ops/errors/insert-page-error.d.ts +21 -0
- package/lib/db-ops/errors/insert-page-error.js +30 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.d.ts +33 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.js +158 -0
- package/lib/db-ops/html/read-page-html-blob.d.ts +17 -0
- package/lib/db-ops/html/read-page-html-blob.js +20 -0
- package/lib/db-ops/lifecycle/checkpoint.d.ts +8 -0
- package/lib/db-ops/lifecycle/checkpoint.js +9 -0
- package/lib/db-ops/lifecycle/destroy.d.ts +6 -0
- package/lib/db-ops/lifecycle/destroy.js +7 -0
- package/lib/db-ops/lifecycle/init.d.ts +58 -0
- package/lib/db-ops/lifecycle/init.js +122 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.d.ts +22 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.js +41 -0
- package/lib/db-ops/meta/get-audios-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-audios-of-page.js +15 -0
- package/lib/db-ops/meta/get-buttons-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-buttons-of-page.js +15 -0
- package/lib/db-ops/meta/get-canvases-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-canvases-of-page.js +15 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.js +15 -0
- package/lib/db-ops/meta/get-headings-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-headings-of-page.js +15 -0
- package/lib/db-ops/meta/get-iframes-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-iframes-of-page.js +15 -0
- package/lib/db-ops/meta/get-jsonld-of-page.d.ts +13 -0
- package/lib/db-ops/meta/get-jsonld-of-page.js +27 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.js +15 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.js +15 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.js +15 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.js +15 -0
- package/lib/db-ops/meta/get-videos-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-videos-of-page.js +15 -0
- package/lib/db-ops/outages/close-network-outage.d.ts +12 -0
- package/lib/db-ops/outages/close-network-outage.js +15 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.d.ts +26 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.js +42 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.d.ts +26 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.js +31 -0
- package/lib/db-ops/outages/insert-network-outage.d.ts +14 -0
- package/lib/db-ops/outages/insert-network-outage.js +29 -0
- package/lib/db-ops/outages/list-network-outages.d.ts +28 -0
- package/lib/db-ops/outages/list-network-outages.js +42 -0
- package/lib/db-ops/pages/order/set-url-order.d.ts +13 -0
- package/lib/db-ops/pages/order/set-url-order.js +38 -0
- package/lib/db-ops/pages/read/build-page-query.d.ts +18 -0
- package/lib/db-ops/pages/read/build-page-query.js +40 -0
- package/lib/db-ops/pages/read/get-crawling-state.d.ts +117 -0
- package/lib/db-ops/pages/read/get-crawling-state.js +161 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.d.ts +15 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.js +30 -0
- package/lib/db-ops/pages/read/get-page-count.d.ts +12 -0
- package/lib/db-ops/pages/read/get-page-count.js +21 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.d.ts +24 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.js +28 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.d.ts +38 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.js +107 -0
- package/lib/db-ops/pages/read/get-pages.d.ts +11 -0
- package/lib/db-ops/pages/read/get-pages.js +51 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.d.ts +18 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.js +25 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.d.ts +31 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.js +32 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.d.ts +20 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.js +37 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.d.ts +30 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.js +91 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.d.ts +88 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.js +216 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.d.ts +80 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.js +151 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.d.ts +24 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.js +24 -0
- package/lib/db-ops/pages/write/insert-audios.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-audios.js +25 -0
- package/lib/db-ops/pages/write/insert-buttons.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-buttons.js +29 -0
- package/lib/db-ops/pages/write/insert-canvases.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-canvases.js +26 -0
- package/lib/db-ops/pages/write/insert-custom-elements.d.ts +27 -0
- package/lib/db-ops/pages/write/insert-custom-elements.js +40 -0
- package/lib/db-ops/pages/write/insert-headings.d.ts +15 -0
- package/lib/db-ops/pages/write/insert-headings.js +27 -0
- package/lib/db-ops/pages/write/insert-iframes.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-iframes.js +28 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.d.ts +38 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.js +60 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.d.ts +36 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.js +48 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.d.ts +42 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.js +56 -0
- package/lib/db-ops/pages/write/insert-jsonld.d.ts +17 -0
- package/lib/db-ops/pages/write/insert-jsonld.js +49 -0
- package/lib/db-ops/pages/write/insert-main-content-images.d.ts +20 -0
- package/lib/db-ops/pages/write/insert-main-content-images.js +32 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.js +29 -0
- package/lib/db-ops/pages/write/insert-page.d.ts +56 -0
- package/lib/db-ops/pages/write/insert-page.js +259 -0
- package/lib/db-ops/pages/write/insert-technologies.d.ts +25 -0
- package/lib/db-ops/pages/write/insert-technologies.js +45 -0
- package/lib/db-ops/pages/write/insert-videos.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-videos.js +28 -0
- package/lib/db-ops/pages/write/link-redirect-sources.d.ts +42 -0
- package/lib/db-ops/pages/write/link-redirect-sources.js +101 -0
- package/lib/db-ops/pages/write/record-redirect.d.ts +35 -0
- package/lib/db-ops/pages/write/record-redirect.js +100 -0
- package/lib/db-ops/pages/write/set-skipped-page.d.ts +13 -0
- package/lib/db-ops/pages/write/set-skipped-page.js +24 -0
- package/lib/db-ops/pages/write/update-page.d.ts +40 -0
- package/lib/db-ops/pages/write/update-page.js +419 -0
- package/lib/db-ops/pages/write/write-page-html-blob.d.ts +19 -0
- package/lib/db-ops/pages/write/write-page-html-blob.js +41 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.d.ts +9 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.js +15 -0
- package/lib/db-ops/referrers/get-referrers-of-page.d.ts +17 -0
- package/lib/db-ops/referrers/get-referrers-of-page.js +32 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.d.ts +8 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.js +15 -0
- package/lib/db-ops/resources/build-resource-query.d.ts +25 -0
- package/lib/db-ops/resources/build-resource-query.js +29 -0
- package/lib/db-ops/resources/get-existing-resource-urls.d.ts +9 -0
- package/lib/db-ops/resources/get-existing-resource-urls.js +24 -0
- package/lib/db-ops/resources/get-resource-by-url.d.ts +13 -0
- package/lib/db-ops/resources/get-resource-by-url.js +22 -0
- package/lib/db-ops/resources/get-resource-url-list.d.ts +17 -0
- package/lib/db-ops/resources/get-resource-url-list.js +26 -0
- package/lib/db-ops/resources/get-resources.d.ts +8 -0
- package/lib/db-ops/resources/get-resources.js +11 -0
- package/lib/db-ops/resources/insert-inventory-resources.d.ts +24 -0
- package/lib/db-ops/resources/insert-inventory-resources.js +64 -0
- package/lib/db-ops/resources/insert-resource-referrers.d.ts +15 -0
- package/lib/db-ops/resources/insert-resource-referrers.js +54 -0
- package/lib/db-ops/resources/insert-resource.d.ts +34 -0
- package/lib/db-ops/resources/insert-resource.js +73 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.d.ts +26 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.js +30 -0
- package/lib/db-ops/templates/assign-template-labels.d.ts +60 -0
- package/lib/db-ops/templates/assign-template-labels.js +187 -0
- package/lib/db-ops/templates/replace-page-templates.d.ts +44 -0
- package/lib/db-ops/templates/replace-page-templates.js +174 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.d.ts +16 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.js +17 -0
- package/lib/db-ops/templates/types.d.ts +103 -0
- package/lib/db-ops/templates/types.js +1 -0
- package/lib/debug.d.ts +8 -0
- package/lib/debug.js +9 -0
- package/lib/decode-html-blob.d.ts +20 -0
- package/lib/decode-html-blob.js +23 -0
- package/lib/decode-page-html-blob-bytes.d.ts +25 -0
- package/lib/decode-page-html-blob-bytes.js +29 -0
- package/lib/decode-stored-blob-bytes.d.ts +25 -0
- package/lib/decode-stored-blob-bytes.js +47 -0
- package/lib/derive-lineage-from-parent.d.ts +37 -0
- package/lib/derive-lineage-from-parent.js +42 -0
- package/lib/drop-legacy-tables.d.ts +45 -0
- package/lib/drop-legacy-tables.js +56 -0
- package/lib/error-kind/classify-error-kind.d.ts +20 -0
- package/lib/error-kind/classify-error-kind.js +136 -0
- package/lib/error-kind/network-related-error-kinds.d.ts +23 -0
- package/lib/error-kind/network-related-error-kinds.js +28 -0
- package/lib/error-kind/permanent-error-kinds.d.ts +48 -0
- package/lib/error-kind/permanent-error-kinds.js +54 -0
- package/lib/error-kind/types.d.ts +54 -0
- package/lib/error-kind/types.js +1 -0
- package/lib/filesystem/append-text.d.ts +9 -0
- package/lib/filesystem/append-text.js +14 -0
- package/lib/filesystem/copy-dir-sync.d.ts +6 -0
- package/lib/filesystem/copy-dir-sync.js +9 -0
- package/lib/filesystem/copy-dir.d.ts +7 -0
- package/lib/filesystem/copy-dir.js +13 -0
- package/lib/filesystem/copy-file-with-progress.d.ts +20 -0
- package/lib/filesystem/copy-file-with-progress.js +34 -0
- package/lib/filesystem/exists.d.ts +6 -0
- package/lib/filesystem/exists.js +9 -0
- package/lib/filesystem/get-file-list.d.ts +8 -0
- package/lib/filesystem/get-file-list.js +12 -0
- package/lib/filesystem/is-dir.d.ts +6 -0
- package/lib/filesystem/is-dir.js +10 -0
- package/lib/filesystem/mkdir.d.ts +8 -0
- package/lib/filesystem/mkdir.js +15 -0
- package/lib/filesystem/output-binary.d.ts +12 -0
- package/lib/filesystem/output-binary.js +17 -0
- package/lib/filesystem/output-json.d.ts +9 -0
- package/lib/filesystem/output-json.js +14 -0
- package/lib/filesystem/output-text.d.ts +11 -0
- package/lib/filesystem/output-text.js +32 -0
- package/lib/filesystem/parse-pax-path.d.ts +18 -0
- package/lib/filesystem/parse-pax-path.js +47 -0
- package/lib/filesystem/parse-tar-size-field.d.ts +13 -0
- package/lib/filesystem/parse-tar-size-field.js +40 -0
- package/lib/filesystem/peek-tar-top-dir.d.ts +35 -0
- package/lib/filesystem/peek-tar-top-dir.js +215 -0
- package/lib/filesystem/read-json.d.ts +7 -0
- package/lib/filesystem/read-json.js +11 -0
- package/lib/filesystem/read-text.d.ts +6 -0
- package/lib/filesystem/read-text.js +10 -0
- package/lib/filesystem/readline.d.ts +11 -0
- package/lib/filesystem/readline.js +26 -0
- package/lib/filesystem/remove.d.ts +5 -0
- package/lib/filesystem/remove.js +10 -0
- package/lib/filesystem/rename.d.ts +16 -0
- package/lib/filesystem/rename.js +48 -0
- package/lib/filesystem/tar.d.ts +23 -0
- package/lib/filesystem/tar.js +78 -0
- package/lib/filesystem/untar.d.ts +33 -0
- package/lib/filesystem/untar.js +84 -0
- package/lib/get-failed-page-messages.d.ts +56 -0
- package/lib/get-failed-page-messages.js +146 -0
- package/lib/get-json.d.ts +10 -0
- package/lib/get-json.js +25 -0
- package/lib/html-snapshot/match-selector-html.d.ts +25 -0
- package/lib/html-snapshot/match-selector-html.js +28 -0
- package/lib/html-snapshot/match-selector-snapshots.d.ts +33 -0
- package/lib/html-snapshot/match-selector-snapshots.js +33 -0
- package/lib/html-snapshot/search-html-document.d.ts +29 -0
- package/lib/html-snapshot/search-html-document.js +27 -0
- package/lib/html-snapshot/search-html-snapshots.d.ts +36 -0
- package/lib/html-snapshot/search-html-snapshots.js +35 -0
- package/lib/html-snapshot/types.d.ts +111 -0
- package/lib/html-snapshot/types.js +7 -0
- package/lib/html-snapshot/validate-search-pattern.d.ts +15 -0
- package/lib/html-snapshot/validate-search-pattern.js +17 -0
- package/lib/init-schema.d.ts +48 -0
- package/lib/init-schema.js +124 -0
- package/lib/is-inventory-source.d.ts +21 -0
- package/lib/is-inventory-source.js +22 -0
- package/lib/is-within-outage-window.d.ts +49 -0
- package/lib/is-within-outage-window.js +33 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.d.ts +24 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.js +26 -0
- package/lib/libsql-dialect.d.ts +115 -0
- package/lib/libsql-dialect.js +116 -0
- package/lib/limited-page-ids.d.ts +9 -0
- package/lib/limited-page-ids.js +18 -0
- package/lib/meta/assert-compatible-version.d.ts +60 -0
- package/lib/meta/assert-compatible-version.js +93 -0
- package/lib/meta/classify-jsonld-type.d.ts +23 -0
- package/lib/meta/classify-jsonld-type.js +43 -0
- package/lib/meta/compare-semver.d.ts +23 -0
- package/lib/meta/compare-semver.js +51 -0
- package/lib/meta/compute-main-contents-denormalized.d.ts +41 -0
- package/lib/meta/compute-main-contents-denormalized.js +88 -0
- package/lib/meta/compute-page-denormalized.d.ts +20 -0
- package/lib/meta/compute-page-denormalized.js +35 -0
- package/lib/meta/derive-flat-from-meta.d.ts +34 -0
- package/lib/meta/derive-flat-from-meta.js +158 -0
- package/lib/meta/derive-meta-extras.d.ts +20 -0
- package/lib/meta/derive-meta-extras.js +23 -0
- package/lib/meta/extract-tags-for-archive.d.ts +17 -0
- package/lib/meta/extract-tags-for-archive.js +36 -0
- package/lib/meta/parse-main-content-class-list.d.ts +19 -0
- package/lib/meta/parse-main-content-class-list.js +34 -0
- package/lib/meta/summarize-jsonld.d.ts +17 -0
- package/lib/meta/summarize-jsonld.js +29 -0
- package/lib/meta/technologies/combine-technology-confidence.d.ts +46 -0
- package/lib/meta/technologies/combine-technology-confidence.js +93 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.d.ts +45 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.js +53 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.d.ts +33 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.js +46 -0
- package/lib/meta/technologies/extract-technologies-for-archive.d.ts +33 -0
- package/lib/meta/technologies/extract-technologies-for-archive.js +30 -0
- package/lib/meta/technologies/match-js-license-comment-signal.d.ts +21 -0
- package/lib/meta/technologies/match-js-license-comment-signal.js +23 -0
- package/lib/meta/technologies/match-structural-technology-signals.d.ts +26 -0
- package/lib/meta/technologies/match-structural-technology-signals.js +48 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.d.ts +25 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.js +35 -0
- package/lib/meta/technologies/technology-signal-definitions.d.ts +44 -0
- package/lib/meta/technologies/technology-signal-definitions.js +60 -0
- package/lib/meta/technologies/types.d.ts +70 -0
- package/lib/meta/technologies/types.js +13 -0
- package/lib/meta/types.d.ts +1490 -0
- package/lib/meta/types.js +65 -0
- package/lib/migrate-content-items-alias-of-id.d.ts +52 -0
- package/lib/migrate-content-items-alias-of-id.js +69 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.d.ts +46 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.js +62 -0
- package/lib/migrate-content-items-is-metadata-only.d.ts +44 -0
- package/lib/migrate-content-items-is-metadata-only.js +60 -0
- package/lib/migrate-entity-tables.d.ts +55 -0
- package/lib/migrate-entity-tables.js +66 -0
- package/lib/migrate-info-created-cwd.d.ts +17 -0
- package/lib/migrate-info-created-cwd.js +36 -0
- package/lib/migrate-info-main-content-selector.d.ts +16 -0
- package/lib/migrate-info-main-content-selector.js +35 -0
- package/lib/migrate-info-request-header-names.d.ts +16 -0
- package/lib/migrate-info-request-header-names.js +35 -0
- package/lib/migrate-info-roots.d.ts +20 -0
- package/lib/migrate-info-roots.js +52 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.d.ts +34 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.js +51 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.d.ts +25 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.js +44 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.d.ts +16 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.js +35 -0
- package/lib/migrate-main-contents-columns.d.ts +26 -0
- package/lib/migrate-main-contents-columns.js +61 -0
- package/lib/migrate-page-meta-body-hash.d.ts +44 -0
- package/lib/migrate-page-meta-body-hash.js +63 -0
- package/lib/migrate-page-meta-console-error-count.d.ts +27 -0
- package/lib/migrate-page-meta-console-error-count.js +45 -0
- package/lib/migrate-page-meta-custom-element-count.d.ts +33 -0
- package/lib/migrate-page-meta-custom-element-count.js +51 -0
- package/lib/migrate-page-meta-image-scan.d.ts +27 -0
- package/lib/migrate-page-meta-image-scan.js +52 -0
- package/lib/migrate-page-tags-to-page-technologies.d.ts +39 -0
- package/lib/migrate-page-tags-to-page-technologies.js +79 -0
- package/lib/migrate-ref-tables.d.ts +25 -0
- package/lib/migrate-ref-tables.js +38 -0
- package/lib/native-executor/check-native-executor-config.d.ts +17 -0
- package/lib/native-executor/check-native-executor-config.js +20 -0
- package/lib/page-meta-column-maps.d.ts +32 -0
- package/lib/page-meta-column-maps.js +43 -0
- package/lib/page.d.ts +546 -0
- package/lib/page.js +764 -0
- package/lib/peek-archive-lock.d.ts +40 -0
- package/lib/peek-archive-lock.js +62 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.d.ts +41 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.js +87 -0
- package/lib/populate-entity-tables/derive-dom-path.d.ts +35 -0
- package/lib/populate-entity-tables/derive-dom-path.js +72 -0
- package/lib/populate-entity-tables/is-blob-ref-value.d.ts +16 -0
- package/lib/populate-entity-tables/is-blob-ref-value.js +19 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.d.ts +66 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.js +96 -0
- package/lib/populate-entity-tables/populate-anchor-edges.d.ts +33 -0
- package/lib/populate-entity-tables/populate-anchor-edges.js +153 -0
- package/lib/populate-entity-tables/populate-content-items.d.ts +40 -0
- package/lib/populate-entity-tables/populate-content-items.js +141 -0
- package/lib/populate-entity-tables/populate-entities.d.ts +81 -0
- package/lib/populate-entity-tables/populate-entities.js +110 -0
- package/lib/populate-entity-tables/populate-image-items.d.ts +91 -0
- package/lib/populate-entity-tables/populate-image-items.js +226 -0
- package/lib/populate-entity-tables/populate-page-meta.d.ts +33 -0
- package/lib/populate-entity-tables/populate-page-meta.js +267 -0
- package/lib/populate-entity-tables/populate-resource-items.d.ts +22 -0
- package/lib/populate-entity-tables/populate-resource-items.js +114 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.d.ts +31 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.js +33 -0
- package/lib/populate-entity-tables/resolve-blob-refs.d.ts +31 -0
- package/lib/populate-entity-tables/resolve-blob-refs.js +100 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.d.ts +22 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.js +27 -0
- package/lib/populate-entity-tables/resolve-header-sets.d.ts +49 -0
- package/lib/populate-entity-tables/resolve-header-sets.js +122 -0
- package/lib/populate-entity-tables/resolve-json-refs.d.ts +25 -0
- package/lib/populate-entity-tables/resolve-json-refs.js +67 -0
- package/lib/populate-entity-tables/resolve-text-refs.d.ts +30 -0
- package/lib/populate-entity-tables/resolve-text-refs.js +61 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.d.ts +21 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.js +27 -0
- package/lib/populate-entity-tables/resolve-url-refs.d.ts +33 -0
- package/lib/populate-entity-tables/resolve-url-refs.js +60 -0
- package/lib/populate-entity-tables/test-utils/count-rows.d.ts +17 -0
- package/lib/populate-entity-tables/test-utils/count-rows.js +20 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.d.ts +25 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.js +42 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.d.ts +30 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.js +175 -0
- package/lib/populate-entity-tables/types.d.ts +157 -0
- package/lib/populate-entity-tables/types.js +12 -0
- package/lib/populate-entity-tables/upsert-text-refs.d.ts +38 -0
- package/lib/populate-entity-tables/upsert-text-refs.js +78 -0
- package/lib/populate-ref-tables/classify-content-type.d.ts +16 -0
- package/lib/populate-ref-tables/classify-content-type.js +52 -0
- package/lib/populate-ref-tables/compute-content-hash.d.ts +22 -0
- package/lib/populate-ref-tables/compute-content-hash.js +26 -0
- package/lib/populate-ref-tables/compute-header-flags.d.ts +16 -0
- package/lib/populate-ref-tables/compute-header-flags.js +70 -0
- package/lib/populate-ref-tables/content-type-rules.d.ts +38 -0
- package/lib/populate-ref-tables/content-type-rules.js +133 -0
- package/lib/populate-ref-tables/create-header-table-caches.d.ts +25 -0
- package/lib/populate-ref-tables/create-header-table-caches.js +49 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.d.ts +15 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.js +15 -0
- package/lib/populate-ref-tables/decode-data-uri.d.ts +21 -0
- package/lib/populate-ref-tables/decode-data-uri.js +126 -0
- package/lib/populate-ref-tables/decompose-header-set.d.ts +29 -0
- package/lib/populate-ref-tables/decompose-header-set.js +157 -0
- package/lib/populate-ref-tables/decompose-url.d.ts +25 -0
- package/lib/populate-ref-tables/decompose-url.js +70 -0
- package/lib/populate-ref-tables/header-stability.d.ts +19 -0
- package/lib/populate-ref-tables/header-stability.js +22 -0
- package/lib/populate-ref-tables/header-value-cache-key.d.ts +17 -0
- package/lib/populate-ref-tables/header-value-cache-key.js +19 -0
- package/lib/populate-ref-tables/normalize-mime.d.ts +24 -0
- package/lib/populate-ref-tables/normalize-mime.js +36 -0
- package/lib/populate-ref-tables/populate-blob-refs.d.ts +38 -0
- package/lib/populate-ref-tables/populate-blob-refs.js +134 -0
- package/lib/populate-ref-tables/populate-content-type-refs.d.ts +27 -0
- package/lib/populate-ref-tables/populate-content-type-refs.js +70 -0
- package/lib/populate-ref-tables/populate-header-tables.d.ts +35 -0
- package/lib/populate-ref-tables/populate-header-tables.js +80 -0
- package/lib/populate-ref-tables/populate-json-refs.d.ts +29 -0
- package/lib/populate-ref-tables/populate-json-refs.js +101 -0
- package/lib/populate-ref-tables/populate-refs.d.ts +51 -0
- package/lib/populate-ref-tables/populate-refs.js +62 -0
- package/lib/populate-ref-tables/populate-text-refs.d.ts +32 -0
- package/lib/populate-ref-tables/populate-text-refs.js +133 -0
- package/lib/populate-ref-tables/populate-url-refs.d.ts +28 -0
- package/lib/populate-ref-tables/populate-url-refs.js +148 -0
- package/lib/populate-ref-tables/test-utils/count-rows.d.ts +15 -0
- package/lib/populate-ref-tables/test-utils/count-rows.js +17 -0
- package/lib/populate-ref-tables/types.d.ts +197 -0
- package/lib/populate-ref-tables/types.js +7 -0
- package/lib/populate-ref-tables/upsert-one-header-set.d.ts +34 -0
- package/lib/populate-ref-tables/upsert-one-header-set.js +208 -0
- package/lib/populate-ref-tables/volatile-header-names.d.ts +20 -0
- package/lib/populate-ref-tables/volatile-header-names.js +33 -0
- package/lib/redirect-table.d.ts +9 -0
- package/lib/redirect-table.js +28 -0
- package/lib/release-finished-statements.d.ts +42 -0
- package/lib/release-finished-statements.js +45 -0
- package/lib/resolve-redirect-chain.d.ts +33 -0
- package/lib/resolve-redirect-chain.js +27 -0
- package/lib/resource.d.ts +46 -0
- package/lib/resource.js +62 -0
- package/lib/retarget-legacy-fk-tables.d.ts +61 -0
- package/lib/retarget-legacy-fk-tables.js +137 -0
- package/lib/safe-path.d.ts +9 -0
- package/lib/safe-path.js +17 -0
- package/lib/scope/build-scope-map.d.ts +21 -0
- package/lib/scope/build-scope-map.js +32 -0
- package/lib/scope/find-scope-entry.d.ts +25 -0
- package/lib/scope/find-scope-entry.js +45 -0
- package/lib/template-classification/classify-archive-page-templates.d.ts +42 -0
- package/lib/template-classification/classify-archive-page-templates.js +70 -0
- package/lib/template-classification/classify-page-templates.d.ts +33 -0
- package/lib/template-classification/classify-page-templates.js +60 -0
- package/lib/template-classification/collect-page-ids-with-html.d.ts +24 -0
- package/lib/template-classification/collect-page-ids-with-html.js +30 -0
- package/lib/template-classification/collect-page-stylesheet-urls.d.ts +32 -0
- package/lib/template-classification/collect-page-stylesheet-urls.js +130 -0
- package/lib/template-classification/create-content-root-hint.d.ts +41 -0
- package/lib/template-classification/create-content-root-hint.js +51 -0
- package/lib/template-classification/create-page-cluster-factory.d.ts +36 -0
- package/lib/template-classification/create-page-cluster-factory.js +52 -0
- package/lib/template-classification/load-page-cluster-candidates.d.ts +32 -0
- package/lib/template-classification/load-page-cluster-candidates.js +93 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.d.ts +34 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.js +236 -0
- package/lib/template-classification/page-cluster/types.d.ts +123 -0
- package/lib/template-classification/page-cluster/types.js +1 -0
- package/lib/template-classification/types.d.ts +234 -0
- package/lib/template-classification/types.js +1 -0
- package/lib/test-utils/build-full-schema-test-db.d.ts +34 -0
- package/lib/test-utils/build-full-schema-test-db.js +74 -0
- package/lib/test-utils/create-legacy-analysis-tables.d.ts +13 -0
- package/lib/test-utils/create-legacy-analysis-tables.js +37 -0
- package/lib/test-utils/fk-parent-tables.d.ts +15 -0
- package/lib/test-utils/fk-parent-tables.js +19 -0
- package/lib/test-utils/seed-content-item.d.ts +35 -0
- package/lib/test-utils/seed-content-item.js +42 -0
- package/lib/test-utils/setup-legacy-fk-db.d.ts +34 -0
- package/lib/test-utils/setup-legacy-fk-db.js +271 -0
- package/lib/transfer/attach-source-database.d.ts +31 -0
- package/lib/transfer/attach-source-database.js +40 -0
- package/lib/transfer/build-split-config.d.ts +30 -0
- package/lib/transfer/build-split-config.js +42 -0
- package/lib/transfer/clear-replaced-page-rows.d.ts +23 -0
- package/lib/transfer/clear-replaced-page-rows.js +61 -0
- package/lib/transfer/concat-archives.d.ts +55 -0
- package/lib/transfer/concat-archives.js +95 -0
- package/lib/transfer/concat-source-transfer-phases.d.ts +10 -0
- package/lib/transfer/concat-source-transfer-phases.js +17 -0
- package/lib/transfer/content-item-rank-sql.d.ts +21 -0
- package/lib/transfer/content-item-rank-sql.js +23 -0
- package/lib/transfer/copy-anchor-edges.d.ts +28 -0
- package/lib/transfer/copy-anchor-edges.js +42 -0
- package/lib/transfer/copy-dictionaries-for-concat.d.ts +39 -0
- package/lib/transfer/copy-dictionaries-for-concat.js +81 -0
- package/lib/transfer/copy-dictionaries-for-split.d.ts +29 -0
- package/lib/transfer/copy-dictionaries-for-split.js +224 -0
- package/lib/transfer/copy-header-set-children.d.ts +27 -0
- package/lib/transfer/copy-header-set-children.js +51 -0
- package/lib/transfer/copy-image-items.d.ts +21 -0
- package/lib/transfer/copy-image-items.js +62 -0
- package/lib/transfer/copy-inventory-source-lists.d.ts +30 -0
- package/lib/transfer/copy-inventory-source-lists.js +61 -0
- package/lib/transfer/copy-journal-tables.d.ts +30 -0
- package/lib/transfer/copy-journal-tables.js +56 -0
- package/lib/transfer/copy-page-console-logs.d.ts +16 -0
- package/lib/transfer/copy-page-console-logs.js +27 -0
- package/lib/transfer/copy-page-html-blobs.d.ts +31 -0
- package/lib/transfer/copy-page-html-blobs.js +43 -0
- package/lib/transfer/copy-page-meta.d.ts +27 -0
- package/lib/transfer/copy-page-meta.js +68 -0
- package/lib/transfer/copy-page-template-clusters.d.ts +31 -0
- package/lib/transfer/copy-page-template-clusters.js +56 -0
- package/lib/transfer/copy-page-template-labels.d.ts +34 -0
- package/lib/transfer/copy-page-template-labels.js +88 -0
- package/lib/transfer/copy-resource-items.d.ts +29 -0
- package/lib/transfer/copy-resource-items.js +89 -0
- package/lib/transfer/copy-resource-ref-edges.d.ts +20 -0
- package/lib/transfer/copy-resource-ref-edges.js +33 -0
- package/lib/transfer/copy-simple-page-scoped-tables.d.ts +15 -0
- package/lib/transfer/copy-simple-page-scoped-tables.js +34 -0
- package/lib/transfer/count-external-pages-in-scope.d.ts +26 -0
- package/lib/transfer/count-external-pages-in-scope.js +40 -0
- package/lib/transfer/create-transfer-temp-tables.d.ts +30 -0
- package/lib/transfer/create-transfer-temp-tables.js +59 -0
- package/lib/transfer/dictionary-copy-specs.d.ts +32 -0
- package/lib/transfer/dictionary-copy-specs.js +28 -0
- package/lib/transfer/drop-transfer-temp-tables.d.ts +9 -0
- package/lib/transfer/drop-transfer-temp-tables.js +18 -0
- package/lib/transfer/flatten-redirect-chains.d.ts +44 -0
- package/lib/transfer/flatten-redirect-chains.js +74 -0
- package/lib/transfer/insert-content-items.d.ts +35 -0
- package/lib/transfer/insert-content-items.js +116 -0
- package/lib/transfer/list-transfer-columns.d.ts +35 -0
- package/lib/transfer/list-transfer-columns.js +45 -0
- package/lib/transfer/mark-in-scope-content-items.d.ts +31 -0
- package/lib/transfer/mark-in-scope-content-items.js +54 -0
- package/lib/transfer/merge-archive-configs.d.ts +51 -0
- package/lib/transfer/merge-archive-configs.js +85 -0
- package/lib/transfer/plan-content-items-for-concat.d.ts +33 -0
- package/lib/transfer/plan-content-items-for-concat.js +51 -0
- package/lib/transfer/plan-content-items-for-split.d.ts +42 -0
- package/lib/transfer/plan-content-items-for-split.js +83 -0
- package/lib/transfer/plan-resource-items.d.ts +40 -0
- package/lib/transfer/plan-resource-items.js +69 -0
- package/lib/transfer/quote-transfer-identifier.d.ts +18 -0
- package/lib/transfer/quote-transfer-identifier.js +20 -0
- package/lib/transfer/reclassify-resource-externality.d.ts +37 -0
- package/lib/transfer/reclassify-resource-externality.js +66 -0
- package/lib/transfer/remap-redirect-dest-ids.d.ts +34 -0
- package/lib/transfer/remap-redirect-dest-ids.js +51 -0
- package/lib/transfer/replace-content-items.d.ts +39 -0
- package/lib/transfer/replace-content-items.js +83 -0
- package/lib/transfer/simple-page-scoped-tables.d.ts +25 -0
- package/lib/transfer/simple-page-scoped-tables.js +38 -0
- package/lib/transfer/split-archive.d.ts +55 -0
- package/lib/transfer/split-archive.js +98 -0
- package/lib/transfer/split-source-transfer-phases.d.ts +11 -0
- package/lib/transfer/split-source-transfer-phases.js +18 -0
- package/lib/transfer/transfer-action.d.ts +34 -0
- package/lib/transfer/transfer-action.js +32 -0
- package/lib/transfer/transfer-archive-rows.d.ts +65 -0
- package/lib/transfer/transfer-archive-rows.js +156 -0
- package/lib/transfer/transfer-dictionary-tables.d.ts +12 -0
- package/lib/transfer/transfer-dictionary-tables.js +22 -0
- package/lib/transfer/transfer-post-phases.d.ts +10 -0
- package/lib/transfer/transfer-post-phases.js +13 -0
- package/lib/transfer/transfer-source-alias.d.ts +9 -0
- package/lib/transfer/transfer-source-alias.js +9 -0
- package/lib/transfer/types.d.ts +111 -0
- package/lib/transfer/types.js +35 -0
- package/lib/types.d.ts +772 -0
- package/lib/types.js +1 -0
- package/lib/url-alias/compute-tier-a-alias-key.d.ts +44 -0
- package/lib/url-alias/compute-tier-a-alias-key.js +47 -0
- package/lib/url-alias/compute-tier-b-alias-key.d.ts +23 -0
- package/lib/url-alias/compute-tier-b-alias-key.js +26 -0
- package/lib/url-alias/group-alias-candidates.d.ts +27 -0
- package/lib/url-alias/group-alias-candidates.js +29 -0
- package/lib/url-alias/types.d.ts +12 -0
- package/lib/url-alias/types.js +1 -0
- package/lib/url-pattern/compute-shape-key.d.ts +58 -0
- package/lib/url-pattern/compute-shape-key.js +129 -0
- package/lib/url-pattern/decompose-url.d.ts +33 -0
- package/lib/url-pattern/decompose-url.js +79 -0
- package/lib/url-pattern/reconstruct-url.d.ts +15 -0
- package/lib/url-pattern/reconstruct-url.js +33 -0
- package/lib/url-sort/compute-url-sort-ranks.d.ts +30 -0
- package/lib/url-sort/compute-url-sort-ranks.js +33 -0
- package/lib/utils/array/each-splitted.d.ts +10 -0
- package/lib/utils/array/each-splitted.js +14 -0
- package/lib/utils/debug.d.ts +8 -0
- package/lib/utils/debug.js +8 -0
- package/lib/utils/error/emit-error-with-retry.d.ts +40 -0
- package/lib/utils/error/emit-error-with-retry.js +44 -0
- package/lib/utils/error/emit-error.d.ts +39 -0
- package/lib/utils/error/emit-error.js +41 -0
- package/lib/utils/object/parse-response-headers.d.ts +12 -0
- package/lib/utils/object/parse-response-headers.js +26 -0
- package/lib/utils/object/redact-request-headers.d.ts +15 -0
- package/lib/utils/object/redact-request-headers.js +27 -0
- package/lib/utils/types/types.d.ts +383 -0
- package/lib/utils/types/types.js +1 -0
- package/lib/verify-migration/capture-rejection.d.ts +24 -0
- package/lib/verify-migration/capture-rejection.js +31 -0
- package/lib/verify-migration/check-anchor-edges-count.d.ts +34 -0
- package/lib/verify-migration/check-anchor-edges-count.js +72 -0
- package/lib/verify-migration/check-anchor-edges-sum.d.ts +13 -0
- package/lib/verify-migration/check-anchor-edges-sum.js +27 -0
- package/lib/verify-migration/check-content-items-count.d.ts +16 -0
- package/lib/verify-migration/check-content-items-count.js +30 -0
- package/lib/verify-migration/check-content-type-preservation.d.ts +22 -0
- package/lib/verify-migration/check-content-type-preservation.js +40 -0
- package/lib/verify-migration/check-foreign-key-integrity.d.ts +31 -0
- package/lib/verify-migration/check-foreign-key-integrity.js +47 -0
- package/lib/verify-migration/check-image-items-count.d.ts +12 -0
- package/lib/verify-migration/check-image-items-count.js +26 -0
- package/lib/verify-migration/check-page-meta-count.d.ts +15 -0
- package/lib/verify-migration/check-page-meta-count.js +31 -0
- package/lib/verify-migration/check-reader-parity.d.ts +23 -0
- package/lib/verify-migration/check-reader-parity.js +182 -0
- package/lib/verify-migration/check-resource-items-count.d.ts +17 -0
- package/lib/verify-migration/check-resource-items-count.js +33 -0
- package/lib/verify-migration/check-url-round-trip.d.ts +43 -0
- package/lib/verify-migration/check-url-round-trip.js +112 -0
- package/lib/verify-migration/types.d.ts +70 -0
- package/lib/verify-migration/types.js +63 -0
- package/lib/verify-migration/verify-migration.d.ts +41 -0
- package/lib/verify-migration/verify-migration.js +120 -0
- package/lib/with-bulk-write-pragmas.d.ts +51 -0
- package/lib/with-bulk-write-pragmas.js +132 -0
- package/lib/write-queue.d.ts +32 -0
- package/lib/write-queue.js +55 -0
- package/package.json +360 -5
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { open } from 'node:fs/promises';
|
|
2
|
+
import { list } from 'tar';
|
|
3
|
+
import { parsePaxPath } from './parse-pax-path.js';
|
|
4
|
+
import { parseTarSizeField } from './parse-tar-size-field.js';
|
|
5
|
+
/** Bytes per tar header/data block (fixed by the tar format). */
|
|
6
|
+
const BLOCK_SIZE = 512;
|
|
7
|
+
/** Defensive cap on entries scanned before giving up and falling back to `list()`. */
|
|
8
|
+
const MAX_ENTRIES = 100_000;
|
|
9
|
+
/** Cap on PAX/GNU-longname payload size read into memory; larger is treated as malformed. */
|
|
10
|
+
const MAX_EXTENDED_PAYLOAD_SIZE = 1_000_000;
|
|
11
|
+
/**
|
|
12
|
+
* Reads the top-level directory name from a `.nitpicker` tar archive.
|
|
13
|
+
*
|
|
14
|
+
* Why: a `.nitpicker` is a tar that wraps `<basename>/db.sqlite` (and
|
|
15
|
+
* historically other files). `Archive.write()` names the inner directory
|
|
16
|
+
* from the file's basename at write time, but users routinely rename
|
|
17
|
+
* `.nitpicker` files after the fact (e.g. `mv X.migrated.nitpicker
|
|
18
|
+
* X.nitpicker`) — a perfectly reasonable filesystem operation that breaks
|
|
19
|
+
* any code that recomputes the inner-dir name from the outer filename.
|
|
20
|
+
*
|
|
21
|
+
* This helper scans the tar's entry list and returns the first top-level
|
|
22
|
+
* directory it sees, so callers (`Archive.open`, the migration script) can
|
|
23
|
+
* use the actual inner name regardless of what the outer file is called.
|
|
24
|
+
*
|
|
25
|
+
* Parses raw tar headers directly (ustar fixed fields, PAX extended headers,
|
|
26
|
+
* GNU longname/longlink) instead of using the `tar` package's `list()` —
|
|
27
|
+
* `list()` reads the entire archive stream to completion even after
|
|
28
|
+
* `onReadEntry` has found what it needs (no internal early-abort), so on a
|
|
29
|
+
* 15 GB+ archive it was a second full read on top of `untar()`'s own read
|
|
30
|
+
* (issue #294). The fast path here stops at the first top-level directory
|
|
31
|
+
* entry, typically reading well under 1 KB. Falls back to the original
|
|
32
|
+
* `list()`-based scan on anything it doesn't recognize (unknown typeflag
|
|
33
|
+
* sequence, truncated read, non-tar content) — safety over speed for
|
|
34
|
+
* archives this function has never been exercised against.
|
|
35
|
+
* @param tarFilePath - Path to the `.nitpicker` tar file.
|
|
36
|
+
* @returns The first top-level directory name found in the archive.
|
|
37
|
+
* @throws {Error} When the tar contains no top-level directory entry
|
|
38
|
+
* (e.g. file is empty, corrupted, or non-tar). The error message
|
|
39
|
+
* identifies the path for diagnostics.
|
|
40
|
+
* @example
|
|
41
|
+
* // The user renamed `original.nitpicker` to `renamed.nitpicker`. The
|
|
42
|
+
* // inner directory was baked in at write time and is unaffected:
|
|
43
|
+
* await peekTarTopDir('renamed.nitpicker'); // → 'original'
|
|
44
|
+
*/
|
|
45
|
+
export async function peekTarTopDir(tarFilePath) {
|
|
46
|
+
const fast = await peekTarTopDirFast(tarFilePath);
|
|
47
|
+
if (fast !== null) {
|
|
48
|
+
return fast;
|
|
49
|
+
}
|
|
50
|
+
return await peekTarTopDirViaList(tarFilePath);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Returns `true` for a top-level directory name that should be skipped: an
|
|
54
|
+
* AppleDouble resource-fork sidecar (`._foo`, from macOS BSD tar) or a PAX
|
|
55
|
+
* header directory (`PaxHeaders.NNN`/`@PaxHeader`). Real `.nitpicker`
|
|
56
|
+
* archives never name their actual top dir with these prefixes. Shared by
|
|
57
|
+
* both the fast path and the `list()` fallback so the two can't drift into
|
|
58
|
+
* accepting different names for the same archive.
|
|
59
|
+
* @param name - Candidate top-level directory name.
|
|
60
|
+
*/
|
|
61
|
+
function isSkippableTopDirName(name) {
|
|
62
|
+
return (name.startsWith('._') ||
|
|
63
|
+
name.startsWith('PaxHeaders') ||
|
|
64
|
+
name.startsWith('@PaxHeader'));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Extracts the first path segment from a tar entry path, after stripping a
|
|
68
|
+
* leading `./` some tar producers prepend.
|
|
69
|
+
* @param entryPath - The raw path recorded in (or resolved for) a tar entry.
|
|
70
|
+
*/
|
|
71
|
+
function topSegmentOf(entryPath) {
|
|
72
|
+
return entryPath.replace(/^\.\//, '').split('/')[0] ?? '';
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Reads a NUL-terminated (or full-width, if no NUL) string field out of a
|
|
76
|
+
* tar header block.
|
|
77
|
+
* @param header - The 512-byte header block.
|
|
78
|
+
* @param start - Field start offset.
|
|
79
|
+
* @param length - Field length in bytes.
|
|
80
|
+
*/
|
|
81
|
+
function readHeaderString(header, start, length) {
|
|
82
|
+
const field = header.subarray(start, start + length);
|
|
83
|
+
const nulIndex = field.indexOf(0);
|
|
84
|
+
const raw = nulIndex === -1 ? field : field.subarray(0, nulIndex);
|
|
85
|
+
return raw.toString('utf8');
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Fast path for {@link peekTarTopDir}: reads raw 512-byte tar header blocks
|
|
89
|
+
* directly from the file, stopping at the first top-level directory entry.
|
|
90
|
+
* Understands ustar fixed headers, PAX extended headers (`path=`, the form
|
|
91
|
+
* `tar`/node-tar emits for UTF-8 or >100-byte names — verified empirically:
|
|
92
|
+
* see this function's test fixtures), and GNU longname (`typeflag 'L'`,
|
|
93
|
+
* treated the same as a PAX path override for the next entry — this
|
|
94
|
+
* codebase's own `tar()` never emits it, but a `.nitpicker` produced by a
|
|
95
|
+
* different tar implementation should still resolve correctly). GNU
|
|
96
|
+
* longlink (`typeflag 'K'`, a symlink target — irrelevant to a directory
|
|
97
|
+
* name lookup) is skipped without being applied to anything.
|
|
98
|
+
*
|
|
99
|
+
* Returns `null` — never throws — on anything unrecognized: truncated read,
|
|
100
|
+
* unparseable size field, entry count past {@link MAX_ENTRIES}, or reaching
|
|
101
|
+
* the end-of-archive marker without finding a directory. The caller falls
|
|
102
|
+
* back to the exhaustive `list()`-based scan in every `null` case.
|
|
103
|
+
* @param tarFilePath - Path to the `.nitpicker` tar file.
|
|
104
|
+
* @returns The first top-level directory name, or `null` to fall back.
|
|
105
|
+
*/
|
|
106
|
+
async function peekTarTopDirFast(tarFilePath) {
|
|
107
|
+
let fileHandle;
|
|
108
|
+
try {
|
|
109
|
+
fileHandle = await open(tarFilePath, 'r');
|
|
110
|
+
const header = Buffer.alloc(BLOCK_SIZE);
|
|
111
|
+
let position = 0;
|
|
112
|
+
// Set by a preceding PAX ('x') or GNU longname ('L') entry; applies
|
|
113
|
+
// to the very next entry only, then is cleared.
|
|
114
|
+
let pendingPath = null;
|
|
115
|
+
for (let entryIndex = 0; entryIndex < MAX_ENTRIES; entryIndex++) {
|
|
116
|
+
const { bytesRead } = await fileHandle.read(header, 0, BLOCK_SIZE, position);
|
|
117
|
+
if (bytesRead < BLOCK_SIZE) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
position += BLOCK_SIZE;
|
|
121
|
+
if (header.every((byte) => byte === 0)) {
|
|
122
|
+
// End-of-archive marker reached with no directory found —
|
|
123
|
+
// genuinely absent, not a parse failure, but the caller's
|
|
124
|
+
// error message is clearer coming from the exhaustive path.
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
const typeflag = String.fromCodePoint(header[156] ?? 0);
|
|
128
|
+
const size = parseTarSizeField(header.subarray(124, 136));
|
|
129
|
+
if (size === null) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
const dataBlockCount = Math.ceil(size / BLOCK_SIZE);
|
|
133
|
+
const dataStart = position;
|
|
134
|
+
position += dataBlockCount * BLOCK_SIZE;
|
|
135
|
+
if (typeflag === 'x' || typeflag === 'L') {
|
|
136
|
+
if (size <= 0 || size > MAX_EXTENDED_PAYLOAD_SIZE) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
const payload = Buffer.alloc(size);
|
|
140
|
+
const { bytesRead: payloadBytesRead } = await fileHandle.read(payload, 0, size, dataStart);
|
|
141
|
+
if (payloadBytesRead !== size) {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
pendingPath =
|
|
145
|
+
typeflag === 'x'
|
|
146
|
+
? parsePaxPath(payload)
|
|
147
|
+
: payload.toString('utf8').replace(/\0.*$/, '');
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
if (typeflag === 'g' || typeflag === 'K') {
|
|
151
|
+
// PAX global header (applies archive-wide, never carries a
|
|
152
|
+
// per-entry path) / GNU longlink (symlink target, irrelevant
|
|
153
|
+
// to a directory name lookup) — skip without consuming
|
|
154
|
+
// `pendingPath`.
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
const magic = header.toString('latin1', 257, 263);
|
|
158
|
+
const nameField = readHeaderString(header, 0, 100);
|
|
159
|
+
const prefixField = magic.startsWith('ustar')
|
|
160
|
+
? readHeaderString(header, 345, 155)
|
|
161
|
+
: '';
|
|
162
|
+
const entryPath = pendingPath ?? (prefixField ? `${prefixField}/${nameField}` : nameField);
|
|
163
|
+
pendingPath = null;
|
|
164
|
+
if (typeflag === '5') {
|
|
165
|
+
const top = topSegmentOf(entryPath);
|
|
166
|
+
if (top && !isSkippableTopDirName(top)) {
|
|
167
|
+
return top;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
finally {
|
|
177
|
+
await fileHandle?.close();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Exhaustive fallback for {@link peekTarTopDir}: scans the tar's entry list
|
|
182
|
+
* via the `tar` package. Reads the archive to completion regardless of when
|
|
183
|
+
* a match is found (no early-abort in the `tar` package's `list()` API),
|
|
184
|
+
* which is exactly the cost {@link peekTarTopDirFast} exists to avoid — this
|
|
185
|
+
* path only runs when the fast path can't make sense of the header stream.
|
|
186
|
+
* @param tarFilePath - Path to the `.nitpicker` tar file.
|
|
187
|
+
* @returns The first top-level directory name found in the archive.
|
|
188
|
+
* @throws {Error} When the tar contains no top-level directory entry.
|
|
189
|
+
*/
|
|
190
|
+
async function peekTarTopDirViaList(tarFilePath) {
|
|
191
|
+
let found = null;
|
|
192
|
+
await list({
|
|
193
|
+
file: tarFilePath,
|
|
194
|
+
onReadEntry: (entry) => {
|
|
195
|
+
if (found !== null)
|
|
196
|
+
return;
|
|
197
|
+
// Only Directory entries count. Files at the tar root would
|
|
198
|
+
// otherwise win — and macOS BSD tar embeds AppleDouble (`._*`)
|
|
199
|
+
// sidecar files at the tar root for resource forks; those are
|
|
200
|
+
// File entries that BSD `tar -tf` hides but Node's `tar`
|
|
201
|
+
// surfaces verbatim, so without this filter the resource-fork
|
|
202
|
+
// of the real top-level dir would win instead of the dir itself.
|
|
203
|
+
if (entry.type !== 'Directory')
|
|
204
|
+
return;
|
|
205
|
+
const top = topSegmentOf(entry.path);
|
|
206
|
+
if (!top || isSkippableTopDirName(top))
|
|
207
|
+
return;
|
|
208
|
+
found = top;
|
|
209
|
+
},
|
|
210
|
+
});
|
|
211
|
+
if (found === null) {
|
|
212
|
+
throw new Error(`Tar contains no top-level directory entry: ${tarFilePath}`);
|
|
213
|
+
}
|
|
214
|
+
return found;
|
|
215
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads and parses a JSON file from the specified path.
|
|
3
|
+
* @template T - The expected type of the parsed JSON content. Defaults to `unknown`.
|
|
4
|
+
* @param filePath - The absolute or relative path to the JSON file to read.
|
|
5
|
+
* @returns The parsed JSON content, cast to the specified generic type.
|
|
6
|
+
*/
|
|
7
|
+
export declare function readJSON<T = unknown>(filePath: string): Promise<T>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
/**
|
|
3
|
+
* Reads and parses a JSON file from the specified path.
|
|
4
|
+
* @template T - The expected type of the parsed JSON content. Defaults to `unknown`.
|
|
5
|
+
* @param filePath - The absolute or relative path to the JSON file to read.
|
|
6
|
+
* @returns The parsed JSON content, cast to the specified generic type.
|
|
7
|
+
*/
|
|
8
|
+
export async function readJSON(filePath) {
|
|
9
|
+
const data = await fs.readFile(filePath, { encoding: 'utf8' });
|
|
10
|
+
return JSON.parse(data);
|
|
11
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
/**
|
|
3
|
+
* Reads the entire contents of a text file as a UTF-8 string.
|
|
4
|
+
* @param filePath - The absolute or relative path to the text file to read.
|
|
5
|
+
* @returns The text content of the file.
|
|
6
|
+
*/
|
|
7
|
+
export async function readText(filePath) {
|
|
8
|
+
const data = await fs.readFile(filePath, { encoding: 'utf8' });
|
|
9
|
+
return data;
|
|
10
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads a file line by line and invokes the callback for each line.
|
|
3
|
+
*
|
|
4
|
+
* The callback may return a Promise for asynchronous processing.
|
|
5
|
+
* All callback results are collected and awaited via `Promise.all` before returning.
|
|
6
|
+
* @param filePath - The path to the file to read line by line.
|
|
7
|
+
* @param callback - A function invoked for each line of the file.
|
|
8
|
+
* May return a Promise for asynchronous operations.
|
|
9
|
+
* @returns A promise that resolves when all line callbacks have completed.
|
|
10
|
+
*/
|
|
11
|
+
export declare function readline(filePath: string, callback: (line: string) => Promise<void> | void): Promise<void[]>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { createReadStream } from 'node:fs';
|
|
2
|
+
import Readline from 'node:readline';
|
|
3
|
+
/**
|
|
4
|
+
* Reads a file line by line and invokes the callback for each line.
|
|
5
|
+
*
|
|
6
|
+
* The callback may return a Promise for asynchronous processing.
|
|
7
|
+
* All callback results are collected and awaited via `Promise.all` before returning.
|
|
8
|
+
* @param filePath - The path to the file to read line by line.
|
|
9
|
+
* @param callback - A function invoked for each line of the file.
|
|
10
|
+
* May return a Promise for asynchronous operations.
|
|
11
|
+
* @returns A promise that resolves when all line callbacks have completed.
|
|
12
|
+
*/
|
|
13
|
+
export async function readline(filePath, callback) {
|
|
14
|
+
const stream = createReadStream(filePath);
|
|
15
|
+
const rLine = Readline.createInterface(stream);
|
|
16
|
+
const promiseBuffer = [];
|
|
17
|
+
await new Promise((resolve) => {
|
|
18
|
+
rLine.on('line', (line) => {
|
|
19
|
+
promiseBuffer.push(callback(line));
|
|
20
|
+
});
|
|
21
|
+
rLine.on('close', () => {
|
|
22
|
+
resolve();
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
return Promise.all(promiseBuffer);
|
|
26
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
/**
|
|
3
|
+
* Recursively removes a file or directory at the specified path.
|
|
4
|
+
* @param dirPath - The path of the file or directory to remove.
|
|
5
|
+
*/
|
|
6
|
+
export async function remove(dirPath) {
|
|
7
|
+
await fs.rm(dirPath, {
|
|
8
|
+
recursive: true,
|
|
9
|
+
});
|
|
10
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renames (moves) a file or directory from one path to another.
|
|
3
|
+
*
|
|
4
|
+
* If `override` is `true`, the destination is unconditionally removed
|
|
5
|
+
* before renaming. This avoids a TOCTOU race condition between
|
|
6
|
+
* checking existence and performing the removal.
|
|
7
|
+
*
|
|
8
|
+
* When `fs.rename` fails with `EPERM` (common on Windows due to file locks
|
|
9
|
+
* from antivirus or indexer processes) or `EXDEV` (cross-device move),
|
|
10
|
+
* falls back to a copy-then-remove strategy.
|
|
11
|
+
* @param oldPath - The current path of the file or directory.
|
|
12
|
+
* @param newPath - The new path for the file or directory.
|
|
13
|
+
* @param override - Whether to overwrite the destination if it already exists. Defaults to `false`.
|
|
14
|
+
* @returns A promise that resolves when the rename (or fallback copy-then-remove) is complete.
|
|
15
|
+
*/
|
|
16
|
+
export declare function rename(oldPath: string, newPath: string, override?: boolean): Promise<void>;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import { remove } from './remove.js';
|
|
3
|
+
/**
|
|
4
|
+
* Checks whether a value is a `NodeJS.ErrnoException`.
|
|
5
|
+
* @param error - The value to check.
|
|
6
|
+
* @returns `true` if the value has a `code` property of type `string`.
|
|
7
|
+
*/
|
|
8
|
+
function isNodeError(error) {
|
|
9
|
+
return (error instanceof Error && typeof error.code === 'string');
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Renames (moves) a file or directory from one path to another.
|
|
13
|
+
*
|
|
14
|
+
* If `override` is `true`, the destination is unconditionally removed
|
|
15
|
+
* before renaming. This avoids a TOCTOU race condition between
|
|
16
|
+
* checking existence and performing the removal.
|
|
17
|
+
*
|
|
18
|
+
* When `fs.rename` fails with `EPERM` (common on Windows due to file locks
|
|
19
|
+
* from antivirus or indexer processes) or `EXDEV` (cross-device move),
|
|
20
|
+
* falls back to a copy-then-remove strategy.
|
|
21
|
+
* @param oldPath - The current path of the file or directory.
|
|
22
|
+
* @param newPath - The new path for the file or directory.
|
|
23
|
+
* @param override - Whether to overwrite the destination if it already exists. Defaults to `false`.
|
|
24
|
+
* @returns A promise that resolves when the rename (or fallback copy-then-remove) is complete.
|
|
25
|
+
*/
|
|
26
|
+
export async function rename(oldPath, newPath, override = false) {
|
|
27
|
+
if (override) {
|
|
28
|
+
await remove(newPath).catch(() => { });
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
await fs.rename(oldPath, newPath);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
if (isNodeError(error) && (error.code === 'EPERM' || error.code === 'EXDEV')) {
|
|
35
|
+
try {
|
|
36
|
+
await fs.cp(oldPath, newPath, { recursive: true });
|
|
37
|
+
}
|
|
38
|
+
catch (cpError) {
|
|
39
|
+
await remove(newPath).catch(() => { });
|
|
40
|
+
throw cpError;
|
|
41
|
+
}
|
|
42
|
+
await remove(oldPath);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates an uncompressed TAR archive from a directory.
|
|
3
|
+
*
|
|
4
|
+
* The archive preserves the relative directory structure.
|
|
5
|
+
* The `dir` parameter is resolved relative to its parent directory
|
|
6
|
+
* so only the target directory name appears in the archive.
|
|
7
|
+
*
|
|
8
|
+
* When `onProgress` is given, the tar is produced through a manual stream
|
|
9
|
+
* pipe instead of tar's own `file` mode so the written byte count can be
|
|
10
|
+
* observed — a `.nitpicker` tar is dominated by the single giant `db.sqlite`
|
|
11
|
+
* entry (15 GB+ on large crawls), so per-entry callbacks would fire once and
|
|
12
|
+
* report nothing for minutes (issue #294). `totalBytes` is an estimate (the
|
|
13
|
+
* sum of the directory's file sizes; tar adds per-entry headers and padding
|
|
14
|
+
* on top), so `writtenBytes` is clamped to it and a final
|
|
15
|
+
* `(totalBytes, totalBytes)` call marks completion.
|
|
16
|
+
* @param dir - The absolute path of the directory to archive.
|
|
17
|
+
* @param outputPath - The file path where the TAR archive will be written.
|
|
18
|
+
* @param onProgress - Called as archive bytes are written, with the bytes
|
|
19
|
+
* written so far (clamped to the estimate) and the estimated total. Omit
|
|
20
|
+
* for the original silent, tar-managed-file creation.
|
|
21
|
+
* @returns A promise that resolves when the TAR archive has been created.
|
|
22
|
+
*/
|
|
23
|
+
export declare function tar(dir: string, outputPath: string, onProgress?: (writtenBytes: number, totalBytes: number) => void): Promise<void>;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { createWriteStream } from 'node:fs';
|
|
2
|
+
import { readdir, stat } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { create } from 'tar';
|
|
5
|
+
/**
|
|
6
|
+
* Creates an uncompressed TAR archive from a directory.
|
|
7
|
+
*
|
|
8
|
+
* The archive preserves the relative directory structure.
|
|
9
|
+
* The `dir` parameter is resolved relative to its parent directory
|
|
10
|
+
* so only the target directory name appears in the archive.
|
|
11
|
+
*
|
|
12
|
+
* When `onProgress` is given, the tar is produced through a manual stream
|
|
13
|
+
* pipe instead of tar's own `file` mode so the written byte count can be
|
|
14
|
+
* observed — a `.nitpicker` tar is dominated by the single giant `db.sqlite`
|
|
15
|
+
* entry (15 GB+ on large crawls), so per-entry callbacks would fire once and
|
|
16
|
+
* report nothing for minutes (issue #294). `totalBytes` is an estimate (the
|
|
17
|
+
* sum of the directory's file sizes; tar adds per-entry headers and padding
|
|
18
|
+
* on top), so `writtenBytes` is clamped to it and a final
|
|
19
|
+
* `(totalBytes, totalBytes)` call marks completion.
|
|
20
|
+
* @param dir - The absolute path of the directory to archive.
|
|
21
|
+
* @param outputPath - The file path where the TAR archive will be written.
|
|
22
|
+
* @param onProgress - Called as archive bytes are written, with the bytes
|
|
23
|
+
* written so far (clamped to the estimate) and the estimated total. Omit
|
|
24
|
+
* for the original silent, tar-managed-file creation.
|
|
25
|
+
* @returns A promise that resolves when the TAR archive has been created.
|
|
26
|
+
*/
|
|
27
|
+
export async function tar(dir, outputPath, onProgress) {
|
|
28
|
+
const baseDir = path.dirname(dir);
|
|
29
|
+
const targetDir = path.relative(baseDir, dir);
|
|
30
|
+
if (!onProgress) {
|
|
31
|
+
await create({
|
|
32
|
+
gzip: false,
|
|
33
|
+
cwd: baseDir,
|
|
34
|
+
file: outputPath,
|
|
35
|
+
preservePaths: false,
|
|
36
|
+
}, [targetDir]);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const entries = await readdir(dir, { recursive: true, withFileTypes: true });
|
|
40
|
+
let totalBytes = 0;
|
|
41
|
+
for (const entry of entries) {
|
|
42
|
+
if (!entry.isFile()) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const { size } = await stat(path.join(entry.parentPath, entry.name));
|
|
46
|
+
totalBytes += size;
|
|
47
|
+
}
|
|
48
|
+
await new Promise((resolve, reject) => {
|
|
49
|
+
const source = create({
|
|
50
|
+
gzip: false,
|
|
51
|
+
cwd: baseDir,
|
|
52
|
+
preservePaths: false,
|
|
53
|
+
}, [targetDir]);
|
|
54
|
+
const sink = createWriteStream(outputPath);
|
|
55
|
+
let writtenBytes = 0;
|
|
56
|
+
source.on('data', (chunk) => {
|
|
57
|
+
writtenBytes += chunk.length;
|
|
58
|
+
onProgress(Math.min(writtenBytes, totalBytes), totalBytes);
|
|
59
|
+
});
|
|
60
|
+
// .pipe() does not destroy the other side on error, so an error on
|
|
61
|
+
// either stream would otherwise leave the write side dangling open.
|
|
62
|
+
source.on('error', (error) => {
|
|
63
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
64
|
+
sink.destroy(err);
|
|
65
|
+
reject(err);
|
|
66
|
+
});
|
|
67
|
+
sink.on('error', (error) => {
|
|
68
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
69
|
+
source.destroy(err);
|
|
70
|
+
reject(err);
|
|
71
|
+
});
|
|
72
|
+
sink.on('close', () => {
|
|
73
|
+
onProgress(totalBytes, totalBytes);
|
|
74
|
+
resolve();
|
|
75
|
+
});
|
|
76
|
+
source.pipe(sink);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts files from a TAR archive.
|
|
3
|
+
*
|
|
4
|
+
* Only files newer than existing files in the target directory are extracted
|
|
5
|
+
* (uses the `newer` option). Optionally restricts extraction to a specific
|
|
6
|
+
* working directory and/or a subset of files.
|
|
7
|
+
*
|
|
8
|
+
* When `onProgress` is given, the tar is read through a manual
|
|
9
|
+
* `createReadStream` pipe instead of tar's own `file` mode so the consumed
|
|
10
|
+
* byte count can be observed — a `.nitpicker` tar is dominated by the single
|
|
11
|
+
* giant `db.sqlite` entry (15 GB+ on large crawls), so per-entry callbacks
|
|
12
|
+
* would fire once and report nothing for minutes (issue #294). Byte
|
|
13
|
+
* granularity is the read-stream chunk size (~64 KB); callers wanting
|
|
14
|
+
* coarser updates (e.g. one per percent) throttle in their own callback.
|
|
15
|
+
* @param tarFilePath - The path to the TAR archive to extract.
|
|
16
|
+
* @param options - Optional extraction settings.
|
|
17
|
+
* @param options.cwd - The working directory to extract files into.
|
|
18
|
+
* If omitted, the current working directory is used.
|
|
19
|
+
* @param options.fileList - An array of specific file paths within the archive
|
|
20
|
+
* to extract. If omitted, all files in the archive are extracted.
|
|
21
|
+
* @param options.onProgress - Called as archive bytes are consumed, with the
|
|
22
|
+
* bytes read so far and the archive's total size. Omit for the original
|
|
23
|
+
* silent, tar-managed-file extraction.
|
|
24
|
+
* @returns A promise that resolves when extraction is complete.
|
|
25
|
+
*/
|
|
26
|
+
export declare function untar(tarFilePath: string, options?: {
|
|
27
|
+
/** The working directory to extract files into. */
|
|
28
|
+
cwd?: string;
|
|
29
|
+
/** An array of specific file paths within the archive to extract. */
|
|
30
|
+
fileList?: string[];
|
|
31
|
+
/** Byte-level progress callback — see the function docs. */
|
|
32
|
+
onProgress?: (readBytes: number, totalBytes: number) => void;
|
|
33
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { createReadStream } from 'node:fs';
|
|
2
|
+
import { stat } from 'node:fs/promises';
|
|
3
|
+
import { extract } from 'tar';
|
|
4
|
+
/**
|
|
5
|
+
* Extracts files from a TAR archive.
|
|
6
|
+
*
|
|
7
|
+
* Only files newer than existing files in the target directory are extracted
|
|
8
|
+
* (uses the `newer` option). Optionally restricts extraction to a specific
|
|
9
|
+
* working directory and/or a subset of files.
|
|
10
|
+
*
|
|
11
|
+
* When `onProgress` is given, the tar is read through a manual
|
|
12
|
+
* `createReadStream` pipe instead of tar's own `file` mode so the consumed
|
|
13
|
+
* byte count can be observed — a `.nitpicker` tar is dominated by the single
|
|
14
|
+
* giant `db.sqlite` entry (15 GB+ on large crawls), so per-entry callbacks
|
|
15
|
+
* would fire once and report nothing for minutes (issue #294). Byte
|
|
16
|
+
* granularity is the read-stream chunk size (~64 KB); callers wanting
|
|
17
|
+
* coarser updates (e.g. one per percent) throttle in their own callback.
|
|
18
|
+
* @param tarFilePath - The path to the TAR archive to extract.
|
|
19
|
+
* @param options - Optional extraction settings.
|
|
20
|
+
* @param options.cwd - The working directory to extract files into.
|
|
21
|
+
* If omitted, the current working directory is used.
|
|
22
|
+
* @param options.fileList - An array of specific file paths within the archive
|
|
23
|
+
* to extract. If omitted, all files in the archive are extracted.
|
|
24
|
+
* @param options.onProgress - Called as archive bytes are consumed, with the
|
|
25
|
+
* bytes read so far and the archive's total size. Omit for the original
|
|
26
|
+
* silent, tar-managed-file extraction.
|
|
27
|
+
* @returns A promise that resolves when extraction is complete.
|
|
28
|
+
*/
|
|
29
|
+
export async function untar(tarFilePath, options) {
|
|
30
|
+
const { cwd, fileList, onProgress } = options ?? {};
|
|
31
|
+
if (!onProgress) {
|
|
32
|
+
await extract({
|
|
33
|
+
file: tarFilePath,
|
|
34
|
+
newer: true,
|
|
35
|
+
cwd,
|
|
36
|
+
preservePaths: false,
|
|
37
|
+
noMtime: true,
|
|
38
|
+
}, fileList ?? []);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const { size: totalBytes } = await stat(tarFilePath);
|
|
42
|
+
await new Promise((resolve, reject) => {
|
|
43
|
+
const source = createReadStream(tarFilePath);
|
|
44
|
+
let readBytes = 0;
|
|
45
|
+
source.on('data', (chunk) => {
|
|
46
|
+
readBytes += chunk.length;
|
|
47
|
+
onProgress(readBytes, totalBytes);
|
|
48
|
+
});
|
|
49
|
+
const sink = extract({
|
|
50
|
+
newer: true,
|
|
51
|
+
cwd,
|
|
52
|
+
preservePaths: false,
|
|
53
|
+
noMtime: true,
|
|
54
|
+
}, fileList ?? []);
|
|
55
|
+
// .pipe() does not destroy the other side on error, so an error on
|
|
56
|
+
// either stream would otherwise leave the write side dangling open.
|
|
57
|
+
// `Unpack` (`extends Parser extends EE`, a plain `EventEmitter`, NOT
|
|
58
|
+
// a Minipass/stream base class despite behaving like a writable
|
|
59
|
+
// stream) has no `destroy()` — `abort()` is its own equivalent:
|
|
60
|
+
// idempotent (guarded internally), and it emits its own 'error'
|
|
61
|
+
// (confirmed via `tar`'s `warnMethod` with `recoverable: false`),
|
|
62
|
+
// which re-enters the `sink.on('error', ...)` handler below —
|
|
63
|
+
// harmless, since `source.destroy()`/`reject()` are already
|
|
64
|
+
// idempotent no-ops on a second call.
|
|
65
|
+
source.on('error', (error) => {
|
|
66
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
67
|
+
sink.abort(err);
|
|
68
|
+
reject(err);
|
|
69
|
+
});
|
|
70
|
+
sink.on('error', (error) => {
|
|
71
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
72
|
+
source.destroy(err);
|
|
73
|
+
reject(err);
|
|
74
|
+
});
|
|
75
|
+
// node-tar's Unpack stream signals completion via 'close' (all entry
|
|
76
|
+
// writes flushed), not 'finish' (input fully consumed) — resolving on
|
|
77
|
+
// 'finish' could hand the caller a tmpDir whose db.sqlite is still
|
|
78
|
+
// being written.
|
|
79
|
+
sink.on('close', () => {
|
|
80
|
+
resolve();
|
|
81
|
+
});
|
|
82
|
+
source.pipe(sink);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* One resolved failure message, with the timestamp it was recorded at.
|
|
4
|
+
* `createdAt` is what lets a caller (`resetFailedPages`) decide whether the
|
|
5
|
+
* failure falls inside a `network_outages` window and should be treated as
|
|
6
|
+
* retryable regardless of its classified `ErrorKind` — see
|
|
7
|
+
* `is-within-outage-window.ts`.
|
|
8
|
+
*/
|
|
9
|
+
export interface FailedPageMessage {
|
|
10
|
+
message: string;
|
|
11
|
+
/** Epoch ms the message was recorded (`page_errors.createdAt` or `crawl_errors.createdAt`). */
|
|
12
|
+
createdAt: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Bulk-resolve a raw error message (plus its timestamp) for each given page
|
|
16
|
+
* id, using only sources reachable from a {@link Knex} handle. Read order:
|
|
17
|
+
* `page_errors` (keyed by `pageId`, the most direct signal a scrape attempt
|
|
18
|
+
* recorded), then `crawl_errors` (keyed by `url`, the crawler-channel
|
|
19
|
+
* record for failures that happened before a page row was scraped).
|
|
20
|
+
*
|
|
21
|
+
* **Known limitation — pre-`crawl_errors` archives**: This helper does NOT
|
|
22
|
+
* read `error.log`. The `crawl_errors` table is created empty (by
|
|
23
|
+
* `initSchema` on fresh archives, by `scripts/migrate-to-0.13.mjs` on
|
|
24
|
+
* migrated ones) and historical lines from `error.log` are never
|
|
25
|
+
* back-filled, so an archive whose failures live only in `error.log`
|
|
26
|
+
* will resolve every id to "no message" here. The
|
|
27
|
+
* downstream `Database.resetFailedPages` treats absence as `unknown` (still
|
|
28
|
+
* retryable), so legacy archives lose the permanent-kind exclusion until a
|
|
29
|
+
* fresh crawl run populates `crawl_errors` / `page_errors`. The trade-off
|
|
30
|
+
* (no error.log parsing in the writer path) keeps the writer dependency
|
|
31
|
+
* surface narrow and avoids re-implementing the parser already living in
|
|
32
|
+
* `@nitpicker/query`'s `resolveFailedPageMessages` — which the crawler
|
|
33
|
+
* package cannot import (reverse-direction dependency). When this matters
|
|
34
|
+
* in practice, run the archive through one fresh `crawl --retry-failed`
|
|
35
|
+
* pass first to populate the structured tables.
|
|
36
|
+
*
|
|
37
|
+
* Pages with no message in any consulted source are simply absent from the
|
|
38
|
+
* returned map; callers treat the absence as "unclassifiable, keep retrying"
|
|
39
|
+
* (i.e. `unknown`).
|
|
40
|
+
* @param instance - The {@link Knex} handle.
|
|
41
|
+
* @param ids - Candidate `pages.id` values.
|
|
42
|
+
* @param urls - The corresponding `pages.url` values, in the same order as
|
|
43
|
+
* `ids`. Length and indexing MUST match `ids` so the page → url join can be
|
|
44
|
+
* reconstructed without a second `pages` round-trip.
|
|
45
|
+
* @returns `Map<pageId, FailedPageMessage>` populated only for ids whose
|
|
46
|
+
* message was found in one of the consulted tables.
|
|
47
|
+
* @example
|
|
48
|
+
* ```ts
|
|
49
|
+
* const messages = await getFailedPageMessages(
|
|
50
|
+
* instance,
|
|
51
|
+
* candidates.map(c => c.id),
|
|
52
|
+
* candidates.map(c => c.url),
|
|
53
|
+
* );
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare function getFailedPageMessages(instance: Knex, ids: readonly number[], urls: readonly string[]): Promise<Map<number, FailedPageMessage>>;
|