From a682f1e02b802eddf23fb1a231e5c2e396751284 Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Thu, 15 Oct 2026 09:26:31 +0200 Subject: [PATCH 01/12] Bump arsenal to 8.6.0 Move off the 8.6.0 preview now that the final release is out. Arsenal no longer pulls level-sublevel and its old leveldown stack, which removes most of the advisories reported on production dependencies. Issue: S3UTILS-249 --- package.json | 2 +- yarn.lock | 983 ++++++++++++++------------------------------------- 2 files changed, 276 insertions(+), 709 deletions(-) diff --git a/package.json b/package.json index 6741d473..6036f49e 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "dependencies": { "@aws-sdk/client-s3": "^3.873.0", "@aws-sdk/node-http-handler": "^3.374.0", - "@scality/arsenal": "^8.6.0-0", + "@scality/arsenal": "^8.6.0", "@scality/cloudserverclient": "^1.0.8", "@senx/warp10": "^2.0.3", "@smithy/util-retry": "^4.0.7", diff --git a/yarn.lock b/yarn.lock index 49c6fb32..b63034da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1275,10 +1275,10 @@ dependencies: semver "^7.3.5" -"@opentelemetry/api-logs@0.220.0": - version "0.220.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.220.0.tgz#b2ed235de4b5f3c1769adfa5f3bc247d82cdfbc9" - integrity sha512-CmVa4ImJ+ynfrPMNaAXHET6Bhb44SwzmfyVJFq9ni2jgXJR/l7C6gfVFddNmHP+ZOkP9cf4f9DBe68qVLTHc9w== +"@opentelemetry/api-logs@0.223.0": + version "0.223.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.223.0.tgz#12819b6542fbde1a394a592214b62990a3ad1615" + integrity sha512-Oepm6etVPFCn0VWB1t833iOTgz1eYBDUPxcrOR/XvwzD1+Ag9VzSPSrrKAFNJ/haatj+8CXbG47pZXvdNQKDJw== dependencies: "@opentelemetry/api" "^1.3.0" @@ -1287,320 +1287,269 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.9.1.tgz#c1b0346de336ba55af2d5a7970882037baedec05" integrity sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q== -"@opentelemetry/configuration@0.220.0": - version "0.220.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/configuration/-/configuration-0.220.0.tgz#f15670ecaa22b53442a1de6243dd86fd512ade4a" - integrity sha512-glfIVKnZevRin8fY/9uES/mhRtMT1lGINLHc9MIo5fTQZXswEEHamJtgjv4MTtzgnhHGC92mIS/0lzAUZMyE0w== +"@opentelemetry/configuration@0.223.0": + version "0.223.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/configuration/-/configuration-0.223.0.tgz#b1996cf691aa8ffe155bf22c11d4ce0348848eba" + integrity sha512-KgyHXS8weyh+mJWVZ2+3hmu7J4mwU661Y8yQ1PvBAEY7G63X8qfGr6uN61MNJrN+YzP+dC5x6PmBEgdh7x6coQ== dependencies: - "@opentelemetry/core" "2.9.0" + "@opentelemetry/core" "2.12.0" yaml "^2.8.3" -"@opentelemetry/context-async-hooks@2.9.0": - version "2.9.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-2.9.0.tgz#02378d315fb648401a01ce6e119f6744f80bb1be" - integrity sha512-OQ0vzvbZBiUhjqLnUaoNfYmP8553Crr3aggB4y0ZUi815mZ7idpdJXQmoKdeBKJelYttoBlLSSHubmyw3wvX4w== +"@opentelemetry/context-async-hooks@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-2.12.0.tgz#2ab3fa3027d05b0f4019c309dd4def1af0dc22ac" + integrity sha512-iK/1nD7mmZVkuYjVjkdFBiCvzntJdFny1S3CYbUYyOq7V5enL6XX+gJ7eh965L1LnS11VA8mQ7Ej/ck04SB0MQ== -"@opentelemetry/core@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-2.11.0.tgz#97849d3808bba652568b7d53e20c9fc38bcb7c49" - integrity sha512-7YP44XH0tV6+Mb54x2YGf84i7yi+31MBZlE8JwvozkxyTvXbSp10X7cI7YE49ChJ3shMJoBmCJF3+1QFBJctGA== +"@opentelemetry/core@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-2.12.0.tgz#b44e9806111f066a2df578e37fc88ef46ccdfe20" + integrity sha512-1HsSAuvT4/my0QrXWsyXFdWjKaPeCHsismKZgEEIb8NK13LP6DrMRlsUbvD/0F9mDWK3xDom9AMv3IscxgOnOQ== dependencies: "@opentelemetry/semantic-conventions" "^1.29.0" -"@opentelemetry/core@2.9.0": - version "2.9.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-2.9.0.tgz#49de86106f86255b471b2ff035ef1003a851b252" - integrity sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw== - dependencies: +"@opentelemetry/exporter-logs-otlp-grpc@0.223.0": + version "0.223.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.223.0.tgz#ce4bf372e6f454e91aabe5f908a74832731ad237" + integrity sha512-O/ztY4A+NRi9bQm9Wlj9aCh2s1lbnkA8tcv+88crBMqas6YK8AnPvKXSms3Mn1nto4ylAIQAAxjtbzCMZjGvwg== + dependencies: + "@opentelemetry/otlp-exporter-base" "0.223.0" + "@opentelemetry/otlp-grpc-exporter-base" "0.223.0" + "@opentelemetry/otlp-transformer" "0.223.0" + "@opentelemetry/sdk-logs" "0.223.0" + +"@opentelemetry/exporter-logs-otlp-http@0.223.0": + version "0.223.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.223.0.tgz#18ffc4d1bfb513f71c0fe1b1c39731c2aae5de3f" + integrity sha512-YQh9+t/JmV9OeRkoLhPb4yvcrWCX6lAOmXFos/JKoD+KITZYZoxf0acnwAk6YDI9O7fX68O2ka38hx1G9exl8w== + dependencies: + "@opentelemetry/otlp-exporter-base" "0.223.0" + "@opentelemetry/otlp-transformer" "0.223.0" + "@opentelemetry/sdk-logs" "0.223.0" + +"@opentelemetry/exporter-logs-otlp-proto@0.223.0": + version "0.223.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.223.0.tgz#0f04fc2a7683304c7b11278ed13d66838e7a6217" + integrity sha512-wt33CkhmLfFDSRXNOABWQzVfks1PQvsRNIHqiY5Y5Hi6SiVF7iJYDTqpaUhbwcmyJYcB0LzBNvsic8GyufMxAA== + dependencies: + "@opentelemetry/otlp-exporter-base" "0.223.0" + "@opentelemetry/otlp-transformer" "0.223.0" + "@opentelemetry/sdk-logs" "0.223.0" + +"@opentelemetry/exporter-metrics-otlp-grpc@0.223.0": + version "0.223.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.223.0.tgz#eb561494d72252b5158d05ffeb772a839fb3ee82" + integrity sha512-QneYDf2PWYAqmikS1/jeG8xCv0Q2EOSBm0RRM7IFU9zEnKLu7qxdlsz9t3YjxiAo7XzqfjTsJZys5qhYZAQ2PQ== + dependencies: + "@opentelemetry/exporter-metrics-otlp-http" "0.223.0" + "@opentelemetry/otlp-grpc-exporter-base" "0.223.0" + "@opentelemetry/otlp-transformer" "0.223.0" + +"@opentelemetry/exporter-metrics-otlp-http@0.223.0": + version "0.223.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.223.0.tgz#f856cf799ed9225a81b2b95ec3c22529e9117c2a" + integrity sha512-hNC8yai/+xCNyTuiOy6JFepXXA/sb/2jCzQRY7c2cUWz6owaidihlHUpO20B9/dj8JKPNo8rcn7ikTy7Cj+JaQ== + dependencies: + "@opentelemetry/core" "2.12.0" + "@opentelemetry/otlp-exporter-base" "0.223.0" + "@opentelemetry/otlp-transformer" "0.223.0" + "@opentelemetry/resources" "2.12.0" + "@opentelemetry/sdk-metrics" "2.12.0" + +"@opentelemetry/exporter-metrics-otlp-proto@0.223.0": + version "0.223.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.223.0.tgz#e4227b3ffd02e70fd92e44575289ee96569ec6ca" + integrity sha512-DlwYBlqUVlAQqGXOES1K92b6FyHwB2phwcsccXEQhE9Mz1CAEymQgyRwbPKjCbpySZE1ASy2s9t2kIQ1pU/tmg== + dependencies: + "@opentelemetry/exporter-metrics-otlp-http" "0.223.0" + "@opentelemetry/otlp-exporter-base" "0.223.0" + "@opentelemetry/otlp-transformer" "0.223.0" + +"@opentelemetry/exporter-prometheus@0.223.0": + version "0.223.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.223.0.tgz#1091582ea7b0a86c83059888a549ba6ebba3d120" + integrity sha512-HhbN3/B8vG+JNKH2oLMynFFrz2O/o+WFklfwiVq3ffdRWOEZx1zHeYe6r86fn9BUSpQ2U5cXfQja+otTdzi5qQ== + dependencies: + "@opentelemetry/core" "2.12.0" + "@opentelemetry/resources" "2.12.0" + "@opentelemetry/sdk-metrics" "2.12.0" "@opentelemetry/semantic-conventions" "^1.29.0" -"@opentelemetry/exporter-logs-otlp-grpc@0.220.0": - version "0.220.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.220.0.tgz#3c71480bfc4fe59f17c2f45de26a39b72d4d251d" - integrity sha512-s0sRPCSlXYqlgObOpCftomJllp3LfUL9FobQ5csg2172ydVhSEnu1ptpsVBJadazs5nUNp7vDuLE03FAFWTLOQ== - dependencies: - "@grpc/grpc-js" "^1.14.3" - "@opentelemetry/core" "2.9.0" - "@opentelemetry/otlp-exporter-base" "0.220.0" - "@opentelemetry/otlp-grpc-exporter-base" "0.220.0" - "@opentelemetry/otlp-transformer" "0.220.0" - "@opentelemetry/sdk-logs" "0.220.0" - -"@opentelemetry/exporter-logs-otlp-http@0.220.0": - version "0.220.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.220.0.tgz#355bc4c1b7f0bced40ce3643f9513bb4053b43de" - integrity sha512-8186thl+pTw64iz/qEEen5oJZoZ/gO73XruChdaGlYdWOdBIQ42r+vHLf6a7vIDqTD4b8ZOoMlyxptanECaI9A== - dependencies: - "@opentelemetry/api-logs" "0.220.0" - "@opentelemetry/core" "2.9.0" - "@opentelemetry/otlp-exporter-base" "0.220.0" - "@opentelemetry/otlp-transformer" "0.220.0" - "@opentelemetry/sdk-logs" "0.220.0" - -"@opentelemetry/exporter-logs-otlp-proto@0.220.0": - version "0.220.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.220.0.tgz#51d9bd8b75932ff0cad07c118c074dbc42260cea" - integrity sha512-8LZAxdJ0ENDAFwr4j0oY35mHBltiSzvlhdQAPGiC7p9VnxtuSq4SW1gfBAdW6t6hiQG6OwUl8w7KHaOdJPKHWg== - dependencies: - "@opentelemetry/otlp-exporter-base" "0.220.0" - "@opentelemetry/otlp-transformer" "0.220.0" - "@opentelemetry/sdk-logs" "0.220.0" - -"@opentelemetry/exporter-metrics-otlp-grpc@0.220.0": - version "0.220.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.220.0.tgz#edc452e205864794d0f5031edd46b36587761907" - integrity sha512-U128izvJfX/dW9jRGP0gIfadR1Hg7ft3UEGIeRxLFK70m2BWw6AtNCOnsUygpw2zCgR/ygdWbGpcL6TmhW0ZGw== - dependencies: - "@grpc/grpc-js" "^1.14.3" - "@opentelemetry/core" "2.9.0" - "@opentelemetry/exporter-metrics-otlp-http" "0.220.0" - "@opentelemetry/otlp-exporter-base" "0.220.0" - "@opentelemetry/otlp-grpc-exporter-base" "0.220.0" - "@opentelemetry/otlp-transformer" "0.220.0" - "@opentelemetry/resources" "2.9.0" - "@opentelemetry/sdk-metrics" "2.9.0" - -"@opentelemetry/exporter-metrics-otlp-http@0.220.0": - version "0.220.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.220.0.tgz#af6c83da440ff326f87970992b20f72c48d6b415" - integrity sha512-Yqt3RBw/bRVncaE9qIIhk4WfjbAQqXuP9FgAaU+IKPndnLEp/cUqZlSC324+bpmduRz7DoTjig8Ub0PeILWXUA== - dependencies: - "@opentelemetry/core" "2.9.0" - "@opentelemetry/otlp-exporter-base" "0.220.0" - "@opentelemetry/otlp-transformer" "0.220.0" - "@opentelemetry/resources" "2.9.0" - "@opentelemetry/sdk-metrics" "2.9.0" - -"@opentelemetry/exporter-metrics-otlp-proto@0.220.0": - version "0.220.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.220.0.tgz#03c7ddf90a6b23191d2e59666371a072b3ebb4d0" - integrity sha512-lyO+IQBdSvqHN/ZOW/OzrSWemtfD+HgWngn+HBNLhjy0YrCQQTz0OE/kSekH2Pl340dn9DWzhqHdz5Eftr+HLA== - dependencies: - "@opentelemetry/core" "2.9.0" - "@opentelemetry/exporter-metrics-otlp-http" "0.220.0" - "@opentelemetry/otlp-exporter-base" "0.220.0" - "@opentelemetry/otlp-transformer" "0.220.0" - "@opentelemetry/resources" "2.9.0" - "@opentelemetry/sdk-metrics" "2.9.0" - -"@opentelemetry/exporter-prometheus@0.220.0": - version "0.220.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.220.0.tgz#443340a98b98c2d47d3ddf3827388bd15470ba64" - integrity sha512-JZD5DL/NBpVd2BHefvYosm3G40UZ/KzExLv5tc0eZe0CtrsHHtcOk3YPUxR2EINmUeBf8+w5UReTV8fFPn95lA== - dependencies: - "@opentelemetry/core" "2.9.0" - "@opentelemetry/resources" "2.9.0" - "@opentelemetry/sdk-metrics" "2.9.0" +"@opentelemetry/exporter-trace-otlp-grpc@0.223.0": + version "0.223.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.223.0.tgz#98f55bd64dc1995d96464913175ab00c5ddc27fa" + integrity sha512-gYDt98a44cvdbJNL+fFCFO7k7qSGaWGZAb6WUXGCKL0RiRhF96N6jlH4wXMzS1daZoV5AMHZZixjaLpQBMhpvA== + dependencies: + "@opentelemetry/otlp-exporter-base" "0.223.0" + "@opentelemetry/otlp-grpc-exporter-base" "0.223.0" + "@opentelemetry/otlp-transformer" "0.223.0" + "@opentelemetry/sdk-trace" "2.12.0" + +"@opentelemetry/exporter-trace-otlp-http@0.223.0", "@opentelemetry/exporter-trace-otlp-http@^0.223.0": + version "0.223.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.223.0.tgz#a3f85fcd9845adbee21a7264e06a9202b5b783ee" + integrity sha512-N8NWZaoQuF9e307S6xoVoI1lvxOOFkmBnynD42r02CPCfxoC95cJExAKBFrTD4C5iuhqthbzOZJN/W29ez4o/A== + dependencies: + "@opentelemetry/otlp-exporter-base" "0.223.0" + "@opentelemetry/otlp-transformer" "0.223.0" + "@opentelemetry/sdk-trace" "2.12.0" + +"@opentelemetry/exporter-trace-otlp-proto@0.223.0": + version "0.223.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.223.0.tgz#d1abf16dd5ee681b98d14e4133354f6ed56ecba8" + integrity sha512-hCFhPuROokNpwLibKmeMRuBNjPtbL+Ja5y/e/KBl5p3QcaH7xBjkj8roIGgKwCNJ4WChRLBzfoaNM3QksogfWw== + dependencies: + "@opentelemetry/otlp-exporter-base" "0.223.0" + "@opentelemetry/otlp-transformer" "0.223.0" + "@opentelemetry/sdk-trace" "2.12.0" + +"@opentelemetry/exporter-zipkin@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.12.0.tgz#c1fa377c642feb708eb3c69428da812bec0bda13" + integrity sha512-XfHO6VxPkVD/QaXqgppdHK2DTqmtHLH06ggslhm5hVYAS+dwD3okaeIyhxXBbhmWn9HhCYcv285eK1TgyF0wYQ== + dependencies: + "@opentelemetry/core" "2.12.0" + "@opentelemetry/resources" "2.12.0" + "@opentelemetry/sdk-trace" "2.12.0" "@opentelemetry/semantic-conventions" "^1.29.0" -"@opentelemetry/exporter-trace-otlp-grpc@0.220.0": - version "0.220.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.220.0.tgz#8b7cec3e4a74b82bf666c705e817396b9d8a4ba2" - integrity sha512-bv1xmNhmNwIM6MdUBw4yYuJeVcEViVLk3uD69vOQMwueHBnfyl/u0HnBlB1FNY/Te0UOzJzvcbyR8wN6b+iGbA== +"@opentelemetry/instrumentation@0.223.0": + version "0.223.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.223.0.tgz#b7248c91cfe26d6851dd2334e680a001abc86854" + integrity sha512-tttBo88TbwK1zpsH6VeJoxLQopxOjW3cnrP50fsQJRZftkSKDDwjolXXBvow2jy0LKXlNRkDQh0NT6yI/q+BEQ== dependencies: - "@grpc/grpc-js" "^1.14.3" - "@opentelemetry/otlp-exporter-base" "0.220.0" - "@opentelemetry/otlp-grpc-exporter-base" "0.220.0" - "@opentelemetry/otlp-transformer" "0.220.0" - "@opentelemetry/sdk-trace" "2.9.0" - -"@opentelemetry/exporter-trace-otlp-http@0.220.0", "@opentelemetry/exporter-trace-otlp-http@^0.220.0": - version "0.220.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.220.0.tgz#f26c6c7964715d4eec8c70bfb2af2f1ede53d4bf" - integrity sha512-/+ExB3lRkf+erv4PnoywyL7RHKITidxtUpUTS55k7OQ0dB42S7gEF1gry7swb9MSm1hYLUhJg4QQh9W8SpwwqA== - dependencies: - "@opentelemetry/core" "2.9.0" - "@opentelemetry/otlp-exporter-base" "0.220.0" - "@opentelemetry/otlp-transformer" "0.220.0" - "@opentelemetry/resources" "2.9.0" - "@opentelemetry/sdk-trace" "2.9.0" - -"@opentelemetry/exporter-trace-otlp-proto@0.220.0": - version "0.220.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.220.0.tgz#67f2b1a630cd66dee7b4a8491cb6120dfb28522c" - integrity sha512-voTAD8XgJxlK7zLkXh8EzMB09zrQr3tyY/BsnDTlDiQU/UdK58MZ63A3mUjdEDrxMjCVmBHU3WQJhRmQe+Dvzg== - dependencies: - "@opentelemetry/core" "2.9.0" - "@opentelemetry/otlp-exporter-base" "0.220.0" - "@opentelemetry/otlp-transformer" "0.220.0" - "@opentelemetry/resources" "2.9.0" - "@opentelemetry/sdk-trace" "2.9.0" - -"@opentelemetry/exporter-zipkin@2.9.0": - version "2.9.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.9.0.tgz#68f0e7dc397461759c119b3dd4eb4d1ea9fe67ae" - integrity sha512-RwINoce2BH8T4obT5pMcAla2sWma1YZvYuaktWmTluQ0PkQdvv5D060rWI1+kawX+J2qBRcMbwrZJJNcMJUauQ== - dependencies: - "@opentelemetry/core" "2.9.0" - "@opentelemetry/resources" "2.9.0" - "@opentelemetry/sdk-trace" "2.9.0" - "@opentelemetry/semantic-conventions" "^1.29.0" - -"@opentelemetry/instrumentation@0.220.0": - version "0.220.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.220.0.tgz#542b36bf4871dd83dc84e1373ac4bbcd35a8bfb8" - integrity sha512-xQx3E2WxP1mDvKzxLxX+CTCtNLa560YJZ3087qYHerl2YmiKpv7AH+dAy7vmx+eVrZ5BwhfWUAVoKOoxCNHcpw== - dependencies: - "@opentelemetry/api-logs" "0.220.0" + "@opentelemetry/api-logs" "0.223.0" import-in-the-middle "^3.0.0" require-in-the-middle "^8.0.0" -"@opentelemetry/otlp-exporter-base@0.220.0": - version "0.220.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.220.0.tgz#dcc820401a0efea4f908528c55fda4c9552708d7" - integrity sha512-CXYo8UD5Mn9YbgebO2EL4wejtA+gxLmLiu6HCk2KH2BR7XhFN6/6p1UlCb23DYCjeYkndevLHuejCCN1yx4+OQ== +"@opentelemetry/otlp-exporter-base@0.223.0": + version "0.223.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.223.0.tgz#f5cc497a241f4eb2c9deefc0adb93439db3ee16a" + integrity sha512-HlJMrJXjOqdQeoYNDHEvFTpaY2p9uWDK1GPl5AZ4wI5easzfoppTduOv47M8eiF+4ew42vfI/Xvt7THYgESnRw== dependencies: - "@opentelemetry/core" "2.9.0" - "@opentelemetry/otlp-transformer" "0.220.0" + "@opentelemetry/core" "2.12.0" + "@opentelemetry/otlp-transformer" "0.223.0" -"@opentelemetry/otlp-grpc-exporter-base@0.220.0": - version "0.220.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.220.0.tgz#06d771f5a185c1d4961f6852e5045bcaaf6d9643" - integrity sha512-/eIkBPMBTIvM3x/0mDX4aJeSkYifYClnBPr68PL1h5LV4VQv4+SV6CGrpiZ4fIWDnobVmhTWCm1J/QRdAWUfvA== +"@opentelemetry/otlp-grpc-exporter-base@0.223.0": + version "0.223.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.223.0.tgz#ce36bebbfe24b16de9c9f0809d20793afa8493ab" + integrity sha512-62DuT9qzwFEFPq1aguQ+P6cWC4sJPwMxCj8wZ3Q+mH8LpPcV6zdv5gj1YtGIGZF5FcKt9JnDVraey0CEnu9MtQ== dependencies: "@grpc/grpc-js" "^1.14.3" - "@opentelemetry/core" "2.9.0" - "@opentelemetry/otlp-exporter-base" "0.220.0" - "@opentelemetry/otlp-transformer" "0.220.0" - -"@opentelemetry/otlp-transformer@0.220.0": - version "0.220.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-transformer/-/otlp-transformer-0.220.0.tgz#c807ab3d96024d64b0f3aae7788334a42eafab7a" - integrity sha512-lXGrv7KXZ0gNH9SVNUaa6vv6phVYGvJxfXAlMbzbakiXru75f5MZl8Z7oqiMMQD77riVHJCFlQvbZs/VVN2/4A== - dependencies: - "@opentelemetry/api-logs" "0.220.0" - "@opentelemetry/core" "2.9.0" - "@opentelemetry/resources" "2.9.0" - "@opentelemetry/sdk-logs" "0.220.0" - "@opentelemetry/sdk-metrics" "2.9.0" - "@opentelemetry/sdk-trace" "2.9.0" - -"@opentelemetry/propagator-b3@2.9.0": - version "2.9.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-b3/-/propagator-b3-2.9.0.tgz#d7ec0a9d4023b09d973773ac08140793aa9dfe86" - integrity sha512-WrOT1WsOUG+B7hstD2RYoMPIOK76G8E9AQHhMjUvrQaGx/oA7rPWQvvr1Rqv7+yy4R0ZMVwWLC4vW2xnkgWPAQ== - dependencies: - "@opentelemetry/core" "2.9.0" - -"@opentelemetry/propagator-jaeger@2.9.0": - version "2.9.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.9.0.tgz#7fbb5943782aa8cb83d5c41c316cd8be00438747" - integrity sha512-4mYGty27rYvSM0jtp1ZUOqd3LfVRCYg9H5G9OFzSx5HViYToU21MFhWfco7x1HwXr7ER8yGOiCIHZUwjPksc0Q== - dependencies: - "@opentelemetry/core" "2.9.0" - -"@opentelemetry/resources@2.11.0", "@opentelemetry/resources@^2.9.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-2.11.0.tgz#b4e60ba92a4f122dc979f3402aea9713a98eac5b" - integrity sha512-Ie7+8q8MDF4FAEQCKVMTx3ReUvxiIAgIiiW3c9JdmP8+HMcDy20puT+AHjexnExgnbvBxjQ9fjkFDWrikJ2jQA== - dependencies: - "@opentelemetry/core" "2.11.0" + "@opentelemetry/core" "2.12.0" + "@opentelemetry/otlp-exporter-base" "0.223.0" + "@opentelemetry/otlp-transformer" "0.223.0" + +"@opentelemetry/otlp-transformer@0.223.0": + version "0.223.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-transformer/-/otlp-transformer-0.223.0.tgz#2320f3d75efd8370b0fbead3db514792d6bd7852" + integrity sha512-oxmmPL5/MbSsO8K588V9n/XLIe7FZTK30Fo+/U/lAnt0ZIK/hoPM03n2WpSTZVbUBGTUE7aLyxnAzh7nE2PD4Q== + dependencies: + "@opentelemetry/api-logs" "0.223.0" + "@opentelemetry/core" "2.12.0" + "@opentelemetry/resources" "2.12.0" + "@opentelemetry/sdk-logs" "0.223.0" + "@opentelemetry/sdk-metrics" "2.12.0" + "@opentelemetry/sdk-trace" "2.12.0" + +"@opentelemetry/propagator-b3@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-b3/-/propagator-b3-2.12.0.tgz#ec2f32c0f0d94905510f2892e367d60f2535d03b" + integrity sha512-ktio0dVz2Uo83+EESOqMwqdJqoZKcf4EtmuG0mxddMKGbwN2Tignyq7JR9R7SBr1riwevitke+tpYQTMS/Fi0g== + dependencies: + "@opentelemetry/core" "2.12.0" + +"@opentelemetry/propagator-jaeger@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.12.0.tgz#2656ce57a42d6a13c452f371574bb9f6e5436781" + integrity sha512-Kz2Vz+NILW7S1WtN4rV1wr76fMtT/RRWvAMFBc91uTIi2dDMXxrfBKNe2KH7yaCfFp1X0xfAuabzuFczvoPB6A== + dependencies: + "@opentelemetry/core" "2.12.0" + +"@opentelemetry/resources@2.12.0", "@opentelemetry/resources@^2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-2.12.0.tgz#3a0fceb16c44d4d024f25f3f76eb773a7df67847" + integrity sha512-+rSRoOdln6NhXTVcBdHSlZxJDNzwxadeweK2ltZO3tVtfp6aklABc06xclDk6ovRR+EiGgIcSbh/6NgjFhnb3A== + dependencies: + "@opentelemetry/core" "2.12.0" "@opentelemetry/semantic-conventions" "^1.29.0" -"@opentelemetry/resources@2.9.0": - version "2.9.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-2.9.0.tgz#81e1ce946eec661857a9d6c4fa507b3750ae500f" - integrity sha512-jyA5MBLQ+Dkl3+JsZkUoUvL7yHvU64kLsvpXKarWm6347Sl1t1bXFTFykUePNpT5WH5pm9a2Qtt03iIYQhZ1Fg== +"@opentelemetry/sdk-logs@0.223.0": + version "0.223.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-logs/-/sdk-logs-0.223.0.tgz#6c9b42a3a2ee1f8bf34605ef516a77c1aa640035" + integrity sha512-ApiAfUiUh6fmJt1GbsBuoeDn8D8IL42UvGyPUr8o1Z89ZeIiOCE1rZ78KkIUjEX3OV8Oorl9ez5Qjo43ZynDyw== dependencies: - "@opentelemetry/core" "2.9.0" + "@opentelemetry/api-logs" "0.223.0" + "@opentelemetry/core" "2.12.0" + "@opentelemetry/resources" "2.12.0" "@opentelemetry/semantic-conventions" "^1.29.0" -"@opentelemetry/sdk-logs@0.220.0": - version "0.220.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-logs/-/sdk-logs-0.220.0.tgz#590c36c5e9e49b7823601b45ad39bba1ca265a80" - integrity sha512-WywcTkQtv2iNmt+6y5Kcd4rzvx9bLVsBa2Nwcmg01IUaBTkTow3W4d9KE5vNBpEDtb9tp21WcRBY/lANRrApYA== - dependencies: - "@opentelemetry/api-logs" "0.220.0" - "@opentelemetry/core" "2.9.0" - "@opentelemetry/resources" "2.9.0" +"@opentelemetry/sdk-metrics@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-2.12.0.tgz#8117b1434dcae34a1fd98b5befdea9b19d0fac20" + integrity sha512-mVMaEHwCUJuY3S4Esn+nT0yQA3qCEGh+SOPJsXygU0Gl453WcsDNjtEa8EfdewMwoLyr1tlofB4fXytVpiXuow== + dependencies: + "@opentelemetry/core" "2.12.0" + "@opentelemetry/resources" "2.12.0" + +"@opentelemetry/sdk-node@^0.223.0": + version "0.223.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-node/-/sdk-node-0.223.0.tgz#aaaa068c8b8693b8e829185936171ad70cd73694" + integrity sha512-PPfkgVBB9XVdANmSYeGfp1tG6RdsRFo9m9R6/ZnjvE9+TYTEXO2KYarsdtXQTdHhLSw7yzhSHqsNyUQ6c6W3eg== + dependencies: + "@opentelemetry/api-logs" "0.223.0" + "@opentelemetry/configuration" "0.223.0" + "@opentelemetry/context-async-hooks" "2.12.0" + "@opentelemetry/core" "2.12.0" + "@opentelemetry/exporter-logs-otlp-grpc" "0.223.0" + "@opentelemetry/exporter-logs-otlp-http" "0.223.0" + "@opentelemetry/exporter-logs-otlp-proto" "0.223.0" + "@opentelemetry/exporter-metrics-otlp-grpc" "0.223.0" + "@opentelemetry/exporter-metrics-otlp-http" "0.223.0" + "@opentelemetry/exporter-metrics-otlp-proto" "0.223.0" + "@opentelemetry/exporter-prometheus" "0.223.0" + "@opentelemetry/exporter-trace-otlp-grpc" "0.223.0" + "@opentelemetry/exporter-trace-otlp-http" "0.223.0" + "@opentelemetry/exporter-trace-otlp-proto" "0.223.0" + "@opentelemetry/exporter-zipkin" "2.12.0" + "@opentelemetry/instrumentation" "0.223.0" + "@opentelemetry/otlp-exporter-base" "0.223.0" + "@opentelemetry/otlp-grpc-exporter-base" "0.223.0" + "@opentelemetry/propagator-b3" "2.12.0" + "@opentelemetry/propagator-jaeger" "2.12.0" + "@opentelemetry/resources" "2.12.0" + "@opentelemetry/sdk-logs" "0.223.0" + "@opentelemetry/sdk-metrics" "2.12.0" + "@opentelemetry/sdk-trace" "2.12.0" + "@opentelemetry/sdk-trace-base" "2.12.0" + "@opentelemetry/sdk-trace-node" "2.12.0" "@opentelemetry/semantic-conventions" "^1.29.0" -"@opentelemetry/sdk-metrics@2.9.0": - version "2.9.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-2.9.0.tgz#4339ac637b9dc99c597bafdefb0ba66ef7391a7c" - integrity sha512-Xx8RGS4H5XEBl01WuCreMIpiah9cCXMbSkeuIePPdD2cUpq/vUzYmj8E/MK1OsbOc93FuAD4jfn2WOacKwLn7Q== - dependencies: - "@opentelemetry/core" "2.9.0" - "@opentelemetry/resources" "2.9.0" - -"@opentelemetry/sdk-node@^0.220.0": - version "0.220.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-node/-/sdk-node-0.220.0.tgz#c2b29b0e9169974f706063117038e6fb8187d01e" - integrity sha512-wHtGyHhSKHNH3fym33xRu4Ef/HXTFvX8eQ42xdQdEO9LYx9Y2qNyBDJytyqVlvmo6abWZlNYTUthuAGUMYqYnQ== - dependencies: - "@opentelemetry/api-logs" "0.220.0" - "@opentelemetry/configuration" "0.220.0" - "@opentelemetry/context-async-hooks" "2.9.0" - "@opentelemetry/core" "2.9.0" - "@opentelemetry/exporter-logs-otlp-grpc" "0.220.0" - "@opentelemetry/exporter-logs-otlp-http" "0.220.0" - "@opentelemetry/exporter-logs-otlp-proto" "0.220.0" - "@opentelemetry/exporter-metrics-otlp-grpc" "0.220.0" - "@opentelemetry/exporter-metrics-otlp-http" "0.220.0" - "@opentelemetry/exporter-metrics-otlp-proto" "0.220.0" - "@opentelemetry/exporter-prometheus" "0.220.0" - "@opentelemetry/exporter-trace-otlp-grpc" "0.220.0" - "@opentelemetry/exporter-trace-otlp-http" "0.220.0" - "@opentelemetry/exporter-trace-otlp-proto" "0.220.0" - "@opentelemetry/exporter-zipkin" "2.9.0" - "@opentelemetry/instrumentation" "0.220.0" - "@opentelemetry/otlp-exporter-base" "0.220.0" - "@opentelemetry/otlp-grpc-exporter-base" "0.220.0" - "@opentelemetry/propagator-b3" "2.9.0" - "@opentelemetry/propagator-jaeger" "2.9.0" - "@opentelemetry/resources" "2.9.0" - "@opentelemetry/sdk-logs" "0.220.0" - "@opentelemetry/sdk-metrics" "2.9.0" - "@opentelemetry/sdk-trace" "2.9.0" - "@opentelemetry/sdk-trace-base" "2.9.0" - "@opentelemetry/sdk-trace-node" "2.9.0" - "@opentelemetry/semantic-conventions" "^1.29.0" - -"@opentelemetry/sdk-trace-base@2.9.0": - version "2.9.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.9.0.tgz#34e314486127ce0ad596757a10c4c6f8ed435385" - integrity sha512-cp9zmTl62R8PJrpvFcmc8N2JQU/xfa0S+61q511Nji+QxCfZ8Ifvg7H27G8cANe4crg4RTrWsVvanHiXjSp6ag== +"@opentelemetry/sdk-trace-base@2.12.0", "@opentelemetry/sdk-trace-base@^2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.12.0.tgz#9112b4c3f49d3f1e8c4db1d76e7ce4fd60f8d946" + integrity sha512-JOERgZCxRM06FEJ5kEWxlSRChah6MmXDx3KwCruqEv/iEyLkTokCSemf2y1w8oIHtfrr8EVTpzebq/31vn2Cpg== dependencies: - "@opentelemetry/core" "2.9.0" - "@opentelemetry/resources" "2.9.0" - "@opentelemetry/sdk-trace" "2.9.0" + "@opentelemetry/core" "2.12.0" + "@opentelemetry/resources" "2.12.0" + "@opentelemetry/sdk-trace" "2.12.0" "@opentelemetry/semantic-conventions" "^1.29.0" -"@opentelemetry/sdk-trace-base@^2.9.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.11.0.tgz#3f725401fcfb16e5b2335c103cdc9488829632d1" - integrity sha512-H19x/TX/LZdqiYOjM7fqtSxwlplC5pgelavqbQdHbhdq0q/AI/TGkM2dfGuuynTXmJPeF2HoZVoPDu+TGoW78A== - dependencies: - "@opentelemetry/core" "2.11.0" - "@opentelemetry/resources" "2.11.0" - "@opentelemetry/sdk-trace" "2.11.0" - "@opentelemetry/semantic-conventions" "^1.29.0" - -"@opentelemetry/sdk-trace-node@2.9.0": - version "2.9.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.9.0.tgz#9feef2787dd7002f3ed2fcf2b5e9dd4b412db31a" - integrity sha512-ec9a7ps37huy5itYk0MalaZdSLlM6AXWp/FhtEjgMpp5leEGojBDvAl/UWttQnkMZOvFHKzRESn8TD3yKTF5nQ== - dependencies: - "@opentelemetry/context-async-hooks" "2.9.0" - "@opentelemetry/core" "2.9.0" - "@opentelemetry/sdk-trace-base" "2.9.0" - -"@opentelemetry/sdk-trace@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace/-/sdk-trace-2.11.0.tgz#46bbba9d366755df7d6faded0f7cd25af7f265c2" - integrity sha512-fFnTqGm8/G73GQVnxYi7LXa1ZVYEUvgL6XI1LpvV0bPC7WQ/ZGgKxCSl8FnlZBKto9JHHEFTO6s6CUpvvtwFrA== +"@opentelemetry/sdk-trace-node@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.12.0.tgz#d7ec21b6071be4e0184e844d79cedf6d6c601069" + integrity sha512-9DufH1IlmQMoKAfot5y/FhTP1RnmhLb5K6eKmJO/bvzPjYwPAazoiAUbTZFdPbqxOXN0FEbhZx/e6SB1Og4jmg== dependencies: - "@opentelemetry/core" "2.11.0" - "@opentelemetry/resources" "2.11.0" - "@opentelemetry/semantic-conventions" "^1.29.0" + "@opentelemetry/context-async-hooks" "2.12.0" + "@opentelemetry/core" "2.12.0" + "@opentelemetry/sdk-trace-base" "2.12.0" -"@opentelemetry/sdk-trace@2.9.0": - version "2.9.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace/-/sdk-trace-2.9.0.tgz#c82103a11a712b31ac9281b706fc5dc76d126ae6" - integrity sha512-sGA19HvtrrSKYsseHphluH6j3p6Xa3fqc7c7y8f/7mYWejc1lyDFcpSdD1kYa50HCLUeEo4zA5bW0pniaPszuw== +"@opentelemetry/sdk-trace@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace/-/sdk-trace-2.12.0.tgz#1fb0b9bd64e547df9561f3a229d7a93f245eeccd" + integrity sha512-ImVuRQ6faOsTi1Wna88s2avgrrf/iDgXPigIeynkUhjstMuoQUDOJXgkez2j1mlU4btjXcXBGa+q7qKFYR3GsA== dependencies: - "@opentelemetry/core" "2.9.0" - "@opentelemetry/resources" "2.9.0" + "@opentelemetry/core" "2.12.0" + "@opentelemetry/resources" "2.12.0" "@opentelemetry/semantic-conventions" "^1.29.0" "@opentelemetry/semantic-conventions@^1.29.0": @@ -1665,10 +1614,10 @@ resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== -"@scality/arsenal@^8.6.0-0": - version "8.6.0-preview.1" - resolved "https://registry.yarnpkg.com/@scality/arsenal/-/arsenal-8.6.0-preview.1.tgz#351314c469aac8ff133d9cdd7d0024afafce87cb" - integrity sha512-vKYVAusgjPxwQt/DyEtswKWyHLFElmSUX5LqWbEfP5+IaNa7872r6H6IG8BuzGNIV4tMLgFNe9y2iO5tzr1b8w== +"@scality/arsenal@^8.6.0": + version "8.6.0" + resolved "https://registry.yarnpkg.com/@scality/arsenal/-/arsenal-8.6.0.tgz#7d8422893a6f498894e04509cb07f1bcb224e5ab" + integrity sha512-RxYMTZf23vd4P1lQEm/H7Jy0yIFZ+2/uFqpp7tLD4lj8iu6Lj8MsF+KxWfB3QLvwVKx9QPsMqSe06QaOPwqh4Q== dependencies: "@aws-sdk/client-kms" "^3.975.0" "@aws-sdk/client-s3" "^3.975.0" @@ -1678,10 +1627,10 @@ "@azure/storage-blob" "^12.31.0" "@js-sdsl/ordered-set" "^4.4.2" "@opentelemetry/api" "^1.9.1" - "@opentelemetry/exporter-trace-otlp-http" "^0.220.0" - "@opentelemetry/resources" "^2.9.0" - "@opentelemetry/sdk-node" "^0.220.0" - "@opentelemetry/sdk-trace-base" "^2.9.0" + "@opentelemetry/exporter-trace-otlp-http" "^0.223.0" + "@opentelemetry/resources" "^2.12.0" + "@opentelemetry/sdk-node" "^0.223.0" + "@opentelemetry/sdk-trace-base" "^2.12.0" "@scality/hdclient" "^1.3.2" "@smithy/node-http-handler" "^4.3.0" "@smithy/protocol-http" "^5.3.5" @@ -1691,6 +1640,7 @@ async "~2.6.4" base-x "3.0.11" base62 "^2.0.2" + classic-level "^3.0.0" debug "^4.4.3" fcntl "github:scality/node-fcntl#0.3.1" httpagent scality/httpagent#1.1.1 @@ -1698,10 +1648,7 @@ ioredis "^5.8.1" ipaddr.js "^2.2.0" joi "^18.0.1" - level "~5.0.1" - level-sublevel "~6.6.5" mongodb "^6.20.0" - node-forge "^1.3.1" prom-client "^15.1.3" simple-glob "^0.2.0" socket.io "^4.8.0" @@ -2276,42 +2223,17 @@ abstract-level@^2.0.0, abstract-level@^2.0.1: maybe-combine-errors "^1.0.0" module-error "^1.0.1" -abstract-leveldown@^6.2.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" - integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - -abstract-leveldown@~0.12.1: - version "0.12.4" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz#29e18e632e60e4e221d5810247852a63d7b2e410" - integrity sha512-TOod9d5RDExo6STLMGa+04HGkl+TlMfbDnTyN93/ETJ9DpQ0DaYLqcMZlbXvdc4W3vVo1Qrl+WhSp8zvDsJ+jA== - dependencies: - xtend "~3.0.0" - -abstract-leveldown@~6.0.1: - version "6.0.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.0.3.tgz#b4b6159343c74b0c5197b2817854782d8f748c4a" - integrity sha512-jzewKKpZbaYUa6HTThnrl+GrJhzjEAeuc7hTVpZdzg7kupXZFoqQDFwyOwLNbmJKJlmzw8yiipMPkDiuKkT06Q== - dependencies: - level-concat-iterator "~2.0.0" - xtend "~4.0.0" - -abstract-leveldown@~6.2.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" - integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== +abstract-level@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-3.1.1.tgz#d61a7ae1a5cff15f315592a4cfa3259489ac2388" + integrity sha512-CW2gKbJFTuX1feMvOrvsVMmijAOgI9kg2Ie9Dq3gOcMt/dVVoVmqNlLcEUCT13NxHFMEajcUcVBIplbyDroDiw== dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" + buffer "^6.0.3" + is-buffer "^2.0.5" + level-supports "^6.2.0" + level-transcoder "^1.0.1" + maybe-combine-errors "^1.0.0" + module-error "^1.0.1" accepts@^2.0.0: version "2.0.0" @@ -2694,13 +2616,6 @@ bintrees@1.0.2: resolved "https://registry.yarnpkg.com/bintrees/-/bintrees-1.0.2.tgz#49f896d6e858a4a499df85c38fb399b9aff840f8" integrity sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw== -bl@~0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/bl/-/bl-0.8.2.tgz#c9b6bca08d1bc2ea00fc8afb4f1a5fd1e1c66e4e" - integrity sha512-pfqikmByp+lifZCS0p6j6KreV6kNU6Apzpm2nKOk+94cZb/jvle55+JxWiByUQ0Wo/+XnDXEy5MxxKMb6r0VIw== - dependencies: - readable-stream "~1.0.26" - body-parser@^2.2.1: version "2.3.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-2.3.0.tgz#6d8662f4d8c336028b8ac9aa24251b0ca64ba437" @@ -2814,14 +2729,6 @@ buffer@5.6.0: base64-js "^1.0.2" ieee754 "^1.1.4" -buffer@^5.5.0, buffer@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - buffer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" @@ -2842,21 +2749,6 @@ bytes@^3.1.2, bytes@~3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -bytewise-core@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42" - integrity sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA== - dependencies: - typewise-core "^1.2" - -bytewise@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/bytewise/-/bytewise-1.1.0.tgz#1d13cbff717ae7158094aa881b35d081b387253e" - integrity sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ== - dependencies: - bytewise-core "^1.2.2" - typewise "^1.0.3" - cacache@^19.0.1: version "19.0.1" resolved "https://registry.yarnpkg.com/cacache/-/cacache-19.0.1.tgz#3370cc28a758434c85c2585008bd5bdcff17d6cd" @@ -2964,6 +2856,16 @@ classic-level@^2.0.0: napi-macros "^2.2.2" node-gyp-build "^4.3.0" +classic-level@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-3.0.0.tgz#2be00defbaf7d204ac33da77988993c6c337ba67" + integrity sha512-yGy8j8LjPbN0Bh3+ygmyYvrmskVita92pD/zCoalfcC9XxZj6iDtZTAnz+ot7GG8p9KLTG+MZ84tSA4AhkgVZQ== + dependencies: + abstract-level "^3.1.0" + module-error "^1.0.1" + napi-macros "^2.2.2" + node-gyp-build "^4.3.0" + cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -3045,11 +2947,6 @@ cookie@^0.7.1, cookie@~0.7.2: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - cors@~2.8.5: version "2.8.6" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.6.tgz#ff5dd69bd95e547503820d29aba4f8faf8dfec96" @@ -3161,21 +3058,6 @@ default-browser@^5.2.1: bundle-name "^4.1.0" default-browser-id "^5.0.0" -deferred-leveldown@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz#2cef1f111e1c57870d8bbb8af2650e587cd2f5b4" - integrity sha512-+WCbb4+ez/SZ77Sdy1iadagFiVzMB89IKOBhglgnUkVxOxRWmmFsz8UDSNWh4Rhq+3wr/vMFlYj+rdEwWUDdng== - dependencies: - abstract-leveldown "~0.12.1" - -deferred-leveldown@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" - integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== - dependencies: - abstract-leveldown "~6.2.1" - inherits "^2.0.3" - define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" @@ -3282,16 +3164,6 @@ encodeurl@^2.0.0: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== -encoding-down@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" - integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== - dependencies: - abstract-leveldown "^6.2.1" - inherits "^2.0.3" - level-codec "^9.0.0" - level-errors "^2.0.0" - encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" @@ -3345,13 +3217,6 @@ err-code@^2.0.2: resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== -errno@~0.1.1: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - error-ex@^1.3.1: version "1.3.4" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.4.tgz#b3a8d8bb6f92eecc1629e3e27d3c8607a8a32414" @@ -4155,7 +4020,7 @@ http-proxy-agent@^7.0.0: dependencies: agentkeepalive "^4.5.0" -"httpagent@github:scality/httpagent#1.1.1", httpagent@scality/httpagent#1.1.1: +"httpagent@github:scality/httpagent#1.1.1": version "1.1.1" resolved "https://codeload.github.com/scality/httpagent/tar.gz/7c6ef8be1cd89b56651f4a922ea5c92d7673ee2e" dependencies: @@ -4200,7 +4065,7 @@ ieee754@1.1.13: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== -ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: +ieee754@^1.1.4, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -4210,16 +4075,6 @@ ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== -immediate@^3.2.3: - version "3.3.0" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" - integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== - -immediate@~3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" - integrity sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg== - import-fresh@^3.2.1: version "3.3.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" @@ -4258,7 +4113,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.4: +inherits@2, inherits@^2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4533,11 +4388,6 @@ is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15, is-typed dependencies: which-typed-array "^1.1.16" -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - is-unsafe@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/is-unsafe/-/is-unsafe-2.0.2.tgz#bb1ead17f1aa688f6433258b561e98b1a45a1afc" @@ -4570,11 +4420,6 @@ is-wsl@^3.1.0: dependencies: is-inside-container "^1.0.0" -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - isarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -5155,86 +5000,11 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -level-codec@^9.0.0: - version "9.0.2" - resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" - integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ== - dependencies: - buffer "^5.6.0" - -level-concat-iterator@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" - integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== - -level-errors@^2.0.0, level-errors@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8" - integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw== - dependencies: - errno "~0.1.1" - -level-iterator-stream@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" - integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== - dependencies: - inherits "^2.0.4" - readable-stream "^3.4.0" - xtend "^4.0.2" - -level-js@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/level-js/-/level-js-4.0.2.tgz#fa51527fa38b87c4d111b0d0334de47fcda38f21" - integrity sha512-PeGjZsyMG4O89KHiez1zoMJxStnkM+oBIqgACjoo5PJqFiSUUm3GNod/KcbqN5ktyZa8jkG7I1T0P2u6HN9lIg== - dependencies: - abstract-leveldown "~6.0.1" - immediate "~3.2.3" - inherits "^2.0.3" - ltgt "^2.1.2" - typedarray-to-buffer "~3.1.5" - -level-packager@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" - integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== - dependencies: - encoding-down "^6.3.0" - levelup "^4.3.2" - -level-post@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/level-post/-/level-post-1.0.7.tgz#19ccca9441a7cc527879a0635000f06d5e8f27d0" - integrity sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew== - dependencies: - ltgt "^2.1.2" - -level-sublevel@~6.6.5: - version "6.6.5" - resolved "https://registry.yarnpkg.com/level-sublevel/-/level-sublevel-6.6.5.tgz#acddfa2be033b9e503544e2c647f3c03d5a23fbd" - integrity sha512-SBSR60x+dghhwGUxPKS+BvV1xNqnwsEUBKmnFepPaHJ6VkBXyPK9SImGc3K2BkwBfpxlt7GKkBNlCnrdufsejA== - dependencies: - bytewise "~1.1.0" - levelup "~0.19.0" - ltgt "~2.1.1" - pull-defer "^0.2.2" - pull-level "^2.0.3" - pull-stream "^3.6.8" - typewiselite "~1.0.0" - xtend "~4.0.0" - -level-supports@^6.0.0: +level-supports@^6.0.0, level-supports@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-6.2.0.tgz#e78b228973a24acdc5199c5f51e244e70f26c611" integrity sha512-QNxVXP0IRnBmMsJIh+sb2kwNCYcKciQZJEt+L1hPCHrKNELllXhvrlClVHXBYZVT+a7aTSM6StgNXdAldoab3w== -level-supports@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" - integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== - dependencies: - xtend "^4.0.2" - level-transcoder@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" @@ -5252,49 +5022,6 @@ level@^9.0.0: browser-level "^2.0.0" classic-level "^2.0.0" -level@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/level/-/level-5.0.1.tgz#8528cc1ee37ac413270129a1eab938c610be3ccb" - integrity sha512-wcak5OQeA4rURGacqS62R/xNHjCYnJSQDBOlm4KNUGJVE9bWv2B04TclqReYejN+oD65PzD4FsqeWoI5wNC5Lg== - dependencies: - level-js "^4.0.0" - level-packager "^5.0.0" - leveldown "^5.0.0" - opencollective-postinstall "^2.0.0" - -leveldown@^5.0.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-5.6.0.tgz#16ba937bb2991c6094e13ac5a6898ee66d3eee98" - integrity sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ== - dependencies: - abstract-leveldown "~6.2.1" - napi-macros "~2.0.0" - node-gyp-build "~4.1.0" - -levelup@^4.3.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" - integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== - dependencies: - deferred-leveldown "~5.3.0" - level-errors "~2.0.0" - level-iterator-stream "~4.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - -levelup@~0.19.0: - version "0.19.1" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-0.19.1.tgz#f3a6a7205272c4b5f35e412ff004a03a0aedf50b" - integrity sha512-FljDvNf24vbG8fiO1iF0XbLym1lrR80wmn+x6NOFxhJ9arbPWXkzfhJpS8a2w5ft8MaD95c0+RvEHa0QHegAUA== - dependencies: - bl "~0.8.1" - deferred-leveldown "~0.2.0" - errno "~0.1.1" - prr "~0.0.0" - readable-stream "~1.0.26" - semver "~5.1.0" - xtend "~3.0.0" - leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -5409,16 +5136,6 @@ long@^5.0.0, long@^5.3.2: resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83" integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA== -looper@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec" - integrity sha512-6DzMHJcjbQX/UPHc1rRCBfKlLwDkvuGZ715cIR36wSdYqWXFT35uLXq5P/2orl3tz+t+VOVPxw4yPinQlUDGDQ== - -looper@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749" - integrity sha512-LJ9wplN/uSn72oJRsXTx+snxPet5c8XiZmOKCm906NVYu+ag6SB6vUcnJcWxgnl2NfbIyeobAn7Bwv6xRj2XJg== - lru-cache@^10.0.1, lru-cache@^10.2.0: version "10.4.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" @@ -5431,16 +5148,6 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -ltgt@^2.1.2: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" - integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== - -ltgt@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34" - integrity sha512-5VjHC5GsENtIi5rbJd+feEpDKhfr7j0odoUR2Uh978g+2p93nd5o34cTjQWohXsPsCZeqoDnIqEf88mPCe0Pfw== - luxon@^3.2.1: version "3.7.2" resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.7.2.tgz#d697e48f478553cca187a0f8436aff468e3ba0ba" @@ -5737,11 +5444,6 @@ napi-macros@^2.2.2: resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== -napi-macros@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" - integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -5799,21 +5501,11 @@ node-exports-info@^1.6.0: object.entries "^1.1.9" semver "^6.3.1" -node-forge@^1.3.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.4.0.tgz#1c7b7d8bdc2d078739f58287d589d903a11b2fc2" - integrity sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ== - node-gyp-build@^4.3.0: version "4.8.4" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== -node-gyp-build@~4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.1.1.tgz#d7270b5d86717068d114cc57fff352f96d745feb" - integrity sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ== - node-gyp@^11.1.0: version "11.5.0" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-11.5.0.tgz#82661b5f40647a7361efe918e3cea76d297fcc56" @@ -5973,11 +5665,6 @@ open@^10.1.0: is-inside-container "^1.0.0" wsl-utils "^0.1.0" -opencollective-postinstall@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" - integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== - optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -6208,64 +5895,6 @@ proxy-addr@^2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -prr@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" - integrity sha512-LmUECmrW7RVj6mDWKjTXfKug7TFGdiz9P18HMcO4RHL+RW7MCOGNvpj5j47Rnp6ne6r4fZ2VzyUWEpKbg+tsjQ== - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== - -pull-cat@^1.1.9: - version "1.1.11" - resolved "https://registry.yarnpkg.com/pull-cat/-/pull-cat-1.1.11.tgz#b642dd1255da376a706b6db4fa962f5fdb74c31b" - integrity sha512-i3w+xZ3DCtTVz8S62hBOuNLRHqVDsHMNZmgrZsjPnsxXUgbWtXEee84lo1XswE7W2a3WHyqsNuDJTjVLAQR8xg== - -pull-defer@^0.2.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/pull-defer/-/pull-defer-0.2.3.tgz#4ee09c6d9e227bede9938db80391c3dac489d113" - integrity sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA== - -pull-level@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pull-level/-/pull-level-2.0.4.tgz#4822e61757c10bdcc7cf4a03af04c92734c9afac" - integrity sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg== - dependencies: - level-post "^1.0.7" - pull-cat "^1.1.9" - pull-live "^1.0.1" - pull-pushable "^2.0.0" - pull-stream "^3.4.0" - pull-window "^2.1.4" - stream-to-pull-stream "^1.7.1" - -pull-live@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/pull-live/-/pull-live-1.0.1.tgz#a4ecee01e330155e9124bbbcf4761f21b38f51f5" - integrity sha512-tkNz1QT5gId8aPhV5+dmwoIiA1nmfDOzJDlOOUpU5DNusj6neNd3EePybJ5+sITr2FwyCs/FVpx74YMCfc8YeA== - dependencies: - pull-cat "^1.1.9" - pull-stream "^3.4.0" - -pull-pushable@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581" - integrity sha512-M7dp95enQ2kaHvfCt2+DJfyzgCSpWVR2h2kWYnVsW6ZpxQBx5wOu0QWOvQPVoPnBLUZYitYP2y7HyHkLQNeGXg== - -pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8: - version "3.7.0" - resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.7.0.tgz#85de0e44ff38a4d2ad08cc43fc458e1922f9bf0b" - integrity sha512-Eco+/R004UaCK2qEDE8vGklcTG2OeZSVm1kTUQNrykEjDwcFXDZhygFDsW49DbXyJMEhHeRL3z5cRVqPAhXlIw== - -pull-window@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/pull-window/-/pull-window-2.1.4.tgz#fc3b86feebd1920c7ae297691e23f705f88552f0" - integrity sha512-cbDzN76BMlcGG46OImrgpkMf/VkCnupj8JhsrpBw3aWBM9ye345aYnqitmZCgauBkc0HbbRRn9hCnsa3k2FNUg== - dependencies: - looper "^2.0.0" - punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -6323,7 +5952,7 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== -readable-stream@^3.4.0, readable-stream@^3.5.0: +readable-stream@^3.5.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -6332,16 +5961,6 @@ readable-stream@^3.4.0, readable-stream@^3.5.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@~1.0.26: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - redis-errors@1.2.0, redis-errors@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" @@ -6521,11 +6140,6 @@ semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3, semver@^7.7.3: resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.5.tgz#39b646037dd50c14fb451e7e4cac58ed8b863f69" integrity sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA== -semver@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.1.1.tgz#a3292a373e6f3e0798da0b20641b9a9c5bc47e19" - integrity sha512-bNx9Zdbi1OUN62PbKeG4IgGG8YILX/nkHJ0NQEBwg5FmX8qTJfqhYd3reqkm0DxHCC8nkazb6UjNiBSHCBWVtA== - send@^1.1.0, send@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/send/-/send-1.2.1.tgz#9eab743b874f3550f40a26867bf286ad60d3f3ed" @@ -6821,14 +6435,6 @@ stream-browserify@3.0.0: inherits "~2.0.4" readable-stream "^3.5.0" -stream-to-pull-stream@^1.7.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz#4161aa2d2eb9964de60bfa1af7feaf917e874ece" - integrity sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg== - dependencies: - looper "^3.0.0" - pull-stream "^3.2.3" - streamx@^2.12.5, streamx@^2.15.0, streamx@^2.25.0: version "2.28.1" resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.28.1.tgz#376cd42a089505a69bec0efdb5189aa45586141f" @@ -6913,11 +6519,6 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -7168,35 +6769,11 @@ typed-array-length@^1.0.7: possible-typed-array-names "^1.1.0" reflect.getprototypeof "^1.0.10" -typedarray-to-buffer@~3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - typescript@^4.9.5: version "4.9.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== -typewise-core@^1.2, typewise-core@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195" - integrity sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg== - -typewise@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651" - integrity sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ== - dependencies: - typewise-core "^1.2.0" - -typewiselite@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typewiselite/-/typewiselite-1.0.0.tgz#c8882fa1bb1092c06005a97f34ef5c8508e3664e" - integrity sha512-J9alhjVHupW3Wfz6qFRGgQw0N3gr8hOkw6zm7FZ6UR1Cse/oD9/JVok7DNE9TT9IbciDHX2Ex9+ksE6cRmtymw== - uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" @@ -7339,16 +6916,16 @@ webidl-conversions@^7.0.0: fast-safe-stringify "^2.1.1" safe-json-stringify "^1.2.0" -werelogs@scality/werelogs#8.2.0: - version "8.2.0" - resolved "https://codeload.github.com/scality/werelogs/tar.gz/7bf334cea94002d118f27d7ec1c7a5af74b51b8d" +"werelogs@github:scality/werelogs#8.2.5", werelogs@scality/werelogs#8.2.5, "werelogs@scality/werelogs#semver:^8.2.4": + version "8.2.5" + resolved "https://codeload.github.com/scality/werelogs/tar.gz/41188826d661227f98ebaaeda7df5e5862809bc7" dependencies: fast-safe-stringify "^2.1.1" safe-json-stringify "^1.2.0" -werelogs@scality/werelogs#8.2.5, "werelogs@scality/werelogs#semver:^8.2.4": - version "8.2.5" - resolved "https://codeload.github.com/scality/werelogs/tar.gz/41188826d661227f98ebaaeda7df5e5862809bc7" +werelogs@scality/werelogs#8.2.0: + version "8.2.0" + resolved "https://codeload.github.com/scality/werelogs/tar.gz/7bf334cea94002d118f27d7ec1c7a5af74b51b8d" dependencies: fast-safe-stringify "^2.1.1" safe-json-stringify "^1.2.0" @@ -7508,16 +7085,6 @@ xmlhttprequest-ssl@~2.1.1: resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz#e9e8023b3f29ef34b97a859f584c5e6c61418e23" integrity sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ== -xtend@^4.0.2, xtend@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -xtend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" - integrity sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg== - y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" From 382ad6fee2a5d6a2a16e26f7d7e08650c9c03abc Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Thu, 15 Oct 2026 09:28:35 +0200 Subject: [PATCH 02/12] Bump GitHub Actions to their current major versions The previous majors still run on the Node 20 actions runtime, which GitHub is phasing out. The new ones move to Node 24 and keep the inputs used here unchanged. Issue: S3UTILS-249 --- .github/workflows/alerts.yml | 2 +- .github/workflows/build.yml | 10 +++++----- .github/workflows/codeql.yaml | 6 +++--- .github/workflows/dependency-review.yaml | 4 ++-- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 24 ++++++++++++------------ 6 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.github/workflows/alerts.yml b/.github/workflows/alerts.yml index c2b89838..403bfa86 100644 --- a/.github/workflows/alerts.yml +++ b/.github/workflows/alerts.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v7 - name: Render and test count-items-cronjob uses: scality/action-prom-render-test@1.0.3 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b9b5f1e1..fc2876e9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,13 +17,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v7 - name: Set up QEMU - uses: docker/setup-qemu-action@v3 + uses: docker/setup-qemu-action@v4 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@v4 - name: Install Oras run: | @@ -33,7 +33,7 @@ jobs: ORAS_VERSION: 1.2.2 - name: Login to Registry - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ghcr.io username: ${{ github.repository_owner }} @@ -54,7 +54,7 @@ jobs: working-directory: monitoring - name: Build and push - uses: docker/build-push-action@v6 + uses: docker/build-push-action@v7 with: context: . file: ./Dockerfile diff --git a/.github/workflows/codeql.yaml b/.github/workflows/codeql.yaml index 53f513f4..a3c3058a 100644 --- a/.github/workflows/codeql.yaml +++ b/.github/workflows/codeql.yaml @@ -14,12 +14,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v7 - name: Initialize CodeQL - uses: github/codeql-action/init@v3 + uses: github/codeql-action/init@v4 with: languages: javascript, python - name: Build and analyze - uses: github/codeql-action/analyze@v3 + uses: github/codeql-action/analyze@v4 diff --git a/.github/workflows/dependency-review.yaml b/.github/workflows/dependency-review.yaml index 60307dea..7585316b 100644 --- a/.github/workflows/dependency-review.yaml +++ b/.github/workflows/dependency-review.yaml @@ -10,10 +10,10 @@ jobs: runs-on: ubuntu-latest steps: - name: 'Checkout Repository' - uses: actions/checkout@v5 + uses: actions/checkout@v7 - name: 'Dependency Review' - uses: actions/dependency-review-action@v4 + uses: actions/dependency-review-action@v5.0.0 with: # aws-sdk v2 is intentionally used as a devDependency because the # fix-missing-replication-permissions script runs inside the vault diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d0d7d9e6..5ed08a11 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -30,7 +30,7 @@ jobs: - build steps: - name: Create Release - uses: softprops/action-gh-release@v2 + uses: softprops/action-gh-release@v3 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 632edfa8..f23f6faf 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -21,20 +21,20 @@ jobs: packages: write steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v7 - name: Set up Docker Buildk - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@v4 - name: Login to Registry - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ github.token }} - name: Build and push MongoDB - uses: docker/build-push-action@v6 + uses: docker/build-push-action@v7 with: push: true context: .github/dockerfiles/mongodb @@ -54,16 +54,16 @@ jobs: - 27019:27019 steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v7 - name: Install node - uses: actions/setup-node@v4 + uses: actions/setup-node@v7 with: node-version: '24' cache: 'yarn' - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@v4 - name: Login to Registry - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ghcr.io username: ${{ github.repository_owner }} @@ -86,11 +86,11 @@ jobs: env: MONGODB_REPLICASET: "127.0.0.1:27018" - name: Upload coverage reports to Codecov - uses: codecov/codecov-action@v5 + uses: codecov/codecov-action@v7 with: token: ${{ secrets.CODECOV_TOKEN }} - name: "Debug: SSH to runner" - uses: scality/actions/action-ssh-to-runner@1.9.0 + uses: scality/actions/action-ssh-to-runner@1.19.0 continue-on-error: true with: tmate-server-host: ${{ secrets.TMATE_SERVER_HOST }} @@ -103,9 +103,9 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v7 - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v7 with: go-version: '1.24' cache-dependency-path: BackupRepair/go.mod From 6e0f2c319eb15901699d1282d318985f0fa0b33e Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Thu, 15 Oct 2026 09:30:22 +0200 Subject: [PATCH 03/12] Bump utapi report Python dependencies These pins dated back to 2022 and carried several known CVEs in requests, urllib3, certifi and idna. They are installed in the base image, so the whole image was flagged. service-report.py only uses plain requests calls, which behave the same with requests 2.34 and urllib3 2.x. Issue: S3UTILS-249 --- utapi/requirements.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/utapi/requirements.txt b/utapi/requirements.txt index ad80d97a..a36233ad 100644 --- a/utapi/requirements.txt +++ b/utapi/requirements.txt @@ -1,5 +1,5 @@ -certifi==2022.6.15 -charset-normalizer==2.1.0 -idna==3.3 -requests==2.28.1 -urllib3==1.26.11 +certifi==2026.7.22 +charset-normalizer==3.5.2 +idna==3.20 +requests==2.34.2 +urllib3==2.8.0 From 1a12fb97e58d58142cff062cd3cb786c44b26546 Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Thu, 15 Oct 2026 12:00:36 +0200 Subject: [PATCH 04/12] Remove the replication audit tooling replicationAudit/ was written for a one-shot migration: finding CRR roles missing s3:ReplicateObject and fixing them before that permission got enforced. That migration is done, so the list, check and fix scripts are dropped along with their tests. The fix script was the only user of aws-sdk v2, which is end-of-life and flagged by dependency review, so that devDependency and its allowlist entry go too. Issue: S3UTILS-249 --- .github/workflows/dependency-review.yaml | 7 - package.json | 1 - replicationAudit/README.md | 679 ------------------ .../check-replication-permissions.js | 495 ------------- .../fix-missing-replication-permissions.js | 371 ---------- .../list-buckets-with-replication.sh | 325 --------- .../fixMissingReplicationPermissions.js | 662 ----------------- tests/unit/replicationAudit/policyChecker.js | 325 --------- yarn.lock | 114 +-- 9 files changed, 11 insertions(+), 2968 deletions(-) delete mode 100644 replicationAudit/README.md delete mode 100644 replicationAudit/check-replication-permissions.js delete mode 100644 replicationAudit/fix-missing-replication-permissions.js delete mode 100755 replicationAudit/list-buckets-with-replication.sh delete mode 100644 tests/functional/replicationAudit/fixMissingReplicationPermissions.js delete mode 100644 tests/unit/replicationAudit/policyChecker.js diff --git a/.github/workflows/dependency-review.yaml b/.github/workflows/dependency-review.yaml index 7585316b..39b15033 100644 --- a/.github/workflows/dependency-review.yaml +++ b/.github/workflows/dependency-review.yaml @@ -14,10 +14,3 @@ jobs: - name: 'Dependency Review' uses: actions/dependency-review-action@v5.0.0 - with: - # aws-sdk v2 is intentionally used as a devDependency because the - # fix-missing-replication-permissions script runs inside the vault - # container of older S3C versions (pre-9.5.2) where only v2 is - # available. This low-severity advisory is informational (no patch - # exists, v2 is end-of-life). - allow-ghsas: GHSA-j965-2qgj-vjmq diff --git a/package.json b/package.json index 6036f49e..2e06e222 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,6 @@ "@aws-sdk/client-iam": "^3.962.0", "@scality/eslint-config-scality": "scality/Guidelines#8.3.0", "@sinonjs/fake-timers": "^14.0.0", - "aws-sdk": "^2.1692.0", "eslint": "^9.14.0", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^28.11.0", diff --git a/replicationAudit/README.md b/replicationAudit/README.md deleted file mode 100644 index b3a23e2c..00000000 --- a/replicationAudit/README.md +++ /dev/null @@ -1,679 +0,0 @@ -# TL;DR Complete Workflow Example - -Here's a complete example running the two scripts and audit the IAM policies used by CRR. - -Use the fix-missing-replication-permissions.js script (step 7) to correct any missing permissions found by the check script. If the fix script fails with "missing ownerDisplayName", re-run check-replication-permissions.js — this field was added in s3utils 1.17.5. - -From your local machine: copy scripts to the supervisor - -```bash -scp replicationAudit/list-buckets-with-replication.sh root@:/root/ -scp replicationAudit/check-replication-permissions.js root@:/root/ -scp replicationAudit/fix-missing-replication-permissions.js root@:/root/ -``` - -Connect to the supervisor -```bash -ssh root@ -``` - -Then, from the supervisor, go to the federation directory -(by default `/srv/scality/s3/s3-offline/federation`): - -```bash -cd /srv/scality/s3/s3-offline/federation -ENV_DIR=s3config - -# Step 1: Copy scripts to S3 connector node -ansible -i env/$ENV_DIR/inventory runners_s3[0] -m copy \ - -a 'src=/root/list-buckets-with-replication.sh dest=/root/' -ansible -i env/$ENV_DIR/inventory runners_s3[0] -m copy \ - -a 'src=/root/check-replication-permissions.js dest={{ env_host_logs}}/scality-vault{{ container_name_suffix | default("")}}/logs' -ansible -i env/$ENV_DIR/inventory runners_s3[0] -m copy \ - -a 'src=/root/fix-missing-replication-permissions.js dest={{ env_host_logs}}/scality-vault{{ container_name_suffix | default("")}}/logs' - -# Step 2: Run list-buckets-with-replication.sh -ansible -i env/$ENV_DIR/inventory runners_s3[0] -m shell \ - -a 'BUCKETD_HOST=$(ss -nlptH "sport = :9000" | awk "{print \$4}"| cut -d: -f1) bash /root/list-buckets-with-replication.sh' - -# Step 3: Find the vault-metadata repd leader IP (port 5300) -ansible -i env/$ENV_DIR/inventory md1-cluster1 -m shell \ - -a 'curl -s http://localhost:5300/_/raft/leader' -# Note both "ip" and "port" values, e.g., {"ip":"10.160.116.162","port":4300} -# On 3-server rings the port may differ per node (4300, 4301, etc.) - -# Step 4: Set the LEADER variable (ip:port) and run the permission check script -# Note: replace ctrctl with docker on RHEL/CentOS 7 -LEADER=: - -ansible -i env/$ENV_DIR/inventory runners_s3[0] -m shell \ - -a "cp /root/buckets-with-replication.json {{ env_host_logs}}/scality-vault{{ container_name_suffix | default("")}}/logs && \ - ctrctl exec scality-vault{{ container_name_suffix | default("")}} node /logs/check-replication-permissions.js \ - /logs/buckets-with-replication.json $LEADER /logs/missing.json" - -# Step 5: Retrieve results -ansible -i env/$ENV_DIR/inventory runners_s3[0] -m shell \ - -a 'cat {{ env_host_logs}}/scality-vault{{ container_name_suffix | default("")}}/logs/missing.json' \ - | grep -v CHANGED | tee /root/replicationAudit_missing.json - -# Step 6: Fix missing permissions -# Copy admin credentials and missing.json to vault container and run inside it -ansible -i env/$ENV_DIR/inventory runners_s3[0] -m copy \ - -a "src=/srv/scality/s3/s3-offline/federation/env/$ENV_DIR/vault/admin-clientprofile/admin1.json dest={{ env_host_logs}}/scality-vault{{ container_name_suffix | default("")}}/logs" - -ansible -i env/$ENV_DIR/inventory runners_s3[0] -m copy \ - -a 'src=/root/replicationAudit_missing.json dest={{ env_host_logs}}/scality-vault{{ container_name_suffix | default("")}}/logs/missing.json' - -ansible -i env/$ENV_DIR/inventory runners_s3[0] -m shell \ - -a 'ctrctl exec scality-vault{{ container_name_suffix | default("")}} env NODE_PATH=/home/scality/vault/node_modules node /logs/fix-missing-replication-permissions.js \ - /logs/missing.json localhost /logs/admin1.json /logs/replication-fix-results.json' - -# Retrieve fix results -ansible -i env/$ENV_DIR/inventory runners_s3[0] -m shell \ - -a 'cat {{ env_host_logs}}/scality-vault{{ container_name_suffix | default("")}}/logs/replication-fix-results.json' \ - | grep -v CHANGED | tee /root/replicationAudit_fix_results.json - -# Step 7: Re-run check to verify fixes (repeat steps 3-5) - -# Step 8: Clean up remote files -ansible -i env/$ENV_DIR/inventory runners_s3[0] -m shell \ - -a 'rm -f {{ env_host_logs}}/scality-vault{{ container_name_suffix | default("")}}/logs/missing.json \ - {{ env_host_logs}}/scality-vault{{ container_name_suffix | default("")}}/logs/check-replication-permissions.js \ - {{ env_host_logs}}/scality-vault{{ container_name_suffix | default("")}}/logs/fix-missing-replication-permissions.js \ - {{ env_host_logs}}/scality-vault{{ container_name_suffix | default("")}}/logs/buckets-with-replication.json \ - {{ env_host_logs}}/scality-vault{{ container_name_suffix | default("")}}/logs/replication-fix-results.json \ - {{ env_host_logs}}/scality-vault{{ container_name_suffix | default("")}}/logs/admin1.json \ - /root/list-buckets-with-replication.sh \ - /root/buckets-with-replication.json' -``` - -# Scripts Documentation - -## list-buckets-with-replication.sh - -Lists all buckets with replication enabled across all accounts using the metadata API (bucketd). - -### Prerequisites - -- Access to an S3 connector node (`runners_s3`) with bucketd running -- `curl` and `jq` installed -- Bucketd accessible on port 9000 (default) - -### Usage - -1. Copy the script to the supervisor: - ```bash - scp replicationAudit/list-buckets-with-replication.sh root@:/root/ - ``` - -2. Connect to the supervisor as root and go to the federation directory - (by default `/srv/scality/s3/s3-offline/federation`): - ```bash - ssh root@ - cd /srv/scality/s3/s3-offline/federation - ENV_DIR=s3config - ``` - -3. Copy the script to an S3 connector node: - ```bash - ansible -i env/$ENV_DIR/inventory runners_s3[0] -m copy \ - -a 'src=/root/list-buckets-with-replication.sh dest=/root/' - ``` - -4. Run the script: - ```bash - ansible -i env/$ENV_DIR/inventory runners_s3[0] -m shell \ - -a 'bash /root/list-buckets-with-replication.sh' - ``` - -5. Retrieve the output file: - ```bash - ansible -i env/$ENV_DIR/inventory runners_s3[0] -m shell \ - -a 'cat /root/buckets-with-replication.json' - ``` - -### Configuration - -Environment variables can be used to customize behavior: - -| Variable | Default | Description | -|----------|---------|-------------| -| `BUCKETD_HOST` | localhost | Bucketd hostname | -| `BUCKETD_PORT` | 9000 | Bucketd port | -| `BATCH_SIZE` | 10 | Number of parallel curl requests (increase for faster execution) | -| `OUTPUT_FILE` | buckets-with-replication.json | Output file path | - -### Output Format - -The script produces a JSON file with metadata and results: - -```json -{ - "metadata": { - "timestamp": "2026-01-19T10:07:25Z", - "durationSeconds": 2, - "bucketdUrl": "http://localhost:9000", - "counts": { - "totalBucketsScanned": 150, - "bucketsWithReplication": 3, - "bucketsWithoutReplication": 147, - "fetchErrors": 0 - } - }, - "results": [ - { - "bucket": "source-bucket", - "owner": "267390090509", - "ownerDisplayName": "testaccount", - "sourceRole": "arn:aws:iam::267390090509:role/crr-source-role" - } - ] -} -``` - -### How It Works - -1. **Discovers buckets**: Queries `/default/bucket/users..bucket` which contains all bucket names across all accounts -2. **Fetches attributes**: For each bucket, fetches attributes via `/default/attributes/{bucket}` in batches of 10 (with connection reuse) -3. **Filters replication**: Identifies buckets with `replicationConfiguration` containing at least one enabled rule -4. **Extracts metadata**: Outputs bucket name, owner info, and the source role (part before the comma in the role ARN) - -### Example Run - -``` -=== List Buckets with Replication Enabled === -Bucketd: http://localhost:9000 -Batch size: 10 -Output file: buckets-with-replication.json - -Checking bucketd connectivity... -Connected to bucketd - -Step 1: Fetching bucket list... -Found 150 buckets (excluding internal buckets) - -Step 2: Fetching bucket attributes in batches of 10... - Processed 10/150 buckets (batch 1) - Processed 20/150 buckets (batch 2) - ... - -=== Summary === -Total buckets scanned: 150 - With replication: 3 - Without replication: 147 - Fetch errors: 0 -Duration: 2s -Output saved to: buckets-with-replication.json - -Done. -``` - -### Troubleshooting - -**"Cannot connect to bucketd"** -- Ensure you're running on an S3 connector node (`runners_s3`) where bucketd is running -- Check if bucketd is listening: `ss -tlnp | grep 9000` - -**"Found 0 buckets"** -- Verify users..bucket is accessible: `curl -s http://localhost:9000/default/bucket/users..bucket | jq '.Contents[].key'` - -**Script timeout** -- For large deployments, consider running directly on the S3 connector node via interactive SSH - ---- - -## check-replication-permissions.js - -Checks if replication roles have `s3:ReplicateObject` permission by directly -querying Vault metadata via the repd protocol (no vaultclient or credentials -needed). - -### Prerequisites - -- Output from `list-buckets-with-replication.sh` (buckets-with-replication.json) -- Access to an S3 connector node (`runners_s3`) with a container that has Node.js (e.g., vault container) - -### How It Works - -The script is self-contained with inlined functions from MetaData and Vault: - -- **Protocol constants** - from `MetaData/lib/protocol.json` -- **Protocol encoding** - from `MetaData/lib/server/ProtoBuilder.js` -- **Key generation** - from `vault/lib/Indexer.js` - -This ensures portability while using the exact same protocol and key formats as Vault. - -### Usage - -1. First, run `list-buckets-with-replication.sh` to generate the bucket list - (see above) - -2. Copy the script to the supervisor: - - ```bash - scp replicationAudit/check-replication-permissions.js root@:/root/ - ``` - -3. Connect to the supervisor as root (if not already connected) and go to the - federation directory (by default `/srv/scality/s3/s3-offline/federation`): - - ```bash - ssh root@ - cd /srv/scality/s3/s3-offline/federation - ENV_DIR=s3config - ``` - -4. Copy the script to an S3 connector node: - - ```bash - ansible -i env/$ENV_DIR/inventory 'runners_s3[0]' -m copy \ - -a 'src=/root/check-replication-permissions.js dest={{ env_host_logs}}/scality-vault{{ container_name_suffix | default("")}}/logs' - ``` - -5. Find the vault-metadata repd leader IP: - - ```bash - ansible -i env/$ENV_DIR/inventory md1-cluster1 -m shell \ - -a 'curl -s http://localhost:5300/_/raft/leader' - ``` - - This returns JSON like `{"ip":"10.160.116.162","port":4300}` - use both `ip` - and `port` values. On 3-server rings the port may differ per node (4300, 4301, etc.). - - **Note:** Vault metadata uses port 5300 for admin. - -6. Copy files to `/var/tmp` (mounted in vault container) and run the script: - - ```bash - LEADER=: - - ansible -i env/$ENV_DIR/inventory runners_s3[0] -m shell \ - -a "cp /root/buckets-with-replication.json {{ env_host_logs}}/scality-vault{{ container_name_suffix | default("")}}/logs && \ - ctrctl exec scality-vault{{ container_name_suffix | default("")}} node /logs/check-replication-permissions.js \ - /logs/buckets-with-replication.json $LEADER /logs/missing.json" - ``` - -8. Retrieve the output: - - ```bash - ansible -i env/$ENV_DIR/inventory runners_s3[0] -m shell \ - -a 'cat {{ env_host_logs}}/scality-vault{{ container_name_suffix | default("")}}/logs/missing.json' - ``` - -### Command Line Arguments - -``` -node check-replication-permissions.js [input-file] [leader-ip[:port]] [output-file] [--include-policies] -``` - -| Argument | Default | Description | -|----------|---------|-------------| -| `input-file` | /root/buckets-with-replication.json | Input JSON from list script | -| `leader-ip[:port]` | 127.0.0.1:4300 | Vault-metadata repd leader IP and optional port (default 4300) | -| `output-file` | /root/missing-replication-permissions.json | Output file path | -| `--include-policies` | (not set) | Include full policy documents in output | - -### Output Format - -> **Breaking change (since 1.17.5):** The output now includes `ownerDisplayName` -> in each result entry. This field is required by -> `fix-missing-replication-permissions.js` to identify accounts without an -> extra API call. If you ran `check-replication-permissions.js` on version -> 1.17.4 or earlier, **re-run it** to produce an output that -> `fix-missing-replication-permissions.js` can consume. - -The script produces a JSON file with metadata and results. The `results` array -contains **only buckets missing the `s3:ReplicateObject` permission**. - -**Default output (compact):** - -```json -{ - "metadata": { - "timestamp": "2026-01-19T15:27:11.557Z", - "durationMs": 24, - "durationHuman": "0.0s", - "repdLeader": "10.160.112.179:4300", - "inputFile": "/tmp/buckets.json", - "counts": { - "totalBuckets": 6, - "bucketsOk": 3, - "bucketsMissingPermission": 3, - "bucketsSkipped": 0, - "bucketsWithErrors": 0, - "uniqueRolesChecked": 2 - } - }, - "results": [ - { - "bucket": "bucket-old-1", - "ownerDisplayName": "testaccount", - "sourceRole": "arn:aws:iam::267390090509:role/crr-role-outdated", - "policies": [ - { - "name": "crr-policy-outdated", - "path": "/", - "allowsReplicateObject": false - } - ] - } - ] -} -``` - -**With `--include-policies` (full policy documents):** - -```json -{ - "metadata": { - "timestamp": "2026-01-19T15:27:11.557Z", - "durationMs": 24, - "durationHuman": "0.0s", - "repdLeader": "10.160.112.179:4300", - "inputFile": "/tmp/buckets.json", - "counts": { - "totalBuckets": 6, - "bucketsOk": 3, - "bucketsMissingPermission": 3, - "bucketsSkipped": 0, - "bucketsWithErrors": 0, - "uniqueRolesChecked": 2 - } - }, - "results": [ - { - "bucket": "bucket-old-1", - "sourceRole": "arn:aws:iam::267390090509:role/crr-role-outdated", - "policies": [ - { - "name": "crr-policy-outdated", - "path": "/", - "allowsReplicateObject": false, - "document": { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Action": ["s3:GetObjectVersion", "s3:GetObjectVersionAcl"], - "Resource": ["arn:aws:s3:::bucket-old-1/*"] - }, - { - "Effect": "Allow", - "Action": ["s3:ListBucket", "s3:GetReplicationConfiguration"], - "Resource": ["arn:aws:s3:::bucket-old-1"] - } - ] - } - } - ] - } - ] -} -``` - -In this example, the policy is missing `s3:ReplicateObject` - it only has -`s3:GetObjectVersion` and `s3:GetObjectVersionAcl`. - -**Fields:** - -- `bucket`: Source bucket name with replication enabled -- `sourceRole`: The IAM role ARN configured for replication -- `error`: (optional) Error message if role lookup failed -- `policies`: Array of all policies attached to the role, each containing: - - `name`: Policy name - - `path`: Policy path (e.g., `/` or `/custom/path/`) - - `allowsReplicateObject`: Whether this policy grants `s3:ReplicateObject` - (always false in output since we only output missing permissions) - - `document`: (only with `--include-policies`) Full IAM policy document for analysis - -### Script Logic - -1. **Connects to repd**: TCP connection to vault-metadata repd (default port 4300, configurable via `ip:port` argument) -2. **For each bucket's replication role**: - - Get role ID: `linkRoleArn(arn)` → role ID - - List attached policies: `policyByRoleId(accountId, roleId, '', '')` - - Get each policy: `policyByName(accountId, policyName)` -3. **Check permissions**: Evaluates if any policy allows `s3:ReplicateObject` -4. **Output**: Only buckets missing the required permission - -### Vault Metadata Key Schema - -The script queries the `vaultdb` database using these key patterns: - -| Purpose | Key Pattern | Example | -|---------|-------------|---------| -| Role by ARN | `roleArn:{arn}` | `roleArn:arn:aws:iam::123:role/MyRole` | -| Role data | `linkAccount:{id}:roleId:{roleId}` | `linkAccount:123:roleId:AROAXXX` | -| Policies | `linkAccount:{id}:roleId:{roleId}:policy:{path}` | `...policy:/my-policy` | -| Policy content | `accountId:{id}:policyName:{name}` | `accountId:123:policyName:my-policy` | - -### Example Run - -``` -=== Check Replication Role Permissions === -Input: /tmp/buckets.json -Output: /tmp/missing.json -Repd: 10.160.112.172:4300 - -Processing 6 buckets... - -[1/6] bucket-new-1 -> OK -[2/6] bucket-new-2 -> OK -[3/6] bucket-new-3 -> OK -[4/6] bucket-old-1 -> MISSING: s3:ReplicateObject -[5/6] bucket-old-2 -> MISSING: s3:ReplicateObject -[6/6] bucket-old-3 -> MISSING: s3:ReplicateObject - -=== Summary === -Total checked: 6 -Missing permission: 3 -Output saved to: /tmp/missing.json -``` - -### Troubleshooting - -**"Role not found in vault"** - -- The role ARN in the bucket's replication configuration doesn't exist in vault -- The role may have been deleted after replication was configured - -**"No policies attached to role"** - -- The role exists but has no managed policies attached -- Attach a policy with `s3:ReplicateObject` permission to the role - -**"Missing s3:ReplicateObject"** - -- The role has policies but none grant `s3:ReplicateObject` on the source bucket -- Review the policy documents in the output to see what permissions are granted -- Ensure the policy has: - - Action: `s3:ReplicateObject` (or `s3:*` or `s3:Replicate*`) - - Resource: matching the source bucket ARN (e.g., `arn:aws:s3:::bucket-name/*`) - -**Connection timeout or refused** - -- Ensure you're connecting to the correct repd leader IP **and port** -- On 3-server rings, the leader port may not be 4300 (e.g. 4301, 4302) -- Find the leader: `curl -s http://localhost:5300/_/raft/leader` — use both `ip` and `port` from the response -- The script must run inside a container that can reach repd on the leader port - -**Script timeout** - -- For many buckets, run directly on the S3 connector node via interactive SSH - ---- - -## fix-missing-replication-permissions.js - -Reads the output of `check-replication-permissions.js` and creates IAM policies -with `s3:ReplicateObject` for roles that are missing it. - -The script applies **minimal changes**: one policy per bucket, with an explicit -Statement ID (`AllowReplicateObjectAuditFix`) so the policies are easily -identifiable later. Using one policy per bucket makes re-runs truly idempotent: -if the policy already exists, its document is guaranteed to be identical. - -### Prerequisites - -- Output from `check-replication-permissions.js` (missing.json) -- Vault admin credentials (`admin1.json` with `accessKey` and `secretKeyValue`). - Found on the supervisor at: - ``` - /srv/scality/s3/s3-offline/federation/env//vault/admin-clientprofile/admin1.json - ``` -- The script runs inside the vault container (`scality-vault`), which has `vaultclient` and `aws-sdk` pre-installed - -### Usage - -```bash -node fix-missing-replication-permissions.js [output-file] [options] -``` - -| Argument | Default | Description | -|----------|---------|-------------| -| `input-file` | (required) | Path to missing.json from check script | -| `vault-host` | (required) | Vault admin host (use `localhost` when running inside the vault container) | -| `admin-config` | (required) | Path to admin credentials JSON | -| `output-file` | replication-fix-results.json | Output file path | -| `--iam-port ` | 8600 | Vault admin and IAM API port | -| `--https` | (not set) | Use HTTPS to connect to Vault | -| `--dry-run` | (not set) | Show what would be done without making changes | - -### How It Works - -1. **Reads** the missing permissions file and enriches each entry with parsed role fields -2. **Maps** account IDs to names using `ownerDisplayName` from the input (no API call) -3. For each bucket entry (grouped by account for credential reuse): - - **Generates** a temporary access key via vault admin API (15-minute auto-expiry) - - **Creates** one IAM policy per bucket with `s3:ReplicateObject` - - **Attaches** the policy to the role - - **Deletes** the temporary access key (falls back to auto-expiry on failure) -4. **Writes** results to the output file - -### Policy Created - -For each bucket, the script creates a policy named -`s3-replication-audit-fix-`: - -```json -{ - "Version": "2012-10-17", - "Statement": [{ - "Sid": "AllowReplicateObjectAuditFix", - "Effect": "Allow", - "Action": "s3:ReplicateObject", - "Resource": "arn:aws:s3:::bucket-old-1/*" - }] -} -``` - -### Output Format - -```json -{ - "metadata": { - "timestamp": "2026-02-23T20:35:00.000Z", - "durationMs": 65, - "inputFile": "missing.json", - "dryRun": false, - "counts": { - "totalBucketsProcessed": 3, - "totalBucketsFixed": 3, - "policiesCreated": 3, - "policiesAttached": 3, - "keysCreated": 1, - "keysDeleted": 1, - "errors": 0 - } - }, - "fixes": [ - { - "accountId": "267390090509", - "accountName": "testaccount", - "roleName": "crr-role-outdated", - "roleArn": "arn:aws:iam::267390090509:role/crr-role-outdated", - "policyName": "s3-replication-audit-fix-bucket-old-1", - "policyArn": "arn:aws:iam::267390090509:policy/s3-replication-audit-fix-bucket-old-1", - "bucket": "bucket-old-1", - "status": "success" - }, - { - "accountId": "267390090509", - "accountName": "testaccount", - "roleName": "crr-role-outdated", - "roleArn": "arn:aws:iam::267390090509:role/crr-role-outdated", - "policyName": "s3-replication-audit-fix-bucket-old-2", - "policyArn": "arn:aws:iam::267390090509:policy/s3-replication-audit-fix-bucket-old-2", - "bucket": "bucket-old-2", - "status": "success" - } - ], - "errors": [] -} -``` - -### Example Run - -``` -=== Fix Missing Replication Permissions === -Input: missing.json -Output: replication-fix-results.json -Vault/IAM: 13.50.166.21:8600 - -Processing 3 bucket(s) - -[1/3] Bucket "bucket-old-1" — role "crr-role-outdated" — account "testaccount" - Created policy "s3-replication-audit-fix-bucket-old-1" - Attached policy to role "crr-role-outdated" -[2/3] Bucket "bucket-old-2" — role "crr-role-outdated" — account "testaccount" - Created policy "s3-replication-audit-fix-bucket-old-2" - Attached policy to role "crr-role-outdated" -[3/3] Bucket "bucket-old-3" — role "crr-role-outdated" — account "testaccount" - Created policy "s3-replication-audit-fix-bucket-old-3" - Attached policy to role "crr-role-outdated" -Deleted temp key for account "testaccount" (267390090509) - -=== Summary === -Buckets processed: 3 -Buckets fixed: 3 -Policies created: 3 -Policies attached: 3 -Keys created: 1 -Keys deleted: 1 -Errors: 0 -Duration: 0.7s -Output saved to: replication-fix-results.json - -Done. -``` - -### Idempotency - -The script is safe to run multiple times: - -- Each bucket has its own policy, so if it already exists the document is - guaranteed to be identical — `EntityAlreadyExists` is a true no-op -- Attaching an already-attached policy is a no-op in IAM -- Temporary access keys auto-expire after 15 minutes even if deletion fails - -### Troubleshooting - -**"No ownerDisplayName found for account"** - -- The input file is missing `ownerDisplayName`. Re-run `check-replication-permissions.js` - to generate a fresh output that includes this field. - -**"Failed to generate temp key"** - -- Verify admin credentials in the config file -- Ensure vault admin API is reachable on the specified host and port - -**IAM operation errors** - -- Check that the IAM port is correct (default 8600, may differ per deployment) -- Verify the role still exists in vault - -**"Failed to delete temp key"** - -- Non-critical: the key auto-expires after 15 minutes -- The error is logged but does not prevent other operations diff --git a/replicationAudit/check-replication-permissions.js b/replicationAudit/check-replication-permissions.js deleted file mode 100644 index 16407051..00000000 --- a/replicationAudit/check-replication-permissions.js +++ /dev/null @@ -1,495 +0,0 @@ -#!/usr/bin/env node -/* eslint-disable no-console */ -/** - * check-replication-permissions.js - * - * Checks if replication roles have s3:ReplicateObject permission - * by querying Vault metadata directly via repd protocol. - * - * Usage: node check-replication-permissions.js [input-file] [leader-ip[:port]] [output-file] - * - * How it connects to vault metadata: - * - * Vault metadata has no HTTP frontend (no bucketd). This script connects - * directly to repd (the raft-based metadata store) using a simple - * protocol: 4-byte length prefix + JSON payload. The default repd port - * is 4300 but can be overridden via the leader-ip argument (e.g. - * 10.0.0.1:4301). - */ - -const net = require('net'); -const fs = require('fs'); - -// =========================================================================== -// Configuration -// =========================================================================== - -/** Parse a leader address string into { ip, port } */ -function parseLeaderAddress(address) { - if (!address) { - return { ip: '127.0.0.1', port: 4300 }; - } - const [ip, portStr] = address.split(':'); - return { ip, port: portStr ? parseInt(portStr, 10) : 4300 }; -} - -const parsedLeader = parseLeaderAddress(process.argv[3]); - -const CONFIG = { - inputFile: process.argv[2] || '/root/buckets-with-replication.json', - leaderIp: parsedLeader.ip, - outputFile: process.argv[4] || '/root/missing-replication-permissions.json', - repdPort: parsedLeader.port, - dbName: 'vaultdb', - includePolicies: process.argv.includes('--include-policies'), - requestTimeoutMs: 10000, -}; - -// =========================================================================== -// Logging -// =========================================================================== -function log(message) { - console.error(message); -} - -function logProgress(current, total, bucket, status) { - process.stderr.write(`[${current}/${total}] ${bucket} -> ${status}\n`); -} - -// =========================================================================== -// Protocol constants and encoding -// [FROM MetaData/lib/protocol.json and MetaData/lib/server/ProtoBuilder.js] -// -// Messages are framed as: [4-byte length][JSON payload] -// =========================================================================== -const PROTOCOL = { - FROM_REPD: 1, - TYPE_REQUEST: 1, - METHOD_GET: 2, - METHOD_LIST: 4, - HEADER_SIZE: 4, // 32-bit big-endian integer for message length -}; - -function encodeMessage(payload) { - const json = JSON.stringify(payload); - const jsonLength = Buffer.byteLength(json); - const buffer = Buffer.allocUnsafe(PROTOCOL.HEADER_SIZE + jsonLength); - buffer.writeInt32BE(jsonLength); - buffer.write(json, PROTOCOL.HEADER_SIZE); - return buffer; -} - -function tryReadMessage(buffer) { - if (buffer.length < PROTOCOL.HEADER_SIZE) { - return null; - } - - const jsonLength = buffer.readUInt32BE(0); - const totalLength = PROTOCOL.HEADER_SIZE + jsonLength; - - if (buffer.length < totalLength) { - return null; - } - - return { - data: JSON.parse(buffer.slice(PROTOCOL.HEADER_SIZE, totalLength).toString()), - remaining: buffer.slice(totalLength), - }; -} - -// =========================================================================== -// Vault database key generation -// [FROM vault/lib/Indexer.js] -// =========================================================================== -const VaultKeys = { - /** Get key for looking up role by ARN */ - roleByArn(roleArn) { - return `roleArn:${roleArn}`; - }, - - /** Get key prefix for policies attached to a role */ - policiesByRole(accountId, roleId) { - return `linkAccount:${accountId}:roleId:${roleId}:policy:`; - }, - - /** Get key for looking up policy by name */ - policyByName(accountId, policyName) { - return `accountId:${accountId}:policyName:${policyName}`; - }, - - /** Get range limits for prefix-based listing */ - getRangeLimits(prefix) { - const end = prefix.slice(0, -1) + String.fromCharCode(prefix.charCodeAt(prefix.length - 1) + 1); - return [prefix, end]; - }, - - /** Extract policy path and name from a policiesByRole key */ - extractPolicyFromKey(key) { - const policyPart = key.split(':policy:')[1] || ''; - const lastSlash = policyPart.lastIndexOf('/'); - - if (lastSlash === -1) { - return { path: '/', name: policyPart }; - } - - return { - path: policyPart.substring(0, lastSlash + 1), - name: policyPart.substring(lastSlash + 1), - }; - }, -}; - -// =========================================================================== -// Repd Client -// =========================================================================== -class RepdClient { - constructor(host, port, dbName) { - this.host = host; - this.port = port; - this.dbName = dbName; - this.client = null; - this.requestId = 0; - this.receiveBuffer = Buffer.alloc(0); - this.pendingCallback = null; - } - - connect() { - return new Promise((resolve, reject) => { - this.client = net.connect(this.port, this.host); - this.client.on('connect', resolve); - this.client.on('error', reject); - this.client.on('data', chunk => this.handleData(chunk)); - }); - } - - handleData(chunk) { - this.receiveBuffer = Buffer.concat([this.receiveBuffer, chunk]); - - const message = tryReadMessage(this.receiveBuffer); - if (message && this.pendingCallback) { - this.receiveBuffer = message.remaining; - const callback = this.pendingCallback; - this.pendingCallback = null; - callback(null, message.data); - } - } - - sendRequest(method, params) { - return new Promise((resolve, reject) => { - this.pendingCallback = (err, response) => { - if (err) { - reject(err); - } else { - resolve(response); - } - }; - - const request = { - from: PROTOCOL.FROM_REPD, - type: PROTOCOL.TYPE_REQUEST, - logUids: `check-${Date.now()}`, - repd: { - method, - id: ++this.requestId, - db: this.dbName, - ...params, - }, - }; - - this.client.write(encodeMessage(request)); - - setTimeout(() => { - if (this.pendingCallback) { - this.pendingCallback = null; - reject(new Error('Request timeout')); - } - }, CONFIG.requestTimeoutMs); - }); - } - - async get(key) { - const response = await this.sendRequest(PROTOCOL.METHOD_GET, { key }); - return response.repd?.data; - } - - async list(keyStart, keyEnd) { - const response = await this.sendRequest(PROTOCOL.METHOD_LIST, { - parameters: { - gte: keyStart, - lte: keyEnd, - keys: true, - values: true, - maxKeys: 1000, - }, - }); - return response.repd?.data || []; - } - - close() { - if (this.client) { - this.client.end(); - } - } -} - -// =========================================================================== -// Permission checking helpers -// =========================================================================== - -/** Extract account ID from a role ARN */ -function getAccountIdFromArn(arn) { - return arn.split(':')[4]; -} - -/** Check if a policy action matches s3:ReplicateObject */ -function isReplicateAction(action) { - return action === '*' - || action === 's3:*' - || action === 's3:Replicate*' - || action === 's3:ReplicateObject'; -} - -/** Check if a policy resource matches the bucket */ -function isMatchingResource(resource, bucketArn) { - return resource === '*' - || resource === 'arn:aws:s3:::*' - || resource === 'arn:aws:s3:::*/*' - || resource === bucketArn - || resource === `${bucketArn}/*`; -} - -/** Check if a policy document grants s3:ReplicateObject for a bucket */ -function policyAllowsReplication(policyDoc, bucketName) { - const bucketArn = `arn:aws:s3:::${bucketName}`; - const statements = [].concat(policyDoc.Statement || []); - - for (const statement of statements) { - if (statement.Effect !== 'Allow') { - continue; - } - - const actions = [].concat(statement.Action || []); - const hasReplicateAction = actions.some(isReplicateAction); - if (!hasReplicateAction) { - continue; - } - - const resources = [].concat(statement.Resource || []); - const hasMatchingResource = resources.some(r => isMatchingResource(r, bucketArn)); - if (hasMatchingResource) { - return true; - } - } - - return false; -} - -/** Extract the current policy document from stored policy data */ -function extractPolicyDocument(policyData) { - const policy = JSON.parse(policyData); - const defaultVersion = policy.defaultVersion || 1; - const version = (policy.versions || []).find(v => v.id === defaultVersion); - return version?.doc || {}; -} - -// =========================================================================== -// Core logic -// =========================================================================== - -/** - * Check if a bucket's replication role has s3:ReplicateObject permission - */ -async function checkBucketPermissions(repdClient, bucket, sourceRole) { - const accountId = getAccountIdFromArn(sourceRole); - const result = { - bucket, - sourceRole, - policies: [], - }; - - // Get role ID from ARN - const roleKey = VaultKeys.roleByArn(sourceRole); - const roleId = await repdClient.get(roleKey); - - if (!roleId) { - return { - hasPermission: false, - result: { ...result, error: 'Role not found in vault' }, - }; - } - - // List policies attached to the role - const policyKeyPrefix = VaultKeys.policiesByRole(accountId, roleId); - const [keyStart, keyEnd] = VaultKeys.getRangeLimits(policyKeyPrefix); - const policyLinks = await repdClient.list(keyStart, keyEnd); - - if (policyLinks.length === 0) { - return { - hasPermission: false, - result: { ...result, error: 'No policies attached to role' }, - }; - } - - // Check each attached policy - let hasPermission = false; - - for (const link of policyLinks) { - const { name: policyName, path: policyPath } = VaultKeys.extractPolicyFromKey(link.key); - const policyKey = VaultKeys.policyByName(accountId, policyName); - const policyData = await repdClient.get(policyKey); - - if (!policyData) { - continue; - } - - try { - const policyDoc = extractPolicyDocument(policyData); - const allowsReplication = policyAllowsReplication(policyDoc, bucket); - - const policyInfo = { - name: policyName, - path: policyPath, - allowsReplicateObject: allowsReplication, - }; - if (CONFIG.includePolicies) { - policyInfo.document = policyDoc; - } - result.policies.push(policyInfo); - - if (allowsReplication) { - hasPermission = true; - } - } catch (e) { - result.policies.push({ name: policyName, error: 'Failed to parse policy' }); - } - } - - return { hasPermission, result }; -} - -/** Build the output object with metadata and results */ -function buildOutput(buckets, results, stats, rolesChecked, startTime) { - const durationMs = Date.now() - startTime; - - return { - metadata: { - timestamp: new Date().toISOString(), - durationMs, - durationHuman: `${(durationMs / 1000).toFixed(1)}s`, - repdLeader: `${CONFIG.leaderIp}:${CONFIG.repdPort}`, - inputFile: CONFIG.inputFile, - counts: { - totalBuckets: buckets.length, - bucketsOk: stats.ok, - bucketsMissingPermission: stats.missing, - bucketsSkipped: stats.skipped, - bucketsWithErrors: stats.errors, - uniqueRolesChecked: rolesChecked.size, - }, - }, - results, - }; -} - -/** Print summary to stderr */ -function printSummary(bucketCount, stats, rolesChecked, durationHuman) { - log('\n=== Summary ==='); - log(`Total checked: ${bucketCount}`); - log(` OK: ${stats.ok}`); - log(` Missing permission: ${stats.missing}`); - log(` Skipped (no role): ${stats.skipped}`); - log(` Errors: ${stats.errors}`); - log(`Unique roles checked: ${rolesChecked.size}`); - log(`Duration: ${durationHuman}`); -} - -// =========================================================================== -// Main -// =========================================================================== -async function main() { - const startTime = Date.now(); - - log('=== Check Replication Role Permissions ==='); - log(`Input: ${CONFIG.inputFile}`); - log(`Output: ${CONFIG.outputFile}`); - log(`Repd: ${CONFIG.leaderIp}:${CONFIG.repdPort}`); - log(''); - - // Read input file - const inputData = JSON.parse(fs.readFileSync(CONFIG.inputFile, 'utf8')); - const buckets = inputData.results || inputData; // Support both old and new format - log(`Processing ${buckets.length} buckets...\n`); - - // Connect to repd - const repdClient = new RepdClient(CONFIG.leaderIp, CONFIG.repdPort, CONFIG.dbName); - await repdClient.connect(); - - const stats = { - ok: 0, - missing: 0, - skipped: 0, - errors: 0, - }; - const rolesChecked = new Set(); - const results = []; - - // Process each bucket - for (let i = 0; i < buckets.length; i++) { - const { bucket, sourceRole, ownerDisplayName } = buckets[i]; - - if (!sourceRole) { - logProgress(i + 1, buckets.length, bucket, 'SKIP (no role)'); - stats.skipped++; - continue; - } - - rolesChecked.add(sourceRole); - - try { - const { hasPermission, result } = await checkBucketPermissions(repdClient, bucket, sourceRole); - - if (hasPermission) { - logProgress(i + 1, buckets.length, bucket, 'OK'); - stats.ok++; - } else { - const reason = result.error || 's3:ReplicateObject'; - logProgress(i + 1, buckets.length, bucket, `MISSING: ${reason}`); - results.push({ ...result, ownerDisplayName }); - stats.missing++; - } - } catch (e) { - logProgress(i + 1, buckets.length, bucket, `ERROR: ${e.message}`); - results.push({ bucket, sourceRole, ownerDisplayName, error: e.message, policies: [] }); - stats.errors++; - } - } - - repdClient.close(); - - // Build and save output - const output = buildOutput(buckets, results, stats, rolesChecked, startTime); - fs.writeFileSync(CONFIG.outputFile, JSON.stringify(output, null, 2)); - - // Print summary - printSummary(buckets.length, stats, rolesChecked, output.metadata.durationHuman); - - if (results.length > 0) { - log(`Output saved to: ${CONFIG.outputFile}`); - } - - console.log(JSON.stringify(output, null, 2)); -} - -// Run main only when executed directly (not when required as a module) -if (require.main === module) { - main().catch(e => { - console.error('Fatal error:', e.message); - process.exit(1); - }); -} - -// Export for testing -module.exports = { - parseLeaderAddress, - policyAllowsReplication, -}; diff --git a/replicationAudit/fix-missing-replication-permissions.js b/replicationAudit/fix-missing-replication-permissions.js deleted file mode 100644 index 36d3a60e..00000000 --- a/replicationAudit/fix-missing-replication-permissions.js +++ /dev/null @@ -1,371 +0,0 @@ -#!/usr/bin/env node -/* eslint-disable no-console */ -/** - * fix-missing-replication-permissions.js - * - * Reads the output of check-replication-permissions.js and creates IAM policies - * with s3:ReplicateObject for roles that are missing it, then attaches them. - * - * TBD: This script does not re-check whether the permission is still missing - * before applying the fix. It only checks that a policy named - * s3-replication-audit-fix- exists (EntityAlreadyExists) to make - * the script idempotent — re-running it won't create extra policies. But: - * - If someone manually added s3:ReplicateObject between check and fix, - * a redundant (but harmless) policy is created. - * - If the fix policy is later modified externally, re-running won't - * detect or correct it (EntityAlreadyExists skips the policy). - * We keep it simple today: the intended workflow is check → fix → re-check. - * Re-run check-replication-permissions.js after fixing to verify the result. - * - * Usage: node fix-missing-replication-permissions.js [output-file] [--iam-port ] [--https] [--dry-run] - * - * Requires: vaultclient, aws-sdk (both available in vault container) - * - * Note: This script uses aws-sdk v2 (not @aws-sdk/client-iam v3) because it - * is meant to be copied into the vault container of older S3C versions - * (before S3C 9.5.2 / Vault 7.84.0) where aws-sdk v2 is available but - * @aws-sdk/client-iam v3 is not. - */ - -const fs = require('fs'); -const http = require('http'); -const https = require('https'); -const { Client: VaultClient } = require('vaultclient'); -const AWS = require('aws-sdk'); - -// =========================================================================== -// Constants -// =========================================================================== -const POLICY_PREFIX = 's3-replication-audit-fix'; -const STATEMENT_ID = 'AllowReplicateObjectAuditFix'; -const KEY_DURATION_SECONDS = '900'; // 15-minute auto-expiry safety net - -// =========================================================================== -// Logging (stderr for progress, stdout reserved for JSON result) -// =========================================================================== -function log(message) { - console.error(message); -} - -// =========================================================================== -// Argument parsing (manual process.argv for Node 16+ compatibility) -// =========================================================================== -function getConfig() { - const args = process.argv.slice(2); - - const positionals = []; - let iamPort = 8600; - let useHttps = false; - let dryRun = false; - - for (let i = 0; i < args.length; i++) { - if (args[i] === '--iam-port') { - if (i + 1 >= args.length) { - throw new Error('Missing value for --iam-port'); - } - iamPort = parseInt(args[++i], 10); - } else if (args[i] === '--https') { - useHttps = true; - } else if (args[i] === '--dry-run') { - dryRun = true; - } else { - positionals.push(args[i]); - } - } - - if (positionals.length < 3) { - log('Usage: node fix-missing-replication-permissions.js' - + ' ' - + ' [output-file] [--iam-port ] [--https] [--dry-run]'); - process.exit(1); - } - - const [inputFile, vaultHost, adminConfig, outputFile] = positionals; - return { - inputFile, - vaultHost, - iamPort, - adminConfig, - useHttps, - outputFile: outputFile || 'replication-fix-results.json', - dryRun, - }; -} - -// =========================================================================== -// Helpers -// =========================================================================== - -/** Parse role ARN to extract account ID and role name */ -function parseRoleArn(arn) { - const match = arn.match(/^arn:aws:iam::(\d+):role\/(.+)$/); - if (!match) { - throw new Error(`Invalid role ARN: ${arn}`); - } - return { accountId: match[1], roleName: match[2] }; -} - -/** Build the IAM policy document for a single bucket */ -function buildPolicyDocument(bucket) { - return { - Version: '2012-10-17', - Statement: [{ - Sid: STATEMENT_ID, - Effect: 'Allow', - Action: 's3:ReplicateObject', - Resource: `arn:aws:s3:::${bucket}/*`, - }], - }; -} - -function generateAccountAccessKeyAsync(client, accountName, options) { - return new Promise((resolve, reject) => { - client.generateAccountAccessKey(accountName, (err, res) => { - if (err) { - return reject(err); - } - return resolve(res); - }, options); - }); -} - -/** Create an IAM client for a given account */ -function createIAMClient(config, accessKeyId, secretKey) { - const protocol = config.useHttps ? 'https' : 'http'; - return new AWS.IAM({ - endpoint: `${protocol}://${config.vaultHost}:${config.iamPort}`, - region: 'us-east-1', - accessKeyId, - secretAccessKey: secretKey, - sslEnabled: config.useHttps, - httpOptions: { - agent: config.useHttps - ? new https.Agent({ keepAlive: true, rejectUnauthorized: false }) - : new http.Agent({ keepAlive: true }), - }, - }); -} - - -// =========================================================================== -// Main -// =========================================================================== -async function main() { - const startTime = Date.now(); - const config = getConfig(); - - log('=== Fix Missing Replication Permissions ==='); - log(`Input: ${config.inputFile}`); - log(`Output: ${config.outputFile}`); - log(`Vault/IAM: ${config.vaultHost}:${config.iamPort}`); - if (config.dryRun) { - log('Mode: DRY-RUN (no changes will be made)'); - } - log(''); - - // Read input - const input = JSON.parse(fs.readFileSync(config.inputFile, 'utf8')); - const entries = input.results || []; - if (entries.length === 0) { - log('No buckets with missing permissions. Nothing to fix.'); - process.exit(0); - } - - // Validate input format: ownerDisplayName is required (added in 1.17.5) - const missingOwner = entries.filter(e => !e.ownerDisplayName); - if (missingOwner.length > 0) { - log('ERROR: Input file is missing "ownerDisplayName" field in result entries.'); - log('This field was added in s3utils 1.17.5. If your input was generated'); - log('with version 1.17.4 or earlier, re-run check-replication-permissions.js'); - log('to produce an updated output.'); - process.exit(1); - } - - // Sort by sourceRole so entries in the same account are processed - // consecutively, maximising credential cache hits. - entries.sort((a, b) => (a.sourceRole < b.sourceRole ? -1 : 1)); - - log(`Processing ${entries.length} bucket(s)`); - log(''); - - // Read admin credentials - const adminCreds = JSON.parse(fs.readFileSync(config.adminConfig, 'utf8')); - - // Create vault admin client - const vaultAdmin = new VaultClient( - config.vaultHost, - config.iamPort, - config.useHttps, // useHttps - undefined, // key - undefined, // cert - undefined, // ca - config.useHttps, // ignoreCa (skip cert verification when using HTTPS) - adminCreds.accessKey, - adminCreds.secretKeyValue, - ); - - // Results tracking - const outcome = { - metadata: { - timestamp: new Date().toISOString(), - durationMs: 0, - inputFile: config.inputFile, - dryRun: config.dryRun, - counts: { - totalBucketsProcessed: entries.length, - totalBucketsFixed: 0, - policiesCreated: 0, - policiesAttached: 0, - keysCreated: 0, - keysDeleted: 0, - errors: 0, - }, - }, - fixes: [], - errors: [], - }; - - // Cache IAM client per account to reuse connections across buckets - // and for cleanup (key deletion). - // Map - const accountCache = new Map(); - - for (let i = 0; i < entries.length; i++) { - const entry = entries[i]; - const { accountId, roleName } = parseRoleArn(entry.sourceRole); - const { bucket, ownerDisplayName: accountName } = entry; - const policyName = `${POLICY_PREFIX}-${bucket}`; - const policyDocument = buildPolicyDocument(bucket); - - log(`[${i + 1}/${entries.length}] Bucket "${bucket}" — role "${roleName}" — account "${accountName}"`); - - const fix = { - accountId, - accountName, - roleName, - roleArn: entry.sourceRole, - policyName, - bucket, - status: 'pending', - }; - - if (config.dryRun) { - fix.status = 'dry-run'; - log(` [DRY-RUN] Would create policy "${policyName}"`); - log(` [DRY-RUN] Would attach to role "${roleName}"`); - outcome.fixes.push(fix); - continue; - } - - try { - // Get or create temporary credentials and IAM client for this account - if (!accountCache.has(accountId)) { - const keyResult = await generateAccountAccessKeyAsync( - vaultAdmin, accountName, - { durationSeconds: KEY_DURATION_SECONDS }, - ); - accountCache.set(accountId, { - accountName, - accessKeyId: keyResult.id, - iamClient: createIAMClient(config, keyResult.id, keyResult.value), - }); - outcome.metadata.counts.keysCreated++; - } - - const { iamClient } = accountCache.get(accountId); - - // Idempotent/safe to re-run: each bucket has its own policy, - // so EntityAlreadyExists means the exact same policy document - // already exists — a true no-op. AttachRolePolicy is also - // a no-op if the policy is already attached to the role. - let policyArn; - try { - const resp = await iamClient.createPolicy({ - PolicyName: policyName, - PolicyDocument: JSON.stringify(policyDocument), - }).promise(); - policyArn = resp.Policy.Arn; - outcome.metadata.counts.policiesCreated++; - log(` Created policy "${policyName}"`); - } catch (err) { - if (err.code === 'EntityAlreadyExists') { - policyArn = `arn:aws:iam::${accountId}:policy/${policyName}`; - log(` Policy "${policyName}" already exists, skipping`); - } else { - throw err; - } - } - - fix.policyArn = policyArn; - - await iamClient.attachRolePolicy({ - RoleName: roleName, - PolicyArn: policyArn, - }).promise(); - outcome.metadata.counts.policiesAttached++; - log(` Attached policy to role "${roleName}"`); - - fix.status = 'success'; - outcome.metadata.counts.totalBucketsFixed++; - } catch (err) { - fix.status = 'error'; - fix.error = err.message; - outcome.metadata.counts.errors++; - outcome.errors.push({ - accountId, - accountName, - roleName, - bucket, - policyName, - message: err.message, - }); - log(` ERROR: ${err.message}`); - } - - outcome.fixes.push(fix); - } - - // Cleanup: delete all temporary keys via IAM DeleteAccessKey - for (const [accountId, { accountName, accessKeyId, iamClient }] of accountCache) { - try { - await iamClient.deleteAccessKey({ - AccessKeyId: accessKeyId, - }).promise(); - outcome.metadata.counts.keysDeleted++; - log(`Deleted temp key for account "${accountName}" (${accountId})`); - } catch (err) { - log(`WARNING: Failed to delete temp key for account "${accountName}" (auto-expires in ${KEY_DURATION_SECONDS}s): ${err.message}`); - } - } - - // Finalize timing - const durationMs = Date.now() - startTime; - outcome.metadata.durationMs = durationMs; - - // Write output file - fs.writeFileSync(config.outputFile, JSON.stringify(outcome, null, 2)); - - // Print summary - log('\n=== Summary ==='); - log(`Buckets processed: ${outcome.metadata.counts.totalBucketsProcessed}`); - log(`Buckets fixed: ${outcome.metadata.counts.totalBucketsFixed}`); - log(`Policies created: ${outcome.metadata.counts.policiesCreated}`); - log(`Policies attached: ${outcome.metadata.counts.policiesAttached}`); - log(`Keys created: ${outcome.metadata.counts.keysCreated}`); - log(`Keys deleted: ${outcome.metadata.counts.keysDeleted}`); - log(`Errors: ${outcome.metadata.counts.errors}`); - log(`Duration: ${(durationMs / 1000).toFixed(1)}s`); - log(`Output saved to: ${config.outputFile}`); - log(''); - log('Done.'); - - // JSON result to stdout - console.log(JSON.stringify(outcome, null, 2)); - - process.exit(0); -} - -main().catch(e => { - console.error('Fatal error:', e.message); - process.exit(1); -}); diff --git a/replicationAudit/list-buckets-with-replication.sh b/replicationAudit/list-buckets-with-replication.sh deleted file mode 100755 index f4fcd6be..00000000 --- a/replicationAudit/list-buckets-with-replication.sh +++ /dev/null @@ -1,325 +0,0 @@ -#!/bin/bash -# -# list-buckets-with-replication.sh -# -# Lists all buckets with replication enabled by querying the S3 metadata API. -# Output is a JSON file with metadata and results. -# -# Usage: ./list-buckets-with-replication.sh -# -# Environment variables: -# BUCKETD_HOST - Bucketd hostname (default: localhost) -# BUCKETD_PORT - Bucketd port (default: 9000) -# BATCH_SIZE - Number of parallel requests (default: 10) -# OUTPUT_FILE - Output file path (default: buckets-with-replication.json) -# - -set -e - -# =========================================================================== -# Configuration -# =========================================================================== -BUCKETD_HOST="${BUCKETD_HOST:-localhost}" -BUCKETD_PORT="${BUCKETD_PORT:-9000}" -BUCKETD_URL="http://${BUCKETD_HOST}:${BUCKETD_PORT}" -BATCH_SIZE="${BATCH_SIZE:-10}" # low to not overload bucketd -OUTPUT_FILE="${OUTPUT_FILE:-buckets-with-replication.json}" - -# Runtime variables -TMP_DIR=$(mktemp -d) -START_TIME=$(date +%s) -TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ") -FETCH_ERRORS=0 - -# Cleanup temporary directory on exit -trap "rm -rf $TMP_DIR" EXIT - -# =========================================================================== -# Helper functions -# =========================================================================== - -log() { - echo "$@" -} - -log_error() { - echo "Error: $@" >&2 -} - -check_dependencies() { - local missing=0 - for cmd in curl jq; do - if ! command -v "$cmd" &> /dev/null; then - log_error "$cmd is required but not installed" - missing=1 - fi - done - return $missing -} - -check_bucketd_connection() { - log "Checking bucketd connectivity..." - if ! curl -s --connect-timeout 5 "$BUCKETD_URL/_/healthcheck" > /dev/null 2>&1; then - log_error "Cannot connect to bucketd at $BUCKETD_URL" - return 1 - fi - log "Connected to bucketd" -} - -# Fetch all bucket names from the users..bucket database -# Handles pagination for large deployments -# Exits script on failure -fetch_bucket_list() { - local marker="" - local is_truncated="true" - - while [ "$is_truncated" = "true" ]; do - local url="$BUCKETD_URL/default/bucket/users..bucket" - [ -n "$marker" ] && url="${url}?marker=${marker}" - - local response - response=$(curl -sf "$url") || { - log_error "Failed to fetch bucket list from users..bucket" - exit 1 - } - - # Extract bucket names from response - # Keys are formatted as "{canonicalId}..|..{bucketName}" - echo "$response" | jq -r '.Contents[].key // empty' | sed 's/.*\.\.|\.\.//' - - # Check if there are more pages - is_truncated=$(echo "$response" | jq -r '.IsTruncated') - if [ "$is_truncated" = "true" ]; then - marker=$(echo "$response" | jq -r '.Contents[-1].key | @uri') - fi - done -} - -# Fetch bucket attributes for a batch of buckets -fetch_bucket_attributes_batch() { - local buckets=("$@") - local curl_args=() - - for bucket in "${buckets[@]}"; do - curl_args+=("-o" "$TMP_DIR/attr_${bucket}.json" "$BUCKETD_URL/default/attributes/$bucket") - done - - # Try parallel fetch first, fall back to sequential if not supported - curl -s --parallel --parallel-max "$BATCH_SIZE" "${curl_args[@]}" 2>/dev/null \ - || curl -s "${curl_args[@]}" 2>/dev/null \ - || true -} - -# Check if a bucket has replication enabled -# Returns 0 if replication is enabled, 1 otherwise -has_replication_enabled() { - local attr_file="$1" - - # Check if file exists and is not empty - if [ ! -f "$attr_file" ] || [ ! -s "$attr_file" ]; then - return 1 - fi - - # Check if replicationConfiguration exists - local repl_config - repl_config=$(jq -r '.replicationConfiguration // empty' "$attr_file" 2>/dev/null) - if [ -z "$repl_config" ] || [ "$repl_config" = "null" ]; then - return 1 - fi - - # Check if any rule is enabled - # Handle different API formats: enabled:true, status:"Enabled", Status:"Enabled" - local enabled_count - enabled_count=$(jq -r ' - .replicationConfiguration.rules // .replicationConfiguration.Rules // [] - | [.[] | select(.enabled == true or .status == "Enabled" or .Status == "Enabled")] - | length - ' "$attr_file" 2>/dev/null) - - if [ "$enabled_count" -gt 0 ]; then - return 0 - fi - - return 1 -} - -# Extract replication info from bucket attributes -extract_replication_info() { - local attr_file="$1" - local bucket="$2" - - local owner - local owner_display_name - local full_role - local source_role - - owner=$(jq -r '.owner // "unknown"' "$attr_file") - owner_display_name=$(jq -r '.ownerDisplayName // "unknown"' "$attr_file") - - # Role format is "sourceRole,destRole" - extract source role (before comma) - full_role=$(jq -r '.replicationConfiguration.role // .replicationConfiguration.Role // ""' "$attr_file") - source_role=$(echo "$full_role" | cut -d',' -f1) - - # Build JSON result object - jq -n \ - --arg bucket "$bucket" \ - --arg owner "$owner" \ - --arg ownerDisplayName "$owner_display_name" \ - --arg sourceRole "$source_role" \ - '{ - bucket: $bucket, - owner: $owner, - ownerDisplayName: $ownerDisplayName, - sourceRole: $sourceRole - }' -} - - -# Build the final output JSON with metadata -build_output() { - local bucket_count="$1" - local repl_count="$2" - local duration="$3" - local fetch_errors="$4" - - jq -n \ - --arg timestamp "$TIMESTAMP" \ - --argjson durationSeconds "$duration" \ - --arg bucketdUrl "$BUCKETD_URL" \ - --argjson totalBucketsScanned "$bucket_count" \ - --argjson bucketsWithReplication "$repl_count" \ - --argjson bucketsWithoutReplication "$((bucket_count - repl_count - fetch_errors))" \ - --argjson fetchErrors "$fetch_errors" \ - --slurpfile results "$TMP_DIR/results.ndjson" \ - '{ - metadata: { - timestamp: $timestamp, - durationSeconds: $durationSeconds, - bucketdUrl: $bucketdUrl, - counts: { - totalBucketsScanned: $totalBucketsScanned, - bucketsWithReplication: $bucketsWithReplication, - bucketsWithoutReplication: $bucketsWithoutReplication, - fetchErrors: $fetchErrors - } - }, - results: $results - }' -} - -print_summary() { - local bucket_count="$1" - local repl_count="$2" - local duration="$3" - local fetch_errors="$4" - - log "" - log "=== Summary ===" - log "Total buckets scanned: $bucket_count" - log " With replication: $repl_count" - log " Without replication: $((bucket_count - repl_count - fetch_errors))" - log " Fetch errors: $fetch_errors" - log "Duration: ${duration}s" - log "Output saved to: $OUTPUT_FILE" - log "" - log "Done." -} - -# =========================================================================== -# Main -# =========================================================================== - -main() { - log "=== List Buckets with Replication Enabled ===" - log "Bucketd: $BUCKETD_URL" - log "Batch size: $BATCH_SIZE" - log "Output file: $OUTPUT_FILE" - log "" - - # Check prerequisites - check_dependencies || exit 1 - check_bucketd_connection || exit 1 - - # Fetch list of all buckets - log "" - log "Step 1: Fetching bucket list..." - - # Stream bucket list to file (memory-efficient for large bucket counts) - fetch_bucket_list > "$TMP_DIR/buckets.txt" - - local bucket_count - bucket_count=$(wc -l < "$TMP_DIR/buckets.txt" | tr -d ' ') - - log "Found $bucket_count buckets (excluding internal buckets)" - - if [ "$bucket_count" -eq 0 ]; then - log "No buckets found" - echo '{"metadata":{},"results":[]}' > "$OUTPUT_FILE" - exit 0 - fi - - # Process buckets in batches - log "" - log "Step 2: Fetching bucket attributes in batches of $BATCH_SIZE..." - - local processed=0 - local batch_num=0 - local batch_start=1 - - # Initialize empty results file (NDJSON format: one JSON object per line) - : > "$TMP_DIR/results.ndjson" - - while [ "$batch_start" -le "$bucket_count" ]; do - batch_num=$((batch_num + 1)) - - # Read current batch from file (memory-efficient) - local batch=() - while IFS= read -r bucket; do - batch+=("$bucket") - done < <(sed -n "${batch_start},$((batch_start + BATCH_SIZE - 1))p" "$TMP_DIR/buckets.txt") - - local batch_count=${#batch[@]} - - # Fetch attributes for this batch - fetch_bucket_attributes_batch "${batch[@]}" - - # Process each bucket in the batch - for bucket in "${batch[@]}"; do - local attr_file="$TMP_DIR/attr_${bucket}.json" - - # Check if fetch failed (file missing or empty) - if [ ! -s "$attr_file" ]; then - FETCH_ERRORS=$((FETCH_ERRORS + 1)) - continue - fi - - if has_replication_enabled "$attr_file"; then - extract_replication_info "$attr_file" "$bucket" >> "$TMP_DIR/results.ndjson" - fi - - # Cleanup attribute file - rm -f "$attr_file" - done - - processed=$((processed + batch_count)) - batch_start=$((batch_start + BATCH_SIZE)) - log " Processed $processed/$bucket_count buckets (batch $batch_num)" - done - - # Calculate final stats - local repl_count - repl_count=$(jq -s 'length' "$TMP_DIR/results.ndjson" 2>/dev/null || echo 0) - - local end_time - end_time=$(date +%s) - - local duration=$((end_time - START_TIME)) - - # Build and save final output - build_output "$bucket_count" "$repl_count" "$duration" "$FETCH_ERRORS" > "$OUTPUT_FILE" - - # Print summary - print_summary "$bucket_count" "$repl_count" "$duration" "$FETCH_ERRORS" -} - -main "$@" diff --git a/tests/functional/replicationAudit/fixMissingReplicationPermissions.js b/tests/functional/replicationAudit/fixMissingReplicationPermissions.js deleted file mode 100644 index bc35cf13..00000000 --- a/tests/functional/replicationAudit/fixMissingReplicationPermissions.js +++ /dev/null @@ -1,662 +0,0 @@ -const { execFile } = require('child_process'); -const { promisify } = require('util'); -const fs = require('fs'); -const os = require('os'); -const path = require('path'); -const vaultclient = require('vaultclient'); -const { Logger } = require('werelogs'); -const { - CreateBucketCommand, - PutBucketVersioningCommand, - PutBucketReplicationCommand, -} = require('@aws-sdk/client-s3'); -const { - CreatePolicyCommand, - CreateRoleCommand, - AttachRolePolicyCommand, - ListAttachedRolePoliciesCommand, - ListAccessKeysCommand, - GetPolicyCommand, - GetPolicyVersionCommand, -} = require('@aws-sdk/client-iam'); - -const { - iamHost, - iamPort, - adminAccessKeyId, - adminSecretAccessKey, - createTestAccount, - deleteTestAccount, -} = require('../../utils/S3Setup'); - -const execFileAsync = promisify(execFile); - -const log = new Logger('fixMissingReplicationPermissions:test'); - -const SCRIPT_PATH = path.resolve(__dirname, '../../../replicationAudit/fix-missing-replication-permissions.js'); -const ROLE_NAME = 'crr-role-test'; -const POLICY_PREFIX = 's3-replication-audit-fix'; - -/** - * Set up CRR on the source account with a role that deliberately - * omits s3:ReplicateObject, so the fix script has something to fix. - */ -async function configureCrrWithMissingPermission(accountSource, accountDest) { - // Enable versioning on both buckets - await accountSource.s3Client.send(new PutBucketVersioningCommand({ - Bucket: accountSource.bucketName, - VersioningConfiguration: { Status: 'Enabled' }, - })); - await accountDest.s3Client.send(new PutBucketVersioningCommand({ - Bucket: accountDest.bucketName, - VersioningConfiguration: { Status: 'Enabled' }, - })); - - // Create a CRR policy that deliberately OMITS s3:ReplicateObject - const incompletePolicyDoc = { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: [ - 's3:GetObjectVersion', - 's3:GetObjectVersionAcl', - ], - Resource: [`arn:aws:s3:::${accountSource.bucketName}/*`], - }, - { - Effect: 'Allow', - Action: [ - 's3:ListBucket', - 's3:GetReplicationConfiguration', - ], - Resource: [`arn:aws:s3:::${accountSource.bucketName}`], - }, - ], - }; - - await accountSource.iamClient.send(new CreatePolicyCommand({ - PolicyName: 'crr-policy-incomplete', - PolicyDocument: JSON.stringify(incompletePolicyDoc), - })); - - // Create trust policy for backbeat - const trustDoc = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Principal: { Service: 'backbeat' }, - Action: 'sts:AssumeRole', - }], - }; - - await accountSource.iamClient.send(new CreateRoleCommand({ - RoleName: ROLE_NAME, - AssumeRolePolicyDocument: JSON.stringify(trustDoc), - })); - - await accountSource.iamClient.send(new AttachRolePolicyCommand({ - RoleName: ROLE_NAME, - PolicyArn: `arn:aws:iam::${accountSource.accountId}:policy/crr-policy-incomplete`, - })); - - // Also set up destination account role (needed for replication config) - const destPolicyDoc = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: ['s3:ReplicateObject', 's3:ReplicateDelete'], - Resource: `arn:aws:s3:::${accountDest.bucketName}/*`, - }], - }; - await accountDest.iamClient.send(new CreatePolicyCommand({ - PolicyName: 'crr-policy-dest', - PolicyDocument: JSON.stringify(destPolicyDoc), - })); - await accountDest.iamClient.send(new CreateRoleCommand({ - RoleName: ROLE_NAME, - AssumeRolePolicyDocument: JSON.stringify(trustDoc), - })); - await accountDest.iamClient.send(new AttachRolePolicyCommand({ - RoleName: ROLE_NAME, - PolicyArn: `arn:aws:iam::${accountDest.accountId}:policy/crr-policy-dest`, - })); - - // Configure bucket replication on source - await accountSource.s3Client.send(new PutBucketReplicationCommand({ - Bucket: accountSource.bucketName, - ReplicationConfiguration: { - Role: `arn:aws:iam::${accountSource.accountId}:role/${ROLE_NAME},` - + `arn:aws:iam::${accountDest.accountId}:role/${ROLE_NAME}`, - Rules: [{ - Prefix: '', - Status: 'Enabled', - Destination: { - Bucket: `arn:aws:s3:::${accountDest.bucketName}`, - }, - }], - }, - })); -} - -/** - * Build the missing.json input file matching check script output format. - */ -function buildInputFile(accountSource) { - return { - results: [{ - bucket: accountSource.bucketName, - ownerDisplayName: accountSource.accountName, - sourceRole: `arn:aws:iam::${accountSource.accountId}:role/${ROLE_NAME}`, - policies: [{ - name: 'crr-policy-incomplete', - path: '/', - allowsReplicateObject: false, - }], - }], - }; -} - -/** - * Run the fix script as a child process and return { stdout, stderr, exitCode }. - */ -async function runFixScript(args) { - try { - const { stdout, stderr } = await execFileAsync('node', [SCRIPT_PATH, ...args], { - timeout: 30000, - }); - return { stdout, stderr, exitCode: 0 }; - } catch (err) { - return { - stdout: err.stdout || '', - stderr: err.stderr || '', - exitCode: err.code || 1, - }; - } -} - -describe('fix-missing-replication-permissions', () => { - let vaultClient; - let accountSource; - let accountDest; - let tmpDir; - let adminConfigPath; - let inputFilePath; - let outputFilePath; - - beforeEach(async () => { - vaultClient = new vaultclient.Client( - iamHost, iamPort, - false, undefined, undefined, undefined, undefined, - adminAccessKeyId, adminSecretAccessKey, - ); - - log.info('Creating test accounts'); - accountSource = await createTestAccount(vaultClient); - accountDest = await createTestAccount(vaultClient); - log.info('Test accounts created', { - source: accountSource.accountName, - dest: accountDest.accountName, - }); - - await configureCrrWithMissingPermission(accountSource, accountDest); - - tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'fix-repl-test-')); - - adminConfigPath = path.join(tmpDir, 'admin-config.json'); - fs.writeFileSync(adminConfigPath, JSON.stringify({ - accessKey: adminAccessKeyId, - secretKeyValue: adminSecretAccessKey, - })); - - inputFilePath = path.join(tmpDir, 'missing.json'); - fs.writeFileSync(inputFilePath, JSON.stringify(buildInputFile(accountSource))); - - outputFilePath = path.join(tmpDir, 'output.json'); - }, 60000); - - afterEach(async () => { - await deleteTestAccount(vaultClient, accountSource); - await deleteTestAccount(vaultClient, accountDest); - fs.rmSync(tmpDir, { recursive: true, force: true }); - }, 60000); - - it('--dry-run does not modify IAM state', async () => { - const { stdout, exitCode } = await runFixScript([ - inputFilePath, iamHost, adminConfigPath, outputFilePath, - '--iam-port', String(iamPort), - '--dry-run', - ]); - - expect(exitCode).toBe(0); - - const result = JSON.parse(stdout); - expect(result.fixes[0].status).toBe('dry-run'); - - // Verify no policy was attached - const attached = await accountSource.iamClient.send( - new ListAttachedRolePoliciesCommand({ RoleName: ROLE_NAME }), - ); - const auditFixPolicy = (attached.AttachedPolicies || []) - .find(p => p.PolicyName === `${POLICY_PREFIX}-${accountSource.bucketName}`); - expect(auditFixPolicy).toBeUndefined(); - }, 30000); - - it('creates policy and attaches it to the role', async () => { - const { stdout, exitCode } = await runFixScript([ - inputFilePath, iamHost, adminConfigPath, outputFilePath, - '--iam-port', String(iamPort), - ]); - - expect(exitCode).toBe(0); - - const result = JSON.parse(stdout); - expect(result.fixes[0].status).toBe('success'); - expect(result.metadata.counts.policiesCreated).toBe(1); - expect(result.metadata.counts.policiesAttached).toBe(1); - - const bucketPolicyName = `${POLICY_PREFIX}-${accountSource.bucketName}`; - - // Verify policy is attached to role - const attached = await accountSource.iamClient.send( - new ListAttachedRolePoliciesCommand({ RoleName: ROLE_NAME }), - ); - const auditFixPolicy = (attached.AttachedPolicies || []) - .find(p => p.PolicyName === bucketPolicyName); - expect(auditFixPolicy).toBeDefined(); - - // Verify policy document contains s3:ReplicateObject for this bucket - const policyArn = `arn:aws:iam::${accountSource.accountId}:policy/${bucketPolicyName}`; - const policyResp = await accountSource.iamClient.send( - new GetPolicyCommand({ PolicyArn: policyArn }), - ); - const versionId = policyResp.Policy.DefaultVersionId; - - const versionResp = await accountSource.iamClient.send( - new GetPolicyVersionCommand({ PolicyArn: policyArn, VersionId: versionId }), - ); - const policyDoc = JSON.parse(decodeURIComponent(versionResp.PolicyVersion.Document)); - const actions = policyDoc.Statement.flatMap(s => [].concat(s.Action)); - expect(actions).toContain('s3:ReplicateObject'); - - const resources = policyDoc.Statement.flatMap(s => [].concat(s.Resource)); - expect(resources).toContain(`arn:aws:s3:::${accountSource.bucketName}/*`); - }, 30000); - - it('idempotent: re-run does not fail or duplicate', async () => { - // First run: creates the policy - const first = await runFixScript([ - inputFilePath, iamHost, adminConfigPath, outputFilePath, - '--iam-port', String(iamPort), - ]); - expect(first.exitCode).toBe(0); - - const firstResult = JSON.parse(first.stdout); - expect(firstResult.metadata.counts.policiesCreated).toBe(1); - - // Second run: policy already exists, should reuse it - const second = await runFixScript([ - inputFilePath, iamHost, adminConfigPath, outputFilePath, - '--iam-port', String(iamPort), - ]); - expect(second.exitCode).toBe(0); - - const secondResult = JSON.parse(second.stdout); - expect(secondResult.fixes[0].status).toBe('success'); - expect(secondResult.metadata.counts.policiesCreated).toBe(0); - - // Verify no extra policies were attached to the role - const attached = await accountSource.iamClient.send( - new ListAttachedRolePoliciesCommand({ RoleName: ROLE_NAME }), - ); - const auditFixPolicies = (attached.AttachedPolicies || []) - .filter(p => p.PolicyName.startsWith(POLICY_PREFIX)); - expect(auditFixPolicies).toHaveLength(1); - }, 30000); - - it('temp key cleanup: no leftover access keys', async () => { - // Snapshot keys before the script runs - const keysBefore = await accountSource.iamClient.send(new ListAccessKeysCommand({})); - const keyIdsBefore = (keysBefore.AccessKeyMetadata || []).map(k => k.AccessKeyId); - - const { stdout, exitCode } = await runFixScript([ - inputFilePath, iamHost, adminConfigPath, outputFilePath, - '--iam-port', String(iamPort), - ]); - - expect(exitCode).toBe(0); - - const result = JSON.parse(stdout); - expect(result.metadata.counts.keysDeleted).toBe(result.metadata.counts.keysCreated); - - // Verify no new keys remain after the script - const keysAfter = await accountSource.iamClient.send(new ListAccessKeysCommand({})); - const keyIdsAfter = (keysAfter.AccessKeyMetadata || []).map(k => k.AccessKeyId); - expect(keyIdsAfter).toEqual(keyIdsBefore); - }, 30000); - - it('rejects input without ownerDisplayName', async () => { - const badInputPath = path.join(tmpDir, 'bad-missing.json'); - fs.writeFileSync(badInputPath, JSON.stringify({ - results: [{ - bucket: accountSource.bucketName, - // ownerDisplayName deliberately omitted - sourceRole: `arn:aws:iam::${accountSource.accountId}:role/${ROLE_NAME}`, - policies: [], - }], - })); - - const { exitCode } = await runFixScript([ - badInputPath, iamHost, adminConfigPath, outputFilePath, - '--iam-port', String(iamPort), - ]); - - expect(exitCode).toBe(1); - }, 30000); -}); - -describe('fix-missing-replication-permissions (multi-bucket and multi-role)', () => { - let vaultClient; - let accounts; - let tmpDir; - let adminConfigPath; - let outputFilePath; - - beforeEach(() => { - vaultClient = new vaultclient.Client( - iamHost, iamPort, - false, undefined, undefined, undefined, undefined, - adminAccessKeyId, adminSecretAccessKey, - ); - - accounts = []; - tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'fix-repl-test-')); - adminConfigPath = path.join(tmpDir, 'admin-config.json'); - fs.writeFileSync(adminConfigPath, JSON.stringify({ - accessKey: adminAccessKeyId, - secretKeyValue: adminSecretAccessKey, - })); - outputFilePath = path.join(tmpDir, 'output.json'); - }); - - afterEach(async () => { - for (const account of accounts) { - await deleteTestAccount(vaultClient, account); - } - fs.rmSync(tmpDir, { recursive: true, force: true }); - }, 60000); - - it('one role, multiple buckets: one policy per bucket', async () => { - const accountSource = await createTestAccount(vaultClient); - const accountDest = await createTestAccount(vaultClient); - accounts.push(accountSource, accountDest); - - // Create a second bucket in the source account - const secondBucket = `${accountSource.bucketName}-second`; - await accountSource.s3Client.send(new CreateBucketCommand({ Bucket: secondBucket })); - - // Enable versioning on all buckets - await accountSource.s3Client.send(new PutBucketVersioningCommand({ - Bucket: accountSource.bucketName, - VersioningConfiguration: { Status: 'Enabled' }, - })); - await accountSource.s3Client.send(new PutBucketVersioningCommand({ - Bucket: secondBucket, - VersioningConfiguration: { Status: 'Enabled' }, - })); - await accountDest.s3Client.send(new PutBucketVersioningCommand({ - Bucket: accountDest.bucketName, - VersioningConfiguration: { Status: 'Enabled' }, - })); - - // Create role in source account - const trustDoc = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Principal: { Service: 'backbeat' }, - Action: 'sts:AssumeRole', - }], - }; - await accountSource.iamClient.send(new CreateRoleCommand({ - RoleName: ROLE_NAME, - AssumeRolePolicyDocument: JSON.stringify(trustDoc), - })); - - // Write input: same role referenced by two buckets - const inputFilePath = path.join(tmpDir, 'missing.json'); - const sourceRole = `arn:aws:iam::${accountSource.accountId}:role/${ROLE_NAME}`; - fs.writeFileSync(inputFilePath, JSON.stringify({ - results: [ - { - bucket: accountSource.bucketName, - ownerDisplayName: accountSource.accountName, - sourceRole, - policies: [], - }, - { - bucket: secondBucket, - ownerDisplayName: accountSource.accountName, - sourceRole, - policies: [], - }, - ], - })); - - const { stdout, exitCode } = await runFixScript([ - inputFilePath, iamHost, adminConfigPath, outputFilePath, - '--iam-port', String(iamPort), - ]); - - expect(exitCode).toBe(0); - - const result = JSON.parse(stdout); - // One fix entry per bucket - expect(result.fixes).toHaveLength(2); - expect(result.fixes.map(f => f.bucket)).toEqual( - expect.arrayContaining([accountSource.bucketName, secondBucket]), - ); - // One policy per bucket - expect(result.metadata.counts.policiesCreated).toBe(2); - expect(result.metadata.counts.totalBucketsFixed).toBe(2); - - // Verify each bucket has its own policy with the correct ARN - for (const bucketName of [accountSource.bucketName, secondBucket]) { - const policyName = `${POLICY_PREFIX}-${bucketName}`; - const policyArn = `arn:aws:iam::${accountSource.accountId}:policy/${policyName}`; - const policyResp = await accountSource.iamClient.send( - new GetPolicyCommand({ PolicyArn: policyArn }), - ); - const versionResp = await accountSource.iamClient.send( - new GetPolicyVersionCommand({ - PolicyArn: policyArn, - VersionId: policyResp.Policy.DefaultVersionId, - }), - ); - const policyDoc = JSON.parse(decodeURIComponent(versionResp.PolicyVersion.Document)); - const resources = policyDoc.Statement.flatMap(s => [].concat(s.Resource)); - expect(resources).toEqual([`arn:aws:s3:::${bucketName}/*`]); - } - }, 60000); - - it('two roles in the same account: two policies, one temp key', async () => { - const accountSource = await createTestAccount(vaultClient); - const accountDest = await createTestAccount(vaultClient); - accounts.push(accountSource, accountDest); - - const secondRoleName = 'crr-role-test-2'; - - // Create a second bucket - const secondBucket = `${accountSource.bucketName}-second`; - await accountSource.s3Client.send(new CreateBucketCommand({ Bucket: secondBucket })); - - // Enable versioning - await accountSource.s3Client.send(new PutBucketVersioningCommand({ - Bucket: accountSource.bucketName, - VersioningConfiguration: { Status: 'Enabled' }, - })); - await accountSource.s3Client.send(new PutBucketVersioningCommand({ - Bucket: secondBucket, - VersioningConfiguration: { Status: 'Enabled' }, - })); - - // Create two roles in the same source account - const trustDoc = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Principal: { Service: 'backbeat' }, - Action: 'sts:AssumeRole', - }], - }; - await accountSource.iamClient.send(new CreateRoleCommand({ - RoleName: ROLE_NAME, - AssumeRolePolicyDocument: JSON.stringify(trustDoc), - })); - await accountSource.iamClient.send(new CreateRoleCommand({ - RoleName: secondRoleName, - AssumeRolePolicyDocument: JSON.stringify(trustDoc), - })); - - // Write input: two roles in the same account - const inputFilePath = path.join(tmpDir, 'missing.json'); - fs.writeFileSync(inputFilePath, JSON.stringify({ - results: [ - { - bucket: accountSource.bucketName, - ownerDisplayName: accountSource.accountName, - sourceRole: `arn:aws:iam::${accountSource.accountId}:role/${ROLE_NAME}`, - policies: [], - }, - { - bucket: secondBucket, - ownerDisplayName: accountSource.accountName, - sourceRole: `arn:aws:iam::${accountSource.accountId}:role/${secondRoleName}`, - policies: [], - }, - ], - })); - - const { stdout, exitCode } = await runFixScript([ - inputFilePath, iamHost, adminConfigPath, outputFilePath, - '--iam-port', String(iamPort), - ]); - - expect(exitCode).toBe(0); - - const result = JSON.parse(stdout); - expect(result.fixes).toHaveLength(2); - expect(result.metadata.counts.policiesCreated).toBe(2); - expect(result.metadata.counts.policiesAttached).toBe(2); - // Only one temp key for the single account - expect(result.metadata.counts.keysCreated).toBe(1); - expect(result.metadata.counts.keysDeleted).toBe(1); - - // Verify both policies exist (named by bucket, not role) - const attached1 = await accountSource.iamClient.send( - new ListAttachedRolePoliciesCommand({ RoleName: ROLE_NAME }), - ); - expect((attached1.AttachedPolicies || []) - .find(p => p.PolicyName === `${POLICY_PREFIX}-${accountSource.bucketName}`)).toBeDefined(); - - const attached2 = await accountSource.iamClient.send( - new ListAttachedRolePoliciesCommand({ RoleName: secondRoleName }), - ); - expect((attached2.AttachedPolicies || []) - .find(p => p.PolicyName === `${POLICY_PREFIX}-${secondBucket}`)).toBeDefined(); - }, 60000); - - it('two roles across different accounts: separate policies and keys', async () => { - const accountSource1 = await createTestAccount(vaultClient); - const accountSource2 = await createTestAccount(vaultClient); - const accountDest = await createTestAccount(vaultClient); - accounts.push(accountSource1, accountSource2, accountDest); - - // Enable versioning - await accountSource1.s3Client.send(new PutBucketVersioningCommand({ - Bucket: accountSource1.bucketName, - VersioningConfiguration: { Status: 'Enabled' }, - })); - await accountSource2.s3Client.send(new PutBucketVersioningCommand({ - Bucket: accountSource2.bucketName, - VersioningConfiguration: { Status: 'Enabled' }, - })); - - // Create roles in each source account - const trustDoc = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Principal: { Service: 'backbeat' }, - Action: 'sts:AssumeRole', - }], - }; - await accountSource1.iamClient.send(new CreateRoleCommand({ - RoleName: ROLE_NAME, - AssumeRolePolicyDocument: JSON.stringify(trustDoc), - })); - await accountSource2.iamClient.send(new CreateRoleCommand({ - RoleName: ROLE_NAME, - AssumeRolePolicyDocument: JSON.stringify(trustDoc), - })); - - // Write input: same role name but in two different accounts - const inputFilePath = path.join(tmpDir, 'missing.json'); - fs.writeFileSync(inputFilePath, JSON.stringify({ - results: [ - { - bucket: accountSource1.bucketName, - ownerDisplayName: accountSource1.accountName, - sourceRole: `arn:aws:iam::${accountSource1.accountId}:role/${ROLE_NAME}`, - policies: [], - }, - { - bucket: accountSource2.bucketName, - ownerDisplayName: accountSource2.accountName, - sourceRole: `arn:aws:iam::${accountSource2.accountId}:role/${ROLE_NAME}`, - policies: [], - }, - ], - })); - - const { stdout, exitCode } = await runFixScript([ - inputFilePath, iamHost, adminConfigPath, outputFilePath, - '--iam-port', String(iamPort), - ]); - - expect(exitCode).toBe(0); - - const result = JSON.parse(stdout); - expect(result.fixes).toHaveLength(2); - expect(result.fixes.every(f => f.status === 'success')).toBe(true); - expect(result.metadata.counts.policiesCreated).toBe(2); - // Two different accounts → two temp keys - expect(result.metadata.counts.keysCreated).toBe(2); - expect(result.metadata.counts.keysDeleted).toBe(2); - - // Verify each account has its own policy attached (named by bucket) - const attached1 = await accountSource1.iamClient.send( - new ListAttachedRolePoliciesCommand({ RoleName: ROLE_NAME }), - ); - expect((attached1.AttachedPolicies || []) - .find(p => p.PolicyName === `${POLICY_PREFIX}-${accountSource1.bucketName}`)).toBeDefined(); - - const attached2 = await accountSource2.iamClient.send( - new ListAttachedRolePoliciesCommand({ RoleName: ROLE_NAME }), - ); - expect((attached2.AttachedPolicies || []) - .find(p => p.PolicyName === `${POLICY_PREFIX}-${accountSource2.bucketName}`)).toBeDefined(); - }, 60000); - - it('empty results array exits with code 0', async () => { - const inputFilePath = path.join(tmpDir, 'empty.json'); - fs.writeFileSync(inputFilePath, JSON.stringify({ results: [] })); - - const { exitCode } = await runFixScript([ - inputFilePath, iamHost, adminConfigPath, outputFilePath, - '--iam-port', String(iamPort), - ]); - - expect(exitCode).toBe(0); - }, 30000); -}); diff --git a/tests/unit/replicationAudit/policyChecker.js b/tests/unit/replicationAudit/policyChecker.js deleted file mode 100644 index fc595b4c..00000000 --- a/tests/unit/replicationAudit/policyChecker.js +++ /dev/null @@ -1,325 +0,0 @@ -const { - parseLeaderAddress, - policyAllowsReplication, -} = require('../../../replicationAudit/check-replication-permissions'); - -describe('parseLeaderAddress', () => { - test('ip only defaults port to 4300', () => { - expect(parseLeaderAddress('10.0.0.1')).toEqual({ ip: '10.0.0.1', port: 4300 }); - }); - - test('ip:port extracts both', () => { - expect(parseLeaderAddress('10.0.0.1:4301')).toEqual({ ip: '10.0.0.1', port: 4301 }); - }); - - test('undefined defaults to 127.0.0.1:4300', () => { - expect(parseLeaderAddress(undefined)).toEqual({ ip: '127.0.0.1', port: 4300 }); - }); - - test('empty string defaults to 127.0.0.1:4300', () => { - expect(parseLeaderAddress('')).toEqual({ ip: '127.0.0.1', port: 4300 }); - }); - - test('custom high port', () => { - expect(parseLeaderAddress('172.16.0.5:4304')).toEqual({ ip: '172.16.0.5', port: 4304 }); - }); -}); - -describe('policyAllowsReplication', () => { - const bucketName = 'source-bucket'; - - describe('valid policies (should allow)', () => { - test('policy with explicit s3:ReplicateObject and matching bucket', () => { - const policy = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: 's3:ReplicateObject', - Resource: 'arn:aws:s3:::source-bucket/*', - }], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(true); - }); - - test('policy with s3:* wildcard action', () => { - const policy = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: 's3:*', - Resource: '*', - }], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(true); - }); - - test('policy with full wildcard (*) action', () => { - const policy = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: '*', - Resource: '*', - }], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(true); - }); - - test('policy with s3:Replicate* wildcard', () => { - const policy = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: 's3:Replicate*', - Resource: 'arn:aws:s3:::source-bucket/*', - }], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(true); - }); - - test('policy with action array including s3:ReplicateObject', () => { - const policy = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: [ - 's3:GetObjectVersion', - 's3:GetObjectVersionAcl', - 's3:ReplicateObject', - 's3:ReplicateDelete', - ], - Resource: 'arn:aws:s3:::source-bucket/*', - }], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(true); - }); - - test('policy with resource array including matching bucket', () => { - const policy = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: 's3:ReplicateObject', - Resource: [ - 'arn:aws:s3:::other-bucket/*', - 'arn:aws:s3:::source-bucket/*', - ], - }], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(true); - }); - - test('policy with multiple statements, one matching', () => { - const policy = { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: 's3:ListBucket', - Resource: 'arn:aws:s3:::source-bucket', - }, - { - Effect: 'Allow', - Action: 's3:ReplicateObject', - Resource: 'arn:aws:s3:::source-bucket/*', - }, - ], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(true); - }); - - test('policy with arn:aws:s3:::* resource wildcard', () => { - const policy = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: 's3:ReplicateObject', - Resource: 'arn:aws:s3:::*', - }], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(true); - }); - - test('policy with exact bucket ARN (no /* suffix)', () => { - const policy = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: 's3:ReplicateObject', - Resource: 'arn:aws:s3:::source-bucket', - }], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(true); - }); - }); - - describe('invalid policies (should reject)', () => { - test('policy with Deny effect', () => { - const policy = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Deny', - Action: 's3:ReplicateObject', - Resource: 'arn:aws:s3:::source-bucket/*', - }], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(false); - }); - - test('policy missing s3:ReplicateObject action', () => { - const policy = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: [ - 's3:GetObjectVersion', - 's3:GetObjectVersionAcl', - ], - Resource: 'arn:aws:s3:::source-bucket/*', - }], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(false); - }); - - test('policy with wrong bucket resource', () => { - const policy = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: 's3:ReplicateObject', - Resource: 'arn:aws:s3:::other-bucket/*', - }], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(false); - }); - - test('policy with empty Statement array', () => { - const policy = { - Version: '2012-10-17', - Statement: [], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(false); - }); - - test('policy with no Statement property', () => { - const policy = { - Version: '2012-10-17', - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(false); - }); - - test('empty policy object', () => { - expect(policyAllowsReplication({}, bucketName)).toBe(false); - }); - - test('policy with only bucket-level actions (no object actions)', () => { - const policy = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: [ - 's3:ListBucket', - 's3:GetReplicationConfiguration', - ], - Resource: 'arn:aws:s3:::source-bucket', - }], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(false); - }); - - test('policy with s3:ReplicateDelete but not s3:ReplicateObject', () => { - const policy = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: 's3:ReplicateDelete', - Resource: 'arn:aws:s3:::source-bucket/*', - }], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(false); - }); - - test('policy with partial bucket name match', () => { - const policy = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: 's3:ReplicateObject', - Resource: 'arn:aws:s3:::source-bucket-backup/*', - }], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(false); - }); - }); - - describe('edge cases', () => { - test('statement with missing Effect defaults to implicit deny', () => { - const policy = { - Version: '2012-10-17', - Statement: [{ - Action: 's3:ReplicateObject', - Resource: 'arn:aws:s3:::source-bucket/*', - }], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(false); - }); - - test('statement with missing Action', () => { - const policy = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Resource: 'arn:aws:s3:::source-bucket/*', - }], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(false); - }); - - test('statement with missing Resource', () => { - const policy = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: 's3:ReplicateObject', - }], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(false); - }); - - test('statement with null Action', () => { - const policy = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: null, - Resource: 'arn:aws:s3:::source-bucket/*', - }], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(false); - }); - - test('statement with empty Action array', () => { - const policy = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: [], - Resource: 'arn:aws:s3:::source-bucket/*', - }], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(false); - }); - - test('statement with empty Resource array', () => { - const policy = { - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: 's3:ReplicateObject', - Resource: [], - }], - }; - expect(policyAllowsReplication(policy, bucketName)).toBe(false); - }); - }); -}); diff --git a/yarn.lock b/yarn.lock index b63034da..4b0ed73e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2451,22 +2451,6 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" -aws-sdk@^2.1692.0: - version "2.1693.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1693.0.tgz#fda38671af3dc5fa8117e9aa09cf6ce37e34010e" - integrity sha512-cJmb8xEnVLT+R6fBS5sn/EFJiX7tUnDaPtOPZ1vFbOJtd0fnZn/Ky2XGgsvvoeliWeH7mL3TWSX5zXXGSQV6gQ== - dependencies: - buffer "4.9.2" - events "1.1.1" - ieee754 "1.1.13" - jmespath "0.16.0" - querystring "0.2.0" - sax "1.2.1" - url "0.10.3" - util "^0.12.4" - uuid "8.0.0" - xml2js "0.6.2" - b4a@^1.6.4, b4a@^1.8.1: version "1.9.0" resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.9.0.tgz#6336313b6e76b299c397afa68676ec6ebc788845" @@ -2712,15 +2696,6 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@4.9.2: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - buffer@5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" @@ -3526,11 +3501,6 @@ events-universal@^1.0.0: dependencies: bare-events "^2.7.0" -events@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - integrity sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw== - events@3.3.0, events@^3.0.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" @@ -4020,7 +3990,7 @@ http-proxy-agent@^7.0.0: dependencies: agentkeepalive "^4.5.0" -"httpagent@github:scality/httpagent#1.1.1": +"httpagent@github:scality/httpagent#1.1.1", httpagent@scality/httpagent#1.1.1: version "1.1.1" resolved "https://codeload.github.com/scality/httpagent/tar.gz/7c6ef8be1cd89b56651f4a922ea5c92d7673ee2e" dependencies: @@ -4060,11 +4030,6 @@ iconv-lite@^0.7.2, iconv-lite@~0.7.0: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -ieee754@1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== - ieee754@^1.1.4, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -4163,14 +4128,6 @@ ipaddr.js@^2.2.0: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.5.0.tgz#7d4b6c39f9392fb61cf807de6e425e22c10e061f" integrity sha512-aq+t5NAc+cS6rZQQVWC2x98CPqGtKKTMDd4Gaodv0wShnItdKg/51djkGJ1hqH+Oy0ivDftCbSLCQob8zso01w== -is-arguments@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.2.0.tgz#ad58c6aecf563b78ef2bf04df540da8f5d7d8e1b" - integrity sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA== - dependencies: - call-bound "^1.0.2" - has-tostringtag "^1.0.2" - is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: version "3.0.5" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" @@ -4279,7 +4236,7 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-generator-function@^1.0.10, is-generator-function@^1.0.7: +is-generator-function@^1.0.10: version "1.1.2" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.2.tgz#ae3b61e3d5ea4e4839b90bad22b02335051a17d5" integrity sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA== @@ -4381,7 +4338,7 @@ is-symbol@^1.1.1: has-symbols "^1.1.0" safe-regex-test "^1.1.0" -is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15, is-typed-array@^1.1.3: +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: version "1.1.15" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== @@ -4420,11 +4377,6 @@ is-wsl@^3.1.0: dependencies: is-inside-container "^1.0.0" -isarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" @@ -4860,11 +4812,6 @@ jest@^29.7.0: import-local "^3.0.2" jest-cli "^29.7.0" -jmespath@0.16.0: - version "0.16.0" - resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076" - integrity sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw== - joi@^18.0.1: version "18.2.9" resolved "https://registry.yarnpkg.com/joi/-/joi-18.2.9.tgz#8f489aebefab85cfa9979ea4471e3eea022787b1" @@ -5895,11 +5842,6 @@ proxy-addr@^2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== - punycode@^2.1.0, punycode@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -5918,11 +5860,6 @@ qs@^6.14.0, qs@^6.15.2: es-define-property "^1.0.1" side-channel "^1.1.1" -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== - randomatic@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" @@ -6120,11 +6057,6 @@ safe-regex-test@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" - integrity sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA== - sax@>=0.6.0, sax@^1.2.4: version "1.6.1" resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.1.tgz#4c23cf608c0b693ab54b4b5888e92cfe977b9843" @@ -6833,14 +6765,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -url@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" - integrity sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ== - dependencies: - punycode "1.3.2" - querystring "0.2.0" - utf8@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" @@ -6851,22 +6775,6 @@ util-deprecate@^1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -util@^0.12.4: - version "0.12.5" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" - integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - which-typed-array "^1.1.2" - -uuid@8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.0.0.tgz#bc6ccf91b5ff0ac07bbcdbf1c7c4e150db4dbb6c" - integrity sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw== - uuid@^11.0.3, uuid@^11.1.0: version "11.1.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.1.tgz#f6d81d2e1c65d00762e5e29b16c5d2d995e208ad" @@ -6916,16 +6824,16 @@ webidl-conversions@^7.0.0: fast-safe-stringify "^2.1.1" safe-json-stringify "^1.2.0" -"werelogs@github:scality/werelogs#8.2.5", werelogs@scality/werelogs#8.2.5, "werelogs@scality/werelogs#semver:^8.2.4": - version "8.2.5" - resolved "https://codeload.github.com/scality/werelogs/tar.gz/41188826d661227f98ebaaeda7df5e5862809bc7" +werelogs@scality/werelogs#8.2.0: + version "8.2.0" + resolved "https://codeload.github.com/scality/werelogs/tar.gz/7bf334cea94002d118f27d7ec1c7a5af74b51b8d" dependencies: fast-safe-stringify "^2.1.1" safe-json-stringify "^1.2.0" -werelogs@scality/werelogs#8.2.0: - version "8.2.0" - resolved "https://codeload.github.com/scality/werelogs/tar.gz/7bf334cea94002d118f27d7ec1c7a5af74b51b8d" +werelogs@scality/werelogs#8.2.5, "werelogs@scality/werelogs#semver:^8.2.4": + version "8.2.5" + resolved "https://codeload.github.com/scality/werelogs/tar.gz/41188826d661227f98ebaaeda7df5e5862809bc7" dependencies: fast-safe-stringify "^2.1.1" safe-json-stringify "^1.2.0" @@ -6978,7 +6886,7 @@ which-collection@^1.0.2: is-weakmap "^2.0.2" is-weakset "^2.0.3" -which-typed-array@^1.1.16, which-typed-array@^1.1.19, which-typed-array@^1.1.2: +which-typed-array@^1.1.16, which-typed-array@^1.1.19: version "1.1.24" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.24.tgz#211f5877c29e6213d50e8f2dce4ac9ca2d0008cf" integrity sha512-wk4Mf4pR5mRP7eYuuTBCIQ9d0ud2Fv2jRLQpfgnRjbOxAFHmjKFValgTpitVKzJJS8ajnYQV2Du1SZ8j6b/EUQ== @@ -7067,7 +6975,7 @@ xml-naming@^0.3.0: resolved "https://registry.yarnpkg.com/xml-naming/-/xml-naming-0.3.0.tgz#46c1e18bfe2858479982dd2accf34d16e749eda2" integrity sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ== -xml2js@0.6.2, xml2js@^0.6.2: +xml2js@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.2.tgz#dd0b630083aa09c161e25a4d0901e2b2a929b499" integrity sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA== From cc4769f083f748e84d365e037c63d089c776c7a2 Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Thu, 15 Oct 2026 13:04:12 +0200 Subject: [PATCH 05/12] Use @smithy/node-http-handler directly @aws-sdk/node-http-handler is deprecated and only re-exports the 1.x @smithy handler, while the S3 client itself runs on 4.x. Depend on the @smithy package so the scripts use the same handler as the SDK. In 4.x, requestTimeout became an overall request deadline which only logs a warning by default, and the socket idle timeout it used to configure is now socketTimeout. Switch to socketTimeout so stalled connections still fail and get retried instead of hanging forever. The cloudserver client was already affected, as it lets the SDK build a 4.x handler from its options, so it gets the same fix. Issue: S3UTILS-249 --- Clients/CloudserverClient.js | 2 +- Clients/s3Client.js | 4 +-- VerifyReplication/storage/s3.js | 4 +-- bucketVersionsStats.js | 4 +-- cleanupBuckets.js | 2 +- cleanupNoncurrentVersions.js | 4 +-- listObjectsByReplicationStatus.js | 4 +-- package.json | 2 +- removeDeleteMarkers.js | 2 +- yarn.lock | 51 ------------------------------- 10 files changed, 14 insertions(+), 65 deletions(-) diff --git a/Clients/CloudserverClient.js b/Clients/CloudserverClient.js index 7fed71be..51a5643c 100644 --- a/Clients/CloudserverClient.js +++ b/Clients/CloudserverClient.js @@ -31,7 +31,7 @@ class Client { const requestHandler = { connectionTimeout: 60000, - requestTimeout: 60000, + socketTimeout: 60000, }; if (isHttps) { requestHandler.httpsAgent = httpAgent; diff --git a/Clients/s3Client.js b/Clients/s3Client.js index 20e953ac..cb7f587e 100644 --- a/Clients/s3Client.js +++ b/Clients/s3Client.js @@ -1,5 +1,5 @@ const { S3Client } = require('@aws-sdk/client-s3'); -const { NodeHttpHandler } = require('@aws-sdk/node-http-handler'); +const { NodeHttpHandler } = require('@smithy/node-http-handler'); const { ConfiguredRetryStrategy } = require('@smithy/util-retry'); const http = require('http'); const https = require('https'); @@ -39,7 +39,7 @@ const createS3Client = ({ accessKey, secretKey, endpoint }, log) => { // so https will work but there will be no security enforced rejectUnauthorized: false }), - requestTimeout: 60000, + socketTimeout: 60000, }), retryStrategy: new ConfiguredRetryStrategy( AWS_SDK_REQUEST_RETRIES, // maxAttempts diff --git a/VerifyReplication/storage/s3.js b/VerifyReplication/storage/s3.js index 60d90c61..141c23cd 100644 --- a/VerifyReplication/storage/s3.js +++ b/VerifyReplication/storage/s3.js @@ -1,5 +1,5 @@ const { S3Client, HeadObjectCommand, ListObjectsV2Command } = require('@aws-sdk/client-s3'); -const { NodeHttpHandler } = require('@aws-sdk/node-http-handler'); +const { NodeHttpHandler } = require('@smithy/node-http-handler'); const { ConfiguredRetryStrategy } = require('@smithy/util-retry'); const fs = require('fs'); const http = require('http'); @@ -61,7 +61,7 @@ function getClient(params) { requestHandler: new NodeHttpHandler({ httpAgent, httpsAgent, - requestTimeout: httpTimeout || 300000, + socketTimeout: httpTimeout || 300000, }), }; diff --git a/bucketVersionsStats.js b/bucketVersionsStats.js index 146d089a..410c0dca 100644 --- a/bucketVersionsStats.js +++ b/bucketVersionsStats.js @@ -2,7 +2,7 @@ const fs = require('fs'); const { http, https } = require('httpagent'); const { S3Client, ListObjectVersionsCommand } = require('@aws-sdk/client-s3'); -const { NodeHttpHandler } = require('@aws-sdk/node-http-handler'); +const { NodeHttpHandler } = require('@smithy/node-http-handler'); const { ConfiguredRetryStrategy } = require('@smithy/util-retry'); const { Logger } = require('werelogs'); @@ -109,7 +109,7 @@ const s3 = new S3Client({ requestHandler: new NodeHttpHandler({ httpAgent: agent, httpsAgent: agent, - requestTimeout: 60000, + socketTimeout: 60000, }), retryStrategy: new ConfiguredRetryStrategy( AWS_SDK_REQUEST_RETRIES, diff --git a/cleanupBuckets.js b/cleanupBuckets.js index 8811df2a..fcb177ef 100644 --- a/cleanupBuckets.js +++ b/cleanupBuckets.js @@ -6,7 +6,7 @@ const { ListMultipartUploadsCommand, AbortMultipartUploadCommand, } = require('@aws-sdk/client-s3'); -const { NodeHttpHandler } = require('@aws-sdk/node-http-handler'); +const { NodeHttpHandler } = require('@smithy/node-http-handler'); const { Logger } = require('werelogs'); const log = new Logger('s3utils::emptyBucket'); diff --git a/cleanupNoncurrentVersions.js b/cleanupNoncurrentVersions.js index 4b2d9193..a23a421d 100644 --- a/cleanupNoncurrentVersions.js +++ b/cleanupNoncurrentVersions.js @@ -3,7 +3,7 @@ const { http, https } = require('httpagent'); const { ObjectMD } = require('@scality/arsenal').models; const { S3Client, ListObjectVersionsCommand, DeleteObjectsCommand } = require('@aws-sdk/client-s3'); -const { NodeHttpHandler } = require('@aws-sdk/node-http-handler'); +const { NodeHttpHandler } = require('@smithy/node-http-handler'); const { ConfiguredRetryStrategy } = require('@smithy/util-retry'); const { doWhilst, eachSeries, filterLimit } = require('async'); @@ -186,7 +186,7 @@ const s3 = new S3Client({ requestHandler: new NodeHttpHandler({ httpAgent: agent, httpsAgent: agent, - requestTimeout: 60000, + socketTimeout: 60000, }), retryStrategy: new ConfiguredRetryStrategy( AWS_SDK_REQUEST_RETRIES, diff --git a/listObjectsByReplicationStatus.js b/listObjectsByReplicationStatus.js index 8514837f..2bcddbb4 100644 --- a/listObjectsByReplicationStatus.js +++ b/listObjectsByReplicationStatus.js @@ -1,6 +1,6 @@ const async = require('async'); const { S3Client, ListObjectVersionsCommand, HeadObjectCommand } = require('@aws-sdk/client-s3'); -const { NodeHttpHandler } = require('@aws-sdk/node-http-handler'); +const { NodeHttpHandler } = require('@smithy/node-http-handler'); const http = require('http'); const { Logger } = require('werelogs'); @@ -185,7 +185,7 @@ function listObjectsByReplicationStatus(options) { tls: false, requestHandler: new NodeHttpHandler({ httpAgent: new http.Agent({ keepAlive: true }), - requestTimeout: 60000, + socketTimeout: 60000, }), }); diff --git a/package.json b/package.json index 2e06e222..2c2fa7ef 100644 --- a/package.json +++ b/package.json @@ -28,10 +28,10 @@ "homepage": "https://github.com/scality/s3utils#readme", "dependencies": { "@aws-sdk/client-s3": "^3.873.0", - "@aws-sdk/node-http-handler": "^3.374.0", "@scality/arsenal": "^8.6.0", "@scality/cloudserverclient": "^1.0.8", "@senx/warp10": "^2.0.3", + "@smithy/node-http-handler": "^4.12.1", "@smithy/util-retry": "^4.0.7", "JSONStream": "^1.3.5", "async": "^3.2.6", diff --git a/removeDeleteMarkers.js b/removeDeleteMarkers.js index e41bd95b..e063593c 100644 --- a/removeDeleteMarkers.js +++ b/removeDeleteMarkers.js @@ -9,7 +9,7 @@ const { ListObjectVersionsCommand, DeleteObjectsCommand } = require('@aws-sdk/client-s3'); -const { NodeHttpHandler } = require('@aws-sdk/node-http-handler'); +const { NodeHttpHandler } = require('@smithy/node-http-handler'); const { Logger } = require('werelogs'); const log = new Logger('s3utils::removeDeleteMarkers'); diff --git a/yarn.lock b/yarn.lock index 4b0ed73e..eb7138a6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -315,14 +315,6 @@ "@smithy/types" "^4.19.0" tslib "^2.6.2" -"@aws-sdk/node-http-handler@^3.374.0": - version "3.374.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.374.0.tgz#8cd58b4d9814713e26034c12eabc119c113a5bc4" - integrity sha512-v1Z6m0wwkf65/tKuhwrtPRqVoOtNkDTRn2MBMtxCwEw+8V8Q+YRFqVgGN+J1n53ktE0G5OYVBux/NHiAjJHReQ== - dependencies: - "@smithy/node-http-handler" "^1.0.2" - tslib "^2.5.0" - "@aws-sdk/signature-v4-multi-region@^3.996.47": version "3.996.47" resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.47.tgz#4a707c1d5b43ea242897c393b03f8583fcfbb8ab" @@ -1741,14 +1733,6 @@ "@sinonjs/commons" "^3.0.1" type-detect "^4.1.0" -"@smithy/abort-controller@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-1.1.0.tgz#2da0d73c504b93ca8bb83bdc8d6b8208d73f418b" - integrity sha512-5imgGUlZL4dW4YWdMYAKLmal9ny/tlenM81QZY7xYyb76z9Z/QOg7oM5Ak9HQl8QfFTlGVWwcMXl+54jroRgEQ== - dependencies: - "@smithy/types" "^1.2.0" - tslib "^2.5.0" - "@smithy/core@^3.33.2", "@smithy/core@^3.33.3", "@smithy/core@^3.35.0": version "3.35.0" resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.35.0.tgz#52f180a314d735af8ba8970967c4c9499fc21d3e" @@ -1806,17 +1790,6 @@ dependencies: tslib "^2.6.2" -"@smithy/node-http-handler@^1.0.2": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-1.1.0.tgz#887cee930b520e08043c9f41e463f8d8f5dae127" - integrity sha512-d3kRriEgaIiGXLziAM8bjnaLn1fthCJeTLZIwEIpzQqe6yPX0a+yQoLCTyjb2fvdLwkMoG4p7THIIB5cj5lkbg== - dependencies: - "@smithy/abort-controller" "^1.1.0" - "@smithy/protocol-http" "^1.2.0" - "@smithy/querystring-builder" "^1.1.0" - "@smithy/types" "^1.2.0" - tslib "^2.5.0" - "@smithy/node-http-handler@^4.12.1", "@smithy/node-http-handler@^4.3.0": version "4.12.1" resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.12.1.tgz#e4da9379d228517ba85845081e4e6758ca315c5d" @@ -1826,14 +1799,6 @@ "@smithy/types" "^4.18.0" tslib "^2.6.2" -"@smithy/protocol-http@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-1.2.0.tgz#a554e4dabb14508f0bc2cdef9c3710e2b294be04" - integrity sha512-GfGfruksi3nXdFok5RhgtOnWe5f6BndzYfmEXISD+5gAGdayFGpjWu5pIqIweTudMtse20bGbc+7MFZXT1Tb8Q== - dependencies: - "@smithy/types" "^1.2.0" - tslib "^2.5.0" - "@smithy/protocol-http@^4.1.8": version "4.1.8" resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-4.1.8.tgz#0461758671335f65e8ff3fc0885ab7ed253819c9" @@ -1850,15 +1815,6 @@ "@smithy/core" "^3.33.2" tslib "^2.6.2" -"@smithy/querystring-builder@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-1.1.0.tgz#de6306104640ade34e59be33949db6cc64aa9d7f" - integrity sha512-gDEi4LxIGLbdfjrjiY45QNbuDmpkwh9DX4xzrR2AzjjXpxwGyfSpbJaYhXARw9p17VH0h9UewnNQXNwaQyYMDA== - dependencies: - "@smithy/types" "^1.2.0" - "@smithy/util-uri-escape" "^1.1.0" - tslib "^2.5.0" - "@smithy/signature-v4@^4.1.0": version "4.2.4" resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-4.2.4.tgz#3501d3d09fd82768867bfc00a7be4bad62f62f4d" @@ -1950,13 +1906,6 @@ "@smithy/core" "^3.33.2" tslib "^2.6.2" -"@smithy/util-uri-escape@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-1.1.0.tgz#a8c5edaf19c0efdb9b51661e840549cf600a1808" - integrity sha512-/jL/V1xdVRt5XppwiaEU8Etp5WHZj609n0xMTuehmCqdoOFbId1M+aEeDWZsQ+8JbEB/BJ6ynY2SlYmOaKtt8w== - dependencies: - tslib "^2.5.0" - "@smithy/util-uri-escape@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz#e43358a78bf45d50bb736770077f0f09195b6f54" From f5680ab304f9e45d4eb94cfa5386986da697f312 Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Thu, 15 Oct 2026 13:05:21 +0200 Subject: [PATCH 06/12] Use the built-in v8 heap snapshot instead of heapdump heapdump is an unmaintained native addon that has to be rebuilt for each Node ABI. Node has shipped v8.writeHeapSnapshot since 11, which writes the same .heapsnapshot files, so the profiler keeps working as before without the extra native build. Issue: S3UTILS-249 --- package.json | 1 - utils/heapProfiler.js | 19 +++++++++---------- yarn.lock | 9 +-------- 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index 2c2fa7ef..4e4a77a7 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,6 @@ "async": "^3.2.6", "bucketclient": "scality/bucketclient#8.3.0", "express": "^5.1.0", - "heapdump": "^0.3.15", "httpagent": "scality/httpagent#1.1.0", "level": "^9.0.0", "mongodb": "^6.17.0", diff --git a/utils/heapProfiler.js b/utils/heapProfiler.js index 34b68f41..7e293184 100644 --- a/utils/heapProfiler.js +++ b/utils/heapProfiler.js @@ -1,7 +1,7 @@ const fs = require('fs'); const path = require('path'); +const v8 = require('v8'); const werelogs = require('werelogs'); -const heapdump = require('heapdump'); const logger = new werelogs.Logger('Utils::HeapProfiler'); @@ -10,15 +10,14 @@ function generateFilename(dir) { } function writeSnapshot(filename) { - heapdump.writeSnapshot(filename, (err, filename) => { - if (err) { - logger.error(`unable to write heapdump to ${filename}:`, { - error: err, - }); - } else { - logger.debug(`heapdump written to ${filename}:`); - } - }); + try { + v8.writeHeapSnapshot(filename); + logger.debug(`heapdump written to ${filename}:`); + } catch (err) { + logger.error(`unable to write heapdump to ${filename}:`, { + error: err, + }); + } } module.exports = (dir, interval) => { diff --git a/yarn.lock b/yarn.lock index eb7138a6..3ddf5902 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3891,13 +3891,6 @@ hasown@^2.0.2, hasown@^2.0.4: dependencies: function-bind "^1.1.2" -heapdump@^0.3.15: - version "0.3.15" - resolved "https://registry.yarnpkg.com/heapdump/-/heapdump-0.3.15.tgz#631a8a2585588ea64778d8ec80a64c6c025f6a08" - integrity sha512-n8aSFscI9r3gfhOcAECAtXFaQ1uy4QSke6bnaL+iymYZ/dWs9cqDqHM+rALfsHUwukUbxsdlECZ0pKmJdQ/4OA== - dependencies: - nan "^2.13.2" - html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" @@ -5330,7 +5323,7 @@ ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nan@^2.13.2, nan@^2.14.0, nan@^2.24.0: +nan@^2.14.0, nan@^2.24.0: version "2.29.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.29.0.tgz#95bace50f153289240573c08401acc63a30659d4" integrity sha512-GlGk3HIvitbvs+LT3g6XUP1kpirKNvmDFwF/bmo6XNWSb/eYEs/O4bfgIEIXCZ+lIOTS5xNwDvSGMw6FJdAhtA== From 81b7a186a9ec39b19b2e4630df8b2065a9e19ac0 Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Thu, 15 Oct 2026 13:30:37 +0200 Subject: [PATCH 07/12] Generate random test keys with crypto randomatic was only used by two tests to produce random sproxyd keys and version suffixes, and lodash/range was pulled in there without being declared at all. Node's crypto and Array.from cover both. Issue: S3UTILS-249 --- package.json | 1 - .../DuplicateKeysWindowTest.js | 7 ++++-- .../SproxydKeysSubscribersTest.js | 10 +++++--- yarn.lock | 24 ------------------- 4 files changed, 12 insertions(+), 30 deletions(-) diff --git a/package.json b/package.json index 4e4a77a7..e04407d1 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,6 @@ "eslint-plugin-jest": "^28.11.0", "jest": "^29.7.0", "mongodb-memory-server": "10.1.2", - "randomatic": "^3.1.1", "sinon": "^19.0.2", "strip-ansi": "^7.1.0", "typescript": "^4.9.5" diff --git a/tests/unit/SproxydKeysScan/DuplicateKeysWindowTest.js b/tests/unit/SproxydKeysScan/DuplicateKeysWindowTest.js index 3f4dea65..139f49b5 100644 --- a/tests/unit/SproxydKeysScan/DuplicateKeysWindowTest.js +++ b/tests/unit/SproxydKeysScan/DuplicateKeysWindowTest.js @@ -1,8 +1,11 @@ -const randomize = require('randomatic'); -const range = require('lodash/range'); +const crypto = require('crypto'); const { BoundedMap, MultiMap } = require('../../../ObjectRepair/DuplicateKeysWindow'); const { setupProcessor } = require('../../utils/setupProcessor'); +const range = n => Array.from({ length: n }, (_, i) => i); + +const randomize = (_pattern, length) => crypto.randomBytes(length / 2).toString('hex').toUpperCase(); + describe('DuplicateKeysWindow', () => { describe('BoundedMap', () => { test('grows in size up to the limit with each unique key', () => { diff --git a/tests/unit/SproxydKeysScan/SproxydKeysSubscribersTest.js b/tests/unit/SproxydKeysScan/SproxydKeysSubscribersTest.js index 38f3b790..613ecb28 100644 --- a/tests/unit/SproxydKeysScan/SproxydKeysSubscribersTest.js +++ b/tests/unit/SproxydKeysScan/SproxydKeysSubscribersTest.js @@ -1,13 +1,17 @@ -const randomize = require('randomatic'); -const range = require('lodash/range'); +const crypto = require('crypto'); const { setupProcessor } = require('../../utils/setupProcessor'); +const range = n => Array.from({ length: n }, (_, i) => i); + describe('SproxydKeysSubscribers', () => { describe('DuplicateSproxydKeyFoundHandler', () => { const [processor, duplicateHandler] = setupProcessor(10); const key = 'test-2021-11-24T19-41-08-494Z/2\u000098362217123979999997RG001 '; - const version = () => `${randomize('0', 3)}.${randomize('0', 3)}`; + const version = () => { + const digits = () => String(crypto.randomInt(1000)).padStart(3, '0'); + return `${digits()}.${digits()}`; + }; test('the higher (older) version is always repaired and then the lower (newer) version is set in map', () => { range(100).forEach(idx => { diff --git a/yarn.lock b/yarn.lock index 3ddf5902..ad40d69a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4221,11 +4221,6 @@ is-number-object@^1.1.1: call-bound "^1.0.3" has-tostringtag "^1.0.2" -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -4879,11 +4874,6 @@ keyv@^4.5.4: dependencies: json-buffer "3.0.1" -kind-of@^6.0.0: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -5109,11 +5099,6 @@ math-intrinsics@^1.1.0: resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== - maybe-combine-errors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/maybe-combine-errors/-/maybe-combine-errors-1.0.0.tgz#e9592832e61fc47643a92cff3c1f33e27211e5be" @@ -5802,15 +5787,6 @@ qs@^6.14.0, qs@^6.15.2: es-define-property "^1.0.1" side-channel "^1.1.1" -randomatic@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - range-parser@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.3.0.tgz#d7f19be812bb62721472b45d3be219ef09572b47" From f2ed32d75d205279e9474885b34c7449a2a285bb Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Thu, 15 Oct 2026 14:47:34 +0200 Subject: [PATCH 08/12] Clean up declared dependencies Nothing requires needle, strip-ansi or typescript: needle was left over from the service level sidecar, and the other two came in with an earlier tooling bump. eslint-plugin-import and eslint-plugin-jest are not loaded by the flat ESLint config either. eslint.config.mjs imports @eslint/js and @eslint/eslintrc directly, but they were only reachable as transitive dependencies of eslint, so declare them. Issue: S3UTILS-249 --- package.json | 9 +- yarn.lock | 1050 +------------------------------------------------- 2 files changed, 20 insertions(+), 1039 deletions(-) diff --git a/package.json b/package.json index e04407d1..e5a076c4 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,6 @@ "httpagent": "scality/httpagent#1.1.0", "level": "^9.0.0", "mongodb": "^6.17.0", - "needle": "^3.3.1", "node-rdkafka": "^3.6.1", "node-schedule": "^2.1.1", "prom-client": "^15.1.3", @@ -51,15 +50,13 @@ }, "devDependencies": { "@aws-sdk/client-iam": "^3.962.0", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "^9.39.0", "@scality/eslint-config-scality": "scality/Guidelines#8.3.0", "@sinonjs/fake-timers": "^14.0.0", "eslint": "^9.14.0", - "eslint-plugin-import": "^2.31.0", - "eslint-plugin-jest": "^28.11.0", "jest": "^29.7.0", "mongodb-memory-server": "10.1.2", - "sinon": "^19.0.2", - "strip-ansi": "^7.1.0", - "typescript": "^4.9.5" + "sinon": "^19.0.2" } } diff --git a/yarn.lock b/yarn.lock index ad40d69a..8ef1ae3f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -810,7 +810,7 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1": +"@eslint-community/eslint-utils@^4.8.0": version "4.10.1" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz#8911bd72b2c3640a543609e0400b8c4d2e7e7cb6" integrity sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg== @@ -860,7 +860,7 @@ minimatch "^3.1.5" strip-json-comments "^3.1.1" -"@eslint/js@9.39.5": +"@eslint/js@9.39.5", "@eslint/js@^9.39.0": version "9.39.5" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.5.tgz#6f2fbcff75500d229d535e0a949ae13472c84787" integrity sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A== @@ -1601,11 +1601,6 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.2.tgz#78d476333d85d5b1c792e257bca74ba080da49a4" integrity sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug== -"@rtsao/scc@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" - integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== - "@scality/arsenal@^8.6.0": version "8.6.0" resolved "https://registry.yarnpkg.com/@scality/arsenal/-/arsenal-8.6.0.tgz#7d8422893a6f498894e04509cb07f1bcb224e5ab" @@ -2023,11 +2018,6 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - "@types/node@*", "@types/node@>=10.0.0", "@types/node@>=13.7.0": version "26.6.2" resolved "https://registry.yarnpkg.com/@types/node/-/node-26.6.2.tgz#11bfb8e00bafe728d2113e474a7637becc9ab279" @@ -2078,66 +2068,6 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/project-service@8.70.1": - version "8.70.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.70.1.tgz#d5635594cc8a573f0e15a772b1704e93a00134c1" - integrity sha512-62xOgboPfwc3/IgPSX/W6oQR3ZbF04194FPGUGH8HL8iLFHbt/456/8Ph1wLNUgVF+s94FlHoipBsz+v7+LMnA== - dependencies: - "@typescript-eslint/tsconfig-utils" "^8.70.1" - "@typescript-eslint/types" "^8.70.1" - debug "^4.4.3" - -"@typescript-eslint/scope-manager@8.70.1": - version "8.70.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.70.1.tgz#0feeae4da2d279b960cdbfe5e0a02fbf1195e93f" - integrity sha512-Pa0EeSeAusQc1WbjQMac+YfenewYTBu0KjgYvkUKwhXaHUKbFog23Dm/rp0DX/6tyYOQ3Xl1a+3EcFNZynGHCw== - dependencies: - "@typescript-eslint/types" "8.70.1" - "@typescript-eslint/visitor-keys" "8.70.1" - -"@typescript-eslint/tsconfig-utils@8.70.1", "@typescript-eslint/tsconfig-utils@^8.70.1": - version "8.70.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.70.1.tgz#e9353a6e5f3498a29b40946ca3e11f6166fef09e" - integrity sha512-jumze1fPI+sDOaM2TWGQdn39PDxTr7TZGeuyLkAbNyx2vtMT3uRnVKChN0hfht5V2TugphJzF6bYXvBcE09qqg== - -"@typescript-eslint/types@8.70.1", "@typescript-eslint/types@^8.70.1": - version "8.70.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.70.1.tgz#2022b9d07d057174eba25b9bbd289641d262a196" - integrity sha512-Dm1ypdhhrGCTyyehxElhgJ6kgk8MVCv5qXdoOVqPr1uqk42jX8KjrZqhROvdShczA8qrDoYiOWn1ykWlx2k81Q== - -"@typescript-eslint/typescript-estree@8.70.1": - version "8.70.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.70.1.tgz#ced48fee6f7043835d2edfed9786ae74813a3c99" - integrity sha512-TU8PwyGN0PQJUcE96mw8eCQ44SmxGdQlJmlWakHaHQ15eIuuvye5yNtmh/i6oS88jzXVQB71xdNkbkB/fMwL0g== - dependencies: - "@typescript-eslint/project-service" "8.70.1" - "@typescript-eslint/tsconfig-utils" "8.70.1" - "@typescript-eslint/types" "8.70.1" - "@typescript-eslint/visitor-keys" "8.70.1" - debug "^4.4.3" - minimatch "^10.2.2" - semver "^7.7.3" - tinyglobby "^0.2.15" - ts-api-utils "^2.5.0" - -"@typescript-eslint/utils@^6.0.0 || ^7.0.0 || ^8.0.0": - version "8.70.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.70.1.tgz#6a97887cee702df513692f5cdc7f79baeef48e02" - integrity sha512-Esgul8MsnKnRLdYU2Eb2cRV9bS5HJYtKj1ByJnOzzG2M58DGdSUQ1jUuILxipqcpB2h9WLrbD5GijIWUjX/Tqw== - dependencies: - "@eslint-community/eslint-utils" "^4.9.1" - "@typescript-eslint/scope-manager" "8.70.1" - "@typescript-eslint/types" "8.70.1" - "@typescript-eslint/typescript-estree" "8.70.1" - -"@typescript-eslint/visitor-keys@8.70.1": - version "8.70.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.70.1.tgz#b4cde0ed16982bd963a6310fcae554f59fd14124" - integrity sha512-Vwj9lUIW5Xq3wQ9w6gv3R86g1hMK8f2zNOdGTAgeXUMMXFK78G9ruCjjqutHMNJc0+CH7LYRnHeUB9IT8wFmcw== - dependencies: - "@typescript-eslint/types" "8.70.1" - eslint-visitor-keys "^5.0.0" - "@typespec/ts-http-runtime@^0.3.0", "@typespec/ts-http-runtime@^0.3.4": version "0.3.9" resolved "https://registry.yarnpkg.com/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.9.tgz#332855bbd729ab36e0779b2dfc24edc920d12461" @@ -2301,79 +2231,6 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" - integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== - dependencies: - call-bound "^1.0.3" - is-array-buffer "^3.0.5" - -array-includes@^3.1.9: - version "3.2.0" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.2.0.tgz#18771e6837351aa139c3b58873371d0afa64964a" - integrity sha512-VXY5eFRarnXcYxwBjJzPmEhH55+rmP79/+ueDhi0F+TuqfHCItagIHqxeUZrmgrOPa31QTh9H85DjX3FfJ0FTg== - dependencies: - call-bind "^1.0.9" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-abstract "^1.24.2" - es-object-atoms "^1.1.2" - es-shim-unscopables "^1.1.0" - is-string "^1.1.1" - math-intrinsics "^1.1.0" - -array.prototype.findlastindex@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz#cfa1065c81dcb64e34557c9b81d012f6a421c564" - integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-abstract "^1.23.9" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - es-shim-unscopables "^1.1.0" - -array.prototype.flat@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" - integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-shim-unscopables "^1.0.2" - -array.prototype.flatmap@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" - integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-shim-unscopables "^1.0.2" - -arraybuffer.prototype.slice@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" - integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - is-array-buffer "^3.0.4" - -async-function@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" - integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== - async-mutex@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.5.0.tgz#353c69a0b9e75250971a64ac203b0ebfddd75482" @@ -2393,13 +2250,6 @@ async@~2.6.4: dependencies: lodash "^4.17.14" -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - b4a@^1.6.4, b4a@^1.8.1: version "1.9.0" resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.9.0.tgz#6336313b6e76b299c397afa68676ec6ebc788845" @@ -2473,11 +2323,6 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -balanced-match@^4.0.2: - version "4.0.4" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" - integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== - bare-events@^2.5.4, bare-events@^2.7.0: version "2.9.2" resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.9.2.tgz#01d377b64c3c7167b28b52da7add3221aecf2d7f" @@ -2584,13 +2429,6 @@ brace-expansion@^2.0.2: dependencies: balanced-match "^1.0.0" -brace-expansion@^5.0.8: - version "5.0.12" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.12.tgz#995fbb4750a77c4d16a7dc942ff2ca6ef8e675ec" - integrity sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ== - dependencies: - balanced-match "^4.0.2" - braces@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" @@ -2699,17 +2537,7 @@ call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: es-errors "^1.3.0" function-bind "^1.1.2" -call-bind@^1.0.7, call-bind@^1.0.8, call-bind@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.9.tgz#39a644700c80bc7d0ca9102fc6d1d43b2fd7eee7" - integrity sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ== - dependencies: - call-bind-apply-helpers "^1.0.2" - es-define-property "^1.0.1" - get-intrinsic "^1.3.0" - set-function-length "^1.2.2" - -call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: +call-bound@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== @@ -2908,33 +2736,6 @@ cross-spawn@^7.0.3, cross-spawn@^7.0.6: shebang-command "^2.0.0" which "^2.0.1" -data-view-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" - integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-data-view "^1.0.2" - -data-view-byte-length@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" - integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-data-view "^1.0.2" - -data-view-byte-offset@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" - integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - is-data-view "^1.0.1" - dayjs@^1.11.10: version "1.11.23" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.23.tgz#b0a363506dde5f36cf5075e42ebe8115165a8c79" @@ -2947,13 +2748,6 @@ debug@4, debug@4.4.3, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, de dependencies: ms "^2.1.3" -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - dedent@^1.0.0: version "1.7.2" resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.7.2.tgz#34e2264ab538301e27cf7b07bf2369c19baa8dd9" @@ -2982,29 +2776,11 @@ default-browser@^5.2.1: bundle-name "^4.1.0" default-browser-id "^5.0.0" -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - define-lazy-prop@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== -define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - denque@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" @@ -3030,14 +2806,7 @@ diff@^7.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -dunder-proto@^1.0.0, dunder-proto@^1.0.1: +dunder-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== @@ -3148,77 +2917,7 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract-get@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-abstract-get/-/es-abstract-get-1.0.0.tgz#1eae87101f42bedeb6a740e8c5051271aef89088" - integrity sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg== - dependencies: - es-errors "^1.3.0" - es-object-atoms "^1.1.2" - is-callable "^1.2.7" - object-inspect "^1.13.4" - -es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24.2: - version "1.24.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.2.tgz#2dbd38c180735ee983f77585140a2706a963ed9a" - integrity sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg== - dependencies: - array-buffer-byte-length "^1.0.2" - arraybuffer.prototype.slice "^1.0.4" - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - call-bound "^1.0.4" - data-view-buffer "^1.0.2" - data-view-byte-length "^1.0.2" - data-view-byte-offset "^1.0.1" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - es-set-tostringtag "^2.1.0" - es-to-primitive "^1.3.0" - function.prototype.name "^1.1.8" - get-intrinsic "^1.3.0" - get-proto "^1.0.1" - get-symbol-description "^1.1.0" - globalthis "^1.0.4" - gopd "^1.2.0" - has-property-descriptors "^1.0.2" - has-proto "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - internal-slot "^1.1.0" - is-array-buffer "^3.0.5" - is-callable "^1.2.7" - is-data-view "^1.0.2" - is-negative-zero "^2.0.3" - is-regex "^1.2.1" - is-set "^2.0.3" - is-shared-array-buffer "^1.0.4" - is-string "^1.1.1" - is-typed-array "^1.1.15" - is-weakref "^1.1.1" - math-intrinsics "^1.1.0" - object-inspect "^1.13.4" - object-keys "^1.1.1" - object.assign "^4.1.7" - own-keys "^1.0.1" - regexp.prototype.flags "^1.5.4" - safe-array-concat "^1.1.3" - safe-push-apply "^1.0.0" - safe-regex-test "^1.1.0" - set-proto "^1.0.0" - stop-iteration-iterator "^1.1.0" - string.prototype.trim "^1.2.10" - string.prototype.trimend "^1.0.9" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.3" - typed-array-byte-length "^1.0.3" - typed-array-byte-offset "^1.0.4" - typed-array-length "^1.0.7" - unbox-primitive "^1.1.0" - which-typed-array "^1.1.19" - -es-define-property@^1.0.0, es-define-property@^1.0.1: +es-define-property@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== @@ -3233,42 +2932,13 @@ es-module-lexer@^3.0.2: resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-3.0.2.tgz#8cc09097dd80a9cbb79437fd405b935cac76cda3" integrity sha512-BuIB67FngDSyQ/dpQNOZybwdEBDUGJQvOqwWr4ha/ufYiqzuEwPkKO2zLhRAgay28tStRIHUeWmszZAJo3GCOg== -es-object-atoms@^1.0.0, es-object-atoms@^1.1.1, es-object-atoms@^1.1.2: +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz#a2d0b373205724dfa525d23b0c3e1b1ca582c99b" integrity sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw== dependencies: es-errors "^1.3.0" -es-set-tostringtag@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" - integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== - dependencies: - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" - integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== - dependencies: - hasown "^2.0.2" - -es-to-primitive@^1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.4.tgz#0c854291cf0d7b439d6b9e5771ea837ffaf1f991" - integrity sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw== - dependencies: - es-abstract-get "^1.0.0" - es-define-property "^1.0.1" - es-errors "^1.3.0" - is-callable "^1.2.7" - is-date-object "^1.1.0" - is-symbol "^1.1.1" - escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" @@ -3289,54 +2959,6 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-import-resolver-node@^0.3.9: - version "0.3.10" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz#84ce3005abfc300588cf23bbac1aabec1fc6e8c1" - integrity sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ== - dependencies: - debug "^3.2.7" - is-core-module "^2.16.1" - resolve "^2.0.0-next.6" - -eslint-module-utils@^2.12.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz#611f8e1c6ceb29a93eb949e1cc670b8287764819" - integrity sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig== - dependencies: - debug "^3.2.7" - -eslint-plugin-import@^2.31.0: - version "2.32.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz#602b55faa6e4caeaa5e970c198b5c00a37708980" - integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== - dependencies: - "@rtsao/scc" "^1.1.0" - array-includes "^3.1.9" - array.prototype.findlastindex "^1.2.6" - array.prototype.flat "^1.3.3" - array.prototype.flatmap "^1.3.3" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.12.1" - hasown "^2.0.2" - is-core-module "^2.16.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.8" - object.groupby "^1.0.3" - object.values "^1.2.1" - semver "^6.3.1" - string.prototype.trimend "^1.0.9" - tsconfig-paths "^3.15.0" - -eslint-plugin-jest@^28.11.0: - version "28.14.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-28.14.0.tgz#02da77dc27d7b4c5480df3552ea26de056857b36" - integrity sha512-P9s/qXSMTpRTerE2FQ0qJet2gKbcGyFTPAJipoKxmWqR6uuFqIqk8FuEfg5yBieOezVrEfAMZrEwJ6yEp+1MFQ== - dependencies: - "@typescript-eslint/utils" "^6.0.0 || ^7.0.0 || ^8.0.0" - eslint-scope@^8.4.0: version "8.4.0" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" @@ -3355,11 +2977,6 @@ eslint-visitor-keys@^4.2.1: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== -eslint-visitor-keys@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz#9e3c9489697824d2d4ce3a8ad12628f91e9f59be" - integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== - eslint@^9.14.0: version "9.39.5" resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.5.tgz#2a4e3c8b0f753196efae943c8ffaa8730fc6a3fa" @@ -3669,13 +3286,6 @@ follow-redirects@^1.15.9: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.16.0.tgz#28474a159d3b9d11ef62050a14ed60e4df6d61bc" integrity sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw== -for-each@^0.3.3, for-each@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" - integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== - dependencies: - is-callable "^1.2.7" - foreground-child@^3.1.0: version "3.3.1" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" @@ -3716,31 +3326,6 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: - version "1.2.0" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.2.0.tgz#758f3e84fa542672454bd5e14cb081a5ce07f70c" - integrity sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew== - dependencies: - call-bind "^1.0.9" - call-bound "^1.0.4" - es-define-property "^1.0.1" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - hasown "^2.0.4" - is-callable "^1.2.7" - is-document.all "^1.0.0" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -generator-function@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/generator-function/-/generator-function-2.0.1.tgz#0e75dd410d1243687a0ba2e951b94eedb8f737a2" - integrity sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g== - gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -3751,7 +3336,7 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: +get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== @@ -3785,15 +3370,6 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-symbol-description@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" - integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" @@ -3830,15 +3406,7 @@ globals@^14.0.0: resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== -globalthis@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - -gopd@^1.0.1, gopd@^1.2.0: +gopd@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== @@ -3848,42 +3416,16 @@ graceful-fs@^4.2.6, graceful-fs@^4.2.9: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -has-bigints@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" - integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== - has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" - integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== - dependencies: - dunder-proto "^1.0.0" - -has-symbols@^1.0.3, has-symbols@^1.1.0: +has-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== -has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - hasown@^2.0.2, hasown@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.4.tgz#8c62d8cb90beb2aad5d0a5b67581ad9854c3f003" @@ -3958,7 +3500,7 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@^0.6.2, iconv-lite@^0.6.3: +iconv-lite@^0.6.2: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -4025,15 +3567,6 @@ inherits@2, inherits@^2.0.3, inherits@~2.0.4: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -internal-slot@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" - integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.2" - side-channel "^1.1.0" - ioctl@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/ioctl/-/ioctl-2.0.2.tgz#21543f661cb1b044761cbf721f5dde6be08ed060" @@ -4070,104 +3603,33 @@ ipaddr.js@^2.2.0: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.5.0.tgz#7d4b6c39f9392fb61cf807de6e425e22c10e061f" integrity sha512-aq+t5NAc+cS6rZQQVWC2x98CPqGtKKTMDd4Gaodv0wShnItdKg/51djkGJ1hqH+Oy0ivDftCbSLCQob8zso01w== -is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" - integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - get-intrinsic "^1.2.6" - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -is-async-function@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" - integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== - dependencies: - async-function "^1.0.0" - call-bound "^1.0.3" - get-proto "^1.0.1" - has-tostringtag "^1.0.2" - safe-regex-test "^1.1.0" - -is-bigint@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" - integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== - dependencies: - has-bigints "^1.0.2" - -is-boolean-object@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" - integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - is-buffer@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.16.1, is-core-module@^2.16.2: +is-core-module@^2.16.1: version "2.17.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.17.0.tgz#75c1c76236c9f7e38ddbfff292e127dc13b21027" integrity sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA== dependencies: hasown "^2.0.4" -is-data-view@^1.0.1, is-data-view@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" - integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== - dependencies: - call-bound "^1.0.2" - get-intrinsic "^1.2.6" - is-typed-array "^1.1.13" - -is-date-object@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" - integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== - dependencies: - call-bound "^1.0.2" - has-tostringtag "^1.0.2" - is-docker@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== -is-document.all@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-document.all/-/is-document.all-1.0.0.tgz#163a4bfb362c6ed7b118ce46cdecc4e37dee3195" - integrity sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g== - dependencies: - call-bound "^1.0.4" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-finalizationregistry@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" - integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== - dependencies: - call-bound "^1.0.3" - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -4178,17 +3640,6 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-generator-function@^1.0.10: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.2.tgz#ae3b61e3d5ea4e4839b90bad22b02335051a17d5" - integrity sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA== - dependencies: - call-bound "^1.0.4" - generator-function "^2.0.0" - get-proto "^1.0.1" - has-tostringtag "^1.0.2" - safe-regex-test "^1.1.0" - is-glob@^4.0.0, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -4203,24 +3654,6 @@ is-inside-container@^1.0.0: dependencies: is-docker "^3.0.0" -is-map@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" - integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== - -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" - integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -4231,82 +3664,16 @@ is-promise@^4.0.0: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== -is-regex@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" - integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== - dependencies: - call-bound "^1.0.2" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -is-set@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" - integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== - -is-shared-array-buffer@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" - integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== - dependencies: - call-bound "^1.0.3" - is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-string@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" - integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-symbol@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" - integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== - dependencies: - call-bound "^1.0.2" - has-symbols "^1.1.0" - safe-regex-test "^1.1.0" - -is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" - integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== - dependencies: - which-typed-array "^1.1.16" - is-unsafe@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/is-unsafe/-/is-unsafe-2.0.2.tgz#bb1ead17f1aa688f6433258b561e98b1a45a1afc" integrity sha512-HgbIHPBH0KHHCcjLfGsCvhtPTVxjaAZlXjwdz7/GQC40SjSe4sfQsar8J5VFo8JOSbarkpV0OLG95bbaNd9aAQ== -is-weakmap@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" - integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== - -is-weakref@^1.0.2, is-weakref@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" - integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== - dependencies: - call-bound "^1.0.3" - -is-weakset@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" - integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== - dependencies: - call-bound "^1.0.3" - get-intrinsic "^1.2.6" - is-wsl@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.1.tgz#327897b26832a3eb117da6c27492d04ca132594f" @@ -4314,11 +3681,6 @@ is-wsl@^3.1.0: dependencies: is-inside-container "^1.0.0" -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -4812,13 +4174,6 @@ json-with-bigint@^3.5.3: resolved "https://registry.yarnpkg.com/json-with-bigint/-/json-with-bigint-3.5.12.tgz#9f6bf722a9847ed72fa9b217b2b66181227c454c" integrity sha512-uwbF/wSSuOgC7qqlq27Xp5B6a2MHVug3t0idZdTqu0JnlFvgJuH7ju+KAk/J06C7GfhoYy2gnb9wz2INqcne7w== -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" @@ -5166,14 +4521,7 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@^10.2.2: - version "10.2.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.6.tgz#fd956bbe0b77241e9f15ac5dccb1c638060968ef" - integrity sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A== - dependencies: - brace-expansion "^5.0.8" - -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2, minimatch@^3.1.5: +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== @@ -5187,11 +4535,6 @@ minimatch@^9.0.4: dependencies: brace-expansion "^2.0.2" -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - minipass-collect@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-2.0.1.tgz#1621bc77e12258a12c60d34e2276ec5c20680863" @@ -5323,14 +4666,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -needle@^3.3.1: - version "3.5.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-3.5.0.tgz#aa2023642cb41b11a11babb733fd8fa952919112" - integrity sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w== - dependencies: - iconv-lite "^0.6.3" - sax "^1.2.4" - negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -5365,16 +4700,6 @@ node-addon-api@^8.3.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-8.9.2.tgz#db7ac94a13ffd9b55e6cb04584bd5ef8e1d74b18" integrity sha512-VijLXbi3UACN69I0JVXJsX4tjACjNoQDgv2gTF6sx2wWEi8tkSg2eX8p5gSIFi8z2+DL3oHmY6OyKce38SDolg== -node-exports-info@^1.6.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/node-exports-info/-/node-exports-info-1.6.2.tgz#243a3105677d6781cd26e6a72350fd928a5cb46f" - integrity sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag== - dependencies: - array.prototype.flatmap "^1.3.3" - es-errors "^1.3.0" - object.entries "^1.1.9" - semver "^6.3.1" - node-gyp-build@^4.3.0: version "4.8.4" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" @@ -5452,62 +4777,6 @@ object-inspect@^1.13.3, object-inspect@^1.13.4: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.7: - version "4.1.7" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" - integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - has-symbols "^1.1.0" - object-keys "^1.1.1" - -object.entries@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.9.tgz#e4770a6a1444afb61bd39f984018b5bede25f8b3" - integrity sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-object-atoms "^1.1.1" - -object.fromentries@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.groupby@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.values@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" - integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - on-finished@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -5551,16 +4820,6 @@ optionator@^0.9.3: type-check "^0.4.0" word-wrap "^1.2.5" -own-keys@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.2.tgz#31448ec1f781ecb1447f6f6aa0d6534222af59de" - integrity sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg== - dependencies: - call-bound "^1.0.4" - get-intrinsic "^1.3.0" - object-keys "^1.1.1" - safe-push-apply "^1.0.0" - p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -5696,11 +4955,6 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -possible-typed-array-names@^1.0.0, possible-typed-array-names@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" - integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -5828,32 +5082,6 @@ redis-parser@3.0.0: dependencies: redis-errors "^1.0.0" -reflect.getprototypeof@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" - integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.9" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.7" - get-proto "^1.0.1" - which-builtin-type "^1.2.1" - -regexp.prototype.flags@^1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" - integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-errors "^1.3.0" - get-proto "^1.0.1" - gopd "^1.2.0" - set-function-name "^2.0.2" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -5899,18 +5127,6 @@ resolve@^1.20.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.6: - version "2.0.0-next.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.7.tgz#ba3b035d4b1ee7c522426eee73cabcb0fd5515dd" - integrity sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ== - dependencies: - es-errors "^1.3.0" - is-core-module "^2.16.2" - node-exports-info "^1.6.0" - object-keys "^1.1.1" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -5932,17 +5148,6 @@ run-applescript@^7.0.0: resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.1.0.tgz#2e9e54c4664ec3106c5b5630e249d3d6595c4911" integrity sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q== -safe-array-concat@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.4.tgz#a54cc9b61a57f33b42abad3cbdda3a2b38cc5719" - integrity sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg== - dependencies: - call-bind "^1.0.9" - call-bound "^1.0.4" - get-intrinsic "^1.3.0" - has-symbols "^1.1.0" - isarray "^2.0.5" - safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -5953,29 +5158,12 @@ safe-json-stringify@^1.2.0: resolved "https://registry.yarnpkg.com/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz#356e44bc98f1f93ce45df14bcd7c01cda86e0afd" integrity sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg== -safe-push-apply@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" - integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== - dependencies: - es-errors "^1.3.0" - isarray "^2.0.5" - -safe-regex-test@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" - integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - is-regex "^1.2.1" - "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@>=0.6.0, sax@^1.2.4: +sax@>=0.6.0: version "1.6.1" resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.1.tgz#4c23cf608c0b693ab54b4b5888e92cfe977b9843" integrity sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q== @@ -5985,7 +5173,7 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3, semver@^7.7.3: +semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3: version "7.8.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.5.tgz#39b646037dd50c14fb451e7e4cac58ed8b863f69" integrity sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA== @@ -6017,37 +5205,6 @@ serve-static@^2.2.0: parseurl "^1.3.3" send "^1.2.0" -set-function-length@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -set-proto@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" - integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== - dependencies: - dunder-proto "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - setprototypeof@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" @@ -6094,7 +5251,7 @@ side-channel-weakmap@^1.0.2: object-inspect "^1.13.3" side-channel-map "^1.0.1" -side-channel@^1.1.0, side-channel@^1.1.1: +side-channel@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.1.tgz#ea02c62e05dc4bea67d4442f0fb71ee192f8e0ab" integrity sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ== @@ -6269,14 +5426,6 @@ statuses@^2.0.1, statuses@^2.0.2, statuses@~2.0.2: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== -stop-iteration-iterator@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" - integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== - dependencies: - es-errors "^1.3.0" - internal-slot "^1.1.0" - stream-browserify@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" @@ -6329,39 +5478,6 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string.prototype.trim@^1.2.10: - version "1.2.11" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz#e6bd19cda3985d05a42dda31f3ddf4d35d3430e3" - integrity sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w== - dependencies: - call-bind "^1.0.9" - call-bound "^1.0.4" - define-data-property "^1.1.4" - define-properties "^1.2.1" - es-abstract "^1.24.2" - es-object-atoms "^1.1.2" - has-property-descriptors "^1.0.2" - safe-regex-test "^1.1.0" - -string.prototype.trimend@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz#be6bcf4f3fe0460bdeccdb2cf4f971b310f8346e" - integrity sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw== - dependencies: - call-bind "^1.0.9" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-object-atoms "^1.1.2" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -6383,18 +5499,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1, strip-ansi@^7.1.0: +strip-ansi@^7.0.1: version "7.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.2.0.tgz#d22a269522836a627af8d04b5c3fd2c7fa3e32e3" integrity sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w== dependencies: ansi-regex "^6.2.2" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - strip-bom@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" @@ -6492,7 +5603,7 @@ text-decoder@^1.1.0: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -tinyglobby@^0.2.12, tinyglobby@^0.2.15: +tinyglobby@^0.2.12: version "0.2.17" resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.17.tgz#562a9a6c9eb2b3b123d39719f9af5bb44fcd7631" integrity sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g== @@ -6524,21 +5635,6 @@ tr46@^5.1.0: dependencies: punycode "^2.3.1" -ts-api-utils@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz#4acd4a155e22734990a5ed1fe9e97f113bcb37c1" - integrity sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA== - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - tslib@^2.2.0, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.2, tslib@^2.7.0, tslib@^2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" @@ -6575,70 +5671,11 @@ type-is@^2.0.1, type-is@^2.1.0: media-typer "^1.1.0" mime-types "^3.0.0" -typed-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" - integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-typed-array "^1.1.14" - -typed-array-byte-length@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" - integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== - dependencies: - call-bind "^1.0.8" - for-each "^0.3.3" - gopd "^1.2.0" - has-proto "^1.2.0" - is-typed-array "^1.1.14" - -typed-array-byte-offset@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.5.tgz#c076d6a0db563933154b3c442204b614bf0d7b15" - integrity sha512-0FHJvLPqZ7KJzp17O13jfsAjsqazgrxBu2zEK95PmUz8lv2+GjRuxUInCr2Rk9Dms3ihN21zJ929ZO43yJ95QQ== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.9" - for-each "^0.3.5" - gopd "^1.2.0" - is-typed-array "^1.1.15" - reflect.getprototypeof "^1.0.10" - -typed-array-length@^1.0.7: - version "1.0.8" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.8.tgz#0b70e982c9e9dafe2def6d6458ff4b3f2d2b6d70" - integrity sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g== - dependencies: - call-bind "^1.0.9" - for-each "^0.3.5" - gopd "^1.2.0" - is-typed-array "^1.1.15" - possible-typed-array-names "^1.1.0" - reflect.getprototypeof "^1.0.10" - -typescript@^4.9.5: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== -unbox-primitive@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" - integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== - dependencies: - call-bound "^1.0.3" - has-bigints "^1.0.2" - has-symbols "^1.1.0" - which-boxed-primitive "^1.1.1" - "undici-types@>=7.24.0 <7.24.7": version "7.24.6" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.24.6.tgz#61275b485d7fd4e9d269c7cf04ec2873c9cc0f91" @@ -6764,59 +5801,6 @@ werelogs@scality/werelogs#8.2.5, "werelogs@scality/werelogs#semver:^8.2.4": tr46 "^5.1.0" webidl-conversions "^7.0.0" -which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" - integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== - dependencies: - is-bigint "^1.1.0" - is-boolean-object "^1.2.1" - is-number-object "^1.1.1" - is-string "^1.1.1" - is-symbol "^1.1.1" - -which-builtin-type@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" - integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== - dependencies: - call-bound "^1.0.2" - function.prototype.name "^1.1.6" - has-tostringtag "^1.0.2" - is-async-function "^2.0.0" - is-date-object "^1.1.0" - is-finalizationregistry "^1.1.0" - is-generator-function "^1.0.10" - is-regex "^1.2.1" - is-weakref "^1.0.2" - isarray "^2.0.5" - which-boxed-primitive "^1.1.0" - which-collection "^1.0.2" - which-typed-array "^1.1.16" - -which-collection@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" - integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== - dependencies: - is-map "^2.0.3" - is-set "^2.0.3" - is-weakmap "^2.0.2" - is-weakset "^2.0.3" - -which-typed-array@^1.1.16, which-typed-array@^1.1.19: - version "1.1.24" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.24.tgz#211f5877c29e6213d50e8f2dce4ac9ca2d0008cf" - integrity sha512-wk4Mf4pR5mRP7eYuuTBCIQ9d0ud2Fv2jRLQpfgnRjbOxAFHmjKFValgTpitVKzJJS8ajnYQV2Du1SZ8j6b/EUQ== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.9" - call-bound "^1.0.4" - for-each "^0.3.5" - get-proto "^1.0.1" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" From 52e485d3b5c2afde0a62db7de7a3502dc4403280 Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Thu, 15 Oct 2026 14:49:29 +0200 Subject: [PATCH 09/12] Update the test tooling Move to Jest 30, sinon 22 and fake-timers 15, and bring eslint to the latest 9.x. Jest 30 renamed --testPathPattern to --testPathPatterns, and objectContaining no longer matches functions, so the replication updater tests now compare the command class directly instead of its name. mongodb-memory-server stays on 10.x: moving to 11 would change the MongoDB version the tests run against. Issue: S3UTILS-249 --- package.json | 12 +- tests/unit/CRR/ReplicationStatusUpdater.js | 41 +- yarn.lock | 1818 +++++++++++--------- 3 files changed, 1017 insertions(+), 854 deletions(-) diff --git a/package.json b/package.json index e5a076c4..38b7f25d 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,8 @@ "scripts": { "lint": "eslint $(git ls-files '*.js')", "jest": "NODE_OPTIONS='--experimental-vm-modules' jest", - "test:unit": "LOCATION_CONFIG_FILE='tests/conf/locationConfig.json' yarn jest --verbose --logHeapUsage --projects jest.config.js --coverage --coverageDirectory=coverage/unit --testPathPattern='tests/unit/[\\w/-]+\\.[tj]s'", - "test:functional": "LOCATION_CONFIG_FILE='tests/conf/locationConfig.json' yarn jest --verbose --logHeapUsage --projects jest.config.js --coverage --coverageDirectory=coverage/functional --testPathPattern='tests/functional/[\\w/-]+\\.[tj]s'" + "test:unit": "LOCATION_CONFIG_FILE='tests/conf/locationConfig.json' yarn jest --verbose --logHeapUsage --projects jest.config.js --coverage --coverageDirectory=coverage/unit --testPathPatterns='tests/unit/[\\w/-]+\\.[tj]s'", + "test:functional": "LOCATION_CONFIG_FILE='tests/conf/locationConfig.json' yarn jest --verbose --logHeapUsage --projects jest.config.js --coverage --coverageDirectory=coverage/functional --testPathPatterns='tests/functional/[\\w/-]+\\.[tj]s'" }, "repository": { "type": "git", @@ -53,10 +53,10 @@ "@eslint/eslintrc": "^3.3.6", "@eslint/js": "^9.39.0", "@scality/eslint-config-scality": "scality/Guidelines#8.3.0", - "@sinonjs/fake-timers": "^14.0.0", - "eslint": "^9.14.0", - "jest": "^29.7.0", + "@sinonjs/fake-timers": "^15.4.0", + "eslint": "^9.39.0", + "jest": "^30.5.2", "mongodb-memory-server": "10.1.2", - "sinon": "^19.0.2" + "sinon": "^22.1.0" } } diff --git a/tests/unit/CRR/ReplicationStatusUpdater.js b/tests/unit/CRR/ReplicationStatusUpdater.js index a9d3de9c..ec77a2a0 100644 --- a/tests/unit/CRR/ReplicationStatusUpdater.js +++ b/tests/unit/CRR/ReplicationStatusUpdater.js @@ -1,6 +1,7 @@ const werelogs = require('werelogs'); const assert = require('assert'); const { models } = require('@scality/arsenal'); +const { GetBucketReplicationCommand, ListObjectVersionsCommand } = require('@aws-sdk/client-s3'); const { initializeCrrWithMocks, @@ -30,7 +31,7 @@ describe('ReplicationStatusUpdater', () => { expect(crr.s3.send).toHaveBeenCalledTimes(2); // One for listObjectVersions, one for getBucketReplication expect(crr.s3.send).toHaveBeenNthCalledWith(1, expect.objectContaining({ - constructor: expect.objectContaining({ name: 'ListObjectVersionsCommand' }), + constructor: ListObjectVersionsCommand, input: expect.objectContaining({ Bucket: 'bucket0', MaxKeys: 10, @@ -41,7 +42,7 @@ describe('ReplicationStatusUpdater', () => { })); expect(crr.s3.send).toHaveBeenNthCalledWith(2, expect.objectContaining({ - constructor: expect.objectContaining({ name: 'GetBucketReplicationCommand' }), + constructor: GetBucketReplicationCommand, input: expect.objectContaining({ Bucket: 'bucket0' }) @@ -103,7 +104,7 @@ describe('ReplicationStatusUpdater', () => { expect(crr.s3.send).toHaveBeenCalledTimes(2); expect(crr.s3.send).toHaveBeenNthCalledWith(1, expect.objectContaining({ - constructor: expect.objectContaining({ name: 'ListObjectVersionsCommand' }), + constructor: ListObjectVersionsCommand, input: expect.objectContaining({ Bucket: 'bucket0', MaxKeys: 10, @@ -114,7 +115,7 @@ describe('ReplicationStatusUpdater', () => { })); expect(crr.s3.send).toHaveBeenNthCalledWith(2, expect.objectContaining({ - constructor: expect.objectContaining({ name: 'GetBucketReplicationCommand' }), + constructor: GetBucketReplicationCommand, input: expect.objectContaining({ Bucket: 'bucket0' }) @@ -379,7 +380,7 @@ describe('ReplicationStatusUpdater', () => { expect(crr.s3.send).toHaveBeenCalledTimes(2); expect(crr.s3.send).toHaveBeenNthCalledWith(1, expect.objectContaining({ - constructor: expect.objectContaining({ name: 'ListObjectVersionsCommand' }), + constructor: ListObjectVersionsCommand, input: expect.objectContaining({ Bucket: 'bucket0', MaxKeys: 10, @@ -390,7 +391,7 @@ describe('ReplicationStatusUpdater', () => { })); expect(crr.s3.send).toHaveBeenNthCalledWith(2, expect.objectContaining({ - constructor: expect.objectContaining({ name: 'GetBucketReplicationCommand' }), + constructor: GetBucketReplicationCommand, input: expect.objectContaining({ Bucket: 'bucket0' }) @@ -431,10 +432,10 @@ describe('ReplicationStatusUpdater with specifics', () => { expect(crr.s3.send).toHaveBeenCalledTimes(2); expect(crr.s3.send).toHaveBeenNthCalledWith(1, expect.objectContaining({ - constructor: expect.objectContaining({ name: 'ListObjectVersionsCommand' }) + constructor: ListObjectVersionsCommand })); expect(crr.s3.send).toHaveBeenNthCalledWith(2, expect.objectContaining({ - constructor: expect.objectContaining({ name: 'GetBucketReplicationCommand' }) + constructor: GetBucketReplicationCommand })); expect(crr.cloudserverclient.getMetadata).toHaveBeenCalledTimes(1); @@ -463,7 +464,7 @@ describe('ReplicationStatusUpdater with specifics', () => { expect(crr.s3.send).toHaveBeenCalledTimes(4); expect(crr.s3.send).toHaveBeenNthCalledWith(1, expect.objectContaining({ - constructor: expect.objectContaining({ name: 'ListObjectVersionsCommand' }), + constructor: ListObjectVersionsCommand, input: expect.objectContaining({ Bucket: 'bucket0', Prefix: undefined, @@ -473,10 +474,10 @@ describe('ReplicationStatusUpdater with specifics', () => { }) })); expect(crr.s3.send).toHaveBeenNthCalledWith(2, expect.objectContaining({ - constructor: expect.objectContaining({ name: 'GetBucketReplicationCommand' }) + constructor: GetBucketReplicationCommand })); expect(crr.s3.send).toHaveBeenNthCalledWith(3, expect.objectContaining({ - constructor: expect.objectContaining({ name: 'ListObjectVersionsCommand' }), + constructor: ListObjectVersionsCommand, input: expect.objectContaining({ Bucket: 'bucket0', KeyMarker: 'key0', @@ -484,7 +485,7 @@ describe('ReplicationStatusUpdater with specifics', () => { }) })); expect(crr.s3.send).toHaveBeenNthCalledWith(4, expect.objectContaining({ - constructor: expect.objectContaining({ name: 'GetBucketReplicationCommand' }) + constructor: GetBucketReplicationCommand })); expect(crr.cloudserverclient.getMetadata).toHaveBeenCalledTimes(2); @@ -513,10 +514,10 @@ describe('ReplicationStatusUpdater with specifics', () => { expect(crr.s3.send).toHaveBeenCalledTimes(2); expect(crr.s3.send).toHaveBeenNthCalledWith(1, expect.objectContaining({ - constructor: expect.objectContaining({ name: 'ListObjectVersionsCommand' }) + constructor: ListObjectVersionsCommand })); expect(crr.s3.send).toHaveBeenNthCalledWith(2, expect.objectContaining({ - constructor: expect.objectContaining({ name: 'GetBucketReplicationCommand' }) + constructor: GetBucketReplicationCommand })); expect(crr.cloudserverclient.getMetadata).toHaveBeenCalledTimes(1); expect(crr.cloudserverclient.putMetadata).toHaveBeenCalledTimes(1); @@ -542,7 +543,7 @@ describe('ReplicationStatusUpdater with specifics', () => { expect(crr.s3.send).toHaveBeenCalledTimes(2); expect(crr.s3.send).toHaveBeenNthCalledWith(1, expect.objectContaining({ - constructor: expect.objectContaining({ name: 'ListObjectVersionsCommand' }), + constructor: ListObjectVersionsCommand, input: expect.objectContaining({ Bucket: 'bucket0', Prefix: undefined, @@ -570,7 +571,7 @@ describe('ReplicationStatusUpdater with specifics', () => { expect(crr.s3.send).toHaveBeenCalledTimes(2); expect(crr.s3.send).toHaveBeenNthCalledWith(1, expect.objectContaining({ - constructor: expect.objectContaining({ name: 'ListObjectVersionsCommand' }), + constructor: ListObjectVersionsCommand, input: expect.objectContaining({ Bucket: 'bucket0', Prefix: undefined, @@ -724,10 +725,10 @@ describe('ReplicationStatusUpdater with currentVersionOnly', () => { expect(crr.s3.send).toHaveBeenCalledTimes(2); expect(crr.s3.send).toHaveBeenNthCalledWith(1, expect.objectContaining({ - constructor: expect.objectContaining({ name: 'ListObjectVersionsCommand' }) + constructor: ListObjectVersionsCommand })); expect(crr.s3.send).toHaveBeenNthCalledWith(2, expect.objectContaining({ - constructor: expect.objectContaining({ name: 'GetBucketReplicationCommand' }) + constructor: GetBucketReplicationCommand })); expect(crr.cloudserverclient.getMetadata).toHaveBeenCalledTimes(2); @@ -805,10 +806,10 @@ describe('ReplicationStatusUpdater with currentVersionOnly', () => { expect(crr.s3.send).toHaveBeenCalledTimes(2); expect(crr.s3.send).toHaveBeenNthCalledWith(1, expect.objectContaining({ - constructor: expect.objectContaining({ name: 'ListObjectVersionsCommand' }) + constructor: ListObjectVersionsCommand })); expect(crr.s3.send).toHaveBeenNthCalledWith(2, expect.objectContaining({ - constructor: expect.objectContaining({ name: 'GetBucketReplicationCommand' }) + constructor: GetBucketReplicationCommand })); expect(crr.cloudserverclient.getMetadata).toHaveBeenCalledTimes(2); diff --git a/yarn.lock b/yarn.lock index 8ef1ae3f..8338bb20 100644 --- a/yarn.lock +++ b/yarn.lock @@ -542,7 +542,7 @@ events "^3.3.0" tslib "^2.8.1" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.29.7": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.27.1", "@babel/code-frame@^7.29.7": version "7.29.7" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.7.tgz#f2fbbfea87c44a21590ec515b778b2c26d8866e7" integrity sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw== @@ -556,7 +556,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.7.tgz#6f0237f0f36d2e51c0570a636faed9d2d0efe629" integrity sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": +"@babel/core@^7.23.9", "@babel/core@^7.27.4": version "7.29.7" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.7.tgz#80c10b17248082968b57a857b91640971f2070f7" integrity sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA== @@ -577,7 +577,7 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.29.7", "@babel/generator@^7.29.8", "@babel/generator@^7.7.2": +"@babel/generator@^7.27.5", "@babel/generator@^7.29.7", "@babel/generator@^7.29.8": version "7.29.8" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.8.tgz#4b0b887885422643339e09022148a4c4ebaa4979" integrity sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg== @@ -649,7 +649,7 @@ "@babel/template" "^7.29.7" "@babel/types" "^7.29.7" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.29.7", "@babel/parser@^7.29.8": +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.29.7", "@babel/parser@^7.29.8": version "7.29.9" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.9.tgz#e7ee0a24f752c5296c6455855ccb72662e67ea96" integrity sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA== @@ -705,7 +705,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.7.2": +"@babel/plugin-syntax-jsx@^7.27.1": version "7.29.7" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz#622c16f9ad63782fe6e83dadc7e40330744b7f1e" integrity sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A== @@ -768,14 +768,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.7.2": +"@babel/plugin-syntax-typescript@^7.27.1": version "7.29.7" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz#7c29388932313ed58413a0343048d75d92fb5b24" integrity sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA== dependencies: "@babel/helper-plugin-utils" "^7.29.7" -"@babel/template@^7.29.7", "@babel/template@^7.3.3": +"@babel/template@^7.29.7": version "7.29.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.29.7.tgz#4d9d4004f645cdd304de958c725162784ecac700" integrity sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg== @@ -797,7 +797,7 @@ "@babel/types" "^7.29.8" debug "^4.3.1" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.28.2", "@babel/types@^7.29.7", "@babel/types@^7.29.8", "@babel/types@^7.3.3": +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.29.7", "@babel/types@^7.29.8": version "7.29.8" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.8.tgz#1229eef31d85156d70fa3f4cd859376d0eaf6863" integrity sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg== @@ -810,6 +810,28 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@emnapi/core@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.10.0.tgz#380ccc8f2412ea22d1d972df7f8ee23a3b9c7467" + integrity sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw== + dependencies: + "@emnapi/wasi-threads" "1.2.1" + tslib "^2.4.0" + +"@emnapi/runtime@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.10.0.tgz#4b260c0d3534204e98c6110b8db1a987d26ec87c" + integrity sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA== + dependencies: + tslib "^2.4.0" + +"@emnapi/wasi-threads@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz#28fed21a1ba1ce797c44a070abc94d42f3ae8548" + integrity sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w== + dependencies: + tslib "^2.4.0" + "@eslint-community/eslint-utils@^4.8.0": version "4.10.1" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz#8911bd72b2c3640a543609e0400b8c4d2e7e7cb6" @@ -1001,197 +1023,235 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.6.tgz#8dc9afa2ac1506cb1a58f89940f1c124446c8df3" integrity sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw== -"@jest/console@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" - integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== +"@jest/console@30.5.2": + version "30.5.2" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-30.5.2.tgz#7c5d610e9a3a4edd96ecebbb332a64aaefb030d8" + integrity sha512-e8sQC4pCMHPBrPX7Hk8TJr+DM5dkUnImSTNag8SEWFAFAF6xIz4AJvCKapnrdHnZxep4bxw4PhG+ZbimYBMyKw== dependencies: - "@jest/types" "^29.6.3" + "@jest/types" "30.5.1" "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" + chalk "^4.1.2" + jest-message-util "30.5.1" + jest-util "30.5.1" slash "^3.0.0" -"@jest/core@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" - integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== - dependencies: - "@jest/console" "^29.7.0" - "@jest/reporters" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" +"@jest/core@30.5.2": + version "30.5.2" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-30.5.2.tgz#79ca6ec15ec407380a9202e861aee314c294c9f3" + integrity sha512-/jqvFWoJF7LV1a6AUpYMbMm+2yIYsHJfR474H0SCzr9k8tnO/jl9wRg6zSG6lxgf6EozNlCG4amFzWsbZSvvZA== + dependencies: + "@jest/console" "30.5.2" + "@jest/pattern" "30.5.0" + "@jest/reporters" "30.5.2" + "@jest/test-result" "30.5.2" + "@jest/transform" "30.5.2" + "@jest/types" "30.5.1" "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.7.0" - jest-config "^29.7.0" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-resolve-dependencies "^29.7.0" - jest-runner "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - jest-watcher "^29.7.0" - micromatch "^4.0.4" - pretty-format "^29.7.0" + ansi-escapes "^4.3.2" + chalk "^4.1.2" + ci-info "^4.2.0" + exit-x "^0.2.2" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.11" + jest-changed-files "30.5.1" + jest-config "30.5.2" + jest-haste-map "30.5.1" + jest-message-util "30.5.1" + jest-regex-util "30.5.0" + jest-resolve "30.5.1" + jest-resolve-dependencies "30.5.2" + jest-runner "30.5.2" + jest-runtime "30.5.2" + jest-snapshot "30.5.2" + jest-util "30.5.1" + jest-validate "30.5.1" + jest-watcher "30.5.2" + pretty-format "30.5.1" slash "^3.0.0" - strip-ansi "^6.0.0" -"@jest/environment@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" - integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== +"@jest/diff-sequences@30.5.0": + version "30.5.0" + resolved "https://registry.yarnpkg.com/@jest/diff-sequences/-/diff-sequences-30.5.0.tgz#b896d470df751cc0c7d1a0c5078f80a67ce108d4" + integrity sha512-OsqBjHXCn8cadasoAZBP6nWYvMsRhpMzGXTpxJ5aO04NlbdhIz+FVe3q49l0AwVhsz/cEmIpBes6gAFl1/dWQg== + +"@jest/environment@30.5.2": + version "30.5.2" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-30.5.2.tgz#9f28a93aaa5569dab513c358843bec855c154b6d" + integrity sha512-nwFPOUMbmsjNNRCpnJpB9HbSZu4C07wDDds++5j+j1MezzPLxMPDdbdUVjr2o4RULDOValnDd70taPFI1EtxAg== dependencies: - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" + "@jest/fake-timers" "30.5.2" + "@jest/types" "30.5.1" "@types/node" "*" - jest-mock "^29.7.0" + jest-mock "30.5.2" -"@jest/expect-utils@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" - integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== +"@jest/expect-utils@30.5.2": + version "30.5.2" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-30.5.2.tgz#448c3f7bdc3d8f8afa794c839550cdd72962c0db" + integrity sha512-d/HOLSrJUlBIl6n3LzOa7cjW3xdePm5H5gQw2lixZ/0h157l9sw3mLblzFqnPcTbhDzhRQdBOX3A3KcG73nm5Q== dependencies: - jest-get-type "^29.6.3" + "@jest/get-type" "30.5.0" -"@jest/expect@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" - integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== +"@jest/expect@30.5.2": + version "30.5.2" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-30.5.2.tgz#28f85a12a0adc8910cee9d9e98cc147be84a3dd5" + integrity sha512-2E+1Pg6jJxbRjLNLpciC71iri/3qsKJL222/aXJEFwC0VdUSvfS+JZQQLEVjUYYc8t8pQu2MGE3cF2+bNTYRsg== dependencies: - expect "^29.7.0" - jest-snapshot "^29.7.0" + expect "30.5.2" + jest-snapshot "30.5.2" -"@jest/fake-timers@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" - integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== +"@jest/fake-timers@30.5.2": + version "30.5.2" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-30.5.2.tgz#ce33f0db5dbd116ac9299c59550f9083f0f8a889" + integrity sha512-GKk0h0tKT5SpDPxDhPg3r9mm5s8/YCBzVNMOGdRiQXwUiMsjU10mVPlMaQstH6/cu50vOb8N9oQUMETHuwwxKw== dependencies: - "@jest/types" "^29.6.3" - "@sinonjs/fake-timers" "^10.0.2" + "@jest/types" "30.5.1" + "@sinonjs/fake-timers" "^15.4.0" "@types/node" "*" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -"@jest/globals@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" - integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + jest-message-util "30.5.1" + jest-mock "30.5.2" + jest-util "30.5.1" + +"@jest/get-type@30.5.0": + version "30.5.0" + resolved "https://registry.yarnpkg.com/@jest/get-type/-/get-type-30.5.0.tgz#0fc76dd792523bf05d7715a18041c185f9128cc4" + integrity sha512-9/2VUPitAjmBzbvDvqrxmvB7BzWsBW0WmkkojX1ODuxX1NLGxx9gfaZpHB0z8DtJ9uhGNmZG/VXBhf8uO0OV8Q== + +"@jest/globals@30.5.2": + version "30.5.2" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-30.5.2.tgz#6e89c0b6334fc4b9cd9b18fa4495edc7783e856f" + integrity sha512-62zfS+dL+M5aTNHXCNLyqD+j4oqxTIzDYrZbpqMP8Yn+gvlAGyzC6BSPNb1ZmFOakV1RtFYX/O3FCQXSWmQdgg== + dependencies: + "@jest/environment" "30.5.2" + "@jest/expect" "30.5.2" + "@jest/types" "30.5.1" + jest-mock "30.5.2" + +"@jest/pattern@30.5.0": + version "30.5.0" + resolved "https://registry.yarnpkg.com/@jest/pattern/-/pattern-30.5.0.tgz#9f5dd0596a684b81eba2d7c1dfdca8d09978d326" + integrity sha512-HdNQYSdRTEBNrginaqzQtTjG0HRMfrra/z6Ok7uL3S87vSlarIVohEsJsSj5edu3MiHoHjAkvPROz5ZjoKai+w== dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/types" "^29.6.3" - jest-mock "^29.7.0" + "@types/node" "*" + jest-regex-util "30.5.0" -"@jest/reporters@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" - integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== +"@jest/react-is-18@npm:react-is@^18.3.1": + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== + +"@jest/react-is-19@npm:react-is@^19.2.5": + version "19.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.3.1.tgz#81f7f7e431fc9b5bd9781b0a9f19997f08dee51b" + integrity sha512-RRieF6IyxQBkcK6pP8xOHprLTPW6QjRkbGdImtqNme+/hYVwCZkLQLdlZGOhUqXwkS9IEynaGvPJtv6XB/cz0Q== + +"@jest/reporters@30.5.2": + version "30.5.2" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-30.5.2.tgz#bbcf02e1532b9565c0fd90e805ac364df753b81a" + integrity sha512-ev6E9iG73twQcfAfoTnviuYkr3yOrYbzAtMFCimv2fxHXPIp9PBt2u1wNMt0aYWgl8FPwIcS8oqRJg6alnht4Q== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" + "@jest/console" "30.5.2" + "@jest/test-result" "30.5.2" + "@jest/transform" "30.5.2" + "@jest/types" "30.5.1" + "@jridgewell/trace-mapping" "^0.3.31" "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" + chalk "^4.1.2" + collect-v8-coverage "^1.0.2" + exit-x "^0.2.2" + glob "^13.0.6" + graceful-fs "^4.2.11" istanbul-lib-coverage "^3.0.0" istanbul-lib-instrument "^6.0.0" istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" + istanbul-lib-source-maps "^5.0.0" istanbul-reports "^3.1.3" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - jest-worker "^29.7.0" + jest-message-util "30.5.1" + jest-util "30.5.1" + jest-worker "30.5.1" slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" + string-length "^4.0.2" v8-to-istanbul "^9.0.1" -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== +"@jest/schemas@30.5.0": + version "30.5.0" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-30.5.0.tgz#781f142de46345b903f43140b15865732abfd356" + integrity sha512-/hunigyNpc4RCjC0VaW3f5RCUZVM2+WQ65qP7z083Gmvac7or2LI50XVNOtE4YPgBpV0yxYiAgorAPGniCoJmg== dependencies: - "@sinclair/typebox" "^0.27.8" + "@sinclair/typebox" "^0.34.0" -"@jest/source-map@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" - integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== +"@jest/snapshot-utils@30.5.1": + version "30.5.1" + resolved "https://registry.yarnpkg.com/@jest/snapshot-utils/-/snapshot-utils-30.5.1.tgz#172720d0546ab05d5a7dc7fa3feb74c166c96310" + integrity sha512-V3wnxNtiVmw5PPVg433Cn3VdXnsOeu/ofLw3KC04Bn2y1wIlU5kozXQn48rhrgj/02LrCVtntTEF1yBha0XSUw== dependencies: - "@jridgewell/trace-mapping" "^0.3.18" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" - integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== - dependencies: - "@jest/console" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" - integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== - dependencies: - "@jest/test-result" "^29.7.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" + "@jest/types" "30.5.1" + chalk "^4.1.2" + graceful-fs "^4.2.11" + natural-compare "^1.4.0" + +"@jest/source-map@30.5.2": + version "30.5.2" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-30.5.2.tgz#454b15d5709e7b6d81cb5619d68106482b424da0" + integrity sha512-c5CehvkbfHX6yyNg7bMn2ylqlp9AHXuZ/3hPH/Lh5bxD/vefd/lV9HBjMqXef9yQNqkdwyZvkLSVSwB38hy8Qw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.31" + callsites "^3.1.0" + convert-source-map "^2.0.0" + graceful-fs "^4.2.11" + +"@jest/test-result@30.5.2": + version "30.5.2" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-30.5.2.tgz#eac81c284adc34a5be311d877f7f6b18173e38ae" + integrity sha512-eO6YU5rsLfs60ne694e0IAmRgeBnoA8mu0nlxXDbl/1j5km0o2vO9/VbbUIKIH+WRKKEI+ELgwraRGn2Lhep8g== + dependencies: + "@jest/console" "30.5.2" + "@jest/types" "30.5.1" + "@types/istanbul-lib-coverage" "^2.0.6" + collect-v8-coverage "^1.0.2" + +"@jest/test-sequencer@30.5.2": + version "30.5.2" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-30.5.2.tgz#6ddef45f8f8be150482e6e8a58eaae24f114495a" + integrity sha512-bmij8jZyYAC47ExT2GeP7PcrlwSNS+Bp3KeRuBH88gpcxqDv6fljN8PemS4J/lLZ79xb6mpaennQTTq0zUAVVg== + dependencies: + "@jest/test-result" "30.5.2" + graceful-fs "^4.2.11" + jest-haste-map "30.5.1" slash "^3.0.0" -"@jest/transform@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" - integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== +"@jest/transform@30.5.2": + version "30.5.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-30.5.2.tgz#3b4a7d43b3ba4ee1926cfcca8e271eb47d65a5d6" + integrity sha512-LBGwmaE886C41jDZ65eqR1YbXM7642MK3ZhTowZd5+xDlrDLuf4ePuDdDmVSvcr8NTVJ3MqxLkMbUCzuigUaoQ== dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" + "@babel/core" "^7.27.4" + "@jest/types" "30.5.1" + "@jridgewell/trace-mapping" "^0.3.31" + babel-plugin-istanbul "^8.0.0" + chalk "^4.1.2" convert-source-map "^2.0.0" fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - micromatch "^4.0.4" - pirates "^4.0.4" + graceful-fs "^4.2.11" + jest-haste-map "30.5.1" + jest-regex-util "30.5.0" + jest-util "30.5.1" + pirates "^4.0.7" slash "^3.0.0" - write-file-atomic "^4.0.2" + write-file-atomic "^5.0.1" -"@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== +"@jest/types@30.5.1": + version "30.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-30.5.1.tgz#dc08c773401c18ea0d9ca670fb4a10a22c8a4fb5" + integrity sha512-LvVYn83nnXPl+Rg98nvcFgjx6nRMTArhSn6RAX/w3ELn54S8A42TYZvsCMdGUqTM8S0wyXbtlQdU6Hi6dykj9g== dependencies: - "@jest/schemas" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" + "@jest/pattern" "30.5.0" + "@jest/schemas" "30.5.0" + "@types/istanbul-lib-coverage" "^2.0.6" + "@types/istanbul-reports" "^3.0.4" "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" + "@types/yargs" "^17.0.33" + chalk "^4.1.2" "@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": version "0.3.13" @@ -1219,7 +1279,7 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz#f4c663e862f06dc98ca4d453862c46902789a18d" integrity sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.23", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28", "@jridgewell/trace-mapping@^0.3.31": version "0.3.31" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== @@ -1244,6 +1304,13 @@ dependencies: sparse-bitfield "^3.0.3" +"@napi-rs/wasm-runtime@^1.1.4": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.5.tgz#8c728c07e2543d80e55ccb34158c4ae9d6bd13e8" + integrity sha512-HshSvXzmBxNzqejd3k/KemgQ3hdREUYFRRrgxOZ+gPljDIsO2SDZrVZMd4Z/HsxudQbE62OVyVFE8z9BCurfjA== + dependencies: + "@tybys/wasm-util" "^0.10.3" + "@nodable/entities@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@nodable/entities/-/entities-3.0.0.tgz#694703bc864d30eaed55c2e3def00dbd61493670" @@ -1549,11 +1616,99 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz#f3f467e36c27332f0e735ec86cdcd78dd6f27865" integrity sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg== +"@parcel/watcher-android-arm64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz#99aaa3223d43807c9340af439cad7e9b6d26ada6" + integrity sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA== + +"@parcel/watcher-darwin-arm64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz#024496e586b4744f09ce532bbe89fe38ef02a64e" + integrity sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw== + +"@parcel/watcher-darwin-x64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz#a4621df1359a93d39a332d9bab5ff09016a0608f" + integrity sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw== + +"@parcel/watcher-freebsd-x64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz#7f565ed1a5b3a5e604e6a4799121518265d62a3d" + integrity sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ== + +"@parcel/watcher-linux-arm-glibc@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz#ad7d3825e67b81999165da42593022045abc0889" + integrity sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg== + +"@parcel/watcher-linux-arm-musl@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz#fe7d1cccb2c483215c090e938cf5cf404d2f9a8c" + integrity sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw== + +"@parcel/watcher-linux-arm64-glibc@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz#7e239dcb4646c4c79f006a7131a48238249530da" + integrity sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g== + +"@parcel/watcher-linux-arm64-musl@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz#c58b8d9c6d8d81594be00dd83aab741c1aaf7e0e" + integrity sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA== + +"@parcel/watcher-linux-x64-glibc@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz#5184fa9a770478d86e56875f4ee163a0abdc8791" + integrity sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A== + +"@parcel/watcher-linux-x64-musl@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz#2d1c55aa7246cbc7670e2612058a8a542c9cf246" + integrity sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw== + +"@parcel/watcher-win32-arm64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz#15e09432040fee9e2213aa9c10ed589012526def" + integrity sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ== + +"@parcel/watcher-win32-x64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz#9bee199a2a4accd557b451ac2c1c793f305ae012" + integrity sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A== + +"@parcel/watcher@^2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.6.0.tgz#99661f6220070b76a766aba6b7e313a087a1be4f" + integrity sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w== + dependencies: + detect-libc "^2.0.3" + is-glob "^4.0.3" + node-addon-api "^7.0.0" + picomatch "^4.0.4" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.6.0" + "@parcel/watcher-darwin-arm64" "2.6.0" + "@parcel/watcher-darwin-x64" "2.6.0" + "@parcel/watcher-freebsd-x64" "2.6.0" + "@parcel/watcher-linux-arm-glibc" "2.6.0" + "@parcel/watcher-linux-arm-musl" "2.6.0" + "@parcel/watcher-linux-arm64-glibc" "2.6.0" + "@parcel/watcher-linux-arm64-musl" "2.6.0" + "@parcel/watcher-linux-x64-glibc" "2.6.0" + "@parcel/watcher-linux-x64-musl" "2.6.0" + "@parcel/watcher-win32-arm64" "2.6.0" + "@parcel/watcher-win32-x64" "2.6.0" + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@pkgr/core@^0.3.6": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.3.6.tgz#3569708bd4be4d8870ba32bf1c456dac81600d97" + integrity sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA== + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -1680,50 +1835,29 @@ dependencies: dayjs "^1.11.10" -"@sinclair/typebox@^0.27.8": - version "0.27.12" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.12.tgz#0cacd3cff047a32936b1ace47ea7c86eaab60a7f" - integrity sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g== +"@sinclair/typebox@^0.34.0": + version "0.34.52" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.34.52.tgz#62f8a686e4ab28a8944902e2ad2d648312ef11cb" + integrity sha512-XiMQh7qqVlxZzcVD+kkGMNGMzcTrDMLWI7S4x7z1MkCkbDPrekpZXEUK0eZqZFMuHQg2a2DZOcDIh9o5v3Gonw== -"@sinonjs/commons@^3.0.0", "@sinonjs/commons@^3.0.1": +"@sinonjs/commons@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^10.0.2": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@sinonjs/fake-timers@^13.0.5": - version "13.0.5" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz#36b9dbc21ad5546486ea9173d6bea063eb1717d5" - integrity sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw== - dependencies: - "@sinonjs/commons" "^3.0.1" - -"@sinonjs/fake-timers@^14.0.0": - version "14.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-14.0.0.tgz#54b3daa30da6fcca71b2da934ff96b3095b3e28d" - integrity sha512-QfoXRaUTjMVVn/ZbnD4LS3TPtqOkOdKIYCKldIVPnuClcwRKat6LI2mRZ2s5qiBfO6Fy03An35dSls/2/FEc0Q== - dependencies: - "@sinonjs/commons" "^3.0.1" - -"@sinonjs/fake-timers@^15.1.1": +"@sinonjs/fake-timers@^15.4.0": version "15.4.0" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-15.4.0.tgz#5d40c151a9e66075fe4520bec40bccfe54931962" integrity sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA== dependencies: "@sinonjs/commons" "^3.0.1" -"@sinonjs/samsam@^8.0.1": - version "8.0.3" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.3.tgz#eb6ffaef421e1e27783cc9b52567de20cb28072d" - integrity sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ== +"@sinonjs/samsam@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-10.0.2.tgz#d2cb34f0bcddb955b6971585c2f0334e68a9e66d" + integrity sha512-8lVwD1Df1BmzoaOLhMcGGcz/Jyr5QY2KSB75/YK1QgKzoabTeLdIVyhXNZK9ojfSKSdirbXqdbsXXqP9/Ve8+A== dependencies: "@sinonjs/commons" "^3.0.1" type-detect "^4.1.0" @@ -1942,7 +2076,14 @@ resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== -"@types/babel__core@^7.1.14": +"@tybys/wasm-util@^0.10.3": + version "0.10.4" + resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.4.tgz#3e85ecb266f9d1722250e89bc69528615720b154" + integrity sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A== + dependencies: + tslib "^2.4.0" + +"@types/babel__core@^7.20.5": version "7.20.5" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== @@ -1968,7 +2109,7 @@ "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": +"@types/babel__traverse@*": version "7.28.0" resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz#07d713d6cce0d265c9849db0cbe62d3f61f36f74" integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== @@ -1987,14 +2128,7 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.9.tgz#cf3f0e876d7bee15a93ab925b82bf570a3904a24" integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg== -"@types/graceful-fs@^4.1.3": - version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" - integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.1", "@types/istanbul-lib-coverage@^2.0.6": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== @@ -2006,7 +2140,7 @@ dependencies: "@types/istanbul-lib-coverage" "*" -"@types/istanbul-reports@^3.0.0": +"@types/istanbul-reports@^3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== @@ -2032,7 +2166,7 @@ dependencies: undici-types ">=7.24.0 <7.24.7" -"@types/stack-utils@^2.0.0": +"@types/stack-utils@^2.0.3": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== @@ -2061,7 +2195,7 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== -"@types/yargs@^17.0.8": +"@types/yargs@^17.0.33": version "17.0.35" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.35.tgz#07013e46aa4d7d7d50a49e15604c1c5340d4eb24" integrity sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg== @@ -2077,6 +2211,125 @@ https-proxy-agent "^7.0.0" tslib "^2.6.2" +"@ungap/structured-clone@^1.3.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.4.0.tgz#5e2e1374c0a30b5a42e8b083523a225c6945f88a" + integrity sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ== + +"@unrs/resolver-binding-android-arm-eabi@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz#98a9fee62c01f209747a4ab5855f1ced38a6d03a" + integrity sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w== + +"@unrs/resolver-binding-android-arm64@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz#46b7e8a1393f907462324f1576e8883529acf066" + integrity sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ== + +"@unrs/resolver-binding-darwin-arm64@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz#0ea07b00e2583ab004b853d4c02ec5f0745d490c" + integrity sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w== + +"@unrs/resolver-binding-darwin-x64@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz#a2a6901ed58449b91b4438e582f6890cba956049" + integrity sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA== + +"@unrs/resolver-binding-freebsd-x64@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz#ebe6fe7f6706b7378ea4a48a024602e9c2f48f89" + integrity sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg== + +"@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz#e6040fedaa240124419d35b25b69c5fa15ddb499" + integrity sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A== + +"@unrs/resolver-binding-linux-arm-musleabihf@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz#d217a8fb59f659c131539326c140e7b62e3e3c6a" + integrity sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g== + +"@unrs/resolver-binding-linux-arm64-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz#edab13c46a45783a7e01351e113825c04f352e24" + integrity sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg== + +"@unrs/resolver-binding-linux-arm64-musl@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz#e5e195db1130f7d3b6aa2fd67b3c9fe1ea4859a0" + integrity sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA== + +"@unrs/resolver-binding-linux-loong64-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz#f01d22e091bae13016f4636698d9dcbbda775c3e" + integrity sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q== + +"@unrs/resolver-binding-linux-loong64-musl@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz#7d23efcb98adf076bfbcecc27b4212c36aa6697d" + integrity sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew== + +"@unrs/resolver-binding-linux-ppc64-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz#1f35f1eaa322f33cf2d96dac27f0626a93ffe2f6" + integrity sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg== + +"@unrs/resolver-binding-linux-riscv64-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz#674faa696f5ce96f214873946a1e2d6ca96723dd" + integrity sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A== + +"@unrs/resolver-binding-linux-riscv64-musl@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz#37835fdd0b472ecdcffccd4288f19018454b138c" + integrity sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w== + +"@unrs/resolver-binding-linux-s390x-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz#b6edf13db4bb0accdcd1ad482a4eea0301de9224" + integrity sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw== + +"@unrs/resolver-binding-linux-x64-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz#daddad00bf65a405202284da1eb1db8eb83b218f" + integrity sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ== + +"@unrs/resolver-binding-linux-x64-musl@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz#dfdff1e0c2bad25420b41c76a746011c3983b9bb" + integrity sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A== + +"@unrs/resolver-binding-openharmony-arm64@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz#ce07c4f5e7b42f7bfce45e7629b8659063aefefe" + integrity sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ== + +"@unrs/resolver-binding-wasm32-wasi@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz#82514f0506cfaf65f17fe16095f92d450e487183" + integrity sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A== + dependencies: + "@emnapi/core" "1.10.0" + "@emnapi/runtime" "1.10.0" + "@napi-rs/wasm-runtime" "^1.1.4" + +"@unrs/resolver-binding-win32-arm64-msvc@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz#521427dd59a8f4740ddd1dc7c3bc6af1aa1d260d" + integrity sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g== + +"@unrs/resolver-binding-win32-ia32-msvc@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz#05b63286ff2da37e0ce3083b8390884385efff62" + integrity sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g== + +"@unrs/resolver-binding-win32-x64-msvc@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz#72da0da48d72b1e87831b9c0308931d3f4669027" + integrity sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA== + JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -2162,7 +2415,7 @@ ajv@6.15.0, ajv@^6.14.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-escapes@^4.2.1: +ansi-escapes@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -2186,7 +2439,7 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -ansi-styles@^5.0.0: +ansi-styles@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== @@ -2196,7 +2449,7 @@ ansi-styles@^6.1.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== -anymatch@^3.0.3: +anymatch@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -2255,41 +2508,38 @@ b4a@^1.6.4, b4a@^1.8.1: resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.9.0.tgz#6336313b6e76b299c397afa68676ec6ebc788845" integrity sha512-dpfcF9fDNR6++cthXR67iyhgqWy9CBouAvIWhIntzBG6cvK/cnIPiZQjBwi/ZqjjBEDGfoNDtmB0kTjroOJ3pQ== -babel-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" - integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== - dependencies: - "@jest/transform" "^29.7.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.6.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" +babel-jest@30.5.2: + version "30.5.2" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-30.5.2.tgz#ee4b3b265baf9dad68e6275bc813ef35d1736e6d" + integrity sha512-ES8WeJ2fNWPEDunyAtUfJ12nHyaWUloCHdkfK2oW5uSoQSUmjNKdWiGaXJITJwvFEWoD/evHEg/QoCXAvLaQqQ== + dependencies: + "@jest/transform" "30.5.2" + "@types/babel__core" "^7.20.5" + babel-plugin-istanbul "^8.0.0" + babel-preset-jest "30.5.0" + chalk "^4.1.2" + graceful-fs "^4.2.11" slash "^3.0.0" -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== +babel-plugin-istanbul@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-8.0.0.tgz#8762f542153a52b77e626dd2c033b467de2f2fa2" + integrity sha512-18wCskrN3DgbuBmp1gr7LBGT8xdz5xhQQqFvFhVxbkl8VBCrMKQ2YtqBWtUal1Zrc1HTuX0011+Brjw78TCFkg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-instrument "^6.0.2" + test-exclude "^7.0.1" -babel-plugin-jest-hoist@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" - integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== +babel-plugin-jest-hoist@30.5.0: + version "30.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.5.0.tgz#425bf7ee24cffe47bfdcfeeca2885b87b1cf6644" + integrity sha512-gtGo1B+u14jrZQv6TdSWIWkTqclboo7Qn+dFAGUOIuXLFuJKAdg3U5MIWzZnW4vfUb4dX9skmAMiby86e/SF4A== dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" + "@types/babel__core" "^7.20.5" -babel-preset-current-node-syntax@^1.0.0: +babel-preset-current-node-syntax@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz#20730d6cdc7dda5d89401cab10ac6a32067acde6" integrity sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg== @@ -2310,19 +2560,24 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" -babel-preset-jest@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" - integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== +babel-preset-jest@30.5.0: + version "30.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-30.5.0.tgz#33162eee375c0066f2b2059cd97a7840ef84c259" + integrity sha512-ZGPn5ClP4lBDpuOK8W1yQIOy359HmbnZv3suucAlIe+SEE9yDsxV4S2PjSbH2Vc97U+WmzYD7vw3kr8NsQ/i6w== dependencies: - babel-plugin-jest-hoist "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" + babel-plugin-jest-hoist "30.5.0" + babel-preset-current-node-syntax "^1.2.0" balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +balanced-match@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" + integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== + bare-events@^2.5.4, bare-events@^2.7.0: version "2.9.2" resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.9.2.tgz#01d377b64c3c7167b28b52da7add3221aecf2d7f" @@ -2429,12 +2684,12 @@ brace-expansion@^2.0.2: dependencies: balanced-match "^1.0.0" -braces@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== +brace-expansion@^5.0.8: + version "5.0.12" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.12.tgz#995fbb4750a77c4d16a7dc942ff2ca6ef8e675ec" + integrity sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ== dependencies: - fill-range "^7.1.1" + balanced-match "^4.0.2" browser-level@^2.0.0: version "2.0.0" @@ -2454,10 +2709,10 @@ browserslist@^4.24.0: node-releases "^2.0.57" update-browserslist-db "^1.3.3" -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== +bser@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.2.tgz#3052372d49a1bc2a25e68c267697af5e823e147a" + integrity sha512-V2o8YS2EhrKMO9AumnkK0ynynfFlsajpYupwq7S46H5mhcanwxDkNTw3K67wPIcKTH1ffkA4vhMOtAc7gRmPZw== dependencies: node-int64 "^0.4.0" @@ -2478,11 +2733,6 @@ buffer-equal-constant-time@^1.0.1: resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - buffer@5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" @@ -2545,7 +2795,7 @@ call-bound@^1.0.2: call-bind-apply-helpers "^1.0.2" get-intrinsic "^1.3.0" -callsites@^3.0.0: +callsites@^3.0.0, callsites@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== @@ -2555,7 +2805,7 @@ camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.2.0, camelcase@^6.3.0: +camelcase@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== @@ -2565,7 +2815,7 @@ caniuse-lite@^1.0.30001810: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001812.tgz#55b32ed819d120b384149a4f9fd59d179ce008f9" integrity sha512-qN+QNNBr93TCmFrmte0bBCjSDMuRvt78VlHT99qIGPszm4QsqCX8lnyWUFkHi8B7ZBAPq8SH+UqyXNy/odMdng== -chalk@^4.0.0: +chalk@^4.0.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2583,15 +2833,10 @@ chownr@^3.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-3.0.0.tgz#9855e64ecd240a9cc4267ce8a4aa5d24a1da15e4" integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g== -ci-info@^3.2.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -cjs-module-lexer@^1.0.0: - version "1.4.3" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz#0f79731eb8cfe1ec72acd4066efac9d61991b00d" - integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q== +ci-info@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.4.0.tgz#7d54eff9f54b45b62401c26032696eb59c8bd18c" + integrity sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg== cjs-module-lexer@^2.2.0: version "2.2.1" @@ -2637,7 +2882,7 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== -collect-v8-coverage@^1.0.0: +collect-v8-coverage@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz#cc1f01eb8d02298cbc9a437c74c70ab4e5210b80" integrity sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw== @@ -2707,19 +2952,6 @@ cors@~2.8.5: object-assign "^4" vary "^1" -create-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" - integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-config "^29.7.0" - jest-util "^29.7.0" - prompts "^2.0.1" - cron-parser@^4.2.0: version "4.9.0" resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-4.9.0.tgz#0340694af3e46a0894978c6f52a6dbb5c0f11ad5" @@ -2748,7 +2980,7 @@ debug@4, debug@4.4.3, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, de dependencies: ms "^2.1.3" -dedent@^1.0.0: +dedent@^1.6.0: version "1.7.2" resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.7.2.tgz#34e2264ab538301e27cf7b07bf2369c19baa8dd9" integrity sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA== @@ -2758,7 +2990,7 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deepmerge@^4.2.2: +deepmerge@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== @@ -2791,20 +3023,20 @@ depd@^2.0.0, depd@~2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -detect-newline@^3.0.0: +detect-libc@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" + integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== + +detect-newline@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -diff@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" - integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== +diff@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-9.0.0.tgz#297c31cd7c280f13dfe335791ec2063bd4a73a6f" + integrity sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw== dunder-proto@^1.0.1: version "1.0.1" @@ -2927,6 +3159,11 @@ es-errors@^1.3.0: resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== +es-module-lexer@^2.1.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-2.3.2.tgz#311fa4f40168c1975c505477c51b23234d41ad55" + integrity sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw== + es-module-lexer@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-3.0.2.tgz#8cc09097dd80a9cbb79437fd405b935cac76cda3" @@ -2977,7 +3214,7 @@ eslint-visitor-keys@^4.2.1: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== -eslint@^9.14.0: +eslint@^9.39.0: version "9.39.5" resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.5.tgz#2a4e3c8b0f753196efae943c8ffaa8730fc6a3fa" integrity sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw== @@ -3072,7 +3309,7 @@ events@3.3.0, events@^3.0.0, events@^3.3.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@^5.0.0: +execa@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== @@ -3087,21 +3324,22 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== +exit-x@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/exit-x/-/exit-x-0.2.2.tgz#1f9052de3b8d99a696b10dad5bced9bdd5c3aa64" + integrity sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ== -expect@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" - integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== +expect@30.5.2: + version "30.5.2" + resolved "https://registry.yarnpkg.com/expect/-/expect-30.5.2.tgz#f3fe2eeeb9df5c55e237c6428d37f37204b55f4f" + integrity sha512-0LNuMvs8/5mRYhnCR4k+lGV7fqPMs6Bnksda4S3zsCUmdxBpAn4zU4NNzXdq1pMKe/H4W5t/zVIDSJ/H3e0vDA== dependencies: - "@jest/expect-utils" "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" + "@jest/expect-utils" "30.5.2" + "@jest/get-type" "30.5.0" + jest-matcher-utils "30.5.2" + jest-message-util "30.5.1" + jest-mock "30.5.2" + jest-util "30.5.1" exponential-backoff@^3.1.1: version "3.1.3" @@ -3187,12 +3425,12 @@ fast-xml-parser@^5.5.7, fast-xml-parser@^5.5.9: strnum "^2.4.2" xml-naming "^0.3.0" -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== +fb-watchman@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.4.tgz#2227759ee352e8371b9de30ceda7633ce65ca3be" + integrity sha512-tGQtaoYisPDriJBN0mT5yZSyNETnJGA1gTYxaVRAE5KUO3LI9kPUc9WIu8JXcxaIci+faIKlzXqXyPgrmubtBQ== dependencies: - bser "2.1.1" + bser "2.1.2" "fcntl@github:scality/node-fcntl#0.3.1": version "0.3.1" @@ -3219,13 +3457,6 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - finalhandler@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-2.1.1.tgz#a2c517a6559852bcdb06d1f8bd7f51b68fad8099" @@ -3316,11 +3547,6 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - function-bind@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" @@ -3377,7 +3603,7 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@^10.2.2: +glob@^10.2.2, glob@^10.4.1: version "10.5.0" resolved "https://registry.yarnpkg.com/glob/-/glob-10.5.0.tgz#8ec0355919cd3338c28428a23d4f24ecc5fe738c" integrity sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg== @@ -3389,7 +3615,16 @@ glob@^10.2.2: package-json-from-dist "^1.0.0" path-scurry "^1.11.1" -glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: +glob@^13.0.6: + version "13.0.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-13.0.6.tgz#078666566a425147ccacfbd2e332deb66a2be71d" + integrity sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw== + dependencies: + minimatch "^10.2.2" + minipass "^7.1.3" + path-scurry "^2.0.2" + +glob@^7.1.2: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -3411,7 +3646,7 @@ gopd@^1.2.0: resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.2.11, graceful-fs@^4.2.6: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -3426,7 +3661,7 @@ has-symbols@^1.1.0: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== -hasown@^2.0.2, hasown@^2.0.4: +hasown@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.4.tgz#8c62d8cb90beb2aad5d0a5b67581ad9854c3f003" integrity sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A== @@ -3541,7 +3776,7 @@ import-in-the-middle@^3.0.0: es-module-lexer "^3.0.2" module-details-from-path "^1.0.4" -import-local@^3.0.2: +import-local@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== @@ -3613,13 +3848,6 @@ is-buffer@^2.0.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-core-module@^2.16.1: - version "2.17.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.17.0.tgz#75c1c76236c9f7e38ddbfff292e127dc13b21027" - integrity sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA== - dependencies: - hasown "^2.0.4" - is-docker@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" @@ -3635,7 +3863,7 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-generator-fn@^2.0.0: +is-generator-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== @@ -3654,11 +3882,6 @@ is-inside-container@^1.0.0: dependencies: is-docker "^3.0.0" -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - is-promise@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" @@ -3696,18 +3919,7 @@ istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== -istanbul-lib-instrument@^5.0.4: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-instrument@^6.0.0: +istanbul-lib-instrument@^6.0.0, istanbul-lib-instrument@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== @@ -3727,14 +3939,14 @@ istanbul-lib-report@^3.0.0: make-dir "^4.0.0" supports-color "^7.1.0" -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== +istanbul-lib-source-maps@^5.0.0: + version "5.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz#acaef948df7747c8eb5fbf1265cb980f6353a441" + integrity sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A== dependencies: + "@jridgewell/trace-mapping" "^0.3.23" debug "^4.1.1" istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" istanbul-reports@^3.1.3: version "3.2.0" @@ -3753,363 +3965,357 @@ jackspeak@^3.1.2: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" -jest-changed-files@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" - integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== +jest-changed-files@30.5.1: + version "30.5.1" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-30.5.1.tgz#0f91cc77e6f834fb2e85bd277d9b313e555acd43" + integrity sha512-0+bvMM/ENhDI29Z8q1r4HxiDIi4G5tnBmSw4esfPQoj9q8Nik7KIyuxHkTVnnniJQf05SxpGaKDQ+4h28ynGPg== dependencies: - execa "^5.0.0" - jest-util "^29.7.0" + execa "^5.1.1" + jest-util "30.5.1" p-limit "^3.1.0" -jest-circus@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" - integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== +jest-circus@30.5.2: + version "30.5.2" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-30.5.2.tgz#6898ebf43d0bdd683af9461d0756ffff210f5f25" + integrity sha512-vffFgjs5JSJ9q4ds1vNW3klKYPJfYfIY61LT/zaZgvTeASJOWZUt8LBfHgIcV4rwxlPBLl/ePBGccHEclS4PlQ== dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" + "@jest/environment" "30.5.2" + "@jest/expect" "30.5.2" + "@jest/test-result" "30.5.2" + "@jest/types" "30.5.1" "@types/node" "*" - chalk "^4.0.0" + chalk "^4.1.2" co "^4.6.0" - dedent "^1.0.0" - is-generator-fn "^2.0.0" - jest-each "^29.7.0" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" + dedent "^1.6.0" + is-generator-fn "^2.1.0" + jest-each "30.5.2" + jest-matcher-utils "30.5.2" + jest-message-util "30.5.1" + jest-runtime "30.5.2" + jest-snapshot "30.5.2" + jest-util "30.5.1" p-limit "^3.1.0" - pretty-format "^29.7.0" - pure-rand "^6.0.0" + pretty-format "30.5.1" + pure-rand "^7.0.0" slash "^3.0.0" - stack-utils "^2.0.3" + stack-utils "^2.0.6" + +jest-cli@30.5.2: + version "30.5.2" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-30.5.2.tgz#9936348acafd63aa5a2cb40021dd7f393e6212c2" + integrity sha512-YYYxUUVjFgPvgEleKNKMaYGIFgR3l3832Cl0kRL/oCiDZ03v7wImUtquHl2OOBCCNgprjZgBN5bczS/JklPBDg== + dependencies: + "@jest/core" "30.5.2" + "@jest/test-result" "30.5.2" + "@jest/types" "30.5.1" + chalk "^4.1.2" + exit-x "^0.2.2" + import-local "^3.2.0" + jest-config "30.5.2" + jest-util "30.5.1" + jest-validate "30.5.1" + yargs "^17.7.2" -jest-cli@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" - integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== - dependencies: - "@jest/core" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - chalk "^4.0.0" - create-jest "^29.7.0" - exit "^0.1.2" - import-local "^3.0.2" - jest-config "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - yargs "^17.3.1" - -jest-config@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" - integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.7.0" - "@jest/types" "^29.6.3" - babel-jest "^29.7.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.7.0" - jest-environment-node "^29.7.0" - jest-get-type "^29.6.3" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-runner "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - micromatch "^4.0.4" +jest-config@30.5.2: + version "30.5.2" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-30.5.2.tgz#57e6b5f5c16a953b037e9a967152ec882118a356" + integrity sha512-U6221OZekabePvGcGPf4raIBKMvYQWFHvhobDJRojOYaFMj2HaGytAdknjDhYc6JTz2fdHW9+6k0wWUDaNeOFQ== + dependencies: + "@babel/core" "^7.27.4" + "@jest/get-type" "30.5.0" + "@jest/pattern" "30.5.0" + "@jest/test-sequencer" "30.5.2" + "@jest/types" "30.5.1" + babel-jest "30.5.2" + chalk "^4.1.2" + ci-info "^4.2.0" + deepmerge "^4.3.1" + glob "^13.0.6" + graceful-fs "^4.2.11" + jest-circus "30.5.2" + jest-docblock "30.5.0" + jest-environment-node "30.5.2" + jest-regex-util "30.5.0" + jest-resolve "30.5.1" + jest-runner "30.5.2" + jest-util "30.5.1" + jest-validate "30.5.1" parse-json "^5.2.0" - pretty-format "^29.7.0" + pretty-format "30.5.1" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" - integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.6.3" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-docblock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" - integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" - integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - jest-get-type "^29.6.3" - jest-util "^29.7.0" - pretty-format "^29.7.0" - -jest-environment-node@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" - integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" +jest-diff@30.5.2: + version "30.5.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-30.5.2.tgz#0d96ecb53aac3949132a6ce2106790d9212edced" + integrity sha512-rBtHnI6BWTiWj3lM7fOLVfChx7R9B0u9VV3PRHawKs79x6ZjW1QoSrKenaigNGWlvhtoi2BqvDbABDie+Os3xQ== + dependencies: + "@jest/diff-sequences" "30.5.0" + "@jest/get-type" "30.5.0" + chalk "^4.1.2" + pretty-format "30.5.1" + +jest-docblock@30.5.0: + version "30.5.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-30.5.0.tgz#7cf9d08ba714fde0b68c9cb4bfc0be867a7dd11d" + integrity sha512-NwDqcxtoZi33RhuW+zJS/RVA3rmheQ8BnwpYZuc/Eruaz6seQb7+aoCeDZu/3X7W2XmD8DbSo9Pn72DbKsBFYw== + dependencies: + detect-newline "^3.1.0" + +jest-each@30.5.2: + version "30.5.2" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-30.5.2.tgz#fd905f1ce450ab08fdc8ea8ff2bf740db2380872" + integrity sha512-GRrW+7fmmgmkvyfEBqc1QFdWnF1Ex5yG6Y6AWL4TTxnkWlKIT98dsKh3P3UuWm6v4XsQwVE6DEzXIPMzWJ3ZbA== + dependencies: + "@jest/get-type" "30.5.0" + "@jest/types" "30.5.1" + chalk "^4.1.2" + jest-regex-util "30.5.0" + jest-util "30.5.1" + pretty-format "30.5.1" + +jest-environment-node@30.5.2: + version "30.5.2" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-30.5.2.tgz#64207d64054ccaa30d677dbd99eb95c7f1c72fa1" + integrity sha512-Ciz4KgTGIbojxSKpuFImgWJj5EyqfE8xMq9NxWmOXnQywHHS03H9Mv+vaCB29J5pr3JBrY27WbRV18rBdjh8Dg== + dependencies: + "@jest/environment" "30.5.2" + "@jest/fake-timers" "30.5.2" + "@jest/types" "30.5.1" "@types/node" "*" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -jest-get-type@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" - integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + jest-mock "30.5.2" + jest-util "30.5.1" + jest-validate "30.5.1" -jest-haste-map@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" - integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== +jest-haste-map@30.5.1: + version "30.5.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-30.5.1.tgz#a1dbba63564492f53783d754623cdd41bb0328b0" + integrity sha512-VIFgt67jW480YDxKfEv9IYQKrFpYt7bOCMn3VsnjK7AK9qo7p6acpnA1DHwsVOULE3dTaYew/6JaTD/d0VDHoQ== dependencies: - "@jest/types" "^29.6.3" - "@types/graceful-fs" "^4.1.3" + "@jest/types" "30.5.1" + "@parcel/watcher" "^2.6.0" "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - jest-worker "^29.7.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" - integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== - dependencies: - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-matcher-utils@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" - integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== - dependencies: - chalk "^4.0.0" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-message-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" - integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.7.0" + anymatch "^3.1.3" + fb-watchman "^2.0.2" + fdir "^6.5.0" + graceful-fs "^4.2.11" + jest-regex-util "30.5.0" + jest-util "30.5.1" + jest-worker "30.5.1" + picomatch "^4.0.3" + +jest-leak-detector@30.5.1: + version "30.5.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-30.5.1.tgz#bca4b6b08d5e3a0b46560e268d28c89b15e7b72e" + integrity sha512-gt4GT2aWgEoCNTcBe4rqS74xTIUJxi+UD9SNSu9aOk5LmTEd6fS5KSTmAKAfitCCktQHNN+upUuL6EkBfFbMDQ== + dependencies: + "@jest/get-type" "30.5.0" + pretty-format "30.5.1" + +jest-matcher-utils@30.5.2: + version "30.5.2" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-30.5.2.tgz#360433048fea76513dd2ceed6dfaf5f488164ed5" + integrity sha512-lFkB365PTIHOhPzwrb9T6gvlDnPpOZ7/c3ewOKKB7bzztqjVrtlyRL2MkyfJXpyY2u2SKw001JKrTx14fBUFcQ== + dependencies: + "@jest/get-type" "30.5.0" + chalk "^4.1.2" + jest-diff "30.5.2" + pretty-format "30.5.1" + +jest-message-util@30.5.1: + version "30.5.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-30.5.1.tgz#e8d04d7b6d123f5dbfb1497432cd9c2b3d510f90" + integrity sha512-UdQlLdd9wL/Ys7xRErckqwD6wPlSZYueosSWuHc1r2ztGLwlgPvtSJq2+BPEgaEY13WLvfFbmhTj8pba0Sd1jg== + dependencies: + "@babel/code-frame" "^7.27.1" + "@jest/types" "30.5.1" + "@types/stack-utils" "^2.0.3" + chalk "^4.1.2" + graceful-fs "^4.2.11" + jest-util "30.5.1" + picomatch "^4.0.3" + pretty-format "30.5.1" slash "^3.0.0" - stack-utils "^2.0.3" + stack-utils "^2.0.6" -jest-mock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" - integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== +jest-mock@30.5.2: + version "30.5.2" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-30.5.2.tgz#78a8e24589113fa95a96c70d14b3c01c6116c2c2" + integrity sha512-KTHb37Fhj8xY8qPFvTFaFJHcdsumQp+ExsUlgoX232Agmc706gagBs53+CYvulV7MVQo9AgXOUxsqzzVBoJlrA== dependencies: - "@jest/types" "^29.6.3" + "@jest/expect-utils" "30.5.2" + "@jest/types" "30.5.1" "@types/node" "*" - jest-util "^29.7.0" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" - integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== - -jest-resolve-dependencies@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" - integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== - dependencies: - jest-regex-util "^29.6.3" - jest-snapshot "^29.7.0" - -jest-resolve@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" - integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.7.0" - jest-validate "^29.7.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" + jest-util "30.5.1" + +jest-regex-util@30.5.0: + version "30.5.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-30.5.0.tgz#aedb1932d361d4e701ecacda6ac83acf37299505" + integrity sha512-Mg0WK7A6xRHLSA1udJ8y9f3lM0uUhFTBnLKzwPmqB9AylvpleJ6BLemR8K9dK27DY+cesDryoA7yLZCAHsPG1A== + +jest-resolve-dependencies@30.5.2: + version "30.5.2" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-30.5.2.tgz#d8f45bea3cd6e20f806ef753acd521c104e91ee0" + integrity sha512-GMI0DP5enX9Z2qW2zFy1bOkrCfWAOPRJQ7qHt0pdfrxBPsgWxglMPrRSK2TX/wRWYxcPRSLFg3Z88qPOzHx7FQ== + dependencies: + jest-regex-util "30.5.0" + jest-snapshot "30.5.2" + +jest-resolve@30.5.1: + version "30.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-30.5.1.tgz#929372ea827696ceb710eed4168999d0dd2152ed" + integrity sha512-wprhLejRtwN6h8ZgaqC0eYjGJ1uMdGPT/+b3eFncbG4NWuuP9QL+vWwRinu9waw7hkOLcpMJGVJAMgBwsPssMQ== + dependencies: + chalk "^4.1.2" + graceful-fs "^4.2.11" + jest-haste-map "30.5.1" + jest-util "30.5.1" + jest-validate "30.5.1" slash "^3.0.0" - -jest-runner@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" - integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== - dependencies: - "@jest/console" "^29.7.0" - "@jest/environment" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" + unrs-resolver "^1.12.1" + +jest-runner@30.5.2: + version "30.5.2" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-30.5.2.tgz#48332168938d586a71cd0076405f647e922b90f6" + integrity sha512-/B6px7hiiNhVSRwuv9AGn0nawYvwsHeQZ3ItTd5Gp2diFd0EOKaWVeWqcbw3L88vx1GfpCKjQkxWItZCTl11Rw== + dependencies: + "@jest/console" "30.5.2" + "@jest/environment" "30.5.2" + "@jest/source-map" "30.5.2" + "@jest/test-result" "30.5.2" + "@jest/transform" "30.5.2" + "@jest/types" "30.5.1" "@types/node" "*" - chalk "^4.0.0" + chalk "^4.1.2" emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.7.0" - jest-environment-node "^29.7.0" - jest-haste-map "^29.7.0" - jest-leak-detector "^29.7.0" - jest-message-util "^29.7.0" - jest-resolve "^29.7.0" - jest-runtime "^29.7.0" - jest-util "^29.7.0" - jest-watcher "^29.7.0" - jest-worker "^29.7.0" + exit-x "^0.2.2" + graceful-fs "^4.2.11" + jest-docblock "30.5.0" + jest-environment-node "30.5.2" + jest-haste-map "30.5.1" + jest-leak-detector "30.5.1" + jest-message-util "30.5.1" + jest-resolve "30.5.1" + jest-runtime "30.5.2" + jest-util "30.5.1" + jest-watcher "30.5.2" + jest-worker "30.5.1" p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" - integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/globals" "^29.7.0" - "@jest/source-map" "^29.6.3" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" + +jest-runtime@30.5.2: + version "30.5.2" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-30.5.2.tgz#7391ad9084209d2e38713350ba0e324be8248b3d" + integrity sha512-0paUAHBlheai10A3XSy9Xh+YBG0IROy+/qzcDPzQ/nbbXrznQzeWy5qniICWK6d3W3scaRQCVAbXdcK0ibBq4w== + dependencies: + "@jest/environment" "30.5.2" + "@jest/fake-timers" "30.5.2" + "@jest/globals" "30.5.2" + "@jest/source-map" "30.5.2" + "@jest/test-result" "30.5.2" + "@jest/transform" "30.5.2" + "@jest/types" "30.5.1" "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" + chalk "^4.1.2" + cjs-module-lexer "^2.2.0" + collect-v8-coverage "^1.0.2" + es-module-lexer "^2.1.0" + glob "^13.0.6" + graceful-fs "^4.2.11" + jest-haste-map "30.5.1" + jest-message-util "30.5.1" + jest-mock "30.5.2" + jest-regex-util "30.5.0" + jest-resolve "30.5.1" + jest-snapshot "30.5.2" + jest-util "30.5.1" slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" - integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.7.0" - graceful-fs "^4.2.9" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - natural-compare "^1.4.0" - pretty-format "^29.7.0" - semver "^7.5.3" - -jest-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== - dependencies: - "@jest/types" "^29.6.3" +jest-snapshot@30.5.2: + version "30.5.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-30.5.2.tgz#494e37565d2201ea725c3582252083ef1b6be85b" + integrity sha512-jKIdes25AnAH73dOCi2qE6J6vHJ6L2vyBS11M89kT50DVJcLTf2AOjvcc+2vVaN8lUbY5v2R83aqXo3Ro9fqYA== + dependencies: + "@babel/core" "^7.27.4" + "@babel/generator" "^7.27.5" + "@babel/plugin-syntax-jsx" "^7.27.1" + "@babel/plugin-syntax-typescript" "^7.27.1" + "@babel/types" "^7.27.3" + "@jest/expect-utils" "30.5.2" + "@jest/get-type" "30.5.0" + "@jest/snapshot-utils" "30.5.1" + "@jest/transform" "30.5.2" + "@jest/types" "30.5.1" + babel-preset-current-node-syntax "^1.2.0" + chalk "^4.1.2" + expect "30.5.2" + graceful-fs "^4.2.11" + jest-diff "30.5.2" + jest-matcher-utils "30.5.2" + jest-message-util "30.5.1" + jest-util "30.5.1" + pretty-format "30.5.1" + semver "^7.7.2" + synckit "^0.11.8" + +jest-util@30.5.1: + version "30.5.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-30.5.1.tgz#1e71a1ee24f365c34001c1f8aab6d6f52ceadcb7" + integrity sha512-yKuxmNy2rSbTXw+3SIPanJo+nV4/BS1p26v44IYBFMsswSQySfMMcPHErnOncda7i9HEz0q605rIhSTBVgrZTg== + dependencies: + "@jest/types" "30.5.1" "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" - integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== - dependencies: - "@jest/types" "^29.6.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.6.3" + chalk "^4.1.2" + ci-info "^4.2.0" + graceful-fs "^4.2.11" + picomatch "^4.0.3" + +jest-validate@30.5.1: + version "30.5.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-30.5.1.tgz#0922700fae123c9e1d8403bdf62924b7e3c668de" + integrity sha512-i/buJ56wTpxihE93hQYNMfdOThS87+HGvLZzZJmU4xggPcdTYQq051iwALLCHp3q+SkCGH+EFejQZz5EbBSkkg== + dependencies: + "@jest/get-type" "30.5.0" + "@jest/types" "30.5.1" + camelcase "^6.3.0" + chalk "^4.1.2" leven "^3.1.0" - pretty-format "^29.7.0" + pretty-format "30.5.1" -jest-watcher@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" - integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== +jest-watcher@30.5.2: + version "30.5.2" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-30.5.2.tgz#899caa0c886ea9c18c9b9cbc7f508f7a8fc8647f" + integrity sha512-rqRgg4R11GA9m1UsEZwQeixHsgZReCn6TOHAHtIH33yXrIvoX0OGPA20Yzzjkz7X40fZvcRSxEpQppYPcWzmcQ== dependencies: - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" + "@jest/test-result" "30.5.2" + "@jest/types" "30.5.1" "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" + ansi-escapes "^4.3.2" + chalk "^4.1.2" emittery "^0.13.1" - jest-util "^29.7.0" - string-length "^4.0.1" + jest-util "30.5.1" + string-length "^4.0.2" -jest-worker@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" - integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== +jest-worker@30.5.1: + version "30.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-30.5.1.tgz#32a4c17502addef713411ca3bf951796de83e2ba" + integrity sha512-Cbxh5v7AoLuFRmFJSM4/aHdQ68rjXvUWr716EE0Dh3I7T+T/3FgFKhOERGXHcU2Meftq9+9zxPM3TSNyI9D+HA== dependencies: "@types/node" "*" - jest-util "^29.7.0" + "@ungap/structured-clone" "^1.3.0" + jest-util "30.5.1" merge-stream "^2.0.0" - supports-color "^8.0.0" + supports-color "^8.1.1" -jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" - integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== +jest@^30.5.2: + version "30.5.2" + resolved "https://registry.yarnpkg.com/jest/-/jest-30.5.2.tgz#f70e547083b214a3a8314fcf45f54d559b32d4a1" + integrity sha512-3gnpdBIza8ijCl3iMV9ChE3hSt1+46865qqod863gQtJr1DixOkAU5DoGbi3u+XlRcw++BhZQMu/y4xBdHBvSQ== dependencies: - "@jest/core" "^29.7.0" - "@jest/types" "^29.6.3" - import-local "^3.0.2" - jest-cli "^29.7.0" + "@jest/core" "30.5.2" + "@jest/types" "30.5.1" + import-local "^3.2.0" + jest-cli "30.5.2" joi@^18.0.1: version "18.2.9" @@ -4200,11 +4406,6 @@ jsonwebtoken@^9.0.0: ms "^2.1.1" semver "^7.5.4" -just-extend@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-6.2.0.tgz#b816abfb3d67ee860482e7401564672558163947" - integrity sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw== - jwa@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.1.tgz#bf8176d1ad0cd72e0f3f58338595a13e110bc804" @@ -4229,11 +4430,6 @@ keyv@^4.5.4: dependencies: json-buffer "3.0.1" -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - level-supports@^6.0.0, level-supports@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-6.2.0.tgz#e78b228973a24acdc5199c5f51e244e70f26c611" @@ -4375,6 +4571,11 @@ lru-cache@^10.0.1, lru-cache@^10.2.0: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== +lru-cache@^11.0.0: + version "11.5.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.5.3.tgz#a7767b4034e35269562d2b9da2b185b5df70c421" + integrity sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -4418,13 +4619,6 @@ make-fetch-happen@^14.0.3: promise-retry "^2.0.1" ssri "^12.0.0" -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - markdown-it@13.0.1: version "13.0.1" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-13.0.1.tgz#c6ecc431cacf1a5da531423fc6a42807814af430" @@ -4484,14 +4678,6 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -micromatch@^4.0.4: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" @@ -4521,7 +4707,14 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.5: +minimatch@^10.2.2: + version "10.2.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.6.tgz#fd956bbe0b77241e9f15ac5dccb1c638060968ef" + integrity sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A== + dependencies: + brace-expansion "^5.0.8" + +minimatch@^3.1.1, minimatch@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== @@ -4581,7 +4774,7 @@ minipass@^3.0.0: dependencies: yallist "^4.0.0" -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3, minipass@^7.0.4, minipass@^7.1.2: +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3, minipass@^7.0.4, minipass@^7.1.2, minipass@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.3.tgz#79389b4eb1bb2d003a9bba87d492f2bd37bdc65b" integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== @@ -4661,6 +4854,11 @@ napi-macros@^2.2.2: resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== +napi-postinstall@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/napi-postinstall/-/napi-postinstall-0.3.4.tgz#7af256d6588b5f8e952b9190965d6b019653bbb9" + integrity sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -4685,15 +4883,10 @@ new-find-package-json@^2.0.0: dependencies: debug "^4.3.4" -nise@^6.1.1: - version "6.1.5" - resolved "https://registry.yarnpkg.com/nise/-/nise-6.1.5.tgz#a2f4cd07d8d38ebc5ae5500168eea0f08a2fa4b9" - integrity sha512-SnRDPDBjxZZoU2n0+gzzLtSvo1OZo7j6jnbXsoh3AFxEGhaFU7ZF0TmefuKERq79wxR2U+MPn7ArW+Tl+clC3A== - dependencies: - "@sinonjs/commons" "^3.0.1" - "@sinonjs/fake-timers" "^15.1.1" - just-extend "^6.2.0" - path-to-regexp "^8.3.0" +node-addon-api@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== node-addon-api@^8.3.0: version "8.9.2" @@ -4905,11 +5098,6 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - path-scurry@^1.11.1: version "1.11.1" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" @@ -4918,7 +5106,15 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" -path-to-regexp@^8.0.0, path-to-regexp@^8.3.0: +path-scurry@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.2.tgz#6be0d0ee02a10d9e0de7a98bae65e182c9061f85" + integrity sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg== + dependencies: + lru-cache "^11.0.0" + minipass "^7.1.2" + +path-to-regexp@^8.0.0: version "8.4.2" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.4.2.tgz#795c420c4f7ca45c5b887366f622ee0c9852cccd" integrity sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA== @@ -4933,17 +5129,17 @@ picocolors@^1.1.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: +picomatch@^2.0.4: version "2.3.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601" integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== -picomatch@^4.0.4: +picomatch@^4.0.3, picomatch@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.7.tgz#6313360034ccb36b3dc61ecbdff78121f90fe21f" integrity sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA== -pirates@^4.0.4: +pirates@^4.0.7: version "4.0.7" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22" integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== @@ -4960,14 +5156,15 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== +pretty-format@30.5.1: + version "30.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-30.5.1.tgz#0dda910a75d12346b771977b1f328517b9e846d4" + integrity sha512-byhRAPguVKMQIj4kjJwJ5lAskVhfuiSdiYl/aLTWpgkGEmic2jYhJh1yE9ih8Ox44Xg9ccCT11/S6QrzSJuNrg== dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" + "@jest/react-is-18" "npm:react-is@^18.3.1" + "@jest/react-is-19" "npm:react-is@^19.2.5" + "@jest/schemas" "30.5.0" + ansi-styles "^5.2.0" proc-log@^5.0.0: version "5.0.0" @@ -4990,14 +5187,6 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - protobufjs@^7.5.5: version "7.6.6" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.6.6.tgz#7a3923e8e32b0ee2ff689f8eed6e455c090ac67e" @@ -5028,10 +5217,10 @@ punycode@^2.1.0, punycode@^2.3.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -pure-rand@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" - integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== +pure-rand@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-7.0.1.tgz#6f53a5a9e3e4a47445822af96821ca509ed37566" + integrity sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ== qs@^6.14.0, qs@^6.15.2: version "6.16.0" @@ -5056,11 +5245,6 @@ raw-body@^3.0.2: iconv-lite "~0.7.0" unpipe "~1.0.0" -react-is@^18.0.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - readable-stream@^3.5.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" @@ -5112,21 +5296,6 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve.exports@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" - integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== - -resolve@^1.20.0: - version "1.22.12" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.12.tgz#f5b2a680897c69c238a13cd16b15671f8b73549f" - integrity sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA== - dependencies: - es-errors "^1.3.0" - is-core-module "^2.16.1" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -5168,12 +5337,12 @@ sax@>=0.6.0: resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.1.tgz#4c23cf608c0b693ab54b4b5888e92cfe977b9843" integrity sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q== -semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: +semver@^6.0.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3: +semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3, semver@^7.7.2: version "7.8.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.5.tgz#39b646037dd50c14fb451e7e4cac58ed8b863f69" integrity sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA== @@ -5262,7 +5431,7 @@ side-channel@^1.1.1: side-channel-map "^1.0.1" side-channel-weakmap "^1.0.2" -signal-exit@^3.0.3, signal-exit@^3.0.7: +signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -5282,22 +5451,15 @@ simple-glob@^0.2.0: lodash.flatten "^4.4.0" lodash.union "^4.6.0" -sinon@^19.0.2: - version "19.0.5" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-19.0.5.tgz#64fd2f84786a043f721246c40b36bef4c4b76b3c" - integrity sha512-r15s9/s+ub/d4bxNXqIUmwp6imVSdTorIRaxoecYjqTVLZ8RuoXr/4EDGwIBo6Waxn7f2gnURX9zuhAfCwaF6Q== +sinon@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-22.1.0.tgz#df5a9308d1818166d1370795a4953ceadc5ff706" + integrity sha512-n1ajF2rBWMTtEwbKcw4UdFg4nCnDdq/U6RDoxtOd7oapOlRoJ5ynwFx60owROyhDpA9QhMZi0pCO/xtmwFjG7w== dependencies: "@sinonjs/commons" "^3.0.1" - "@sinonjs/fake-timers" "^13.0.5" - "@sinonjs/samsam" "^8.0.1" - diff "^7.0.0" - nise "^6.1.1" - supports-color "^7.2.0" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + "@sinonjs/fake-timers" "^15.4.0" + "@sinonjs/samsam" "^10.0.2" + diff "^9.0.0" slash@^3.0.0: version "3.0.0" @@ -5369,19 +5531,6 @@ sorted-array-functions@^1.3.0: resolved "https://registry.yarnpkg.com/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz#8605695563294dffb2c9796d602bd8459f7a0dd5" integrity sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA== -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - sparse-bitfield@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" @@ -5409,7 +5558,7 @@ ssri@^12.0.0: dependencies: minipass "^7.0.3" -stack-utils@^2.0.3: +stack-utils@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== @@ -5443,7 +5592,7 @@ streamx@^2.12.5, streamx@^2.15.0, streamx@^2.25.0: fast-fifo "^1.3.2" text-decoder "^1.1.0" -string-length@^4.0.1: +string-length@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== @@ -5528,24 +5677,26 @@ strnum@^2.4.2: dependencies: anynum "^1.0.1" -supports-color@^7.1.0, supports-color@^7.2.0: +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: +supports-color@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +synckit@^0.11.8: + version "0.11.13" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.11.13.tgz#062a5ea57d81befc35892f8254de5c567e97c80a" + integrity sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg== + dependencies: + "@pkgr/core" "^0.3.6" tar-stream@^3.1.7: version "3.2.1" @@ -5582,14 +5733,14 @@ teex@^1.0.1: dependencies: streamx "^2.12.5" -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== +test-exclude@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-7.0.2.tgz#482392077630bc57d5630c13abe908bb910dfc65" + integrity sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw== dependencies: "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" + glob "^10.4.1" + minimatch "^10.2.2" text-decoder@^1.1.0: version "1.2.7" @@ -5611,18 +5762,6 @@ tinyglobby@^0.2.12: fdir "^6.5.0" picomatch "^4.0.4" -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - toidentifier@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" @@ -5705,6 +5844,36 @@ unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== +unrs-resolver@^1.12.1: + version "1.12.2" + resolved "https://registry.yarnpkg.com/unrs-resolver/-/unrs-resolver-1.12.2.tgz#a6c6888396abba5adaac4cab6587df866f1d7afd" + integrity sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ== + dependencies: + napi-postinstall "^0.3.4" + optionalDependencies: + "@unrs/resolver-binding-android-arm-eabi" "1.12.2" + "@unrs/resolver-binding-android-arm64" "1.12.2" + "@unrs/resolver-binding-darwin-arm64" "1.12.2" + "@unrs/resolver-binding-darwin-x64" "1.12.2" + "@unrs/resolver-binding-freebsd-x64" "1.12.2" + "@unrs/resolver-binding-linux-arm-gnueabihf" "1.12.2" + "@unrs/resolver-binding-linux-arm-musleabihf" "1.12.2" + "@unrs/resolver-binding-linux-arm64-gnu" "1.12.2" + "@unrs/resolver-binding-linux-arm64-musl" "1.12.2" + "@unrs/resolver-binding-linux-loong64-gnu" "1.12.2" + "@unrs/resolver-binding-linux-loong64-musl" "1.12.2" + "@unrs/resolver-binding-linux-ppc64-gnu" "1.12.2" + "@unrs/resolver-binding-linux-riscv64-gnu" "1.12.2" + "@unrs/resolver-binding-linux-riscv64-musl" "1.12.2" + "@unrs/resolver-binding-linux-s390x-gnu" "1.12.2" + "@unrs/resolver-binding-linux-x64-gnu" "1.12.2" + "@unrs/resolver-binding-linux-x64-musl" "1.12.2" + "@unrs/resolver-binding-openharmony-arm64" "1.12.2" + "@unrs/resolver-binding-wasm32-wasi" "1.12.2" + "@unrs/resolver-binding-win32-arm64-msvc" "1.12.2" + "@unrs/resolver-binding-win32-ia32-msvc" "1.12.2" + "@unrs/resolver-binding-win32-x64-msvc" "1.12.2" + update-browserslist-db@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz#197e21fb2561fa89f8b94fad605a2b296a18993a" @@ -5760,13 +5929,6 @@ vaultclient@scality/vaultclient#8.5.1: werelogs scality/werelogs#8.2.0 xml2js "^0.6.2" -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - webidl-conversions@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" @@ -5852,13 +6014,13 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== +write-file-atomic@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" + integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== dependencies: imurmurhash "^0.1.4" - signal-exit "^3.0.7" + signal-exit "^4.0.1" ws@~8.21.0: version "8.21.3" @@ -5925,7 +6087,7 @@ yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^17.3.1, yargs@^17.7.2: +yargs@^17.7.2: version "17.7.3" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.3.tgz#779dffe6bcafec596a7172e983289a588647faaa" integrity sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g== From b7a9ecc28f3e693d35b71e0e18395f83bf37c915 Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Thu, 15 Oct 2026 15:43:53 +0200 Subject: [PATCH 10/12] Move the Raft comparison tools to classic-level followerDiff, compareFollowerDbs and the listing digests storage still used the level 7 API, which went away when level was bumped to 9: `new Level()` throws "Level is not a constructor" and createReadStream() no longer exists, so these tools could not run at all. The unit tests did not notice, as they only used mocked databases. Depend on classic-level directly, like arsenal does, which also avoids building a second copy of it. Range options and encodings are unchanged, so existing databases read the same as with level 7. classic-level only provides iterators, so a small read stream wraps them into the { key, value } objects the comparison streams expect. It does not use Readable.from(), which still emits 'end' when destroyed from a 'data' handler, as DiffStream does when it drops a digests stream. classic-level also opens databases lazily, so the scanned databases and the digests database are opened upfront. They are opened without creating them, so that a wrong path fails the scan instead of silently comparing against a new empty database. Issue: S3UTILS-249 --- CompareRaftMembers/BlockDigestsStorage.js | 12 +- CompareRaftMembers/DiffStream.js | 3 +- CompareRaftMembers/compareFollowerDbs.js | 37 ++++-- CompareRaftMembers/followerDiff.js | 45 +++++-- CompareRaftMembers/levelReadStream.js | 32 +++++ package.json | 2 +- .../CompareRaftMembers/BlockDigestsStorage.js | 12 +- tests/unit/CompareRaftMembers/DiffStream.js | 37 +++--- .../CompareRaftMembers/levelReadStream.js | 117 ++++++++++++++++++ yarn.lock | 40 +----- 10 files changed, 245 insertions(+), 92 deletions(-) create mode 100644 CompareRaftMembers/levelReadStream.js create mode 100644 tests/unit/CompareRaftMembers/levelReadStream.js diff --git a/CompareRaftMembers/BlockDigestsStorage.js b/CompareRaftMembers/BlockDigestsStorage.js index 0b5181ed..9c3d57fb 100644 --- a/CompareRaftMembers/BlockDigestsStorage.js +++ b/CompareRaftMembers/BlockDigestsStorage.js @@ -1,7 +1,7 @@ const async = require('async'); const stream = require('stream'); -const Level = require('level'); +const { ClassicLevel } = require('classic-level'); const MAX_BATCH_SIZE = 100; const MAX_QUEUE_SIZE = 1000; @@ -21,19 +21,19 @@ class BlockDigestsStorage extends stream.Writable { * @param {string} [params.levelPath] - path to LevelDB database * to write to * @param {string} [params.db] - custom db object, must contain - * the methods "batch" and "close" following levelup's API - + * the promise-based methods "batch" and "close" of classic-level - * currently used for unit tests */ constructor(params) { super({ objectMode: true }); const { levelPath, db } = params; if (levelPath) { - this.db = new Level(params.levelPath); + this.db = new ClassicLevel(params.levelPath); } else { this.db = db; } this.cargo = async.cargo((tasks, cb) => { - this.db.batch(tasks, cb); + this.db.batch(tasks).then(() => cb(), cb); }, MAX_BATCH_SIZE); } @@ -55,10 +55,10 @@ class BlockDigestsStorage extends stream.Writable { _final(callback) { if (this.cargo.idle()) { - this.db.close(callback); + this.db.close().then(() => callback(), callback); } else { this.cargo.drain(() => { - this.db.close(callback); + this.db.close().then(() => callback(), callback); }); } } diff --git a/CompareRaftMembers/DiffStream.js b/CompareRaftMembers/DiffStream.js index fc144824..3e30f397 100644 --- a/CompareRaftMembers/DiffStream.js +++ b/CompareRaftMembers/DiffStream.js @@ -2,6 +2,7 @@ const stream = require('stream'); const BucketStream = require('./BucketStream'); const BlockDigestsStream = require('./BlockDigestsStream'); +const levelReadStream = require('./levelReadStream'); /** * Output differences between the input stream, consisting of @@ -386,7 +387,7 @@ class DiffStream extends stream.Transform { * @return {undefined} */ _createDigestsDbStream(fromItem) { - this.currentDbDigestsStream = this.digestsDb.createReadStream({ + this.currentDbDigestsStream = levelReadStream(this.digestsDb, { gte: fromItem.fullKey, // '0' is the ASCII character following '/': this restricts // the digest's lastKey to be from the current bucket diff --git a/CompareRaftMembers/compareFollowerDbs.js b/CompareRaftMembers/compareFollowerDbs.js index 72cf6c7a..f5352fb3 100644 --- a/CompareRaftMembers/compareFollowerDbs.js +++ b/CompareRaftMembers/compareFollowerDbs.js @@ -6,11 +6,12 @@ const path = require('path'); const stream = require('stream'); const { Logger } = require('werelogs'); -const Level = require('level'); +const { ClassicLevel } = require('classic-level'); const DBListStream = require('./DBListStream'); const DiffStreamOplogFilter = require('./DiffStreamOplogFilter'); const KeyValueStreamDiff = require('./KeyValueStreamDiff'); +const levelReadStream = require('./levelReadStream'); const DEFAULT_PARALLEL_SCANS = 4; const DEFAULT_LOG_PROGRESS_INTERVAL = 10; @@ -197,14 +198,19 @@ if (EXCLUDE_FROM_CSEQS) { .pipe(DIFF_OUTPUT_STREAM); } -function compareDbs(dbPair, cb) { - log.info( - 'starting comparison of pair of databases', - { db1: dbPair[0], db2: dbPair[1] }, - ); - const dbListStreams = dbPair.map(dbPath => { - const db = new Level(dbPath); - const dbRawStream = db.createReadStream(); +// classic-level opens lazily: open explicitly so that a missing database fails the scan +function openDb(dbPath, cb) { + const db = new ClassicLevel(dbPath, { createIfMissing: false }); + db.open().then(() => cb(null, db), err => { + log.error('unable to open database', { dbPath, error: (err.cause || err).message }); + cb(err); + }); +} + +function streamDbsDiff(dbs, dbPair, cb) { + const dbListStreams = dbs.map((db, i) => { + const dbPath = dbPair[i]; + const dbRawStream = levelReadStream(db); const dbListStream = new DBListStream({ dbName: path.basename(dbPath) }); dbRawStream.pipe(dbListStream); return dbListStream; @@ -237,6 +243,19 @@ function compareDbs(dbPair, cb) { }); } +function compareDbs(dbPair, cb) { + log.info( + 'starting comparison of pair of databases', + { db1: dbPair[0], db2: dbPair[1] }, + ); + async.map(dbPair, openDb, (err, dbs) => { + if (err) { + return cb(err); + } + return streamDbsDiff(dbs, dbPair, cb); + }); +} + function main() { log.info('starting scan'); async.series([ diff --git a/CompareRaftMembers/followerDiff.js b/CompareRaftMembers/followerDiff.js index 455ab702..7cfa3fd1 100644 --- a/CompareRaftMembers/followerDiff.js +++ b/CompareRaftMembers/followerDiff.js @@ -6,11 +6,12 @@ const path = require('path'); const stream = require('stream'); const { Logger } = require('werelogs'); -const Level = require('level'); +const { ClassicLevel } = require('classic-level'); const DBListStream = require('./DBListStream'); const DiffStream = require('./DiffStream'); const DiffStreamOplogFilter = require('./DiffStreamOplogFilter'); +const levelReadStream = require('./levelReadStream'); const DEFAULT_PARALLEL_SCANS = 4; const DEFAULT_LOG_PROGRESS_INTERVAL = 10; @@ -183,13 +184,20 @@ if (EXCLUDE_FROM_CSEQS) { let digestsDb; if (LISTING_DIGESTS_INPUT_DIR) { - digestsDb = new Level(LISTING_DIGESTS_INPUT_DIR, { createIfMissing: false }); + digestsDb = new ClassicLevel(LISTING_DIGESTS_INPUT_DIR, { createIfMissing: false }); } -function scanDb(dbPath, cb) { - log.info('starting scan of database', { dbPath }); - const db = new Level(dbPath); - const dbRawStream = db.createReadStream(); +// classic-level opens lazily: open explicitly so that a missing database fails the scan +function openDb(dbPath, cb) { + const db = new ClassicLevel(dbPath, { createIfMissing: false }); + db.open().then(() => cb(null, db), err => { + log.error('unable to open database', { dbPath, error: (err.cause || err).message }); + cb(err); + }); +} + +function streamDbDiff(db, dbPath, cb) { + const dbRawStream = levelReadStream(db); const dbListStream = new DBListStream({ dbName: path.basename(dbPath) }); const diffStream = new DiffStream({ bucketdHost: BUCKETD_HOST, @@ -223,13 +231,36 @@ function scanDb(dbPath, cb) { }); } +function scanDb(dbPath, cb) { + log.info('starting scan of database', { dbPath }); + openDb(dbPath, (err, db) => { + if (err) { + return cb(err); + } + return streamDbDiff(db, dbPath, cb); + }); +} + function main() { log.info('starting scan'); async.series([ + // classic-level opens lazily: open explicitly to fail early on a missing digests database + done => { + if (!digestsDb) { + return done(); + } + return digestsDb.open().then(() => done(), err => { + log.error('unable to open listing digests database', { + path: LISTING_DIGESTS_INPUT_DIR, + error: (err.cause || err).message, + }); + done(err); + }); + }, done => async.eachLimit(DATABASES_LIST, PARALLEL_SCANS, scanDb, done), done => { if (digestsDb) { - digestsDb.close(done); + digestsDb.close().then(() => done(), done); } else { done(); } diff --git a/CompareRaftMembers/levelReadStream.js b/CompareRaftMembers/levelReadStream.js new file mode 100644 index 00000000..4954d0e7 --- /dev/null +++ b/CompareRaftMembers/levelReadStream.js @@ -0,0 +1,32 @@ +const { Readable } = require('stream'); + +// classic-level has no createReadStream(): stream the database entries as +// the { key, value } objects the comparison streams consume. Readable.from() +// would do, but it still emits 'end' when destroyed from a 'data' handler, +// which DiffStream does when it drops a digests stream. +class LevelReadStream extends Readable { + constructor(db, options) { + super({ objectMode: true }); + this.dbIterator = db.iterator(options); + } + + _read() { + this.dbIterator.next().then(entry => { + if (this.destroyed) { + return; + } + if (entry === undefined) { + this.push(null); + } else { + const [key, value] = entry; + this.push({ key, value }); + } + }, err => this.destroy(err)); + } + + _destroy(err, callback) { + this.dbIterator.close().then(() => callback(err), callback); + } +} + +module.exports = (db, options) => new LevelReadStream(db, options); diff --git a/package.json b/package.json index 38b7f25d..6f5c5723 100644 --- a/package.json +++ b/package.json @@ -36,9 +36,9 @@ "JSONStream": "^1.3.5", "async": "^3.2.6", "bucketclient": "scality/bucketclient#8.3.0", + "classic-level": "^3.0.0", "express": "^5.1.0", "httpagent": "scality/httpagent#1.1.0", - "level": "^9.0.0", "mongodb": "^6.17.0", "node-rdkafka": "^3.6.1", "node-schedule": "^2.1.1", diff --git a/tests/unit/CompareRaftMembers/BlockDigestsStorage.js b/tests/unit/CompareRaftMembers/BlockDigestsStorage.js index 262fb099..3b7a2e21 100644 --- a/tests/unit/CompareRaftMembers/BlockDigestsStorage.js +++ b/tests/unit/CompareRaftMembers/BlockDigestsStorage.js @@ -6,22 +6,22 @@ describe('BlockDigestsStorage', () => { const keysRemainingToWrite = {}; let closeDone = false; const dbMock = { - batch: (array, cb) => { + batch: array => new Promise(resolve => { setTimeout(() => { array.forEach(item => { expect(item.type).toEqual('put'); expect(item.value).toEqual(keysRemainingToWrite[item.key]); delete keysRemainingToWrite[item.key]; }); - cb(); + resolve(); }, 10); - }, - close: cb => { + }), + close: () => new Promise(resolve => { setTimeout(() => { closeDone = true; - cb(); + resolve(); }, 10); - }, + }), }; const levelStream = new BlockDigestsStorage({ db: dbMock }); for (let i = 0; i < nKeysToWrite; ++i) { diff --git a/tests/unit/CompareRaftMembers/DiffStream.js b/tests/unit/CompareRaftMembers/DiffStream.js index 20a1f42e..d8614956 100644 --- a/tests/unit/CompareRaftMembers/DiffStream.js +++ b/tests/unit/CompareRaftMembers/DiffStream.js @@ -49,36 +49,27 @@ class MockBucketStream extends stream.Readable { } } -class MockDigestsStream extends stream.Readable { - constructor(digestsToStream) { - super({ objectMode: true }); - this.digestsToStream = digestsToStream; - } - - _read() { - setTimeout(() => { - if (this.digestsToStream.length > 0) { - this.push(this.digestsToStream.shift()); - } else { - this.push(null); - } - }, 5); - } -} - class MockDigestsDB { constructor(storedDigests) { this.storedDigests = storedDigests; } - createReadStream(params) { + // mimics the iterators of abstract-level databases + iterator(params) { const { gte, lt } = params || {}; - return new MockDigestsStream( - this.storedDigests.filter( - digestEntry => (!gte || digestEntry.key >= gte) - && (!lt || digestEntry.key < lt), - ), + const digests = this.storedDigests.filter( + digestEntry => (!gte || digestEntry.key >= gte) + && (!lt || digestEntry.key < lt), ); + return { + next: () => new Promise(resolve => { + setTimeout(() => { + const digest = digests.shift(); + resolve(digest && [digest.key, digest.value]); + }, 5); + }), + close: async () => {}, + }; } } diff --git a/tests/unit/CompareRaftMembers/levelReadStream.js b/tests/unit/CompareRaftMembers/levelReadStream.js new file mode 100644 index 00000000..7a7f095d --- /dev/null +++ b/tests/unit/CompareRaftMembers/levelReadStream.js @@ -0,0 +1,117 @@ +const fs = require('fs'); +const os = require('os'); +const path = require('path'); +const { ClassicLevel } = require('classic-level'); + +const BlockDigestsStorage = require('../../../CompareRaftMembers/BlockDigestsStorage'); +const levelReadStream = require('../../../CompareRaftMembers/levelReadStream'); + +function collect(readable) { + return new Promise((resolve, reject) => { + const entries = []; + readable + .on('data', entry => entries.push(entry)) + .on('end', () => resolve(entries)) + .on('error', reject); + }); +} + +describe('levelReadStream', () => { + let tmpDir; + let levelPath; + + beforeAll(done => { + tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'levelReadStream-')); + levelPath = path.join(tmpDir, 'digests'); + const storage = new BlockDigestsStorage({ levelPath }); + ['bucket/a', 'bucket/b', 'bucket/c', 'bucket10/a'].forEach((lastKey, i) => { + storage.write({ size: i, digest: `digest${i}`, lastKey }); + }); + storage.end(); + storage.on('finish', done); + }); + + afterAll(() => { + fs.rmSync(tmpDir, { recursive: true, force: true }); + }); + + test('should stream the digests written by BlockDigestsStorage', async () => { + const db = new ClassicLevel(levelPath, { createIfMissing: false }); + const entries = await collect(levelReadStream(db)); + await db.close(); + expect(entries).toEqual([ + { key: 'bucket/a', value: '{"size":0,"digest":"digest0"}' }, + { key: 'bucket/b', value: '{"size":1,"digest":"digest1"}' }, + { key: 'bucket/c', value: '{"size":2,"digest":"digest2"}' }, + { key: 'bucket10/a', value: '{"size":3,"digest":"digest3"}' }, + ]); + }); + + test('should honor range options', async () => { + const db = new ClassicLevel(levelPath, { createIfMissing: false }); + const entries = await collect(levelReadStream(db, { gte: 'bucket/b', lt: 'bucket0' })); + await db.close(); + expect(entries.map(({ key }) => key)).toEqual(['bucket/b', 'bucket/c']); + }); + + test('should not end and release the iterator when destroyed from a data handler', async () => { + const db = new ClassicLevel(levelPath, { createIfMissing: false }); + const readable = levelReadStream(db); + const onEnd = jest.fn(); + readable.on('end', onEnd); + await new Promise(resolve => { + readable.once('data', () => { + readable.destroy(); + readable.on('close', resolve); + }); + }); + expect(onEnd).not.toHaveBeenCalled(); + // closing the database waits for open iterators to be closed + await db.close(); + expect(db.status).toEqual('closed'); + }); + + test('should drop an entry read after being destroyed', async () => { + let resolveNext; + const iterator = { + next: () => new Promise(resolve => { + resolveNext = resolve; + }), + close: jest.fn(async () => {}), + }; + const readable = levelReadStream({ iterator: () => iterator }); + const onData = jest.fn(); + readable.on('data', onData); + await new Promise(resolve => setImmediate(resolve)); + readable.destroy(); + resolveNext(['bucket/a', 'value']); + await new Promise(resolve => readable.on('close', resolve)); + expect(onData).not.toHaveBeenCalled(); + expect(iterator.close).toHaveBeenCalled(); + }); + + test('should emit iterator errors and close the iterator', async () => { + const iterator = { + next: async () => { + throw new Error('read failure'); + }, + close: jest.fn(async () => {}), + }; + const readable = levelReadStream({ iterator: () => iterator }); + await expect(collect(readable)).rejects.toThrow('read failure'); + expect(iterator.close).toHaveBeenCalled(); + }); + + test('should report a failure to close the iterator', async () => { + const iterator = { + next: () => new Promise(() => {}), + close: async () => { + throw new Error('close failure'); + }, + }; + const readable = levelReadStream({ iterator: () => iterator }); + const error = new Promise(resolve => readable.on('error', resolve)); + readable.destroy(); + await expect(error).resolves.toThrow('close failure'); + }); +}); diff --git a/yarn.lock b/yarn.lock index 8338bb20..85d02cba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2343,18 +2343,6 @@ abbrev@^3.0.0: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-3.0.1.tgz#8ac8b3b5024d31464fe2a5feeea9f4536bf44025" integrity sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg== -abstract-level@^2.0.0, abstract-level@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-2.0.2.tgz#8d965e731afb42a72f163874410c1687fb2e4bdb" - integrity sha512-pPJixmXk/kTKLB2sSue7o4Uj6TlLD2XfaP2gWZomHVCC6cuUGX/VslQqKG1yZHfXwBb/3lS6oSTMPGzh1P1iig== - dependencies: - buffer "^6.0.3" - is-buffer "^2.0.5" - level-supports "^6.0.0" - level-transcoder "^1.0.1" - maybe-combine-errors "^1.0.0" - module-error "^1.0.1" - abstract-level@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-3.1.1.tgz#d61a7ae1a5cff15f315592a4cfa3259489ac2388" @@ -2691,13 +2679,6 @@ brace-expansion@^5.0.8: dependencies: balanced-match "^4.0.2" -browser-level@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-2.0.0.tgz#cc63eb1322e67c44489d7fbdda5c30a2db7b59da" - integrity sha512-RuYSCHG/jwFCrK+KWA3dLSUNLKHEgIYhO5ORPjJMjCt7T3e+RzpIDmYKWRHxq2pfKGXjlRuEff7y7RESAAgzew== - dependencies: - abstract-level "^2.0.1" - browserslist@^4.24.0: version "4.29.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.29.1.tgz#f723071987a4f094177d94e01f6dc6e7493b972c" @@ -2843,16 +2824,6 @@ cjs-module-lexer@^2.2.0: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-2.2.1.tgz#ab35b03c56ade05fe170c70e67ae89f60666847c" integrity sha512-Ca8swihM+/4yKecYHY52kgJd300hi2lADU/a1RxNTRe+RJ9jvqQlESpbz9DnG9mowez8qwXHB8qYdIUw9e+F5Q== -classic-level@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-2.0.0.tgz#6fd9ca686bbcd645e35caaf403c3f3a56495d11b" - integrity sha512-ftiMvKgCQK+OppXcvMieDoYlYLYWhScK6yZRFBrrlHQRbm4k6Gr+yDgu/wt3V0k1/jtNbuiXAsRmuAFcD0Tx5Q== - dependencies: - abstract-level "^2.0.0" - module-error "^1.0.1" - napi-macros "^2.2.2" - node-gyp-build "^4.3.0" - classic-level@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-3.0.0.tgz#2be00defbaf7d204ac33da77988993c6c337ba67" @@ -4430,7 +4401,7 @@ keyv@^4.5.4: dependencies: json-buffer "3.0.1" -level-supports@^6.0.0, level-supports@^6.2.0: +level-supports@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-6.2.0.tgz#e78b228973a24acdc5199c5f51e244e70f26c611" integrity sha512-QNxVXP0IRnBmMsJIh+sb2kwNCYcKciQZJEt+L1hPCHrKNELllXhvrlClVHXBYZVT+a7aTSM6StgNXdAldoab3w== @@ -4443,15 +4414,6 @@ level-transcoder@^1.0.1: buffer "^6.0.3" module-error "^1.0.1" -level@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/level/-/level-9.0.0.tgz#880aa9d341a5411e36bed77f4fa233f425b492a8" - integrity sha512-n+mVuf63mUEkd8NUx7gwxY+QF5vtkibv6fXTGUgtHWLPDaA5/XZjLcI/Q1nQ8k6OttHT6Ezt+7nSEXsRUfHtOQ== - dependencies: - abstract-level "^2.0.1" - browser-level "^2.0.0" - classic-level "^2.0.0" - leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" From 6948ab5ff87df9a85acf11cdda0a77bd68958bf4 Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Thu, 15 Oct 2026 22:02:34 +0200 Subject: [PATCH 11/12] Close databases and handle stream errors in the Raft comparison tools Each scanned database was left open until the process exited. With the legacy layout there is one database per bucket, so file descriptors and LevelDB caches piled up over a scan: close each one when its scan is done. Errors from the database read stream were not handled either, since .pipe() does not forward them: a read error crashed the process without logging anything. Errors from any stage now go through a single callback, which logs them, closes the databases and fails the scan, keeping the original error if closing fails too. Issue: S3UTILS-249 --- CompareRaftMembers/compareFollowerDbs.js | 36 ++++++++++++------- CompareRaftMembers/followerDiff.js | 27 +++++++++----- CompareRaftMembers/levelReadStream.js | 2 +- .../CompareRaftMembers/levelReadStream.js | 13 +++++++ 4 files changed, 55 insertions(+), 23 deletions(-) diff --git a/CompareRaftMembers/compareFollowerDbs.js b/CompareRaftMembers/compareFollowerDbs.js index f5352fb3..938440d0 100644 --- a/CompareRaftMembers/compareFollowerDbs.js +++ b/CompareRaftMembers/compareFollowerDbs.js @@ -5,6 +5,7 @@ const fs = require('fs'); const path = require('path'); const stream = require('stream'); +const { jsutil } = require('@scality/arsenal'); const { Logger } = require('werelogs'); const { ClassicLevel } = require('classic-level'); @@ -208,11 +209,26 @@ function openDb(dbPath, cb) { } function streamDbsDiff(dbs, dbPair, cb) { + // .pipe() does not forward errors: report the first one from any stream + const done = jsutil.once(err => { + if (err) { + log.error( + 'error during comparison of database pair', + { db1: dbPair[0], db2: dbPair[1], error: err.message }, + ); + } else { + log.info('completed scan of database pair', { db1: dbPair[0], db2: dbPair[1] }); + } + cb(err); + }); const dbListStreams = dbs.map((db, i) => { const dbPath = dbPair[i]; const dbRawStream = levelReadStream(db); const dbListStream = new DBListStream({ dbName: path.basename(dbPath) }); - dbRawStream.pipe(dbListStream); + dbRawStream + .on('error', done) + .pipe(dbListStream) + .on('error', done); return dbListStream; }); dbListStreams[0] @@ -230,17 +246,8 @@ function streamDbsDiff(dbs, dbPair, cb) { }); } }) - .on('end', () => { - log.info('completed scan of database pair', { db1: dbPair[0], db2: dbPair[1] }); - cb(); - }) - .on('error', err => { - log.error( - 'error from diff stream', - { db1: dbPair[0], db2: dbPair[1], error: err.message }, - ); - cb(err); - }); + .on('end', () => done()) + .on('error', done); } function compareDbs(dbPair, cb) { @@ -252,7 +259,10 @@ function compareDbs(dbPair, cb) { if (err) { return cb(err); } - return streamDbsDiff(dbs, dbPair, cb); + return streamDbsDiff(dbs, dbPair, streamErr => Promise.all(dbs.map(db => db.close())).then( + () => cb(streamErr), + closeErr => cb(streamErr || closeErr), + )); }); } diff --git a/CompareRaftMembers/followerDiff.js b/CompareRaftMembers/followerDiff.js index 7cfa3fd1..c4f9d262 100644 --- a/CompareRaftMembers/followerDiff.js +++ b/CompareRaftMembers/followerDiff.js @@ -5,6 +5,7 @@ const fs = require('fs'); const path = require('path'); const stream = require('stream'); +const { jsutil } = require('@scality/arsenal'); const { Logger } = require('werelogs'); const { ClassicLevel } = require('classic-level'); @@ -204,9 +205,20 @@ function streamDbDiff(db, dbPath, cb) { bucketdPort: BUCKETD_PORT, digestsDb, }); + // .pipe() does not forward errors: report the first one from any stream + const done = jsutil.once(err => { + if (err) { + log.error('error during scan of database', { dbPath, error: err.message }); + } else { + log.info('completed scan of database', { dbPath }); + } + cb(err); + }); dbRawStream + .on('error', done) .pipe(dbListStream) + .on('error', done) .pipe(diffStream); dbListStream .on('data', () => { @@ -221,14 +233,8 @@ function streamDbDiff(db, dbPath, cb) { }); } }) - .on('end', () => { - log.info('completed scan of database', { dbPath }); - cb(); - }) - .on('error', err => { - log.error('error from diff stream', { dbPath, error: err.message }); - cb(err); - }); + .on('end', () => done()) + .on('error', done); } function scanDb(dbPath, cb) { @@ -237,7 +243,10 @@ function scanDb(dbPath, cb) { if (err) { return cb(err); } - return streamDbDiff(db, dbPath, cb); + return streamDbDiff(db, dbPath, streamErr => db.close().then( + () => cb(streamErr), + closeErr => cb(streamErr || closeErr), + )); }); } diff --git a/CompareRaftMembers/levelReadStream.js b/CompareRaftMembers/levelReadStream.js index 4954d0e7..34e7a0bb 100644 --- a/CompareRaftMembers/levelReadStream.js +++ b/CompareRaftMembers/levelReadStream.js @@ -25,7 +25,7 @@ class LevelReadStream extends Readable { } _destroy(err, callback) { - this.dbIterator.close().then(() => callback(err), callback); + this.dbIterator.close().then(() => callback(err), closeErr => callback(err || closeErr)); } } diff --git a/tests/unit/CompareRaftMembers/levelReadStream.js b/tests/unit/CompareRaftMembers/levelReadStream.js index 7a7f095d..e77eff69 100644 --- a/tests/unit/CompareRaftMembers/levelReadStream.js +++ b/tests/unit/CompareRaftMembers/levelReadStream.js @@ -102,6 +102,19 @@ describe('levelReadStream', () => { expect(iterator.close).toHaveBeenCalled(); }); + test('should keep the read error when closing the iterator also fails', async () => { + const iterator = { + next: async () => { + throw new Error('read failure'); + }, + close: async () => { + throw new Error('close failure'); + }, + }; + const readable = levelReadStream({ iterator: () => iterator }); + await expect(collect(readable)).rejects.toThrow('read failure'); + }); + test('should report a failure to close the iterator', async () => { const iterator = { next: () => new Promise(() => {}), From e287a46237c858027c24953ea278f47f519ffdee Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Thu, 15 Oct 2026 14:49:29 +0200 Subject: [PATCH 12/12] Release 1.20.0 Issue: S3UTILS-249 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6f5c5723..816b5454 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@scality/s3utils", - "version": "1.20.0-preview.1", + "version": "1.20.0", "engines": { "node": ">= 24" },