From c4a88e56eec3fd4cfc212667e8d40c8e4f1daec4 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Mon, 25 Nov 2024 11:24:35 -0500 Subject: [PATCH 01/14] Adding blurhash to image_details. - Fixes #5142 --- crates/api_common/src/request.rs | 9 ++++++--- crates/db_schema/src/impls/images.rs | 9 ++++++--- crates/db_schema/src/schema.rs | 2 ++ crates/db_schema/src/source/images.rs | 4 +++- .../down.sql | 3 +++ .../up.sql | 6 ++++++ 6 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 migrations/2024-11-25-161129_add_blurhash_to_image_details/down.sql create mode 100644 migrations/2024-11-25-161129_add_blurhash_to_image_details/up.sql diff --git a/crates/api_common/src/request.rs b/crates/api_common/src/request.rs index cc506b896d..a7c2a348ad 100644 --- a/crates/api_common/src/request.rs +++ b/crates/api_common/src/request.rs @@ -12,7 +12,7 @@ use futures::StreamExt; use lemmy_db_schema::{ newtypes::DbUrl, source::{ - images::{ImageDetailsForm, LocalImage, LocalImageForm}, + images::{ImageDetailsInsertForm, LocalImage, LocalImageForm}, post::{Post, PostUpdateForm}, site::Site, }, @@ -271,17 +271,20 @@ pub struct PictrsFileDetails { pub height: u16, pub content_type: String, pub created_at: DateTime, + // TODO this can get changed to String on future versions of pictrs + pub blurhash: Option, } impl PictrsFileDetails { /// Builds the image form. This should always use the thumbnail_url, /// Because the post_view joins to it - pub fn build_image_details_form(&self, thumbnail_url: &Url) -> ImageDetailsForm { - ImageDetailsForm { + pub fn build_image_details_form(&self, thumbnail_url: &Url) -> ImageDetailsInsertForm { + ImageDetailsInsertForm { link: thumbnail_url.clone().into(), width: self.width.into(), height: self.height.into(), content_type: self.content_type.clone(), + blurhash: self.blurhash.clone(), } } } diff --git a/crates/db_schema/src/impls/images.rs b/crates/db_schema/src/impls/images.rs index 8ded98e414..92688b8da6 100644 --- a/crates/db_schema/src/impls/images.rs +++ b/crates/db_schema/src/impls/images.rs @@ -1,7 +1,7 @@ use crate::{ newtypes::DbUrl, schema::{image_details, local_image, remote_image}, - source::images::{ImageDetails, ImageDetailsForm, LocalImage, LocalImageForm, RemoteImage}, + source::images::{ImageDetails, ImageDetailsInsertForm, LocalImage, LocalImageForm, RemoteImage}, utils::{get_conn, DbPool}, }; use diesel::{ @@ -20,7 +20,7 @@ impl LocalImage { pub async fn create( pool: &mut DbPool<'_>, form: &LocalImageForm, - image_details_form: &ImageDetailsForm, + image_details_form: &ImageDetailsInsertForm, ) -> Result { let conn = &mut get_conn(pool).await?; conn @@ -84,7 +84,10 @@ impl RemoteImage { } impl ImageDetails { - pub async fn create(pool: &mut DbPool<'_>, form: &ImageDetailsForm) -> Result { + pub async fn create( + pool: &mut DbPool<'_>, + form: &ImageDetailsInsertForm, + ) -> Result { let conn = &mut get_conn(pool).await?; insert_into(image_details::table) diff --git a/crates/db_schema/src/schema.rs b/crates/db_schema/src/schema.rs index f2b186d35d..8596d5352a 100644 --- a/crates/db_schema/src/schema.rs +++ b/crates/db_schema/src/schema.rs @@ -303,6 +303,8 @@ diesel::table! { width -> Int4, height -> Int4, content_type -> Text, + #[max_length = 50] + blurhash -> Nullable, } } diff --git a/crates/db_schema/src/source/images.rs b/crates/db_schema/src/source/images.rs index acd339d8ea..7d44efdc3d 100644 --- a/crates/db_schema/src/source/images.rs +++ b/crates/db_schema/src/source/images.rs @@ -64,14 +64,16 @@ pub struct ImageDetails { pub width: i32, pub height: i32, pub content_type: String, + pub blurhash: Option, } #[derive(Debug, Clone)] #[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = image_details))] -pub struct ImageDetailsForm { +pub struct ImageDetailsInsertForm { pub link: DbUrl, pub width: i32, pub height: i32, pub content_type: String, + pub blurhash: Option, } diff --git a/migrations/2024-11-25-161129_add_blurhash_to_image_details/down.sql b/migrations/2024-11-25-161129_add_blurhash_to_image_details/down.sql new file mode 100644 index 0000000000..0f5a50e7dd --- /dev/null +++ b/migrations/2024-11-25-161129_add_blurhash_to_image_details/down.sql @@ -0,0 +1,3 @@ +ALTER TABLE image_details + DROP COLUMN blurhash; + diff --git a/migrations/2024-11-25-161129_add_blurhash_to_image_details/up.sql b/migrations/2024-11-25-161129_add_blurhash_to_image_details/up.sql new file mode 100644 index 0000000000..9a3f5e1153 --- /dev/null +++ b/migrations/2024-11-25-161129_add_blurhash_to_image_details/up.sql @@ -0,0 +1,6 @@ +-- Add a blurhash column for image_details +ALTER TABLE image_details +-- Supposed to be 20-30 chars, use 50 to be safe +-- TODO this should be made not null for future versions of pictrs + ADD COLUMN blurhash varchar(50); + From a30171ede4859f2671c78dd00565522d2f453bca Mon Sep 17 00:00:00 2001 From: Dessalines Date: Fri, 10 Jan 2025 13:01:07 -0500 Subject: [PATCH 02/14] Using new pictrs to get blurhash. --- api_tests/prepare-drone-federation-test.sh | 4 ++-- docker/docker-compose.yml | 2 +- docker/federation/docker-compose.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/api_tests/prepare-drone-federation-test.sh b/api_tests/prepare-drone-federation-test.sh index c5151b7f56..1e1eb47744 100755 --- a/api_tests/prepare-drone-federation-test.sh +++ b/api_tests/prepare-drone-federation-test.sh @@ -16,8 +16,8 @@ export LEMMY_TEST_FAST_FEDERATION=1 # by default, the persistent federation queu # pictrs setup if [ ! -f "api_tests/pict-rs" ]; then # This one sometimes goes down - # curl "https://git.asonix.dog/asonix/pict-rs/releases/download/v0.5.16/pict-rs-linux-amd64" -o api_tests/pict-rs - curl "https://codeberg.org/asonix/pict-rs/releases/download/v0.5.6/pict-rs-linux-amd64" -o api_tests/pict-rs + curl "https://git.asonix.dog/asonix/pict-rs/releases/download/v0.5.17-pre.8/pict-rs-linux-amd64" -o api_tests/pict-rs + # curl "https://codeberg.org/asonix/pict-rs/releases/download/v0.5.6/pict-rs-linux-amd64" -o api_tests/pict-rs chmod +x api_tests/pict-rs fi ./api_tests/pict-rs \ diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index dc978244e1..26830f77a3 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -75,7 +75,7 @@ services: init: true pictrs: - image: asonix/pictrs:0.5.16 + image: asonix/pictrs:0.5.17-pre.8 # this needs to match the pictrs url in lemmy.hjson hostname: pictrs # we can set options to pictrs like this, here we set max. image size and forced format for conversion diff --git a/docker/federation/docker-compose.yml b/docker/federation/docker-compose.yml index bc4b5ea7f1..c92646155e 100644 --- a/docker/federation/docker-compose.yml +++ b/docker/federation/docker-compose.yml @@ -49,7 +49,7 @@ services: pictrs: restart: always - image: asonix/pictrs:0.5.16 + image: asonix/pictrs:0.5.17-pre.8 user: 991:991 volumes: - ./volumes/pictrs_alpha:/mnt:Z From f39a25a26f6f31907c4d0ece7ea572d3f19f4f75 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Mon, 13 Jan 2025 23:59:23 -0500 Subject: [PATCH 03/14] Fixing ts-binding. --- crates/db_schema/src/source/images.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/db_schema/src/source/images.rs b/crates/db_schema/src/source/images.rs index 7d44efdc3d..cc6f74009c 100644 --- a/crates/db_schema/src/source/images.rs +++ b/crates/db_schema/src/source/images.rs @@ -64,6 +64,7 @@ pub struct ImageDetails { pub width: i32, pub height: i32, pub content_type: String, + #[cfg_attr(feature = "full", ts(optional))] pub blurhash: Option, } From c34656b85466d9ab436e6765dc8762e4e1b4217a Mon Sep 17 00:00:00 2001 From: Dessalines Date: Tue, 14 Jan 2025 10:47:41 -0500 Subject: [PATCH 04/14] Addressing PR comments. --- crates/api_common/src/request.rs | 1 - .../2024-11-25-161129_add_blurhash_to_image_details/up.sql | 1 - 2 files changed, 2 deletions(-) diff --git a/crates/api_common/src/request.rs b/crates/api_common/src/request.rs index 64830283b9..84d161368a 100644 --- a/crates/api_common/src/request.rs +++ b/crates/api_common/src/request.rs @@ -293,7 +293,6 @@ pub struct PictrsFileDetails { pub height: u16, pub content_type: String, pub created_at: DateTime, - // TODO this can get changed to String on future versions of pictrs pub blurhash: Option, } diff --git a/migrations/2024-11-25-161129_add_blurhash_to_image_details/up.sql b/migrations/2024-11-25-161129_add_blurhash_to_image_details/up.sql index 9a3f5e1153..14a6e253c2 100644 --- a/migrations/2024-11-25-161129_add_blurhash_to_image_details/up.sql +++ b/migrations/2024-11-25-161129_add_blurhash_to_image_details/up.sql @@ -1,6 +1,5 @@ -- Add a blurhash column for image_details ALTER TABLE image_details -- Supposed to be 20-30 chars, use 50 to be safe --- TODO this should be made not null for future versions of pictrs ADD COLUMN blurhash varchar(50); From fb305ba9f2bb85dfcfd62ee94c0e6dba4a3292ee Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 23 Jan 2025 22:19:06 -0500 Subject: [PATCH 05/14] Commenting checks. --- .woodpecker.yml | 288 ++++++++++++++++++++++++------------------------ 1 file changed, 144 insertions(+), 144 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index fe549aa8a2..b30c8152b9 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -45,138 +45,138 @@ steps: when: - event: [pull_request, tag] - prettier_check: - image: tmknom/prettier:3.2.5 - commands: - - prettier -c . '!**/volumes' '!**/dist' '!target' '!**/translations' '!api_tests/pnpm-lock.yaml' - when: - - event: pull_request + # prettier_check: + # image: tmknom/prettier:3.2.5 + # commands: + # - prettier -c . '!**/volumes' '!**/dist' '!target' '!**/translations' '!api_tests/pnpm-lock.yaml' + # when: + # - event: pull_request - toml_fmt: - image: tamasfe/taplo:0.9.3 - commands: - - taplo format --check - when: - - event: pull_request + # toml_fmt: + # image: tamasfe/taplo:0.9.3 + # commands: + # - taplo format --check + # when: + # - event: pull_request - sql_fmt: - image: backplane/pgformatter - commands: - - ./scripts/sql_format_check.sh - when: - - event: pull_request + # sql_fmt: + # image: backplane/pgformatter + # commands: + # - ./scripts/sql_format_check.sh + # when: + # - event: pull_request - cargo_fmt: - image: *rust_nightly_image - environment: - # store cargo data in repo folder so that it gets cached between steps - CARGO_HOME: .cargo_home - commands: - - rustup component add rustfmt - - cargo +nightly fmt -- --check - when: - - event: pull_request + # cargo_fmt: + # image: *rust_nightly_image + # environment: + # # store cargo data in repo folder so that it gets cached between steps + # CARGO_HOME: .cargo_home + # commands: + # - rustup component add rustfmt + # - cargo +nightly fmt -- --check + # when: + # - event: pull_request - cargo_shear: - image: *rust_nightly_image - commands: - - *install_binstall - - cargo binstall -y cargo-shear - - cargo shear - when: - - event: pull_request + # cargo_shear: + # image: *rust_nightly_image + # commands: + # - *install_binstall + # - cargo binstall -y cargo-shear + # - cargo shear + # when: + # - event: pull_request - ignored_files: - image: alpine:3 - commands: - - apk add git - - IGNORED=$(git ls-files --cached -i --exclude-standard) - - if [[ "$IGNORED" ]]; then echo "Ignored files present:\n$IGNORED\n"; exit 1; fi - when: - - event: pull_request + # ignored_files: + # image: alpine:3 + # commands: + # - apk add git + # - IGNORED=$(git ls-files --cached -i --exclude-standard) + # - if [[ "$IGNORED" ]]; then echo "Ignored files present:\n$IGNORED\n"; exit 1; fi + # when: + # - event: pull_request - cargo_clippy: - image: *rust_image - environment: - CARGO_HOME: .cargo_home - commands: - - rustup component add clippy - - cargo clippy --workspace --tests --all-targets -- -D warnings - when: *slow_check_paths + # cargo_clippy: + # image: *rust_image + # environment: + # CARGO_HOME: .cargo_home + # commands: + # - rustup component add clippy + # - cargo clippy --workspace --tests --all-targets -- -D warnings + # when: *slow_check_paths - # `DROP OWNED` doesn't work for default user - create_database_user: - image: postgres:16-alpine - environment: - PGUSER: postgres - PGPASSWORD: password - PGHOST: database - PGDATABASE: lemmy - commands: - - psql -c "CREATE USER lemmy WITH PASSWORD 'password' SUPERUSER;" - when: *slow_check_paths + # # `DROP OWNED` doesn't work for default user + # create_database_user: + # image: postgres:16-alpine + # environment: + # PGUSER: postgres + # PGPASSWORD: password + # PGHOST: database + # PGDATABASE: lemmy + # commands: + # - psql -c "CREATE USER lemmy WITH PASSWORD 'password' SUPERUSER;" + # when: *slow_check_paths - cargo_test: - image: *rust_image - environment: - LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy - RUST_BACKTRACE: "1" - CARGO_HOME: .cargo_home - LEMMY_TEST_FAST_FEDERATION: "1" - LEMMY_CONFIG_LOCATION: ../../config/config.hjson - commands: - # Install pg_dump for the schema setup test (must match server version) - - apt update && apt install -y lsb-release - - sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' - - wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - - - apt update && apt install -y postgresql-client-16 - # Run tests - - cargo test --workspace --no-fail-fast - when: *slow_check_paths + # cargo_test: + # image: *rust_image + # environment: + # LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy + # RUST_BACKTRACE: "1" + # CARGO_HOME: .cargo_home + # LEMMY_TEST_FAST_FEDERATION: "1" + # LEMMY_CONFIG_LOCATION: ../../config/config.hjson + # commands: + # # Install pg_dump for the schema setup test (must match server version) + # - apt update && apt install -y lsb-release + # - sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' + # - wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - + # - apt update && apt install -y postgresql-client-16 + # # Run tests + # - cargo test --workspace --no-fail-fast + # when: *slow_check_paths - check_ts_bindings: - image: *rust_image - environment: - CARGO_HOME: .cargo_home - commands: - - ./scripts/ts_bindings_check.sh - when: - - event: pull_request + # check_ts_bindings: + # image: *rust_image + # environment: + # CARGO_HOME: .cargo_home + # commands: + # - ./scripts/ts_bindings_check.sh + # when: + # - event: pull_request - # make sure api builds with default features (used by other crates relying on lemmy api) - check_api_common_default_features: - image: *rust_image - environment: - CARGO_HOME: .cargo_home - commands: - - cargo check --package lemmy_api_common - when: *slow_check_paths + # # make sure api builds with default features (used by other crates relying on lemmy api) + # check_api_common_default_features: + # image: *rust_image + # environment: + # CARGO_HOME: .cargo_home + # commands: + # - cargo check --package lemmy_api_common + # when: *slow_check_paths - lemmy_api_common_doesnt_depend_on_diesel: - image: *rust_image - environment: - CARGO_HOME: .cargo_home - commands: - - "! cargo tree -p lemmy_api_common --no-default-features -i diesel" - when: *slow_check_paths + # lemmy_api_common_doesnt_depend_on_diesel: + # image: *rust_image + # environment: + # CARGO_HOME: .cargo_home + # commands: + # - "! cargo tree -p lemmy_api_common --no-default-features -i diesel" + # when: *slow_check_paths - lemmy_api_common_works_with_wasm: - image: *rust_image - environment: - CARGO_HOME: .cargo_home - commands: - - "rustup target add wasm32-unknown-unknown" - - "cargo check --target wasm32-unknown-unknown -p lemmy_api_common" - when: *slow_check_paths + # lemmy_api_common_works_with_wasm: + # image: *rust_image + # environment: + # CARGO_HOME: .cargo_home + # commands: + # - "rustup target add wasm32-unknown-unknown" + # - "cargo check --target wasm32-unknown-unknown -p lemmy_api_common" + # when: *slow_check_paths - check_defaults_hjson_updated: - image: *rust_image - environment: - CARGO_HOME: .cargo_home - commands: - - ./scripts/update_config_defaults.sh config/defaults_current.hjson - - diff config/defaults.hjson config/defaults_current.hjson - when: *slow_check_paths + # check_defaults_hjson_updated: + # image: *rust_image + # environment: + # CARGO_HOME: .cargo_home + # commands: + # - ./scripts/update_config_defaults.sh config/defaults_current.hjson + # - diff config/defaults.hjson config/defaults_current.hjson + # when: *slow_check_paths cargo_build: image: *rust_image @@ -187,31 +187,31 @@ steps: - mv target/debug/lemmy_server target/lemmy_server when: *slow_check_paths - check_diesel_schema: - image: *rust_image - environment: - LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy - DATABASE_URL: postgres://lemmy:password@database:5432/lemmy - RUST_BACKTRACE: "1" - CARGO_HOME: .cargo_home - commands: - - cp crates/db_schema/src/schema.rs tmp.schema - - target/lemmy_server migration --all run - - <<: *install_diesel_cli - - diesel print-schema - - diff tmp.schema crates/db_schema/src/schema.rs - when: *slow_check_paths + # check_diesel_schema: + # image: *rust_image + # environment: + # LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy + # DATABASE_URL: postgres://lemmy:password@database:5432/lemmy + # RUST_BACKTRACE: "1" + # CARGO_HOME: .cargo_home + # commands: + # - cp crates/db_schema/src/schema.rs tmp.schema + # - target/lemmy_server migration --all run + # - <<: *install_diesel_cli + # - diesel print-schema + # - diff tmp.schema crates/db_schema/src/schema.rs + # when: *slow_check_paths - check_db_perf_tool: - image: *rust_image - environment: - LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy - RUST_BACKTRACE: "1" - CARGO_HOME: .cargo_home - commands: - # same as scripts/db_perf.sh but without creating a new database server - - cargo run --package lemmy_db_perf -- --posts 10 --read-post-pages 1 - when: *slow_check_paths + # check_db_perf_tool: + # image: *rust_image + # environment: + # LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy + # RUST_BACKTRACE: "1" + # CARGO_HOME: .cargo_home + # commands: + # # same as scripts/db_perf.sh but without creating a new database server + # - cargo run --package lemmy_db_perf -- --posts 10 --read-post-pages 1 + # when: *slow_check_paths run_federation_tests: image: node:22-bookworm-slim @@ -224,7 +224,7 @@ steps: - bash api_tests/prepare-drone-federation-test.sh - cd api_tests/ - pnpm i - - pnpm api-test + - pnpm api-test-image when: *slow_check_paths federation_tests_server_output: From 00d177094a634a62c84f93c7bf73f515d40c964f Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 23 Jan 2025 22:20:53 -0500 Subject: [PATCH 06/14] Switching back to rust 1.81. --- .woodpecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index b30c8152b9..e255b87db0 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -6,7 +6,7 @@ variables: # as well. Otherwise release builds can fail if Lemmy or dependencies rely on new Rust # features. In particular the ARM builder image needs to be updated manually in the repo below: # https://github.com/raskyld/lemmy-cross-toolchains - - &rust_image "rust:1.83" + - &rust_image "rust:1.81" - &rust_nightly_image "rustlang/rust:nightly" - &install_pnpm "corepack enable pnpm" - &install_binstall "wget -O- https://github.com/cargo-bins/cargo-binstall/releases/latest/download/cargo-binstall-x86_64-unknown-linux-musl.tgz | tar -xvz -C /usr/local/cargo/bin" From ad017c523910f16bc09ae0a77daf994072f9aad0 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 23 Jan 2025 22:27:00 -0500 Subject: [PATCH 07/14] Adding diesel schema --- .woodpecker.yml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index e255b87db0..0c60568fd6 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -187,20 +187,20 @@ steps: - mv target/debug/lemmy_server target/lemmy_server when: *slow_check_paths - # check_diesel_schema: - # image: *rust_image - # environment: - # LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy - # DATABASE_URL: postgres://lemmy:password@database:5432/lemmy - # RUST_BACKTRACE: "1" - # CARGO_HOME: .cargo_home - # commands: - # - cp crates/db_schema/src/schema.rs tmp.schema - # - target/lemmy_server migration --all run - # - <<: *install_diesel_cli - # - diesel print-schema - # - diff tmp.schema crates/db_schema/src/schema.rs - # when: *slow_check_paths + check_diesel_schema: + image: *rust_image + environment: + LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy + DATABASE_URL: postgres://lemmy:password@database:5432/lemmy + RUST_BACKTRACE: "1" + CARGO_HOME: .cargo_home + commands: + - cp crates/db_schema/src/schema.rs tmp.schema + - target/lemmy_server migration --all run + - <<: *install_diesel_cli + - diesel print-schema + - diff tmp.schema crates/db_schema/src/schema.rs + when: *slow_check_paths # check_db_perf_tool: # image: *rust_image From 04aa24c1e1f1221185c14d37052ee37df585e133 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 23 Jan 2025 22:37:17 -0500 Subject: [PATCH 08/14] Adding database user creation. --- .woodpecker.yml | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 0c60568fd6..188bcdba7a 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -45,6 +45,19 @@ steps: when: - event: [pull_request, tag] + # `DROP OWNED` doesn't work for default user + create_database_user: + image: postgres:16-alpine + environment: + PGUSER: postgres + PGPASSWORD: password + PGHOST: database + PGDATABASE: lemmy + commands: + - psql -c "CREATE USER lemmy WITH PASSWORD 'password' SUPERUSER;" + when: *slow_check_paths + + # prettier_check: # image: tmknom/prettier:3.2.5 # commands: @@ -104,18 +117,6 @@ steps: # - cargo clippy --workspace --tests --all-targets -- -D warnings # when: *slow_check_paths - # # `DROP OWNED` doesn't work for default user - # create_database_user: - # image: postgres:16-alpine - # environment: - # PGUSER: postgres - # PGPASSWORD: password - # PGHOST: database - # PGDATABASE: lemmy - # commands: - # - psql -c "CREATE USER lemmy WITH PASSWORD 'password' SUPERUSER;" - # when: *slow_check_paths - # cargo_test: # image: *rust_image # environment: @@ -187,7 +188,7 @@ steps: - mv target/debug/lemmy_server target/lemmy_server when: *slow_check_paths - check_diesel_schema: + check_and_run_diesel_schema: image: *rust_image environment: LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy From 9b562ae354c083cc07b4604e2adf67e55483e576 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Fri, 24 Jan 2025 12:38:49 -0500 Subject: [PATCH 09/14] Specific tests. --- api_tests/prepare-drone-federation-test.sh | 1 + api_tests/run-federation-test.sh | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/api_tests/prepare-drone-federation-test.sh b/api_tests/prepare-drone-federation-test.sh index 1f3eca0ec1..bc00d97244 100755 --- a/api_tests/prepare-drone-federation-test.sh +++ b/api_tests/prepare-drone-federation-test.sh @@ -33,6 +33,7 @@ if [ ! -f "$PICTRS_PATH" ]; then fi ./api_tests/pict-rs \ + --log-targets WARN,ERROR,INFO \ run -a 0.0.0.0:8080 \ --danger-dummy-mode \ --api-key "my-pictrs-key" \ diff --git a/api_tests/run-federation-test.sh b/api_tests/run-federation-test.sh index 969a95b3e7..f9eab50395 100755 --- a/api_tests/run-federation-test.sh +++ b/api_tests/run-federation-test.sh @@ -11,7 +11,7 @@ killall -s1 lemmy_server || true popd pnpm i -pnpm api-test || true +pnpm api-test-image || true killall -s1 lemmy_server || true killall -s1 pict-rs || true From 1ea42641cc6ac8770a6c42a1a3651523967be9f2 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Sun, 9 Feb 2025 20:22:04 -0500 Subject: [PATCH 10/14] Upping pictrs to 0.5.17-pre.9 --- docker/docker-compose.yml | 2 +- docker/federation/docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 895c6f26c0..42eb048980 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -75,7 +75,7 @@ services: init: true pictrs: - image: asonix/pictrs:0.5.17-pre.8 + image: asonix/pictrs:0.5.17-pre.9 # this needs to match the pictrs url in lemmy.hjson hostname: pictrs # we can set options to pictrs like this, here we set max. image size and forced format for conversion diff --git a/docker/federation/docker-compose.yml b/docker/federation/docker-compose.yml index cf520368cc..7148216ad3 100644 --- a/docker/federation/docker-compose.yml +++ b/docker/federation/docker-compose.yml @@ -49,7 +49,7 @@ services: pictrs: restart: always - image: asonix/pictrs:0.5.17-pre.8 + image: asonix/pictrs:0.5.17-pre.9 user: 991:991 volumes: - ./volumes/pictrs_alpha:/mnt:Z From e708a5da913eb1ed9764e24fb33bc4231ebd8715 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Sun, 9 Feb 2025 20:31:56 -0500 Subject: [PATCH 11/14] Fixing --- .woodpecker.yml | 257 ++++++++++----------- api_tests/prepare-drone-federation-test.sh | 2 +- 2 files changed, 129 insertions(+), 130 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 0e44255945..21b9c1013a 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -6,7 +6,7 @@ variables: # as well. Otherwise release builds can fail if Lemmy or dependencies rely on new Rust # features. In particular the ARM builder image needs to be updated manually in the repo below: # https://github.com/raskyld/lemmy-cross-toolchains - - &rust_image "rust:1.81" + - &rust_image "rust:1.83" - &rust_nightly_image "rustlang/rust:nightly" - &install_pnpm "npm install -g corepack@latest && corepack enable pnpm" - &install_binstall "wget -O- https://github.com/cargo-bins/cargo-binstall/releases/latest/download/cargo-binstall-x86_64-unknown-linux-musl.tgz | tar -xvz -C /usr/local/cargo/bin" @@ -45,6 +45,65 @@ steps: when: - event: [pull_request, tag] + prettier_check: + image: tmknom/prettier:3.2.5 + commands: + - prettier -c . '!**/volumes' '!**/dist' '!target' '!**/translations' '!api_tests/pnpm-lock.yaml' + when: + - event: pull_request + + toml_fmt: + image: tamasfe/taplo:0.9.3 + commands: + - taplo format --check + when: + - event: pull_request + + sql_fmt: + image: backplane/pgformatter + commands: + - ./scripts/sql_format_check.sh + when: + - event: pull_request + + cargo_fmt: + image: *rust_nightly_image + environment: + # store cargo data in repo folder so that it gets cached between steps + CARGO_HOME: .cargo_home + commands: + - rustup component add rustfmt + - cargo +nightly fmt -- --check + when: + - event: pull_request + + cargo_shear: + image: *rust_nightly_image + commands: + - *install_binstall + - cargo binstall -y cargo-shear + - cargo shear + when: + - event: pull_request + + ignored_files: + image: alpine:3 + commands: + - apk add git + - IGNORED=$(git ls-files --cached -i --exclude-standard) + - if [[ "$IGNORED" ]]; then echo "Ignored files present:\n$IGNORED\n"; exit 1; fi + when: + - event: pull_request + + cargo_clippy: + image: *rust_image + environment: + CARGO_HOME: .cargo_home + commands: + - rustup component add clippy + - cargo clippy --workspace --tests --all-targets -- -D warnings + when: *slow_check_paths + # `DROP OWNED` doesn't work for default user create_database_user: image: postgres:16-alpine @@ -57,127 +116,67 @@ steps: - psql -c "CREATE USER lemmy WITH PASSWORD 'password' SUPERUSER;" when: *slow_check_paths + cargo_test: + image: *rust_image + environment: + LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy + RUST_BACKTRACE: "1" + CARGO_HOME: .cargo_home + LEMMY_TEST_FAST_FEDERATION: "1" + LEMMY_CONFIG_LOCATION: ../../config/config.hjson + commands: + # Install pg_dump for the schema setup test (must match server version) + - apt update && apt install -y lsb-release + - sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' + - wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - + - apt update && apt install -y postgresql-client-16 + # Run tests + - cargo test --workspace --no-fail-fast + when: *slow_check_paths - # prettier_check: - # image: tmknom/prettier:3.2.5 - # commands: - # - prettier -c . '!**/volumes' '!**/dist' '!target' '!**/translations' '!api_tests/pnpm-lock.yaml' - # when: - # - event: pull_request - - # toml_fmt: - # image: tamasfe/taplo:0.9.3 - # commands: - # - taplo format --check - # when: - # - event: pull_request - - # sql_fmt: - # image: backplane/pgformatter - # commands: - # - ./scripts/sql_format_check.sh - # when: - # - event: pull_request - - # cargo_fmt: - # image: *rust_nightly_image - # environment: - # # store cargo data in repo folder so that it gets cached between steps - # CARGO_HOME: .cargo_home - # commands: - # - rustup component add rustfmt - # - cargo +nightly fmt -- --check - # when: - # - event: pull_request - - # cargo_shear: - # image: *rust_nightly_image - # commands: - # - *install_binstall - # - cargo binstall -y cargo-shear - # - cargo shear - # when: - # - event: pull_request - - # ignored_files: - # image: alpine:3 - # commands: - # - apk add git - # - IGNORED=$(git ls-files --cached -i --exclude-standard) - # - if [[ "$IGNORED" ]]; then echo "Ignored files present:\n$IGNORED\n"; exit 1; fi - # when: - # - event: pull_request - - # cargo_clippy: - # image: *rust_image - # environment: - # CARGO_HOME: .cargo_home - # commands: - # - rustup component add clippy - # - cargo clippy --workspace --tests --all-targets -- -D warnings - # when: *slow_check_paths - - # cargo_test: - # image: *rust_image - # environment: - # LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy - # RUST_BACKTRACE: "1" - # CARGO_HOME: .cargo_home - # LEMMY_TEST_FAST_FEDERATION: "1" - # LEMMY_CONFIG_LOCATION: ../../config/config.hjson - # commands: - # # Install pg_dump for the schema setup test (must match server version) - # - apt update && apt install -y lsb-release - # - sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' - # - wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - - # - apt update && apt install -y postgresql-client-16 - # # Run tests - # - cargo test --workspace --no-fail-fast - # when: *slow_check_paths - - # check_ts_bindings: - # image: *rust_image - # environment: - # CARGO_HOME: .cargo_home - # commands: - # - ./scripts/ts_bindings_check.sh - # when: - # - event: pull_request + check_ts_bindings: + image: *rust_image + environment: + CARGO_HOME: .cargo_home + commands: + - ./scripts/ts_bindings_check.sh + when: + - event: pull_request - # # make sure api builds with default features (used by other crates relying on lemmy api) - # check_api_common_default_features: - # image: *rust_image - # environment: - # CARGO_HOME: .cargo_home - # commands: - # - cargo check --package lemmy_api_common - # when: *slow_check_paths + # make sure api builds with default features (used by other crates relying on lemmy api) + check_api_common_default_features: + image: *rust_image + environment: + CARGO_HOME: .cargo_home + commands: + - cargo check --package lemmy_api_common + when: *slow_check_paths - # lemmy_api_common_doesnt_depend_on_diesel: - # image: *rust_image - # environment: - # CARGO_HOME: .cargo_home - # commands: - # - "! cargo tree -p lemmy_api_common --no-default-features -i diesel" - # when: *slow_check_paths + lemmy_api_common_doesnt_depend_on_diesel: + image: *rust_image + environment: + CARGO_HOME: .cargo_home + commands: + - "! cargo tree -p lemmy_api_common --no-default-features -i diesel" + when: *slow_check_paths - # lemmy_api_common_works_with_wasm: - # image: *rust_image - # environment: - # CARGO_HOME: .cargo_home - # commands: - # - "rustup target add wasm32-unknown-unknown" - # - "cargo check --target wasm32-unknown-unknown -p lemmy_api_common" - # when: *slow_check_paths + lemmy_api_common_works_with_wasm: + image: *rust_image + environment: + CARGO_HOME: .cargo_home + commands: + - "rustup target add wasm32-unknown-unknown" + - "cargo check --target wasm32-unknown-unknown -p lemmy_api_common" + when: *slow_check_paths - # check_defaults_hjson_updated: - # image: *rust_image - # environment: - # CARGO_HOME: .cargo_home - # commands: - # - ./scripts/update_config_defaults.sh config/defaults_current.hjson - # - diff config/defaults.hjson config/defaults_current.hjson - # when: *slow_check_paths + check_defaults_hjson_updated: + image: *rust_image + environment: + CARGO_HOME: .cargo_home + commands: + - ./scripts/update_config_defaults.sh config/defaults_current.hjson + - diff config/defaults.hjson config/defaults_current.hjson + when: *slow_check_paths cargo_build: image: *rust_image @@ -188,7 +187,7 @@ steps: - mv target/debug/lemmy_server target/lemmy_server when: *slow_check_paths - check_and_run_diesel_schema: + check_diesel_schema: image: *rust_image environment: LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy @@ -203,16 +202,16 @@ steps: - diff tmp.schema crates/db_schema/src/schema.rs when: *slow_check_paths - # check_db_perf_tool: - # image: *rust_image - # environment: - # LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy - # RUST_BACKTRACE: "1" - # CARGO_HOME: .cargo_home - # commands: - # # same as scripts/db_perf.sh but without creating a new database server - # - cargo run --package lemmy_db_perf -- --posts 10 --read-post-pages 1 - # when: *slow_check_paths + check_db_perf_tool: + image: *rust_image + environment: + LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy + RUST_BACKTRACE: "1" + CARGO_HOME: .cargo_home + commands: + # same as scripts/db_perf.sh but without creating a new database server + - cargo run --package lemmy_db_perf -- --posts 10 --read-post-pages 1 + when: *slow_check_paths run_federation_tests: image: node:22-bookworm-slim @@ -225,7 +224,7 @@ steps: - bash api_tests/prepare-drone-federation-test.sh - cd api_tests/ - pnpm i - - pnpm api-test-image + - pnpm api-test when: *slow_check_paths federation_tests_server_output: diff --git a/api_tests/prepare-drone-federation-test.sh b/api_tests/prepare-drone-federation-test.sh index f9d61417ae..d266fa8e1b 100755 --- a/api_tests/prepare-drone-federation-test.sh +++ b/api_tests/prepare-drone-federation-test.sh @@ -23,7 +23,7 @@ if [ ! -f "$PICTRS_PATH" ]; then while $retry && [ "$count" -lt 3 ] do # This one sometimes goes down - curl "https://git.asonix.dog/asonix/pict-rs/releases/download/v0.5.17-pre.8/pict-rs-linux-amd64" -o "$PICTRS_PATH" + curl "https://git.asonix.dog/asonix/pict-rs/releases/download/v0.5.17-pre.9/pict-rs-linux-amd64" -o "$PICTRS_PATH" # curl "https://codeberg.org/asonix/pict-rs/releases/download/v0.5.5/pict-rs-linux-amd64" -o "$PICTRS_PATH" PICTRS_HASH=$(sha256sum "$PICTRS_PATH") [[ "$PICTRS_HASH" != "$PICTRS_EXPECTED_HASH" ]] && retry=true || retry=false From cd5a769144b1b69d5383d3f7ca5148a7f6446224 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Sun, 9 Feb 2025 20:33:43 -0500 Subject: [PATCH 12/14] Using full tests. --- api_tests/prepare-drone-federation-test.sh | 1 - api_tests/run-federation-test.sh | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/api_tests/prepare-drone-federation-test.sh b/api_tests/prepare-drone-federation-test.sh index d266fa8e1b..ee9fb91e43 100755 --- a/api_tests/prepare-drone-federation-test.sh +++ b/api_tests/prepare-drone-federation-test.sh @@ -33,7 +33,6 @@ if [ ! -f "$PICTRS_PATH" ]; then fi ./api_tests/pict-rs \ - --log-targets WARN,ERROR,INFO \ run -a 0.0.0.0:8080 \ --danger-dummy-mode \ --api-key "my-pictrs-key" \ diff --git a/api_tests/run-federation-test.sh b/api_tests/run-federation-test.sh index f9eab50395..969a95b3e7 100755 --- a/api_tests/run-federation-test.sh +++ b/api_tests/run-federation-test.sh @@ -11,7 +11,7 @@ killall -s1 lemmy_server || true popd pnpm i -pnpm api-test-image || true +pnpm api-test || true killall -s1 lemmy_server || true killall -s1 pict-rs || true From a53e1e003929fd1841d3b6b1311ec13351e199b7 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Mon, 10 Feb 2025 16:19:17 -0500 Subject: [PATCH 13/14] Fixing pictrs hash. --- api_tests/prepare-drone-federation-test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api_tests/prepare-drone-federation-test.sh b/api_tests/prepare-drone-federation-test.sh index 1597085c57..ec492655f4 100755 --- a/api_tests/prepare-drone-federation-test.sh +++ b/api_tests/prepare-drone-federation-test.sh @@ -14,7 +14,7 @@ export RUST_LOG="warn,lemmy_server=$LEMMY_LOG_LEVEL,lemmy_federate=$LEMMY_LOG_LE export LEMMY_TEST_FAST_FEDERATION=1 # by default, the persistent federation queue has delays in the scale of 30s-5min PICTRS_PATH="api_tests/pict-rs" -PICTRS_EXPECTED_HASH="d5e6ceb49d955e9f839a191f88ae86d744c291fbca295bba0029518770634e38 api_tests/pict-rs" +PICTRS_EXPECTED_HASH="7f7ac2a45ef9b13403ee139b7512135be6b060ff2f6460e0c800e18e1b49d2fd api_tests/pict-rs" # Pictrs setup. Download file with hash check and up to 3 retries. if [ ! -f "$PICTRS_PATH" ]; then From 07e14b0177ab56f48f6eddcc4c3706a34045888f Mon Sep 17 00:00:00 2001 From: Dessalines Date: Mon, 10 Feb 2025 16:21:05 -0500 Subject: [PATCH 14/14] Upgrading pnpm deps. --- api_tests/package.json | 14 +- api_tests/pnpm-lock.yaml | 289 ++++++++++++++++++++------------------- 2 files changed, 159 insertions(+), 144 deletions(-) diff --git a/api_tests/package.json b/api_tests/package.json index 46e14ab152..e2953d6b33 100644 --- a/api_tests/package.json +++ b/api_tests/package.json @@ -6,7 +6,7 @@ "repository": "https://github.com/LemmyNet/lemmy", "author": "Dessalines", "license": "AGPL-3.0", - "packageManager": "pnpm@9.15.0", + "packageManager": "pnpm@10.2.1+sha512.398035c7bd696d0ba0b10a688ed558285329d27ea994804a52bad9167d8e3a72bcb993f9699585d3ca25779ac64949ef422757a6c31102c12ab932e5cbe5cc92", "scripts": { "lint": "tsc --noEmit && eslint --report-unused-disable-directives && prettier --check 'src/**/*.ts'", "fix": "prettier --write src && eslint --fix src", @@ -23,17 +23,17 @@ "devDependencies": { "@types/jest": "^29.5.12", "@types/joi": "^17.2.3", - "@types/node": "^22.10.7", - "@typescript-eslint/eslint-plugin": "^8.21.0", - "@typescript-eslint/parser": "^8.21.0", - "eslint": "^9.18.0", + "@types/node": "^22.13.1", + "@typescript-eslint/eslint-plugin": "^8.24.0", + "@typescript-eslint/parser": "^8.24.0", + "eslint": "^9.20.0", "eslint-plugin-prettier": "^5.2.3", "jest": "^29.5.0", "lemmy-js-client": "0.20.0-ap-id.1", - "prettier": "^3.4.2", + "prettier": "^3.5.0", "ts-jest": "^29.1.0", "tsoa": "^6.6.0", "typescript": "^5.7.3", - "typescript-eslint": "^8.21.0" + "typescript-eslint": "^8.24.0" } } diff --git a/api_tests/pnpm-lock.yaml b/api_tests/pnpm-lock.yaml index e218e38967..cd2112bb45 100644 --- a/api_tests/pnpm-lock.yaml +++ b/api_tests/pnpm-lock.yaml @@ -15,32 +15,32 @@ importers: specifier: ^17.2.3 version: 17.2.3 '@types/node': - specifier: ^22.10.7 - version: 22.10.7 + specifier: ^22.13.1 + version: 22.13.1 '@typescript-eslint/eslint-plugin': - specifier: ^8.21.0 - version: 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3) + specifier: ^8.24.0 + version: 8.24.0(@typescript-eslint/parser@8.24.0(eslint@9.20.0)(typescript@5.7.3))(eslint@9.20.0)(typescript@5.7.3) '@typescript-eslint/parser': - specifier: ^8.21.0 - version: 8.21.0(eslint@9.18.0)(typescript@5.7.3) + specifier: ^8.24.0 + version: 8.24.0(eslint@9.20.0)(typescript@5.7.3) eslint: - specifier: ^9.18.0 - version: 9.18.0 + specifier: ^9.20.0 + version: 9.20.0 eslint-plugin-prettier: specifier: ^5.2.3 - version: 5.2.3(eslint@9.18.0)(prettier@3.4.2) + version: 5.2.3(eslint@9.20.0)(prettier@3.5.0) jest: specifier: ^29.5.0 - version: 29.7.0(@types/node@22.10.7) + version: 29.7.0(@types/node@22.13.1) lemmy-js-client: specifier: 0.20.0-ap-id.1 version: 0.20.0-ap-id.1 prettier: - specifier: ^3.4.2 - version: 3.4.2 + specifier: ^3.5.0 + version: 3.5.0 ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.23.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@22.10.7))(typescript@5.7.3) + version: 29.2.5(@babel/core@7.23.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@22.13.1))(typescript@5.7.3) tsoa: specifier: ^6.6.0 version: 6.6.0 @@ -48,8 +48,8 @@ importers: specifier: ^5.7.3 version: 5.7.3 typescript-eslint: - specifier: ^8.21.0 - version: 8.21.0(eslint@9.18.0)(typescript@5.7.3) + specifier: ^8.24.0 + version: 8.24.0(eslint@9.20.0)(typescript@5.7.3) packages: @@ -242,12 +242,16 @@ packages: resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@0.11.0': + resolution: {integrity: sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@3.2.0': resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.18.0': - resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==} + '@eslint/js@9.20.0': + resolution: {integrity: sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.5': @@ -597,8 +601,8 @@ packages: '@types/multer@1.4.12': resolution: {integrity: sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg==} - '@types/node@22.10.7': - resolution: {integrity: sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==} + '@types/node@22.13.1': + resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==} '@types/qs@6.9.18': resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} @@ -621,51 +625,51 @@ packages: '@types/yargs@17.0.32': resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} - '@typescript-eslint/eslint-plugin@8.21.0': - resolution: {integrity: sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==} + '@typescript-eslint/eslint-plugin@8.24.0': + resolution: {integrity: sha512-aFcXEJJCI4gUdXgoo/j9udUYIHgF23MFkg09LFz2dzEmU0+1Plk4rQWv/IYKvPHAtlkkGoB3m5e6oUp+JPsNaQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.21.0': - resolution: {integrity: sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==} + '@typescript-eslint/parser@8.24.0': + resolution: {integrity: sha512-MFDaO9CYiard9j9VepMNa9MTcqVvSny2N4hkY6roquzj8pdCBRENhErrteaQuu7Yjn1ppk0v1/ZF9CG3KIlrTA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.21.0': - resolution: {integrity: sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==} + '@typescript-eslint/scope-manager@8.24.0': + resolution: {integrity: sha512-HZIX0UByphEtdVBKaQBgTDdn9z16l4aTUz8e8zPQnyxwHBtf5vtl1L+OhH+m1FGV9DrRmoDuYKqzVrvWDcDozw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.21.0': - resolution: {integrity: sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==} + '@typescript-eslint/type-utils@8.24.0': + resolution: {integrity: sha512-8fitJudrnY8aq0F1wMiPM1UUgiXQRJ5i8tFjq9kGfRajU+dbPyOuHbl0qRopLEidy0MwqgTHDt6CnSeXanNIwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.21.0': - resolution: {integrity: sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==} + '@typescript-eslint/types@8.24.0': + resolution: {integrity: sha512-VacJCBTyje7HGAw7xp11q439A+zeGG0p0/p2zsZwpnMzjPB5WteaWqt4g2iysgGFafrqvyLWqq6ZPZAOCoefCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.21.0': - resolution: {integrity: sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==} + '@typescript-eslint/typescript-estree@8.24.0': + resolution: {integrity: sha512-ITjYcP0+8kbsvT9bysygfIfb+hBj6koDsu37JZG7xrCiy3fPJyNmfVtaGsgTUSEuTzcvME5YI5uyL5LD1EV5ZQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.21.0': - resolution: {integrity: sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==} + '@typescript-eslint/utils@8.24.0': + resolution: {integrity: sha512-07rLuUBElvvEb1ICnafYWr4hk8/U7X9RDCOqd9JcAMtjh/9oRmcfN4yGzbPVirgMR0+HLVHehmu19CWeh7fsmQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.21.0': - resolution: {integrity: sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==} + '@typescript-eslint/visitor-keys@8.24.0': + resolution: {integrity: sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} accepts@1.3.8: @@ -1020,8 +1024,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.18.0: - resolution: {integrity: sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==} + eslint@9.20.0: + resolution: {integrity: sha512-aL4F8167Hg4IvsW89ejnpTwx+B/UQRzJPGgbIOl+4XqffWsahVVsLEWoZvnrVuwpWmnRd7XeXmQI1zlKcFDteA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1091,8 +1095,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.18.0: - resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} + fastq@1.19.0: + resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} @@ -1770,8 +1774,8 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier@3.4.2: - resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + prettier@3.5.0: + resolution: {integrity: sha512-quyMrVt6svPS7CjQ9gKb3GLEX/rl3BCL2oa/QkNcXv4YNVBC9olt3s+H7ukto06q7B1Qz46PbrKLO34PR6vXcA==} engines: {node: '>=14'} hasBin: true @@ -1866,6 +1870,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + send@0.19.0: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} @@ -2000,8 +2009,8 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - ts-api-utils@2.0.0: - resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==} + ts-api-utils@2.0.1: + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -2058,8 +2067,8 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - typescript-eslint@8.21.0: - resolution: {integrity: sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw==} + typescript-eslint@8.24.0: + resolution: {integrity: sha512-/lmv4366en/qbB32Vz5+kCNZEMf6xYHwh1z48suBwZvAtnXKbP+YhGe8OLE2BqC67LMqKkCNLtjejdwsdW6uOQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2368,9 +2377,9 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@eslint-community/eslint-utils@4.4.1(eslint@9.18.0)': + '@eslint-community/eslint-utils@4.4.1(eslint@9.20.0)': dependencies: - eslint: 9.18.0 + eslint: 9.20.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -2387,6 +2396,10 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 + '@eslint/core@0.11.0': + dependencies: + '@types/json-schema': 7.0.15 + '@eslint/eslintrc@3.2.0': dependencies: ajv: 6.12.6 @@ -2401,7 +2414,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.18.0': {} + '@eslint/js@9.20.0': {} '@eslint/object-schema@2.1.5': {} @@ -2614,7 +2627,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 22.10.7 + '@types/node': 22.13.1 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -2627,14 +2640,14 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.10.7 + '@types/node': 22.13.1 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.10.7) + jest-config: 29.7.0(@types/node@22.13.1) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -2659,7 +2672,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.10.7 + '@types/node': 22.13.1 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -2677,7 +2690,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.10.7 + '@types/node': 22.13.1 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -2699,7 +2712,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.22 - '@types/node': 22.10.7 + '@types/node': 22.13.1 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -2769,7 +2782,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.10.7 + '@types/node': 22.13.1 '@types/yargs': 17.0.32 chalk: 4.1.2 @@ -2800,7 +2813,7 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.18.0 + fastq: 1.19.0 '@pkgjs/parseargs@0.11.0': optional: true @@ -2856,7 +2869,7 @@ snapshots: '@types/accepts@1.3.7': dependencies: - '@types/node': 22.10.7 + '@types/node': 22.13.1 '@types/babel__core@7.20.5': dependencies: @@ -2882,11 +2895,11 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.10.7 + '@types/node': 22.13.1 '@types/connect@3.4.38': dependencies: - '@types/node': 22.10.7 + '@types/node': 22.13.1 '@types/content-disposition@0.5.8': {} @@ -2895,13 +2908,13 @@ snapshots: '@types/connect': 3.4.38 '@types/express': 5.0.0 '@types/keygrip': 1.0.6 - '@types/node': 22.10.7 + '@types/node': 22.13.1 '@types/estree@1.0.6': {} '@types/express-serve-static-core@5.0.6': dependencies: - '@types/node': 22.10.7 + '@types/node': 22.13.1 '@types/qs': 6.9.18 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -2915,7 +2928,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 22.10.7 + '@types/node': 22.13.1 '@types/http-assert@1.5.6': {} @@ -2957,7 +2970,7 @@ snapshots: '@types/http-errors': 2.0.4 '@types/keygrip': 1.0.6 '@types/koa-compose': 3.2.8 - '@types/node': 22.10.7 + '@types/node': 22.13.1 '@types/mime@1.3.5': {} @@ -2965,7 +2978,7 @@ snapshots: dependencies: '@types/express': 5.0.0 - '@types/node@22.10.7': + '@types/node@22.13.1': dependencies: undici-types: 6.20.0 @@ -2976,12 +2989,12 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.10.7 + '@types/node': 22.13.1 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 22.10.7 + '@types/node': 22.13.1 '@types/send': 0.17.4 '@types/stack-utils@2.0.3': {} @@ -2992,81 +3005,81 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.24.0(@typescript-eslint/parser@8.24.0(eslint@9.20.0)(typescript@5.7.3))(eslint@9.20.0)(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.21.0(eslint@9.18.0)(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/type-utils': 8.21.0(eslint@9.18.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.21.0(eslint@9.18.0)(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.21.0 - eslint: 9.18.0 + '@typescript-eslint/parser': 8.24.0(eslint@9.20.0)(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.24.0 + '@typescript-eslint/type-utils': 8.24.0(eslint@9.20.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.24.0(eslint@9.20.0)(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.24.0 + eslint: 9.20.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.0.0(typescript@5.7.3) + ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.21.0(eslint@9.18.0)(typescript@5.7.3)': + '@typescript-eslint/parser@8.24.0(eslint@9.20.0)(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.21.0 + '@typescript-eslint/scope-manager': 8.24.0 + '@typescript-eslint/types': 8.24.0 + '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.24.0 debug: 4.4.0 - eslint: 9.18.0 + eslint: 9.20.0 typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.21.0': + '@typescript-eslint/scope-manager@8.24.0': dependencies: - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/visitor-keys': 8.21.0 + '@typescript-eslint/types': 8.24.0 + '@typescript-eslint/visitor-keys': 8.24.0 - '@typescript-eslint/type-utils@8.21.0(eslint@9.18.0)(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.24.0(eslint@9.20.0)(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.21.0(eslint@9.18.0)(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.24.0(eslint@9.20.0)(typescript@5.7.3) debug: 4.4.0 - eslint: 9.18.0 - ts-api-utils: 2.0.0(typescript@5.7.3) + eslint: 9.20.0 + ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.21.0': {} + '@typescript-eslint/types@8.24.0': {} - '@typescript-eslint/typescript-estree@8.21.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.24.0(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/visitor-keys': 8.21.0 + '@typescript-eslint/types': 8.24.0 + '@typescript-eslint/visitor-keys': 8.24.0 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 2.0.0(typescript@5.7.3) + semver: 7.7.1 + ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.21.0(eslint@9.18.0)(typescript@5.7.3)': + '@typescript-eslint/utils@8.24.0(eslint@9.20.0)(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0) - '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) - eslint: 9.18.0 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.0) + '@typescript-eslint/scope-manager': 8.24.0 + '@typescript-eslint/types': 8.24.0 + '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) + eslint: 9.20.0 typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.21.0': + '@typescript-eslint/visitor-keys@8.24.0': dependencies: - '@typescript-eslint/types': 8.21.0 + '@typescript-eslint/types': 8.24.0 eslint-visitor-keys: 4.2.0 accepts@1.3.8: @@ -3284,13 +3297,13 @@ snapshots: cookie@0.7.1: {} - create-jest@29.7.0(@types/node@22.10.7): + create-jest@29.7.0(@types/node@22.13.1): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.10.7) + jest-config: 29.7.0(@types/node@22.13.1) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -3379,10 +3392,10 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-plugin-prettier@5.2.3(eslint@9.18.0)(prettier@3.4.2): + eslint-plugin-prettier@5.2.3(eslint@9.20.0)(prettier@3.5.0): dependencies: - eslint: 9.18.0 - prettier: 3.4.2 + eslint: 9.20.0 + prettier: 3.5.0 prettier-linter-helpers: 1.0.0 synckit: 0.9.1 @@ -3395,14 +3408,14 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.18.0: + eslint@9.20.0: dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.1 - '@eslint/core': 0.10.0 + '@eslint/core': 0.11.0 '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.18.0 + '@eslint/js': 9.20.0 '@eslint/plugin-kit': 0.2.5 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -3530,7 +3543,7 @@ snapshots: fast-levenshtein@2.0.6: {} - fastq@1.18.0: + fastq@1.19.0: dependencies: reusify: 1.0.4 @@ -3817,7 +3830,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.10.7 + '@types/node': 22.13.1 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1 @@ -3837,16 +3850,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@22.10.7): + jest-cli@29.7.0(@types/node@22.13.1): dependencies: '@jest/core': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.10.7) + create-jest: 29.7.0(@types/node@22.13.1) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@22.10.7) + jest-config: 29.7.0(@types/node@22.13.1) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -3856,7 +3869,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@22.10.7): + jest-config@29.7.0(@types/node@22.13.1): dependencies: '@babel/core': 7.23.9 '@jest/test-sequencer': 29.7.0 @@ -3881,7 +3894,7 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 22.10.7 + '@types/node': 22.13.1 transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -3910,7 +3923,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.10.7 + '@types/node': 22.13.1 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -3920,7 +3933,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 22.10.7 + '@types/node': 22.13.1 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -3959,7 +3972,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.10.7 + '@types/node': 22.13.1 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -3994,7 +4007,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.10.7 + '@types/node': 22.13.1 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -4022,7 +4035,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.10.7 + '@types/node': 22.13.1 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 @@ -4068,7 +4081,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.10.7 + '@types/node': 22.13.1 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -4087,7 +4100,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.10.7 + '@types/node': 22.13.1 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -4096,17 +4109,17 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 22.10.7 + '@types/node': 22.13.1 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@22.10.7): + jest@29.7.0(@types/node@22.13.1): dependencies: '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@22.10.7) + jest-cli: 29.7.0(@types/node@22.13.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -4356,7 +4369,7 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier@3.4.2: {} + prettier@3.5.0: {} pretty-format@29.7.0: dependencies: @@ -4431,6 +4444,8 @@ snapshots: semver@7.6.3: {} + semver@7.7.1: {} + send@0.19.0: dependencies: debug: 2.6.9 @@ -4579,18 +4594,18 @@ snapshots: toidentifier@1.0.1: {} - ts-api-utils@2.0.0(typescript@5.7.3): + ts-api-utils@2.0.1(typescript@5.7.3): dependencies: typescript: 5.7.3 ts-deepmerge@7.0.2: {} - ts-jest@29.2.5(@babel/core@7.23.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@22.10.7))(typescript@5.7.3): + ts-jest@29.2.5(@babel/core@7.23.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@22.13.1))(typescript@5.7.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.10.7) + jest: 29.7.0(@types/node@22.13.1) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -4626,12 +4641,12 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - typescript-eslint@8.21.0(eslint@9.18.0)(typescript@5.7.3): + typescript-eslint@8.24.0(eslint@9.20.0)(typescript@5.7.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3) - '@typescript-eslint/parser': 8.21.0(eslint@9.18.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.21.0(eslint@9.18.0)(typescript@5.7.3) - eslint: 9.18.0 + '@typescript-eslint/eslint-plugin': 8.24.0(@typescript-eslint/parser@8.24.0(eslint@9.20.0)(typescript@5.7.3))(eslint@9.20.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.24.0(eslint@9.20.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.24.0(eslint@9.20.0)(typescript@5.7.3) + eslint: 9.20.0 typescript: 5.7.3 transitivePeerDependencies: - supports-color