@nitpicker/archive 0.0.0 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +106 -0
- package/lib/apply-connection-pragmas.d.ts +18 -0
- package/lib/apply-connection-pragmas.js +40 -0
- package/lib/archive-accessor.d.ts +265 -0
- package/lib/archive-accessor.js +477 -0
- package/lib/archive-lock.d.ts +45 -0
- package/lib/archive-lock.js +154 -0
- package/lib/archive.d.ts +736 -0
- package/lib/archive.js +1056 -0
- package/lib/body-hash/compute-body-hash.d.ts +32 -0
- package/lib/body-hash/compute-body-hash.js +35 -0
- package/lib/cache/clear-archive-cache-entry.d.ts +18 -0
- package/lib/cache/clear-archive-cache-entry.js +24 -0
- package/lib/cache/clear-archive-cache-root.d.ts +26 -0
- package/lib/cache/clear-archive-cache-root.js +32 -0
- package/lib/cache/compute-archive-cache-key.d.ts +39 -0
- package/lib/cache/compute-archive-cache-key.js +95 -0
- package/lib/cache/extract-archive-to-cache.d.ts +57 -0
- package/lib/cache/extract-archive-to-cache.js +326 -0
- package/lib/cache/get-archive-cache-root.d.ts +20 -0
- package/lib/cache/get-archive-cache-root.js +53 -0
- package/lib/cache/is-archive-cache-disabled.d.ts +24 -0
- package/lib/cache/is-archive-cache-disabled.js +34 -0
- package/lib/cache/list-archive-cache-entries.d.ts +23 -0
- package/lib/cache/list-archive-cache-entries.js +130 -0
- package/lib/cache/path-exists.d.ts +9 -0
- package/lib/cache/path-exists.js +18 -0
- package/lib/cache/resolve-archive-cache-dir.d.ts +26 -0
- package/lib/cache/resolve-archive-cache-dir.js +32 -0
- package/lib/cache/types.d.ts +33 -0
- package/lib/cache/types.js +1 -0
- package/lib/content-type/is-html-content-type.d.ts +17 -0
- package/lib/content-type/is-html-content-type.js +19 -0
- package/lib/content-type/normalize-content-type.d.ts +14 -0
- package/lib/content-type/normalize-content-type.js +20 -0
- package/lib/create-adjunct-tables.d.ts +66 -0
- package/lib/create-adjunct-tables.js +510 -0
- package/lib/create-entity-tables.d.ts +191 -0
- package/lib/create-entity-tables.js +387 -0
- package/lib/create-progress-reporter.d.ts +30 -0
- package/lib/create-progress-reporter.js +38 -0
- package/lib/create-ref-tables.d.ts +35 -0
- package/lib/create-ref-tables.js +185 -0
- package/lib/create-template-tables.d.ts +28 -0
- package/lib/create-template-tables.js +92 -0
- package/lib/database.d.ts +549 -0
- package/lib/database.js +804 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.d.ts +27 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.js +35 -0
- package/lib/db-ops/_shared/compress-payload.d.ts +26 -0
- package/lib/db-ops/_shared/compress-payload.js +30 -0
- package/lib/db-ops/_shared/create-write-ref-caches.d.ts +17 -0
- package/lib/db-ops/_shared/create-write-ref-caches.js +27 -0
- package/lib/db-ops/_shared/decode-json-ref.d.ts +17 -0
- package/lib/db-ops/_shared/decode-json-ref.js +31 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.d.ts +49 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.js +69 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.d.ts +20 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.js +53 -0
- package/lib/db-ops/_shared/resolve-content-item-id.d.ts +62 -0
- package/lib/db-ops/_shared/resolve-content-item-id.js +143 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.d.ts +23 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.js +29 -0
- package/lib/db-ops/_shared/retry-setting.d.ts +16 -0
- package/lib/db-ops/_shared/retry-setting.js +18 -0
- package/lib/db-ops/_shared/safe-parse-json.d.ts +11 -0
- package/lib/db-ops/_shared/safe-parse-json.js +18 -0
- package/lib/db-ops/_shared/types.d.ts +94 -0
- package/lib/db-ops/_shared/types.js +1 -0
- package/lib/db-ops/_shared/upsert-blob-ref.d.ts +25 -0
- package/lib/db-ops/_shared/upsert-blob-ref.js +48 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.d.ts +30 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.js +45 -0
- package/lib/db-ops/_shared/upsert-json-ref.d.ts +22 -0
- package/lib/db-ops/_shared/upsert-json-ref.js +41 -0
- package/lib/db-ops/_shared/upsert-response-headers.d.ts +35 -0
- package/lib/db-ops/_shared/upsert-response-headers.js +49 -0
- package/lib/db-ops/_shared/upsert-url-ref.d.ts +39 -0
- package/lib/db-ops/_shared/upsert-url-ref.js +62 -0
- package/lib/db-ops/anchors/get-anchors-on-page.d.ts +10 -0
- package/lib/db-ops/anchors/get-anchors-on-page.js +21 -0
- package/lib/db-ops/config/get-base-url.d.ts +8 -0
- package/lib/db-ops/config/get-base-url.js +14 -0
- package/lib/db-ops/config/get-config.d.ts +10 -0
- package/lib/db-ops/config/get-config.js +29 -0
- package/lib/db-ops/config/get-created-cwd.d.ts +11 -0
- package/lib/db-ops/config/get-created-cwd.js +13 -0
- package/lib/db-ops/config/get-name.d.ts +8 -0
- package/lib/db-ops/config/get-name.js +14 -0
- package/lib/db-ops/config/info-column-allowlist.d.ts +7 -0
- package/lib/db-ops/config/info-column-allowlist.js +29 -0
- package/lib/db-ops/config/info-json-columns.d.ts +5 -0
- package/lib/db-ops/config/info-json-columns.js +11 -0
- package/lib/db-ops/config/set-config.d.ts +12 -0
- package/lib/db-ops/config/set-config.js +21 -0
- package/lib/db-ops/config/update-config.d.ts +17 -0
- package/lib/db-ops/config/update-config.js +36 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.d.ts +19 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.js +30 -0
- package/lib/db-ops/console-logs/replace-console-logs.d.ts +34 -0
- package/lib/db-ops/console-logs/replace-console-logs.js +123 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.d.ts +16 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.js +26 -0
- package/lib/db-ops/console-logs/types.d.ts +38 -0
- package/lib/db-ops/console-logs/types.js +1 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.d.ts +29 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.js +52 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.d.ts +18 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.js +23 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.d.ts +12 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.js +15 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.d.ts +14 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.js +30 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.d.ts +57 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.js +87 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.d.ts +21 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.js +27 -0
- package/lib/db-ops/errors/insert-crawl-error.d.ts +15 -0
- package/lib/db-ops/errors/insert-crawl-error.js +21 -0
- package/lib/db-ops/errors/insert-page-error.d.ts +21 -0
- package/lib/db-ops/errors/insert-page-error.js +30 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.d.ts +33 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.js +158 -0
- package/lib/db-ops/html/read-page-html-blob.d.ts +17 -0
- package/lib/db-ops/html/read-page-html-blob.js +20 -0
- package/lib/db-ops/lifecycle/checkpoint.d.ts +8 -0
- package/lib/db-ops/lifecycle/checkpoint.js +9 -0
- package/lib/db-ops/lifecycle/destroy.d.ts +6 -0
- package/lib/db-ops/lifecycle/destroy.js +7 -0
- package/lib/db-ops/lifecycle/init.d.ts +58 -0
- package/lib/db-ops/lifecycle/init.js +122 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.d.ts +22 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.js +41 -0
- package/lib/db-ops/meta/get-audios-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-audios-of-page.js +15 -0
- package/lib/db-ops/meta/get-buttons-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-buttons-of-page.js +15 -0
- package/lib/db-ops/meta/get-canvases-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-canvases-of-page.js +15 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.js +15 -0
- package/lib/db-ops/meta/get-headings-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-headings-of-page.js +15 -0
- package/lib/db-ops/meta/get-iframes-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-iframes-of-page.js +15 -0
- package/lib/db-ops/meta/get-jsonld-of-page.d.ts +13 -0
- package/lib/db-ops/meta/get-jsonld-of-page.js +27 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.js +15 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.js +15 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.js +15 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.js +15 -0
- package/lib/db-ops/meta/get-videos-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-videos-of-page.js +15 -0
- package/lib/db-ops/outages/close-network-outage.d.ts +12 -0
- package/lib/db-ops/outages/close-network-outage.js +15 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.d.ts +26 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.js +42 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.d.ts +26 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.js +31 -0
- package/lib/db-ops/outages/insert-network-outage.d.ts +14 -0
- package/lib/db-ops/outages/insert-network-outage.js +29 -0
- package/lib/db-ops/outages/list-network-outages.d.ts +28 -0
- package/lib/db-ops/outages/list-network-outages.js +42 -0
- package/lib/db-ops/pages/order/set-url-order.d.ts +13 -0
- package/lib/db-ops/pages/order/set-url-order.js +38 -0
- package/lib/db-ops/pages/read/build-page-query.d.ts +18 -0
- package/lib/db-ops/pages/read/build-page-query.js +40 -0
- package/lib/db-ops/pages/read/get-crawling-state.d.ts +117 -0
- package/lib/db-ops/pages/read/get-crawling-state.js +161 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.d.ts +15 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.js +30 -0
- package/lib/db-ops/pages/read/get-page-count.d.ts +12 -0
- package/lib/db-ops/pages/read/get-page-count.js +21 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.d.ts +24 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.js +28 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.d.ts +38 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.js +107 -0
- package/lib/db-ops/pages/read/get-pages.d.ts +11 -0
- package/lib/db-ops/pages/read/get-pages.js +51 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.d.ts +18 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.js +25 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.d.ts +31 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.js +32 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.d.ts +20 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.js +37 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.d.ts +30 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.js +91 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.d.ts +88 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.js +216 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.d.ts +80 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.js +151 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.d.ts +24 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.js +24 -0
- package/lib/db-ops/pages/write/insert-audios.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-audios.js +25 -0
- package/lib/db-ops/pages/write/insert-buttons.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-buttons.js +29 -0
- package/lib/db-ops/pages/write/insert-canvases.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-canvases.js +26 -0
- package/lib/db-ops/pages/write/insert-custom-elements.d.ts +27 -0
- package/lib/db-ops/pages/write/insert-custom-elements.js +40 -0
- package/lib/db-ops/pages/write/insert-headings.d.ts +15 -0
- package/lib/db-ops/pages/write/insert-headings.js +27 -0
- package/lib/db-ops/pages/write/insert-iframes.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-iframes.js +28 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.d.ts +38 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.js +60 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.d.ts +36 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.js +48 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.d.ts +42 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.js +56 -0
- package/lib/db-ops/pages/write/insert-jsonld.d.ts +17 -0
- package/lib/db-ops/pages/write/insert-jsonld.js +49 -0
- package/lib/db-ops/pages/write/insert-main-content-images.d.ts +20 -0
- package/lib/db-ops/pages/write/insert-main-content-images.js +32 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.js +29 -0
- package/lib/db-ops/pages/write/insert-page.d.ts +56 -0
- package/lib/db-ops/pages/write/insert-page.js +259 -0
- package/lib/db-ops/pages/write/insert-technologies.d.ts +25 -0
- package/lib/db-ops/pages/write/insert-technologies.js +45 -0
- package/lib/db-ops/pages/write/insert-videos.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-videos.js +28 -0
- package/lib/db-ops/pages/write/link-redirect-sources.d.ts +42 -0
- package/lib/db-ops/pages/write/link-redirect-sources.js +101 -0
- package/lib/db-ops/pages/write/record-redirect.d.ts +35 -0
- package/lib/db-ops/pages/write/record-redirect.js +100 -0
- package/lib/db-ops/pages/write/set-skipped-page.d.ts +13 -0
- package/lib/db-ops/pages/write/set-skipped-page.js +24 -0
- package/lib/db-ops/pages/write/update-page.d.ts +40 -0
- package/lib/db-ops/pages/write/update-page.js +419 -0
- package/lib/db-ops/pages/write/write-page-html-blob.d.ts +19 -0
- package/lib/db-ops/pages/write/write-page-html-blob.js +41 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.d.ts +9 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.js +15 -0
- package/lib/db-ops/referrers/get-referrers-of-page.d.ts +17 -0
- package/lib/db-ops/referrers/get-referrers-of-page.js +32 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.d.ts +8 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.js +15 -0
- package/lib/db-ops/resources/build-resource-query.d.ts +25 -0
- package/lib/db-ops/resources/build-resource-query.js +29 -0
- package/lib/db-ops/resources/get-existing-resource-urls.d.ts +9 -0
- package/lib/db-ops/resources/get-existing-resource-urls.js +24 -0
- package/lib/db-ops/resources/get-resource-by-url.d.ts +13 -0
- package/lib/db-ops/resources/get-resource-by-url.js +22 -0
- package/lib/db-ops/resources/get-resource-url-list.d.ts +17 -0
- package/lib/db-ops/resources/get-resource-url-list.js +26 -0
- package/lib/db-ops/resources/get-resources.d.ts +8 -0
- package/lib/db-ops/resources/get-resources.js +11 -0
- package/lib/db-ops/resources/insert-inventory-resources.d.ts +24 -0
- package/lib/db-ops/resources/insert-inventory-resources.js +64 -0
- package/lib/db-ops/resources/insert-resource-referrers.d.ts +15 -0
- package/lib/db-ops/resources/insert-resource-referrers.js +54 -0
- package/lib/db-ops/resources/insert-resource.d.ts +34 -0
- package/lib/db-ops/resources/insert-resource.js +73 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.d.ts +26 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.js +30 -0
- package/lib/db-ops/templates/assign-template-labels.d.ts +60 -0
- package/lib/db-ops/templates/assign-template-labels.js +187 -0
- package/lib/db-ops/templates/replace-page-templates.d.ts +44 -0
- package/lib/db-ops/templates/replace-page-templates.js +174 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.d.ts +16 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.js +17 -0
- package/lib/db-ops/templates/types.d.ts +103 -0
- package/lib/db-ops/templates/types.js +1 -0
- package/lib/debug.d.ts +8 -0
- package/lib/debug.js +9 -0
- package/lib/decode-html-blob.d.ts +20 -0
- package/lib/decode-html-blob.js +23 -0
- package/lib/decode-page-html-blob-bytes.d.ts +25 -0
- package/lib/decode-page-html-blob-bytes.js +29 -0
- package/lib/decode-stored-blob-bytes.d.ts +25 -0
- package/lib/decode-stored-blob-bytes.js +47 -0
- package/lib/derive-lineage-from-parent.d.ts +37 -0
- package/lib/derive-lineage-from-parent.js +42 -0
- package/lib/drop-legacy-tables.d.ts +45 -0
- package/lib/drop-legacy-tables.js +56 -0
- package/lib/error-kind/classify-error-kind.d.ts +20 -0
- package/lib/error-kind/classify-error-kind.js +136 -0
- package/lib/error-kind/network-related-error-kinds.d.ts +23 -0
- package/lib/error-kind/network-related-error-kinds.js +28 -0
- package/lib/error-kind/permanent-error-kinds.d.ts +48 -0
- package/lib/error-kind/permanent-error-kinds.js +54 -0
- package/lib/error-kind/types.d.ts +54 -0
- package/lib/error-kind/types.js +1 -0
- package/lib/filesystem/append-text.d.ts +9 -0
- package/lib/filesystem/append-text.js +14 -0
- package/lib/filesystem/copy-dir-sync.d.ts +6 -0
- package/lib/filesystem/copy-dir-sync.js +9 -0
- package/lib/filesystem/copy-dir.d.ts +7 -0
- package/lib/filesystem/copy-dir.js +13 -0
- package/lib/filesystem/copy-file-with-progress.d.ts +20 -0
- package/lib/filesystem/copy-file-with-progress.js +34 -0
- package/lib/filesystem/exists.d.ts +6 -0
- package/lib/filesystem/exists.js +9 -0
- package/lib/filesystem/get-file-list.d.ts +8 -0
- package/lib/filesystem/get-file-list.js +12 -0
- package/lib/filesystem/is-dir.d.ts +6 -0
- package/lib/filesystem/is-dir.js +10 -0
- package/lib/filesystem/mkdir.d.ts +8 -0
- package/lib/filesystem/mkdir.js +15 -0
- package/lib/filesystem/output-binary.d.ts +12 -0
- package/lib/filesystem/output-binary.js +17 -0
- package/lib/filesystem/output-json.d.ts +9 -0
- package/lib/filesystem/output-json.js +14 -0
- package/lib/filesystem/output-text.d.ts +11 -0
- package/lib/filesystem/output-text.js +32 -0
- package/lib/filesystem/parse-pax-path.d.ts +18 -0
- package/lib/filesystem/parse-pax-path.js +47 -0
- package/lib/filesystem/parse-tar-size-field.d.ts +13 -0
- package/lib/filesystem/parse-tar-size-field.js +40 -0
- package/lib/filesystem/peek-tar-top-dir.d.ts +35 -0
- package/lib/filesystem/peek-tar-top-dir.js +215 -0
- package/lib/filesystem/read-json.d.ts +7 -0
- package/lib/filesystem/read-json.js +11 -0
- package/lib/filesystem/read-text.d.ts +6 -0
- package/lib/filesystem/read-text.js +10 -0
- package/lib/filesystem/readline.d.ts +11 -0
- package/lib/filesystem/readline.js +26 -0
- package/lib/filesystem/remove.d.ts +5 -0
- package/lib/filesystem/remove.js +10 -0
- package/lib/filesystem/rename.d.ts +16 -0
- package/lib/filesystem/rename.js +48 -0
- package/lib/filesystem/tar.d.ts +23 -0
- package/lib/filesystem/tar.js +78 -0
- package/lib/filesystem/untar.d.ts +33 -0
- package/lib/filesystem/untar.js +84 -0
- package/lib/get-failed-page-messages.d.ts +56 -0
- package/lib/get-failed-page-messages.js +146 -0
- package/lib/get-json.d.ts +10 -0
- package/lib/get-json.js +25 -0
- package/lib/html-snapshot/match-selector-html.d.ts +25 -0
- package/lib/html-snapshot/match-selector-html.js +28 -0
- package/lib/html-snapshot/match-selector-snapshots.d.ts +33 -0
- package/lib/html-snapshot/match-selector-snapshots.js +33 -0
- package/lib/html-snapshot/search-html-document.d.ts +29 -0
- package/lib/html-snapshot/search-html-document.js +27 -0
- package/lib/html-snapshot/search-html-snapshots.d.ts +36 -0
- package/lib/html-snapshot/search-html-snapshots.js +35 -0
- package/lib/html-snapshot/types.d.ts +111 -0
- package/lib/html-snapshot/types.js +7 -0
- package/lib/html-snapshot/validate-search-pattern.d.ts +15 -0
- package/lib/html-snapshot/validate-search-pattern.js +17 -0
- package/lib/init-schema.d.ts +48 -0
- package/lib/init-schema.js +124 -0
- package/lib/is-inventory-source.d.ts +21 -0
- package/lib/is-inventory-source.js +22 -0
- package/lib/is-within-outage-window.d.ts +49 -0
- package/lib/is-within-outage-window.js +33 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.d.ts +24 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.js +26 -0
- package/lib/libsql-dialect.d.ts +115 -0
- package/lib/libsql-dialect.js +116 -0
- package/lib/limited-page-ids.d.ts +9 -0
- package/lib/limited-page-ids.js +18 -0
- package/lib/meta/assert-compatible-version.d.ts +60 -0
- package/lib/meta/assert-compatible-version.js +93 -0
- package/lib/meta/classify-jsonld-type.d.ts +23 -0
- package/lib/meta/classify-jsonld-type.js +43 -0
- package/lib/meta/compare-semver.d.ts +23 -0
- package/lib/meta/compare-semver.js +51 -0
- package/lib/meta/compute-main-contents-denormalized.d.ts +41 -0
- package/lib/meta/compute-main-contents-denormalized.js +88 -0
- package/lib/meta/compute-page-denormalized.d.ts +20 -0
- package/lib/meta/compute-page-denormalized.js +35 -0
- package/lib/meta/derive-flat-from-meta.d.ts +34 -0
- package/lib/meta/derive-flat-from-meta.js +158 -0
- package/lib/meta/derive-meta-extras.d.ts +20 -0
- package/lib/meta/derive-meta-extras.js +23 -0
- package/lib/meta/extract-tags-for-archive.d.ts +17 -0
- package/lib/meta/extract-tags-for-archive.js +36 -0
- package/lib/meta/parse-main-content-class-list.d.ts +19 -0
- package/lib/meta/parse-main-content-class-list.js +34 -0
- package/lib/meta/summarize-jsonld.d.ts +17 -0
- package/lib/meta/summarize-jsonld.js +29 -0
- package/lib/meta/technologies/combine-technology-confidence.d.ts +46 -0
- package/lib/meta/technologies/combine-technology-confidence.js +93 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.d.ts +45 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.js +53 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.d.ts +33 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.js +46 -0
- package/lib/meta/technologies/extract-technologies-for-archive.d.ts +33 -0
- package/lib/meta/technologies/extract-technologies-for-archive.js +30 -0
- package/lib/meta/technologies/match-js-license-comment-signal.d.ts +21 -0
- package/lib/meta/technologies/match-js-license-comment-signal.js +23 -0
- package/lib/meta/technologies/match-structural-technology-signals.d.ts +26 -0
- package/lib/meta/technologies/match-structural-technology-signals.js +48 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.d.ts +25 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.js +35 -0
- package/lib/meta/technologies/technology-signal-definitions.d.ts +44 -0
- package/lib/meta/technologies/technology-signal-definitions.js +60 -0
- package/lib/meta/technologies/types.d.ts +70 -0
- package/lib/meta/technologies/types.js +13 -0
- package/lib/meta/types.d.ts +1490 -0
- package/lib/meta/types.js +65 -0
- package/lib/migrate-content-items-alias-of-id.d.ts +52 -0
- package/lib/migrate-content-items-alias-of-id.js +69 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.d.ts +46 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.js +62 -0
- package/lib/migrate-content-items-is-metadata-only.d.ts +44 -0
- package/lib/migrate-content-items-is-metadata-only.js +60 -0
- package/lib/migrate-entity-tables.d.ts +55 -0
- package/lib/migrate-entity-tables.js +66 -0
- package/lib/migrate-info-created-cwd.d.ts +17 -0
- package/lib/migrate-info-created-cwd.js +36 -0
- package/lib/migrate-info-main-content-selector.d.ts +16 -0
- package/lib/migrate-info-main-content-selector.js +35 -0
- package/lib/migrate-info-request-header-names.d.ts +16 -0
- package/lib/migrate-info-request-header-names.js +35 -0
- package/lib/migrate-info-roots.d.ts +20 -0
- package/lib/migrate-info-roots.js +52 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.d.ts +34 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.js +51 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.d.ts +25 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.js +44 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.d.ts +16 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.js +35 -0
- package/lib/migrate-main-contents-columns.d.ts +26 -0
- package/lib/migrate-main-contents-columns.js +61 -0
- package/lib/migrate-page-meta-body-hash.d.ts +44 -0
- package/lib/migrate-page-meta-body-hash.js +63 -0
- package/lib/migrate-page-meta-console-error-count.d.ts +27 -0
- package/lib/migrate-page-meta-console-error-count.js +45 -0
- package/lib/migrate-page-meta-custom-element-count.d.ts +33 -0
- package/lib/migrate-page-meta-custom-element-count.js +51 -0
- package/lib/migrate-page-meta-image-scan.d.ts +27 -0
- package/lib/migrate-page-meta-image-scan.js +52 -0
- package/lib/migrate-page-tags-to-page-technologies.d.ts +39 -0
- package/lib/migrate-page-tags-to-page-technologies.js +79 -0
- package/lib/migrate-ref-tables.d.ts +25 -0
- package/lib/migrate-ref-tables.js +38 -0
- package/lib/native-executor/check-native-executor-config.d.ts +17 -0
- package/lib/native-executor/check-native-executor-config.js +20 -0
- package/lib/page-meta-column-maps.d.ts +32 -0
- package/lib/page-meta-column-maps.js +43 -0
- package/lib/page.d.ts +546 -0
- package/lib/page.js +764 -0
- package/lib/peek-archive-lock.d.ts +40 -0
- package/lib/peek-archive-lock.js +62 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.d.ts +41 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.js +87 -0
- package/lib/populate-entity-tables/derive-dom-path.d.ts +35 -0
- package/lib/populate-entity-tables/derive-dom-path.js +72 -0
- package/lib/populate-entity-tables/is-blob-ref-value.d.ts +16 -0
- package/lib/populate-entity-tables/is-blob-ref-value.js +19 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.d.ts +66 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.js +96 -0
- package/lib/populate-entity-tables/populate-anchor-edges.d.ts +33 -0
- package/lib/populate-entity-tables/populate-anchor-edges.js +153 -0
- package/lib/populate-entity-tables/populate-content-items.d.ts +40 -0
- package/lib/populate-entity-tables/populate-content-items.js +141 -0
- package/lib/populate-entity-tables/populate-entities.d.ts +81 -0
- package/lib/populate-entity-tables/populate-entities.js +110 -0
- package/lib/populate-entity-tables/populate-image-items.d.ts +91 -0
- package/lib/populate-entity-tables/populate-image-items.js +226 -0
- package/lib/populate-entity-tables/populate-page-meta.d.ts +33 -0
- package/lib/populate-entity-tables/populate-page-meta.js +267 -0
- package/lib/populate-entity-tables/populate-resource-items.d.ts +22 -0
- package/lib/populate-entity-tables/populate-resource-items.js +114 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.d.ts +31 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.js +33 -0
- package/lib/populate-entity-tables/resolve-blob-refs.d.ts +31 -0
- package/lib/populate-entity-tables/resolve-blob-refs.js +100 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.d.ts +22 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.js +27 -0
- package/lib/populate-entity-tables/resolve-header-sets.d.ts +49 -0
- package/lib/populate-entity-tables/resolve-header-sets.js +122 -0
- package/lib/populate-entity-tables/resolve-json-refs.d.ts +25 -0
- package/lib/populate-entity-tables/resolve-json-refs.js +67 -0
- package/lib/populate-entity-tables/resolve-text-refs.d.ts +30 -0
- package/lib/populate-entity-tables/resolve-text-refs.js +61 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.d.ts +21 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.js +27 -0
- package/lib/populate-entity-tables/resolve-url-refs.d.ts +33 -0
- package/lib/populate-entity-tables/resolve-url-refs.js +60 -0
- package/lib/populate-entity-tables/test-utils/count-rows.d.ts +17 -0
- package/lib/populate-entity-tables/test-utils/count-rows.js +20 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.d.ts +25 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.js +42 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.d.ts +30 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.js +175 -0
- package/lib/populate-entity-tables/types.d.ts +157 -0
- package/lib/populate-entity-tables/types.js +12 -0
- package/lib/populate-entity-tables/upsert-text-refs.d.ts +38 -0
- package/lib/populate-entity-tables/upsert-text-refs.js +78 -0
- package/lib/populate-ref-tables/classify-content-type.d.ts +16 -0
- package/lib/populate-ref-tables/classify-content-type.js +52 -0
- package/lib/populate-ref-tables/compute-content-hash.d.ts +22 -0
- package/lib/populate-ref-tables/compute-content-hash.js +26 -0
- package/lib/populate-ref-tables/compute-header-flags.d.ts +16 -0
- package/lib/populate-ref-tables/compute-header-flags.js +70 -0
- package/lib/populate-ref-tables/content-type-rules.d.ts +38 -0
- package/lib/populate-ref-tables/content-type-rules.js +133 -0
- package/lib/populate-ref-tables/create-header-table-caches.d.ts +25 -0
- package/lib/populate-ref-tables/create-header-table-caches.js +49 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.d.ts +15 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.js +15 -0
- package/lib/populate-ref-tables/decode-data-uri.d.ts +21 -0
- package/lib/populate-ref-tables/decode-data-uri.js +126 -0
- package/lib/populate-ref-tables/decompose-header-set.d.ts +29 -0
- package/lib/populate-ref-tables/decompose-header-set.js +157 -0
- package/lib/populate-ref-tables/decompose-url.d.ts +25 -0
- package/lib/populate-ref-tables/decompose-url.js +70 -0
- package/lib/populate-ref-tables/header-stability.d.ts +19 -0
- package/lib/populate-ref-tables/header-stability.js +22 -0
- package/lib/populate-ref-tables/header-value-cache-key.d.ts +17 -0
- package/lib/populate-ref-tables/header-value-cache-key.js +19 -0
- package/lib/populate-ref-tables/normalize-mime.d.ts +24 -0
- package/lib/populate-ref-tables/normalize-mime.js +36 -0
- package/lib/populate-ref-tables/populate-blob-refs.d.ts +38 -0
- package/lib/populate-ref-tables/populate-blob-refs.js +134 -0
- package/lib/populate-ref-tables/populate-content-type-refs.d.ts +27 -0
- package/lib/populate-ref-tables/populate-content-type-refs.js +70 -0
- package/lib/populate-ref-tables/populate-header-tables.d.ts +35 -0
- package/lib/populate-ref-tables/populate-header-tables.js +80 -0
- package/lib/populate-ref-tables/populate-json-refs.d.ts +29 -0
- package/lib/populate-ref-tables/populate-json-refs.js +101 -0
- package/lib/populate-ref-tables/populate-refs.d.ts +51 -0
- package/lib/populate-ref-tables/populate-refs.js +62 -0
- package/lib/populate-ref-tables/populate-text-refs.d.ts +32 -0
- package/lib/populate-ref-tables/populate-text-refs.js +133 -0
- package/lib/populate-ref-tables/populate-url-refs.d.ts +28 -0
- package/lib/populate-ref-tables/populate-url-refs.js +148 -0
- package/lib/populate-ref-tables/test-utils/count-rows.d.ts +15 -0
- package/lib/populate-ref-tables/test-utils/count-rows.js +17 -0
- package/lib/populate-ref-tables/types.d.ts +197 -0
- package/lib/populate-ref-tables/types.js +7 -0
- package/lib/populate-ref-tables/upsert-one-header-set.d.ts +34 -0
- package/lib/populate-ref-tables/upsert-one-header-set.js +208 -0
- package/lib/populate-ref-tables/volatile-header-names.d.ts +20 -0
- package/lib/populate-ref-tables/volatile-header-names.js +33 -0
- package/lib/redirect-table.d.ts +9 -0
- package/lib/redirect-table.js +28 -0
- package/lib/release-finished-statements.d.ts +42 -0
- package/lib/release-finished-statements.js +45 -0
- package/lib/resolve-redirect-chain.d.ts +33 -0
- package/lib/resolve-redirect-chain.js +27 -0
- package/lib/resource.d.ts +46 -0
- package/lib/resource.js +62 -0
- package/lib/retarget-legacy-fk-tables.d.ts +61 -0
- package/lib/retarget-legacy-fk-tables.js +137 -0
- package/lib/safe-path.d.ts +9 -0
- package/lib/safe-path.js +17 -0
- package/lib/scope/build-scope-map.d.ts +21 -0
- package/lib/scope/build-scope-map.js +32 -0
- package/lib/scope/find-scope-entry.d.ts +25 -0
- package/lib/scope/find-scope-entry.js +45 -0
- package/lib/template-classification/classify-archive-page-templates.d.ts +42 -0
- package/lib/template-classification/classify-archive-page-templates.js +70 -0
- package/lib/template-classification/classify-page-templates.d.ts +33 -0
- package/lib/template-classification/classify-page-templates.js +60 -0
- package/lib/template-classification/collect-page-ids-with-html.d.ts +24 -0
- package/lib/template-classification/collect-page-ids-with-html.js +30 -0
- package/lib/template-classification/collect-page-stylesheet-urls.d.ts +32 -0
- package/lib/template-classification/collect-page-stylesheet-urls.js +130 -0
- package/lib/template-classification/create-content-root-hint.d.ts +41 -0
- package/lib/template-classification/create-content-root-hint.js +51 -0
- package/lib/template-classification/create-page-cluster-factory.d.ts +36 -0
- package/lib/template-classification/create-page-cluster-factory.js +52 -0
- package/lib/template-classification/load-page-cluster-candidates.d.ts +32 -0
- package/lib/template-classification/load-page-cluster-candidates.js +93 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.d.ts +34 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.js +236 -0
- package/lib/template-classification/page-cluster/types.d.ts +123 -0
- package/lib/template-classification/page-cluster/types.js +1 -0
- package/lib/template-classification/types.d.ts +234 -0
- package/lib/template-classification/types.js +1 -0
- package/lib/test-utils/build-full-schema-test-db.d.ts +34 -0
- package/lib/test-utils/build-full-schema-test-db.js +74 -0
- package/lib/test-utils/create-legacy-analysis-tables.d.ts +13 -0
- package/lib/test-utils/create-legacy-analysis-tables.js +37 -0
- package/lib/test-utils/fk-parent-tables.d.ts +15 -0
- package/lib/test-utils/fk-parent-tables.js +19 -0
- package/lib/test-utils/seed-content-item.d.ts +35 -0
- package/lib/test-utils/seed-content-item.js +42 -0
- package/lib/test-utils/setup-legacy-fk-db.d.ts +34 -0
- package/lib/test-utils/setup-legacy-fk-db.js +271 -0
- package/lib/transfer/attach-source-database.d.ts +31 -0
- package/lib/transfer/attach-source-database.js +40 -0
- package/lib/transfer/build-split-config.d.ts +30 -0
- package/lib/transfer/build-split-config.js +42 -0
- package/lib/transfer/clear-replaced-page-rows.d.ts +23 -0
- package/lib/transfer/clear-replaced-page-rows.js +61 -0
- package/lib/transfer/concat-archives.d.ts +55 -0
- package/lib/transfer/concat-archives.js +95 -0
- package/lib/transfer/concat-source-transfer-phases.d.ts +10 -0
- package/lib/transfer/concat-source-transfer-phases.js +17 -0
- package/lib/transfer/content-item-rank-sql.d.ts +21 -0
- package/lib/transfer/content-item-rank-sql.js +23 -0
- package/lib/transfer/copy-anchor-edges.d.ts +28 -0
- package/lib/transfer/copy-anchor-edges.js +42 -0
- package/lib/transfer/copy-dictionaries-for-concat.d.ts +39 -0
- package/lib/transfer/copy-dictionaries-for-concat.js +81 -0
- package/lib/transfer/copy-dictionaries-for-split.d.ts +29 -0
- package/lib/transfer/copy-dictionaries-for-split.js +224 -0
- package/lib/transfer/copy-header-set-children.d.ts +27 -0
- package/lib/transfer/copy-header-set-children.js +51 -0
- package/lib/transfer/copy-image-items.d.ts +21 -0
- package/lib/transfer/copy-image-items.js +62 -0
- package/lib/transfer/copy-inventory-source-lists.d.ts +30 -0
- package/lib/transfer/copy-inventory-source-lists.js +61 -0
- package/lib/transfer/copy-journal-tables.d.ts +30 -0
- package/lib/transfer/copy-journal-tables.js +56 -0
- package/lib/transfer/copy-page-console-logs.d.ts +16 -0
- package/lib/transfer/copy-page-console-logs.js +27 -0
- package/lib/transfer/copy-page-html-blobs.d.ts +31 -0
- package/lib/transfer/copy-page-html-blobs.js +43 -0
- package/lib/transfer/copy-page-meta.d.ts +27 -0
- package/lib/transfer/copy-page-meta.js +68 -0
- package/lib/transfer/copy-page-template-clusters.d.ts +31 -0
- package/lib/transfer/copy-page-template-clusters.js +56 -0
- package/lib/transfer/copy-page-template-labels.d.ts +34 -0
- package/lib/transfer/copy-page-template-labels.js +88 -0
- package/lib/transfer/copy-resource-items.d.ts +29 -0
- package/lib/transfer/copy-resource-items.js +89 -0
- package/lib/transfer/copy-resource-ref-edges.d.ts +20 -0
- package/lib/transfer/copy-resource-ref-edges.js +33 -0
- package/lib/transfer/copy-simple-page-scoped-tables.d.ts +15 -0
- package/lib/transfer/copy-simple-page-scoped-tables.js +34 -0
- package/lib/transfer/count-external-pages-in-scope.d.ts +26 -0
- package/lib/transfer/count-external-pages-in-scope.js +40 -0
- package/lib/transfer/create-transfer-temp-tables.d.ts +30 -0
- package/lib/transfer/create-transfer-temp-tables.js +59 -0
- package/lib/transfer/dictionary-copy-specs.d.ts +32 -0
- package/lib/transfer/dictionary-copy-specs.js +28 -0
- package/lib/transfer/drop-transfer-temp-tables.d.ts +9 -0
- package/lib/transfer/drop-transfer-temp-tables.js +18 -0
- package/lib/transfer/flatten-redirect-chains.d.ts +44 -0
- package/lib/transfer/flatten-redirect-chains.js +74 -0
- package/lib/transfer/insert-content-items.d.ts +35 -0
- package/lib/transfer/insert-content-items.js +116 -0
- package/lib/transfer/list-transfer-columns.d.ts +35 -0
- package/lib/transfer/list-transfer-columns.js +45 -0
- package/lib/transfer/mark-in-scope-content-items.d.ts +31 -0
- package/lib/transfer/mark-in-scope-content-items.js +54 -0
- package/lib/transfer/merge-archive-configs.d.ts +51 -0
- package/lib/transfer/merge-archive-configs.js +85 -0
- package/lib/transfer/plan-content-items-for-concat.d.ts +33 -0
- package/lib/transfer/plan-content-items-for-concat.js +51 -0
- package/lib/transfer/plan-content-items-for-split.d.ts +42 -0
- package/lib/transfer/plan-content-items-for-split.js +83 -0
- package/lib/transfer/plan-resource-items.d.ts +40 -0
- package/lib/transfer/plan-resource-items.js +69 -0
- package/lib/transfer/quote-transfer-identifier.d.ts +18 -0
- package/lib/transfer/quote-transfer-identifier.js +20 -0
- package/lib/transfer/reclassify-resource-externality.d.ts +37 -0
- package/lib/transfer/reclassify-resource-externality.js +66 -0
- package/lib/transfer/remap-redirect-dest-ids.d.ts +34 -0
- package/lib/transfer/remap-redirect-dest-ids.js +51 -0
- package/lib/transfer/replace-content-items.d.ts +39 -0
- package/lib/transfer/replace-content-items.js +83 -0
- package/lib/transfer/simple-page-scoped-tables.d.ts +25 -0
- package/lib/transfer/simple-page-scoped-tables.js +38 -0
- package/lib/transfer/split-archive.d.ts +55 -0
- package/lib/transfer/split-archive.js +98 -0
- package/lib/transfer/split-source-transfer-phases.d.ts +11 -0
- package/lib/transfer/split-source-transfer-phases.js +18 -0
- package/lib/transfer/transfer-action.d.ts +34 -0
- package/lib/transfer/transfer-action.js +32 -0
- package/lib/transfer/transfer-archive-rows.d.ts +65 -0
- package/lib/transfer/transfer-archive-rows.js +156 -0
- package/lib/transfer/transfer-dictionary-tables.d.ts +12 -0
- package/lib/transfer/transfer-dictionary-tables.js +22 -0
- package/lib/transfer/transfer-post-phases.d.ts +10 -0
- package/lib/transfer/transfer-post-phases.js +13 -0
- package/lib/transfer/transfer-source-alias.d.ts +9 -0
- package/lib/transfer/transfer-source-alias.js +9 -0
- package/lib/transfer/types.d.ts +111 -0
- package/lib/transfer/types.js +35 -0
- package/lib/types.d.ts +772 -0
- package/lib/types.js +1 -0
- package/lib/url-alias/compute-tier-a-alias-key.d.ts +44 -0
- package/lib/url-alias/compute-tier-a-alias-key.js +47 -0
- package/lib/url-alias/compute-tier-b-alias-key.d.ts +23 -0
- package/lib/url-alias/compute-tier-b-alias-key.js +26 -0
- package/lib/url-alias/group-alias-candidates.d.ts +27 -0
- package/lib/url-alias/group-alias-candidates.js +29 -0
- package/lib/url-alias/types.d.ts +12 -0
- package/lib/url-alias/types.js +1 -0
- package/lib/url-pattern/compute-shape-key.d.ts +58 -0
- package/lib/url-pattern/compute-shape-key.js +129 -0
- package/lib/url-pattern/decompose-url.d.ts +33 -0
- package/lib/url-pattern/decompose-url.js +79 -0
- package/lib/url-pattern/reconstruct-url.d.ts +15 -0
- package/lib/url-pattern/reconstruct-url.js +33 -0
- package/lib/url-sort/compute-url-sort-ranks.d.ts +30 -0
- package/lib/url-sort/compute-url-sort-ranks.js +33 -0
- package/lib/utils/array/each-splitted.d.ts +10 -0
- package/lib/utils/array/each-splitted.js +14 -0
- package/lib/utils/debug.d.ts +8 -0
- package/lib/utils/debug.js +8 -0
- package/lib/utils/error/emit-error-with-retry.d.ts +40 -0
- package/lib/utils/error/emit-error-with-retry.js +44 -0
- package/lib/utils/error/emit-error.d.ts +39 -0
- package/lib/utils/error/emit-error.js +41 -0
- package/lib/utils/object/parse-response-headers.d.ts +12 -0
- package/lib/utils/object/parse-response-headers.js +26 -0
- package/lib/utils/object/redact-request-headers.d.ts +15 -0
- package/lib/utils/object/redact-request-headers.js +27 -0
- package/lib/utils/types/types.d.ts +383 -0
- package/lib/utils/types/types.js +1 -0
- package/lib/verify-migration/capture-rejection.d.ts +24 -0
- package/lib/verify-migration/capture-rejection.js +31 -0
- package/lib/verify-migration/check-anchor-edges-count.d.ts +34 -0
- package/lib/verify-migration/check-anchor-edges-count.js +72 -0
- package/lib/verify-migration/check-anchor-edges-sum.d.ts +13 -0
- package/lib/verify-migration/check-anchor-edges-sum.js +27 -0
- package/lib/verify-migration/check-content-items-count.d.ts +16 -0
- package/lib/verify-migration/check-content-items-count.js +30 -0
- package/lib/verify-migration/check-content-type-preservation.d.ts +22 -0
- package/lib/verify-migration/check-content-type-preservation.js +40 -0
- package/lib/verify-migration/check-foreign-key-integrity.d.ts +31 -0
- package/lib/verify-migration/check-foreign-key-integrity.js +47 -0
- package/lib/verify-migration/check-image-items-count.d.ts +12 -0
- package/lib/verify-migration/check-image-items-count.js +26 -0
- package/lib/verify-migration/check-page-meta-count.d.ts +15 -0
- package/lib/verify-migration/check-page-meta-count.js +31 -0
- package/lib/verify-migration/check-reader-parity.d.ts +23 -0
- package/lib/verify-migration/check-reader-parity.js +182 -0
- package/lib/verify-migration/check-resource-items-count.d.ts +17 -0
- package/lib/verify-migration/check-resource-items-count.js +33 -0
- package/lib/verify-migration/check-url-round-trip.d.ts +43 -0
- package/lib/verify-migration/check-url-round-trip.js +112 -0
- package/lib/verify-migration/types.d.ts +70 -0
- package/lib/verify-migration/types.js +63 -0
- package/lib/verify-migration/verify-migration.d.ts +41 -0
- package/lib/verify-migration/verify-migration.js +120 -0
- package/lib/with-bulk-write-pragmas.d.ts +51 -0
- package/lib/with-bulk-write-pragmas.js +132 -0
- package/lib/write-queue.d.ts +32 -0
- package/lib/write-queue.js +55 -0
- package/package.json +350 -3
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { createAdjunctTables } from './create-adjunct-tables.js';
|
|
2
|
+
import { createEntityTables } from './create-entity-tables.js';
|
|
3
|
+
import { createRefTables } from './create-ref-tables.js';
|
|
4
|
+
import { createTemplateTables } from './create-template-tables.js';
|
|
5
|
+
/**
|
|
6
|
+
* Initializes the archive database schema if tables do not exist.
|
|
7
|
+
*
|
|
8
|
+
* The schema is composed of five groups, each owned by a dedicated DDL
|
|
9
|
+
* function so the migration script (`scripts/migrate-to-0.13.mjs`) can
|
|
10
|
+
* provision the exact same shapes on archives it upgrades:
|
|
11
|
+
*
|
|
12
|
+
* - **`info`** (inline below): single-row crawl configuration.
|
|
13
|
+
* - **Ref / header dictionary tables** ({@link createRefTables}):
|
|
14
|
+
* `url_refs`, `content_type_refs`, `text_refs`, `json_refs`,
|
|
15
|
+
* `blob_refs`, `header_name_refs`, `header_value_refs`, `header_sets`,
|
|
16
|
+
* `header_set_entries`, `header_flags`. See that file for column-level
|
|
17
|
+
* rationale and the reason `blob_refs` uses a regular rowid PK instead
|
|
18
|
+
* of WITHOUT ROWID.
|
|
19
|
+
* - **Entity / edge tables** ({@link createEntityTables}):
|
|
20
|
+
* `content_items`, `page_meta`, `resource_items`, `anchor_edges`,
|
|
21
|
+
* `resource_ref_edges`, `image_items` — the write-model the crawler
|
|
22
|
+
* writes during a crawl and every reader queries. Must run AFTER
|
|
23
|
+
* `createRefTables` because most entity tables reference ref-table PKs.
|
|
24
|
+
* - **Adjunct tables** ({@link createAdjunctTables}): `page_errors`,
|
|
25
|
+
* `crawl_errors`, `technology_signals`, `page_technologies`, `page_jsonld`, `list_reconcile_runs`,
|
|
26
|
+
* `page_html_blobs` +
|
|
27
|
+
* `page_html_ref`. Must run AFTER `createEntityTables` because the
|
|
28
|
+
* page-scoped tables FK into `content_items(id)`.
|
|
29
|
+
* - **Template classification tables** ({@link createTemplateTables}):
|
|
30
|
+
* `page_templates`, `page_template_clusters`, `page_template_labels` —
|
|
31
|
+
* the crawl-end DOM-structure classification, kept apart from the
|
|
32
|
+
* adjunct tables because it has its own producer and write path.
|
|
33
|
+
*
|
|
34
|
+
* The legacy flat write-model tables (`pages` / `anchors` / `images` /
|
|
35
|
+
* `resources` / `resources-referrers`) are deliberately NOT created:
|
|
36
|
+
* they only exist inside pre-0.13 archives, where they serve as the
|
|
37
|
+
* populate source for `scripts/migrate-to-0.13.mjs` before that script
|
|
38
|
+
* drops them.
|
|
39
|
+
*
|
|
40
|
+
* **PRAGMA `page_size` and `journal_mode`** are set BEFORE any
|
|
41
|
+
* `CREATE TABLE` because SQLite only honors `page_size` changes against
|
|
42
|
+
* an empty database, and `journal_mode = WAL` is persistent. Other
|
|
43
|
+
* per-connection PRAGMAs live in {@link applyConnectionPragmas}.
|
|
44
|
+
*
|
|
45
|
+
* Pre-0.13 migration is intentionally absent. `assertCompatibleVersion`
|
|
46
|
+
* (called before `initSchema`) rejects older archives with a friendly
|
|
47
|
+
* error naming the migration scripts to run; `v0.x` policy allows
|
|
48
|
+
* breaking changes.
|
|
49
|
+
* @param instance - The Knex query builder instance connected to the database.
|
|
50
|
+
*/
|
|
51
|
+
export async function initSchema(instance) {
|
|
52
|
+
// Only the one-shot work (PRAGMAs + `info` creation) is gated on the
|
|
53
|
+
// `info` table's existence. The DDL groups below run on EVERY
|
|
54
|
+
// call: each is internally idempotent (sentinel / IF NOT EXISTS /
|
|
55
|
+
// per-table guards), and re-running them self-heals an archive whose
|
|
56
|
+
// provisioning crashed partway through — `info` created but a later
|
|
57
|
+
// group missing. With a single all-or-nothing gate, such a stub would
|
|
58
|
+
// short-circuit here forever and every subsequent write would die with
|
|
59
|
+
// `no such table` and no way back.
|
|
60
|
+
if (!(await instance.schema.hasTable('info'))) {
|
|
61
|
+
// Page size must be set on an empty database file; once any data is
|
|
62
|
+
// written, only VACUUM can change it. journal_mode is also one-shot
|
|
63
|
+
// (persistent) and so stays here.
|
|
64
|
+
await instance.raw('PRAGMA page_size = 16384');
|
|
65
|
+
await instance.raw('PRAGMA journal_mode = WAL');
|
|
66
|
+
await instance.schema.createTable('info', (t) => {
|
|
67
|
+
t.increments('id');
|
|
68
|
+
t.string('version');
|
|
69
|
+
t.string('name');
|
|
70
|
+
t.string('baseUrl');
|
|
71
|
+
t.json('roots');
|
|
72
|
+
t.boolean('recursive');
|
|
73
|
+
t.integer('interval');
|
|
74
|
+
t.boolean('image');
|
|
75
|
+
t.boolean('fetchExternal');
|
|
76
|
+
t.integer('parallels');
|
|
77
|
+
t.json('excludes');
|
|
78
|
+
t.json('excludeKeywords');
|
|
79
|
+
t.json('excludeUrls');
|
|
80
|
+
t.integer('maxExcludedDepth');
|
|
81
|
+
t.integer('retry');
|
|
82
|
+
t.boolean('fromList');
|
|
83
|
+
t.boolean('disableQueries');
|
|
84
|
+
t.string('userAgent');
|
|
85
|
+
t.boolean('ignoreRobots');
|
|
86
|
+
t.string('mainContentSelector');
|
|
87
|
+
t.json('requestHeaderNames');
|
|
88
|
+
t.string('createdCwd');
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
// 0.13 ref / header dictionary tables. DDL + column-level rationale
|
|
92
|
+
// lives in {@link createRefTables}, shared with the migration script's
|
|
93
|
+
// schema catch-up — a divergence between the two paths would silently
|
|
94
|
+
// break the population step's UNIQUE / CHECK contract.
|
|
95
|
+
// `createRefTables` uses bare CREATE TABLE, so it needs a sentinel
|
|
96
|
+
// guard here (all 10 tables are created together — any one of them
|
|
97
|
+
// works as the sentinel).
|
|
98
|
+
if (!(await instance.schema.hasTable('url_refs'))) {
|
|
99
|
+
await createRefTables(instance);
|
|
100
|
+
}
|
|
101
|
+
// 0.13 core entity / edge tables — the write-model the crawler writes
|
|
102
|
+
// during a crawl and every reader queries. MUST run after
|
|
103
|
+
// {@link createRefTables} because `content_items`, `page_meta`,
|
|
104
|
+
// `resource_items`, `anchor_edges`, and `image_items` all reference
|
|
105
|
+
// the ref tables (`url_refs`, `content_type_refs`, `text_refs`,
|
|
106
|
+
// `json_refs`, `blob_refs`, `header_sets`) via FK clauses.
|
|
107
|
+
await createEntityTables(instance);
|
|
108
|
+
// Adjunct tables that FK into `content_items` (page_errors /
|
|
109
|
+
// technology_signals / page_technologies / page_jsonld /
|
|
110
|
+
// page_html_*) plus the standalone log tables
|
|
111
|
+
// (crawl_errors / list_reconcile_runs). MUST run after
|
|
112
|
+
// {@link createEntityTables} so the FK targets exist. DDL +
|
|
113
|
+
// column-level rationale lives in {@link createAdjunctTables}, which is
|
|
114
|
+
// shared with `scripts/migrate-to-0.13.mjs` — a divergence between the
|
|
115
|
+
// two paths is exactly how migrated archives ended up with stale
|
|
116
|
+
// `REFERENCES pages(id)` declarations in the pre-0.13 era.
|
|
117
|
+
await createAdjunctTables(instance);
|
|
118
|
+
// Template classification tables (page_templates / page_template_clusters /
|
|
119
|
+
// page_template_labels). Separate from the adjunct group because the
|
|
120
|
+
// producer is the crawl-end classification step, not the crawl write path.
|
|
121
|
+
// `page_templates` FKs into `content_items(id)`, so this too
|
|
122
|
+
// MUST run after {@link createEntityTables}.
|
|
123
|
+
await createTemplateTables(instance);
|
|
124
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { PageSource } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Predicate that returns `true` when the given page source value belongs to
|
|
4
|
+
* the inventory chain — i.e. it is one of the `'inventory-*'` variants of
|
|
5
|
+
* {@link PageSource}.
|
|
6
|
+
*
|
|
7
|
+
* Centralises the membership check that decides whether lineage
|
|
8
|
+
* propagation should fire. Three call sites used to inline
|
|
9
|
+
* `s === 'inventory-seed' || s === 'inventory-discovered'`, which is both
|
|
10
|
+
* a DRY violation AND a future-proofing trap: when a new inventory-family
|
|
11
|
+
* label gets added (e.g. `'inventory-promoted'`), every inlined check has
|
|
12
|
+
* to be located and updated by hand. Routing through this predicate
|
|
13
|
+
* keeps the membership rule in one place.
|
|
14
|
+
*
|
|
15
|
+
* Returns `false` for `undefined` so callers can pass the raw `source`
|
|
16
|
+
* column value (which is non-NULL in the DB schema but reads as
|
|
17
|
+
* `undefined` from a missing row in JS) without a separate null check.
|
|
18
|
+
* @param source - The source value to test, or `undefined` when no row matched.
|
|
19
|
+
* @returns `true` if the source is in the inventory chain, `false` otherwise.
|
|
20
|
+
*/
|
|
21
|
+
export declare function isInventorySource(source: PageSource | undefined): boolean;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Predicate that returns `true` when the given page source value belongs to
|
|
3
|
+
* the inventory chain — i.e. it is one of the `'inventory-*'` variants of
|
|
4
|
+
* {@link PageSource}.
|
|
5
|
+
*
|
|
6
|
+
* Centralises the membership check that decides whether lineage
|
|
7
|
+
* propagation should fire. Three call sites used to inline
|
|
8
|
+
* `s === 'inventory-seed' || s === 'inventory-discovered'`, which is both
|
|
9
|
+
* a DRY violation AND a future-proofing trap: when a new inventory-family
|
|
10
|
+
* label gets added (e.g. `'inventory-promoted'`), every inlined check has
|
|
11
|
+
* to be located and updated by hand. Routing through this predicate
|
|
12
|
+
* keeps the membership rule in one place.
|
|
13
|
+
*
|
|
14
|
+
* Returns `false` for `undefined` so callers can pass the raw `source`
|
|
15
|
+
* column value (which is non-NULL in the DB schema but reads as
|
|
16
|
+
* `undefined` from a missing row in JS) without a separate null check.
|
|
17
|
+
* @param source - The source value to test, or `undefined` when no row matched.
|
|
18
|
+
* @returns `true` if the source is in the inventory chain, `false` otherwise.
|
|
19
|
+
*/
|
|
20
|
+
export function isInventorySource(source) {
|
|
21
|
+
return source === 'inventory-seed' || source === 'inventory-discovered';
|
|
22
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A resolved (closed) network-outage interval, as consumed by
|
|
3
|
+
* {@link isWithinOutageWindow}.
|
|
4
|
+
*
|
|
5
|
+
* This is deliberately NOT the raw `network_outages` row shape: a row whose
|
|
6
|
+
* `ended_at` is still `NULL` (the crawl session crashed before recovery was
|
|
7
|
+
* observed) must be resolved to a concrete `endedAt` by the caller — e.g.
|
|
8
|
+
* `listNetworkOutages` clamping it to the latest observed timestamp in the
|
|
9
|
+
* archive — before it reaches this function. Accepting a nullable `endedAt`
|
|
10
|
+
* here would let a crashed session's outage silently swallow every
|
|
11
|
+
* subsequent timestamp as "network-caused" forever.
|
|
12
|
+
*/
|
|
13
|
+
export interface OutageWindow {
|
|
14
|
+
/** Epoch ms the outage is considered to have started (already backdated to the earliest triggering error). */
|
|
15
|
+
readonly startedAt: number;
|
|
16
|
+
/** Epoch ms the outage is considered to have ended. Never `NULL` — see the interface docstring. */
|
|
17
|
+
readonly endedAt: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Decide whether a timestamp falls inside any recorded network-outage
|
|
21
|
+
* window — i.e. whether an error observed at that instant is more likely
|
|
22
|
+
* attributable to the operator's own network than to the target site.
|
|
23
|
+
*
|
|
24
|
+
* Pure and dependency-free by design: no DB handle, no `Crawler` instance.
|
|
25
|
+
* This is the single predicate every consumer (`resetFailedPages`,
|
|
26
|
+
* `listDnsBurnedHostCandidates`, `getSummary`'s attribution split) is
|
|
27
|
+
* expected to call, so the inclusive/exclusive boundary decision below is
|
|
28
|
+
* made exactly once.
|
|
29
|
+
*
|
|
30
|
+
* **Boundaries are inclusive on both ends.** A timestamp equal to
|
|
31
|
+
* `startedAt` or `endedAt` counts as inside the window. This errs toward
|
|
32
|
+
* attributing borderline errors to the outage rather than to the site:
|
|
33
|
+
* classifying a genuinely network-caused failure as "unknown/site kills it
|
|
34
|
+
* forever" (a false negative) is worse than the reverse (a false positive
|
|
35
|
+
* merely costs one extra retry pass before the kind classifier sorts it out
|
|
36
|
+
* again).
|
|
37
|
+
* @param timestamp - Epoch ms to test (typically an error's `createdAt`).
|
|
38
|
+
* @param windows - Resolved outage windows to test against. An empty array
|
|
39
|
+
* always yields `false` — this is what makes an archive with no
|
|
40
|
+
* `network_outages` rows (every archive created before this feature, or
|
|
41
|
+
* any crawl with no detected outage) behave identically to today.
|
|
42
|
+
* @returns `true` if `timestamp` falls within any window.
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* isWithinOutageWindow(1_000, [{ startedAt: 500, endedAt: 1_500 }]); // true
|
|
46
|
+
* isWithinOutageWindow(1_000, []); // false — no recorded outages
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare function isWithinOutageWindow(timestamp: number, windows: readonly OutageWindow[]): boolean;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decide whether a timestamp falls inside any recorded network-outage
|
|
3
|
+
* window — i.e. whether an error observed at that instant is more likely
|
|
4
|
+
* attributable to the operator's own network than to the target site.
|
|
5
|
+
*
|
|
6
|
+
* Pure and dependency-free by design: no DB handle, no `Crawler` instance.
|
|
7
|
+
* This is the single predicate every consumer (`resetFailedPages`,
|
|
8
|
+
* `listDnsBurnedHostCandidates`, `getSummary`'s attribution split) is
|
|
9
|
+
* expected to call, so the inclusive/exclusive boundary decision below is
|
|
10
|
+
* made exactly once.
|
|
11
|
+
*
|
|
12
|
+
* **Boundaries are inclusive on both ends.** A timestamp equal to
|
|
13
|
+
* `startedAt` or `endedAt` counts as inside the window. This errs toward
|
|
14
|
+
* attributing borderline errors to the outage rather than to the site:
|
|
15
|
+
* classifying a genuinely network-caused failure as "unknown/site kills it
|
|
16
|
+
* forever" (a false negative) is worse than the reverse (a false positive
|
|
17
|
+
* merely costs one extra retry pass before the kind classifier sorts it out
|
|
18
|
+
* again).
|
|
19
|
+
* @param timestamp - Epoch ms to test (typically an error's `createdAt`).
|
|
20
|
+
* @param windows - Resolved outage windows to test against. An empty array
|
|
21
|
+
* always yields `false` — this is what makes an archive with no
|
|
22
|
+
* `network_outages` rows (every archive created before this feature, or
|
|
23
|
+
* any crawl with no detected outage) behave identically to today.
|
|
24
|
+
* @returns `true` if `timestamp` falls within any window.
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* isWithinOutageWindow(1_000, [{ startedAt: 500, endedAt: 1_500 }]); // true
|
|
28
|
+
* isWithinOutageWindow(1_000, []); // false — no recorded outages
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export function isWithinOutageWindow(timestamp, windows) {
|
|
32
|
+
return windows.some((window) => timestamp >= window.startedAt && timestamp <= window.endedAt);
|
|
33
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { IsolatedClusterRun } from '@nitpicker/core/types';
|
|
2
|
+
/**
|
|
3
|
+
* Starts the computation of the connected components of the isolated pages
|
|
4
|
+
* (the inventory pages linked to only from other inventory pages), fed with
|
|
5
|
+
* the link edges as SQLite returns them and never holding them.
|
|
6
|
+
*
|
|
7
|
+
* `@nitpicker/query` reaches the native addon through this archive function
|
|
8
|
+
* (see ARCHITECTURE.md's dependency rule); what an edge counts as, how
|
|
9
|
+
* redirect and alias hops are followed and how the components are numbered
|
|
10
|
+
* are the docs of `createIsolatedClusterRun` in `@nitpicker/core`, which this
|
|
11
|
+
* calls as it is.
|
|
12
|
+
* @param candidateIds - The candidate page ids, in the order the components
|
|
13
|
+
* are numbered in (ascending page id for the viewer read model's `component_id`).
|
|
14
|
+
* @param redirects - The redirect and alias hops of the whole archive,
|
|
15
|
+
* `[source, destination, ...]` by page id.
|
|
16
|
+
* @returns The run.
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* const run = createIsolatedClusterRun([10, 20, 30], [40, 30]);
|
|
20
|
+
* run.unionEdges([10, 20, 20, 40]);
|
|
21
|
+
* run.labels(); // Uint32Array [0, 0, 0]
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function createIsolatedClusterRun(candidateIds: ArrayLike<number>, redirects: ArrayLike<number>): IsolatedClusterRun;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { createIsolatedClusterRun as createIsolatedClusterRunNative } from '@nitpicker/core/create-isolated-cluster-run';
|
|
2
|
+
/**
|
|
3
|
+
* Starts the computation of the connected components of the isolated pages
|
|
4
|
+
* (the inventory pages linked to only from other inventory pages), fed with
|
|
5
|
+
* the link edges as SQLite returns them and never holding them.
|
|
6
|
+
*
|
|
7
|
+
* `@nitpicker/query` reaches the native addon through this archive function
|
|
8
|
+
* (see ARCHITECTURE.md's dependency rule); what an edge counts as, how
|
|
9
|
+
* redirect and alias hops are followed and how the components are numbered
|
|
10
|
+
* are the docs of `createIsolatedClusterRun` in `@nitpicker/core`, which this
|
|
11
|
+
* calls as it is.
|
|
12
|
+
* @param candidateIds - The candidate page ids, in the order the components
|
|
13
|
+
* are numbered in (ascending page id for the viewer read model's `component_id`).
|
|
14
|
+
* @param redirects - The redirect and alias hops of the whole archive,
|
|
15
|
+
* `[source, destination, ...]` by page id.
|
|
16
|
+
* @returns The run.
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* const run = createIsolatedClusterRun([10, 20, 30], [40, 30]);
|
|
20
|
+
* run.unionEdges([10, 20, 20, 40]);
|
|
21
|
+
* run.labels(); // Uint32Array [0, 0, 0]
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export function createIsolatedClusterRun(candidateIds, redirects) {
|
|
25
|
+
return createIsolatedClusterRunNative(candidateIds, redirects);
|
|
26
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Minimal shape of the query object Knex passes to `_query`.
|
|
4
|
+
* `response` / `context` are what the `better-sqlite3` dialect fills in for
|
|
5
|
+
* statements that return no rows.
|
|
6
|
+
*/
|
|
7
|
+
interface DialectQuery {
|
|
8
|
+
sql?: string;
|
|
9
|
+
response?: unknown;
|
|
10
|
+
context?: unknown;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Type of Knex's internal `better-sqlite3` dialect: `Knex.Client` plus the two
|
|
14
|
+
* members {@link LibsqlDialect} relies on that the published declaration lacks.
|
|
15
|
+
* Declared as a class (not a constructor type) so the static side of
|
|
16
|
+
* `Knex.Client` is kept and `knex({ client: LibsqlDialect })` still type-checks.
|
|
17
|
+
*/
|
|
18
|
+
declare class BetterSqlite3Client extends Knex.Client {
|
|
19
|
+
/**
|
|
20
|
+
* `true` only on the per-transaction client Knex derives from the main one
|
|
21
|
+
* (`makeTxClient`), through which every query of a transaction runs.
|
|
22
|
+
*/
|
|
23
|
+
transacting?: boolean;
|
|
24
|
+
protected _query(connection: unknown, query: DialectQuery): Promise<DialectQuery>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Untyped reference to Knex's internal `better-sqlite3` dialect.
|
|
28
|
+
*
|
|
29
|
+
* Knex's published `exports` do not include this subpath, so TypeScript cannot
|
|
30
|
+
* resolve a declaration file for it. The dialect is a concrete subclass of
|
|
31
|
+
* `Knex.Client` at runtime, so the safe cast is intentional.
|
|
32
|
+
*/
|
|
33
|
+
declare const Base: typeof BetterSqlite3Client;
|
|
34
|
+
/**
|
|
35
|
+
* Knex dialect that reuses the `better-sqlite3` adapter logic but swaps the
|
|
36
|
+
* underlying driver for `libsql`. `libsql` ships pre-compiled binaries via the
|
|
37
|
+
* `@libsql/<platform>-<arch>` optionalDependencies pattern, so no postinstall
|
|
38
|
+
* download from GitHub Releases is required.
|
|
39
|
+
*
|
|
40
|
+
* A transaction that SQLite rolls back by itself (for example on a full disk)
|
|
41
|
+
* rejects with the original error, not with the failure of the `ROLLBACK`
|
|
42
|
+
* Knex sends afterwards.
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* import knex from 'knex';
|
|
46
|
+
*
|
|
47
|
+
* import { LibsqlDialect } from './libsql-dialect.js';
|
|
48
|
+
*
|
|
49
|
+
* const db = knex({
|
|
50
|
+
* client: LibsqlDialect,
|
|
51
|
+
* connection: { filename: 'archive.sqlite' },
|
|
52
|
+
* useNullAsDefault: true,
|
|
53
|
+
* });
|
|
54
|
+
*
|
|
55
|
+
* try {
|
|
56
|
+
* await db.transaction(async (trx) => {
|
|
57
|
+
* await trx.raw('INSERT INTO t (v) VALUES (?)', ['...']);
|
|
58
|
+
* });
|
|
59
|
+
* } catch (error) {
|
|
60
|
+
* // `SQLITE_FULL` when the disk filled up mid-transaction,
|
|
61
|
+
* // not `ROLLBACK - cannot rollback - no transaction is active`.
|
|
62
|
+
* console.error((error as { code?: string }).code);
|
|
63
|
+
* }
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare class LibsqlDialect extends Base {
|
|
67
|
+
/**
|
|
68
|
+
* Returns the `libsql` constructor as the SQLite driver.
|
|
69
|
+
*
|
|
70
|
+
* Typed as `unknown` to avoid leaking the `Libsql.DatabaseConstructor`
|
|
71
|
+
* namespace from a non-re-exported module across the public API surface.
|
|
72
|
+
*/
|
|
73
|
+
protected _driver(): unknown;
|
|
74
|
+
/**
|
|
75
|
+
* Skips a `ROLLBACK` for a transaction SQLite has already rolled back, and
|
|
76
|
+
* delegates every other statement to the `better-sqlite3` implementation.
|
|
77
|
+
* Knex calls it from outside the client (`executeQuery`), so it must stay
|
|
78
|
+
* reachable at runtime; `protected` is only a compile-time marker, as for
|
|
79
|
+
* `_driver`.
|
|
80
|
+
*
|
|
81
|
+
* Why: SQLite rolls a transaction back by itself on some errors
|
|
82
|
+
* (`SQLITE_FULL`, `SQLITE_IOERR`, `SQLITE_INTERRUPT`, `SQLITE_NOMEM` in the
|
|
83
|
+
* documented list, which SQLite reserves the right to extend) and documents
|
|
84
|
+
* that a following `ROLLBACK` then fails harmlessly
|
|
85
|
+
* (https://www.sqlite.org/lang_transaction.html, "Response To Errors Within
|
|
86
|
+
* A Transaction"). Knex does not treat it as harmless:
|
|
87
|
+
* `Transaction#query` replaces the error being rolled back with the failure
|
|
88
|
+
* of the `ROLLBACK`, so callers would see `ROLLBACK - cannot rollback - no
|
|
89
|
+
* transaction is active` instead of the `SQLITE_FULL` that caused it.
|
|
90
|
+
*
|
|
91
|
+
* Why not in each caller: every transaction in the archive goes through
|
|
92
|
+
* this dialect, and all of them lose the original error the same way.
|
|
93
|
+
*
|
|
94
|
+
* The skip needs all of: a Knex transaction client (`transacting`), a
|
|
95
|
+
* connection that reports `inTransaction === false`, and a rollback
|
|
96
|
+
* statement. Anything else is executed, so a stray `ROLLBACK` through the
|
|
97
|
+
* main client, or on a connection that does not expose the flag, stays
|
|
98
|
+
* visible as the programming error it is.
|
|
99
|
+
*
|
|
100
|
+
* `ROLLBACK TO SAVEPOINT` is skipped under the same conditions: the
|
|
101
|
+
* automatic rollback discards the savepoints with the transaction. A caller
|
|
102
|
+
* that catches the error of a nested transaction and carries on with the
|
|
103
|
+
* outer one is then running in autocommit mode, because the outer
|
|
104
|
+
* transaction no longer exists.
|
|
105
|
+
*
|
|
106
|
+
* The result mirrors what the `better-sqlite3` dialect records for a
|
|
107
|
+
* statement that returns no rows. Nothing ran, so there is no row id or
|
|
108
|
+
* change count to report, and `0` is fine even when `safeIntegers` makes
|
|
109
|
+
* real results `bigint`.
|
|
110
|
+
* @param connection - The raw `libsql` connection.
|
|
111
|
+
* @param query - The Knex query object.
|
|
112
|
+
*/
|
|
113
|
+
protected _query(connection: unknown, query: DialectQuery): Promise<DialectQuery>;
|
|
114
|
+
}
|
|
115
|
+
export {};
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// @ts-expect-error - Internal Knex subpath without published type declarations
|
|
2
|
+
import Client_BetterSQLite3 from 'knex/lib/dialects/better-sqlite3/index.js';
|
|
3
|
+
import libsql from 'libsql';
|
|
4
|
+
import { dbLog } from './debug.js';
|
|
5
|
+
/**
|
|
6
|
+
* Untyped reference to Knex's internal `better-sqlite3` dialect.
|
|
7
|
+
*
|
|
8
|
+
* Knex's published `exports` do not include this subpath, so TypeScript cannot
|
|
9
|
+
* resolve a declaration file for it. The dialect is a concrete subclass of
|
|
10
|
+
* `Knex.Client` at runtime, so the safe cast is intentional.
|
|
11
|
+
*/
|
|
12
|
+
const Base = Client_BetterSQLite3;
|
|
13
|
+
/**
|
|
14
|
+
* Matches `ROLLBACK` and `ROLLBACK TO SAVEPOINT`. Capture group 1 is the
|
|
15
|
+
* statement kind, for logging.
|
|
16
|
+
*
|
|
17
|
+
* Same prefix test Knex's `Transaction#query` (`lib/execution/transaction.js`)
|
|
18
|
+
* uses to recognise a rollback statement. Keep the two in step when upgrading
|
|
19
|
+
* Knex.
|
|
20
|
+
*/
|
|
21
|
+
const ROLLBACK_PATTERN = /^(ROLLBACK(?:\s+TO\s+SAVEPOINT)?)\b/i;
|
|
22
|
+
/**
|
|
23
|
+
* Knex dialect that reuses the `better-sqlite3` adapter logic but swaps the
|
|
24
|
+
* underlying driver for `libsql`. `libsql` ships pre-compiled binaries via the
|
|
25
|
+
* `@libsql/<platform>-<arch>` optionalDependencies pattern, so no postinstall
|
|
26
|
+
* download from GitHub Releases is required.
|
|
27
|
+
*
|
|
28
|
+
* A transaction that SQLite rolls back by itself (for example on a full disk)
|
|
29
|
+
* rejects with the original error, not with the failure of the `ROLLBACK`
|
|
30
|
+
* Knex sends afterwards.
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* import knex from 'knex';
|
|
34
|
+
*
|
|
35
|
+
* import { LibsqlDialect } from './libsql-dialect.js';
|
|
36
|
+
*
|
|
37
|
+
* const db = knex({
|
|
38
|
+
* client: LibsqlDialect,
|
|
39
|
+
* connection: { filename: 'archive.sqlite' },
|
|
40
|
+
* useNullAsDefault: true,
|
|
41
|
+
* });
|
|
42
|
+
*
|
|
43
|
+
* try {
|
|
44
|
+
* await db.transaction(async (trx) => {
|
|
45
|
+
* await trx.raw('INSERT INTO t (v) VALUES (?)', ['...']);
|
|
46
|
+
* });
|
|
47
|
+
* } catch (error) {
|
|
48
|
+
* // `SQLITE_FULL` when the disk filled up mid-transaction,
|
|
49
|
+
* // not `ROLLBACK - cannot rollback - no transaction is active`.
|
|
50
|
+
* console.error((error as { code?: string }).code);
|
|
51
|
+
* }
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export class LibsqlDialect extends Base {
|
|
55
|
+
/**
|
|
56
|
+
* Returns the `libsql` constructor as the SQLite driver.
|
|
57
|
+
*
|
|
58
|
+
* Typed as `unknown` to avoid leaking the `Libsql.DatabaseConstructor`
|
|
59
|
+
* namespace from a non-re-exported module across the public API surface.
|
|
60
|
+
*/
|
|
61
|
+
_driver() {
|
|
62
|
+
return libsql;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Skips a `ROLLBACK` for a transaction SQLite has already rolled back, and
|
|
66
|
+
* delegates every other statement to the `better-sqlite3` implementation.
|
|
67
|
+
* Knex calls it from outside the client (`executeQuery`), so it must stay
|
|
68
|
+
* reachable at runtime; `protected` is only a compile-time marker, as for
|
|
69
|
+
* `_driver`.
|
|
70
|
+
*
|
|
71
|
+
* Why: SQLite rolls a transaction back by itself on some errors
|
|
72
|
+
* (`SQLITE_FULL`, `SQLITE_IOERR`, `SQLITE_INTERRUPT`, `SQLITE_NOMEM` in the
|
|
73
|
+
* documented list, which SQLite reserves the right to extend) and documents
|
|
74
|
+
* that a following `ROLLBACK` then fails harmlessly
|
|
75
|
+
* (https://www.sqlite.org/lang_transaction.html, "Response To Errors Within
|
|
76
|
+
* A Transaction"). Knex does not treat it as harmless:
|
|
77
|
+
* `Transaction#query` replaces the error being rolled back with the failure
|
|
78
|
+
* of the `ROLLBACK`, so callers would see `ROLLBACK - cannot rollback - no
|
|
79
|
+
* transaction is active` instead of the `SQLITE_FULL` that caused it.
|
|
80
|
+
*
|
|
81
|
+
* Why not in each caller: every transaction in the archive goes through
|
|
82
|
+
* this dialect, and all of them lose the original error the same way.
|
|
83
|
+
*
|
|
84
|
+
* The skip needs all of: a Knex transaction client (`transacting`), a
|
|
85
|
+
* connection that reports `inTransaction === false`, and a rollback
|
|
86
|
+
* statement. Anything else is executed, so a stray `ROLLBACK` through the
|
|
87
|
+
* main client, or on a connection that does not expose the flag, stays
|
|
88
|
+
* visible as the programming error it is.
|
|
89
|
+
*
|
|
90
|
+
* `ROLLBACK TO SAVEPOINT` is skipped under the same conditions: the
|
|
91
|
+
* automatic rollback discards the savepoints with the transaction. A caller
|
|
92
|
+
* that catches the error of a nested transaction and carries on with the
|
|
93
|
+
* outer one is then running in autocommit mode, because the outer
|
|
94
|
+
* transaction no longer exists.
|
|
95
|
+
*
|
|
96
|
+
* The result mirrors what the `better-sqlite3` dialect records for a
|
|
97
|
+
* statement that returns no rows. Nothing ran, so there is no row id or
|
|
98
|
+
* change count to report, and `0` is fine even when `safeIntegers` makes
|
|
99
|
+
* real results `bigint`.
|
|
100
|
+
* @param connection - The raw `libsql` connection.
|
|
101
|
+
* @param query - The Knex query object.
|
|
102
|
+
*/
|
|
103
|
+
async _query(connection, query) {
|
|
104
|
+
// `connection` may be undefined: `super._query` then reports `No connection provided`.
|
|
105
|
+
const inTransaction = connection
|
|
106
|
+
?.inTransaction;
|
|
107
|
+
const rollback = ROLLBACK_PATTERN.exec(query.sql ?? '');
|
|
108
|
+
if (this.transacting === true && inTransaction === false && rollback) {
|
|
109
|
+
dbLog('Skipping %s: SQLite has already rolled the transaction back', rollback[1]);
|
|
110
|
+
query.response = { changes: 0, lastInsertRowid: 0 };
|
|
111
|
+
query.context = { lastID: 0, changes: 0 };
|
|
112
|
+
return query;
|
|
113
|
+
}
|
|
114
|
+
return super._query(connection, query);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Returns a Knex subquery builder that selects page IDs with pagination,
|
|
4
|
+
* ordered by `content_items.crawl_order` (nulls last), excluding
|
|
5
|
+
* redirected pages.
|
|
6
|
+
* @param limit - The maximum number of page IDs to return.
|
|
7
|
+
* @param offset - The number of page IDs to skip before returning results.
|
|
8
|
+
*/
|
|
9
|
+
export declare function limitedPageIds(limit: number, offset: number): (qb: Knex.QueryBuilder<Record<string, unknown>, unknown>) => Promise<void>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns a Knex subquery builder that selects page IDs with pagination,
|
|
3
|
+
* ordered by `content_items.crawl_order` (nulls last), excluding
|
|
4
|
+
* redirected pages.
|
|
5
|
+
* @param limit - The maximum number of page IDs to return.
|
|
6
|
+
* @param offset - The number of page IDs to skip before returning results.
|
|
7
|
+
*/
|
|
8
|
+
export function limitedPageIds(limit, offset) {
|
|
9
|
+
return async (qb) => {
|
|
10
|
+
await qb
|
|
11
|
+
.select('id')
|
|
12
|
+
.from('content_items')
|
|
13
|
+
.orderByRaw('`crawl_order` ASC NULLS LAST')
|
|
14
|
+
.whereNull('redirect_dest_id')
|
|
15
|
+
.limit(limit)
|
|
16
|
+
.offset(offset);
|
|
17
|
+
};
|
|
18
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Minimum `info.version` this build accepts. Archives older than this must
|
|
4
|
+
* be upgraded by running the matching migration script before they can be
|
|
5
|
+
* opened (see {@link IncompatibleArchiveError}'s message for the mapping
|
|
6
|
+
* from archive version to script).
|
|
7
|
+
*
|
|
8
|
+
* This value tracks the **archive format cut**, not the npm `pkg.version`:
|
|
9
|
+
* a format-breaking change bumps it ahead of the corresponding release,
|
|
10
|
+
* and releases that do not cut the format leave it unchanged. The crawler
|
|
11
|
+
* writes this exact value into every new archive's `info.version`.
|
|
12
|
+
*
|
|
13
|
+
* History:
|
|
14
|
+
*
|
|
15
|
+
* - **pre-0.10**: HTML snapshots in `snapshot-html.zip` (#75), then
|
|
16
|
+
* relocated to `page_html_blobs` (#84); pages table has flat `noindex`,
|
|
17
|
+
* `og:type`-style columns derived from beholder 2.x's flat `Meta`.
|
|
18
|
+
* - **0.10.0**: `page_html_blobs` BLOB storage (#75/#84) +
|
|
19
|
+
* nested-`Meta`-derived flat columns, `meta_extras` JSON, `page_tags` /
|
|
20
|
+
* `page_jsonld` tables, denormalised aggregates (#85).
|
|
21
|
+
* - **0.13.0**: this build. Write-model refactor (epic #103) —
|
|
22
|
+
* `content_items` / `page_meta` / `resource_items` / `anchor_edges` /
|
|
23
|
+
* `resource_ref_edges` / `image_items` entity tables plus `url_refs` /
|
|
24
|
+
* `text_refs` / `content_type_refs` / `json_refs` / `blob_refs` /
|
|
25
|
+
* `header_flags` ref tables. Readers query the new tables exclusively;
|
|
26
|
+
* pre-0.13 archives must be upgraded with `scripts/migrate-to-0.13.mjs`
|
|
27
|
+
* which bumps `info.version` to `0.13.0` on completion.
|
|
28
|
+
* @example
|
|
29
|
+
* import { REQUIRED_FORMAT_VERSION } from '@nitpicker/archive/meta/assert-compatible-version';
|
|
30
|
+
*
|
|
31
|
+
* // Warn an operator before attempting to open an old archive:
|
|
32
|
+
* if (compareSemver(archiveInfo.version, REQUIRED_FORMAT_VERSION) < 0) {
|
|
33
|
+
* console.error(`Archive needs migration to format ${REQUIRED_FORMAT_VERSION}`);
|
|
34
|
+
* }
|
|
35
|
+
*/
|
|
36
|
+
export declare const REQUIRED_FORMAT_VERSION = "0.13.0";
|
|
37
|
+
/**
|
|
38
|
+
* Verifies that the archive's on-disk format is compatible with this build.
|
|
39
|
+
*
|
|
40
|
+
* Compares the archive's `info.version` (a semver string written by
|
|
41
|
+
* `setConfig` at archive-create time, or by the migration script) against
|
|
42
|
+
* {@link REQUIRED_FORMAT_VERSION}. Older archives throw
|
|
43
|
+
* {@link IncompatibleArchiveError} pointing the operator at the migration
|
|
44
|
+
* script.
|
|
45
|
+
*
|
|
46
|
+
* Called from `Database.#init` for both writer and read-only (stub viewer)
|
|
47
|
+
* connections so old `._nitpicker-*` stubs surface the error too. New
|
|
48
|
+
* archives where the `info` table does not yet exist are tolerated —
|
|
49
|
+
* `initSchema` will fill them in next.
|
|
50
|
+
*
|
|
51
|
+
* The check is intentionally version-string-only, not schema-shape-based:
|
|
52
|
+
* `info.version` is the single declared source of truth, and a v0.10
|
|
53
|
+
* `migrate-to-0.10.mjs` run bumps it explicitly so the assertion passes
|
|
54
|
+
* once migration completes.
|
|
55
|
+
* @param instance - The Knex query builder for the archive's libsql connection.
|
|
56
|
+
* @throws {IncompatibleArchiveError} when `info.version` is older than
|
|
57
|
+
* {@link REQUIRED_FORMAT_VERSION}, or missing entirely on a non-empty
|
|
58
|
+
* archive.
|
|
59
|
+
*/
|
|
60
|
+
export declare function assertCompatibleVersion(instance: Knex): Promise<void>;
|